gridSVG/0000755000176200001440000000000013651737533011574 5ustar liggesusersgridSVG/NAMESPACE0000654000176200001440000001555512765642435013030 0ustar liggesusers importFrom("grDevices", "col2rgb", "dev.cur", "dev.flush", "dev.hold", "dev.set", "devAskNewPage", "pdf", "png") importFrom("graphics", "par") importFrom("utils", "getS3method", "getTxtProgressBar", "head", "localeToCharset", "packageDescription", "setTxtProgressBar", "tail", "txtProgressBar") importFrom("jsonlite", "fromJSON", "toJSON", "base64_enc") import("methods", "grid", "XML") export("svgOpen", "svgClose", "svgStartGroup", "svgEndGroup", "svgRaster", "svgRect", "svgLines", "svgPolygon", "svgPath", "svgText", "svgCircle", "svgScript", "svgAnimate", "svgStartLink", "svgEndLink", "svgStyle", "svgStartElement", "svgEndElement" ) export("animValue", "animUnit", "as.animValue", "as.animUnit") export("grid.hyperlink", "setSVGFonts", "getSVGFonts", "hyperlinkGrob", "grid.animate", "animateGrob", "grid.comment", "commentGrob", "grid.garnish", "garnishGrob", "grid.script", "scriptGrob", "grid.element", "elementGrob", "grid.textNode", "textNodeGrob", "gridToSVG", "grid.export", "gridSVG.newpage", "gridsvg", "dev.off" ) export("getSVGoption", "getSVGoptions", "setSVGoptions") export("gridSVGMappings", "getSVGMappings", "readMappingsJS") export("gridSVGCoords", "readCoordsJS", "viewportCreate", "viewportConvertX", "viewportConvertY", "viewportConvertPos", "viewportConvertWidth", "viewportConvertHeight", "viewportConvertDim") # So other PACKAGES can write translation methods for new grobs export("grobToDev") export("primToDev") export("animate") export("garnish") S3method("grobToDev", "grob") S3method("grobToDev", "gTree") S3method("grobToDev", "recordedGrob") # S3method("grobToDev", "linked.grob") S3method("grobToDev", "script.grob") # gtable fixes S3method("grobToDev", "gtable") S3method("grobToDev", "gTableChild") S3method("grobToDev", "gTableParent") S3method("primToDev", "grob") S3method("primToDev", "gTree") S3method("primToDev", "clip") S3method("primToDev", "move.to") S3method("primToDev", "line.to") S3method("primToDev", "lines") S3method("primToDev", "rastergrob") S3method("primToDev", "rect") S3method("primToDev", "segments") S3method("primToDev", "polygon") S3method("primToDev", "pathgrob") S3method("primToDev", "text") S3method("primToDev", "circle") S3method("primToDev", "points") S3method("primToDev", "xspline") S3method("primToDev", "linked.grob") S3method("primToDev", "animated.grob") S3method("primToDev", "comment.grob") S3method("primToDev", "garnished.grob") S3method("primToDev", "element.grob") S3method("primToDev", "textnode.grob") S3method("primToDev", "clipPath") S3method("primToDev", "mask") S3method("primToDev", "patternFilled.grob") S3method("primToDev", "gradientFilled.grob") S3method("primToDev", "pathClipped.grob") S3method("primToDev", "masked.grob") S3method("primToDev", "filtered.grob") export("listSVGDefinitions") S3method("labelsUsed", "patternFillDef") S3method("labelsUsed", "patternFillRefDef") S3method("labelsUsed", "filterDef") S3method("labelsUsed", "gradientDef") S3method("labelsUsed", "maskDef") S3method("labelsUsed", "clipPathDef") S3method("labelsUsed", "grob") S3method("labelsUsed", "gTree") # Context popping export("popContext") S3method("primToDev", "popContext") # Clipping export("grid.clipPath", "clipPathGrob", "clipPath", "registerClipPath", "pushClipPath", "popClipPath") # Masking export("grid.mask", "maskGrob", "registerMask", "pushMask", "popMask", "mask") # Gradients export("linearGradient", "radialGradient", "registerGradientFill", "grid.gradientFill", "gradientFillGrob") S3method("print", "gradient") S3method("forceGrob", "gradientFilled.grob") S3method("forceGrob", "animated.grob") S3method("forceGrob", "linked.grob") S3method("forceGrob", "filtered.grob") S3method("forceGrob", "patternFilled.grob") S3method("forceGrob", "garnished.grob") # Patterns export("pattern", "registerPatternFill", "registerPatternFillRef", "grid.patternFill", "patternFillGrob") # Filters export("grid.filter", "filterGrob", "filterEffect", "addFilterEffect", "registerFilter", "fe", "feDistantLight", "fePointLight", "feSpotLight", "feBlend", "feColorMatrix", "feComponentTransfer", "addComponentFunction", "transferFunction", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feFlood", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "addMergeNode", "feMorphology", "feOffset", "feSpecularLighting", "feTile", "feTurbulence") S3method("flatten", "filter") S3method("flatten", "filter.effect") S3method("flatten", "fe.point.light") S3method("flatten", "fe.spot.light") S3method("flatten", "fe.diffuse.lighting") S3method("flatten", "fe.morphology") S3method("flatten", "fe.offset") S3method("flatten", "fe.specular.lighting") S3method("filterSVG", "fe.distant.light") S3method("filterSVG", "fe.point.light") S3method("filterSVG", "fe.spot.light") S3method("filterSVG", "fe.blend") S3method("filterSVG", "fe.color.matrix") S3method("filterSVG", "fe.component.transfer") S3method("filterSVG", "transfer.function") S3method("filterSVG", "fe.composite") S3method("filterSVG", "fe.convolve.matrix") S3method("filterSVG", "fe.diffuse.lighting") S3method("filterSVG", "fe.displacement.map") S3method("filterSVG", "fe.flood") S3method("filterSVG", "fe.gaussian.blur") S3method("filterSVG", "fe.image") S3method("filterSVG", "fe.merge") S3method("filterSVG", "fe.merge.node") S3method("filterSVG", "fe.morphology") S3method("filterSVG", "fe.offset") S3method("filterSVG", "fe.specular.lighting") S3method("filterSVG", "fe.tile") S3method("filterSVG", "fe.turbulence") S3method("link", "grob") S3method("link", "gTree") S3method("linkShow", "grob") S3method("linkShow", "gTree") S3method("animate", "grob") S3method("animate", "gTree") S3method("garnish", "grob") S3method("garnish", "gTree") S3method("as.animUnit", "animUnit") S3method("as.animUnit", "numeric") S3method("as.animUnit", "unit") S3method("as.animUnit", "matrix") S3method("as.animUnit", "list") S3method("as.animValue", "animValue") S3method("as.animValue", "numeric") S3method("as.animValue", "character") S3method("as.animValue", "matrix") S3method("as.animValue", "list") S3method("print", "animValue") S3method("print", "animUnit") S3method("toMML", "numeric") S3method("toMML", "character") S3method("toMML", "name") S3method("toMML", "(") S3method("toMML", "call") gridSVG/.Rinstignore0000654000176200001440000000001112164147374014065 0ustar liggesusersMakefile gridSVG/man/0000755000176200001440000000000012616240500012326 5ustar liggesusersgridSVG/man/grid.element.Rd0000654000176200001440000000472412164147372015215 0ustar liggesusers\name{grid.element} \alias{grid.element} \alias{elementGrob} \alias{grid.textNode} \alias{textNodeGrob} \title{ Create a grid grob representing an SVG element } \description{ Creates a \code{element.grob} object which is a grid \code{\link{gTree}}, representing an SVG element. Useful in conjunction with \code{grid.export}, to produce an SVG document with elements inserted at particular points. The element (and its children) are inserted at the point where the grob is \dQuote{drawn}. Text can be inserted in a similar manner with \code{grid.textNode}. } \usage{ grid.element(el, name = NULL, attrs = NULL, namespace = NULL, namespaceDefinitions = NULL, children = NULL, vp = NULL, childrenvp = NULL, asis = FALSE) elementGrob(el, name = NULL, attrs = NULL, namespace = NULL, namespaceDefinitions = NULL, children = NULL, vp = NULL, childrenvp = NULL, asis = FALSE) grid.textNode(text, name = NULL, vp = NULL) textNodeGrob(text, name = NULL, vp = NULL) } \arguments{ \item{el}{ The name of the SVG element to create, e.g. "rect". } \item{text}{ A single element character vector of text directly into insert into the SVG image. } \item{name}{ A character identifier. } \item{attrs}{ A list, where the names are SVG attribute names, and values are the values given to the SVG attributes. } \item{namespace}{ A character vector specifying the namespace for this new element. } \item{namespaceDefinitions}{ A character vector or a list with each element being a string. These give the URIs identifying the namespaces uniquely. The elements should have names which are used as prefixes. A default namespace has "" as the name. The values here are used only for defining new namespaces and not for determining the namespace to use for this particular element. } \item{children}{ A gList object containing children of this element (if any). } \item{vp}{ A viewport object to draw within. } \item{childrenvp}{ A viewport object to use for the children of the element grob. } \item{asis}{ If \code{TRUE}, SVG id attributes will be generated from the \code{name} with no modification so that we can easily refer to the generated elements. } } \value{ An \code{element.grob} object. For \code{grid.textNode} a \code{textnode.grob} object. } \author{ Simon Potter } \seealso{ \code{\link{grid.export}} } \keyword{ dplot } gridSVG/man/popContext.Rd0000654000176200001440000000177512164147372015006 0ustar liggesusers\name{popContext} \alias{popContext} \title{ Leaving A Modified Viewport Context } \description{ A modified viewport context is where the appearance of grobs is no longer determined solely by the grob itself and the viewport into which they're drawn. This can occur when applying clipping paths and opacity masks, which modify the appearance of anything drawn after they have been applied. This function should be used when attempting to stop the effect of a modified viewport context (e.g. to stop clipping to paths). } \usage{ popContext(n = 1) } \arguments{ \item{n}{ The number of contexts to pop. A warning will be given when \code{n} is greater than the number that has been applied. } } \details{ Popping a context can produce a warning. In this case it is recommended that the context "pushing" and "popping" be revised to have matching pairs of pushes and pops. } \value{ None. } \author{ Simon Potter } \seealso{ \code{\link{grid.clipPath}} and \code{\link{grid.mask}} } gridSVG/man/feComponentTransfer.Rd0000654000176200001440000000635712164147372016626 0ustar liggesusers\name{feComponentTransfer} \alias{feComponentTransfer} \alias{addComponentFunction} \alias{transferFunction} \title{ Perform Colour Component-wise Remapping. } \description{ This filter primitive performs component-wise remapping of data by taking a colour transfer function, and applying that to the set of RGBA colour components. It allows operations like brightness adjustment, contrast adjustment, colour balance or thresholding. The calculations are performed on non-premultiplied colour values. If the input graphics consists of premultiplied colour values, those values are automatically converted into non-premultiplied colour values for this operation. (Note that the undoing and redoing of the premultiplication can be avoided if alpha transfer function is the identity transform and all alpha values on the source graphic are set to 1.) } \usage{ feComponentTransfer(input = NA, transfers = NULL, ...) addComponentFunction(ct, channel = c("R", "G", "B", "A"), func) transferFunction(type = c("identity", "table", "discrete", "linear", "gamma"), tableValues = numeric(), slope = 1, intercept = 0, amplitude = 1, exponent = 1, offset = 0) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{transfers}{ A named list of \code{transfer.function} objects (produced by \code{\link{transferFunction}}). The name for each element of the list should be one of \code{R}, \code{G}, \code{B} or \code{A}. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } \item{ct}{ An \code{fe.component.transfer} object, produced by \code{\link{feComponentTransfer}}. } \item{channel}{ The colour channel that \code{func} will be applied to. } \item{func}{ A \code{transfer.function} object, produced by \code{\link{transferFunction}}. } \item{type}{ Indicates the type of component transfer function. The type of function determines the applicability of the other arguments. } \item{tableValues}{ When \code{type} is \code{"table"}, this is a list of values which define the lookup table. } \item{slope}{ When \code{type} is \code{"linear"}, the slope of the linear function. } \item{intercept}{ When \code{type} is \code{"linear"}, the intercept of the linear function. } \item{amplitude}{ When \code{type} is \code{"gamma"}, the amplitude of the gamma function. } \item{exponent}{ When \code{type} is \code{"gamma"}, the exponent of the gamma function. } \item{offset}{ When \code{type} is \code{"gamma"}, the offset of the gamma function. } } \details{ For more information about this primitive, consult the references to the SVG specification. } \value{ For \code{feComponentTransfer}, an \code{fe.component.transfer} object. For \code{addComponentFunction}, none. For \code{transferFunction}, a \code{transfer.function} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feComponentTransferElement}, \url{http://www.w3.org/TR/SVG/filters.html#feFuncRElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } gridSVG/man/feSpotLight.Rd0000654000176200001440000000511712164147372015065 0ustar liggesusers\name{feSpotLight} \alias{feSpotLight} \title{ Create a Spot Light Source } \description{ This filter primitive defines a spot light source that can be used within a lighting filter primitive: \code{\link{feDiffuseLighting}} or \code{\link{feSpecularLighting}}. } \usage{ feSpotLight(x = unit(0, "npc"), y = unit(0, "npc"), z = unit(0, "npc"), pointsAtX = unit(1, "npc"), pointsAtY = unit(1, "npc"), pointsAtZ = unit(0, "npc"), zdim = "x", default.units = "npc", specularExponent = 1, limitingConeAngle = NA, ...) } \arguments{ \item{x}{ A numeric vector or unit object specifying the x-location of the light source. } \item{y}{ A numeric vector or unit object specifying the y-location of the light source. } \item{z}{ A numeric vector or unit object specifying the z-location of the light source. } \item{pointsAtX}{ A numeric vector or unit object specifying the x-location that the light points at. } \item{pointsAtY}{ A numeric vector or unit object specifying the y-location that the light points at. } \item{pointsAtZ}{ A numeric vector or unit object specifying the z-location that the light points at. } \item{zdim}{ Either \code{"x"} or \code{"y"}. Determines the dimension to which \code{z} and \code{pointsAtZ} will be located relative to. This is necessary because R graphics has no concept of a z-dimension. } \item{default.units}{ A string indicating the default units to use if \code{x}, \code{y}, \code{z}, \code{pointsAtX}, \code{pointsAtY}, \code{pointsAtZ} are only given as numeric vectors. } \item{specularExponent}{ Exponent value controlling the focus for the light source. } \item{limitingConeAngle}{ If \code{NA}, no limiting cone is applied, otherwise a limiting cone which restricts the region where the light is projected. No light is projected outside the cone. \code{limitingConeAngle} represents the angle in degrees between the spot light axis (i.e. the axis between the light source and the point to which it is pointing at) and the spot light cone. } \item{\dots}{ Further arguments to be passed onto \code{fe}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.spot.light} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feSpotLightElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}, \code{\link{feDiffuseLighting}}, \code{\link{feSpecularLighting}}. } gridSVG/man/gridSVG-internal.Rd0000654000176200001440000000074712164147372015760 0ustar liggesusers\name{svg-internal} \alias{svgOpen} \alias{svgClose} \alias{svgStartGroup} \alias{svgEndGroup} \alias{svgRaster} \alias{svgRect} \alias{svgLines} \alias{svgPath} \alias{svgPolygon} \alias{svgText} \alias{svgCircle} \alias{svgScript} \alias{svgAnimate} \alias{svgStartLink} \alias{svgEndLink} \alias{svgStyle} \alias{svgStartElement} \alias{svgEndElement} \title{Internal gridSVG Functions} \description{ Some functions you can call, but I'm not documenting (yet). } \keyword{internal} gridSVG/man/feMerge.Rd0000654000176200001440000000340012164147372014200 0ustar liggesusers\name{feMerge} \alias{feMerge} \alias{feMergeNode} \alias{addMergeNode} \title{ Composite image layers together. } \description{ This filter primitive composites input image layers on top of each other using the "over" operator with "input1" (corresponding to the first child merge node) on the bottom and the last specified input, "inputN" (corresponding to the last child merge node), on top. } \usage{ feMerge(mergeNodes = NULL, ...) addMergeNode(fe, mergeNode, after = NA) feMergeNode(input = NA) } \arguments{ \item{mergeNodes}{ A list of \code{fe.merge.node} objects, produced by \code{\link{feMergeNode}}. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } \item{fe}{ An \code{fe.merge} object, created by \code{\link{feMerge}}. } \item{mergeNode}{ An \code{fe.merge.node} object, created by \code{\link{feMerge}}. } \item{after}{ The position to add \code{mergeNode} to in the list of \code{fe}'s children. When \code{NA}, appends to the end of the list of children. } \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } } \details{ If you wish to add more merge nodes after an \code{fe.merge} object has been created, use \code{\link{addMergeNode}} to add merge nodes to the filter primitive. For more information about the \code{feMerge} primitive, consult the reference to the SVG specification. } \value{ For \code{feMerge}, an \code{fe.merge} object. For \code{addMergeNode}, an \code{fe.merge} object. For \code{feMergeNode}, an \code{fe.merge.node} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feMergeElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } gridSVG/man/feColorMatrix.Rd0000654000176200001440000000337213554122543015411 0ustar liggesusers\name{feColorMatrix} \alias{feColorMatrix} \title{ Apply a matrix transformation on colour values. } \description{ This filter applies a matrix transformation on the RGBA colour and alpha values of every pixel on the input graphics to produce a result with a new set of RGBA colour and alpha values. } \usage{ feColorMatrix(input = NA, type = c("matrix", "saturate", "hueRotate", "luminanceToAlpha"), values = NULL, ...) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{type}{ Indicates the type of matrix operation. The keyword \code{"matrix"} indicates that a full 5x4 matrix of values will be provided. The other keywords represent convenience shortcuts to allow commonly used color operations to be performed without specifying a complete matrix. } \item{values}{ The contents of \code{values} depend on what \code{type} is: \itemize{ \item \code{matrix} A 5x4 matrix of numeric values. \item \code{saturate} A single element numeric vector whose value is between 0 and 1. \item \code{hueRotate} A single element numeric vector whose value represents degrees. \item \code{luminanceToAlpha} Should be left as \code{NULL} as there are no applicable values. } } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.color.matrix} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } gridSVG/man/setSVGoptions.Rd0000654000176200001440000000225212164147372015421 0ustar liggesusers\name{setSVGoptions} \alias{setSVGoptions} \alias{getSVGoption} \alias{getSVGoptions} \title{ Get and Set Global Options } \description{ Provides access to a predefined set of global options for the \pkg{gridSVG} package. } \usage{ getSVGoption(name) getSVGoptions() setSVGoptions(...) } \arguments{ \item{name}{ The name of one option. } \item{...}{ Named arguments giving a name, value pair for a new option setting. } } \details{ The options currently available are: \itemize{ \item \code{id.sep} which controls the separator used between the grob name and the suffix number when \pkg{gridSVG} generates id values for SVG elements. \item \code{gPath.sep} which controls the separator used between elements of a grid \code{gPath}. \item \code{vpPath.sep} which controls the separator used between elements of a grid \code{vpPath}. } } \value{ \code{getSVGoption()} returns at most one option setting. \code{getSVGoptions()} returns all option settings. \code{setSVGoptions()} returns a list of previous option settings for the options that were changed. } \author{ Paul Murrell } \seealso{ \code{\link{grid.export}} } \keyword{ dplot } gridSVG/man/grid.filter.Rd0000654000176200001440000000431712164147372015047 0ustar liggesusers\name{grid.filter} \alias{grid.filter} \alias{filterGrob} \title{ Associate a filter effect with a grid grob. } \description{ Creates a \code{filtered.grob} object which is a normal grid grob, with a filter effect applied to it Used in conjunction with \code{\link{registerFilter}}, to produce an SVG document containing graphical elements with filter effects. } \usage{ grid.filter(path, filter = NULL, label = NULL, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) filterGrob(x, filter = NULL, label = NULL, group = TRUE) } \arguments{ \item{x}{ A grob to filter. } \item{path}{ A grob path specifying a drawn grob. } \item{filter}{ A \code{filter} object, provided by the \code{\link{filterEffect}} function. Provides the definition of a filter effect that will be applied to \code{x} or \code{path}. } \item{label}{ A label that is associated with a definition of a filter effect. This is the label used to create a filter effect definition with \code{registerFilter}. } \item{group}{ A logical vector that indicates whether the filter effect should be applied to the overall parent group for the relevant SVG element, or to individual SVG elements. } \item{redraw}{ A logical value to indicate whether to redraw the grob. } \item{strict}{ A boolean indicating whether the \code{path} must be matched exactly. } \item{grep}{ Whether the \code{path} should be treated as a regular expression. } \item{global}{ A boolean indicating whether the function should affect just the first match of the \code{path}, or whether all matches should be affected. } } \details{ If \code{label} is specified, uses a filter effect that has been supplied to \code{registerFilter}. If \code{filter} is specified it will be used as the filter effect applied to each grob. If both are specified, it will attempt to define the filter effect with the given label, as well as applying the filter effect to the appropriate grobs. } \value{ A \code{filtered.grob} object (for \code{filterGrob}). } \author{ Simon Potter } \seealso{ \code{\link{registerFilter}}, \code{\link{filterEffect}}. } gridSVG/man/gridSVGMappings.Rd0000654000176200001440000000276712164147372015651 0ustar liggesusers\name{Mapping Names to IDs} \alias{gridSVGMappings} \title{ Mapping Viewport, Grob and Reference Names to SVG IDs } \description{ This function is both a getter and a setter function for mapping information imported from a plot unknown to the current R session. } \usage{ gridSVGMappings(newmappings = NULL) } \arguments{ \item{newmappings}{ A named list mapping information, produced by \code{\link{grid.export}}. } } \details{ In order to generate unique names for SVG IDs, gridSVG output will not produce the same names as are visible on the grid display list. This function will store and return mapping information. This is information on how names have been translated from their original grob/viewport names to their SVG IDs. Mapping information is stored as a list with 4 components, viewport mapping information, grob mapping information, reference mapping information and the ID separator used at the time of exporting. Viewport, grob, and reference mapping information is stored as the name of the object, paired with a vector of suffixes associated with these names. When combined with the ID separator, we can construct the SVG IDs that have been applied, given each name. Use \code{\link{getSVGMappings}} to do this. } \value{ If \code{newmappings} is \code{NULL}, then we get back a named list representing name mapping information. If we pass the named list representing mapping information into the function, we get no output. } \author{ Simon Potter } gridSVG/man/listSVGDefinitions.Rd0000654000176200001440000000120512164147372016356 0ustar liggesusers\name{listSVGDefinitions} \alias{listSVGDefinitions} \title{ List All Reference Definitions } \description{ Returns a listing of the labels given to reference definitions. } \usage{ listSVGDefinitions(print = TRUE) } \arguments{ \item{print}{ If \code{TRUE}, prints the listing of reference definitions. } } \details{ When definitions of referenced content are stored in gridSVG via any of the \code{register*} functions (e.g. \code{\link{registerPatternFill}}), we can use this function to show us all of the labels given when content is registered. } \value{ A data frame, returned invisibly. } \author{ Simon Potter } gridSVG/man/readMappingsJS.Rd0000654000176200001440000000203012164147372015473 0ustar liggesusers\name{Import Mappings JS} \alias{readMappingsJS} \title{ Importing JavaScript mapping information. } \description{ This function reads in a JavaScript file and transforms it into JSON text. This text is then transformed into a list that can be used in conjunction with \code{\link{gridSVGMappings}}. } \usage{ readMappingsJS(filename) } \arguments{ \item{filename}{ A character vector that represents a file name. This file should be a JavaScript file containing mapping information produced by \code{\link{grid.export}}. } } \details{ In order to use the \code{\link{fromJSON}} function to parse JSON text, the JavaScript file produced by \code{\link{grid.export}} needs to be transformed. It needs to transform from being an assignment of an object literal to simply the object literal itself. This function performs that task by producing a valid JSON string ready for parsing by \code{\link{fromJSON}}. It then returns the parsed list. } \value{ A list of mapping information. } \author{ Simon Potter } gridSVG/man/primToDev.Rd0000654000176200001440000000212412164147372014541 0ustar liggesusers\name{primToDev} \alias{primToDev} %- Also NEED an '\alias' for EACH other topic documented here. \title{ %% ~~function to do ... ~~ Convert a grob to device calls } \description{ %% ~~ A concise (1-5 lines) description of what the function does. ~~ This function is used to make calls to a device to draw a grob. It is generic so new grob classes can write their own methods. } \usage{ primToDev(x, dev) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A grob. %% ~~Describe \code{x} here~~ } \item{dev}{ A graphics device. %% ~~Describe \code{dev} here~~ } } \details{ %% ~~ If necessary, more details than the description above ~~ This function is not called directly by the user. It is exposed so that new grob classes can easily write their own methods which call existing methods for standard grobs. } \author{ %% ~~who you are~~ Paul Murrell } %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ dplot } gridSVG/man/coords.Rd0000654000176200001440000000267612164147372014135 0ustar liggesusers\name{Coordinate System Import/Export} \alias{gridSVGCoords} \title{ Importing an external coordinate system } \description{ This function is both a getter and a setter function for coordinate information imported from a plot unknown to the current R session. } \usage{ gridSVGCoords(newcoords = NULL) } \arguments{ \item{newcoords}{ A named list (names are viewport names) of coordinate information, produced by \code{\link{grid.export}}. } } \details{ In order to translate between SVG coordinates and the coordinate system that \code{grid} understands, we first need to import the coordinate information exported from \code{\link{grid.export}}. We can then take the JSON representation of this coordinate information and import it as a named list via \code{fromJSON}. This can then initialise a coordinate system by passing that named list into \code{gridSVGCoords}. We can supply new definitions of a viewport's coordinate system by simply passing in an appropriate list with information for that viewport. All viewport coordinate system information can be wiped if a single \code{NA} value is passed in. } \value{ If \code{newcoords} is \code{NULL}, then we get back a named list representing coordinate system information. If we pass the named list representing a coordinate system into the function, we get no output. We also get no output if we pass in a single \code{NA} value. } \author{ Simon Potter } gridSVG/man/fePointLight.Rd0000654000176200001440000000232512164147372015227 0ustar liggesusers\name{fePointLight} \alias{fePointLight} \title{ Create a Point Light Source } \description{ This filter primitive defines a point light source that can be used within a lighting filter primitive: \code{\link{feDiffuseLighting}} or \code{\link{feSpecularLighting}}. } \usage{ fePointLight(z = unit(0, "npc"), default.units = "npc", zdim = "x", ...) } \arguments{ \item{z}{ A numeric vector or unit object specifying z-location. } \item{default.units}{ A string indicating the default units to use if \code{z} if given as a numeric vector. } \item{zdim}{ Either \code{"x"} or \code{"y"}. Determines the dimension to which \code{z} will be located relative to. This is necessary because R graphics has no concept of a z-dimension. } \item{\dots}{ Further arguments to be passed onto \code{fe}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.point.light} object. } \references{ \code{http://www.w3.org/TR/SVG/filters.html#fePointLightElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}, \code{\link{feDiffuseLighting}}, \code{\link{feSpecularLighting}}. } gridSVG/man/registerClipPath.Rd0000654000176200001440000000436112164147372016106 0ustar liggesusers\name{Clipping Paths} \alias{clipPath} \alias{registerClipPath} \title{ Create the definition of a non-rectangular clipping path. } \description{ A feature of SVG is that elements can be clipped to by more than just a rectangular region. Most graphical elements can be drawn. The purpose of these functions is to define a more sophisticated clipping path that will be applied until the current viewport (or context, see \code{\link{popContext}}) is popped. } \usage{ clipPath(grob) registerClipPath(label, clippath) } \arguments{ \item{grob}{ A grid grob. } \item{label}{ A character identifier that will be used to reference this definition. } \item{clippath}{ A \code{clipPath} object produced by \code{\link{clipPath}} that defines a clipping path region. } } \details{ A clipping path will be drawn within the current viewport at the time of definition (if the grob has no \code{vp} specified). Most grobs can be used for clipping but there are some limitations on what will actually be used for clipping. In general though, anything that is drawn as the clipping path will have the union of its drawn regions become the new region that the current viewport (or grob) will clip to. The limitations are as follows: \itemize{ \item Any viewport pushed by the clipping path grob will no longer clip to its contents. However, its clipping region will remain. This means that the clipping region for a pushed viewport will become the union of its contents and the viewport clipping region itself, instead of just the pushed viewport's clipping region. \item When drawing a \code{textGrob}, only character labels will be used, no \code{plotmath} expressions will be used. \item No \code{pointGrob}s are able to be used for clipping. \item Any operations that apply to containers (e.g. gpars, garnishing, animation), will no longer work. Any operations that are not applied to groups are unaffected. This affects in particular viewports, gTrees, and the familiar gridSVG grob grouping that occurs. } } \value{ None } \author{ Simon Potter } \seealso{ \code{\link{popContext}}, \code{\link{grid.clipPath}}, \code{\link{pushClipPath}}, \code{\link{grid.clip}} } gridSVG/man/convert.Rd0000654000176200001440000000470612171060447014313 0ustar liggesusers\name{Coordinate Conversion Functions} \alias{viewportConvertX} \alias{viewportConvertY} \alias{viewportConvertPos} \alias{viewportConvertWidth} \alias{viewportConvertHeight} \alias{viewportConvertDim} \title{ Functions for using an imported coordinate system } \description{ These functions convert between different units. The conversion occurs within viewports unknown to \code{grid}, but imported to R via \code{\link{gridSVGCoords}}. } \usage{ viewportConvertX(vpname, x, from, to = "svg") viewportConvertY(vpname, x, from, to = "svg") viewportConvertPos(vpname, x, y, from, to = "svg") viewportConvertWidth(vpname, x, from, to) viewportConvertHeight(vpname, x, from, to) viewportConvertDim(vpname, w, h, from, to) } \arguments{ \item{vpname}{ The name of the viewport that the unit belongs within. } \item{x, y, w, h}{ The size of the unit in \code{from} units. } \item{from}{ The type of unit that \code{x} is. } \item{to}{ The unit that \code{x} is being converted to. } } \details{ Although \code{grid} has conversion functions available, it only converts units relative to the current viewport. After writing out to SVG, we no longer have actual grid viewports to convert units within. These functions are designed so that once coordinate information is loaded into \code{gridSVG} via \code{\link{gridSVGCoords}}, we can translate units within each of these viewports. Note: this requires that a \code{gridSVG} plot has had viewport information exported. These functions can be used in much the same way as \code{grid}'s unit conversion functions, the only difference being that we have a new unit, \code{svg}, which represents the size of a unit in SVG pixels. The \code{viewportConvertPos()} and \code{viewportConvertDim()} functions are for use with a viewport that has a non-zero rotation (both \code{viewportConvertX()} and \code{viewportConvertY()} will fail in that situation and \code{viewportConvertWidth()} and \code{viewportConvertHeight()} will give a not very useful answer). } \value{ A numeric vector containing a single value, the value of the new unit, or a list with components \code{x} and \code{y} for \code{viewportConvertPos()}, or a list with components \code{w} and \code{h} for \code{viewportConvertDim()}. In the case of the \code{viewportConvertX} and \code{viewportConvertY} functions, we always return a value that is in terms of SVG pixels. } \author{ Simon Potter } gridSVG/man/grid.script.Rd0000654000176200001440000000175012164147372015064 0ustar liggesusers\name{grid.script} \alias{grid.script} \alias{scriptGrob} \title{ Create a grid grob containing an SVG script} \description{ Creates a script object which is a normal grid grob containing an SVG script. Useful in conjunction with \code{grid.export}, to produce an SVG document with script elements. } \usage{ scriptGrob(script=NULL, filename=NULL, type="application/ecmascript", inline=FALSE, name=NULL) grid.script(...) } \arguments{ \item{script}{ A character value specifying script code. } \item{filename}{ The name of a file that contains script code. } \item{type}{ The type of the script code. } \item{inline}{ A logical specifying whether the script code from the file should be included inline or just referenced. } \item{name}{ A character value giving a name for the grob. } \item{\dots}{ Arguments to be passed into \code{scriptGrob}. } } \value{ A script.grob object. } \author{ Paul Murrell } \seealso{ \code{\link{grid.export}} } \keyword{ dplot } gridSVG/man/grid.export.Rd0000654000176200001440000001740712620215506015077 0ustar liggesusers\name{grid.export} \alias{grid.export} \alias{gridToSVG} \title{ Generate SVG output from a grid graphic } \description{ Produces an SVG version of the current grid page. } \usage{ grid.export(name = "Rplots.svg", exportCoords = c("none", "inline", "file"), exportMappings = c("none", "inline", "file"), exportJS = c("none", "inline", "file"), res = NULL, prefix = "", addClasses = FALSE, indent = TRUE, htmlWrapper = FALSE, usePaths = c("vpPaths", "gPaths", "none", "both"), uniqueNames = TRUE, annotate = TRUE, progress = FALSE, compression = 0, strict = TRUE, rootAttrs = NULL, xmldecl = xmlDecl()) } \arguments{ \item{name}{ The name of the SVG file to produce. If this parameter is \code{NULL} or \code{""}, a list containing the SVG document, coordinate information, and JavaScript utility functions are returned. } \item{exportCoords}{ If this parameter is not \code{none} a coordinates file is exported. If this parameter is \code{file}, the coordinates information is written to a file, while \code{inline} will include the contents within the SVG document. } \item{exportMappings}{ If this parameter is not \code{none} a mapping file is exported. If this parameter is \code{file}, the mapping information is written to a file, while \code{inline} will include the contents within the SVG document. } \item{exportJS}{ If this parameter is not \code{none} a JavaScript file is written out. This contains useful functions for manipulating gridSVG plots in the browser, including unit conversion functions. If this parameter is \code{file}, the JavaScript file is written to a file, while \code{inline} will include the contents within the SVG document. } \item{res}{ The device resolution to print at (in DPI). If \code{NULL}, this is automatically calculated to be the resolution of the current device. Typically the PDF device would be used, and this uses a resolution of 72, i.e. 72 DPI. } \item{prefix}{ A prefix to apply to all generated SVG ID attributes. Useful for ensuring unique IDs when many SVG images exist within the same HTML document. If a valid prefix has been given, the root \code{} element will be given an ID attribute with the prefix as its value. } \item{addClasses}{ If \code{TRUE}, adds an SVG class attribute to all grobs and viewports which holds the value of the class of the grob or viewport. If the class attribute already exists (via \code{\link{grid.garnish}} or \code{\link{grid.element}}), the resulting SVG class attribute will be the union of the existing class attribute and the grob/viewport classes. } \item{indent}{ Determines whether the resulting SVG document will be exported with indentation present. Indentation makes the document more readable, but when \code{indent} is set to \code{FALSE}, parsing the SVG in JavaScript is easier because there are no empty text nodes. } \item{htmlWrapper}{ If \code{TRUE}, saves a wrapping HTML file. This file contains a snippet of HTML which links to the exported SVG file. } \item{usePaths}{ If this parameter is set to \code{vpPaths}, then when writing out viewports gridSVG will set the SVG element ID to the current \code{vpPath} instead of the current viewport name. If this parameter is set to \code{gPaths}, gridSVG will set the names of grobs to be the current \code{gPath} instead of the current grob name. When \code{none}, viewports and grobs will not incorporate paths. When \code{both}, viewports and grobs will both use paths. } \item{uniqueNames}{ If \code{TRUE}, gridSVG will make an attempt to produce unique grob names. Unique \code{id} attributes are required for valid SVG. It is highly recommended that mapping information is used when this parameter is \code{TRUE}. } \item{annotate}{ If \code{TRUE}, an SVG metadata element will be introduced directly below the root \code{} element. This element contains XML that describes the information that gridSVG used to draw the image (mostly arguments to \code{grid.export}). This output may be useful for debugging purposes. } \item{progress}{ If \code{TRUE}, messages will be displayed in the console that show how quickly gridSVG is progressing when exporting an SVG image. This is particularly useful when there are large images being exported so we have a reasonable estimate of how long exporting will take. } \item{compression}{ An integer between 0 and 9 indicating the level of (gzip) compression applied to the SVG image when it is saved to a file. Higher values of \code{compression} indicate smaller file sizes at the expense of increased computation. } \item{strict}{ A logical indicating whether checks should be made that all attributes added to SVG elements are valid. If this is \code{TRUE} and invalid attributes are detected, those attributes are removed, with a warning. } \item{rootAttrs}{ A named character vector containing attributes for the top-level \code{} element. } \item{xmldecl}{ This parameter sets the XML declaraction that will be applied to the SVG document. By default this parameter simply declares that the document is XML version 1.0, along with the character encoding that was used to export the SVG document. If \code{xmldecl} is \code{NULL}, then no XML declaration is printed. This may be useful when you want only the SVG document and nothing more. } } \details{ The \code{uniqueNames} parameter is set to \code{TRUE} by default in order to ensure that each SVG element ID is unique. This is a requirement of XML (which SVG is based on). This differs from \code{usePaths} because \code{usePaths} can still generate names that are not unique (there are several ways for this to happen). \code{uniqueNames} modifies grob and viewport names with a numeric suffix to ensure uniqueness. When \code{FALSE}, only grob names will be kept unmodified because modifying viewport names would affect coordinate information. Occasionally the XML package can report warnings, despite valid SVG being produced. If spurious warnings are being produced, set \code{options(gridSVGWarnings = FALSE)} to ignore them. See the files in the directory gridSVG/tests for examples of things that can be done. See the file gridSVG/doc/overview.tex for limitations. } \value{ When \code{name} has a valid filename the side effect is to produce an SVG file of the specified name. Optionally a JavaScript file containing coordinate transformation information is also exported. Optionally a JavaScript file containing name mapping information is also exported. Optionally a JavaScript file containing utility JavaScript functions is also exported. When \code{name} has a filename with zero characters, a named list is returned with four elements. \code{svg} is the SVG root node (and all its children, see the XML package for more information on how to use this. \code{coords} contains the list of coordinate information for exported viewports. \code{mappings} is a list containing information on how names have been modified during the exporting process. \code{utils} is a character vector containing JavaScript code to manipulate gridSVG plots in the browser. This list is always returned but when a valid filename is given, it is returned invisibly. } \author{ Paul Murrell } \seealso{ \code{\link{grid.hyperlink}}, \code{\link{grid.animate}}, \code{\link{grid.garnish}} } \keyword{ dplot } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/grobToDev.Rd����������������������������������������������������������������������������0000654�0001762�0000144�00000002545�12164147372�014532� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grobToDev} \alias{grobToDev} %- Also NEED an '\alias' for EACH other topic documented here. \title{ %% ~~function to do ... ~~ Convert a grob to device calls } \description{ %% ~~ A concise (1-5 lines) description of what the function does. ~~ This function is used to make calls to a device to draw a grob. It is generic so new grob classes can write their own methods. } \usage{ grobToDev(x, dev) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A grob. %% ~~Describe \code{x} here~~ } \item{dev}{ A graphics device. %% ~~Describe \code{dev} here~~ } } \details{ %% ~~ If necessary, more details than the description above ~~ This function is not called directly by the user. It is exposed so that new grob classes can easily write their own methods which call existing methods for standard grobs. The difference between this function and \code{primToDev()} is that this one takes care of setting up coordinate systems based on the grid viewports so that SVG output is positioned correctly, then it calls \code{primToDev()} to produce the actual SVG elements. } \author{ %% ~~who you are~~ Paul Murrell } %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ dplot } �����������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/grid.hyperlink.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000003354�12164147372�015567� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grid.hyperlink} \alias{grid.hyperlink} \alias{hyperlinkGrob} \title{ Associate a hyperlink with a grid grob } \description{ Creates a linked.grob object which is a normal grid grob, with a hyperlink attached. Useful in conjunction with \code{grid.export}, to produce an SVG document with hyperlinked graphical elements. } \usage{ grid.hyperlink(path, href, show=NULL, group=TRUE, redraw=FALSE, strict=FALSE, grep=FALSE, global=FALSE) hyperlinkGrob(x, href, show=NULL, group=TRUE) } \arguments{ \item{x}{ A grob to add a hyperlink to. } \item{path}{ A grob path specifying a drawn grob. } \item{href}{ A valid Xlink URI. Can be a vector of several links (see \code{group} argument below). } \item{show}{ A character vector specifying how the link should be opened. \code{NULL} and \code{""} will avoid adding an attribute. The most common cases are to use \code{"new"} to open a link in a new window/tab, or \code{"replace"} to open the link in the current window/tab. } \item{group}{ A logical indicating whether the hyperlinks should be attached to the overall parent group for the relevant SVG element, or to individual SVG elements. } \item{redraw}{ A logical value to indicate whether to redraw the grob. } \item{strict}{ A boolean indicating whether the \code{path} must be matched exactly. } \item{grep}{ Whether the \code{path} should be treated as a regular expression. } \item{global}{ A boolean indicating whether the function should affect just the first match of the \code{path}, or whether all matches should be affected. } } \value{ A linked.grob object. } \author{ Paul Murrell } \seealso{ \code{\link{grid.export}} } \keyword{ dplot } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/registerGradientFill.Rd�����������������������������������������������������������������0000654�0001762�0000144�00000001462�12164147372�016745� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{Gradient Fills} \alias{registerGradientFill} \title{ Create a definition of a gradient fill. } \description{ A feature of SVG is that elements can be filled with a gradient that is defined somewhere in the document. The purpose of the \code{registerGradientFill} function is to create a definition of a gradient fill so that it can be referred to by grobs drawn by gridSVG. } \usage{ registerGradientFill(label, gradient) } \arguments{ \item{label}{ A character identifier for a gradient fill. } \item{gradient}{ A gradient object filled with gradient stops. See \code{\link{linearGradient}} and \code{\link{radialGradient}}. } } \value{ None. } \author{ Simon Potter } \seealso{ \code{\link{linearGradient}}, \code{\link{radialGradient}}, \code{\link{grid.gradientFill}} } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feDiffuseLighting.Rd��������������������������������������������������������������������0000654�0001762�0000144�00000005204�12164147372�016220� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feDiffuseLighting} \alias{feDiffuseLighting} \title{ Light an image using the alpha channel as a bump map. } \description{ This filter primitive lights an image using the alpha channel as a bump map. The resulting image is an RGBA opaque image based on the light colour with \code{alpha = 1} everywhere. The lighting calculation follows the standard diffuse component of the Phong lighting model. The resulting image depends on the light colour, light position and surface geometry of the input bump map. } \usage{ feDiffuseLighting(input = NA, surfaceScale = 1, diffuseConstant = 1, kernelUnitLength = NA, col = "white", lightSource = NULL, ...) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{surfaceScale}{ Scale applied to the input alpha surface. } \item{diffuseConstant}{ \code{kd} in the Phong lighting model. Must be non-negative. } \item{kernelUnitLength}{ The first number is the \code{dx} value. The second number is the \code{dy} value. If the \code{dy} value is not specified, it defaults to the same value as \code{dx}. Indicates the intended distance in current filter units (i.e., units as determined by the value of parent filter container's \code{primitiveUnits}) for \code{dx} and \code{dy}, respectively, in the surface normal calculation formulas. By specifying value(s) for \code{kernelUnitLength}, the kernel becomes defined in a scalable, abstract coordinate system. If \code{kernelUnitLength} is not specified, the \code{dx} and \code{dy} values should represent very small deltas relative to a given (x,y) position, which might be implemented in some cases as one pixel in the intermediate image offscreen bitmap, which is a pixel-based coordinate system, and thus potentially not scalable. } \item{col}{ The colour to apply to the light from \code{lightSource}. } \item{lightSource}{ A light source object, produced by one of \code{\link{feDistantLight}}, \code{\link{fePointLight}}, or \code{\link{feSpotLight}}. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.diffuse.lighting} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feDiffuseLightingElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}} \code{\link{fe}}, \code{\link{feDistantLight}}, \code{\link{fePointLight}}, \code{\link{feSpotLight}}. } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feBlend.Rd������������������������������������������������������������������������������0000654�0001762�0000144�00000002023�12164147372�014165� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feBlend} \alias{feBlend} \title{ Blend two objects together. } \description{ This filter composites two objects together using commonly used imaging software blending modes. It performs a pixel-wise combination of two input images. } \usage{ feBlend(input1 = NA, input2 = NA, mode = c("normal", "multiply", "screen", "darken", "lighten"), ...) } \arguments{ \item{input1}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{input2}{ Identfies a second input for this filter primitive. See \code{\link{filterInputs}}. } \item{mode}{ An image blending mode. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.blend} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feBlendElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/pushMask.Rd�����������������������������������������������������������������������������0000654�0001762�0000144�00000002566�12164147372�014435� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{pushMask} \alias{pushMask} \alias{popMask} \title{ Apply a masking context to the current viewport. } \description{ This function is intended to be used similarly to \code{\link{grid.clip}}. The key difference is that instead of applying a new clipping context to the viewport, we apply a new masking context. } \usage{ pushMask(mask = NULL, label = NULL, name = NULL, draw = TRUE) popMask() } \arguments{ \item{mask}{ A \code{mask} object, used as the definition of an opacity mask. } \item{label}{ A label for a defined reference. } \item{name}{ A character identifier for the grob applying the masking context. } \item{draw}{ A logical value indicating whether graphics output should be produced. } } \details{ If \code{label} is specified, uses a mask that has been supplied to \code{registerMask}. If \code{mask} is specified it will be used as the new masking context for the current viewport. If both are specified, it will attempt to define the mask with the given label, as well as applying the mask as the new masking context for the current viewport. \code{popMask} is an alias for \code{\link{popContext}}. } \value{ A \code{pushMask} grob. The value is returned invisibly. } \author{ Simon Potter } \seealso{ \code{\link{mask}}, \code{\link{registerMask}}, \code{\link{grid.mask}}, \code{\link{popContext}}. } ������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/grid.garnish.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000003155�12164147372�015214� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grid.garnish} \alias{grid.garnish} \alias{garnishGrob} \title{ Associate arbitrary SVG attributes with a grid grob } \description{ Creates an svg.grob object which is a normal grid grob, with SVG attributes attached. Useful in conjunction with \code{grid.export}, to produce an SVG document with attributes that have no corresponding concept in grid graphics. } \usage{ garnishGrob(x, ..., group=TRUE) grid.garnish(path, ..., group=TRUE, redraw=FALSE, strict = FALSE, grep=FALSE, global=FALSE) } \arguments{ \item{x}{A grob.} \item{path}{ A grob path specifying a drawn grob. } \item{...}{ Arbitrary SVG attribute settings. } \item{group}{ A logical indicating whether the SVG attributes should be attached to the overall parent group for the relevant SVG element, or to individual SVG elements. } \item{redraw}{ A logical value to indicate whether to redraw the grob. } \item{strict}{ A boolean indicating whether the \code{path} must be matched exactly. } \item{grep}{ Whether the \code{path} should be treated as a regular expression. } \item{global}{ A boolean indicating whether the function should affect just the first match of the \code{path}, or whether all matches should be affected. } } \details{ The SVG attribute settings can be vectors (in the case of garnishing individual SVG elements) or even named vectors (if you want precise control over which attribute value is apportioned to which individual SVG element). } \value{ A garnished.grob object. } \author{ Paul Murrell } \seealso{ \code{\link{grid.export}} } \keyword{ dplot } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feComposite.Rd��������������������������������������������������������������������������0000654�0001762�0000144�00000004215�12164147372�015110� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feComposite} \alias{feComposite} \title{ Combine images using Porter-Duff operations. } \description{ This filter performs the combination of the two input images pixel-wise in image space using one of the Porter-Duff compositing operations. The arithmetic operation is useful for combining the output from the \code{\link{feDiffuseLighting}} and \code{\link{feSpecularLighting}} filter effects with texture data. It is also useful for implementing dissolve. } \usage{ feComposite(input1 = NA, input2 = NA, operator = c("over", "in", "out", "atop", "xor", "arithmetic"), k1 = 0, k2 = 0, k3 = 0, k4 = 0, ...) } \arguments{ \item{input1}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{input2}{ Identfies a second input for this filter primitive. See \code{\link{filterInputs}}. } \item{operator}{ The compositing operation that is to be performed. All of the \code{operator} types except \code{"arithmetic"} match the corresponding operation as described in the referenced Porter-Duff text. The arithmetic operator is described in the referenced SVG specification. } \item{k1}{ A numeric value. Only applicable if \code{operator} is \code{"arithmetic"}. } \item{k2}{ A numeric value. Only applicable if \code{operator} is \code{"arithmetic"}. } \item{k3}{ A numeric value. Only applicable if \code{operator} is \code{"arithmetic"}. } \item{k4}{ A numeric value. Only applicable if \code{operator} is \code{"arithmetic"}. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.composite} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feCompositeElement} Compositing Digital Images, T. Porter and T. Duff. SIGGRAPH '84 Conference Proceedings, Association for Computing Machinery, Volume 18, Number 3, July 1984. } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feMorphology.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000002610�12164147373�015303� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feMorphology} \alias{feMorphology} \title{ "Fatten" or "thin" artwork. } \description{ This filter primitive performs "fattening" or "thinning" of artwork. It is particularly useful for fattening or thinning an alpha channel. } \usage{ feMorphology(input = NA, operator = c("erode", "dilate"), radius = unit(0, "npc"), default.units = "npc", ...) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{operator}{ A keyword indicating whether to erode (i.e., thin) or dilate (fatten) the source graphic, \code{input}. } \item{radius}{ The radius (or radii) for the operation. If two values are provided, the first value represents a x-radius and the second value represents a y-radius. If one radius is provided, then that value is used for both xand y. } \item{default.units}{ A string indicating the default units to use if \code{radius} is only given as a numeric vector. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.morphology} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feMorphologyElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } ������������������������������������������������������������������������������������������������������������������������gridSVG/man/getSVGFonts.Rd��������������������������������������������������������������������������0000654�0001762�0000144�00000001524�12164147372�015004� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{getSVGFonts} \alias{getSVGFonts} \alias{setSVGFonts} \title{ Manage SVG fonts } \description{ These functions control the SVG font stacks that are used when exporting text to SVG. } \usage{ getSVGFonts() setSVGFonts(fontStacks) } \arguments{ \item{fontStacks}{A list of font stacks (typically the modified result from \code{getSVGFonts()}). } } \details{ \code{getSVGFonts()} returns a list of three font stacks called \code{serif}, \code{sans}, and \code{mono}. The user can modify the values in each stack and then reset the stacks by calling \code{setSVGFonts()} (a default value will always be forced at the end of each font stack). } \value{ A list (for \code{getSVGFonts()}). } \author{ Simon Potter } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ dplot } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/animUnit.Rd�����������������������������������������������������������������������������0000654�0001762�0000144�00000003645�12215443562�014422� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{animUnit} \alias{animUnit} \alias{animValue} \alias{as.animUnit} \alias{as.animValue} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Generate a set of animation values. } \description{ These functions can be used to generate a set of values for use with \code{grid.animate()} to animate some feature of a grob. } \usage{ animUnit(x, timeid = NULL, id = NULL) animValue(x, timeid = NULL, id = NULL) as.animUnit(x, ...) as.animValue(x, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A set of animation values. Could be a numeric vector, a character vector, a unit vector, a matrix, a list of units. } \item{timeid}{ A vector that associates each value of \code{x} with a time point. } \item{id}{ A vector that associates each value of \code{x} with a different (numeric) identifier. } \item{\dots}{ For future use. } } \details{ A set of animation values is ultimately either a numeric or character vector OR a unit vector. Subsets of the animation values can be defined per time point, or per identifier, or both. The \code{as} functions allow animation values to be specified as matrices or lists, which are converted to formal animation value sets. The \code{grid.animate()} function calls these functions so the conversion typically happens automatically. These functions should only have to be called directly in relatively complex cases where multiple values need to be specified per time point AND per identifier. } \value{ An animUnit or animValue object. } \author{ Paul Murrell } \seealso{ \code{\link{grid.animate}} } \examples{ require(grid) animValue(c("visible", "hidden")) animUnit(unit(1:24, "in"), timeid=rep(1:3, each=8), id=rep(1:2, 12)) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ dplot }% __ONLY ONE__ keyword per line �������������������������������������������������������������������������������������������gridSVG/man/feImage.Rd������������������������������������������������������������������������������0000654�0001762�0000144�00000002053�12164147372�014166� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feImage} \alias{feImage} \title{ Draw a referred image. } \description{ This filter effect primitive refers to a graphic external to this filter container, which is loaded or rendered into an RGBA raster and becomes the result of the filter effect primitive. } \usage{ feImage(preserveAspectRatio = "xMidYMid meet", href = "", ...) } \arguments{ \item{preserveAspectRatio}{ See references for appropriate values and behaviour. } \item{href}{ A \code{URL} reference to a stand-alone image resource such as a JPEG, PNG or SVG file. e.g. \code{http://example.com/img.jpg} } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.image} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feImageElement} \url{http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feDistantLight.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000002157�12164147372�015547� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feDistantLight} \alias{feDistantLight} \title{ Create a Distant Light Source } \description{ This filter primitive defines a distant light source that can be used within a lighting filter primitive: \code{\link{feDiffuseLighting}} or \code{\link{feSpecularLighting}}. } \usage{ feDistantLight(azimuth = 0, elevation = 0, ...) } \arguments{ \item{azimuth}{ Direction angle for the light source on the x-y plane (clockwise), in degrees from the x axis. } \item{elevation}{ Direction angle for the light source from the x-y plane towards the z axis, in degrees. Note the positive z-axis points towards the viewer of the content. } \item{\dots}{ Further arguments to be passed onto \code{fe}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.distant.light} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feDistantLightElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}, \code{\link{feDiffuseLighting}}, \code{\link{feSpecularLighting}}. } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/pushClipPath.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000002576�12164147372�015247� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{pushClipPath} \alias{pushClipPath} \alias{popClipPath} \title{ Apply a clipping context to the current viewport. } \description{ This function is intended to be used similarly to \code{\link{grid.clip}}. The only difference is that a non-rectangular clipping region can be applied. } \usage{ pushClipPath(clippath = NULL, label = NULL, name = NULL, draw = TRUE) popClipPath() } \arguments{ \item{clippath}{ A graphics object, used as the definition of a clipping path. } \item{label}{ A label for a defined reference. } \item{name}{ A character identifier for the grob applying the clipping context. } \item{draw}{ A logical value indicating whether graphics output should be produced. } } \details{ If \code{label} is specified, uses a clipping path that has been supplied to \code{registerClipPath}. If \code{clippath} is specified it will be used as the new clipping context for the current viewport. If both are specified, it will attempt to define the clipping path with the given label, as well as adding the clipping path as a clipping context for the current viewport. \code{popClipPath} is an alias for \code{\link{popContext}} } \value{ A \code{pushClipPath} grob. The value is returned invisibly. } \author{ Simon Potter } \seealso{ \code{\link{registerClipPath}}, \code{\link{grid.clipPath}}, \code{\link{popContext}}. } ����������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feConvolveMatrix.Rd���������������������������������������������������������������������0000654�0001762�0000144�00000013004�12164147372�016122� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feConvolveMatrix} \alias{feConvolveMatrix} \title{ Apply a matrix convolution filter effect. } \description{ A convolution combines pixels in the input image with neighbouring pixels to produce a resulting image. A wide variety of imaging operations can be achieved through convolutions, including blurring, edge detection, sharpening, embossing and beveling. } \usage{ feConvolveMatrix(input = NA, order = 3, kernelMatrix = matrix(), divisor = 1, bias = 0, targetX = 1, targetY = 1, edgeMode = c("duplicate", "wrap", "none"), kernelUnitLength = NA, preserveAlpha = FALSE, ...) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{order}{ A numeric vector of length 1 or 2. Indicates the number of cells in each dimension for \code{kernelMatrix}. The values provided must be integers greater than zero. The first number (orderX), indicates the number of columns in the matrix. The second number (orderY), indicates the number of rows in the matrix. If this is a vector of length one then the number of rows is assumed to be same as the number of columns specified. } \item{kernelMatrix}{ The kernel matrix for the convolution. The number of entries must correspond with the values given by \code{order}. } \item{divisor}{ After applying the \code{kernelMatrix} to the input image to yield a number, that number is divided by \code{divisor} to yield the final destination colour value. A divisor that is the sum of all the matrix values tends to have an evening effect on the overall colour intensity of the result. It is an error to specify a divisor of zero. The default value is the sum of all values in kernelMatrix, with the exception that if the sum is zero, then the divisor is set to 1. } \item{bias}{ After applying the \code{kernelMatrix} to the input image to yield a number and applying the \code{divisor}, the \code{bias} attribute is added to each component. One application of \code{bias} is when it is desirable to have 0.5 gray value be the zero response of the filter. The bias property shifts the range of the filter. This allows representation of values that would otherwise be clamped to 0 or 1. } \item{targetX}{ Determines the positioning in X of the convolution matrix relative to a given target pixel in the input image. The leftmost column of the matrix is column number zero. The value must be such that: \eqn{0 <= targetX < orderX}{0 <= targetX < orderX}. By default, the convolution matrix is centered in X over each pixel of the input image (i.e., \eqn{targetX = \lfloor orderX / 2 \rfloor}{targetX = floor( orderX / 2 ))}. } \item{targetY}{ Determines the positioning in Y of the convolution matrix relative to a given target pixel in the input image. The topmost row of the matrix is row number zero. The value must be such that: \eqn{0 <= targetY < orderY}{0 <= targetY < orderY}. By default, the convolution matrix is centered in Y over each pixel of the input image (i.e., \eqn{targetY = \lfloor orderY / 2 \rfloor}{targetY = floor( orderY / 2))}. } \item{edgeMode}{ Determines how to extend the input image as necessary with colour values so that the matrix operations can be applied when the kernel is positioned at or near the edge of the input image. \itemize{ \item \code{"duplicate"} indicates that the input image is extended along each of its borders as necessary by duplicating the colour values at the given edge of the input image. \item \code{"wrap"} indicates that the input image is extended by taking the colour values from the opposite edge of the image. \item \code{"none"} indicates that the input image is extended with pixel values of zero for R, G, B and A. } } \item{kernelUnitLength}{ The first number is the \code{dx} value. The second number is the \code{dy} value. If the \code{dy} value is not specified, it defaults to the same value as \code{dx}. Indicates the intended distance in current filter units (i.e., units as determined by the value of the filter effect container's \code{primitiveUnits}) between successive columns and rows, respectively, in the \code{kernelMatrix}. By specifying value(s) for \code{kernelUnitLength}, the kernel becomes defined in a scalable, abstract coordinate system. If \code{kernelUnitLength} is not specified, the default value is one pixel in the offscreen bitmap, which is a pixel-based coordinate system, and thus potentially not scalable. } \item{preserveAlpha}{ A value of \code{FALSE} indicates that the convolution will apply to all channels, including the alpha channel. A value of \code{TRUE} indicates that the convolution will only apply to the colour channels. In this case, the filter will temporarily unpremultiply the colour component values, apply the kernel, and then re-premultiply at the end. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.convolve.matrix} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feConvolveMatrixElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/filterEffect.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000006701�12164147372�015237� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{filterEffect} \alias{filterEffect} \alias{addFilterEffect} \title{ Creating Filter Effects } \description{ Create objects which describe filter effects. These objects can be used to add filter effect primitives. They can be used to apply a filter effect to grobs and also to define a filter effect so that it may be used multiple times. } \usage{ filterEffect(feList = NULL, filterUnits = c("coords", "bbox"), x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", primitiveUnits = c("coords", "bbox")) addFilterEffect(filter, filterEffect, after = NA) } \arguments{ \item{feList}{ A list of filter effect primitives. For example a list containing a gaussian blur primitive created by \code{\link{feGaussianBlur}}. } \item{filterUnits}{ If \code{"bbox"}, the filter effect itself is positioned relative to the bounding box of the referring grob. All units attempt to be converted to equivalent "npc" coordinates as a reulst. If \code{"coords"}, uses grid coordinates to determine positioning. } \item{x}{ A numeric vector or unit object specifying x-location. } \item{y}{ A numeric vector or unit object specifying y-location. } \item{width}{ A numeric vector or unit object specifying width. } \item{height}{ A numeric vector or unit object specifying height. } \item{just}{ The justification of the pattern relative to its (x, y) location. If there are two values, the first value specifies horizontal justification and the second value specifies vertical justification. Possible string values are: \code{"left"}, \code{"right"}, \code{"centre"}, \code{"center"}, \code{"bottom"}, and \code{"top"}. For numeric values, 0 means left alignment and 1 means right alignment. } \item{hjust}{ A numeric vector specifying horizontal justification. If specified, overrides the \code{just} setting. } \item{vjust}{ A numeric vector specifying vertical justification. If specified, overrides the \code{just} setting. } \item{default.units}{ A string indicating the default units to use if \code{x}, \code{y}, \code{width}, or \code{height} are only given as numeric vectors. } \item{primitiveUnits}{ If \code{"bbox"}, all filter effect primitives will be positioned relative to the bounding box of the filter effect region (determined by \code{x}, \code{y}, \code{width}, \code{height} and \code{filterUnits}). All units attempt to be converted to equivalent "npc" coordinates. If \code{"coords"}, uses grid coordinates to determine positioning. } \item{filter}{ A filter effect container object, as created by \code{filterEffect}. } \item{filterEffect}{ A filter effect primitive object. } \item{after}{ Numeric. Determines where amongst the children of \code{filter} that \code{filterEffect} should be added. \code{NA} indicates that \code{filterEffect} should be appended to the end of the list of children. } } \details{ This is primarily a container object to hold filter effect primitives. } \value{ A \code{filter} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#FilterElement} } \author{ Simon Potter } \seealso{ Any of the filter effect primitives (named \code{fe*}), e.g. \code{\link{feGaussianBlur}}. } ���������������������������������������������������������������gridSVG/man/grid.gradientFill.Rd��������������������������������������������������������������������0000654�0001762�0000144�00000004756�12164147372�016175� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grid.gradientFill} \alias{grid.gradientFill} \alias{gradientFillGrob} \title{ Associate a gradient fill with a grid grob } \description{ Creates a \code{gradientFilled.grob} object which is a normal grid grob, with a gradient fill used in place of a regular fill. Used in conjunction with \code{registerGradientFill}, to produce an SVG document containing graphical elements with gradient fills. } \usage{ grid.gradientFill(path, gradient = NULL, label = NULL, alpha = 1, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) gradientFillGrob(x, gradient = NULL, label = NULL, alpha = 1, group = TRUE) } \arguments{ \item{x}{ A grob to add a pattern fill to. } \item{path}{ A grob path specifying a drawn grob. } \item{gradient}{ A \code{gradient} object, provided by the \code{linearGradient} and \code{radialGradient} functions. Provides the definition of a gradient fill that will be applied to \code{x} or \code{path}. } \item{label}{ A label that is associated with a definition of a gradient fill. This is the label used to create a gradient fill definition with \code{registerGradientFill}. } \item{alpha}{ The alpha channel for transparency. A value between 0 and 1. } \item{group}{ A logical vector that indicates whether the gradient fill should be applied to the overall parent group for the relevant SVG element, or to individual SVG elements. } \item{redraw}{ A logical value to indicate whether to redraw the grob. } \item{strict}{ A boolean indicating whether the \code{path} must be matched exactly. } \item{grep}{ Whether the \code{path} should be treated as a regular expression. } \item{global}{ A boolean indicating whether the function should affect just the first match of the \code{path}, or whether all matches should be affected. } } \details{ If \code{label} is specified, uses a gradient that has been supplied to \code{registerGradientFill}. If \code{gradient} is specified it will be used as the gradient fill applied to each grob. If both are specified, it will attempt to define the gradient with the given label, as well as applying a gradient fill to the appropriate grobs. } \value{ A \code{gradientFilled.grob} object (for \code{gradientFillGrob}). } \author{ Simon Potter } \seealso{ \code{\link{linearGradient}}, \code{\link{radialGradient}}, \code{\link{registerGradientFill}} } ������������������gridSVG/man/registerFilter.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000001456�12164147372�015631� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{registerFilter} \alias{registerFilter} \title{ Create the definition a filter effect. } \description{ A feature of SVG is that elements can be filtered using filter effects defined somewhere in the document. The purpose of this function is to create the definition of a filter effect so that it can be referred to by grobs drawn by gridSVG. } \usage{ registerFilter(label, filter) } \arguments{ \item{label}{ A character identifier for the definition. } \item{filter}{ A \code{filter} object, produced by the \code{\link{filterEffect}} function. } } \details{ When registering a filter, all locations and dimensions that filter effects refer to become fixed. } \value{ None. } \author{ Simon Potter } \seealso{ \code{\link{grid.filter}}, \code{\link{filterEffect}}. } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feTurbulence.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000005611�12164147372�015257� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feTurbulence} \alias{feTurbulence} \title{ Create an image using the Perlin turbulence function. } \description{ This filter primitive creates an image using the Perlin turbulence function. It allows the synthesis of artificial textures like clouds or marble. } \usage{ feTurbulence(baseFrequency = 0, numOctaves = 1, seed = 1, stitchTiles = FALSE, type = c("turbulence", "fractalNoise"), ...) } \arguments{ \item{baseFrequency}{ The base frequency (frequencies) parameter(s) for the noise function. If a two element numeric vector is provided, the first number represents a base frequency in the X direction and the second value represents a base frequency in the Y direction. If one number is provided, then that value is used for both X and Y. } \item{numOctaves}{ The \code{numOctaves} parameter for the noise function. } \item{seed}{ The starting number for the pseudo random number generator. } \item{stitchTiles}{ If \code{stitchTiles} is \code{FALSE}, no attempt it made to achieve smooth transitions at the border of tiles which contain a turbulence function. Sometimes the result will show clear discontinuities at the tile borders. If \code{stitchTiles} is \code{TRUE}, then the user agent will automatically adjust \code{baseFrequency}-x and \code{baseFrequency}-y values such that the \code{feTurbulence}'s width and height (i.e., the width and height of the current subregion) contains an integral number of the Perlin tile width and height for the first octave. The \code{baseFrequency} will be adjusted up or down depending on which way has the smallest relative (not absolute) change as follows: Given the frequency, calculate \eqn{lowFreq = \lfloor width * frequency \rfloor / width}{lowFreq = floor(width*frequency)/width} and \eqn{hiFreq = \lceil width*frequency \rceil /width}{hiFreq=ceil(width*frequency)/width}. If \eqn{frequency/lowFreq < hiFreq/frequency}{frequency/lowFreq < hiFreq/frequency} then use \code{lowFreq}, else use \code{hiFreq}. While generating turbulence values, generate lattice vectors as normal for Perlin Noise, except for those lattice points that lie on the right or bottom edges of the active area (the size of the resulting tile). In those cases, copy the lattice vector from the opposite edge of the active area. } \item{type}{ Indicates whether the filter primitive should perform a noise or turbulence function. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.turbulence} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feTurbulenceElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } �����������������������������������������������������������������������������������������������������������������������gridSVG/man/feFlood.Rd������������������������������������������������������������������������������0000654�0001762�0000144�00000001557�12164147372�014217� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feFlood} \alias{feFlood} \title{ Create and fill a rectangular region. } \description{ This filter primitive creates a rectangle filled with a specified colour. The rectangle is as large as the filter primitive subregion established by the \code{x}, \code{y}, \code{width} and \code{height} attributes passed onto \code{\link{fe}} via \code{...}. } \usage{ feFlood(col = "black", ...) } \arguments{ \item{col}{ A colour that will be used to fill the filter region. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.flood} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feFloodElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } �������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feTile.Rd�������������������������������������������������������������������������������0000654�0001762�0000144�00000001711�12164147372�014041� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feTile} \alias{feTile} \title{ Fill a rectangle with a tiled pattern of an input image. } \description{ This filter primitive fills a target rectangle with a repeated, tiled pattern of an input image. The target rectangle is as large as the filter primitive subregion established by the \code{x}, \code{y}, \code{width} and \code{height} arguments that are passed onto \code{\link{fe}} by \code{\link{feTile}}. } \usage{ feTile(input = NA, ...) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.tile} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feTileElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } �������������������������������������������������������gridSVG/man/gradients.Rd����������������������������������������������������������������������������0000654�0001762�0000144�00000007233�12164147372�014616� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{Gradient Objects} \alias{linearGradient} \alias{radialGradient} \title{ Create Linear and Radial Gradients } \description{ Create objects which describe linear and radial gradients. These objects can later be used to apply a gradient fill to grobs, and also to define a gradient so that it may be reused multiple times. } \usage{ linearGradient(col = c("black", "white"), stops = seq(0, 1, length.out = length(col)), gradientUnits = c("bbox", "coords"), x0 = unit(0, "npc"), x1 = unit(1, "npc"), y0 = unit(0, "npc"), y1 = unit(1, "npc"), default.units = "npc", spreadMethod = c("pad", "reflect", "repeat")) radialGradient(col = c("black", "white"), stops = seq(0, 1, length.out = length(col)), gradientUnits = c("bbox", "coords"), x = unit(0.5, "npc"), y = unit(0.5, "npc"), r = unit(0.5, "npc"), fx = unit(0.5, "npc"), fy = unit(0.5, "npc"), default.units = "npc", spreadMethod = c("pad", "reflect", "repeat")) } \arguments{ \item{col}{ A vector of colours used for gradient stops. } \item{stops}{ A numeric vector of offsets (typically between 0 and 1) to place the the colours (\code{col}) at. } \item{gradientUnits}{ If \code{"bbox"}, the gradient is positioned relative to the bounding box of the referring grob. All units attempt to be converted to equivalent "npc" coordinates as a result. If \code{"coords"}, uses grid coordinates to determine positioning. } \item{x0}{ Numeric or unit object indicating the starting x-location of the linear gradient. } \item{x1}{ Numeric or unit object indicating the stopping x-location of the linear gradient. } \item{y0}{ Numeric or unit object indicating the starting y-location of the linear gradient. } \item{y1}{ Numeric or unit object indicating the stopping y-location of the linear gradient. } \item{x}{ Numeric or unit object indicating the x-location of the radial gradient. } \item{y}{ Numeric or unit object indicating the y-location of the radial gradient. } \item{r}{ A numeric vector or unit object specifying the radius of the radial gradient. } \item{fx}{ A numeric vector or unit object specifying an x-location. Determines the x-location of the focal point of the radial gradient. } \item{fy}{ A numeric vector or unit object specifying an y-location. Determines the y-location of the focal point of the radial gradient. } \item{default.units}{ A string indicating the default units to use if \code{x}, \code{y}, \code{r}, \code{fx} or \code{fy} are only given as numeric vectors. } \item{spreadMethod}{ A character vector determining when happens when a gradient begins or ends within its bounds. See details. } } \details{ When defining gradient stops via \code{col} and \code{stops}, the order is important. Gradient stops which are defined earlier are drawn first, with later stops being drawn over the top. For \code{spreadMethod} the possible values are: \itemize{ \item{pad}{ Use the terminal colors of the gradient to fill the remainder of the target region. } \item{reflect}{ Reflect the gradient pattern start-to-end, end-to-start, start-to-end, etc. continuously until the target region is filled. } \item{repeat}{ Repeat the gradient pattern start-to-end, start-to-end, start-to-end, etc. continuously until the target region is filled. } } } \value{ A \code{gradient} object. } \author{ Simon Potter } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/fe.Rd�����������������������������������������������������������������������������������0000654�0001762�0000144�00000004013�12164147372�013221� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{fe} \alias{fe} \title{ Creating a generic filter effect } \description{ This function creates an object that contains all of the basic attributes that each filter effect inherits from. This is not intended to be used directly, instead it is to be used as a convenience function for building up filter effect objects. } \usage{ fe(..., x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", result = NULL) } \arguments{ \item{\dots}{ Further attributes to add to the object. } \item{x}{ A numeric vector or unit object specifying x-location. } \item{y}{ A numeric vector or unit object specifying y-location. } \item{width}{ A numeric vector or unit object specifying width. } \item{height}{ A numeric vector or unit object specifying height. } \item{just}{ The justification of the pattern relative to its (x, y) location. If there are two values, the first value specifies horizontal justification and the second value specifies vertical justification. Possible string values are: \code{"left"}, \code{"right"}, \code{"centre"}, \code{"center"}, \code{"bottom"}, and \code{"top"}. For numeric values, 0 means left alignment and 1 means right alignment. } \item{hjust}{ A numeric vector specifying horizontal justification. If specified, overrides the \code{just} setting. } \item{vjust}{ A numeric vector specifying vertical justification. If specified, overrides the \code{just} setting. } \item{default.units}{ A string indicating the default units to use if \code{x}, \code{y}, \code{width}, or \code{height} are only given as numeric vectors. } \item{result}{ A character identifier, naming the result of the filter operation. The result can be used an an input to some filter effects. } } \value{ A \code{filter.effect} object. } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/getSVGMappings.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000003446�12164147372�015476� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{Retrieve Names Mapped to SVG IDs, CSS Selectors and XPath Expressions} \alias{getSVGMappings} \title{ Retrieving Viewport, Grob, and Reference Names as SVG IDs, CSS Selectors and XPath Expressions } \description{ This function gives us SVG IDs (or CSS selectors and XPath expressions) that have been created from a grob, viewport, or referenced name as a result of exporting to SVG. } \usage{ getSVGMappings(name, type, result = "id") } \arguments{ \item{name}{ A single element character vector. This should be the name of a grob or viewport (as determined by \code{type}) present as the grid plot was exported. } \item{type}{ A single element character vector, must be one of \code{vp}, \code{grob} or \code{ref}. This determines whether we are trying to get the IDs of a grob or a viewport or a referenced object like a fill pattern. } \item{result}{ The type of output we want. \code{id} gives us SVG element IDs. \code{selector} gives us CSS selectors. \code{xpath} gives us XPath expressions. } } \details{ In order to generate unique names for SVG IDs, gridSVG output will not produce the same names as are visible on the grid display list. This function retrieves the SVG IDs associated with grob and viewport names. To use this function first requires importing mapping information, see \code{\link{gridSVGMappings}}. To make using results easier with existing JavaScript libraries and R packages, CSS selectors and XPath expressions can be returned. This is the case when \code{result} is specified as one of \code{selector} or \code{xpath}. These are targeted to match just the SVG element itself, nothing more. } \value{ A character vector representing values that can target specific SVG output. } \author{ Simon Potter } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feDisplacementMap.Rd��������������������������������������������������������������������0000654�0001762�0000144�00000003236�12164147372�016216� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feDisplacementMap} \alias{feDisplacementMap} \title{ Displace pixel values from a filter input. } \description{ This filter primitive uses the pixels values from the image from \code{input2} to spatially displace the image from \code{input1}. } \usage{ feDisplacementMap(input1 = NA, input2 = NA, scale = 0, xChannelSelector = c("A", "R", "G", "B"), yChannelSelector = c("A", "R", "G", "B"), ...) } \arguments{ \item{input1}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{input2}{ Identfies a second input for this filter primitive. See \code{\link{filterInputs}}. } \item{scale}{ Displacement scale factor. The amount is expressed in the coordinate system established by attribute \code{primitiveUnits} on the parent filter container. When the value of \code{scale} is 0, this operation has no effect on the source image. } \item{xChannelSelector}{ Indicates which channel from \code{input2} to use to displace the pixels in \code{input} along the x-axis. } \item{yChannelSelector}{ Indicates which channel from \code{input2} to use to displace the pixels in \code{input} along the y-axis. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.displacement.map} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feDisplacementMapElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/gridsvg.Rd������������������������������������������������������������������������������0000654�0001762�0000144�00000004056�12620215436�014275� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{gridsvg} \alias{gridsvg} \alias{dev.off} \title{ gridSVG Graphics Device } \description{ Provides a convenient and familiar graphics device interface for the gridSVG package. } \usage{ gridsvg(name = "Rplots.svg", exportCoords = c("none", "inline", "file"), exportMappings = c("none", "inline", "file"), exportJS = c("none", "inline", "file"), res = NULL, prefix = "", addClasses = FALSE, indent = TRUE, htmlWrapper = FALSE, usePaths = c("vpPaths", "gPaths", "none", "both"), uniqueNames = TRUE, annotate = TRUE, progress = FALSE, compression = 0, strict = TRUE, rootAttrs = NULL, xmldecl = xmlDecl(), ...) dev.off(which = dev.cur()) } \arguments{ \item{name, exportCoords, exportMappings, exportJS, res, prefix, addClasses, indent, htmlWrapper, usePaths, uniqueNames, annotate, progress, compression, strict, rootAttrs, xmldecl}{ These parameters are passed onto \code{\link{grid.export}}. } \item{\dots}{ Further parameters that are passed onto a \code{NULL} \code{\link{pdf}} graphics device. Useful parameters include \code{width} and \code{height}. } \item{which}{ An integer specifying a device number. } } \details{ These functions provide a more familiar and perhaps convenient interface to gridSVG than \code{\link{grid.export}}. It uses a PDF device as drawing occurs, but when the device needs to be written out (via \code{dev.off}) then it will save an SVG image instead. When a grid display list is not in use, or any device other than the \code{gridsvg} device is used, the behaviour of \code{dev.off} is the same as \code{\link[grDevices]{dev.off}} from the \code{grDevices} package. } \value{ \code{gridsvg} returns nothing. \code{dev.off} will return in the same manner as \code{\link{grid.export}}. A list is always returned, but invisibly when an invalid filename is given. } \author{ Simon Potter } \seealso{ \code{\link{pdf}} and \code{\link{grid.export}}. } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/readCoordsJS.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000002035�12164147372�015153� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{Import Coordinate JS} \alias{readCoordsJS} \title{ Importing JavaScript coordinate information. } \description{ This function reads in a JavaScript file and transforms it into JSON text. This text is then transformed into a list that can be used in conjunction with \code{\link{gridSVGCoords}}. } \usage{ readCoordsJS(filename) } \arguments{ \item{filename}{ A character vector that represents a file name. This file should be a JavaScript file containing coordinate information produced by \code{\link{grid.export}}. } } \details{ In order to use the \code{\link{fromJSON}} function to parse JSON text, the JavaScript file produced by \code{\link{grid.export}} needs to be transformed. It needs to transform from being an assignment of an object literal to simply the object literal itself. This function performs that task by producing a valid JSON string ready for parsing by \code{\link{fromJSON}}. It then returns the parsed list. } \value{ A list of coordinate information. } \author{ Simon Potter } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/registerMask.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000007357�12164147372�015305� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{Opacity Masks} \alias{mask} \alias{registerMask} \title{ Create the definition of an opacity mask. } \description{ A feature of SVG is that elements can have an opacity mask applied to it. An opacity mask is an image that, for various levels of opacity, makes the object that is being masked inherit the same levels of opacity. The purpose of these functions is to define an opacity mask that will be applied until the current viewport (or context, see \code{\link{popContext}}) is popped. Alternatively it can also be applied to grobs. } \usage{ mask(grob, x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), default.units = "npc", just = "centre", hjust = NULL, vjust = NULL) registerMask(label, mask = NULL, ...) } \arguments{ \item{grob}{ A grob or gTree that will be drawn as the opacity mask. } \item{x}{ A numeric vector or unit object specifying x-location. } \item{y}{ A numeric vector or unit object specifying y-location. } \item{width}{ A numeric vector or unit object specifying width. } \item{height}{ A numeric vector or unit object specifying height. } \item{default.units}{ A string indicating the default units to use if \code{x}, \code{y}, \code{width}, or \code{height} are only given as numeric vectors. } \item{just}{ The justification of the pattern relative to its (x, y) location. If there are two values, the first value specifies horizontal justification and the second value specifies vertical justification. Possible string values are: \code{"left"}, \code{"right"}, \code{"centre"}, \code{"center"}, \code{"bottom"}, and \code{"top"}. For numeric values, 0 means left alignment and 1 means right alignment. } \item{hjust}{ A numeric vector specifying horizontal justification. If specified, overrides the \code{just} setting. } \item{vjust}{ A numeric vector specifying vertical justification. If specified, overrides the \code{just} setting. } \item{label}{ A character identifier that will be used to reference this definition. } \item{mask}{ A \code{mask} object that defines the mask. } \item{\dots}{ Arguments to be given to \code{\link{mask}}. } } \details{ When registering the mask, the rectangular region that the mask applies to will become fixed. When referring to an opacity mask, the masked content will be opaque at the same coordinates that the mask is opaque. The same applies when there is any level of transparency, as any transparency in the mask will also apply in the same corresponding region of the masked object. The mask's opacity is defined as being the level of luminance present in the mask. This means anything black is fully transparent, while anything white is completely opaque. The background is assumed to be black (i.e. fully transparent). The \code{alpha} value in a mask will still be used, but its effect is combined with the computed opacity from the luminance of the mask. By using an opacity mask it is possible to have a grob with non-uniform opacity. In other words, rather than specifying an opacity via \code{\link{gpar}}'s \code{alpha} parameter, which is uniform across the grob, we can define varying opacities on a grob via an opacity mask. The \code{x}, \code{y}, \code{width}, \code{height} parameters determine the location and dimensions of the area to apply the mask to. This means we can apply a mask to any rectangular region, relative to the viewport in which it is defined (via \code{registerMask}). } \value{ For \code{mask}, a \code{mask} object. } \author{ Simon Potter } \seealso{ \code{\link{grid.mask}}, \code{\link{pushMask}}, \code{\link{popContext}}. } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/viewportCreate.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000004113�12215445653�015633� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{viewportCreate} \alias{viewportCreate} \title{ Recreate a viewport from imported coordinate information. } \description{ Creates a viewport object that is positioned in the same location as a previously exported viewport. The purpose of this function is so that we can recreate content for later manipulation. } \usage{ viewportCreate(vpname, newname = NULL, vpPath.sep = getSVGoption("vpPath.sep")) } \arguments{ \item{vpname}{ The name of the viewport to be recreated, as stored in coordinate information. This is most likely a viewport path. } \item{newname}{ The name that is going to be assigned to the viewport as it is re-created. If this parameter is \code{NULL}, then the name is taken to be the last viewport in listed in \code{vpname} (because it is usually a viewport path). } \item{vpPath.sep}{ The viewport path separator that was used for \code{vpname}. } } \details{ In order to use this function, coordinate information must be available to \code{gridSVG}. This means that viewport information must be imported using \code{\link{gridSVGCoords}}. The \code{ROOT} viewport must also have coordinate information imported because the created viewport is positioned relative to this. } \value{ A viewport object. } \author{ Simon Potter } \examples{\dontrun{ require(grid) grid.newpage() # Pushing a new VP to draw a rect within pushViewport(viewport(x = unit(0.3, "npc"), y = unit(0.2, "npc"), width = unit(0.1, "npc"), height = unit(0.3, "npc"), xscale = c(0, 20), yscale = c(0, 10), name = "testVP")) grid.rect() grid.export("create-test.svg", exportCoords = "file") # Importing coordinate information gridSVGCoords(readCoordsJS("create-test.svg.coords.js")) # This should appear to be the same rect grid.newpage() pushViewport(viewportCreate("testVP.1")) grid.rect() # Let's see if the scales are accurate, should be: # xscale: [0, 20] # yscale: [0, 10] current.viewport()$xscale current.viewport()$yscale }} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/animate.Rd������������������������������������������������������������������������������0000654�0001762�0000144�00000002210�12164147372�014242� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{animate} \alias{animate} %- Also NEED an '\alias' for EACH other topic documented here. \title{ %% ~~function to do ... ~~ Convert animation specifications to SVG elements. } \description{ %% ~~ A concise (1-5 lines) description of what the function does. ~~ This function is used to generate \code{} elements based on animation information on a grob. It is generic so new grob classes can write their own methods. } \usage{ animate(x, dev) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A grob. %% ~~Describe \code{x} here~~ } \item{dev}{ A graphics device. %% ~~Describe \code{dev} here~~ } } \details{ %% ~~ If necessary, more details than the description above ~~ This function is not called directly by the user. It is exposed so that new grob classes can easily write their own methods which call existing methods for standard grobs. } \author{ %% ~~who you are~~ Paul Murrell } %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ dplot } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/grid.clipPath.Rd������������������������������������������������������������������������0000654�0001762�0000144�00000004126�12164147372�015324� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grid.clipPath} \alias{grid.clipPath} \alias{clipPathGrob} \title{ Apply a clipping path to a grid grob. } \description{ Creates a \code{pathClipped.grob} object which is a normal grid grob, with a clipping path applied to it. Used in conjunction with \code{registerClipPath}, to produce an SVG document containing graphical elements with masked content. } \usage{ grid.clipPath(path, clippath = NULL, label = NULL, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) clipPathGrob(x, clippath = NULL, label = NULL, group = TRUE) } \arguments{ \item{x}{ A grob to clip. } \item{path}{ A grob path specifying a drawn grob. } \item{clippath}{ A grob defining a clipping region. } \item{label}{ A label that is associated with a definition of a clipping path. This is the label used to make a clipping path definition with \code{registerClipPath}. } \item{group}{ A logical vector that indicates whether the opacity mask should be applied to the overall parent group for the relevant SVG element, or to individual SVG elements. } \item{redraw}{ A logical value to indicate whether to redraw the grob. } \item{strict}{ A boolean indicating whether the \code{path} must be matched exactly. } \item{grep}{ Whether the \code{path} should be treated as a regular expression. } \item{global}{ A boolean indicating whether the function should affect just the first match of the \code{path}, or whether all matches should be affected. } } \details{ If \code{label} is specified, uses a clipping path that has been supplied to \code{registerClipPath}. If \code{clippath} is specified it will be used as the clipping path applied to each grob. If both are specified, it will attempt to define the clipping path with the given label, as well as applying the clipping path to the appropriate grobs. } \value{ A \code{pathClipped.grob} object (for \code{clipPathGrob}). } \author{ Simon Potter } \seealso{ \code{\link{registerClipPath}}, \code{\link{pushClipPath}}. } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/grid.comment.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000001547�12164147372�015226� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grid.comment} \alias{grid.comment} \alias{commentGrob} \title{ Create a grid grob representing a comment } \description{ Creates a \code{comment.grob} object which is a grid \code{\link{nullGrob}}, with a comment attached. Useful in conjunction with \code{grid.export}, to produce an SVG document with comments inserted at the point where the grob is \dQuote{drawn}. } \usage{ grid.comment(comment, name = NULL, vp = NULL) commentGrob(comment, name = NULL, vp = NULL) } \arguments{ \item{comment}{ A character vector used to write out a comment. If this has a length greater than one, each element is assumed to be a line. } \item{name}{ A character identifier. } \item{vp}{ The viewport to which the grob belongs. } } \value{ A \code{comment.grob} object. } \author{ Simon Potter } \seealso{ \code{\link{grid.export}} } \keyword{ dplot } ���������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feGaussianBlur.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000002164�12164147373�015547� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feGaussianBlur} \alias{feGaussianBlur} \title{ Apply a Gaussian blur to an image. } \description{ This filter effect primitive performs a Gaussian blur on the input image. } \usage{ feGaussianBlur(input = NA, sd = 0, ...) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{sd}{ The value of \code{sd} can be a numeric vector with either one or two elements. If two numbers are provided, the first number represents a standard deviation value along the x-axis of the current coordinate system and the second value represents a standard deviation in Y. If one number is provided, then that value is used for both X and Y. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.gaussian.blur} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/grid.animate.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000003657�12207503335�015177� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grid.animate} \alias{grid.animate} \alias{animateGrob} \title{ Animate a grid grob } \description{ Creates an animated.grob object. Useful in conjunction with \code{grid.export}, to produce an SVG document with animated graphical elements. } \usage{ animateGrob(grob, ..., duration=1, rep=FALSE, revert=FALSE, begin=0, interpolate="linear", group=FALSE) grid.animate(path, ..., group=FALSE, redraw = FALSE, strict=FALSE, grep=FALSE, global=FALSE) } \arguments{ \item{grob}{ A grob to add animation to. } \item{path}{ A grob path specifying a drawn grob. } \item{\dots}{ Arguments of the grob to animate. } \item{duration}{ The duration in seconds of the animation. } \item{rep}{ The number of times the animation should repeat. \code{FALSE} means once, \code{TRUE} means indefinitely. } \item{revert}{ What should happen when (if) the animation ends; \code{TRUE} means revert to the first animated value, \code{FALSE} means finish on the last animated value. } \item{begin}{ When the animation should begin (seconds). } \item{interpolate}{ A character value describing how animation values are interpreted. One of \code{linear} or \code{discrete}. } \item{group}{ A logical indicating whether the animation values should be applied to the overall group element in SVG or to individual SVG elements.} \item{redraw}{ A logical value to indicate whether to redraw the grob. } \item{strict}{ A boolean indicating whether the \code{path} must be matched exactly. } \item{grep}{ Whether the \code{path} should be treated as a regular expression. } \item{global}{ A boolean indicating whether the function should affect just the first match of the \code{path}, or whether all matches should be affected. } } \value{ An animated.grob object. } \author{ Paul Murrell } \seealso{ \code{\link{grid.export}} } \keyword{ dplot } ���������������������������������������������������������������������������������gridSVG/man/filterInputs.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000006735�12164147372�015334� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{Filter Inputs} \alias{filterInputs} \title{ Identifies input for a filter effect primitive. } \description{ How to use and identify inputs for filter effect primitives. } \section{Filter Inputs}{ The value chosen for a filter effect primitive can be either one of six keywords or can be a string which matches a previous \code{result} attribute value within the same filter effect container. If no value is provided and this is the first filter effect primitive, then the input will be \code{SourceGraphic}. If no value is provided and this is a subsequent filter effect primitive, then this filter effect primitive will use the result from the previous filter primitive as its input. If the value for \code{result} appears multiple times within a given filter container, then a reference to that result will use the closest preceding filter primitive with the given value for the \code{result} results. Forward references to results are an error and will not draw. Definitions for the seven possible options: \itemize{ \item \code{SourceGraphic} This keyword represents the appearance of grobs before they are being filtered. For raster effects filter primitives, the grobs will be rasterized into an initially clear RGBA raster in image space. Pixels left untouched by the original graphic will be left clear. The image is specified to be rendered in linear RGBA pixels. The alpha channel of this image captures any anti-aliasing specified by SVG. (Since the raster is linear, the alpha channel of this image will represent the exact percent coverage of each pixel.) \item \code{SourceAlpha} This keyword represents the appearance of grobs before they are being filtered. \code{SourceAlpha} has all of the same rules as \code{SourceGraphic} except that only the alpha channel is used. The input image is an RGBA image consisting of implicitly black color values for the RGB channels, but whose alpha channel is the same as \code{SourceGraphic}. If this option is used, then some implementations might need to rasterize the graphics elements in order to extract the alpha channel. \item \code{BackgroundImage} This keyword represents an image snapshot of the canvas under the filter region at the time that the referring grob is being filtered. \item \code{BackgroundAlpha} Same as \code{BackgroundImage} except only the alpha channel is used. \item \code{FillPaint} This keyword represents the value of the \code{fill} property on the grob being filtered. The \code{FillPaint} image has conceptually infinite extent. Frequently this image is opaque everywhere, but it might not be if the "paint" itself has alpha, as in the case of a gradient or pattern which itself includes transparent or semi-transparent parts. \item \code{StrokePaint} This keyword represents the value of the \code{col} property on the grob being filtered. The \code{StrokePaint} image has conceptually infinite extent. Frequently this image is opaque everywhere, but it might not be if the "paint" itself has alpha, as in the case of a gradient or pattern which itself includes transparent or semi-transparent parts. \item The result of any filter effect operation. This is the name that has been given to the \code{result} argument of a filter primitive. } } \author{ Simon Potter } \references{ \url{http://www.w3.org/TR/SVG/filters.html#FilterPrimitiveInAttribute} } �����������������������������������gridSVG/man/grid.mask.Rd����������������������������������������������������������������������������0000654�0001762�0000144�00000004206�12164147372�014512� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grid.mask} \alias{grid.mask} \alias{maskGrob} \title{ Apply an opacity mask to a grid grob. } \description{ Creates a \code{masked.grob} object which is a normal grid grob, with an opacity mask applied to it. Used in conjunction with \code{registerMask}, to produce an SVG document containing graphical elements with masked content. } \usage{ grid.mask(path, mask = NULL, label = NULL, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) maskGrob(x, mask = NULL, label = NULL, group = TRUE) } \arguments{ \item{x}{ A grob to mask. } \item{path}{ A grob path specifying a drawn grob. } \item{mask}{ A \code{mask} object, provided by the \code{\link{mask}} function. Provides the definition of an opacity mask that will be applied to \code{x} or \code{path}. } \item{label}{ A label that is associated with a definition of an opacity mask. This is the label used to create an opacity mask definition with \code{registerMask}. } \item{group}{ A logical vector that indicates whether the opacity mask should be applied to the overall parent group for the relevant SVG element, or to individual SVG elements. } \item{redraw}{ A logical value to indicate whether to redraw the grob. } \item{strict}{ A boolean indicating whether the \code{path} must be matched exactly. } \item{grep}{ Whether the \code{path} should be treated as a regular expression. } \item{global}{ A boolean indicating whether the function should affect just the first match of the \code{path}, or whether all matches should be affected. } } \details{ If \code{label} is specified, uses a mask that has been supplied to \code{registerMask}. If \code{mask} is specified it will be used as the opacity mask applied to each grob. If both are specified, it will attempt to define the opacity mask with the given label, as well as applying the mask to the appropriate grobs. } \value{ A \code{masked.grob} object (for \code{maskGrob}). } \author{ Simon Potter } \seealso{ \code{\link{registerMask}}, \code{\link{mask}}, \code{\link{pushMask}}. } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/grid.patternFill.Rd���������������������������������������������������������������������0000654�0001762�0000144�00000004551�12164147372�016046� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{grid.patternFill} \alias{grid.patternFill} \alias{patternFillGrob} \title{ Associate a pattern fill with a grid grob } \description{ Creates a patternFilled.grob object which is a normal grid grob, with a pattern fill used in place of a regular fill. Used in conjunction with \code{registerPatternFill}, to produce an SVG document containing graphical elements with pattern fills. } \usage{ grid.patternFill(path, pattern = NULL, label = NULL, alpha = 1, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) patternFillGrob(x, pattern = NULL, label = NULL, alpha = 1, group = TRUE) } \arguments{ \item{x}{ A grob to add a pattern fill to. } \item{pattern}{ A \code{pattern} object, provided by the \code{pattern} function. Provides the definition of a pattern fill that will be applied to \code{x} or \code{path}. } \item{label}{ A label that is associated with a definition of a pattern fill. This is the label used to create a pattern fill definition with \code{\link{registerPatternFill}}. } \item{path}{ A grob path specifying a drawn grob. } \item{alpha}{ The alpha channel for transparency. A value between 0 and 1. } \item{group}{ A logical vector that indicates whether the pattern fill should be applied to the overall parent group for the relevant SVG element, or to individual SVG elements. } \item{redraw}{ A logical value to indicate whether to redraw the grob. } \item{strict}{ A boolean indicating whether the \code{path} must be matched exactly. } \item{grep}{ Whether the \code{path} should be treated as a regular expression. } \item{global}{ A boolean indicating whether the function should affect just the first match of the \code{path}, or whether all matches should be affected. } } \details{ If \code{label} is specified, uses a pattern that has been supplied to \code{\link{registerPatternFill}}. If \code{pattern} is specified it will be used as the fill pattern applied to each grob. If both are specified, it will attempt to define the pattern with the given label, as well as applying a pattern fill to the appropriate grobs. } \value{ A patternFilled.grob object (for \code{patternFillGrob}). } \author{ Simon Potter } \seealso{ \code{\link{registerPatternFill}} } �������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/feOffset.Rd�����������������������������������������������������������������������������0000654�0001762�0000144�00000002301�12164147372�014366� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feOffset} \alias{feOffset} \title{ Offset an input image relative to its current position. } \description{ This filter primitive offsets the input image relative to its current position in the image space by the specified vector. This is important for effects like drop shadows. } \usage{ feOffset(input = NA, dx = unit(0, "npc"), dy = unit(0, "npc"), default.units = "npc", ...) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{dx}{ The amount to offset \code{input} by along the x-axis. } \item{dy}{ The amount to offset \code{input} by along the y-axis. } \item{default.units}{ A string indicating the default units to use if \code{dx} or \code{dy} are only given as numeric vectors. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.offset} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feOffsetElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}}, \code{\link{fe}}. } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/gridSVG.newpage.Rd����������������������������������������������������������������������0000654�0001762�0000144�00000001505�12164147372�015564� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{gridSVG.newpage} \alias{gridSVG.newpage} \title{ Move to a New Page on a gridSVG Device } \description{ This function erases the current device or moves to a new page. In addition, it clears any definitions of referenced content defined by gridSVG. } \usage{ gridSVG.newpage(wipeRefs = TRUE, recording = TRUE) } \arguments{ \item{wipeRefs}{ A logical value that determines whether referenced content should be deleted. } \item{recording}{ A logical value to indicate whether the new-page operation should be saved onto the Grid display list. } } \details{ When creating a gridSVG image, it is possible to create referenced content. An example is pattern fills. This function should be used in order to remove the definitions of referenced content. } \value{ None. } \author{ Simon Potter }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/registerPatternFill.Rd������������������������������������������������������������������0000654�0001762�0000144�00000007643�12164147372�016634� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{Pattern Fills} \alias{pattern} \alias{registerPatternFill} \alias{registerPatternFillRef} \title{ Create a definition of a fill pattern. } \description{ A feature of SVG is that elements can be filled with a pattern that is defined somewhere in the document. The purpose of these functions is to create the definition of a fill pattern so that it can be referred to by grobs drawn by gridSVG. } \usage{ pattern(grob, x = unit(0, "npc"), y = unit(0, "npc"), width = unit(0.1, "npc"), height = unit(0.1, "npc"), default.units = "npc", just = "centre", hjust = NULL, vjust = NULL, dev.width = 7, dev.height = 7) registerPatternFill(label, pattern = NULL, ...) registerPatternFillRef(label, refLabel, pattern = NULL, ...) } \arguments{ \item{label}{ A character identifier for the definition. } \item{refLabel}{ A character identifier referring to an existing pattern definition that has been created by \code{registerPatternFill}. } \item{pattern}{ A \code{pattern} object created by \code{pattern}. } \item{grob}{ A grid grob or tree of grobs. } \item{x}{ A numeric vector or unit object specifying x-location. } \item{y}{ A numeric vector or unit object specifying y-location. } \item{width}{ A numeric vector or unit object specifying width. } \item{height}{ A numeric vector or unit object specifying height. } \item{just}{ The justification of the pattern relative to its (x, y) location. If there are two values, the first value specifies horizontal justification and the second value specifies vertical justification. Possible string values are: \code{"left"}, \code{"right"}, \code{"centre"}, \code{"center"}, \code{"bottom"}, and \code{"top"}. For numeric values, 0 means left alignment and 1 means right alignment. } \item{hjust}{ A numeric vector specifying horizontal justification. If specified, overrides the \code{just} setting. } \item{vjust}{ A numeric vector specifying vertical justification. If specified, overrides the \code{just} setting. } \item{default.units}{ A string indicating the default units to use if \code{x}, \code{y}, \code{width}, or \code{height} are only given as numeric vectors. } \item{dev.width, dev.height}{ The width and height of the fill pattern's graphics region in inches. The default values are \code{7}. } \item{\dots}{ Arguments to be be passed onto \code{pattern}. } } \details{ The pattern fill is drawn off-screen on a new device. The size of this device is determined by \code{dev.width} and \code{dev.height}. The \code{grob} and \code{vp} that have been given are then drawn within this device. This is relevant for determining what the pattern definition looks like. The previous arguments do not determine the size of the pattern as it is being used (i.e. how big each "tile" is). This is set by the \code{x}, \code{y}, \code{width}, \code{height} arguments. The values of these arguments are relative to the current viewport as this function is being called. From then on, the definition of the location and size of the pattern are fixed. In summary, the \code{pattern} function defines what a pattern looks like, along with how big each tile is (and its position). To avoid repetition of pattern definitions, use \code{registerPatternFillRef} to reuse an existing pattern definition (referred to by \code{refLabel}). This means that a pattern "tile" can now be reused, repositioned and rescaled without having to describe how it needs to be drawn. In general use, first create a pattern object, then either give a label to the definition (for grobs to use), or alternatively simply pass on the pattern object to \code{\link{grid.patternFill}}. } \value{ A \code{pattern} object for \code{pattern}, none otherwise. } \author{ Simon Potter } \seealso{ \code{\link{grid.patternFill}} } ���������������������������������������������������������������������������������������������gridSVG/man/feSpecularLighting.Rd�������������������������������������������������������������������0000654�0001762�0000144�00000006463�12164147372�016421� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{feSpecularLighting} \alias{feSpecularLighting} \title{ Light an image using the alpha channel as a bump map. } \description{ This filter primitive lights a source graphic using the alpha channel as a bump map. The resulting image is an RGBA image based on the light colour. The lighting calculation follows the standard specular component of the Phong lighting model. The resulting image depends on the light colour, light position and surface geometry of the input bump map. The result of the lighting calculation is added. The filter primitive assumes that the viewer is at infinity in the z direction (i.e., the unit vector in the eye direction is (0,0,1) everywhere). This filter primitive produces an image which contains the specular reflection part of the lighting calculation. Such a map is intended to be combined with a texture using the add term of the arithmetic method in \code{\link{feComposite}}. Multiple light sources can be simulated by adding several of these light maps before applying it to the texture image. } \usage{ feSpecularLighting(input = NA, surfaceScale = 1, specularConstant = 1, specularExponent = 1, kernelUnitLength = NA, col = "white", lightSource = NULL, ...) } \arguments{ \item{input}{ Identifies an input for this filter primtive. See \code{\link{filterInputs}}. } \item{surfaceScale}{ Scale applied to the input alpha surface. } \item{specularConstant}{ \code{kd} in the Phong lighting model. Must be non-negative. } \item{specularExponent}{ Numeric exponent for specular term, larger is more "shiny". Range [1,128]. } \item{kernelUnitLength}{ The first number is the \code{dx} value. The second number is the \code{dy} value. If the \code{dy} value is not specified, it defaults to the same value as \code{dx}. Indicates the intended distance in current filter units (i.e., units as determined by the value of parent filter container's \code{primitiveUnits}) for \code{dx} and \code{dy}, respectively, in the surface normal calculation formulas. By specifying value(s) for \code{kernelUnitLength}, the kernel becomes defined in a scalable, abstract coordinate system. If \code{kernelUnitLength} is not specified, the \code{dx} and \code{dy} values should represent very small deltas relative to a given (x,y) position, which might be implemented in some cases as one pixel in the intermediate image offscreen bitmap, which is a pixel-based coordinate system, and thus potentially not scalable. } \item{col}{ The colour to apply to the light from \code{lightSource}. } \item{lightSource}{ A light source object, produced by one of \code{\link{feDistantLight}}, \code{\link{fePointLight}}, or \code{\link{feSpotLight}}. } \item{\dots}{ Further arguments to be passed onto \code{\link{fe}}. } } \details{ For more information about this primitive, consult the reference to the SVG specification. } \value{ An \code{fe.specular.lighting} object. } \references{ \url{http://www.w3.org/TR/SVG/filters.html#feSpecularLightingElement} } \author{ Simon Potter } \seealso{ \code{\link{filterEffect}} \code{\link{fe}}, \code{\link{feDistantLight}}, \code{\link{fePointLight}}, \code{\link{feSpotLight}}. } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/man/garnish.Rd������������������������������������������������������������������������������0000654�0001762�0000144�00000002171�12164147372�014265� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{garnish} \alias{garnish} %- Also NEED an '\alias' for EACH other topic documented here. \title{ %% ~~function to do ... ~~ Convert animation specifications to SVG elements. } \description{ %% ~~ A concise (1-5 lines) description of what the function does. ~~ This function is used to generate a list of SVG attributes based on information on a grob. It is generic so new grob classes can write their own methods. } \usage{ garnish(x, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A grob. %% ~~Describe \code{x} here~~ } \item{...}{ For future use. %% ~~Describe \code{dev} here~~ } } \details{ %% ~~ If necessary, more details than the description above ~~ This function is not called directly by the user. It is exposed so that new grob classes can easily write their own methods which call existing methods for standard grobs. } \author{ %% ~~who you are~~ Paul Murrell } %% ~Make other sections like Warning with \section{Warning }{....} ~ % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ dplot } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/DESCRIPTION���������������������������������������������������������������������������������0000654�0001762�0000144�00000001603�13651737532�013302� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Package: gridSVG Title: Export 'grid' Graphics as SVG Version: 1.7-2 Authors@R: c(person("Paul", "Murrell", role = c("cre", "aut"), email = "paul@stat.auckland.ac.nz"), person("Simon", "Potter", role = "aut", email = "simon@sjp.co.nz")) Description: Functions to export graphics drawn with package grid to SVG format. Additional functions provide access to SVG features that are not available in standard R graphics, such as hyperlinks, animation, filters, masks, clipping paths, and gradient and pattern fills. Imports: grDevices, graphics, utils, methods, grid, jsonlite, XML Suggests: lattice License: GPL NeedsCompilation: no Packaged: 2020-04-27 22:14:48 UTC; pmur002 Author: Paul Murrell [cre, aut], Simon Potter [aut] Maintainer: Paul Murrell Repository: CRAN Date/Publication: 2020-04-28 05:30:02 UTC �����������������������������������������������������������������������������������������������������������������������������gridSVG/build/��������������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�13651654530�012666� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/build/vignette.rds��������������������������������������������������������������������������0000644�0001762�0000144�00000000357�13651654530�015232� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‹������…‘A‚0E EˆQã=8Ñ…£Æ¸­¶˜&P 4Av^\qÐ)ŠÑ¸è´ÿ¼þIw>!Ä&ԥĦp¤S(.¬q#ˆC<؇LÉ”i™©p¥J4'⬅*ä^&RWoà˜K¾ÞÎVäµ Cî@Ðì#àwŠ¿§x5ÚÕoã 5úÆämG1} ž(òeÿÓwl(‚{Š¥¢À¦‹¦3“‰0l¤n]F3 y, x >= y, x %~~% y, x %=~% y, x %==% y, x %prop% y, bolditalic(x + plain(y + italic(z + bold(k)))), , # space symbol("m") + symbol("\042"), list(x, y, z), 1*...*n, 1*cdots*n, 1*ldots*n, x %subset% y, x %subseteq% y, x %notsubset% y, x %supset% y, x %supseteq% y, x %in% y, x %notin% y), "testml-1.svg", cex <- c(1, 1.5, .5, rep(1, 100))) test(expression( hat(x), hat(xyz), tilde(x), dot(x), ring(x), bar(x), widehat(xyz), widetilde(xyz), x %<->% y, x %->% y, x %<-% y, x %up% y, x %down% y, x %<=>% y, x %=>% y, x %<=% y, x %dblup% y, x %dbldown% y, alpha - omega, Alpha - Omega, theta1*phi1*sigma1*omega1, Upsilon1, aleph, infinity, partialdiff, nabla, 32*degree, 60*minute, 30*second, displaystyle(sum(x[i], i==1, n)), textstyle(sum(x[i], i==1, n)), textstyle(x[i]), scriptstyle(x[i]), scriptscriptstyle(x[i]), underline(xyz), x ~~ y, x + phantom(0) + y, x + over(1, phantom(0)), frac(x, y), over(x, y), atop(x, y), ), "testml-2.svg") test(expression( sum(x[i], i==1, n), prod(plain(P)(X==x), x), integral(f(x)*dx, a, b), union(A[i], i==1, n), intersect(A[i], i==1, n), lim(f(x), x %->% 0), min(g(x), x > 0), inf(S), sup(S), x^y + z, x^(y + z), x^{y + z}, group("(", list(a, b), "]"), bgroup("(", atop(x, y), ")"), group(lceil, x, rceil), ), "testml-3.svg") �������������������������������������������������������������������gridSVG/tests/testprefix.R��������������������������������������������������������������������������0000654�0001762�0000144�00000000440�12215442556�015246� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) pdf(file = NULL) pushViewport(viewport()) grid.rect() grid.circle(name = "mycircle") grid.text("hello, world!") popViewport() # All IDs should now be exported with the prefix "TESTPREFIX" grid.export("test-prefixes.svg", prefix = "TESTPREFIX") dev.off() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testball.R����������������������������������������������������������������������������0000654�0001762�0000144�00000004357�12215442555�014675� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(lattice) library(gridSVG) postscript(width=8, height=6, paper="special") # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) y <- 1:4 x <- 1:4 g <- factor(c("Earth", "Moon", "Jupiter", "Mars")) n <- 30 d <- 20 # metres k <- c(9.8, 1.6, 24.8, 3.7) # gravities times <- 2 * sqrt(d/k) # (twice) the time taken to fall d metres cx <- unit(rep(0.5, 2*n - 1), "npc") dy <- 10*seq(0, 2, length=n)^2 ecy <- unit(40 - c(dy, rev(dy)[-1]), "native") ballpanel <- function(x, y, subscripts) { pushViewport(viewport(yscale=c(-10, 50))) grid.rect(y=unit(0, "npc"), height=unit(10, "native"), just="bottom", gp=gpar(fill="grey")) duration <- switch(subscripts, times[1], times[2], times[3], times[4]) col <- switch(subscripts, "blue", "grey", "brown", "red") grid.circle(name=col, x=cx[1], y=ecy[1], # r=unit(2, "mm"), r=unit(1, "native"), gp=gpar(col="black", fill=col)) grid.animate(col, x=cx, y=ecy, duration=duration, rep=TRUE) if (subscripts == 1) { grid.text("20 metres", x=unit(-1, "lines"), y=unit(20, "native"), just="bottom", rot=270) grid.lines(x=unit(-1, "lines"), y=unit.c(unit(0, "native"), unit(20, "native") - unit(0.5, "strwidth", "40 metres") - unit(2, "mm"))) grid.lines(x=unit(c(-.75, -1.25), "lines"), y=unit(0, "native")) grid.lines(x=unit(-1, "lines"), y=unit.c(unit(40, "native"), unit(20, "native") + unit(0.5, "strwidth", "40 metres") + unit(2, "mm"))) grid.lines(x=unit(c(-.75, -1.25), "lines"), y=unit(40, "native")) } popViewport() } print(xyplot(y ~ x | g, subscripts=TRUE, layout=c(4, 1), xlab=NULL, ylab=NULL, panel=ballpanel, scales=list(draw=FALSE)), position=c(0.1, 0.1, 0.9, 0.9), newpage=FALSE) popViewport() grid.export("ball.svg") dev.off() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testelement.R�������������������������������������������������������������������������0000654�0001762�0000144�00000001150�12215442555�015400� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) dev.new(width=6, height=6) grid.element("test") grid.element("testParent", children = gList(commentGrob("This is a child comment"), elementGrob("firstChild"), rectGrob(), elementGrob("thirdChild", attrs = list(anAttrib = "value")))) # Create a 'title' element with descriptive text grid.element("title", children = gList( textNodeGrob("A gridSVG image with customised SVG content"))) grid.export("element-test.svg") dev.off() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testattrib.R��������������������������������������������������������������������������0000654�0001762�0000144�00000002674�12410700007�015232� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ library(grid) library(gridSVG) # A very simple test dev.new(width=6, height=6) # Test script chunk grid.script(file="test.script") # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) grid.circle(r=0.1, gp=gpar(fill="red"), name="circgrob") # Test setting SVG attribute grid.garnish("circgrob", onclick="circle_click(evt)") popViewport() grid.export() dev.off() # Single attribute value on single grob grid.newpage() grid.circle(r=.1, gp=gpar(fill="black"), name="c") grid.garnish("c", onmousedown="alert('ouch')") grid.export("testattrcircle.svg") # Multiple attribute values on single grob grid.newpage() pushViewport(viewport()) grid.points(1:3/4, 1:3/4, pch=c(1, 10, 16), name="p") grid.garnish("p", onmousedown=c("alert('pch=1')", "alert('pch=10')", "alert('pch=16')"), group=FALSE) grid.export("testattrpoints.svg") # Multiple garnishes (one with single value, one with multiple values) grid.newpage() grid.circle(x=1:3/4, r=.1, gp=gpar(fill="black"), name="c") grid.garnish("c", onmouseover=c("alert('c1')", "alert('c2')", "alert('c3')"), group=FALSE) grid.garnish("c", onmousedown="alert('click me!')") grid.export("testmultattr.svg") # Sneak an SVG attribute through via gpar() grid.newpage() grid.text("test", gp=gpar("text-decoration"="line-through"), name="tt") grid.export("testsvgattr.svg") ��������������������������������������������������������������������gridSVG/tests/testplot.R����������������������������������������������������������������������������0000654�0001762�0000144�00000000374�12215442556�014735� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ library(grid) library(gridSVG) dev.new(width=6, height=6) grid.rect(gp=gpar(col="black", fill=NA)) set.seed(1000) grid.multipanel(vp=viewport(w=.7, h=.7, gp=gpar(col="black", fill=NA)), newpage=FALSE) grid.export("plot.svg") dev.off() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testpolyline.R������������������������������������������������������������������������0000654�0001762�0000144�00000000371�12215442556�015607� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ library(grid) require(gridSVG) grid.polyline(x=outer(c(0, .5, 1, .5), 5:1/5), y=outer(c(.5, 1, .5, 0), 5:1/5), id.lengths=rep(4, 5), gp=gpar(col=1:5, lwd=3)) grid.export("polyline.svg") �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testmask.R����������������������������������������������������������������������������0000654�0001762�0000144�00000003134�12215442555�014706� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) pdf(file = NULL) # Create the definition of an opacity mask, in this case # it will just be a circle with a gradient fill. rg <- radialGradient(col = c("white", "black")) m <- mask(gradientFillGrob(circleGrob(), gradient = rg)) # Register the opacity mask so that we can refer to it and apply it. registerMask("circleMask", m) # Creating a simple plot that will be masked to the circle sp <- gTree(name = "simplePlot", children = gList(xaxisGrob(), yaxisGrob(), rectGrob(gp = gpar(fill = "grey"))), vp = plotViewport()) grid.draw(sp) # Now lets mask it grid.mask("simplePlot", label = "circleMask") # Alternatively we could also do this which avoids the need to call # 'registerMask' explicitly # grid.mask("simplePlot", m) grid.export("mask-simpleplot.svg") dev.off() # Now lets recreate the previous example using 'pushMask' pdf(file = NULL) # Clear previous mask reference gridSVG.newpage() # Create the definition of an opacity mask, in this case # it will just be a circle with a gradient fill. rg <- radialGradient(col = c("white", "black")) m <- mask(gradientFillGrob(circleGrob(), gradient = rg)) # Create a new masking context for this viewport pushMask(m) # Creating a simple plot that will be masked to our current masking context sp <- gTree(name = "simplePlot", children = gList(xaxisGrob(), yaxisGrob(), rectGrob(gp = gpar(fill = "grey"))), vp = plotViewport()) grid.draw(sp) # End the masking context popMask() grid.export("pushmask-simpleplot.svg") dev.off() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testpendulum.R������������������������������������������������������������������������0000654�0001762�0000144�00000004435�12215442555�015611� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) dev.new(width=6, height=6) grid.newpage() # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) n <- 30 L <- 50 #mm A <- 20 #mm t <- seq(0, 2*pi, length=n) x <- A*cos(t) v <- -A*sin(t) theta <- atan(x/L) y <- L*cos(theta) pushViewport(viewport(layout=grid.layout(4, 1, widths=unit(2.2*A, "null"), heights=unit(c(1, L + 10, 2.2*A, 2), c("lines", "null", "null", "lines")), respect=TRUE))) pushViewport(viewport(layout.pos.row=2, xscale=A * c(-1.1, 1.1), yscale=c(0, L + 10))) grid.rect() grid.lines(name="chain", x=unit(c(0.5, x[1]), c("npc", "native")), y=unit(1, "npc") - unit(c(0, abs(y)[1]), c("npc", "native"))) grid.animate("chain", x=animUnit(unit(c(rep(0.5, n), x), c(rep(c("npc", "native"), each=n))), timeid=rep(1:n, 2)), y=animUnit(unit.c(unit(rep(1, n), "npc"), unit(1, "npc") - unit(y, "native")), timeid=rep(1:n, 2)), duration=5, rep=TRUE) grid.circle(name="weight", x=unit(x[1], "native"), y=unit(1, "npc") - unit(y[1], "native"), r=unit(1, "mm"), gp=gpar(fill="black")) grid.animate("weight", x=unit(x, "native"), y=unit(1, "npc") - unit(abs(y), "native"), duration=5, rep=TRUE) popViewport() pushViewport(viewport(layout.pos.row=3, xscale=A * c(-1.1, 1.1), yscale=A * c(-1.1, 1.1))) grid.rect() grid.lines(x=unit(c(0, 0), "native"), gp=gpar(lty="dashed", col="grey")) grid.lines(y=unit(c(0, 0), "native"), gp=gpar(lty="dashed", col="grey")) grid.text("Displacement", y=unit(-1, "lines")) grid.text("Velocity", x=unit(-1, "lines"), rot=90) grid.circle(name="key", x=unit(x[1], "native"), y=unit(v[1], "native"), r=unit(1, "mm"), gp=gpar(fill="black")) grid.animate("key", x=unit(x, "native"), y=unit(v, "native"), duration=5, rep=TRUE) popViewport(2) popViewport() grid.export("pendulum.svg") dev.off() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testpath.R����������������������������������������������������������������������������0000654�0001762�0000144�00000000115�12215442555�014703� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ library(grid) require(gridSVG) example(grid.path) grid.export("path.svg") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testanimate.R�������������������������������������������������������������������������0000654�0001762�0000144�00000041037�12215442555�015375� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) # animValues animValue(letters[1:4]) animValue(letters[1:4], timeid=rep(1:2, 2)) animValue(letters[1:4], id=rep(1:2, 2)) as.animValue(letters[1:4]) as.animValue(matrix(letters[1:12], ncol=4)) as.animValue(matrix(letters[1:12], ncol=4), multVal=TRUE) as.animValue(list(letters[1:3], letters[4:6])) as.animValue(list(letters[1:3], letters[4:6]), multVal=TRUE) # animUnits animUnit(unit(1:4, "npc")) animUnit(unit(1:4, "npc"), timeid=rep(1:2, 2)) animUnit(unit(1:4, "npc"), id=rep(1:2, 2)) as.animUnit(1:4, "npc") as.animUnit(unit(1:4, "npc")) as.animUnit(matrix(1:12, ncol=4), "in") as.animUnit(matrix(1:12, ncol=4), "in", multVal=TRUE) as.animUnit(list(unit(1:3, "npc"), unit(4:6, "in"))) as.animUnit(list(unit(1:3, "npc"), unit(4:6, "in")), multVal=TRUE) # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) grid.rect(name="rect", x=0, y=0, just=c("left", "bottom")) grid.animate("rect", x=unit(0:30, "mm"), duration=5, rep=TRUE) grid.circle(name="circle", x=unit(0.5, "npc") + unit(0, "mm"), r=unit(10, "mm")) grid.animate("circle", x=unit(0.5, "npc") + unit(0:30, "mm"), duration=5, rep=TRUE) grid.text("hello", name="text1", x=unit(0.3, "npc") + unit(0, "mm")) grid.animate("text1", x=unit(0.3, "npc") + unit(0:30, "mm"), duration=5, rep=TRUE) grid.text("hello", name="text2", x=unit(0.3, "npc") + unit(0, "mm"), y=unit(0.3, "npc") + unit(0, "mm")) grid.animate("text2", x=unit(0.3, "npc") + unit(0:30, "mm"), y=unit(0.3, "npc") + unit(0:30, "mm"), duration=5, rep=TRUE) popViewport() grid.export("animate.svg") # Animating rectangles # There are numerous possibilities to consider: # The animation values could be numeric, unit, matrix, or list # The original values could spec a single rect or multiple rects # We could animate only one of x/y/width/height or several of them at once # Simple case # (single rect, anim only x, anim values are just numeric) grid.newpage() grid.text("One rectangle moves across", y=unit(1, "lines")) grid.rect() grid.rect(x=.2, y=.2, width=.1, height=.1, name="rect") grid.animate("rect", x=c(.2, .8), duration=3) grid.export("anim-rect-simple.svg") # Complex case # (multiple rects, anim x/y/width/height, anim values are matrices and lists) grid.newpage() grid.text("Three rectangles: one goes up, one goes across, and one goes diagonal and gets smaller", y=unit(1, "lines")) grid.rect() grid.rect(x=rep(.2, 3), y=.2, width=.1, height=.1, name="rect") grid.animate("rect", x=cbind(c(.2, .8), c(.2, .8), .2), y=cbind(.2, c(.2, .8), c(.2, .8)), width=list(unit(.1, "npc"), unit(c(.1, 1), c("npc", "cm")), unit(.1, "npc")), height=list(unit(.1, "npc"), unit(c(.1, 1), c("npc", "cm")), unit(.1, "npc")), duration=3) grid.export("anim-rect-complex.svg") # Animating circles # Complex case # (multiple circles, anim x/y/width/height, anim values are matrices and lists) grid.newpage() grid.text("Three circles: one goes up, one goes across, and one goes diagonal and gets smaller", y=unit(1, "lines")) grid.rect() grid.circle(x=rep(.2, 3), y=.2, r=.1, name="circle") grid.animate("circle", x=cbind(c(.2, .8), c(.2, .8), .2), y=cbind(.2, c(.2, .8), c(.2, .8)), r=list(unit(.1, "npc"), unit(c(.1, 1), c("npc", "cm")), unit(.1, "npc")), duration=3) grid.export("anim-circle-complex.svg") # Animating points # Complex case # (multiple circles, anim x/y/width/height, anim values are matrices and lists) grid.newpage() grid.text("Three points: one goes up, one goes across, and one goes diagonal and gets larger", y=unit(1, "lines")) grid.rect() pushViewport(viewport()) grid.points(x=rep(.2, 3), y=rep(.2, 3), size=unit(2, "mm"), name="points") grid.animate("points", x=cbind(c(.2, .8), c(.2, .8), .2), y=cbind(.2, c(.2, .8), c(.2, .8)), size=list(unit(2, "mm"), unit(c(2, .1), c("mm", "npc")), unit(2, "mm")), duration=3) grid.export("anim-points-complex.svg") # Animating text # Complex case # (multiple text, anim x/y/width/height, anim values are matrices and lists) grid.newpage() grid.text("Three letters: one goes up, one goes across, and one goes diagonal", y=unit(1, "lines")) grid.rect() grid.text(letters[1:3], x=rep(.2, 3), y=.2, name="text") grid.animate("text", x=cbind(c(.2, .8), c(.2, .8), .2), y=cbind(.2, c(.2, .8), c(.2, .8)), duration=3) grid.export("anim-text-complex.svg") # Animating lines # Simple case # (line only has two points, animation only has two points, only animate x) grid.newpage() grid.text("45 degree line becomes vertical", y=unit(1, "lines")) grid.rect() grid.lines(c(.1, .9), c(.1, .9), name="lines") grid.animate("lines", x=cbind(c(.1, .9), c(.5, .5)), duration=3) grid.export("anim-lines-simple.svg") # Complex case # (line has many points, animation has three points, only animate y) x <- seq(-pi, pi, length.out=100) y <- sin(x) grid.newpage() grid.text("Sine curve becomes flat then inverts (on y)", y=unit(1, "lines")) grid.rect() pushViewport(dataViewport(x, y)) grid.lines(x, y, default.units="native", name="lines") grid.animate("lines", y=cbind(y, 0, -y), duration=3) grid.export("anim-lines-complex.svg") # Animating polylines # Simple case # (line only has two points, animation only has two points, only animate x) grid.newpage() grid.text("Two parallel lines slide to the right", y=unit(1, "lines")) grid.rect() grid.polyline(c(.1, .2, .3, .4), c(.1, .9, .1, .9), id=rep(1:2, each=2), name="polyline") grid.animate("polyline", x=animUnit(unit(c(.1, .2, .3, .4, .5, .6, .7, .8), unit="npc"), id=rep(rep(1:2, each=2), 2), timeid=rep(1:2, each=4)), duration=3) grid.export("anim-polyline-simple.svg") # Complex case # (line only has many points, animation only has many points, animate x and y) grid.newpage() grid.text("Two random walks", y=unit(1, "lines")) grid.rect() n <- 50 x <- 1:n set.seed(1000) y1 <- runif(n, .6, .8) y2 <- runif(n, .2, .4) pushViewport(dataViewport(x, yscale=0:1)) grid.polyline(rep(x[1:2], 2), c(y1[1:2], y2[1:2]), default.units="native", id=rep(1:2, each=2), name="polyline") grid.animate("polyline", x=animUnit(unit(rep(x[unlist(lapply(2:n, seq))], 2), "native"), id=rep(1:2, each=sum(2:n)), timeid=rep(1:(n - 1), 2:n)), y=animUnit(unit(c(y1[unlist(lapply(2:n, seq))], y2[unlist(lapply(2:n, seq))]), "native"), id=rep(1:2, each=sum(2:n)), timeid=rep(1:(n - 1), 2:n)), duration=10) grid.export("anim-polyline-complex.svg") # Animating segments # Simple case # (single segment, animation only has two values, only animate x0) grid.newpage() grid.text("45 degree line becomes vertical (on right)", y=unit(1, "lines")) grid.rect() grid.segments(.1, .1, .9, .9, name="segments") grid.animate("segments", x0=c(.1, .9), duration=3) grid.export("anim-segments-simple.svg") # Complex case # (multiple segments, animation has three values, animate x0 and y0) grid.newpage() grid.text("crossed lines swing out to vertical then shorten", y=unit(1, "lines")) grid.rect() grid.segments(c(.1, .9), .1, c(.9, .1), .9, name="segments") grid.animate("segments", x0=cbind(c(.1, .9, .9), c(.9, .1, .1)), y0=c(.1, .1, .5), duration=3) grid.export("anim-segments-complex.svg") # Animating polygons # Simple case # (polygon only has three points, # animation only has two points, only animate x) grid.newpage() grid.text("Single polygon slides to the right", y=unit(1, "lines")) grid.rect() grid.polygon(c(.1, .2, .3), c(.4, .6, .4), name="polygon") grid.animate("polygon", x=animUnit(unit(c(.1, .2, .3, .7, .8, .9), unit="npc"), timeid=rep(1:2, each=3)), duration=3) grid.export("anim-polygon-simple.svg") # Complex case # (two polygons, animation has many points, animate x and y) grid.newpage() grid.text("Two polygons shrink and grow (flipped) then revert", y=unit(1, "lines")) grid.rect() grid.polygon(c(.2, .3, .4, .6, .7, .8), c(.4, .6, .4, .6, .4, .6), id=rep(1:2, each=3), name="polygon") grid.animate("polygon", x=animUnit(unit(c(.2, .3, .4, .4, .3, .2, .2, .3, .4, .6, .7, .8, .8, .7, .6, .6, .7, .8), "npc"), id=rep(1:2, each=9), timeid=rep(rep(1:3, each=3), 2)), y=animUnit(unit(c(.4, .6, .4, .6, .4, .6, .4, .6, .4, .6, .4, .6, .4, .6, .4, .6, .4, .6), "npc"), id=rep(1:2, each=9), timeid=rep(rep(1:3, each=3), 2)), duration=5) grid.export("anim-polygon-complex.svg") # Animating paths # Simple case # (path has one sub-path, # animation only has two points, only animate x) grid.newpage() grid.text("Single simple path (triangle) slides to the right", y=unit(1, "lines")) grid.rect() grid.path(c(.1, .2, .3), c(.4, .6, .4), gp=gpar(fill="black"), name="path") grid.animate("path", x=animUnit(unit(c(.1, .2, .3, .7, .8, .9), unit="npc"), timeid=rep(1:2, each=3)), duration=3) grid.export("anim-path-simple.svg") # Complex case # (two polygons, animation has many points, animate x and y) grid.newpage() grid.text("Single complex path transmogrifies as it slides to the right", y=unit(1, "lines")) grid.rect() grid.path(c(.1, .1, .4, .4, .2, .2, .3, .3), c(.2, .8, .8, .2, .4, .6, .6, .4), id=rep(1:2, each=4), rule="evenodd", gp=gpar(fill="black"), name="path") grid.animate("path", x=animUnit(unit(c(.1, .1, .4, .4, .2, .2, .3, .3, .35, .35, .65, .65, .45, .45, .55, .55, .6, .6, .9, .9, .7, .7, .8, .8), unit="npc"), id=rep(rep(1:2, each=4), 3), timeid=rep(1:3, each=8)), y=animUnit(unit(c(.2, .8, .8, .2, .4, .6, .6, .4, .4, .6, .6, .4, .2, .8, .8, .2, .2, .8, .8, .2, .4, .6, .6, .4), unit="npc"), id=rep(rep(1:2, each=4), 3), timeid=rep(1:3, each=8)), duration=3) grid.export("anim-path-complex.svg") # Simple case # (single raster, anim only x, anim values are just numeric) grid.newpage() grid.text("One raster moves across", y=unit(1, "lines")) grid.rect() grid.raster(1:10/11, x=.2, y=.2, width=.1, height=.1, name="raster") grid.animate("raster", x=c(.2, .8), duration=3) grid.export("anim-raster-simple.svg") # Complex case # (multiple rasters, anim x/y/width/height, anim values are matrices and lists) grid.newpage() grid.text("Three rasters: one goes up, one goes across, and one goes diagonal and gets smaller", y=unit(1, "lines")) grid.rect() grid.raster(1:10/11, x=rep(.2, 3), y=.2, width=.1, height=.1, name="raster") grid.animate("raster", x=cbind(c(.2, .8), c(.2, .8), .2), y=cbind(.2, c(.2, .8), c(.2, .8)), width=list(unit(.1, "npc"), unit(c(.1, 1), c("npc", "cm")), unit(.1, "npc")), height=list(unit(.1, "npc"), unit(c(.1, 1), c("npc", "cm")), unit(.1, "npc")), duration=3) grid.export("anim-raster-complex.svg") # Simple case # (single xspline, anim only x, anim values are just numeric) grid.newpage() grid.text("Two xsplines move across", y=unit(1, "lines")) grid.rect() grid.xspline(c(.3, .1, .5, .3), c(.2, .5, .5, .2), open=TRUE, shape=1, name="xspline-1") grid.xspline(c(.3, .1, .5), c(.6, .9, .9), open=FALSE, shape=1, gp=gpar(fill="grey"), name="xspline-2") grid.animate("xspline-1", x=animUnit(unit(c(.3, .1, .5, .3, .7, .5, .9, .7), "npc"), timeid=rep(1:2, each=4)), duration=3) grid.animate("xspline-2", x=cbind(c(.3, .1, .5), c(.7, .5, .9)), duration=3) grid.export("anim-xspline-simple.svg") # Complex case # (four xsplines, animation has many points, animate x and y) grid.newpage() grid.text("Four xsplines shrink and grow (flipped) then revert", y=unit(1, "lines")) grid.rect() grid.xspline(c(.3, .1, .5, .3, .7, .5, .9, .7), c(.2, .5, .5, .2, .2, .5, .5, .2), shape=1, id=rep(1:2, each=4), name="xspline-open") grid.xspline(c(.3, .1, .5, .7, .5, .9), c(.6, .9, .9, .6, .9, .9), open=FALSE, shape=1, gp=gpar(fill="grey"), id=rep(1:2, each=3), name="xspline-closed") grid.animate("xspline-open", x=animUnit(unit(c(.3, .1, .5, .3, .5, .3, .7, .5, .7, .5, .9, .7, .7, .5, .9, .7, .5, .3, .7, .5, .3, .1, .5, .3), "npc"), id=rep(1:2, each=12), timeid=rep(rep(1:3, each=4), 2)), y=animUnit(unit(c(.2, .5, .5, .2, .5, .2, .2, .5, .2, .5, .5, .2, .2, .5, .5, .2, .5, .2, .2, .5, .2, .5, .5, .2), "npc"), id=rep(1:2, each=12), timeid=rep(rep(1:3, each=4), 2)), duration=5) grid.animate("xspline-closed", x=animUnit(unit(c(.3, .1, .5, .5, .3, .7, .7, .5, .9, .7, .5, .9, .5, .3, .7, .3, .1, .5), "npc"), id=rep(1:2, each=9), timeid=rep(rep(1:3, each=3), 2)), y=animUnit(unit(c(.6, .9, .9, .9, .6, .6, .6, .9, .9, .6, .9, .9, .9, .6, .6, .6, .9, .9), "npc"), id=rep(1:2, each=9), timeid=rep(rep(1:3, each=3), 2)), duration=5) grid.export("anim-xspline-complex.svg") ############################################ # Multiple animations on same grob grid.newpage() grid.rect(x=.1, y=.1, width=.1, height=.1, name="r") grid.animate("r", x=c(.1, .9)) grid.animate("r", x=c(.9, .1), begin=3) grid.export("anim-rect-multi.svg") # Animate group grid.newpage() grid.rect(x=.1, y=.1, width=.1, height=.1, name="r") grid.animate("r", visibility=c("visible", "hidden"), group=TRUE) grid.export("anim-group.svg") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testcomment.R�������������������������������������������������������������������������0000654�0001762�0000144�00000000260�12215442555�015412� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) dev.new(width=6, height=6) grid.rect(name = "mainrect") grid.comment("This is a comment", "mainrect") grid.export("comment-test.svg") dev.off() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testvp.R������������������������������������������������������������������������������0000654�0001762�0000144�00000003445�12215442556�014406� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Test that 'vp' slots [viewports (vpTrees, vpLists, vpStacks) and vpPaths] # are being recorded correctly library(grid) library(gridSVG) grid.newpage() vp <- viewport(width=.5, height=.5, gp=gpar(fill="grey")) grid.rect(vp=vp) grid.export("grob-viewport.svg") grid.newpage() vp <- vpStack(viewport(width=.5, height=.5, gp=gpar(fill="grey")), viewport(gp=gpar(col="red"))) grid.rect(vp=vp) grid.export("grob-vpStack.svg") grid.newpage() vp <- vpList(viewport(width=.5, height=.5, gp=gpar(fill="grey")), viewport(gp=gpar(col="red"))) grid.rect(vp=vp) grid.export("grob-vpList.svg") grid.newpage() vp <- vpTree(viewport(width=.5, height=.5), vpList(viewport(width=.5, height=.5, gp=gpar(fill="grey")), viewport(gp=gpar(col="red")))) grid.rect(vp=vp) grid.export("grob-vpTree.svg") grid.newpage() vp <- vpTree(viewport(width=.5, height=.5, name="p"), vpList(viewport(width=.5, height=.5, gp=gpar(fill="grey"), name="c1"), viewport(gp=gpar(col="red"), name="c2"))) pushViewport(vp) upViewport(0) grid.rect(vp="p::c1") grid.export("grob-vpPath.svg") grid.newpage() vp <- viewport(width=.5, height=.5, gp=gpar(fill="grey")) grid.draw(gTree(children=gList(rectGrob()), vp=vp)) grid.export("gTree-viewport.svg") # Pathological grid.newpage() vp <- vpTree(viewport(width=.5, height=.5, name="p"), vpList(viewport(width=.5, height=.5, gp=gpar(fill="grey"), name="c1"), viewport(gp=gpar(col="red"), name="c2"))) pushViewport(vp) upViewport(0) grid.draw(gTree(childrenvp=vp, children=gList(rectGrob(vp="p::c1")), vp="p::c1")) grid.export("gTree-vpPath.svg") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testclippath.R������������������������������������������������������������������������0000654�0001762�0000144�00000003067�12215442555�015564� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) pdf(file = NULL) # Create the definition of a clipping path, in this case # it will just be a circle. cp <- clipPath(circleGrob(r = 0.3)) # Register the clipping path so that we can refer to it and apply it. registerClipPath("circleClip", cp) # Creating a simple plot that will be clipped to the circle sp <- gTree(name = "simplePlot", children = gList(xaxisGrob(), yaxisGrob(), rectGrob(gp = gpar(fill = "grey"))), vp = plotViewport()) grid.draw(sp) # Now lets clip it grid.clipPath("simplePlot", label = "circleClip") # Alternatively we could also do this which avoids the need to call # 'registerClipPath' explicitly # grid.clipPath("simplePlot", cp) # All that remains is a grey circle grid.export("clippath-simpleplot.svg") dev.off() # Now lets recreate the previous example using 'pushClipPath' pdf(file = NULL) # Clear previous clipping path reference gridSVG.newpage() pushViewport(plotViewport()) # Create the definition of a clipping path, in this case # it will just be a circle. cp <- clipPath(circleGrob(r = 0.3)) # Create a new clipping context for this viewport pushClipPath(cp) # Creating a simple plot that will be clipped to our current clipping context sp <- gTree(name = "simplePlot", children = gList(xaxisGrob(), yaxisGrob(), rectGrob(gp = gpar(fill = "grey")))) grid.draw(sp) # End the clipping context popClipPath() popViewport() # Again we are just left with a grey circle grid.export("pushclippath-simpleplot.svg") dev.off() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testfilter.R��������������������������������������������������������������������������0000654�0001762�0000144�00000001515�12215442555�015241� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) # There are many filter effect primitives and many of them are # quite complex so this file could end up having plenty more tests! pdf(file = NULL) # First, lets draw some text that we're then going to filter grid.text("hello, world!", gp = gpar(fontsize = 96), name = "backtext") # Draw a copy over the top with white text that will be left alone grid.text("hello, world!", gp = gpar(fontsize = 96, col = "white"), name = "foretext") # We want to create a filter that takes the text thicker, and then blurs it f <- filterEffect(list(feMorphology(operator = "dilate", radius = unit(1, "mm")), feGaussianBlur(sd = 1))) # Apply the filter grid.filter("backtext", f) # Now lets export this grid.export("filter-test.svg") dev.off() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/test.script���������������������������������������������������������������������������0000654�0001762�0000144�00000000414�12164147367�015141� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ function circle_click(evt) { var circle = evt.target; var currentRadius = circle.getAttribute("r"); if (currentRadius < 100) circle.setAttribute("r", currentRadius*2); else circle.setAttribute("r", currentRadius*0.5); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testpatternfill.R���������������������������������������������������������������������0000654�0001762�0000144�00000002666�12412600424�016276� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) pdf(file = NULL) grid.newpage() # We are just going to be drawing a cross for our pattern crossGrob <- gTree(children = gList( linesGrob(), linesGrob(x = unit(0:1, "npc"), y = unit(1:0, "npc"), gp = gpar(lwd = 1)) )) # Call the pattern "cross" # Using a small device size because the line widths # will be too small otherwise registerPatternFill("cross", grob = crossGrob, dev.width = 1, dev.height = 1) grid.circle(name = "filledcircle") # Applying the pattern semi-transparently to the circle grid.patternFill("filledcircle", label = "cross", alpha = 0.5) grid.export("pattern-test.svg") dev.off() # Now lets create a new pattern that uses the existing pattern # but much larger pdf(file = NULL) grid.newpage() registerPatternFillRef("bigcross", "cross", width = 0.3, height = 0.3) grid.circle(name = "filledcircle") grid.patternFill("filledcircle", label = "bigcross", alpha = 0.5) grid.export("pattern-test-ref.svg") dev.off() # Test pattern offset pdf(file = NULL) grid.newpage() grid.rect(y=1, height=.5, just="top", name="zero-offset") grid.patternFill("zero-offset", label="cross") offsetPattern <- pattern(crossGrob, x=unit(1, "cm"), dev.width=1, dev.height=1) grid.rect(y=0, height=.5, just="bottom", name="non-zero-offset") grid.patternFill("non-zero-offset", offsetPattern) grid.export("pattern-test-offset.svg") dev.off() ��������������������������������������������������������������������������gridSVG/tests/testclasses.R�������������������������������������������������������������������������0000654�0001762�0000144�00000000473�12215442555�015413� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) pdf(file = NULL) pushViewport(viewport()) grid.rect() grid.circle() grid.text("hello, world!") popViewport() # All grobs and viewports should now be exported with a class attribute # holding the value of their R class() grid.export("test-classes.svg", addClasses = TRUE) dev.off() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testtransparency.R��������������������������������������������������������������������0000654�0001762�0000144�00000002606�12215442556�016470� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) dev.new(width=6, height=6) # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) # A plot with overlapping polygons where the overlap needs to be # coloured differently # Implemented using transparency # Some dummy data set.seed(1000) x <- sort(runif(20, 1, 10)) y1 <- (x - 5) + rnorm(20) y2 <- -(x - 5) + rnorm(20) # Some "analysis" lm1 <- lm(y1 ~ x) lm2 <- lm(y2 ~ x) # Some calculated values to plot p1 <- predict(lm1, interval="confidence", type="response") p2 <- predict(lm2, interval="confidence", type="response") pushViewport(plotViewport(c(5, 5, 4, 2))) pushViewport(dataViewport(x, c(p1[,2], p2[,2], p1[,3], p2[,3]))) grid.rect() grid.xaxis() grid.yaxis() grid.points(x, y1) grid.points(x, y2, pch=3) grid.lines(x, p1[,1], default.units="native") grid.lines(x, p1[,2], default.units="native") grid.lines(x, p1[,3], default.units="native") grid.lines(x, p2[,1], default.units="native") grid.lines(x, p2[,2], default.units="native") grid.lines(x, p2[,3], default.units="native") # overlapping polygons grid.polygon(c(x, rev(x)), c(p1[,2], rev(p1[,3])), gp=gpar(fill="red", alpha=0.5), default.units="native") grid.polygon(c(x, rev(x)), c(p2[,2], rev(p2[,3])), gp=gpar(fill="green", alpha=0.5), default.units="native") popViewport(2) popViewport() grid.export("transparency.svg") dev.off() ��������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testforce.R���������������������������������������������������������������������������0000654�0001762�0000144�00000001372�12240527563�015054� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library(grid) library(gridSVG) x <- roundrectGrob(width=.8, height=.8, name="x", gp=gpar(lwd=5)) grid.newpage() grid.draw(x) grid.gradientFill("x", linearGradient(c("green", "yellow"))) grid.export("force-gradient.svg") grid.newpage() grid.draw(x) grid.animate("x", "stroke-opacity"=1:0) grid.export("force-animate.svg") grid.newpage() grid.draw(x) grid.hyperlink("x", href="http://www.stat.auckland.ac.nz/") grid.export("force-hyper.svg") grid.newpage() grid.draw(x) grid.filter("x", filterEffect(feGaussianBlur(sd=5))) grid.export("force-filter.svg") grid.newpage() grid.draw(x) grid.patternFill("x", pattern(circleGrob())) grid.export("force-pattern.svg") grid.newpage() grid.draw(x) grid.garnish("x", title="tooltip") grid.export("force-garnish.svg") ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testrotate.R��������������������������������������������������������������������������0000654�0001762�0000144�00000027171�12215442556�015261� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ library(grid) library(gridSVG) # Primitives to support: # rect grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect() popViewport() grid.export("rot-rect-default.svg") # Check justification grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect(x=0, y=0, just=c("left", "bottom")) popViewport() grid.export("rot-rect-just.svg") # Primitives to support: # text grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.text("rot-test") popViewport() grid.export("rot-text-default.svg") # Check justification grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.circle(r=unit(1, "mm")) grid.text("rot-test", just=c("left", "bottom")) popViewport() grid.export("rot-text-just.svg") # Primitives to support: # clipPath grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30, clip=TRUE)) grid.circle(r=.6) popViewport() grid.export("rot-clip-default.svg") # Primitives to support: # raster grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.raster(matrix(1:4/5, ncol=2), interp=FALSE) popViewport() grid.export("rot-raster-default.svg") # Check justification grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.raster(matrix(1:4/5, ncol=2), interp=FALSE, x=0, y=0, just=c("left", "bottom")) popViewport() grid.export("rot-raster-just.svg") # Primitives to support: # plotting symbols grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect() grid.points(1:5/6, 1:5/6, pch=1:5) popViewport() grid.export("rot-points.svg") ##################################### # Full STATIC test library(lattice) grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) print(xyplot(mpg ~ disp, mtcars, pch=3), newpage=FALSE) popViewport() grid.export("rot-lattice.svg") ##################################### # Implications for animation: # rect grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect(gp=gpar(col="grey")) grid.rect(x=.1, width=.1, height=.1, just="left", name="r") grid.animate("r", x=c(.1, .8)) popViewport() grid.export("rot-rect-animate-x.svg") grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect(gp=gpar(col="grey")) grid.rect(x=.1, width=.1, height=.1, just="left", name="r") grid.animate("r", x=c(.1, .8), height=c(.1, .5)) popViewport() grid.export("rot-rect-animate-height.svg") # Implications for animation: # text grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect(gp=gpar(col="grey")) grid.text("rot-test", x=.1, name="t") grid.animate("t", x=c(.1, .9)) popViewport() grid.export("rot-text-animate-x.svg") # Implications for animation: # raster grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect(gp=gpar(col="grey")) grid.raster(matrix(1-4:1/20, ncol=2), interpolate=FALSE, x=.8, width=.1, just="left") grid.raster(matrix(1:4/5, ncol=2), interpolate=FALSE, x=.1, width=.1, just="left", name="r") grid.animate("r", x=c(.1, .8)) popViewport() grid.export("rot-raster-animate-x.svg") grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect(gp=gpar(col="grey")) grid.raster(matrix(1-4:1/20, ncol=2), interpolate=FALSE, x=.8, width=.1, height=.5, just="left") grid.raster(matrix(1:4/5, ncol=2), interpolate=FALSE, x=.1, width=.1, just="left", name="r") # NOTE important to specify unit for height because default is NULL! grid.animate("r", x=c(.1, .8), height=unit(c(.1, .5), "npc")) popViewport() grid.export("rot-raster-animate-height.svg") # Implications for animation: # plotting symbols grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect() grid.points(5:1/6, 1:5/6, pch=1:5, gp=gpar(col="grey")) grid.points(1:5/6, 1:5/6, pch=1:5, name="p") grid.animate("p", x=animUnit(unit(c(1:5, 5:1)/6, "npc"), id=rep(1:5, 2))) popViewport() grid.export("rot-points-animate-x.svg") grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) grid.rect() grid.points(5:1/6, 1:5/6, pch=1:5, size=unit(2, "char"), gp=gpar(col="grey")) grid.points(1:5/6, 1:5/6, pch=1:5, name="p") grid.animate("p", x=animUnit(unit(c(1:5, 5:1)/6, "npc"), id=rep(1:5, 2)), size=animUnit(unit(rep(1:2, each=5), "char"), i=rep(1:5, 2))) popViewport() grid.export("rot-points-animate-size.svg") ##################################### # Full DYNAMIC test library(lattice) grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30)) print(xyplot(qsec ~ disp, mtcars, pch=3, col="grey", ylim=extendrange(c(mtcars$mpg, mtcars$qsec))), newpage=FALSE, prefix="plotgrey") print(xyplot(mpg ~ disp, mtcars, pch=3, ylim=extendrange(c(mtcars$mpg, mtcars$qsec))), newpage=FALSE, prefix="plot1") grid.animate("plot1.xyplot.points.panel.1.1", y=animUnit(unit(c(mtcars$mpg, mtcars$qsec), "native"), id=rep(1:nrow(mtcars), 2))) ylab <- grid.get("plot1.ylab") grid.animate("plot1.ylab", y=ylab$y - unit(0:1, "in"), "fill-opacity"=1:0, "stroke-opacity"=1:0) grid.animate("plotgrey.ylab", y=ylab$y + unit(1:0, "in"), "fill-opacity"=0:1, "stroke-opacity"=0:1) popViewport() grid.export("rot-lattice-animate.svg") ##################################### # Implications for exported coordinate system info (*.svg.coords.js) # need to record rotation info # AND use it in convertViewportX() etc library(lattice) grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30, name="rot")) print(xyplot(mpg ~ disp, mtcars, pch=3), newpage=FALSE, prefix="coords") downViewport("coords.panel.1.1.off.vp") grid.circle(unit(200, "native"), unit(30, "native"), r=unit(2, "mm"), gp=gpar(col=NA, fill="grey")) grid.circle(unit(300, "native"), unit(35, "native"), r=unit(1, "mm"), gp=gpar(col=NA, fill="grey")) upViewport(0) grid.export("rot-lattice-coords.svg", exportCoords="file", exportMappings="file", usePaths="none") # Read image back into R library(XML) svg <- xmlParse("rot-lattice-coords.svg") # Read in coord info gridSVGCoords(readCoordsJS("rot-lattice-coords.svg.coords.js")) gridSVGMappings(readMappingsJS("rot-lattice-coords.svg.mappings.js")) # Add new point to panel panel <- getNodeSet(svg, "//svg:g[contains(@id, 'coords.panel.1.1.off.vp')]", namespaces=c(svg="http://www.w3.org/2000/svg"))[[1]] vpname <- getSVGMappings("coords.panel.1.1.off.vp", "vp")[1] pos <- viewportConvertPos(vpname, 200, 30, "native") circ <- newXMLNode("circle", parent = panel, attrs = list( cx = pos$x, cy = pos$y, r = viewportConvertWidth(vpname, 2, "mm", "svg"), stroke = "red", fill = "red", "fill-opacity" = .5)) dim <- viewportConvertDim(vpname, 100, 5, "native", "svg") line <- newXMLNode("polyline", parent = panel, attrs = list( points = paste(paste(pos$x, pos$y, sep=","), paste(pos$x + dim$w, pos$y + dim$h, sep=",")), r = viewportConvertWidth(vpname, 2, "mm", "svg"), stroke = "red", fill = "red", "fill-opacity" = .5)) saveXML(svg, "rot-lattice-coords-mod.svg") # Pre-existing bug in convertViewportWidth() and convertViewportHeight() library(lattice) print(xyplot(mpg ~ disp, mtcars, pch=3), prefix="bug") downViewport("bug.panel.1.1.off.vp") grid.rect(x=200, y=30, width=100, height=5, just=c("left", "bottom"), default="native", gp=gpar(col="grey", fill=NA)) grid.export("bug-lattice-coords.svg", exportCoords="file", exportMappings="file", usePaths="none") library(XML) svg <- xmlParse("bug-lattice-coords.svg") gridSVGCoords(readCoordsJS("bug-lattice-coords.svg.coords.js")) gridSVGMappings(readMappingsJS("bug-lattice-coords.svg.mappings.js")) panel <- getNodeSet(svg, "//svg:g[contains(@id, 'bug.panel.1.1.off.vp')]", namespaces=c(svg="http://www.w3.org/2000/svg"))[[1]] vpname <- getSVGMappings("bug.panel.1.1.off.vp", "vp")[1] x <- viewportConvertX(vpname, 200, "native") y <- viewportConvertY(vpname, 30, "native") w <- viewportConvertWidth(vpname, 100, "native", "svg") h <- viewportConvertHeight(vpname, 5, "native", "svg") line <- newXMLNode("polyline", parent = panel, attrs = list(points = paste(paste(x, y, sep=","), paste(x + w, y + h, sep=",")), r = viewportConvertWidth(vpname, 2, "mm", "svg"), stroke = "red", fill = "red", "fill-opacity" = .5)) saveXML(svg, "bug-lattice-coords-mod.svg") # Implications for exported coordinate system info (*.svg.coords.js) # in viewportCreate() library(lattice) grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30, name="rot")) print(xyplot(mpg ~ disp, mtcars, pch=3), newpage=FALSE, prefix="coords") downViewport("coords.panel.1.1.off.vp") grid.yaxis(main=FALSE, gp=gpar(col="grey", fill="grey")) upViewport(0) grid.export("rot-lattice-coords-create.svg", exportCoords="file", exportMappings="file", usePaths="none") library(XML) svg <- xmlParse("rot-lattice-coords-create.svg") # Read in coord info gridSVGCoords(readCoordsJS("rot-lattice-coords-create.svg.coords.js")) gridSVGMappings(readMappingsJS("rot-lattice-coords-create.svg.mappings.js")) # Create new viewport vpname <- getSVGMappings("coords.panel.1.1.off.vp", "vp")[1] vp <- viewportCreate(vpname) grid.newpage() pushViewport(vp) # Draw an axis and, convert it to SVG, and extract axis SVG content grid.yaxis(main=FALSE, gp=gpar(col="red", fill="red")) newsvg <- grid.export(NULL) axissvg <- getNodeSet(newsvg$svg, "//svg:g[contains(@id, 'yaxis')]", namespaces=c(svg="http://www.w3.org/2000/svg"))[[1]] # Add new axis to panel panel <- getNodeSet(svg, "//svg:g[contains(@id, 'coords.panel.1.1.off.vp')]", namespaces=c(svg="http://www.w3.org/2000/svg"))[[1]] addChildren(panel, kids=list(axissvg)) saveXML(svg, "rot-lattice-coords-create-mod.svg") # Implications for exported coordinate system info (*.svg.coords.js) # in javascript viewportConvertX, etc library(lattice) grid.newpage() pushViewport(viewport(width=.5, height=.5, angle=30, name="rot")) print(xyplot(mpg ~ disp, mtcars, pch=3), newpage=FALSE, prefix="coords") downViewport("coords.panel.1.1.off.vp") grid.rect(x=200, y=30, width=100, height=5, just=c("left", "bottom"), default="native", gp=gpar(col="grey", fill=NA)) upViewport(0) grid.garnish("coords.background", onclick="addPoint()", "pointer-events"="all") grid.script(file="rot-lattice-coords.js") grid.export("rot-lattice-coords-js.svg", exportCoords="file", exportMappings="file", usePaths="none", exportJS="file") # Pre-existing bug in convertViewportWidth() and convertViewportHeight() (in JS) library(lattice) print(xyplot(mpg ~ disp, mtcars, pch=3), prefix="bug") downViewport("bug.panel.1.1.off.vp") grid.rect(x=200, y=30, width=100, height=5, just=c("left", "bottom"), default="native", gp=gpar(col="grey", fill=NA)) grid.garnish("bug.background", onclick="addPoint()", "pointer-events"="all") grid.script(file="bug-lattice-coords.js") grid.export("bug-lattice-coords-js.svg", exportCoords="file", exportMappings="file", usePaths="none", exportJS="file") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/tests/testlink.R����������������������������������������������������������������������������0000654�0001762�0000144�00000011253�12215442555�014711� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ library(grid) library(gridSVG) # A very simple test dev.new(width=6, height=6) # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) grid.text("Click me", name="txtgrob") grid.hyperlink("txtgrob", href="http://cran.stat.auckland.ac.nz") popViewport() grid.export() dev.off() # A scatterplot and two dot plots designed to be # linked together # Some data data(iris) # A scatterplot of x vs y dev.new(width=6, height=6) # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) pushViewport(plotViewport(c(5, 5, 4, 2))) pushViewport(dataViewport(iris$Sepal.Length, iris$Sepal.Width)) grid.rect() grid.xaxis(name="xaxis") grid.yaxis(name="yaxis") grid.hyperlink("xaxis", "linkdotx.svg") grid.hyperlink("yaxis", "linkdoty.svg") grid.points(iris$Sepal.Length[iris$Species == "setosa"], iris$Sepal.Width[iris$Species == "setosa"], gp=gpar(col="red")) grid.points(iris$Sepal.Length[iris$Species == "versicolor"], iris$Sepal.Width[iris$Species == "versicolor"], gp=gpar(col="green")) grid.points(iris$Sepal.Length[iris$Species == "virginica"], iris$Sepal.Width[iris$Species == "virginica"], gp=gpar(col="blue")) grid.text("Sepal Length", y=unit(-3, "lines")) grid.text("Sepal Width", x=unit(-3, "lines"), rot=90) popViewport(3) grid.export("linkscatter.svg") dev.off() # A dot plot of x dev.new(width=6, height=3) # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) pushViewport(plotViewport(c(5, 2, 4, 2))) pushViewport(dataViewport(iris$Sepal.Length, yscale=c(0 ,1))) grid.rect(gp=gpar(col="grey")) grid.xaxis() grid.points(iris$Sepal.Length[iris$Species == "setosa"], rnorm(50, .5, .05), size=unit(2, "char"), gp=gpar(col=NULL, fill="red", alpha=0.3)) grid.points(iris$Sepal.Length[iris$Species == "versicolor"], rnorm(50, .5, .05), size=unit(2, "char"), gp=gpar(col=NULL, fill="green", alpha=0.3)) grid.points(iris$Sepal.Length[iris$Species == "virginica"], rnorm(50, .5, .05), size=unit(2, "char"), gp=gpar(col=NULL, fill="blue", alpha=0.3)) grid.text("Sepal Length", y=unit(-3, "lines")) grid.text(name="returnlink", "Return to Scatterplot", y=unit(1, "npc") + unit(1, "lines"), gp=gpar(col="grey")) grid.hyperlink("returnlink", "linkscatter.svg") popViewport(3) grid.export("linkdotx.svg") dev.off() # A dot plot of y dev.new(width=6, height=3) # Some default settings pushViewport(viewport(gp=gpar(col="black", fill=NA))) pushViewport(plotViewport(c(5, 2, 4, 2))) pushViewport(dataViewport(iris$Sepal.Width, yscale=c(0 ,1))) grid.rect(gp=gpar(col="grey")) grid.xaxis() grid.points(iris$Sepal.Width[iris$Species == "setosa"], rnorm(50, .5, .05), size=unit(2, "char"), gp=gpar(col=NULL, fill="red", alpha=0.3)) grid.points(iris$Sepal.Width[iris$Species == "versicolor"], rnorm(50, .5, .05), size=unit(2, "char"), gp=gpar(col=NULL, fill="green", alpha=0.3)) grid.points(iris$Sepal.Width[iris$Species == "virginica"], rnorm(50, .5, .05), size=unit(2, "char"), gp=gpar(col=NULL, fill="blue", alpha=0.3)) grid.text("Sepal Width", y=unit(-3, "lines")) grid.text(name="returnlink", "Return to Scatterplot", y=unit(1, "npc") + unit(1, "lines"), gp=gpar(col="grey")) grid.hyperlink("returnlink", "linkscatter.svg") popViewport(3) grid.export("linkdoty.svg") dev.off() # Check link to overall grob works grid.newpage() grid.draw(hyperlinkGrob(linesGrob(gp=gpar(lwd=20)), href="http://www.stat.auckland.ac.nz")) grid.export("testGroupOfOneHyperlink.svg") grid.newpage() grid.draw(hyperlinkGrob(segmentsGrob(1:3/4, gp=gpar(lwd=20)), href="http://www.stat.auckland.ac.nz")) grid.export("testGroupOfManyHyperlink.svg") # Test *individual* hrefs grid.newpage() grid.draw(hyperlinkGrob(linesGrob(gp=gpar(lwd=20)), href="http://www.stat.auckland.ac.nz", group=FALSE)) grid.export("testIndividualOneHyperlink.svg") grid.newpage() grid.draw(hyperlinkGrob(segmentsGrob(1:3/4, gp=gpar(lwd=20)), href="http://www.stat.auckland.ac.nz", group=FALSE)) grid.export("testIndividualManyHyperlink.svg") grid.newpage() grid.draw(hyperlinkGrob(segmentsGrob(1:3/4, gp=gpar(lwd=20)), href=c("http://www.stat.auckland.ac.nz", "http://slashdot.org", "http://soccernet.com"), group=FALSE)) grid.export("testIndividualManyHyperlinks.svg") �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/vignettes/����������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�13651654530�013577� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/vignettes/gridSVG.Rnw�����������������������������������������������������������������������0000654�0001762�0000144�00000024351�12240527565�015602� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\documentclass[a4paper]{article} %\VignetteIndexEntry{gridSVG} \newcommand{\grid}{{\tt grid}} \newcommand{\gridSVG}{{\tt gridSVG}} \newcommand{\lattice}{{\tt lattice}} \newcommand{\R}{{\tt R}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \title{The gridSVG package} \author{Paul Murrell} \begin{document} \maketitle @ \section*{Introduction} This package is an experiment in writing a graphics device, purely in R code, for the grid graphics system. The specific device implemented is for the W3C SVG (Scalable Vector Graphics) format, but there is also some effort at a general device interface that would support other specific devices. \section*{User Interface} There are five functions of interest to the user: \begin{description} \item[{\tt grid.hyperlink}] takes a grid {\tt grob} and turns it into an object of class {\tt linked.grob}, with an associated {\tt href}. This allows the association of hyperlinks with elements of a grid graphic. See {\tt gridSVG/tests/testlink.R} for examples. \item[{\tt grid.animate}] allows the user to associate a duration (plus some other things) with certain aspects of a grid {\tt grob}. This allows a grid graphic element to be animated. See {\tt gridSVG/tests/testanimate.R} {\tt testpendulum.R} and {\tt testball.R} for examples. \item[{\tt grid.garnish}] allows the user to associate arbitrary SVG attributes with a grid {\tt grob}. This provides a way to associate with a grob things that have no corresponding grid concept, like an {\tt onclick} attribute. See {\tt gridSVG/tests/testattrib.R} for a simple example. \item[{\tt grid.script}] allows the user to create a grid {\tt grob} that contains an SVG script (e.g., some ECMAscript code). This provides a way to produce a complete SVG document (complete with scripts) entirely using R grid code (i.e., without having to hand edit the SVG file that \gridSVG{} creates. Again, see {\tt gridSVG/tests/testattrib.R} for a simple example. \item[{\tt gridToSVG()}] saves the current grid graphic to an SVG file. See the {\tt gridSVG/tests} directory for examples of what can be done. See the section ``Known Problems'' below for things that are not yet supported. \end{description} In addition to these functions, \gridSVG{} supports alpha-transparency by respecting the {\tt alpha} graphical parameter which can be specified in a \grid{} {\tt gpar} object. For example, the following code produces overlapping transparent circles\footnote{The {\tt pushViewport()} call is currently necessary to set some default values. It may be possible to remove this in future versions.}: <>= library(grid) library(gridSVG) <>= pushViewport(viewport(gp=gpar(col="black", fill=NA))) grid.circle(x=0.33, r=unit(2, "inches"), gp=gpar(alpha=0.3, fill="red")) grid.circle(x=0.67, r=unit(2, "inches"), gp=gpar(alpha=0.3, fill="green")) popViewport() gridToSVG() @ \section*{Internal Structure} There are nine {\tt .R} files in the {\tt gridSVG/R} directory, corresponding to the nine different things that gridSVG aims to provide: \begin{description} \item[dev.R] This contain (S4 methods) code defining a generic R-level graphics device interface. In other words, generic functions that may be called by a graphics system (such as grid), and that a graphics device (such as an SVG device) should provide methods for. \item[griddev.R] Code for running through the grid display list and calling generic device functions. \item[devsvg.R] Code implementing SVG methods for the generic device interface. \item[svg.R] A set of R-level functions for producing SVG output. Callable directly (see, e.g., {\tt gridSVG/tests/testsvg.R}), but mostly just called by code in {\tt devsvg.R}. \item[gridsvg.R] The function {\tt gridToSVG()}. \item[hyper.R] Code implementing the {\tt linked.grob} class -- i.e., an extension of the standard grid {\tt grob} that supports hyperlinks. Includes the function {\tt grid.hyperlink()}. \item[animate.R] Code implementing the {\tt animated.grob} class -- i.e., an extension of the standard grid {\tt grob} that supports animation. Includes the function {\tt grid.animate()}. \item[script.R] Code implementing the {\tt script} class -- i.e., an extension of the standard grid {\tt grob} that supports SVG scripts. Includes the function {\tt grid.script()}. \item[attrib.R] Code implementing the {\tt svg.grob} class -- i.e., an extension of the standard grid {\tt grob} that supports arbitrary SVG attributes. Includes the function {\tt grid.garnish()}. \end{description} \section*{Known Problems} This package is a partial implementation of several ideas. This section describes some of the known holes in and issues with the implementation. \subsection*{Overall Design} The package is ass-backwards in its design. Normal devices receive calls from grid to perform operations; gridSVG works off grid's display list so only has the information stored there to figure out what to do. This means that it has to replicate some of the work that grid does when grid draws (e.g., in order to enforce vp slots in grobs). If/when normal devices are implemented as R-level objects, so that grid includes a {\tt dev} argument in all its calls to devices, it may be possible to make gridSVG behave more like a normal device and this may lead to some simplifications. \subsection*{Sizing of and units in the SVG image} Software that tries to render SVG on a device has the same problem that \R{} graphics devices have when trying to render \grid{} output: Locations and sizes can be in a variety of units (cm, inches, percentages, ...) {\it some of which are physical units} with real-world meaning. The renderer has to figure out how big something like 1{\tt "} is in the native device units. This problem is worst on computer screens where it is not necessarily easy (or possible) to find out how many pixels there are in a physical inch on the screen. What \R{} does is try its best and it seems that SVG renderers must do the same\footnote{According to Section 7.1 Introduction of the W3C Scalable Vector Graphics (SVG) 1.0 Specification, ``a real number value that indicates the size in real world units, such as millimeters, of a "pixel"'' is ``highly desirable but not required''.}. gridSVG works off the grid display list. This means that the image must first be drawn on some other device (e.g., X11 or PostScript) then copied (via the {\tt gridSVG()} function) to an SVG format. It is not possible to use the SVG notion of transformations to mirror \grid{}'s viewport transformations because the SVG transformations work on ALL graphical elements, including text. In particular, any scaling transformations scale the size of text. Furthermore, \grid{} actions such as {\tt upViewport()} and {\tt downViewport()} are difficult to replicate as SVG transformations. So the copying of \grid{} output to SVG involves converting all locations and sizes to a single SVG coordinate system. There are two (serious) possibilities for this coordinate system: \begin{enumerate} \item specify everything (including the size of the SVG image) in pixels. In this case, what we do is work off the original device's concept of a pixel. The SVG image may be rendered quite a different size compared to the original if the size of pixels on the rendering device is different from the size of pixels on the original device. Things should be pretty consistent -- something that is supposed to be half the size of the image should be rendered half the size of the image -- though this will {\it not} be the case if the change in pixel size is different for x- and y-axes. An image drawn first in a screen window then copied to SVG and viewed {\it on the same screen} should hopefully be the same size. If the original device is a screen device, there is no guarantee that physical sizes will be respected; this will depend on how accurately the screen device can determine the physical size of its pixels. If the original device is a file device (e.g. PostScript) then physical sizes will be accurate on the original device, BUT the correspondence between ``pixels'' on the file device and pixels when the SVG is rendered on screen is very unlikely to be good (e.g., ``pixels'' on PostScript are $\frac{1}{72}${\tt "}, which is highly unlikely to correspond to pixel size on a modern screen). \item specify everything (including the size of the SVG image) in inches. In this case, there is no guarantee that the SVG image will end up the right physical size (it will depend on whether the rendering software can find out enough about pixels-to-inches, BUT everything should be in proportion (if the image is overall a little smaller than it should be, at least something that should be half the size of the image will be half the size of the image. The final rendered size of the image will totally depend on where it gets rendered\footnote{This is not to say that it should be riciculously off; it should be pretty close to the right physical size if it's not exactly the right size.}. This appears to have fewer problems; unfortunately it is {\bf totally killed} by the fact that the locations for drawing polylines MUST be in pixels! (technically, that should be ``user coordinates'', but since I have a single, flat coordinate system structure, it equates to pixels.) \end{enumerate} \subsection*{Plotting Symbols} Only {\tt pch=1} and {\tt pch=3} are currently supported. This is just a matter of filling in the other options. \subsection*{Mathematical Annotation} The use of things like {\tt grid.text(expression(x[i]))} is supported in the main R graphics engine. gridSVG bypasses that and so does not support mathematical annotation (and probably never will!). \subsection*{Time unit arithmetic} Animation is no longer achieved via ``time units'' so old problems with arithmetic on time units in previous versions of \gridSVG{} disappear (i.e., the user does not need to be as careful when doing animation; just specify some unit values and/or expressions and it should go.) Having said that, there is still only support for animating a small set of aspects of grid {\tt grob}s (basically the locations and sizes of {\tt grob}s. \subsection*{Acknowledgements} Many thanks to Nathan Whitehouse and colleagues who contributed ideas and code for including arbitrary SVG attributes and SVG scripts. \end{document} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/vignettes/extensibility.Rnw�����������������������������������������������������������������0000654�0001762�0000144�00000036463�12240527565�017200� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\documentclass[a4paper]{article} %\VignetteIndexEntry{extensibility} \newcommand{\grid}{{\bf grid}} \newcommand{\gridSVG}{{\sf gridSVG}} \newcommand{\lattice}{{\bf lattice}} \newcommand{\R}{{\sf R}} \newcommand{\js}{{\sf javascript}} \newcommand{\svg}{{\sf SVG}} \newcommand{\code}[1]{{\tt #1}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \title{Extending the gridSVG package} \author{Paul Murrell} \begin{document} \maketitle @ \section*{Introduction} It is sometimes useful or necessary for the user/developer to define a new grob (or gTree) class. The \gridSVG{} package only knows about the classes in the \grid{} package (basic graphical primitives, gTrees, plus a few others like frames and cell grobs). This means that \gridSVG{} cannot export, or animate, or garnish new grob classes without additional information. This document describes how to write methods for a new grob class to work with \gridSVG{}. <<>>= library(grid) library(gridSVG) @ The assumption in this document is that a new class has been made because there is a need to have a special \code{drawDetails()} method (because what the class draws has to be determined at drawing time rather than at grob creation time). There should not be any need for the information in this document if you have grobs or gTrees that are entirely defined at time of creation (so do not need any \code{drawDetails()} methods). Those cases should be handled by the \gridSVG{} package already. Users wanting to garnish or animate pieces of your scene should be able to get at whatever components of the scene that they need using gPaths (assuming that you have named all your grobs properly). \subsection*{Simple class example} A simple case is one where the grob being created (at drawing time) is just a simple graphical primitive. For example, the following (contrived) code defines a new class of (text) grob, a \code{timegrob} class, that writes out the time that its text is generated (see Figure \ref{figure:simplegrob}). <<>>= tg <- grob(name="tg", cl="timegrob") @ Because we will be able to reuse it later, we will write a function to create the grob at drawing time. <<>>= timegrob <- function(x) { textGrob(paste("text generated at", Sys.time(), sep="\n"), gp=x$gp, name=x$name) } @ The \code{drawDetails()} method for this new class just calls the \code{timegrob()} function to create a text grob and then draws that grob. <<>>= drawDetails.timegrob <- function(x, ...) { grid.draw(timegrob(x)) } @ Drawing the \code{timegrob} object calls the \code{drawDetails()} method above. <>= grid.draw(tg) @ \begin{figure} \begin{center} \includegraphics[width=2in]{extensibility-simplegrob} \caption{\label{figure:simplegrob}A simple new grob class that draws the time that its text was generated.} \end{center} \end{figure} The important thing about this class is that the grob that is being generated in the \code{drawDetails()} method is just a simple \code{text} grob. \subsection*{Not simple class example} A slightly more complex case is when a new grob class actually generates a gTree in its \code{drawDetails()} method. For example, the following code defines a new class, called \code{boxedtext}, that creates a gTree containing text and a bounding box (at drawing time so that the box can be created from the current size of the text, in case the text has been edited; see Figure \ref{figure:notsimplegrob}). <<>>= bt <- grob(x=unit(.5, "npc"), y=unit(.5, "npc"), label="hi", name="bt", cl="boxedtext") @ Again, it will be useful to have a function that creates the gTree. <<>>= boxedtext <- function(x) { tg <- textGrob(x$label, x$x, x$y, name=paste(x$name, "text", sep=".")) rg <- rectGrob(x$x, x$y, width=grobWidth(tg) + unit(2, "mm"), height=grobHeight(tg) + unit(2, "mm"), name=paste(x$name, "rect", sep=".")) gTree(children=gList(tg, rg), gp=x$gp, name=x$name) } @ The \code{drawDetails()} method is again very simple. <<>>= drawDetails.boxedtext <- function(x, ...) { grid.draw(boxedtext(x)) } @ Drawing the \code{boxedtext} grob call the \code{drawDetails()} method whch creates a gTree, containing a text and bounding rectangle, and draws it. <>= grid.draw(bt) @ \begin{figure} \begin{center} \includegraphics[width=2in]{extensibility-notsimplegrob} \caption{\label{figure:notsimplegrob}A not simple new grob class that draws text with a bounding box.} \end{center} \end{figure} The important thing about this example is that it creates a gTree at drawing time. \section*{Exporting a new grob class to \svg{}} If \gridSVG{} knows nothing about a grob class then it will not export any SVG elements via \code{gridToSVG()}. The technique for telling \gridSVG{} about a new class varies depending on how complex the new class is. \subsection*{Exporting a simple class} The \code{primToDev()} generic function is the function that converts a simple grob into \svg{}. There are \code{primToDev()} methods for all of the standard \grid{} graphical primitives, but for grob classes that \gridSVG{} does not recognise, no \svg{} code will be generated. If the new class only creates a simple grob at drawing time then all that is required is to define a new method for the \code{primToDev()} generic that generates a standard grob and calls \code{primToDev()} on that. For example, the following code creates a method for the simple \code{timegrob} class. This method simply creates the required text grob and then calls \code{primToDev()} on that, which exports the normal \svg{} code for a text grob. <<>>= primToDev.timegrob <- function(x, dev) { primToDev(timegrob(x), dev) } @ The \code{gridToSVG()} function will call this method to produce the appropriate \svg{} code. <<>>= grid.newpage() grid.draw(tg) gridToSVG("simpleclass.svg") @ The \svg{} code is shown below. One important feature is that the \code{id} attributes of the \svg{} elements are sensible. This has happened because the \code{timegrob()} function that we wrote sets the name of the text grob that it creates from the name of the \code{textgrob} object. <>= library(XML) @ <>= simpleclasssvg <- xmlParse("simpleclass.svg") cat(saveXML(simpleclasssvg)) @ Another feature of the \code{timegrob()} function is that it sets the \code{gp} slot of the text grob from the \code{gp} slot of the \code{textgrob} object. This is important to make sure that any graphical parameter settings on the \code{textgrob} are exported properly to \svg{}. \subsection*{Exporting a not simple class} The solution for exporting a new class that creates a gTree at drawing time is very similar to the simple solution. We need to write a \code{primToDev()} method for the new class, the only difference being that this method should create a gTree (rather than just a standard graphical primitive grob). For example, the following code creates a method for the \code{boxedtext} class. This just calls \code{boxedtext()} to create a gTree containing the appropriate text and bounding rectangle and then calls \code{primToDev()} on that gTree. <<>>= primToDev.boxedtext <- function(x, dev) { primToDev(boxedtext(x), dev) } @ The \code{gridToSVG()} function will now generate \svg{} output from a \code{boxedtext} object. <<>>= grid.newpage() grid.draw(bt) gridToSVG("notsimpleclass.svg") @ The \svg{} output is shown below. <>= notsimpleclasssvg <- xmlParse("notsimpleclass.svg") cat(saveXML(notsimpleclasssvg)) @ \section*{Animating a new grob class} In addition to converting a \grid{} scene to \svg{} code, the \gridSVG{} package also provides a way to animate components of a \grid{} scene. The \code{grid.animate()} function allows the user to select a grob by name and provide animated values for features of the grob (e.g., a set of x-values for a circle grob). The \code{grid.animate()} function actually only attaches the animation information to a grob. The real action happens when \code{gridToSVG()} is called and that calls the \code{animate()} generic function. The purpose of that function is to generate \code{} elements in the \svg{} code. As with \code{primToDev()}, there are \code{animate()} methods that generate \code{} elements for all standard graphical primitives, but nothing will happen for a grob class that \gridSVG{} is unaware of. If we want a new (simple) grob class to be able to be animated, we need to write an \code{animate()} method for that grob class. For example, the following code defines an \code{animate()} method for the \code{timegrob} class. This is similar to the \code{primToDev()} method in that it creates a text grob and then calls \code{animate()} on that (to take advantage of the existing \code{animate()} method for text grobs). The only complication is that the animation information on the \code{timegrob} object must be transferred over to the new text grob (this is done in a brute force manner here; perhaps a nicer encapsulation will be provided in the future). <<>>= animate.timegrob <- function(x, ...) { tg <- timegrob(x) tg$animationSets <- x$animationSets tg$groupAnimationSets <- x$groupAnimationSets animate(tg, ...) } @ With this \code{animate()} method in place, the following code draws a \code{timegrob} object and then animates it so that it will move left-to-right across the screen. <<>>= grid.newpage() grid.draw(tg) grid.animate("tg", x=c(.3, .7)) gridToSVG("animsimpleclass.svg") @ The \svg{} code that is generated from this scene is shown below to show that the animation has been recorded in the \svg{} output (it's actually an \code{} element rather than an \code{} element for text grobs). <>= animsimpleclasssvg <- xmlParse("animsimpleclass.svg") cat(saveXML(animsimpleclasssvg)) @ For the case of a new gTree class, things are a little more complicated. Again, we need to write a new \code{animate()} method, but this function can be a bit more complicated because there may be animation information to apply to the gTree as a whole \emph{and} animation information to apply to just the children of the gTree. For example, the code below defines an \code{animate()} method for the \code{boexedtext} class. This creates a gTree containing a text grob and a bounding rect grob. The \code{groupAnimationSets} information is added to the gTree and then \code{animate()} is called on that to output an \code{} element for the entire gTree, \emph{plus} each child of the gTree is extracted, \code{animationSets} information added, and then \code{animate()} called to output \code{} elements for each child of the gTree. <<>>= animate.boxedtext <- function(x, ...) { bt <- boxedtext(x) bt$groupAnimationSets <- x$groupAnimationSets animate(bt, ...) # Animate the children of bt btrect <- getGrob(bt, "bt.rect") btrect$animationSets <- x$animationSets animate(btrect, ...) bttext <- getGrob(bt, "bt.text") bttext$animationSets <- x$animationSets animate(bttext, ...) } @ The following code makes use of this method to animate a \code{boxedtext} grob. The first call to \code{grid.animate()} makes both text and bounding rect move left-to-right across the screen. The second call to \code{grid.animate()} makes the whole gTree disappear after 1 second (once the text and rect have moved to the right of the screen). <<>>= grid.newpage() grid.draw(bt) grid.animate("bt", x=c(.3, .7)) grid.animate("bt", visibility=c("visible", "hidden"), begin=1, duration=0.1, group=TRUE) gridToSVG("animnotsimpleclass.svg") @ The resulting \svg{} code is shown below. <>= animnotsimpleclasssvg <- xmlParse("animnotsimpleclass.svg") cat(saveXML(animnotsimpleclasssvg)) @ \section*{Garnishing a new grob class} The \code{grid.garnish()} function provides a way for users to add interactivity to a \grid{} scene, by specifying (\js{}) event handlers for components of the scene. More generally, the function allows \grid{} grobs to be garnished with arbitrary \svg{} attributes. Like \code{grid.animate()}, all \code{grid.garnish()} does is attach the garnishing information to a grob. The appropriate \svg{} code is only generated when \code{gridToSVG()} is called. The crucial action happens in the generic function \code{garnish()}, which transfers the garnishing information to the \svg{} device that is writing out \svg{} code. As should be familiar by now, there are \code{garnish()} methods for standard \grid{} graphical primitives, but no svg{} attributes will be exported for grob classes that \gridSVG{} does not know about. Fortunately, \code{garnish()} methods are once again pretty easy to write. For example, the following code defines a method for the \code{timegrob} class. This is very much like an \code{animate()} method: a text grob is created, the garnishing information is added to the text grob, then \code{garnish()} is called on the text grob so that the method for text grobs takes care of transferring the \svg{} attributes to the \svg{} device. <<>>= garnish.timegrob <- function(x, ...) { tg <- timegrob(x) tg$attributes <- x$attributes tg$groupAttributes <- x$groupAttributes garnish(tg, ...) } @ The following code shows the new method in action. A \code{timegrob} is drawn, then \code{grid.garnish()} is called to specify that a mouse click on the text should pop an alert dialog. <<>>= grid.newpage() grid.draw(tg) grid.garnish("tg", onmousedown="alert('ouch')") gridToSVG("garnishsimpleclass.svg") @ The resulting \svg{} code is shown below. <>= garnishsimpleclasssvg <- xmlParse("garnishsimpleclass.svg") cat(saveXML(garnishsimpleclasssvg)) @ The method is just as simple for a custom gTree class as well, as shown by the \code{garnish()} method for the \code{boxedtext} class below. <<>>= garnish.boxedtext <- function(x, ...) { bt <- boxedtext(x) bt$attributes <- x$attributes bt$groupAttributes <- x$groupAttributes garnish(bt, ...) } @ The following code shows this method in action, with an additional demonstration of the difference between garnishing individual components of a \grid{} scene and garnishing the overall parent component. A \code{boxedtext} grob is drawn, then the first call to \code{grid.garnish()} ensures that a mouse click on any part of the text or bounding box will produce an alert dialog. The second call to \code{grid.garnish()} sets up a different interaction on just the text so that moving the mouse over the text pops up a different dialog. <<>>= grid.newpage() grid.draw(bt) grid.garnish("bt", onmousedown="alert('ouch')") grid.garnish("bt", onmouseover=c(bt.text="alert('watch it!')"), group=FALSE) gridToSVG("garnishnotsimpleclass.svg") @ The resulting \svg{} code is shown below. <>= garnishnotsimpleclasssvg <- xmlParse("garnishnotsimpleclass.svg") cat(saveXML(garnishnotsimpleclasssvg)) @ \section*{Extending complex classes} A more complex case is one where a new grob class defines its own \code{preDrawDetails()} or \code{postDrawDetials()} methods. If that is the case, then it will be necessary to write a \code{grobToDev()} method for the class, just to get \svg{} exported correctly. See the existing methods for \code{grobToDev()} in the \gridSVG{} source for some examples. \end{document} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/vignettes/animation.Rnw���������������������������������������������������������������������0000654�0001762�0000144�00000023337�12472704522�016254� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\documentclass[a4paper]{article} %\VignetteIndexEntry{animation} \newcommand{\grid}{{\bf grid}} \newcommand{\gridSVG}{{\sf gridSVG}} \newcommand{\lattice}{{\bf lattice}} \newcommand{\R}{{\sf R}} \newcommand{\code}[1]{{\tt #1}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \title{Animation with the gridSVG package} \author{Paul Murrell} \begin{document} \maketitle @ \section*{Introduction} The \code{grid.animate()} function in the \gridSVG{} package allows various features of a \grid{} grob to be animated. Calls to this function can be quite straightforward. For example, the following code animates a circle so that it travels from left to right across the screen (the result of this code is the file \code{"animCircle.svg"}, which can be viewed in a web browser). <<>>= library(grid) library(gridSVG) @ <>= grid.circle(.1, .5, r=.1, gp=gpar(fill="black"), name="circle") grid.animate("circle", x=c(.1, .9)) grid.export("animCircle.svg") @ Things can get more complicated though. For example, in order to animate a \code{polyline} grob, it is necessary to specify a \emph{vector} of \code{x} and/or \code{y} locations for each time point \emph{and} it may even be necessary to specify \emph{multiple} vectors at each time point if the \code{polyline} grob specifies more than one polyline (via its \code{id} argument). To give a concrete example, consider the result of the following \grid{} code, which draws two polylines from a single call to \code{grid.polyline()} (see Figure \ref{figure:polyline}). <>= grid.rect() grid.polyline(c(.2, .3, .4, .6, .7, .8), c(.7, .5, .7, .3, .5, .3), id=rep(1:2, each=3), gp=gpar(lwd=5), name="polyline") @ \begin{figure} <>= <> @ \caption{\label{figure:polyline}Two polylines drawn from a single call to \code{grid.polyline}.} \end{figure} The task is to animate the two polylines so that they appear to ``flap'' (the left will transition to look like the right one and the right one will transition to look like the left one, and repeat). The y-values for the animation look something like this (the x-values are not animated): <>= polylineY <- animUnit(unit(c(.7, .5, .7, .3, .5, .3, .3, .5, .3, .7, .5, .7, .7, .5, .7, .3, .5, .3), unit="npc"), timeid=rep(1:3, each=6), id=rep(rep(1:2, each=3), 3)) @ <>= polylineY @ For the first polyline (\code{id1}), at the first time point (\code{t1}), the y-values are just the original y-values, \code{c(.7, .5, .7)}. At the second time point, the y-values for the first polyline are \code{c(.3, .5, .3)}, and at the third time point the y-values are back to the original \code{c(.7, .5, .7)}. The y-values for the second polyline are the reverse of the y-values for the first polyline. Specifying this set of animation values is more complex and can get pretty confusing, but at the same time, we still want to be able to specify the simple animation values (like in the first example) in a simple manner. The \gridSVG{} package provides a consistent, but flexible system for specifying animation values that is based on a single, coherent data structure, but which allows the user to use simpler specifications where possible. \section*{The \code{animUnit} class} An \code{animUnit} object has three components: a vector of \code{values} (as a \code{unit} object), a \code{timeid} vector (default \code{NULL}), and an \code{id} vector (default \code{NULL}). The \code{animUnit()} function is used to create an \code{animUnit}, with only the \code{values} as a required argument. The following code generates a single value at four different time points. <<>>= animUnit(unit(1:4, "cm")) @ As this example shows, the default interpretation of a \code{NULL} \code{timeid} is that each value belongs to a separate time period (and the default interpretation of a \code{NULL} \code{id} is that there is only one shape to be animated). This example also demonstrates the \code{print} method for \code{animUnit} objects, which is useful for seeing which animation values belong to different time periods. This simple sort of \code{animUnit} is sufficient for specifying something like the x-location of a single data symbol (where there is exactly one x-value required per time point). For the slightly more difficult situation of animating multiple data symbols (where we need several x-values per time period, one for each different data symbol), the \code{id} argument can be explicitly specified. The following code generate values for two shapes (\code{id1} and \code{id2}) with values at two time points (\code{t1} and \code{t2}) for each shape. <<>>= animUnit(unit(1:4, "cm"), id=rep(1:2, 2)) @ In the case where we have a single shape, but that shape is described by multiple x-values (e.g., a single polygon), we need multiple x-values per time point \emph{for each shape}, the \code{timeid} argument can be used to associate multiple x-values with a single time point. The following code generates six values at each of two time points (\code{t1} and \code{t2}) for a single shape. <<>>= animUnit(unit(1:12, "cm"), timeid=rep(1:2, 6)) @ And in the worst case, we have multiple shapes, each requiring multiple x-values per time period (e.g., multiple polygons from a single \code{polygon} grob), so we need to specify \emph{both} \code{id} and \code{timeid}. The following code generates three values at two different time points for two different shapes. <<>>= animUnit(unit(1:12, "cm"), timeid=rep(1:2, 6), id=rep(1:2, each=6)) @ The following code uses the \code{animUnit()} function to produce the flapping polylines example from the previous section. It produces a file called \code{"animPolyline.svg"} that can be viewed in a browser. <>= grid.animate("polyline", y=polylineY, rep=TRUE) @ <>= grid.newpage() <> <> <> grid.export("animPolyline.svg") @ \section*{The \code{as.animUnit()} function} The \code{animUnit} class gives us the range of possible specifications that we require, but it is overkill for simple cases, and may be less convenient even for more complex cases. There is an \code{as.animUnit()} function that can convert vectors, matrices, and lists to \code{animUnit}s so that we can use those simpler data structures to provide animation values. For example, a single value per time period can be specified with just a vector, as follows. <<>>= as.animUnit(1:4, unit="cm") @ Even better, the \code{grid.animate()} function makes use of this coercion function and fills in the \code{unit} based on the units of the feature that is being animated. This means that the call to \code{grid.animate()} can just specify a vector, like the following (taken from the first example at the beginning of this document). <>= grid.animate("circle", x=c(.1, .9)) @ When we need to specify values for multiple shapes it can be convenient to use a matrix, where each column provides the values for a different shape. The following code shows an example (again, in a call to \code{grid.animate()} we can leave out the \code{unit}). <<>>= m <- matrix(1:6, ncol=2) m @ <<>>= as.animUnit(m, unit="cm") @ If we have multiple values per time point (e.g., a polygon), we can get \code{as.animUnit()} to treat columns as different time points rather than as different shapes by specifying the \code{multVal} argument, as shown below. <<>>= as.animUnit(m, unit="cm", multVal=TRUE) @ The \code{grid.animate()} function guesses how it should use the columns of a matrix, depending on the shape that is being animated, so for relatively straightforward cases we should be abe to simply pass a matrix to \code{grid.animate()}. Finally, we can specify animation values as a list of units (if that is more convenient than calling \code{animUnit()}). The following code shows an example, which shows that the default behaviour is to treat each component of the list as animation values for a separate shape. <<>>= l <- list(unit(1:3, "cm"), unit(4:6, "cm")) l @ <<>>= as.animUnit(l) @ Again, we can specify that the components of the list correspond to separate time points rather than separate shapes (by calling \code{as.animUnit()} directly and supplying the \code{multVal} argument). <<>>= as.animUnit(l, multVal=TRUE) @ \section*{The \code{animValue} class} Some features of a shape, such as \code{visibility}, are not numeric locations or dimensions, so they do not need to be specified as unit values. For these cases, there is an \code{animValue()} function to create the various specifications that we might need, plus an \code{as.animValue()} function, which \code{grid.animate()} makes use of to allow convenient variations. \section*{Summary} For relatively simple animations, all we need to do is specify a numeric vector, or possibly a matrix, in the call to \code{grid.animate()}. For more complex animations, how we specify the animation values depends on what we find most convenient. Specifying a matrix or a list of units may suffice, although this may rely on \code{grid.animate()} correctly guessing our intention. It may be necessary to directly call \code{as.animUnit()} on a matrix or a list of units to get the behaviour that we want. Alternatively, a direct call to \code{animUnit()} should allow us to specify any set of animation values that we need and the \code{print()} method for the \code{animUnit} objects that are created by that function should help us to check that we are generating values in the right format. \end{document} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/������������������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�13651654530�011770� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/hyper.R�����������������������������������������������������������������������������������0000654�0001762�0000144�00000006172�12240527563�013247� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # FIXME: What should happen if a grob has BOTH group and individual hrefs? # Is that an error? hyperlinkGrob <- function(x, href, show=NULL, group=TRUE) { if (group) x$groupLinks <- href else x$links <- href # Determines which window the link is going to open in x$show <- show class(x) <- unique(c("linked.grob", class(x))) x } grid.hyperlink <- function(path, href, show=NULL, group=TRUE, redraw=FALSE, strict=FALSE, grep=FALSE, global=FALSE) { grobApply(path, function(path) { grid.set(path, hyperlinkGrob(grid.get(path), href, show, group), redraw = redraw) }, strict = strict, grep = grep, global = global) invisible() } link <- function(x) { UseMethod("link") } link.grob <- function(x) { x$name <- getID(x$name, "grob", FALSE) href <- x$links if (!is.null(href)) { n <- length(href) if (is.null(names(href))) names(href) <- subGrobName(x$name, 1:n) } groupHref <- x$groupLinks if (!is.null(groupHref)) names(groupHref) <- x$name c(href, groupHref) } # A hopefully useful default for gTrees link.gTree <- function(x, ...) { x$name <- getID(x$name, "grob", FALSE) href <- x$links if (!is.null(href)) { n <- length(href) if (is.null(names(href))) names(href) <- sapply((x$childrenOrder)[1:n], function(x) getID(x, "grob", FALSE)) } groupHref <- x$groupLinks if (!is.null(groupHref)) names(groupHref) <- x$name c(href, groupHref) } linkShow <- function(x) { UseMethod("linkShow") } linkShow.grob <- function(x, ...) { x$name <- getID(x$name, "grob", FALSE) show <- x$show if (is.null(show)) return("") if (!is.null(x$links)) { n <- length(show) if (is.null(names(show))) names(show) <- subGrobName(x$name, 1:n) } if (!is.null(x$groupLinks)) names(show) <- x$name show } linkShow.gTree <- function(x, ...) { x$name <- getID(x$name, "grob", FALSE) show <- x$show if (is.null(show)) return("") if (!is.null(x$links)) { n <- length(show) if (is.null(names(show))) names(show) <- sapply((x$childrenOrder)[1:n], function(x) getID(x, "grob", FALSE)) } if (!is.null(x$groupLinks)) names(show) <- x$name show } # Set the 'links' slot in the device # The catsvg() function in svg.R picks this up # and matches links to element names primToDev.linked.grob <- function(x, dev) { dev@links <- link(x) dev@show <- linkShow(x) NextMethod() } # gridToDev method for linked.grob objects # grobToDev.linked.grob <- function(x, dev) { # svgStartLink(x$href, dev@dev) # NextMethod() # svgEndLink(dev@dev) # } # Ensure the hyperlink is retained on a forced grob forceGrob.linked.grob <- function(x) { y <- NextMethod() if (inherits(y, "forcedgrob")) { y$links <- x$links y$groupLinks <- x$groupLinks y$show <- x$show class(y) <- unique(c("linked.grob", class(y))) } y } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/script.R����������������������������������������������������������������������������������0000654�0001762�0000144�00000001332�12164147366�013421� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ scriptGrob <- function(script=NULL, filename=NULL, type="application/ecmascript", inline=FALSE, name=NULL) { body <- "" href <- "" if (!is.null(filename)) { if (inline) { body <- paste(readLines(filename), collapse="\n") } else { href <- filename } } else if (!is.null(script)) { body <- script } else { stop("No script specified") } sg <- grob(type = type, href = href, body = body, name = name, cl="script.grob") sg } grid.script <- function(...) { grid.draw(scriptGrob(...)) } grobToDev.script.grob <- function(x, dev) { svgScript(x$body, x$href, x$type, x$name, svgdev=dev@dev) } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/svgStrings.R������������������������������������������������������������������������������0000654�0001762�0000144�00000022703�13422214447�014264� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ## Generate SVG using string tools then parse to XML ## [instead of using newXMLNode(..., parent=)] ## For some svg*() functions in svg.R, there are svg*String() functions here ## Difference between svg*() and svg*String() is that the ## latter is vectorised ## For some *() functions in svg.R, there are *Vec() (vectorised) functions here # Removes NULL values and flattens our attrib list # so we can include lists as elements in "alist" # and arrive at a flattened list # ALSO removes names from attr values so they don't corrupt attr names # e.g., avoid list(a=c(b=1)) becoming c(a.b=1) attrListVec <- function(alist) { lapply(alist, unname) } ## 'rx' and 'ry' because x and y assumed to be already rounded ## Assume that rx, ry, and angle all same length svgAngleTransformVec <- function(rx, ry, angle) { trans <- rep("", length(rx)) sigAngle <- !(is.null(angle) | angle == 0 | is.na(angle)) if (any(sigAngle)) { trans[sigAngle] <- paste0("rotate(", round(angle[sigAngle], 2), " ", rx[sigAngle], " ", ry[sigAngle], ")") } trans } svgStyleAttributesVec <- function(svgstyle, dev) { if (emptyStyle(svgstyle)) { list() } else { # Remove non-SVG style attributes (with warning) names <- names(svgstyle) svgnames <- names %in% get("SVGParList", envir=.gridSVGEnv) if (svgStrict(dev) && any(!svgnames)) { warning(paste("Removing non-SVG style attribute name(s):", paste(names[!svgnames], collapse=", "))) svgstyle <- svgstyle[names[svgnames]] } svgstyle } } svgStartLinkString <- function(href="", show="", svgdev=svgDevice()) { href <- paste0('xlink:href="', href, '" ') show <- paste0('xlink:show="', show, '" ') noshow <- is.null(show) | is.na(show) | nchar(show) == 0 if (any(noshow)) { show[noshow] <- "" } paste0("") } svgEndLinkString <- function(href) { rep("", length(href)) } svgCircleString <- function(x, y, r, id=NULL, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { # Draw nothing if non-finite location or size draw <- is.finite(x) & is.finite(y) & is.finite(r) tmpattr <- c(list(id = prefixName(id), cx = round(x, 2), cy = round(y, 2), r = round(r, 2)), svgStyleAttributesVec(style, svgdev), svgAttribTxt(attributes, id, "circle", svgdev)) attrlist <- attrListVec(tmpattr) attrStrings <- mapply(function(a, aname) { paste0(aname, '="', a, '"') }, attrlist, names(attrlist), SIMPLIFY=FALSE) circleString <- paste0("") circleString[!draw] <- "" ## Excapsulate within anchor ? if (!is.null(links) && any(has.link <- !is.na(links))) { circleString[has.link] <- paste0(svgStartLinkString(links[id], show[id]), circleString[has.link], svgEndLinkString(links[id])) } svgString <- paste0('', paste(circleString, collapse=""), "") newNode <- xmlParse(svgString, asText=TRUE) addChildren(svgDevParent(svgdev), kids=xmlChildren(xmlRoot(newNode))) } svgRectString <- function(x, y, width, height, angle=0, id=NULL, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { ## Draw nothing if non-finite location or size draw <- is.finite(x) & is.finite(y) & is.finite(width) & is.finite(height) ## Cope with negative width or height negWidth <- width < 0 negHeight <- height < 0 x[negWidth] <- x + width # shifts x to the left width <- abs(width) y[negHeight] <- y + height # shifts y down height <- abs(height) ## Avoid stupid number of digits in SVG rx <- round(x, 2) ry <- round(y, 2) attrlist <- c(list(id = prefixName(id), x = rx, y = ry, width = round(width, 2), height = round(height, 2), transform = svgAngleTransformVec(rx, ry, angle)), svgStyleAttributesVec(style, svgdev), svgAttribTxt(attributes, id, "rect", svgdev)) attrlist <- attrListVec(attrlist) attrStrings <- mapply(function(a, aname) { paste0(aname, '="', a, '"') }, attrlist, names(attrlist), SIMPLIFY=FALSE) rectString <- paste0("") rectString[!draw] <- "" ## Excapsulate within anchor ? if (!is.null(links) && any(has.link <- !is.na(links))) { rectString[has.link] <- paste0(svgStartLinkString(links[id], show[id]), rectString[has.link], svgEndLinkString(links[id])) } svgString <- paste0('', paste(rectString, collapse=""), "") newNode <- xmlParse(svgString, asText=TRUE) addChildren(svgDevParent(svgdev), kids=xmlChildren(xmlRoot(newNode))) } svgUseSymbolString <- function(id, x, y, size, pch, angle=0, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { ## Draw nothing if non-finite location or size draw <- is.finite(x) & is.finite(y) & is.finite(size) & (is.character(pch) | is.finite(pch)) ## Ensure the "dot" is only 1px wide size[pch == "."] <- 1 ## Ensure we refer to the correct id if (is.character(pch)) { numpch <- as.numeric(sapply(pch, charToRaw)) } else { numpch <- pch } rx <- round(x, 2) ry <- round(y, 2) tmpattr <- list(id = prefixName(id), "xlink:href" = paste0("#", prefixName(paste0("gridSVG.pch", numpch))), x = rx, y = ry, width = round(size, 2), height = round(size, 2)) ## centering adjustment r <- round(-size / 2, 2) tmpattr$transform <- paste0("translate(", r, ",", r, ")") angleTransform <- svgAngleTransformVec(rx, ry, angle) tmpattr$transform <- paste(angleTransform, tmpattr$transform) ## Preserve order tmpattr <- c(tmpattr, svgStyleAttributesVec(style, svgdev), svgAttribTxt(attributes, id, "use", svgdev)) ## Need to scale the stroke width otherwise for large points ## we also have large strokes sw <- as.numeric(tmpattr$`stroke-width`) scalef <- size / 10 # 10 is the point viewBox size sw <- sw / scalef tmpattr$`stroke-width` <- round(sw, 2) ## For pch outside 0-25 or character pch napch <- is.na(pch) if (is.character(pch)) { isDot <- !napch & pch == "." isChar <- !napch & !isDot } else if (is.numeric(pch)) { isDot <- !napch & pch == 46 isChar <- !napch & pch > 25 & !isDot } if (!is.null(tmpattr$"font-size")) { ## Strip unnecessary attribs tmpattr$"font-size"[isDot] <- "" } if (any(isDot)) { ## Because we really want just a dot, use crispEdges ## as anti-aliasing isn't really necessary tmpattr$"shape-rendering" <- "auto" tmpattr$"shape-rendering"[isDot] <- "crispEdges" } if (any(isChar)) { ## Make the s-w small so we see a stroke just barely tmpattr$"stroke-width"[isChar] <- "0.1" ## Set the font-size, otherwise it's going to mess with our scaling. ## 10px so it's the size of the point definition tmpattr$"font-size"[isChar] <- "10" } attrlist <- attrListVec(tmpattr) attrStrings <- mapply(function(a, aname) { paste0(aname, '="', a, '"') }, attrlist, names(attrlist), SIMPLIFY=FALSE) useString <- paste0("") useString[!draw] <- "" ## Excapsulate within anchor ? if (!is.null(links) && any(has.link <- !is.na(links))) { useString[has.link] <- paste0(svgStartLinkString(links[id], show[id]), useString[has.link], svgEndLinkString(links[id])) } svgString <- paste0('', paste(useString, collapse=""), "") newNode <- xmlParse(svgString, asText=TRUE) addChildren(svgDevParent(svgdev), kids=xmlChildren(xmlRoot(newNode))) } �������������������������������������������������������������gridSVG/R/svg.R�������������������������������������������������������������������������������������0000654�0001762�0000144�00000177333�13562663004�012726� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmlDecl <- function() { paste0('\n') } htmlFile <- function(filename, svgdev) { # For viewing using Adobe SVG Viewer in IE # OR in Firefox 3 (native support) # create a "wrapper" html file # NOTE that for including plotmath output (as MathML), may # need to use the right sort of headers. # See ~/Research/Rstuff/SVG/PlotMath/README for notes from some # experiments AND email from David Scott that contains an # example from org-babel output 2011-11-01 htmlfile <- paste0(filename, ".html") # NOTE that different browsers prefer different approaches # See email from David Scott 2011-11-03 for some sample code # The empty text node is so that we ensure the object tag is not # self-closing, i.e. there is an explicit closing tag written out obj <- newXMLNode("object", attrs = list(data = filename, type = "image/svg+xml", width = paste0(ceiling(svgDevWidth(svgdev)), "px"), height = paste0(ceiling(svgDevHeight(svgdev)), "px")), newXMLTextNode("")) fn <- saveXML(obj, file = htmlfile) } svgOpen <- function(width=200, height=200, strict=TRUE, rootAttrs=NULL) { # Ensure all vp contexts are now zero assign("contextLevels", 0, envir = .gridSVGEnv) svgdev <- svgDevice(width, height, strict, rootAttrs) svgHeader(width, height, svgdev) return(svgdev) } svgClose <- function(svgdev) { # Ensure all vp contexts are now zero assign("contextLevels", 0, envir = .gridSVGEnv) return(xmlRoot(svgDevParent(svgdev))) } svgJSUtils <- function(exportJS, svgfile, svgroot) { utilsFn <- paste0(svgfile, ".utils.js") utilsFile <- file(system.file("js/utils.js", package = "gridSVG")) utilsLines <- readLines(utilsFile) close(utilsFile) if (exportJS == "file") { destFile <- file(utilsFn) writeLines(utilsLines, destFile) close(destFile) newXMLNode("script", parent = svgroot, at = 0, attrs = list(type = "application/ecmascript", "xlink:href" = utilsFn)) } if (exportJS == "inline") { newXMLNode("script", parent = svgroot, at = 0, attrs = list(type = "application/ecmascript"), newXMLCDataNode(paste0(c("", utilsLines, ""), collapse = "\n"))) } # When we don't want to write to a file we might want to retain some # info, thus just return the JS quietly invisible(paste(utilsLines, collapse = "\n")) } svgCoords <- function(exportCoords, svgfile, svgroot) { coordsJSON <- toJSON(get("vpCoords", envir = .gridSVGEnv)) coordsJSON <- paste("var gridSVGCoords = ", coordsJSON, ";", sep = "") if (exportCoords == "file") { coordsFn <- paste0(svgfile, ".coords.js") coordsFile <- file(coordsFn, "w") cat(coordsJSON, "\n", file = coordsFile, sep = "") close(coordsFile) newXMLNode("script", parent = svgroot, at = 0, attrs = list(type = "application/ecmascript", "xlink:href" = coordsFn)) } if (exportCoords == "inline") { newXMLNode("script", parent = svgroot, at = 0, attrs = list(type = "application/ecmascript"), newXMLCDataNode(paste0(c("", coordsJSON, ""), collapse = "\n"))) } # When we don't want to write to a file we might want to retain some # info, thus return coords info quietly invisible(get("vpCoords", envir = .gridSVGEnv)) } svgMappings <- function(exportMappings, svgfile, svgroot) { usageTable <- get("usageTable", envir = .gridSVGEnv) if (exportMappings == "file") { mappingsFn <- paste0(svgfile, ".mappings.js") mappingsFile <- file(mappingsFn, "w") cat(exportMappings(usageTable), file = mappingsFile) close(mappingsFile) newXMLNode("script", parent = svgroot, at = 0, attrs = list(type = "application/ecmascript", "xlink:href" = mappingsFn)) } if (exportMappings == "inline") { newXMLNode("script", parent = svgroot, at = 0, attrs = list(type = "application/ecmascript"), newXMLCDataNode(exportMappings(usageTable))) } # When we don't want to write to a file we might want to retain some # info, thus return coords info quietly invisible(formatMappings(usageTable)) } svgAnnotate <- function(svgRoot, callAttrs) { # The purpose of this function is to collate all the information # that gridSVG knows about as it being called. Provides us with a # method of potentially debugging output and version detection. # # We put all this information in a comment node so that the output # is not parsed by a viewer. # However, if we are able to get the *text* from the comment we want # to be able to *parse* the output. argNames <- names(callAttrs) argValues <- unname(unlist(callAttrs)) # The call elements that we're going to be building up metadata <- newXMLNode("metadata", namespaceDefinitions = c(gridsvg = "http://www.stat.auckland.ac.nz/~paul/R/gridSVG/")) # Using the package DESCRIPTION version instead of packageVersion # because packageVersion converts our versions from 1.0-0 to 1.0.0. # Ignoring timezone in Sys.time(), should be fine newXMLNode("generator", namespace = "gridsvg", attrs = c(name = "gridSVG", version = packageDescription("gridSVG")$Version, time = as.character(Sys.time())), parent = metadata) for (i in 1:length(callAttrs)) { newXMLNode("argument", namespace = "gridsvg", attrs = c(name = argNames[i], value = argValues[i]), parent = metadata) } seps <- unlist(getSVGoptions()) for (i in 1:length(seps)) { newXMLNode("separator", namespace = "gridsvg", attrs = c(name = names(seps[i]), value = unname(seps[i])), parent = metadata) } # at = 0 because we want this comment to be inserted directly after # the main element addChildren(svgRoot, metadata, at = 0) } svgComment <- function(comment, svgdev=svgDevice()) { # If this is a multi-line comment, to ensure comments have the same # indentation, prefix and suffix the comment with empty lines if (length(comment) > 1) comment <- paste0(c("", comment, ""), collapse="\n") newXMLCommentNode(comment, parent = svgDevParent(svgdev)) } # , , , and elements MAY # have a rotation angle svgAngleTransform <- function(x, y, angle) { if (!is.null(angle) && angle != 0) { paste0("rotate(", round(angle, 2), " ", round(x, 2), " ", round(y, 2), ")") } else { NULL } } svgClipPath <- function(id, vpx, vpy, vpw, vph, vpa, svgdev=svgDevice()) { clipPathID <- prefixName(paste(id, "clipPath", sep = getSVGoption("id.sep"))) # Correct w/h if necessary if (vpw < 0) { vpx <- vpx + vpw # shifts x to the left vpw <- abs(vpw) } if (vph < 0) { vpy <- vpy + vph # shifts y down vph <- abs(vph) } newXMLNode("defs", parent = svgDevParent(svgdev), newXMLNode("clipPath", attrs = attrList(list(id = clipPathID, transform=svgAngleTransform(vpx, vpy, vpa))), newXMLNode("rect", attrs = list(x = round(vpx, 2), y = round(vpy, 2), width = round(vpw, 2), height = round(vph, 2), fill = "none", stroke = "none")))) } svgClipAttr <- function(id, clip) { if (clip) list("clip-path" = paste0("url(#", prefixName(id), getSVGoption("id.sep"), "clipPath)")) else list() } svgMaskAttr <- function(id, mask) { if (mask) list("mask" = paste0("url(#", prefixName(id), getSVGoption("id.sep"), "mask)")) else list() } svgStartElement <- function(id = NULL, classes = NULL, element = NULL, attrs = NULL, namespace = NULL, namespaceDefinitions = NULL, attributes=svgAttrib(), links=NULL, show = NULL, svgdev = svgDevice()) { has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) attrs$id <- prefixName(id) # If garnishing, clobber any existing attrs for (name in names(attributes)) attrs[[name]] <- attributes[[name]] # Avoid clobbering "class" attribute if it exists # Instead, add to the list of classes available if (! is.null(attrs$class) && get("addClasses", envir = .gridSVGEnv)) { cls <- strsplit(attrs$class, "\\s")[[1]] cls <- cls[nzchar(cls)] # Get rid of whitespace classList <- svgClassList(unique(c(cls, classes))) attrs$class <- classList$class } else { classList <- svgClassList(classes) if (length(classList)) attrs$class <- classList$class } attrs <- attrList(attrs) element <- newXMLNode(element, attrs = attrs, namespace = if (is.null(namespace)) character() else namespace, namespaceDefinitions = if (is.null(namespaceDefinitions)) character() else namespaceDefinitions, parent = svgDevParent(svgdev)) svgDevChangeParent(element, svgdev) } # This is pretty much the same as svgEndGroup svgEndElement <- function(id=NULL, links=NULL, svgdev=svgDevice()) { # In the case where we've got a link on our element, set the parent # one level up because we've got an "a" tag above the group has.link <- hasLink(links[id]) if (has.link) svgEndLink(svgdev) svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) } svgTextNode <- function(text, svgdev = svgDevice()) { newXMLTextNode(text, parent = svgDevParent(svgdev)) } svgStartGroup <- function(id=NULL, clip=FALSE, mask=FALSE, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), coords=NULL, classes = NULL, svgdev=svgDevice()) { # If this is a viewport that we're starting a group for # we will have coordinate information, otherwise don't bother. if (! is.null(coords)) { currVpCoords <- get("vpCoords", envir = .gridSVGEnv) currId <- prefixName(getid(id, svgdev)) currVpCoords[[currId]] <- coords assign("vpCoords", currVpCoords, envir = .gridSVGEnv) } has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) attrlist <- c(list(id = prefixName(id)), svgClipAttr(id, clip), svgMaskAttr(id, mask), svgStyleAttributes(style, svgdev), svgAttribTxt(attributes, id, "g", svgdev)) attrlist <- attrList(attrlist) # Avoid clobbering "class" attribute if it exists # Instead, add to the list of classes available if (! is.null(attrlist$class) && get("addClasses", envir = .gridSVGEnv)) { cls <- strsplit(attrlist$class, "\\s")[[1]] cls <- cls[nzchar(cls)] # Get rid of whitespace classList <- svgClassList(unique(c(cls, classes))) attrlist$class <- classList$class } else { classList <- svgClassList(classes) if (length(classList)) attrlist$class <- classList$class } newparent <- newXMLNode("g", parent = svgDevParent(svgdev), attrs = attrlist) svgDevChangeParent(newparent, svgdev) } svgEndGroup <- function(id=NULL, links=NULL, vp=FALSE, svgdev=svgDevice()) { # Handle case where clipGrobs, clipPath grobs and maskGrobs # have started groups. "pop" until we reach the appropriate group if (vp) { # In the case where we have reached something we know # is a viewport, then we don't need to unwind further parentIsVP <- function() { id <- xmlGetAttr(svgDevParent(svgdev), "id") ut <- get("usageTable", envir = .gridSVGEnv) ut <- ut[ut$type == "vp", ] baseGrobName(id) %in% ut$name } contextLevel <- tail(get("contextLevels", envir = .gridSVGEnv), 1) while (! parentIsVP() && contextLevel > 0) { svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) contextLevel <- contextLevel - 1 } # Remove latest vp from list of contexts assign("contextLevels", head(get("contextLevels", envir = .gridSVGEnv), -1), envir = .gridSVGEnv) } else { # In the case where we've got a link on our group, set the parent # one level up because we've got an "a" tag above the group. # Only doing this in the case where we're dealing with a grob. has.link <- hasLink(links[id]) if (has.link) svgEndLink(svgdev) } svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) } svgStartSymbol <- function(pch, svgdev = svgDevice()) { symbol <- newXMLNode("symbol", parent = svgDevParent(svgdev), at = 0, attrs = list(id = prefixName(paste0("gridSVG.pch", pch)), viewBox = "-5 -5 10 10", overflow = "visible")) svgDevChangeParent(symbol, svgdev) } svgEndSymbol <- function(svgdev = svgDevice()) { # Close symbol svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) } svgStartLink <- function(href="", show="", svgdev=svgDevice()) { linkAttrs <- list("xlink:href" = href) if (! is.null(show) && ! is.na(show) && nchar(show)) linkAttrs$`xlink:show` <- show link <- newXMLNode("a", parent = svgDevParent(svgdev), attrs = linkAttrs) svgDevChangeParent(link, svgdev) } svgEndLink <- function(svgdev=svgDevice()) { parent <- xmlParent(svgDevParent(svgdev)) svgDevChangeParent(parent, svgdev) } svgAnimate <- function(attrib, values, begin, interp, duration, rep, revert, id=NULL, svgdev=svgDevice()) { n <- if (is.null(id)) 1 else length(unique(id)) newXMLNode("animate", parent = svgDevParent(svgdev), attrs = list("xlink:href" = paste0("#", prefixName(getid(id, svgdev, n))), attributeName = attrib, begin = paste0(begin, "s"), calcMode = interp, dur = paste0(duration, "s"), values = values, repeatCount = if (is.numeric(rep)) rep else if (rep) "indefinite" else 1, fill = if (revert) "remove" else "freeze")) } # Special case just for stroke-width # values here is a vector of *numeric* values, not just # a single element character vector (e.g. 'svgAnimate') svgAnimatePointSW <- function(values, begin, interp, duration, rep, revert, id=NULL, svgdev=svgDevice()) { n <- if (is.null(id)) 1 else length(unique(id)) keyTimes <- round(seq(from = 0, to = 1, length.out = length(values)), 2) # Change the spline depending on whether we're increasing # the "size" of the stroke width or decreasing keySplines <- -diff(values) keySplines <- sapply(keySplines, function(x) { if (x >= 0) "0 1" # point is growing else "1 0" # point is shrinking }) keySplines <- paste(keySplines, "1 1", collapse = ";") keyTimes <- paste0(round(keyTimes, 2), collapse = ";") values <- paste0(round(values, 2), collapse = ";") newXMLNode("animate", parent = svgDevParent(svgdev), attrs = list("xlink:href" = paste0("#", prefixName(getid(id, svgdev, n))), attributeName = "stroke-width", begin = paste0(begin, "s"), calcMode = "spline", dur = paste0(duration, "s"), values = values, repeatCount = if (is.numeric(rep)) rep else if (rep) "indefinite" else 1, fill = if (revert) "remove" else "freeze", keyTimes = keyTimes, keySplines = keySplines)) } # This and svgAnimateY are untested with id != NULL # and I have a strong suspicion there may be problems # because tapply returns a list -- see svgAnimatePoints # for ideas for a possible solution (esp. the lpaste function) svgAnimateXYWH <- function(attrib, values, begin, interp, duration, rep, revert, id=NULL, svgdev=svgDevice()) { svgAnimate(attrib, paste(round(values, 2), collapse=";"), begin, interp, duration, rep, revert, id, svgdev) } # DON'T call this with a list of length < 2! old.lpaste <- function(alist, collapse) { n <- length(alist) if (n == 2) result <- paste(alist[[1]], alist[[2]]) else result <- paste(alist[[n]], lpaste(alist[1:(n-1)], collapse)) paste(result, collapse=collapse) } lpaste <- function(alist, collapse) { n <- length(alist) result <- alist[[1]] for (i in 2:n) result <- paste(result, alist[[i]]) paste(result, collapse=collapse) } svgAnimatePoints <- function(xvalues, yvalues, timeid, begin, interp, duration, rep, revert, id=NULL, svgdev=svgDevice()) { if (is.null(id)) warning("Only one point to animate") else svgAnimate("points", paste(lapply(split(paste(round(xvalues, 2), round(yvalues, 2), sep=","), timeid), paste, collapse=" "), collapse=";"), begin, interp, duration, rep, revert, id, svgdev) } svgAnimatePath <- function(xvalues, yvalues, pathid, timeid, begin, interp, duration, rep, revert, id=NULL, svgdev=svgDevice()) { if (is.null(id)) warning("Not sure what this animation means?") else { # Split into time segments x <- split(xvalues, timeid) y <- split(yvalues, timeid) pid <- split(pathid, timeid) d <- mapply(function(xtime, ytime, pid) { # Split into path components xx <- split(xtime, pid) yy <- split(ytime, pid) txt <- mapply(function(x, y) { paste(paste(c("M", rep("L", length(x) - 1)), round(x, 2), round(y, 2), collapse=" "), "Z") }, xx, yy) paste(unlist(txt), collapse=" ") }, x, y, pid) svgAnimate("d", paste(d, collapse=";"), begin, interp, duration, rep, revert, id, svgdev) } } svgAnimateTransform <- function(attrib, values, begin, interp, duration, rep, revert, additive = "replace", id=NULL, svgdev=svgDevice()) { n <- if (is.null(id)) 1 else length(unique(id)) newXMLNode("animateTransform", parent = svgDevParent(svgdev), attrs = list("xlink:href" = paste0("#", prefixName(getid(id, svgdev, n))), attributeName = "transform", type = attrib, begin = paste0(begin, "s"), calcMode = interp, dur = paste0(duration, "s"), values = values, additive = additive, repeatCount = if (is.numeric(rep)) rep else if (rep) "indefinite" else 1, fill = if (revert) "remove" else "freeze")) } svgAnimateTranslation <- function(xvalues, yvalues, begin, interp, duration, rep, revert, additive = "replace", id=NULL, svgdev=svgDevice()) { svgAnimateTransform("translate", paste(round(xvalues, 2), round(yvalues, 2), sep=",", collapse=';'), begin, interp, duration, rep, revert, additive, id, svgdev) } svgAnimateRotation <- function(angle, xvalues, yvalues, begin, interp, duration, rep, revert, additive = "replace", id=NULL, svgdev=svgDevice()) { svgAnimateTransform("rotate", paste(round(angle, 2), round(xvalues, 2), round(yvalues, 2), sep=" ", collapse=';'), begin, interp, duration, rep, revert, additive, id, svgdev) } svgAnimateScale <- function(xvalues, yvalues, begin, interp, duration, rep, revert, additive = "replace", id=NULL, svgdev=svgDevice()) { svgAnimateTransform("scale", paste(round(xvalues, 2), round(yvalues, 2), sep=",", collapse=';'), begin, interp, duration, rep, revert, additive, id, svgdev) } genAlpha <- function(N) { m <- suppressWarnings(matrix(rep(letters, length.out=N), nrow=26)) alpha <- apply(m, 1, function(x) { unlist(lapply(mapply(rep, x, 1:length(x)), paste, collapse="")) }) t(alpha)[1:N] } svgLines <- function(x, y, id=NULL, arrow = NULL, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { ## Never fill a line style$fill <- "none" has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) ## Handle NA values in (x, y) xylist <- splitOnNA(x, y) N <- length(xylist) if (N > 0) { if (N > 1) { alpha <- genAlpha(N) } else { alpha <- "" } for (i in 1:N) { ## Grabbing arrow info for marker element references ## Arrows NOT drawn at NA splits if (! is.null(arrow$ends)) { if (arrow$ends == "both" && i == 1 && N == 1) lineMarkerTxt <- markerTxt("both", id) else if ((arrow$ends == "both" || arrow$ends == "first") && i == 1 && is.finite(x[1]) && is.finite(y[1])) lineMarkerTxt <- markerTxt("first", id) else if ((arrow$ends == "both" || arrow$ends == "last") && i == N && is.finite(x[length(x)]) && is.finite(y[length(y)])) lineMarkerTxt <- markerTxt("last", id) else lineMarkerTxt <- NULL } else { lineMarkerTxt <- NULL } attrlist <- c(list(id = prefixName(paste0(id, alpha[i])), points = paste0(round(xylist[[i]]$x, 2), ",", round(xylist[[i]]$y, 2), collapse=" ")), lineMarkerTxt, svgStyleAttributes(style, svgdev), svgAttribTxt(attributes, id, "polyline", svgdev)) attrlist <- attrList(attrlist) newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = attrlist) } } if (has.link) svgEndLink(svgdev) } svgMarker <- function(x, y, type, ends, direction, name, style=svgStyle(), svgdev=svgDevice()) { width <- abs(max(x) - min(x)) height <- abs(max(y) - min(y)) if (length(x) != length(y)) stop("x and y must be same length") if (is.atomic(x)) { if (is.atomic(y)) { x <- list(x) y <- list(y) } else { stop("'x' and 'y' must both be lists or both be atomic") } } d <- mapply( function(subx, suby) { openPath <- paste(c("M", rep("L", length(subx) - 1)), round(subx, 2), round(suby, 2), collapse=" ") if (type == 2) # Closed arrow paste(openPath, "Z") else openPath }, x, y) # If the arrow is open, we don't want to fill it if (type == 1) style$fill <- "none" # [[1]] and [1]: markerStart # [[2]] and [2]: markerEnd # pathattrs is simply a list where each element # is a list that we can simply pass in as attrs # to newXMLNode ids <- markerName("both", name) refXs <- direction * round(c(-width, width), 2) refYs <- round(c(-height / 2, height / 2), 2) pathlist <- attrList(c(list(d = d), svgStyleAttributes(style, svgdev))) # It is possible for width to be 0, i.e. when angle=90. # Ensure that the marker is always at least as wide as the # stroke width that it is given. mwidth <- max(as.numeric(pathlist$`stroke-width`), width) mheight <- max(as.numeric(pathlist$`stroke-width`), height) pathattrs <- list(pathlist, pathlist) pathattrs[[1]]$transform <- "rotate(180)" newXMLNode("defs", parent = svgDevParent(svgdev), newXMLNode("marker", attrs = list(id = ids[1], refX = refXs[1], refY = refYs[1], overflow = "visible", markerUnits = "userSpaceOnUse", markerWidth = round(mwidth, 2), markerHeight = round(mheight, 2), orient = "auto"), newXMLNode("path", attrs = pathattrs[[1]])), newXMLNode("marker", attrs = list(id = ids[2], refX = refXs[2], refY = refYs[2], overflow = "visible", markerUnits = "userSpaceOnUse", markerWidth = round(mwidth, 2), markerHeight = round(mheight, 2), orient = "auto"), newXMLNode("path", attrs = pathattrs[[2]]))) } markerTxt <- function(ends, name) { mname <- markerName(ends, name) if (ends == "first") lmt <- list("marker-start" = paste0("url(#", mname, ")")) if (ends == "last") lmt <- list("marker-end" = paste0("url(#", mname, ")")) if (ends == "both") lmt <- list("marker-start" = paste0("url(#", mname[1], ")"), "marker-end" = paste0("url(#", mname[2], ")")) lmt } markerName <- function(ends, name) { if (ends == "first") mname <- paste(name, getSVGoption("id.sep"), "markerStart", sep="") if (ends == "last") mname <- paste(name, getSVGoption("id.sep"), "markerEnd", sep="") if (ends == "both") mname <- c(paste(name, getSVGoption("id.sep"), "markerStart", sep=""), paste(name, getSVGoption("id.sep"), "markerEnd", sep="")) prefixName(mname) } svgPolygon <- function(x, y, id=NULL, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { if (length(x) != length(y)) stop("x and y must be same length") has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) # Handle NA values in (x, y) xylist <- splitOnNA(x, y) N <- length(xylist) if (N > 0) { if (N > 1) { alpha <- genAlpha(N) } else { alpha <- "" } for (i in 1:N) { attrlist <- c(list(id = prefixName(paste0(id, alpha[i])), points = paste0(round(xylist[[i]]$x, 2), ",", round(xylist[[i]]$y, 2), collapse=" ")), svgStyleAttributes(style, svgdev), svgAttribTxt(attributes, id, "polygon", svgdev)) attrlist <- attrList(attrlist) newXMLNode("polygon", parent = svgDevParent(svgdev), attrs = attrlist) } } if (has.link) svgEndLink(svgdev) } # Differs from polygon because it can have sub-paths svgPath <- function(x, y, rule, id=NULL, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { if (length(x) != length(y)) stop("x and y must be same length") if (is.atomic(x)) { if (is.atomic(y)) { # NAs allowed; turn into sub-paths xy <- splitOnNA(x, y) x <- lapply(xy, "[[", "x") y <- lapply(xy, "[[", "y") } else { stop("'x' and 'y' must both be lists or both be atomic") } # If the path contains multiple sub-paths then NAs are NOT allowed # (to follow 'grid' behaviour) bad <- !all(sapply(x, function(z) { all(is.finite(z)) })) || !all(sapply(y, function(z) { all(is.finite(z)) })) if (bad) stop("non-finite x or y in graphics path") } n <- length(x) d <- mapply(function(subx, suby) { paste(paste(c("M", rep("L", length(subx) - 1)), round(subx, 2), round(suby, 2), collapse=" "), "Z") }, x, y) tmpattr <- c(list(id = prefixName(id), d = paste(unlist(d), collapse = " "), "fill-rule" = switch(rule, winding="nonzero", "evenodd")), svgStyleAttributes(style, svgdev), svgAttribTxt(attributes, id, "path", svgdev)) tmpattr <- attrList(tmpattr) has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) newXMLNode("path", parent = svgDevParent(svgdev), attrs = tmpattr) if (has.link) svgEndLink(svgdev) } svgRaster <- function(x, y, width, height, angle=0, datauri, id=NULL, just, vjust, hjust, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { # Draw nothing if non-finite location or size if (!(is.finite(x) && is.finite(y) && is.finite(width) && is.finite(height))) return() has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) rx <- round(x, 2) ry <- round(y, 2) transform <- paste0("translate(", rx, ", ", round(ry, 2), ")") angleTransform <- svgAngleTransform(rx, ry, angle) if (!is.null(angleTransform)) { transform <- paste(angleTransform, transform) } attrlist <- c(list(id = prefixName(id), transform = transform), svgStyleAttributes(style, svgdev), svgAttribTxt(attributes, id, "g", svgdev)) attrlist <- attrList(attrlist) newXMLNode("g", parent = svgDevParent(svgdev), attrs = attrlist, newXMLNode("g", attrs = list(id = paste(prefixName(id), "scale", sep = getSVGoption("id.sep")), transform = paste0("scale(", round(width, 2), ", ", round(height, 2), ")")), newXMLNode("image", # Suppress the namespace warning because # we know in this specific case it is # a spurious warning suppressNamespaceWarning = TRUE, attrs = list(x = 0, y = 0, width = 1, height = 1, transform = "scale(1, -1) translate(0, -1)", "xlink:href" = datauri, preserveAspectRatio = "none")))) if (has.link) svgEndLink(svgdev) } svgRect <- function(x, y, width, height, angle=0, id=NULL, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { # Draw nothing if non-finite location or size if (!(is.finite(x) && is.finite(y) && is.finite(width) && is.finite(height))) return() has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) if (width < 0) { x <- x + width # shifts x to the left width <- abs(width) } if (height < 0) { y <- y + height # shifts y down height <- abs(height) } rx <- round(x, 2) ry <- round(y, 2) attrlist <- c(list(id = prefixName(id), x = rx, y = ry, width = round(width, 2), height = round(height, 2), transform = svgAngleTransform(rx, ry, angle)), svgStyleAttributes(style, svgdev), svgAttribTxt(attributes, id, "rect", svgdev)) attrlist <- attrList(attrlist) newXMLNode("rect", parent = svgDevParent(svgdev), attrs = attrlist) if (has.link) svgEndLink(svgdev) } svgTextSplitLines <- function(text, id, lineheight, charheight, vjust, svgdev) { # Splitting based on linebreaks splitText <- strsplit(text, "\n") # If text is "", produces character(0), so fix that if (length(splitText[[1]]) == 0) splitText[[1]] <- "" n <- length(splitText[[1]]) # Need to adjust positioning based on vertical justification. # Horizontal justification is done for us. # Only the first line needs to be modified, the rest are all # just one line below the previous line if (vjust %in% c("centre", "center")) firstDelta <- - ((lineheight * (n - 1) - charheight) / 2) if (vjust == "bottom") firstDelta <- - (n - 1) * lineheight if (vjust == "top") firstDelta <- charheight lineheight <- c(firstDelta, rep(lineheight, n - 1)) textContent <- splitText[[1]] # Note that x=0 here so that we push it to the left, hjust # is worked out automatically from there for (i in 1:n) { newXMLNode("tspan", parent = svgDevParent(svgdev), attrs = list(id = paste(id, "tspan", i, sep=getSVGoption("id.sep")), dy = round(lineheight[i], 2), x = 0), newXMLTextNode(textContent[i])) } } svgTextElement <- function(text, id, rot, hjust, vjust, lineheight, charheight, style, svgdev=svgDevice()) { # Rotation in SVG goes clockwise from +ve x=axis transform <- if (rot != 0) list(transform = paste0("rotate(", round(-rot, 2), ")")) else NULL attrlist <- c(list(x = 0, y = 0, id = paste(id, "text", sep=getSVGoption("id.sep"))), transform, textAnchor(hjust), svgStyleAttributes(style, svgdev)) attrlist <- attrList(attrlist) newpar <- newXMLNode("text", parent = svgDevParent(svgdev), attrs = attrlist) # Set parent of all s to be the el svgDevChangeParent(newpar, svgdev) # Write each of the lines here svgTextSplitLines(text, id, lineheight, charheight, vjust, svgdev) # Resetting parent svgDevChangeParent(xmlParent(newpar), svgdev) } # NOTE that the precise placement of math is even less likely to work # than normal text. Besides the problem of the browser using a # different font (which is more likely because a math expression # typically uses multiple fonts), the web browser will be using # a different formula layout engine compared to R so things like # the spacing between operators will be different. # One particular problem is that R justifies math formulas # relative to the bounding box of the formula, whereas it # appears that Firefox at least justifies relative to the formula # baseline (just from observation). # The code below tries to do something rational by making use # of finer detail metric information for the formula # to mimic R's vertical justification. svgMathElement <- function(text, id, rot, hjust, vjust, width, height, ascent, descent, lineheight, charheight, fontheight, fontfamily, fontface, style, svgdev=svgDevice()) { # Determine x/y based on width/height and hjust/vjust if (hjust %in% c("centre", "center")) x <- -width/2 if (hjust == "left") x <- 0 if (hjust == "right") x <- -width if (vjust %in% c("centre", "center")) y <- -(max(ascent, fontheight) + descent)/2 if (vjust == "bottom") y <- -(max(ascent, fontheight) + descent) if (vjust == "top") { if (fontheight > ascent) y <- -(fontheight - ascent) else y <- (ascent - fontheight) } tmpattr <- c(list(x = round(x, 2), y = round(y, 2), id = paste(id, "mathtext", sep=getSVGoption("id.sep")), width = round(3*width, 2), height = round(3*height, 2)), svgStyleAttributes(style, svgdev)) if (rot != 0) tmpattr$transform <- paste0("rotate(", round(-rot, 2), ")") switch <- newXMLNode("switch", parent = svgDevParent(svgdev)) foreignObj <- newXMLNode("foreignObject", parent = switch, attrs = attrList(tmpattr)) svgDevChangeParent(foreignObj, svgdev) expr2mml(text, fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(switch), svgdev) } svgText <- function(x, y, text, hjust="left", vjust="bottom", rot=0, width=1, height=1, angle=0, ascent=1, descent=0, lineheight=1, charheight=.8, fontheight=1, fontfamily="sans", fontface="plain", id=NULL, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { # Draw nothing if x/y non-finite if (!(is.finite(x) && is.finite(y))) return() has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) if (width < 0) { x <- x + width # shifts x to the left width <- abs(width) } if (height < 0) { y <- y + height # shifts y down height <- abs(height) } rx <- round(x, 2) ry <- round(y, 2) topattrs <- list() topattrs$id <- prefixName(id) angleTransform <- svgAngleTransform(rx, ry, angle) topattrs$transform <- paste0("translate(", rx, ", ", ry, ")") if (!is.null(angleTransform)) { topattrs$transform <- paste(angleTransform, topattrs$transform) } topattrs$`stroke-width` <- "0.1" topattrs <- c(topattrs, svgAttribTxt(attributes, id, "g", svgdev)) # Flip the y-direction again so that text is drawn "upright" # Do the flip in a separate so that can animate the # translation easily # Use a tspan to do the vertical alignment topg <- newXMLNode("g", parent = svgDevParent(svgdev), attrs = topattrs) sec <- newXMLNode("g", parent = topg, attrs = list(id = paste(prefixName(id), "scale", sep = getSVGoption("id.sep")), transform = "scale(1, -1)")) # Let all child elements or MathML fragments be # located under the *second* svgDevChangeParent(sec, svgdev) if (is.language(text)) { svgMathElement(text, prefixName(id), rot, hjust, vjust, width, height, ascent, descent, lineheight, charheight, fontheight, fontfamily, fontface, style, svgdev) } else { svgTextElement(text, prefixName(id), rot, hjust, vjust, lineheight, charheight, style, svgdev) } # Reset parent to parent of entire text "grob" svgDevChangeParent(xmlParent(topg), svgdev) if (has.link) svgEndLink(svgdev) } svgCircle <- function(x, y, r, id=NULL, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { # Draw nothing if non-finite location or size if (!(is.finite(x) && is.finite(y) && is.finite(r))) return() has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) tmpattr <- c(list(id = prefixName(id), cx = round(x, 2), cy = round(y, 2), r = round(r, 2)), svgStyleAttributes(style, svgdev), svgAttribTxt(attributes, id, "circle", svgdev)) tmpattr <- attrList(tmpattr) has.link <- hasLink(links[id]) newXMLNode("circle", parent = svgDevParent(svgdev), attrs = tmpattr) if (has.link) svgEndLink(svgdev) } svgScript <- function(body, href, type="application/ecmascript", id=NULL, svgdev=svgDevice()) { tmpattr <- list(type = type, id = prefixName(getid(id, svgdev, 1))) if (nchar(href) > 0) tmpattr$`xlink:href` <- href script <- newXMLNode("script", parent = svgDevParent(svgdev), attrs = tmpattr) if (nchar(body) > 0) { # "body" adds newlines because otherwise the CDATA delimiters are part # of the first and last line of text, break it apart to look nicer newXMLCDataNode(paste0("\n", body, "\n"), parent = script) } } # Beginning of definition of all PCH elements # Note that these definitions come ported from # R's /src/main/engine.c # Note in particular that radius is defined to be 0.375 * size # so that width is 0.75 of the specified size. Most of the time # this means we have a computed radius of 3.75 svgUseSymbol <- function(id, x, y, size, pch, angle=0, attributes=svgAttrib(), links=NULL, show=NULL, style=svgStyle(), svgdev=svgDevice()) { # Draw nothing if non-finite location or size if (!(is.finite(x) && is.finite(y) && is.finite(size))) return() has.link <- hasLink(links[id]) if (has.link) svgStartLink(links[id], show[id], svgdev) # Ensure the "dot" is only 1px wide if (pch == ".") size <- 1 # Ensure we refer to the correct id numpch <- if (is.character(pch)) as.numeric(charToRaw(pch)) else pch rx <- round(x, 2) ry <- round(y, 2) tmpattr <- list(id = prefixName(id), "xlink:href" = paste0("#", prefixName(paste0("gridSVG.pch", numpch))), x = rx, y = ry, width = round(size, 2), height = round(size, 2)) # centering adjustment r <- round(-size / 2, 2) tmpattr$transform <- paste0("translate(", r, ",", r, ")") angleTransform <- svgAngleTransform(rx, ry, angle) if (!is.null(angleTransform)) { tmpattr$transform <- paste(angleTransform, tmpattr$transform) } # Preserve order tmpattr <- c(tmpattr, svgStyleAttributes(style, svgdev), svgAttribTxt(attributes, id, "use", svgdev)) # Need to scale the stroke width otherwise for large points # we also have large strokes sw <- as.numeric(tmpattr$`stroke-width`) scalef <- size / 10 # 10 is the point viewBox size sw <- sw / scalef tmpattr$`stroke-width` <- round(sw, 2) # For pch outside 0-25 or characters if (is.character(pch) || (is.numeric(pch) && pch > 25)) { # When we have a "." we have a special case if ((is.character(pch) && pch == ".") || (is.numeric(pch) && pch == 46)) { # Strip unnecessary attribs fsind <- which(names(tmpattr) == "font-size") if (length(fsind) > 0) tmpattr <- tmpattr[-fsind] # Because we really want just a dot, use crispEdges # as anti-aliasing isn't really necessary tmpattr$`shape-rendering` <- "crispEdges" } else { # Make the s-w small so we see a stroke just barely tmpattr$`stroke-width` <- "0.1" # Set the font-size, otherwise it's going to mess with our scaling. # 10px so it's the size of the point definition tmpattr$`font-size` <- "10" } } newXMLNode("use", parent = svgDevParent(svgdev), attrs = attrList(tmpattr)) if (has.link) svgEndLink(svgdev) } # Dispatching function, simply following a naming scheme, # somewhat nasty but works fine svgPoint <- function(pch, svgdev = svgDevice()) { textpch <- FALSE if (is.character(pch)) { if (pch == ".") fnname <- "svgPointDot" else { fnname <- "svgPointChar" textpch <- TRUE } } else { fnname <- paste0("svgPoint", pch) } do.call(fnname, if (textpch) list(pch = pch, svgdev = svgdev) else list(svgdev = svgdev)) } # Special point, the dot svgPointDot <- function(svgdev = svgDevice()) { newXMLNode("rect", parent = svgDevParent(svgdev), attrs = list(x = -0.5, y = -0.5, width = 1, height = 1)) } # Actual point character svgPointChar <- function(pch, svgdev = svgDevice()) { # Transform to "flip" the text back newXMLNode("text", parent = svgDevParent(svgdev), attrs = list(x = 0, y = 0, fontsize = 7.5, transform = "scale(1, -1)", "text-anchor" = "middle", "baseline-shift" = "-25%"), newXMLTextNode(pch)) } # S square svgPoint0 <- function(svgdev = svgDevice()) { newXMLNode("rect", parent = svgDevParent(svgdev), attrs = list(x = -3.75, y = -3.75, width = 7.5, height = 7.5)) } # S octahedron (circle) svgPoint1 <- function(svgdev = svgDevice()) { newXMLNode("circle", parent = svgDevParent(svgdev), attrs = list(cx = 0, cy = 0, r = 3.75)) } # S triangle - point up svgPoint2 <- function(svgdev = svgDevice()) { TRC0 <- sqrt(4 * pi/(3 * sqrt(3))) TRC1 <- TRC0 * sqrt(3) / 2 TRC2 <- TRC0 / 2 r <- TRC0 * 3.75 xc <- TRC1 * 3.75 yc <- TRC2 * 3.75 linexs <- round(c(0, xc, -xc, 0), 2) lineys <- round(c(r, -yc, -yc, r), 2) newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(linexs, lineys, sep = ",", collapse = " "))) } # S plus svgPoint3 <- function(svgdev = svgDevice()) { xc <- sqrt(2) * 3.75 yc <- sqrt(2) * 3.75 l1xs <- round(c(-xc, xc), 2) l1ys <- c(0, 0) l2xs <- c(0, 0) l2ys <- round(c(-yc, yc), 2) # Horizontal newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(l1xs, l1ys, sep = ",", collapse = " "))) # Vertical newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(l2xs, l2ys, sep = ",", collapse = " "))) } # S times svgPoint4 <- function(svgdev = svgDevice()) { xc <- 3.75 yc <- 3.75 l1xs <- c(-xc, xc) l1ys <- c(-yc, yc) l2xs <- c(-xc, xc) l2ys <- c(yc, -yc) # / newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(l1xs, l1ys, sep = ",", collapse = " "))) # \ newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(l2xs, l2ys, sep = ",", collapse = " "))) } # S diamond svgPoint5 <- function(svgdev = svgDevice()) { xc <- sqrt(2) * 3.75 yc <- sqrt(2) * 3.75 linexs <- round(c(-xc, 0, xc, 0, -xc), 2) lineys <- round(c(0, yc, 0, -yc, 0), 2) newXMLNode("polygon", parent = svgDevParent(svgdev), attrs = list(points = paste(linexs, lineys, sep = ",", collapse = " "))) } # S triangle - point down svgPoint6 <- function(svgdev = svgDevice()) { TRC0 <- sqrt(4 * pi/(3 * sqrt(3))) TRC1 <- TRC0 * sqrt(3) / 2 TRC2 <- TRC0 / 2 r <- TRC0 * 3.75 xc <- TRC1 * 3.75 yc <- TRC2 * 3.75 linexs <- round(c(0, xc, -xc, 0), 2) lineys <- round(c(-r, yc, yc, -r), 2) newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(linexs, lineys, sep = ",", collapse = " "))) } # S square and times superimposed svgPoint7 <- function(svgdev = svgDevice()) { svgPoint0(svgdev) svgPoint4(svgdev) } # S plus and times superimposed svgPoint8 <- function(svgdev = svgDevice()) { svgPoint3(svgdev) svgPoint4(svgdev) } # S diamond and plus superimposed svgPoint9 <- function(svgdev = svgDevice()) { svgPoint3(svgdev) svgPoint5(svgdev) } # S hexagon (circle) and plus superimposed svgPoint10 <- function(svgdev = svgDevice()) { newXMLNode("circle", parent = svgDevParent(svgdev), attrs = list(cx = 0, cy = 0, r = 3.75)) l1xs <- c(-3.75, 3.75) l1ys <- c(0, 0) l2xs <- c(0, 0) l2ys <- c(-3.75, 3.75) # Horizontal newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(l1xs, l1ys, sep = ",", collapse = " "))) # Vertical newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(l2xs, l2ys, sep = ",", collapse = " "))) } # S superimposed triangles svgPoint11 <- function(svgdev = svgDevice()) { TRC0 <- sqrt(4 * pi/(3 * sqrt(3))) TRC1 <- TRC0 * sqrt(3) / 2 TRC2 <- TRC0 / 2 xc <- 3.75 r <- TRC0 * xc yc <- TRC2 * xc yc <- 0.5 * (yc + r) xc <- TRC1 * xc # Pointing down linexs <- round(c(0, xc, -xc, 0), 2) lineys <- round(c(-r, yc, yc, -r), 2) newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(linexs, lineys, sep = ",", collapse = " "))) # Pointing up linexs <- round(c(0, xc, -xc, 0), 2) lineys <- round(c(r, -yc, -yc, r), 2) newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(linexs, lineys, sep = ",", collapse = " "))) } # S square and plus superimposed svgPoint12 <- function(svgdev = svgDevice()) { svgPoint0(svgdev) l1xs <- c(-3.75, 3.75) l1ys <- c(0, 0) l2xs <- c(0, 0) l2ys <- c(-3.75, 3.75) # Horizontal newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(l1xs, l1ys, sep = ",", collapse = " "))) # Vertical newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(l2xs, l2ys, sep = ",", collapse = " "))) } # S octagon (circle) and times superimposed svgPoint13 <- function(svgdev = svgDevice()) { svgPoint1(svgdev) svgPoint4(svgdev) } # S square and point-*down* triangle superimposed # Note: R source refers to this as being point-up svgPoint14 <- function(svgdev = svgDevice()) { r <- 3.75 xs <- c(0, r, -r, 0) ys <- c(-r, r, r, -r) newXMLNode("polyline", parent = svgDevParent(svgdev), attrs = list(points = paste(xs, ys, sep = ",", collapse = " "))) newXMLNode("rect", parent = svgDevParent(svgdev), attrs = list(x = -r, y = -r, width = 2*r, height = 2*r)) } # S filled square svgPoint15 <- function(svgdev = svgDevice()) { svgPoint0(svgdev) } # S filled octagon (circle) svgPoint16 <- function(svgdev = svgDevice()) { svgPoint1(svgdev) } # S filled point-up triangle svgPoint17 <- function(svgdev = svgDevice()) { svgPoint2(svgdev) } # S filled diamond svgPoint18 <- function(svgdev = svgDevice()) { svgPoint5(svgdev) } # R filled circle svgPoint19 <- function(svgdev = svgDevice()) { svgPoint1(svgdev) } # R `Dot' (small circle) svgPoint20 <- function(svgdev = svgDevice()) { newXMLNode("circle", parent = svgDevParent(svgdev), attrs = list(cx = 0, cy = 0, r = 2.5)) } # circles svgPoint21 <- function(svgdev = svgDevice()) { svgPoint1(svgdev) } # squares svgPoint22 <- function(svgdev = svgDevice()) { r <- round(sqrt(pi / 4) * 3.75, 2) newXMLNode("rect", parent = svgDevParent(svgdev), attrs = list(x = -r, y = -r, width = 2*r, height = 2*r)) } # diamonds svgPoint23 <- function(svgdev = svgDevice()) { r <- 3.75 * sqrt(pi / 4) * sqrt(2) xs <- round(c(-r, 0, r, 0, -r), 2) ys <- round(c(0, r, 0, -r, 0), 2) newXMLNode("polygon", parent = svgDevParent(svgdev), attrs = list(points = paste(xs, ys, sep = ",", collapse = " "))) } # triangle (point up) svgPoint24 <- function(svgdev = svgDevice()) { svgPoint2(svgdev) } # triangle (point down) svgPoint25 <- function(svgdev = svgDevice()) { svgPoint6(svgdev) } ############# # Internal functions ############# # SVG Devices # A device is an environment so that we can modify values # stored within it. # Store a list of transformation functions for # x, y, width, and height; this will allow viewports # to be defined within user coordinates (see svgPushViewport # and svgPopViewport) svgDevice <- function(width=200, height=200, strict=TRUE, rootAttrs) { dev <- new.env(FALSE, emptyenv()) assign("width", width, envir=dev) assign("height", height, envir=dev) assign("parent", NULL, envir=dev) assign("strict", strict, envir=dev) assign("rootAttrs", rootAttrs, envir=dev) assign("id", 1, envir=dev) return(dev) } svgDevWidth <- function(svgdev) { get("width", envir=svgdev) } svgDevHeight <- function(svgdev) { get("height", envir=svgdev) } svgStrict <- function(svgdev) { get("strict", envir=svgdev) } svgRootAttrs <- function(svgdev) { get("rootAttrs", envir=svgdev) } svgDevParent <- function(svgdev) { get("parent", envir=svgdev) } svgDevChangeParent <- function(newpar, svgdev) { assign("parent", newpar, envir=svgdev) } getid <- function(id, svgdev, n=1) { if (is.null(id)) svgID(svgdev) + (1:n - 1) else { if (n > 1) paste(id, 1:n, sep="") else id } } svgID <- function(svgdev) { get("id", envir=svgdev) } hasLink <- function(link) { ! (is.null(link) || is.na(link)) } incID <- function(svgdev, n=1) { assign("id", get("id", envir=svgdev) + n, envir=svgdev) } svgHeader <- function(width, height, svgdev=svgDevice()) { # This header tested on standalone SVG file in Firefox 3 # FIXME: add default xmlns for animation and scripts too? attrs <- svgRootAttrs(svgdev) # Resolve any conflict between rootAttrs[c("width", "height")] # and 'width' and 'height' passed in (from device size) if (!"width" %in% names(attrs)) { attrs$width <- paste0(round(width, 2), "px") } if (!"height" %in% names(attrs)) { attrs$height <- paste0(round(height, 2), "px") } if (!"viewBox" %in% names(attrs)) { attrs$viewBox <- paste(0, 0, round(width, 2), round(height, 2)) } if (!"version" %in% names(attrs)) { attrs$version <- "1.1" } # Give the element an ID only if there is a prefix AND # 'rootAttrs' does not specify an ID if (!"id" %in% names(attrs)) { if (nzchar(get("prefix", envir = .gridSVGEnv))) { attrs$id <- get("prefix", envir = .gridSVGEnv) } } if (svgStrict(svgdev)) { checkAttrs(attrs, "svg") } svgdoc <- newXMLDoc(namespaces = list("http://www.w3.org/2000/svg", xlink = "http://www.w3.org/1999/xlink"), node = newXMLNode("svg", attrs = attrList(attrs), namespaceDefinitions = list("http://www.w3.org/2000/svg", xlink = "http://www.w3.org/1999/xlink"))) # Invert the y-axis so that y and height values measure "up" rootg <- newXMLNode("g", parent = xmlRoot(svgdoc), attrs = list(transform = paste0("translate(0, ", round(svgDevHeight(svgdev), 2), ") scale(1, -1)"))) svgDevChangeParent(rootg, svgdev) } # SVG attributes svgAttrib <- function(...) { temp <- list(...) if (length(temp) == 0) list() else if (is.null(temp[[1]])) list() else temp } # Removes NULL values and flattens our attrib list # so we can include lists as elements in "alist" # and arrive at a flattened list # ALSO removes names from attr values so they don't corrupt attr names # e.g., avoid list(a=c(b=1)) becoming c(a.b=1) attrList <- function(alist) { as.list(unlist(lapply(alist, unname))) } listToSVGAttrib <- function(alist) { alist } emptyAttrib <- function(attributes) { length(attributes) == 0 } svgClassList <- function(classes) { if (is.null(classes) || ! get("addClasses", envir = .gridSVGEnv)) list() else list(class = paste0(unique(classes), collapse = " ")) } checkAttrs <- function(attrList, eltName) { attrTable <- rbind(get("genAttrTable", .gridSVGEnv), get("presAttrTable", .gridSVGEnv)) validAttrs <- attrTable$attribute[attrTable$element == eltName] names <- names(attrList) svgnames <- names %in% validAttrs if (!all(svgnames)) { warning(paste("Removing non-SVG attribute name(s):", paste(names[!svgnames], collapse=", "))) attrList[names[svgnames]] } else { attrList } } # Only use the attributes that are for this 'id' svgAttribTxt <- function(attributes, id, eltName, svgdev) { if (emptyAttrib(attributes)) { list() } else { attributes <- lapply(attributes, function(attr, id) { kept <- attr[names(attr) == id] if (length(kept) == 0) NULL else kept }, id) # Drop NULL attributes attributes <- attributes[!sapply(attributes, is.null)] # Need to wipe out names because it messes things up when we # need to create an attribute list for nodes if (length(attributes) > 0) { attrs <- lapply(attributes, function(x) { names(x) <- NULL x }) if (svgStrict(svgdev)) { checkAttrs(attrs, eltName) } else { attrs } } else { list() } } } # SVG styling svgStyle <- function(...) { list(...) } listToSVGStyle <- function(alist) { alist } emptyStyle <- function(svgstyle) { length(svgstyle) == 0 } svgStyleCSS <- function(svgstyle) { if (emptyStyle(svgstyle)) { "" } else { paste('style="', do.call("paste", c(mapply(function(name, style) { paste(name, ":", style, sep="") }, names(svgstyle), svgstyle), list(sep="; "))), '"', sep="") # paste('style="', paste(names(svgstyle), ":", # paste(svgstyle), sep="", collapse="; "), # '"', sep="") } } # SVG version of gpar() # NOTE using SVG presentation attributes # RATHER THAN CSS style attribute # BECAUSE ... # - can modify single presentation attribute without affecting # other presentation attributes (if CSS style then have to # reset the entire thing) and can do this from JavaScript. # - presentation attributes have lower priority than CSS style # SO this allows overriding by specifying CSS style later. # Can also override with general style sheet later. svgStyleAttributes <- function(svgstyle, dev) { if (emptyStyle(svgstyle)) { list() } else { # Remove non-SVG style attributes (with warning) names <- names(svgstyle) svgnames <- names %in% get("SVGParList", envir=.gridSVGEnv) if (svgStrict(dev) && any(!svgnames)) { warning(paste("Removing non-SVG style attribute name(s):", paste(names[!svgnames], collapse=", "))) svgstyle <- svgstyle[names[svgnames]] } if (any(sapply(svgstyle, length) > 1)) stop("All SVG style attribute values must have length 1") svgstyle } } # Specifying text justification textAnchor <- function(hjust) { list("text-anchor" = switch(hjust, left="start", center="middle", centre="middle", right="end", "start")) } dominantBaseline <- function(vjust) { list("dominant-baseline" = switch(vjust, bottom="auto", center="middle", centre="middle", top="text-top", "baseline")) } baselineShift <- function(vjust) { list("baseline-shift" = switch(vjust, bottom="0%", center="-50%", centre="-50%", top="-100%", "0%")) } alignmentBaseline <- function(vjust) { list("alignment-baseline" = switch(vjust, baseline="baseline", bottom="bottom", center="middle", centre="middle", top="top", "baseline")) } splitOnNA <- function(x, y) { # Check for non-finite (rather than just NA) nas <- !is.finite(x) | !is.finite(y) wnas <- which(nas) N <- max(length(x), length(y)) start <- c(1, pmin(wnas + 1, N)) end <- c(pmax(wnas - 1, 1), N) xylist <- mapply(function(s, e) { if (e > s) list(x=x[s:e], y=y[s:e]) }, start, end, SIMPLIFY=FALSE) xylist[!sapply(xylist, is.null)] } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/zzz.R�������������������������������������������������������������������������������������0000654�0001762�0000144�00000001457�12622172516�012754� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ .onLoad <- function(libname, pkgname) { genAttrTable <- utils::read.table(system.file("svg", "genAttrTable.txt", package="gridSVG"), col.names=c("attribute", "element"), stringsAsFactors=FALSE) assign("genAttrTable", genAttrTable, envir=.gridSVGEnv) presAttrTable <- utils::read.table(system.file("svg", "presAttrTable.txt", package="gridSVG"), col.names=c("attribute", "element"), stringsAsFactors=FALSE) assign("presAttrTable", presAttrTable, envir=.gridSVGEnv) assign("SVGParList", unique(presAttrTable$attribute), envir=.gridSVGEnv) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/coords.R����������������������������������������������������������������������������������0000654�0001762�0000144�00000002306�12164147366�013410� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVGCoordsGen <- function() { coords <- NULL function(newcoords = NULL) { if (is.null(newcoords)) { coords } else if (length(newcoords) == 1 && is.na(newcoords)) { coords <<- NULL # Wipe existing info if there is only 1 NA } else { # Keep existing information, but overwrite any existing definitions # associated with any given viewport names keepOldName <- ! names(coords) %in% names(newcoords) if (any(keepOldName)) { existingNames <- names(coords)[keepOldName] for (i in 1:length(existingNames)) { newcoords[[existingNames[i]]] <- coords[[existingNames[i]]] } } coords <<- newcoords } } } gridSVGCoords <- gridSVGCoordsGen() validCoordsInfo <- function(vpname) { currCoords <- gridSVGCoords() if (is.null(currCoords)) { stop("No coordinates data has been loaded.") } else if (is.null(currCoords[[vpname]])) { stop("Viewport not found in coordinates data") } else { currCoords } } readCoordsJS <- function(filename) { jsData <- readLines(filename) jsData <- gsub("var gridSVGCoords = ", "", jsData) jsonData <- gsub(";$", "", jsData) fromJSON(paste0(jsonData, collapse = "\n")) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/gtable.R����������������������������������������������������������������������������������0000654�0001762�0000144�00000005551�12632377300�013353� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Here are some fixes so that ggplot2 plots work properly! ggplot2 imports # gtable and includes some nastiness that make it difficult for gridSVG to # parse. To support the ggplot2 package, these compatibility features have # been created. # NOTE that the check for a makeContent.gtable() method will # bail out back to normal processing; this is because there # exists a fork of 'gtable' that does NOT need this special # case handling (and one day that fork may be merged back # into the 'gtable' trunk) grobToDev.gTableChild <- function(x, dev) { if (is.null(getS3method("makeContent", "gtable", TRUE))) { depth <- enforceVP(x$wrapvp, dev) NextMethod() unwindVP(x$wrapvp, depth, dev) } else { NextMethod() } } grobToDev.gTableParent <- function(x, dev) { if (is.null(getS3method("makeContent", "gtable", TRUE))) { depth1 <- enforceVP(x$vp, dev) depth2 <- enforceVP(x$layoutvp, dev) x$classes <- class(x) primToDev(x, dev) unwindVP(x$vp, depth1, dev) unwindVP(x$layoutvp, depth2, dev) } else { NextMethod() } } # Ripped from gtable package's grid.draw.gtable method in grid.r. # Note that the class ordering on a "gTableChild" is switched. gTableGrob <- function(x) { if (length(x$grobs) == 0) return(invisible()) children_vps <- mapply(child_vp, vp_name = vpname(x$layout), t = x$layout$t, r = x$layout$r, b = x$layout$b, l = x$layout$l, clip = x$layout$clip, SIMPLIFY = FALSE) x$grobs <- mapply(wrap_gtableChild, x$grobs, children_vps, SIMPLIFY = FALSE) if (inherits(x, "gTableChild")) { gt <- gTree(children = do.call("gList", x$grobs[order(x$layout$z)]), cl = c("gTableChild", "gTableParent"), vp = x$vp, wrapvp = x$wrapvp, layoutvp = viewport(layout = gtable_layout(x), name = x$name)) } else { gt <- gTree(children = do.call("gList", x$grobs[order(x$layout$z)]), cl = "gTableParent", vp = x$vp, layoutvp = viewport(layout = gtable_layout(x), name = x$name)) } gt } grobToDev.gtable <- function(x, dev) { if (is.null(getS3method("makeContent", "gtable", TRUE))) { grobToDev(gTableGrob(x), dev) } else { NextMethod() } } # Functions borrowed from 'gtable' to keep the package checker happy. gtable_layout <- function(x) { # Commenting out because we won't be here if it's not a gtable # stopifnot(is.gtable(x)) grid.layout( nrow = nrow(x), heights = x$heights, ncol = ncol(x), widths = x$widths, respect = x$respect ) } vpname <- function(row) { paste(row$name, ".", row$t, "-", row$r, "-", row$b, "-", row$l, sep = "") } child_vp <- function(vp_name, t, r, b, l, clip) { viewport(name = vp_name, layout.pos.row = t:b, layout.pos.col = l:r, clip = clip) } wrap_gtableChild <- function(grob, vp) { grob$wrapvp <- vp grob$name <- vp$name class(grob) <- c("gTableChild", class(grob)) grob } �������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/refs.R������������������������������������������������������������������������������������0000654�0001762�0000144�00000027327�12204306301�013045� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is concerned with the use of objects that need to be # referenced, e.g. pattern fills, gradient fills, filters, etc. drawDef <- function(def, dev) { UseMethod("drawDef") } # This function ensures that if we change the ID separator value between # the time of definition and draw time, we still get the expected IDs. assignRefIDs <- function() { refdefs <- get("refDefinitions", envir = .gridSVGEnv) for (i in seq_along(refdefs)) refdefs[[i]]$id <- getLabelID(refdefs[[i]]$label) assign("refDefinitions", refdefs, envir = .gridSVGEnv) # Because the separators might have changed, ensure that the # usageTable has the correct (escaped) values for selectors and xpath ut <- get("usageTable", envir = .gridSVGEnv) inds <- which(ut$type == "ref") for (i in inds) { fullName <- paste(ut[i, "name"], ut[i, "suffix"], sep = getSVGoption("id.sep")) sel <- prefixName(escapeSelector(fullName)) xp <- prefixName(escapeXPath(fullName)) ut[i, "selector"] <- sel ut[i, "xpath"] <- xp } assign("usageTable", ut, envir = .gridSVGEnv) } totalDefinitions <- function() { # This function should only be called for calculating progress bar # length. In addition, it will only be called if definitions are # required to be flushed so this should always return a non-zero # result. sum(get("refUsageTable", envir = .gridSVGEnv)[, "used"]) } flushDefinitions <- function(dev) { svgdev <- dev@dev # Keep copies of old tables because they will be modified when # we draw any children usageTable <- get("usageTable", envir = .gridSVGEnv) vpCoords <- get("vpCoords", envir = .gridSVGEnv) use.vpPaths <- get("use.vpPaths", envir = .gridSVGEnv) use.gPaths <- get("use.gPaths", envir = .gridSVGEnv) uniqueNames <- get("uniqueNames", envir = .gridSVGEnv) # Set required options -- we don't care about what the user # has specified at this point because they shouldn't be # touching any reference definitions assign("use.vpPaths", TRUE, envir = .gridSVGEnv) assign("use.gPaths", TRUE, envir = .gridSVGEnv) assign("uniqueNames", TRUE, envir = .gridSVGEnv) # Begin creating definitions # First ensure we're under #gridSVG rootID <- prefixName("gridSVG") gridSVGNode <- getNodeSet(xmlRoot(svgDevParent(svgdev)), paste0("//*[@id='", rootID, "']"))[[1]] svgDevChangeParent(gridSVGNode, svgdev) refDefinitions <- get("refDefinitions", envir = .gridSVGEnv) pchUsageTable <- get("pchUsageTable", envir = .gridSVGEnv) if (! length(refDefinitions) && ! any(pchUsageTable[, "used"])) return() # fast path for leaving early, avoids creating a defs <- newXMLNode("defs", parent = svgDevParent(svgdev), at = 0) svgDevChangeParent(defs, svgdev) # Check whether we have any dependent references, e.g. have a pattern # fill by reference in use but not the pattern itself. We need to ensure # that both are written out. n <- length(refDefinitions) rut <- get("refUsageTable", envir = .gridSVGEnv) for (i in seq_len(n)) { def <- refDefinitions[[i]] if (isLabelUsed(def$label) && ! is.null(def$refLabel) && ! isLabelUsed(def$refLabel)) rut[rut$label == def$refLabel, "used"] <- TRUE } # Now trying to find out if there are trees of referenced content. for (i in seq_len(n)) { used <- labelsUsed(refDefinitions[[i]]) if (is.null(used)) next flaggedLabels <- used %in% rut$label if (any(flaggedLabels)) rut[flaggedLabels, "used"] <- TRUE } assign("refUsageTable", rut, envir = .gridSVGEnv) # Now can work out how many defs to flush ndefs <- totalDefinitions() progressInit("defs", ndefs) # Now try drawing for (i in seq_len(n)) { def <- refDefinitions[[i]] upViewport(0) if (! is.null(def$vp)) pushViewport(def$vp) if (isLabelUsed(def$label)) drawDef(def, dev) upViewport(0) progressStep("defs", ndefs) } # Resetting to original values assign("vpCoords", vpCoords, envir = .gridSVGEnv) assign("use.vpPaths", use.vpPaths, envir = .gridSVGEnv) assign("use.gPaths", use.gPaths, envir = .gridSVGEnv) assign("uniqueNames", uniqueNames, envir = .gridSVGEnv) # All of the points that have been used in the image will now be flushed. # This is done after any of the other references primarily because # a pattern could use a pch but we want the definition of the pch to # appear beforehand. flushPchs(dev) # Reset ref usage table rut <- get("refUsageTable", envir = .gridSVGEnv) rut$used <- logical(nrow(rut)) assign("refUsageTable", rut, envir = .gridSVGEnv) # Again for usage table assign("usageTable", usageTable, envir = .gridSVGEnv) # Get out of defs svgDevChangeParent(xmlParent(defs), svgdev) } flushPchs <- function(dev) { pchUsageTable <- get("pchUsageTable", envir = .gridSVGEnv) if (! any(pchUsageTable[, "used"])) return() usedPchs <- pchUsageTable[pchUsageTable[, "used"] > 0, "pch"] progressInit("pch", length(usedPchs)) # Reversing so that when we insert at the start of the # the pchs are ordered from small to big, not big to small. # This is purely cosmetic. for (pch in rev(usedPchs)) { asciipch <- if (pch %in% 32:127) rawToChar(as.raw(pch)) else pch devStartSymbol(pch, dev) devPoint(asciipch, dev) devEndSymbol(dev) progressStep("pch") } } anyRefsDefined <- function() { ut <- get("usageTable", envir = .gridSVGEnv) nrow(ut) > 0 && any(ut$type == "ref") } # Methods used for grabbing the list of references used by a definition. # Particularly useful in the case of patterns where it could contain # content which also references other content. In other words, it allows # us to be able to get a tree of dependencies, rather than just a flat # list. labelsUsed <- function(x) { UseMethod("labelsUsed") } labelsUsed.patternFillRefDef <- function(x) { NULL } labelsUsed.filterDef <- function(x) { NULL } labelsUsed.gradientDef <- function(x) { NULL } labelsUsed.patternFillDef <- function(x) { labelsUsed(x$grob) } labelsUsed.maskDef <- function(x) { labelsUsed(x$grob) } labelsUsed.clipPathDef <- function(x) { labelsUsed(x$grob) } labelsUsed.grob <- function(x) { x$referenceLabel } labelsUsed.gTree <- function(x) { c(x$referenceLabel, unlist(lapply(x$children, labelsUsed))) } # Used for knowing whether to write out a definition. # If a definition has not been used we do not write it out. # If it has been used more than once we do not repeat the # definition. isLabelUsed <- function(label) { rut <- get("refUsageTable", envir = .gridSVGEnv) any(rut[rut$label %in% label, "used"]) } setLabelUsed <- function(label) { if (! is.null(label) && length(label)) { rut <- get("refUsageTable", envir = .gridSVGEnv) if (any(rut$label %in% label)) { rut[rut$label %in% label, "used"] <- TRUE assign("refUsageTable", rut, envir = .gridSVGEnv) # Need to ensure that nested dependencies are also handled. # e.g. a mask definition that is filtered needs to trigger a # filter to be drawn. refdefs <- get("refDefinitions", envir = .gridSVGEnv) for (i in seq_along(label)) { def <- refdefs[[label[i]]] setLabelUsed(labelsUsed(def)) } } else { stop("An attempt was made to reference content that no longer exists.") } } } # Convenience function to list all referenced content definitions listSVGDefinitions <- function(print = TRUE) { refdefs <- get("refDefinitions", envir = .gridSVGEnv) n <- length(refdefs) if (!n) return(invisible()) defs <- data.frame(label = character(n), type = character(n), refLabel = character(n), stringsAsFactors = FALSE) for (i in 1:n) { curdef <- refdefs[[i]] defs$label[i] <- curdef$label if (! is.null(curdef$refLabel)) defs$refLabel[i] <- curdef$refLabel defs$type[i] <- switch(class(curdef)[1], clipPathDef = "Clipping Path", filterDef = "Filter Effect", gradientDef = "Gradient Fill", maskDef = "Mask", patternFillDef = "Pattern Fill", patternFillRefDef = "Pattern Fill Reference", "") } if (print) { orderedTypes <- sort(unique(defs$type)) indent <- " " cat("Reference Definitions\n") for (i in 1:length(orderedTypes)) { typesub <- defs[defs$type == orderedTypes[i], ] cat("\n", orderedTypes[i], "s\n", sep = "") for (j in 1:nrow(typesub)) { cat(indent, typesub$label[j], sep = "") # If this is a pattern fill, show us what we're referencing if (nchar(typesub$refLabel[j])) cat(" ", paste0("(referencing ", typesub$refLabel[j], ")"), "\n", sep = "") else cat("\n") } } } invisible(defs) } checkForDefinition <- function(label) { if (! all(label %in% names(get("refDefinitions", envir = .gridSVGEnv)))) stop("A reference definition must be created before using its label") } checkExistingDefinition <- function(label) { if (any(label %in% names(get("refDefinitions", envir = .gridSVGEnv)))) stop(paste("A label already exists as a reference definition")) } # When we need to generate a temporary label (i.e. when specifying a # gradient fill directly on a grob with no label), we supply a prefix and # return a new label that is going to be unique (among labels). # getID() will perform the task of ensuring uniqueness among IDs. getNewLabel <- function(prefix) { i <- 1 candidateName <- paste0(prefix, ".", i) refdefs <- get("refDefinitions", envir = .gridSVGEnv) while(candidateName %in% names(refdefs)) { i <- i + 1 candidateName <- paste0(prefix, getSVGoption("id.sep"), i) } candidateName } getLabelID <- function(label) { ut <- get("usageTable", envir = .gridSVGEnv) suffix <- ut[ut$name %in% label & ut$type == "ref", "suffix"] prefixName(paste0(label, getSVGoption("id.sep"), suffix)) } # This function allows us to collect a viewport that, when pushed into # from the ROOT viewport, should allow us to draw in the same drawing # environment that we called this function from. getAbsoluteVp <- function(vp = current.viewport(), tm = current.transform()) { transloc <- c(0, 0, 1) %*% tm loc <- (transloc / transloc[3])[-3] viewport(x = unit(loc[1], "inches"), y = unit(loc[2], "inches"), width = convertWidth(unit(1, "npc"), "inches"), height = convertHeight(unit(1, "npc"), "inches"), xscale = vp$xscale, yscale = vp$yscale, gp = get.gpar(), just = c("left", "bottom"), angle = vp$angle) } # Used for the case where we want to work out locations in absolute units # *but* do not want to leave the current viewport. Useful when flattening # locations for things such as mask areas. getAbsoluteOffset <- function(tm = current.transform()) { transloc <- c(0, 0, 1) %*% tm loc <- (transloc / transloc[3])[-3] unit(loc, "inches") } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/element.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000005224�12164147366�013552� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Functions for generating arbitrary SVG elements elementGrob <- function(el, name = NULL, attrs = NULL, namespace = NULL, namespaceDefinitions = NULL, children = NULL, vp = NULL, childrenvp = NULL, asis = FALSE) { eg <- gTree(name = name, vp = vp, children = children, childrenvp = childrenvp, cl = "element") # Keeping copy of name because of asis. # If it's TRUE, we leave the id alone. # When FALSE, the resulting id attribute could get modified # by things like gTrees so that the name is a *path*. eg$asis <- asis eg$origname <- eg$name eg$el <- el eg$attrs <- if (is.null(attrs)) list() else attrs eg$namespace <- namespace eg$namespaceDefinitions <- namespaceDefinitions cl <- class(eg) class(eg) <- unique(c("element.grob", cl)) eg } grid.element <- function(el, name = NULL, attrs = NULL, namespace = NULL, namespaceDefinitions = NULL, children = NULL, vp = NULL, childrenvp = NULL, asis = FALSE) { grid.draw(elementGrob(el, name, attrs, namespace, namespaceDefinitions, children, vp, childrenvp, asis)) } devGrob.element.grob <- function(x, dev) { list(id = if (x$asis) x$origname else getID(x$name, "grob"), name = x$el, classes = x$classes, attrs = x$attrs, namespace = x$namespace, namespaceDefinitions = x$namespaceDefinitions) } # Unlike gTrees, we don't need a group for children because it # complicates output, when we want clear output to SVG. # Also, do *not* add gpars because they also complicate output, # if we *really* want to do it, then just use the 'attrs' arg. primToDev.element.grob <- function(x, dev) { devStartElement(devGrob(x, dev), NULL, dev) lapply(x$children, function(child) { grobToDev(child, dev) }) devEndElement(x$name, dev) } devGrob.textnode.grob <- function(x, dev) { list(text = x$text) } primToDev.textnode.grob <- function(x, dev) { devTextNode(devGrob(x, dev), dev) } textNodeGrob <- function(text, name = NULL, vp = NULL) { if (length(text) > 1) stop("'text' must be a single element character vector") tng <- grob(name = name, vp = vp, cl = "textNode") tng$text <- text cl <- class(tng) class(tng) <- unique(c("textnode.grob", cl)) tng } grid.textNode <- function(text, name = NULL, vp = NULL) { grid.draw(textNodeGrob(text, name, vp)) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/patterns.R��������������������������������������������������������������������������������0000654�0001762�0000144�00000026026�12240527563�013760� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������grid.patternFill <- function(path, pattern = NULL, label = NULL, alpha = 1, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) { if (is.null(label) & is.null(pattern)) { stop("At least one of 'label' or 'pattern' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.patternFill") registerPatternFill(label, pattern) pattern <- NULL # use the ref from now on } else if (is.null(pattern)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerPatternFill(label, pattern) pattern <- NULL # use the ref from now on } grobApply(path, function(path) { grid.set(path, patternFillGrob(grid.get(path), pattern = pattern, label = label, alpha = alpha, group = group), redraw = redraw) }, strict = strict, grep = grep, global = global) invisible() } patternFillGrob <- function(x, pattern = NULL, label = NULL, alpha = 1, group = TRUE) { if (is.null(label) & is.null(pattern)) { stop("At least one of 'label' or 'pattern' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.patternFill") registerPatternFill(label, pattern) } else if (is.null(pattern)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerPatternFill(label, pattern) } if (length(alpha) != length(label)) alpha <- rep(alpha, length.out = length(label)) x$referenceLabel <- c(x$referenceLabel, label) # Attribs to be garnished *at draw time*. In particular needs to be # done because the label ID is not known until then, because of things # like prefixes and separators. x$patternFillLabel <- label x$patternFillAlpha <- alpha x$patternFillGroup <- group class(x) <- unique(c("patternFilled.grob", class(x))) x } pattern <- function(grob = NULL, x = unit(0, "npc"), y = unit(0, "npc"), width = unit(0.1, "npc"), height = unit(0.1, "npc"), default.units = "npc", just = "centre", hjust = NULL, vjust = NULL, dev.width = 7, dev.height = 7) { if (! is.unit(x)) x <- unit(x, default.units) if (! is.unit(y)) y <- unit(y, default.units) if (! is.unit(width)) width <- unit(width, default.units) if (! is.unit(height)) height <- unit(height, default.units) pattern <- list(grob = grob, x = x, y = y, width = width, height = height, just = just, hjust = hjust, vjust = vjust, dev.width = dev.width, dev.height = dev.height) class(pattern) <- "pattern" pattern } registerPatternFill <- function(label, pattern = NULL, ...) { checkExistingDefinition(label) refDefinitions <- get("refDefinitions", envir = .gridSVGEnv) if (is.null(pattern)) { pattern <- gridSVG::pattern(...) } else if (! inherits(pattern, "pattern")) { stop("'pattern' must be a 'pattern' object") } if (is.null(pattern$grob)) stop("A grob must be given for a fill pattern definition") # Now convert *at time of definition* to absolute units (inches) loc <- leftbottom(pattern$x, pattern$y, pattern$width, pattern$height, pattern$just, pattern$hjust, pattern$vjust, NULL) x <- loc$x y <- loc$y width <- convertWidth(pattern$width, "inches") height <- convertHeight(pattern$height, "inches") # ID will be overwritten later, because we might change # the separator used for "id.sep" defList <- list( label = label, id = getID(label, "ref"), grob = pattern$grob, vp = getAbsoluteVp(), x = x, y = y, width = width, height = height, dev.width = pattern$dev.width, dev.height = pattern$dev.height ) class(defList) <- "patternFillDef" refDefinitions[[label]] <- defList assign("refDefinitions", refDefinitions, envir = .gridSVGEnv) assign("refUsageTable", rbind(get("refUsageTable", envir = .gridSVGEnv), data.frame(label = label, used = FALSE, stringsAsFactors = FALSE)), envir = .gridSVGEnv) # Return NULL invisibly because we don't actually care what the # definition looks like until gridSVG tries to draw it. invisible() } registerPatternFillRef <- function(label, refLabel, pattern = NULL, ...) { checkExistingDefinition(label) refDefinitions <- get("refDefinitions", envir = .gridSVGEnv) if (! refLabel %in% names(refDefinitions)) stop(paste("The reference labelled", sQuote(label), "does not exist.")) if (is.null(pattern)) { pattern <- gridSVG::pattern(...) } else if (! inherits(pattern, "pattern")) { stop("'pattern' must be a 'pattern' object") } # Now convert *at time of definition* to absolute units (inches) offsets <- getAbsoluteOffset() loc <- leftbottom(pattern$x, pattern$y, pattern$width, pattern$height, pattern$just, pattern$hjust, pattern$vjust, NULL) x <- loc$x + offsets[1] y <- loc$y + offsets[2] width <- convertWidth(pattern$width, "inches") height <- convertHeight(pattern$height, "inches") defList <- list( label = label, refLabel = refLabel, id = getID(label, "ref"), x = x, y = y, width = width, height = height ) class(defList) <- "patternFillRefDef" refDefinitions[[label]] <- defList assign("refDefinitions", refDefinitions, envir = .gridSVGEnv) assign("refUsageTable", rbind(get("refUsageTable", envir = .gridSVGEnv), data.frame(label = label, used = FALSE, stringsAsFactors = FALSE)), envir = .gridSVGEnv) # Return NULL invisibly because we don't actually care what the # definition looks like until gridSVG tries to draw it. invisible() } primToDev.patternFilled.grob <- function(x, dev) { setLabelUsed(x$referenceLabel) label <- getLabelID(x$patternFillLabel) # Allowing fill-opacity to be set by a garnish because # grid only knows about a colour and its opacity. If we use a # reference instead of a then nothing is known about the opacity. # We want to ensure that we can still set it, so use the garnish # to overwrite it. pg <- garnishGrob(x, fill = paste0("url(#", label, ")"), "fill-opacity" = x$patternFillAlpha, group = x$patternFillGroup) # Now need to remove all pattern fill appearances in the class list. # This is safe because repeated pattern filling just clobbers existing # attributes. cl <- class(pg) class(pg) <- cl[cl != "patternFilled.grob"] primToDev(pg, dev) } drawDef.patternFillDef <- function(def, dev) { svgdev <- dev@dev # Convert grid coords to SVG coords x <- round(cx(def$x, dev), 2) y <- round(cy(def$y, dev), 2) width <- round(cw(def$width, dev), 2) height <- round(ch(def$height, dev), 2) # Checking for flipped scales if (width < 0) { x <- x + width # shifts x to the left width <- abs(width) } if (height < 0) { y <- y + height # shifts y down height <- abs(height) } # Attempt to use a known-safe prefix # If the prefix is safe, then it will *always* be safe # because the names are known *after* content is drawn # and the referenced labels must be unique prefix <- paste0("gridSVG.patternFill.", def$id) # There is a little bit of replication going on from # 'grid.export' but it avoids some problems. # We could use 'grid.export' recursively but we lose the ability to # definitely generate unique names if that is the case because usage # tables would be wiped. # A viewport and gTree are forced to ensure everything is unique because # we want paths to be used. # We do not care at this point whether it is strictly necessary to # perform all of this because we just want unique IDs. olddev <- dev.cur() pdf(file = NULL, width = def$dev.width, height = def$dev.height) newdev <- openSVGDev("", res = dev@res, width = def$dev.width, height = def$dev.height) pushViewport(viewport(name = getID(prefix, "vp"))) grid.draw(gTree(name = getID(prefix, "grob"), children = gList(grid.force(def$grob)), gp = get.gpar())) # Force gp to ensure correct styling grid.force(redraw = FALSE) gt <- grid.grab(name = "gridSVG", wrap = TRUE) gridToDev(gt, newdev) newroot <- devClose(newdev) viewBox <- xmlGetAttr(newroot, "viewBox") gridSVGNode <- prefixName("gridSVG") # Clone this node so that when the pattern definition refers to # namespaces (e.g. rasterGrobs have 'xlink:href'), the namespaces # are not destroyed when this temporary device is closed. gridSVGNode <- xmlClone(getNodeSet(newroot, paste0("//*[@id='", gridSVGNode, "']"))[[1]]) dev.off() dev.set(olddev) # Creating the pattern element pattern <- newXMLNode("pattern", attrs = list(id = def$id, x = x, y = y, width = width, height = height, viewBox = viewBox, patternUnits = "userSpaceOnUse"), parent = svgDevParent(svgdev)) # Assigning its children xmlChildren(pattern) <- xmlChildren(gridSVGNode) } drawDef.patternFillRefDef <- function(def, dev) { svgdev <- dev@dev # Convert grid coords to SVG coords x <- round(cx(def$x, dev), 2) y <- round(cy(def$y, dev), 2) width <- round(cw(def$width, dev), 2) height <- round(ch(def$height, dev), 2) # Checking for flipped scales if (width < 0) { x <- x + width # shifts x to the left width <- abs(width) } if (height < 0) { y <- y + height # shifts y down height <- abs(height) } # Creating the pattern element pattern <- newXMLNode("pattern", attrs = list(id = def$id, x = x, y = y, width = width, height = height, "xlink:href" = paste0("#", getLabelID(def$refLabel))), parent = svgDevParent(svgdev)) } # Ensure the patterns are retained on a forced grob forceGrob.patternFilled.grob <- function(x) { y <- NextMethod() if (inherits(y, "forcedgrob")) { y$referenceLabel <- x$referenceLabel y$patternFillLabel <- x$patternFillLabel y$patternFillAlpha <- x$patternFillAlpha y$patternFillGroup <- x$patternFillGroup class(y) <- unique(c("patternFilled.grob", class(y))) } y } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/filters.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000100754�12513622714�013566� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# High level functions for applying filters to grobs grid.filter <- function(path, filter = NULL, label = NULL, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) { if (is.null(filter) & is.null(label)) { stop("At least one of 'filter' or 'label' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.filter") registerFilter(label, filter) filter <- NULL # use the ref from now on } else if (is.null(filter)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerFilter(label, filter) filter <- NULL # use the ref from now on } grobApply(path, function(path) { grid.set(path, filterGrob(grid.get(path), filter = filter, label = label, group = group), redraw = redraw) }, strict = strict, grep = grep, global = global) invisible() } filterGrob <- function(x, filter = NULL, label = NULL, group = TRUE) { if (is.null(filter) & is.null(label)) { stop("At least one of 'filter' or 'label' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.filter") registerFilter(label, filter) } else if (is.null(filter)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerFilter(label, filter) } x$referenceLabel <- c(x$referenceLabel, label) # Attribs to be garnished *at draw time*. In particular needs to be # done because the label ID is not known until then, because of things # like prefixes and separators. x$filterLabel <- label x$filterGroup <- group class(x) <- unique(c("filtered.grob", class(x))) x } primToDev.filtered.grob <- function(x, dev) { setLabelUsed(x$referenceLabel) label <- getLabelID(x$filterLabel) fg <- garnishGrob(x, filter = paste0("url(#", label, ")"), group = x$filterGroup) # Now need to remove all filter appearances in the class list. # This is safe because repeated filtering just clobbers existing # attributes. cl <- class(fg) class(fg) <- cl[cl != "filtered.grob"] primToDev(fg, dev) } filterEffect <- function(feList = NULL, filterUnits = c("coords", "bbox"), x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", primitiveUnits = c("coords", "bbox")) { filterUnits <- match.arg(filterUnits) primitiveUnits <- match.arg(primitiveUnits) if (is.null(feList)) feList <- list() if (inherits(feList, "filter.effect")) feList <- list(feList) if (! is.unit(x)) x <- unit(x, default.units) if (! is.unit(y)) y <- unit(y, default.units) if (! is.unit(width)) width <- unit(width, default.units) if (! is.unit(height)) height <- unit(height, default.units) # Convert filterUnits to SVG values filterUnits <- switch(filterUnits, bbox = "objectBoundingBox", coords = "userSpaceOnUse") primitiveUnits <- switch(primitiveUnits, bbox = "objectBoundingBox", coords = "userSpaceOnUse") # Need to get npc-like values from units if (filterUnits == "objectBoundingBox") { # Convert to npc x <- convertX(x, "npc", valueOnly = TRUE) y <- convertY(y, "npc", valueOnly = TRUE) width <- convertWidth(width, "npc", valueOnly = TRUE) height <- convertHeight(height, "npc", valueOnly = TRUE) } filter <- list(filterUnits = filterUnits, primitiveUnits = primitiveUnits, x = x, y = y, width = width, height = height, just = just, hjust = hjust, vjust = vjust, children = feList) class(filter) <- "filter" filter } "[.filter" <- function(x, index, ...) { x$children <- x$children[index] x } "[[.filter" <- function(x, index, ...) { x$children[[index]] } "[<-.filter" <- function(x, index, ..., value) { x$children[index] <- value x } "[[<-.filter" <- function(x, index, ..., value) { if (! inherits(value, "filter.effect")) stop("Invalid value to assign") x$children[[index]] <- value x } addFilterEffect <- function(filter, filterEffect, after = NA) { if (! inherits(filter, "filter")) stop("'filter' is not an 'filter' object") if (! inherits(filterEffect, "filter.effect")) stop("'filterEffect' is not a 'filter.effect' object") # Assume last if (is.na(after)) after <- length(filter$children) filter$children[[after + 1]] <- filterEffect filter } flatten <- function(x, coords) { UseMethod("flatten") } flatten.filter <- function(x, coords = TRUE) { if (coords) { loc <- leftbottom(x$x, x$y, x$width, x$height, x$just, x$hjust, x$vjust, NULL) x$x <- loc$x x$y <- loc$y x$width <- convertWidth(x$width, "inches") x$height <- convertHeight(x$height, "inches") } else { # location and width are relative to the object bounding box # (i.e., NOT grid units) hjust <- resolveHJust(x$just, x$hjust) vjust <- resolveVJust(x$just, x$vjust) x$x <- x$x - hjust*x$width x$y <- x$y - vjust*x$height } # Now flatten all children x$children <- lapply(x$children, flatten, x$primitiveUnits == "userSpaceOnUse") x } registerFilter <- function(label, filter) { checkExistingDefinition(label) if (! length(filter$children)) stop("No filter effects exist for this filter.") # Flattening all locations filter <- flatten(filter, filter$filterUnits == "userSpaceOnUse") filter$label <- label filter$id <- getID(label, "ref") filter$vp <- getAbsoluteVp() class(filter) <- "filterDef" refDefinitions <- get("refDefinitions", envir = .gridSVGEnv) refDefinitions[[label]] <- filter assign("refDefinitions", refDefinitions, envir = .gridSVGEnv) assign("refUsageTable", rbind(get("refUsageTable", envir = .gridSVGEnv), data.frame(label = label, used = FALSE, stringsAsFactors = FALSE)), envir = .gridSVGEnv) # Return NULL invisibly because we don't actually care what the # definition looks like until gridSVG tries to draw it. invisible() } svgFilter <- function(def, dev) { svgdev <- dev@dev if (def$filterUnits == "userSpaceOnUse") { def$x <- cx(def$x, dev) def$y <- cy(def$y, dev) def$width <- cw(def$width, dev) def$height <- ch(def$height, dev) } filter <- newXMLNode("filter", attrs = list(id = def$id, x = round(def$x, 2), y = round(def$y, 2), width = round(def$width, 2), height = round(def$height, 2), filterUnits = def$filterUnits, primitiveUnits = def$primitiveUnits), parent = svgDevParent(svgdev)) svgDevChangeParent(filter, svgdev) } drawDef.filterDef <- function(def, dev) { svgdev <- dev@dev svgFilter(def, dev) # Adding the gradient stops children <- def$children for (i in 1:length(children)) { oldclass <- class(children[[i]]) child <- cleanAttrs(children[[i]], c("just", "hjust", "vjust")) child <- compileUnits(child, def$primitiveUnits == "userSpaceOnUse", dev) class(child) <- oldclass filterSVG(child, dev) } # Going back up from the filter to the parent of the filter svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) } # Remove unnecessary attributes cleanAttrs <- function(x, attrs = "") { ns <- names(x) rmInds <- which(ns %in% attrs) if (length(rmInds)) x[-rmInds] else x } # All filter effects have these in common, # compile the units to px to allow us to have more specific # methods later compileUnits <- function(x, coords, dev) { # Only resolve child x/y/w/h to px if UserSpaceOnUse # (otherwise, x/y/w/h are already just [bbox] values) if (coords) { x$x <- cx(x$x, dev) x$y <- cy(x$y, dev) x$width <- cw(x$width, dev) x$height <- ch(x$height, dev) } x } # rounding all numerics to 2 dp roundAttribs <- function(x) { lapply(x, function(a) { if (is.numeric(a)) round(a, 2) else a }) } filterSVG <- function(x, dev) { UseMethod("filterSVG") } ################## # Filter Effects # ################## # Light sources flatten.filter.effect <- function(x, coords = TRUE) { loc <- leftbottom(x$x, x$y, x$width, x$height, x$just, x$hjust, x$vjust, NULL) if (coords) { x$x <- loc$x x$y <- loc$y x$width <- convertWidth(x$width, "inches") x$height <- convertHeight(x$height, "inches") } else { x$x <- convertX(loc$x, "npc", valueOnly = TRUE) x$y <- convertY(loc$y, "npc", valueOnly = TRUE) x$width <- convertWidth(x$width, "npc", valueOnly = TRUE) x$height <- convertHeight(x$height, "npc", valueOnly = TRUE) } x$coords <- coords x } fe <- function(..., x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), just = "centre", hjust = NULL, vjust = NULL, default.units = "npc", result = NULL) { if (! is.unit(x)) x <- unit(x, default.units) if (! is.unit(y)) y <- unit(y, default.units) if (! is.unit(width)) width <- unit(width, default.units) if (! is.unit(height)) height <- unit(height, default.units) x <- list(x = x, y = y, width = width, height = height, just = just, hjust = hjust, vjust = vjust) if (! is.null(result) && nzchar(result)) x$result <- result x <- c(x, list(...)) class(x) <- "filter.effect" x } filterSVG.fe.distant.light <- function(x, dev) { svgdev <- dev@dev x <- cleanAttrs(x, "coords") newXMLNode("feDistantLight", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feDistantLight <- function(azimuth = 0, elevation = 0, ...) { x <- fe(azimuth = azimuth, elevation = elevation, ...) class(x) <- c("fe.distant.light", class(x)) x } flatten.fe.point.light <- function(x, coords = TRUE) { if (coords) { x$z <- if (x$zdim == "x") convertX(x$z, "inches") else convertY(x$z, "inches") } else { x$z <- if (x$dzim == "x") convertX(x$z, "npc", valueOnly = TRUE) else convertY(x$z, "npc", valueOnly = TRUE) } x$coords <- coords NextMethod() } filterSVG.fe.point.light <- function(x, dev) { svgdev <- dev@dev if (x$coords) x$z <- if (x$zdim == "x") cx(x$z, dev) else cy(x$z, dev) attrList <- cleanAttrs(x, c("coords", "zdim")) newXMLNode("fePointLight", attrs = roundAttribs(attrList), parent = svgDevParent(svgdev)) } fePointLight <- function(z = unit(0, "npc"), default.units = "npc", zdim = "x", ...) { if (! is.unit(z)) z <- unit(z, default.units) x <- fe(z = z, zdim = zdim, default.units = default.units, ...) class(x) <- c("fe.point.light", class(x)) x } flatten.fe.spot.light <- function(x, coords = TRUE) { if (coords) { x$z <- if (x$zdim == "x") convertX(x$z, "inches") else convertY(x$z, "inches") x$pointsAtZ <- if (x$zdim == "x") convertX(x$pointsAtZ, "inches") else convertY(x$pointsAtZ, "inches") x$pointsAtX <- convertX(x$pointsAtX, "inches") x$pointsAtY <- convertY(x$pointsAtY, "inches") } else { x$z <- if (x$dzim == "x") convertX(x$z, "npc", valueOnly = TRUE) else convertY(x$z, "npc", valueOnly = TRUE) x$pointsAtZ <- if (x$zdim == "x") convertX(x$pointsAtZ, "npc", valueOnly = TRUE) else convertY(x$pointsAtZ, "npc", valueOnly = TRUE) x$pointsAtX <- convertX(x$pointsAtX, "npc", valueOnly = TRUE) x$pointsAtY <- convertY(x$pointsAtY, "npc", valueOnly = TRUE) } x$coords <- coords NextMethod() } filterSVG.fe.spot.light <- function(x, dev) { svgdev <- dev@dev if (x$coords) { x$z <- if (x$zdim == "x") cw(x$z, dev) else cy(x$z, dev) x$pointsAtZ <- if (x$zdim == "x") cw(x$pointsAtZ, dev) else cy(x$pointsAtZ, dev) x$pointsAtX <- cx(x$x, dev) x$pointsAtY <- cy(x$pointsAtY, dev) } attrList <- cleanAttrs(x, c("coords", "zdim")) newXMLNode("feSpotLight", attrs = roundAttribs(attrList), parent = svgDevParent(svgdev)) } feSpotLight <- function(x = unit(0, "npc"), y = unit(0, "npc"), z = unit(0, "npc"), pointsAtX = unit(1, "npc"), pointsAtY = unit(1, "npc"), pointsAtZ = unit(0, "npc"), zdim = "x", default.units = "npc", specularExponent = 1, limitingConeAngle = NA, ...) { if (! is.unit(x)) x <- unit(x, default.units) if (! is.unit(y)) y <- unit(y, default.units) if (! is.unit(z)) z <- unit(z, default.units) if (! is.unit(pointsAtX)) pointsAtX <- unit(pointsAtX, default.units) if (! is.unit(pointsAtY)) pointsAtY <- unit(pointsAtY, default.units) if (! is.unit(pointsAtZ)) pointsAtZ <- unit(pointsAtZ, default.units) x <- fe(x = x, y = y, z = z, pointsAtX = pointsAtX, pointsAtY = pointsAtY, pointsAtZ = pointsAtZ, zdim = zdim, default.units = default.units, specularExponent = specularExponent, ...) if (! is.na(limitingConeAngle)) x$limitingConeAngle <- limitingConeAngle class(x) <- c("fe.spot.light", class(x)) x } filterSVG.fe.blend <- function(x, dev) { svgdev <- dev@dev x <- cleanAttrs(x, "coords") newXMLNode("feBlend", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feBlend <- function(input1 = NA, input2 = NA, mode = c("normal", "multiply", "screen", "darken", "lighten"), ...) { x <- fe(mode = match.arg(mode), ...) if (! is.na(input1)) x$`in` <- input1 if (! is.na(input2)) x$in2 <- input2 class(x) <- c("fe.blend", class(x)) x } filterSVG.fe.color.matrix <- function(x, dev) { svgdev <- dev@dev attrList <- x if (x$type == "luminanceToAlpha") attrList <- cleanAttrs(attrList, "values") if (x$type == "matrix") attrList$values <- paste0(c(attrList$values), collapse = " ") attrList <- cleanAttrs(attrList, "coords") newXMLNode("feColorMatrix", attrs = roundAttribs(attrList), parent = svgDevParent(svgdev)) } feColorMatrix <- function(input = NA, type = c("matrix", "saturate", "hueRotate", "luminanceToAlpha"), values = NULL, ...) { # Checking validity of args if (type == "matrix" && (! is.matrix(values) || ! dim(values) == c(4, 5))) stop("'values' must be a 4x5 numeric matrix when 'type' is 'matrix'") if (type == "saturate" && ! is.numeric(values)) stop("'values' must be a single element numeric vector for 'saturate'") if (type == "hueRotate" && ! is.numeric(values)) stop("'values' must be a single element numeric vector for 'hueRotate'") if (type == "luminanceToAlpha" && ! is.null(values)) stop("'values' must be NULL for the 'luminanceToAlpha' color matrix effect") # Clamp values to valid bounds if (type == "matrix") # Need to transpose matrix so that it is written out in row-order values <- t(matrix(pmax(0, pmin(1, values)), ncol = 5, nrow = 4)) if (type == "saturate") values <- max(0, min(1, values)) if (type == "hueRotate") values <- values %% 360 x <- fe(type = match.arg(type), values = values, ...) if (! is.na(input)) x$`in` <- input class(x) <- c("fe.color.matrix", class(x)) x } filterSVG.fe.component.transfer <- function(x, dev) { svgdev <- dev@dev parentAttrs <- cleanAttrs(x, c("coords", "transfers")) children <- x$transfers cm <- newXMLNode("feComponentTransfer", attrs = roundAttribs(parentAttrs), parent = svgDevParent(svgdev)) if (! length(children)) return() svgDevChangeParent(cm, svgdev) for (i in 1:length(children)) { child <- children[[i]] child$channel <- names(children)[i] filterSVG(child, dev) } svgDevChangeParent(xmlParent(cm), svgdev) } feComponentTransfer <- function(input = NA, transfers = NULL, ...) { if (is.null(transfers)) transfers <- list() x <- fe(transfers = transfers, ...) if (! is.na(input)) x$`in` <- input class(x) <- c("fe.component.transfer", class(x)) x } addComponentFunction <- function(ct, channel = c("R", "G", "B", "A"), func) { if (! inherits(ct, "fe.component.transfer")) stop("'ct' must be a 'fe.component.transfer' object") if (! inherits(func, "transfer.function")) stop("'func' must be a 'transfer.function' object") ct$children[[channel]] <- func ct } filterSVG.transfer.function <- function(x, dev) { svgdev <- dev@dev # Need to format tableValues as a whitespace/comma separated list if (x$type == "table" | x$type == "discrete") x$tableValues <- paste0(round(x$tableValues, 2), collapse = " ") x <- cleanAttrs(x, "coords") newXMLNode(paste0("feFunc", x$channel), attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } transferFunction <- function(type = c("identity", "table", "discrete", "linear", "gamma"), tableValues = numeric(), slope = 1, intercept = 0, amplitude = 1, exponent = 1, offset = 0) { x <- list(type = match.arg(type)) if (x$type == "table" | x$type == "discrete") { if (! length(tableValues)) stop("A non-zero vector of numeric values must be provided") x$tableValues <- tableValues } if (x$type == "linear") { x$slope <- slope x$intercept <- intercept } if (x$type == "") { x$amplitude <- amplitude x$exponent <- exponent x$offset <- offset } class(x) <- "transfer.function" x } filterSVG.fe.composite <- function(x, dev) { svgdev <- dev@dev x <- cleanAttrs(x, "coords") newXMLNode("feComposite", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feComposite <- function(input1 = NA, input2 = NA, operator = c("over", "in", "out", "atop", "xor", "arithmetic"), k1 = 0, k2 = 0, k3 = 0, k4 = 0, ...) { x <- fe(operator = match.arg(operator), ...) if (! is.na(input1)) x$`in` <- input1 if (! is.na(input2)) x$in2 <- input2 if (x$operator == "arithmetic") { x$k1 <- k1 x$k2 <- k2 x$k3 <- k3 x$k4 <- k4 } class(x) <- c("fe.composite", class(x)) x } filterSVG.fe.convolve.matrix <- function(x, dev) { svgdev <- dev@dev if (length(x$order) > 1) x$order <- paste0(x$order, collapse = " ") if (! is.null(x$kernelUnitLength)) x$kernelUnitLength <- paste0(round(x$kernelUnitLength, 2), collapse = " ") x$kernelMatrix <- paste0(apply(x$kernelMatrix, 1, function(x) { paste0(round(x, 2), collapse = " ") }), collapse = " ") x <- cleanAttrs(x, "coords") newXMLNode("feConvolveMatrix", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feConvolveMatrix <- function(input = NA, order = 3, kernelMatrix = matrix(), divisor = 1, bias = 0, targetX = 1, targetY = 1, edgeMode = c("duplicate", "wrap", "none"), kernelUnitLength = NA, preserveAlpha = FALSE, ...) { # Note that defaults for targetX and targetY are: floor(order[1:2] / 2) # This is going to be 1 by default, as floor(1.5) is 1 if (length(order) == 1) order <- rep(order, 2) if (length(kernelMatrix) != (order[1] * order[2])) stop("Invalid number of entries for 'kernelMatrix'") x <- fe(order = order, kernelMatrix = kernelMatrix, divisor = divisor, bias = bias, targetX = targetX, targetY = targetY, edgeMode = match.arg(edgeMode), preserveAlpha = preserveAlpha, ...) if (! is.na(input)) x$`in` <- input if (! is.na(kernelUnitLength)) { if (length(kernelUnitLength) == 1) kernelUnitLength <- rep(kernelUnitLength, 2) x$kernelUnitLength <- kernelUnitLength } class(x) <- c("fe.convolve.matrix", class(x)) x } flatten.fe.diffuse.lighting <- function(x, coords = TRUE) { x$lightSource <- flatten(x$lightSource, coords) x$coords <- coords NextMethod() } filterSVG.fe.diffuse.lighting <- function(x, dev) { svgdev <- dev@dev if (! is.null(x$kernelUnitLength)) x$kernelUnitLength <- paste0(round(x$kernelUnitLength, 2), collapse = " ") diffl <- cleanAttrs(x, c("coords", "lightSource")) fedl <- newXMLNode("feDiffuseLighting", attrs = roundAttribs(diffl), parent = svgDevParent(svgdev)) svgDevChangeParent(fedl, svgdev) filterSVG(x$lightSource, dev) svgDevChangeParent(xmlParent(fedl), svgdev) } feDiffuseLighting <- function(input = NA, surfaceScale = 1, diffuseConstant = 1, kernelUnitLength = NA, col = "white", lightSource = NULL, ...) { if (is.null(lightSource)) stop("A light source must be provided") if (diffuseConstant < 0) stop("'diffuseConstant' must be non-negative") x <- fe(surfaceScale = surfaceScale, diffuseConstant = diffuseConstant, "lighting-color" = c(col2rgb(col)), lightSource = lightSource, ...) if (! is.na(input)) x$`in` <- input if (! is.na(kernelUnitLength)) { if (length(kernelUnitLength) == 1) kernelUnitLength <- rep(kernelUnitLength, 2) x$kernelUnitLength <- kernelUnitLength } class(x) <- c("fe.diffuse.lighting", class(x)) x } filterSVG.fe.displacement.map <- function(x, dev) { svgdev <- dev@dev x <- cleanAttrs(x, "coords") newXMLNode("feDisplacementMap", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feDisplacementMap <- function(input1 = NA, input2 = NA, scale = 0, xChannelSelector = c("A", "R", "G", "B"), yChannelSelector = c("A", "R", "G", "B"), ...) { x <- fe(scale = scale, xChannelSelector = match.arg(xChannelSelector), yChannelSelector = match.arg(yChannelSelector), ...) if (! is.na(input1)) x$`in` <- input1 if (! is.na(input2)) x$in2 <- input2 class(x) <- c("fe.displacement.map", class(x)) x } filterSVG.fe.flood <- function(x, dev) { svgdev <- dev@dev x <- cleanAttrs(x, "coords") newXMLNode("feFlood", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feFlood <- function(col = "black", ...) { cols <- c(col2rgb(col, alpha = TRUE)) x <- fe("flood-color" = paste0("rgb(", paste0(cols[1:3], collapse = ", "), ")"), "flood-opacity" = cols[4] / 255, ...) class(x) <- c("fe.flood", class(x)) x } filterSVG.fe.gaussian.blur <- function(x, dev) { svgdev <- dev@dev if (length(x$stdDeviation) > 1) x$stdDeviation <- paste0(round(x$stdDeviation, 2), collapse = " ") x <- cleanAttrs(x, "coords") newXMLNode("feGaussianBlur", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feGaussianBlur <- function(input = NA, sd = 0, ...) { x <- fe(stdDeviation = sd, ...) if (! is.na(input)) x$`in` <- input class(x) <- c("fe.gaussian.blur", class(x)) x } filterSVG.fe.image <- function(x, dev) { svgdev <- dev@dev x <- cleanAttrs(x, "coords") newXMLNode("feImage", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feImage <- function(preserveAspectRatio = "xMidYMid meet", href = "", ...) { # Docs: http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute x <- fe(preserveAspectRatio = preserveAspectRatio, externalResourcesRequired = TRUE, "xlink:href" = href, ...) class(x) <- c("fe.image", class(x)) x } filterSVG.fe.merge <- function(x, dev) { svgdev <- dev@dev children <- x$mergeNodes par <- cleanAttrs(x, c("coords", "mergeNodes")) merge <- newXMLNode("feMerge", attrs = roundAttribs(par), parent = svgDevParent(svgdev)) if (! length(children)) return() svgDevChangeParent(merge, svgdev) for (i in 1:length(children)) filterSVG(children[[i]], dev) svgDevChangeParent(xmlParent(merge), svgdev) } feMerge <- function(mergeNodes = NULL, ...) { if (is.null(mergeNodes)) mergeNodes <- list() if (inherits(mergeNodes, "fe.merge.node")) mergeNodes <- list(mergeNodes) x <- fe(mergeNodes = mergeNodes, ...) class(x) <- c("fe.merge", class(x)) x } filterSVG.fe.merge.node <- function(x, dev) { svgdev <- dev@dev x <- cleanAttrs(x, "coords") newXMLNode("feMergeNode", attrs = x, parent = svgDevParent(svgdev)) } feMergeNode <- function(input = NA) { x <- if (! is.na(input)) list("in" = input) else list() class(x) <- "fe.merge.node" x } addMergeNode <- function(fe, mergeNode, after = NA) { if (! inherits(fe, "fe.merge")) stop("'fe' must be a 'fe.merge' object") if (! inherits(mergeNode, "fe.merge.node")) stop("'mergeNode' must be a 'fe.merge.node' object") if (is.na(after)) after <- length(fe$children) fe$children[[after + 1]] <- mergeNode fe } filterSVG.fe.morphology <- function(x, dev) { svgdev <- dev@dev if (x$coords) { if (length(x$radius) > 1) x$radius <- c(cx(x$radius[1], dev), cy(x$radius[2])) else x$radius <- cd(x$radius, dev) x$radius <- paste0(round(x$radius, 2), collapse = " ") } x <- cleanAttrs(x, "coords") newXMLNode("feMorphology", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } flatten.fe.morphology <- function(x, coords = TRUE) { if (coords) { if (length(x$radius) > 1) { rx <- convertWidth(x$radius[1], "inches") ry <- convertHeight(x$radius[2], "inches") x$radius <- unit.c(rx, ry) } else { x$radius <- dToInches(x$radius, NULL) } } else { if (length(x$radius) > 1) { rx <- convertWidth(x$radius[1], "npc", valueOnly = TRUE) ry <- convertHeight(x$radius[2], "npc", valueOnly = TRUE) x$radius <- unit.c(rx, ry) } else { # Just use Width for radius x$radius <- convertWidth(dToInches(x$radius, NULL), "npc", valueOnly = TRUE) } } x$coords <- coords NextMethod() } feMorphology <- function(input = NA, operator = c("erode", "dilate"), radius = unit(0, "npc"), default.units = "npc", ...) { if (! is.unit(radius)) radius <- unit(radius, default.units) x <- fe(operator = match.arg(operator), radius = radius, ...) if (! is.na(input)) x$`in` <- input class(x) <- c("fe.morphology", class(x)) x } flatten.fe.offset <- function(x, coords = TRUE) { if (coords) { x$dx <- convertWidth(x$dx, "inches") x$dy <- convertHeight(x$dy, "inches") } else { x$dx <- convertWidth(x$dx, "npc", valueOnly = TRUE) x$dy <- convertHeight(x$dy, "npc", valueOnly = TRUE) } x$coords <- coords NextMethod() } filterSVG.fe.offset <- function(x, dev) { svgdev <- dev@dev if (x$coords) { x$dx <- cx(x$dx, dev) x$dy <- cy(x$dy, dev) } x <- cleanAttrs(x, "coords") newXMLNode("feOffset", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feOffset <- function(input = NA, dx = unit(0, "npc"), dy = unit(0, "npc"), default.units = "npc", ...) { if (! is.unit(dx)) dx <- unit(dx, default.units) if (! is.unit(dy)) dy <- unit(dy, default.units) x <- fe(dx = dx, dy = dy, ...) if (! is.na(input)) x$`in` <- input class(x) <- c("fe.offset", class(x)) x } flatten.fe.specular.lighting <- function(x, coords = TRUE) { x$lightSource <- flatten(x$lightSource, coords) NextMethod() } filterSVG.fe.specular.lighting <- function(x, dev) { svgdev <- dev@dev if (! is.null(x$kernelUnitLength)) x$kernelUnitLength <- paste0(round(x$kernelUnitLength, 2), collapse = " ") specl <- cleanAttrs(x, c("coords", "lightSource")) fesl <- newXMLNode("feSpecularLighting", attrs = roundAttribs(specl), parent = svgDevParent(svgdev)) svgDevChangeParent(fesl, svgdev) filterSVG(x$lightSource, dev) svgDevChangeParent(xmlParent(fesl), svgdev) } feSpecularLighting <- function(input = NA, surfaceScale = 1, specularConstant = 1, specularExponent = 1, kernelUnitLength = NA, col = "white", lightSource = NULL, ...) { if (is.null(lightSource)) stop("A light source must be provided") if (specularConstant < 0) stop("'specularConstant' must be non-negative") if (specularExponent < 1) { warning("exponent less than 1, increasing to 1") specularExponent <- 1 } else if (specularExponent > 128) { warning("exponent larger than 128, reducing to 128") specularExponent <- 128 } x <- fe(surfaceScale = surfaceScale, specularConstant = specularConstant, specularExponent = specularExponent, "lighting-color" = c(col2rgb(col)), lightSource = lightSource, ...) if (! is.na(input)) x$`in` <- input if (! is.na(kernelUnitLength)) { if (length(kernelUnitLength) == 1) kernelUnitLength <- rep(kernelUnitLength, 2) x$kernelUnitLength <- kernelUnitLength } class(x) <- c("fe.specular.lighting", class(x)) x } filterSVG.fe.tile <- function(x, dev) { svgdev <- dev@dev x <- cleanAttrs(x, "coords") newXMLNode("feTile", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feTile <- function(input = NA, ...) { x <- fe(...) if (! is.na(input)) x$`in` <- input class(x) <- c("fe.tile", class(x)) x } filterSVG.fe.turbulence <- function(x, dev) { svgdev <- dev@dev if (length(x$baseFrequency) > 1) x$baseFrequency <- paste0(round(x$baseFrequency, 2), collapse = " ") x <- cleanAttrs(x, "coords") newXMLNode("feTurbulence", attrs = roundAttribs(x), parent = svgDevParent(svgdev)) } feTurbulence <- function(baseFrequency = 0, numOctaves = 1, seed = 1, stitchTiles = FALSE, type = c("turbulence", "fractalNoise"), ...) { stitchTiles <- if (stitchTiles) "stitch" else "noStitch" x <- fe(baseFrequency = baseFrequency, numOctaves = numOctaves, seed = seed, stitchTiles = stitchTiles, type = match.arg(type), ...) class(x) <- c("fe.turbulence", class(x)) x } # Ensure the filters are retained on a forced grob forceGrob.filtered.grob <- function(x) { y <- NextMethod() if (inherits(y, "forcedgrob")) { y$referenceLabel <- x$referenceLabel y$filterLabel <- x$filterLabel y$filterGroup <- x$filterGroup class(y) <- unique(c("filtered.grob", class(y))) } y } ��������������������gridSVG/R/convert.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000014461�12171060445�013572� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������viewportCreate <- function(vpname, newname = NULL, vpPath.sep = getSVGoption("vpPath.sep")) { coords <- gridSVGCoords() if (is.null(coords)) stop("gridSVGCoords() must be initialised") rootvp <- coords$ROOT if (is.null(rootvp)) stop("the ROOT viewport must have coords info set") targetvp <- coords[[vpname]] if (is.null(vpname)) stop(paste("the viewport", sQuote(vpname), "must have coords info set, see", sQuote("gridSVGCoords"))) # Avoid having a vpPath as a viewport name if (is.null(newname)) { splitname <- strsplit(vpname, vpPath.sep)[[1]] vpname <- tail(splitname, 1) } else { vpname <- newname } npcx <- targetvp$x / rootvp$width npcy <- targetvp$y / rootvp$height npcw <- targetvp$width / rootvp$width npch <- targetvp$height / rootvp$height viewport(x = unit(npcx, "npc"), y = unit(npcy, "npc"), width = unit(npcw, "npc"), height = unit(npch, "npc"), angle = targetvp$angle, just = c("left", "bottom"), name = vpname, xscale = targetvp$xscale, yscale = targetvp$yscale) } viewportConvertX <- function(vpname, x, from, to = "svg") { currCoords <- validCoordsInfo(vpname) vpCoords <- currCoords[[vpname]] if (vpCoords$angle != 0) { stop("Viewport angle non-zero; consider using viewportConvertPos()") } if (from == "svg") x <- x - vpCoords$x width <- convertx(vpCoords, x, from, to) if (to == "svg") width <- width + vpCoords$x width } viewportConvertY <- function(vpname, x, from, to = "svg") { currCoords <- validCoordsInfo(vpname) vpCoords <- currCoords[[vpname]] if (vpCoords$angle != 0) { stop("Viewport angle non-zero; consider using viewportConvertPos()") } if (from == "svg") x <- x - vpCoords$y height <- converty(vpCoords, x, from, to) if (to == "svg") height <- height + vpCoords$y height } viewportConvertPos <- function(vpname, x, y, from, to = "svg") { currCoords <- validCoordsInfo(vpname) vpCoords <- currCoords[[vpname]] if (from == "svg") { x <- x - vpCoords$x y <- y - vpCoords$y } width <- convertx(vpCoords, x, from, to) height <- converty(vpCoords, y, from, to) if (vpCoords$angle != 0) { theta <- -vpCoords$angle/180*pi w <- cos(theta)*width + sin(theta)*height h <- -sin(theta)*width + cos(theta)*height width <- w height <- h } if (to == "svg") { width <- width + vpCoords$x height <- height + vpCoords$y } list(x=width, y=height) } viewportConvertWidth <- function(vpname, x, from, to) { currCoords <- validCoordsInfo(vpname) vpCoords <- currCoords[[vpname]] convertx(vpCoords, x, from, to, FALSE) } viewportConvertHeight <- function(vpname, x, from, to) { currCoords <- validCoordsInfo(vpname) vpCoords <- currCoords[[vpname]] converty(vpCoords, x, from, to, FALSE) } convertx <- function(vpCoords, x, from, to, loc=TRUE) { i <- toInches(from, x, vpCoords$width, vpCoords$xscale, vpCoords$inch, loc) u <- toUnit(to, i, vpCoords$width, vpCoords$xscale, vpCoords$inch, loc) u } converty <- function(vpCoords, x, from, to, loc=TRUE) { i <- toInches(from, x, vpCoords$height, vpCoords$yscale, vpCoords$inch, loc) u <- toUnit(to, i, vpCoords$height, vpCoords$yscale, vpCoords$inch, loc) round(u, 2) } viewportConvertDim <- function(vpname, w, h, from, to) { currCoords <- validCoordsInfo(vpname) vpCoords <- currCoords[[vpname]] wi <- toInches(from, w, vpCoords$width, vpCoords$xscale, vpCoords$inch, FALSE) hi <- toInches(from, h, vpCoords$height, vpCoords$yscale, vpCoords$inch, FALSE) if (vpCoords$angle != 0) { theta <- -vpCoords$angle/180*pi w <- cos(theta)*wi + sin(theta)*hi h <- -sin(theta)*wi + cos(theta)*hi wi <- w hi <- h } wu <- toUnit(to, wi, vpCoords$width, vpCoords$xscale, vpCoords$inch, FALSE) hu <- toUnit(to, hi, vpCoords$height, vpCoords$yscale, vpCoords$inch, FALSE) list(w=wu, h=hu) } toInches <- function(from, unitValue, vpDimSize, nativeScale, dimInchSize, loc) { if (from == "inches") return(unitValue) nativeToInches <- function(nativeValue, nativeScale, vpDimSize, dimInchSize, loc) { if (loc) { dist <- nativeValue - nativeScale[1] } else { dist <- nativeValue } nativeUnitSize <- vpDimSize / abs(nativeScale[2] - nativeScale[1]) dist * nativeUnitSize / dimInchSize } npcToInches <- function(npcValue, vpDimSize, dimInchSize) { (npcValue * vpDimSize) / dimInchSize } if (from == "native") { result <- nativeToInches(unitValue, nativeScale, vpDimSize, dimInchSize, loc) } else if (from == "npc") { result <- npcToInches(unitValue, vpDimSize, dimInchSize) } else if (from == "svg") { result <- unitValue / dimInchSize } else { result <- convertUnit(unit(unitValue, from), "inches", valueOnly = TRUE) } result } toUnit <- function(to, unitValue, vpDimSize, nativeScale, dimInchSize, loc) { if (to == "inches") return(unitValue) inchesToNative <- function(inchesValue, nativeScale, vpDimSize, dimInchSize, loc) { npc <- (inchesValue * dimInchSize) / vpDimSize vpRange <- nativeScale[2] - nativeScale[1] if (loc) { (npc * vpRange) + nativeScale[1] } else { (npc * vpRange) } } inchesToNpc <- function(inchesValue, vpDimSize, dimInchSize) { (inchesValue * dimInchSize) / vpDimSize } if (to == "native") { result <- inchesToNative(unitValue, nativeScale, vpDimSize, dimInchSize, loc) } else if (to == "npc") { result <- inchesToNpc(unitValue, vpDimSize, dimInchSize) } else if (to == "svg") { result <- unitValue * dimInchSize } else { result <- convertUnit(unit(unitValue, "inches"), to, valueOnly = TRUE) } result } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/options.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000002541�12164147366�013613� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Get and set global 'gridSVG' options # Initial settings assign("gridSVGoptions", list( id.sep=".", gPath.sep="::", vpPath.sep="::" ), .gridSVGEnv) checkOptions <- function(options) { optionNames <- names(options) validOption <- sapply(options, is.character) if (any(! validOption)) stop(paste("Invalid option for: ", paste(dQuote(optionNames[! validOption]), collapse = ", "), sep = "")) } # Get/set options getSVGoption <- function(name) { oldOptions <- get("gridSVGoptions", .gridSVGEnv) optionNames <- names(oldOptions) if (name %in% optionNames) { oldOptions[[name]] } } getSVGoptions <- function() { get("gridSVGoptions", .gridSVGEnv) } setSVGoptions <- function(...) { oldOptions <- get("gridSVGoptions", .gridSVGEnv) options <- list(...) if (length(options)) { names <- names(options) optionNames <- names(oldOptions) names <- names[nchar(names) > 0 & names %in% optionNames] if (length(options[names])) { newOptions <- oldOptions newOptions[names] <- options[names] checkOptions(newOptions) assign("gridSVGoptions", newOptions, .gridSVGEnv) invisible(oldOptions[names]) } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/b64.R�������������������������������������������������������������������������������������0000654�0001762�0000144�00000000506�12765642434�012515� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������base64enc <- function(filename) { filesize <- file.info(filename)$size if (filesize > 0) { pngdata <- base64_enc(readBin(filename, "raw", n = filesize)) paste0("data:image/png;base64,", pngdata, collapse = "") } else { warning(paste(sQuote(filename), "is empty")) filename } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/aaa.R�������������������������������������������������������������������������������������0000654�0001762�0000144�00000003137�12204306301�012621� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Setting up an environment for use within gridSVG .gridSVGEnv <- new.env() # Don't show any progress bars or messages by default assign("showProgress", FALSE, envir = .gridSVGEnv) # Setting a context level for clipGrobs, clipping paths and masks. # Allows popping viewports to work correctly if we know many # SVG groups we need to "pop". assign("contextLevels", 0, envir = .gridSVGEnv) assign("contextNames", character(0), envir = .gridSVGEnv) # The following definitions are required for references to work # because we cannot assume that everything is determined at # draw time. # References require definitions to be created *prior* to drawing # which means we need naming systems and usage tables present. # Needed by getID() assign("uniqueNames", TRUE, envir = .gridSVGEnv) assign("prefix", "", envir = .gridSVGEnv) # We are going to be filling this list with lists of information (describing # reference definitions) keyed by their labels assign("refDefinitions", list(), envir = .gridSVGEnv) assign("usageTable", data.frame(name = character(0), suffix = integer(0), type = character(0), selector = character(0), xpath = character(0), stringsAsFactors = FALSE), envir = .gridSVGEnv) assign("pchUsageTable", matrix(c(0:127, logical(128)), ncol = 2, dimnames = list(NULL, c("pch", "used"))), envir = .gridSVGEnv) assign("refUsageTable", data.frame(label = character(0), used = logical(0), stringsAsFactors = FALSE), envir = .gridSVGEnv) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/comment.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000000622�12240527563�013554� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������grid.comment <- function(comment, name = NULL, vp = NULL) { grid.draw(commentGrob(comment, name, vp)) } commentGrob <- function(comment, name = NULL, vp = NULL) { g <- grob(name = name, vp = vp, cl = "comment") g$comment <- comment cl <- class(g) class(g) <- unique(c("comment.grob", cl)) g } primToDev.comment.grob <- function(x, dev) { svgComment(x$comment, dev@dev) } ��������������������������������������������������������������������������������������������������������������gridSVG/R/dev.R�������������������������������������������������������������������������������������0000654�0001762�0000144�00000007257�12164147366�012707� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This is hardly graphics-system-neutral # e.g., it uses the grid notion of what constitutes a viewport # But anyway ... ################# # General Device Stuff ################# setClass("graphicsDevice", representation(name="character", width="numeric", height="numeric")) setClass("graphicsParams", representation(pars="list")) setGeneric("inchToDevX", function(x, device) { standardGeneric("inchToDevX") }) setGeneric("inchToDevY", function(x, device) { standardGeneric("inchToDevY") }) setGeneric("devArrow", function(arrow, gp, device) { standardGeneric("devArrow") }) setGeneric("devStartElement", function(element, gp, device) { standardGeneric("devStartElement") }) setGeneric("devEndElement", function(name, device) { standardGeneric("devEndElement") }) setGeneric("devTextNode", function(text, device) { standardGeneric("devTextNode") }) setGeneric("devStartClip", function(clip, gp, device) { standardGeneric("devStartClip") }) setGeneric("devStartClipPath", function(clippath, gp, device) { standardGeneric("devStartClipPath") }) setGeneric("devEndClipPath", function(clippath, gp, device) { standardGeneric("devEndClipPath") }) setGeneric("devStartClipPathGroup", function(clippath, gp, device) { standardGeneric("devStartClipPathGroup") }) setGeneric("devStartMask", function(mask, gp, device) { standardGeneric("devStartMask") }) setGeneric("devEndMask", function(mask, gp, device) { standardGeneric("devEndMask") }) setGeneric("devStartMaskGroup", function(mask, gp, device) { standardGeneric("devStartMaskGroup") }) setGeneric("devStartGroup", function(group, gp, device) { standardGeneric("devStartGroup") }) setGeneric("devEndGroup", function(name, vp, device) { standardGeneric("devEndGroup") }) setGeneric("devLines", function(lines, gp, device) { standardGeneric("devLines") }) setGeneric("devPolygon", function(polygon, gp, device) { standardGeneric("devPolygon") }) setGeneric("devPath", function(path, gp, device) { standardGeneric("devPath") }) setGeneric("devRaster", function(raster, gp, device) { standardGeneric("devRaster") }) setGeneric("devRect", function(rect, gp, device) { standardGeneric("devRect") }) setGeneric("devText", function(text, gp, device) { standardGeneric("devText") }) setGeneric("devCircle", function(circle, gp, device) { standardGeneric("devCircle") }) setGeneric("devClose", function(device) { standardGeneric("devClose") }) setGeneric("devStartSymbol", function(pch, device) { standardGeneric("devStartSymbol") }) setGeneric("devPoint", function(pch, device) { standardGeneric("devPoint") }) setGeneric("devEndSymbol", function(device) { standardGeneric("devEndSymbol") }) setGeneric("devUseSymbol", function(point, gp, device) { standardGeneric("devUseSymbol") }) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/progress.R��������������������������������������������������������������������������������0000654�0001762�0000144�00000002676�12204306301�013752� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������progressInit <- function(mode, n) { if (existingProgress()) progressClose() if (! showingProgress() || n == 0) return() progressMessage(mode) con <- txtProgressBar(max = n, style = 3) setTxtProgressBar(con, 0) assign("progress", con, envir = .gridSVGEnv) assign("progressMode", mode, envir = .gridSVGEnv) } progressStep <- function(mode, n = 1) { if (!existingProgress() || !showingProgress() || diffProgressMode(mode)) return() con <- get("progress", envir = .gridSVGEnv) curval <- getTxtProgressBar(con) setTxtProgressBar(con, curval + n) assign("progress", con, envir = .gridSVGEnv) } progressClose <- function() { if (! existingProgress() || ! showingProgress()) return() con <- get("progress", envir = .gridSVGEnv) close(con) assign("progress", NULL, envir = .gridSVGEnv) assign("progressMode", NULL, envir = .gridSVGEnv) } progressMessage <- function(mode) { msg <- switch(mode, grob = "Drawing grobs", defs = "Drawing reference definitions", pch = "Drawing pch definitions") message(msg) } existingProgress <- function() { exists("progress", envir = .gridSVGEnv) && ! is.null(get("progress", envir = .gridSVGEnv)) } diffProgressMode <- function(mode) { mode != get("progressMode", envir = .gridSVGEnv) } showingProgress <- function() { get("showProgress", envir = .gridSVGEnv) } ������������������������������������������������������������������gridSVG/R/griddev.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000126223�13651654416�013551� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ vpError <- function() { stop("vp should only be path") } # Functions to take a grid grob and call appropriate # functions from dev.R to produce output on a device # Each function has to convert locations and dimensions # into device coordinates THEN call the dev.R function # Convert a unit object to a value in "device" units # The calls to convert*() are just to get 'valueOnly' # from "inches" units. cx <- function(x, dev) { inchToDevX(convertX(x, "inches", valueOnly=TRUE), dev) } cy <- function(x, dev) { inchToDevY(convertY(x, "inches", valueOnly=TRUE), dev) } cw <- function(x, dev) { inchToDevX(convertWidth(x, "inches", valueOnly=TRUE), dev) } ch <- function(x, dev) { inchToDevY(convertHeight(x, "inches", valueOnly=TRUE), dev) } # Convert a "distance" (e.g., a circle radius) cd <- function(x, dev) { pmin(inchToDevX(convertWidth(x, "inches", valueOnly=TRUE), dev), inchToDevY(convertHeight(x, "inches", valueOnly=TRUE), dev)) } # Create a full name for a sub-grob based on the name of a parent grob subGrobName <- function(baseGrobName, subGrobName, separator = getSVGoption("id.sep")) { paste(baseGrobName, subGrobName, sep=separator) } # Return the base grob name given the full name of a sub-grob baseGrobName <- function(subGrobName, separator = getSVGoption("id.sep")) { splitName <- unlist(strsplit(subGrobName, separator, fixed = TRUE)) grobName <- paste(splitName[-length(splitName)], collapse = separator) # Returning the base name grobName } prefixName <- function(name) { paste0(get("prefix", envir = .gridSVGEnv), name) } # Convert a gpar object to an device-neutral graphical parameter list gparToDevPars <- function(gp) { # Split up col into col plus colAlpha if (!is.null(gp$col)) { if (is.numeric(gp$col)) { zeroCol <- gp$col == 0 gp$col[zeroCol] <- "transparent" } rgba <- col2rgb(gp$col, alpha=TRUE) gp$colAlpha <- rgba[4,] } # Ditto fill if (!is.null(gp$fill)) { if (is.numeric(gp$fill)) { zeroFill <- gp$fill == 0 gp$fill[zeroFill] <- "transparent" } rgba <- col2rgb(gp$fill, alpha=TRUE) gp$fillAlpha <- rgba[4,] } gp } # Repeats all elements in a gpar() so that it is fully defined for n values expandGpar <- function(gp, n) { if (is.null(gp)) return(gpar()) # If there are actually gpar elements defined, repeat them if (length(gp) > 0) { for (i in 1:length(gp)) { gp[[i]] <- rep(gp[[i]], length.out = n) } } # Returning the gp gp } # Repeats all elements in an arrow() so that it is fully defined for n values expandArrow <- function(arrow, n) { # If there is actually an arrow, repeat its components if (! is.null(arrow)) { for (i in 1:length(arrow)) { arrow[[i]] <- rep(arrow[[i]], length.out = n) } } # Returning the arrow arrow } # Converting locations and widths locToInches <- function(x, y, dev) { # Convert x and y to inches x <- convertX(x, "inches", valueOnly=TRUE) y <- convertY(y, "inches", valueOnly=TRUE) # Transform to inches on device n <- max(length(x), length(y)) loc <- cbind(rep(x, length=n), rep(y, length=n), rep(1, length=n)) %*% current.transform() x <- unit(loc[,1]/loc[,3], "inches") y <- unit(loc[,2]/loc[,3], "inches") list(x=x, y=y) } dimToInches <- function(w, h, dev) { # FIXME: Doesn't handle rotated viewports!! w <- convertWidth(w, "inches") h <- convertHeight(h, "inches") list(w=w, h=h) } dToInches <- function(d, dev) { w <- convertWidth(d, "inches", valueOnly=TRUE) h <- convertHeight(d, "inches", valueOnly=TRUE) d <- unit(pmin(w, h), "inches") d } # Generate (left, bottom) from (x, y), (width, height), and justification leftbottom <- function(x, y, width, height, just, hjust, vjust, dev) { hjust <- resolveHJust(just, hjust) vjust <- resolveVJust(just, vjust) left <- unit(convertX(x, "inches", valueOnly=TRUE) - convertWidth(hjust*width, "inches", valueOnly=TRUE), "inches") bottom <- unit(convertY(y, "inches", valueOnly=TRUE) - convertHeight(vjust*height, "inches", valueOnly=TRUE), "inches") locToInches(left, bottom, dev) } # Generate hjust/vjust from just justTohjust <- function(just) { if (length(just) > 1) just <- just[1] if (is.numeric(just)) { # Rounding to nearest of 0, 0.5, 1 roundedJust <- round(2 * just) / 2 # and clamped to 0 to 1 if (roundedJust < 0) roundedJust <- 0 if (roundedJust > 1) roundedJust <- 1 switch(as.character(roundedJust), "0" = "left", "0.5" = "centre", "1" = "right") } else { if (is.na(match(just[1], c("left", "right")))) "centre" else just[1] } } justTovjust <- function(just) { if (length(just) > 1) just <- just[2] if (is.numeric(just)) { # Rounding to nearest of 0, 0.5, 1 roundedJust <- round(2 * just) / 2 # and clamped to 0 to 1 if (roundedJust < 0) roundedJust <- 0 if (roundedJust > 1) roundedJust <- 1 switch(as.character(roundedJust), "0" = "bottom", "0.5" = "centre", "1" = "top") } else { if (is.na(match(just[1], c("top", "bottom")))) "centre" else just } } changedGPar <- function(startGP, endGP) { diffGP <- mapply(function(x, y) !isTRUE(all.equal(x, y)), endGP, startGP) do.call("gpar", unclass(endGP)[diffGP]) } # Enforce a 'vp' setting # This could be a viewport (or vpTree or vpList or vpStack) OR a vpPath # The general idea is to push or down the 'vp' slot # THEN check how far down we have come # IF we have come more than one level down then start a group for # the appropriate number of parent viewports as well as the current viewport # AND then do the corresponding number of end groups afterwards startGroup <- function(vp, depth, dev) { if (depth > 1) { path <- upViewport(depth - 1, recording=FALSE) paths <- explode(path) for (i in paths) { parent <- current.viewport() parent$classes <- class(parent) devStartGroup(devGrob(parent, dev), gparToDevPars(parent$gp), dev) downViewport(i, recording=FALSE) } } vp$classes <- class(vp) devStartGroup(devGrob(vp, dev), gparToDevPars(vp$gp), dev) } enforceVP <- function(vp, dev) { depth <- 0 if (!is.null(vp)) { if (!inherits(vp, "vpPath")) { pushViewport(vp, recording=FALSE) depth <- depth(vp) } else { depth <- downViewport(vp, recording=FALSE) } startGroup(current.viewport(), depth, dev) } depth } unwindVP <- function(vp, depth, dev) { if (depth > 0) { for (i in 1:depth) devEndGroup("", TRUE, dev) upViewport(depth, recording=FALSE) } } # Grob to SVG # This mimics grid.draw() # Push/down any viewports and then call primToDev() to produce SVG grobToDev <- function(x, dev) { UseMethod("grobToDev", x) } grobToDev.default <- function(x, dev) { stop("We shouldn't be here!") } grobToDev.grob <- function(x, dev) { depth <- enforceVP(x$vp, dev) x$classes <- class(x) primToDev(x, dev) unwindVP(x$vp, depth, dev) progressStep("grob") } # grob to device grob # This just converts a grid grob into a generic (bland) device grob # (which is just a list of values) devGrob <- function(x, dev) { UseMethod("devGrob") } devGrob.default <- function(x, dev) { list(name=x$name, classes=x$classes) } moveToGen <- function() { curx <- NA cury <- NA moveto <- function(x, dev) { loc <- locToInches(x$x, x$y, dev) curx <<- cx(loc$x, dev) cury <<- cy(loc$y, dev) } lineto <- function(x, dev) { loc <- locToInches(x$x, x$y, dev) lineArrow <- x$arrow if (! is.null(lineArrow)) { ends <- switch(as.character(lineArrow$ends), "1" = "first", "2" = "last", "3" = "both") result <- list(x=c(curx, cx(loc$x, dev)), y=c(cury, cy(loc$y, dev)), arrow=list(ends = ends), classes=x$classes, name=x$name) } else { result <- list(x=c(curx, cx(loc$x, dev)), y=c(cury, cy(loc$y, dev)), classes=x$classes, name=x$name) } curx <<- cx(loc$x, dev) cury <<- cy(loc$y, dev) result } list(moveto=moveto, lineto=lineto) } moveToFuns <- moveToGen() devGrob.move.to <- moveToFuns$moveto devGrob.line.to <- moveToFuns$lineto devGrob.lines <- function(x, dev) { loc <- locToInches(x$x, x$y, dev) # Need to add in attributes to know where arrows # go if we have any lineArrow <- x$arrow if (! is.null(lineArrow)) { ends <- switch(as.character(lineArrow$ends), "1" = "first", "2" = "last", "3" = "both") list(x=cx(loc$x, dev), y=cy(loc$y, dev), arrow=list(ends = ends), classes=x$classes, name=x$name) } else { list(x=cx(loc$x, dev), y=cy(loc$y, dev), classes=x$classes, name=x$name) } } devGrob.points <- function(x, dev) { loc <- locToInches(x$x, x$y, dev) list(name = x$name, x = cx(loc$x, dev), y = cy(loc$y, dev), size = cd(dToInches(x$size), dev), angle = current.rotation(), classes = x$classes, pch = x$pch) } devGrob.polygon <- function(x, dev) { loc <- locToInches(x$x, x$y, dev) list(x=cx(loc$x, dev), y=cy(loc$y, dev), classes=x$classes, name=x$name) } devGrob.pathgrob <- function(x, dev) { # The complication is converting the 'x', 'y', and 'id's # into lists if (is.null(x$id) && is.null(x$id.lengths)) { loc <- locToInches(x$x, x$y, dev) list(x=cx(loc$x, dev), y=cy(loc$y, dev), rule=x$rule, classes=x$classes, name=x$name) } else { if (is.null(x$id)) { n <- length(x$id.lengths) id <- rep(1L:n, x$id.lengths) } else { n <- length(unique(x$id)) id <- x$id } listX <- split(x$x, id) listY <- split(x$y, id) listLoc <- mapply(locToInches, listX, listY, MoreArgs=list(dev), SIMPLIFY=FALSE) list(x=lapply(listLoc, function(loc, dev) { cx(loc$x, dev) }, dev), y=lapply(listLoc, function(loc, dev) { cy(loc$y, dev) }, dev), rule=x$rule, classes=x$classes, name=x$name) } } devGrob.rastergrob <- function(x, dev) { lb <- leftbottom(x$x, x$y, x$width, x$height, x$just, x$hjust, x$vjust, dev) dim <- dimToInches(x$width, x$height, dev) list(x=cx(lb$x, dev), y=cy(lb$y, dev), width=cw(dim$w, dev), height=ch(dim$h, dev), angle=current.rotation(), datauri=x$datauri, classes=x$classes, name=x$name) } devGrob.rect <- function(x, dev) { lb <- leftbottom(x$x, x$y, x$width, x$height, x$just, x$hjust, x$vjust, dev) dim <- dimToInches(x$width, x$height, dev) list(x=cx(lb$x, dev), y=cy(lb$y, dev), width=cw(dim$w, dev), height=ch(dim$h, dev), angle=current.rotation(), classes=x$classes, name=x$name) } devGrob.text <- function(x, dev) { loc <- locToInches(x$x, x$y, dev) gp <- get.gpar() charHeight <- grobHeight(textGrob("M", gp = x$gp)) # The R graphics engine does some crazy-ass calculations to # determine line height. This does WAAAAY back so we just # have to swallow and follow along. # textLineHeight <- ch(charHeight * gp$lineheight, dev) xcex <- if (is.null(x$gp$cex)) 1 else x$gp$cex textLineHeight <- ch(unit(gp$lineheight * gp$cex * xcex * graphics::par("cin")[2], "inches"), dev) charHeight <- ch(charHeight, dev) # height of current font # This corresponds to lineheight in SVG terms, # which is defined to be font size # see http://www.w3.org/TR/SVG/propidx.html # comment in row for 'baseline-shift' in the 'percentages' column # This is needed for positioning plotmath expressions # to anything close to the right place fontHeight <- ch(unit(gp$fontsize * gp$cex * xcex/ 72, "inches"), dev) # Width of the text/expression # MUST set x$vp to NULL before doing the following calculations # because x$vp has already been asserted and the calculation may # involve trying to assert it again! # (which would mean hidden error because viewport pushed twice OR # visible error because try to "down" to viewport that does not exist) x$vp <- NULL width <- cw(grobWidth(x), dev) height <- ch(grobHeight(x), dev) ascent <- ch(grobAscent(x), dev) descent <- ch(grobDescent(x), dev) # Checking whether to use just or [h/v]just # Will convert numerics to strings in justTo_just function just <- rep(x$just, length.out = 2) just <- c(justTohjust(just[1]), justTovjust(just[2])) if (! is.null(x$hjust)) just[1] <- justTohjust(x$hjust) if (! is.null(x$vjust)) just[2] <-justTovjust(x$vjust) hjust <- just[1] vjust <- just[2] list(x=cx(loc$x, dev), y=cy(loc$y, dev), text=x$label, hjust=hjust, vjust=vjust, rot=x$rot, width=width, height=height, angle=current.rotation(), ascent=ascent, descent=descent, lineheight=textLineHeight, fontheight=fontHeight, charheight=charHeight, fontfamily=gp$fontfamily, fontface=switch(gp$font, "plain", "bold", "italic", "bold.italic"), classes=x$classes, name=x$name) } devGrob.circle <- function(x, dev) { loc <- locToInches(x$x, x$y, dev) list(x=cx(loc$x, dev), y=cy(loc$y, dev), r=cd(dToInches(x$r), dev), classes=x$classes, name=x$name) } # Because viewports and grobs can be used many times, and each # time we use one we start a group, we need a *unique* id for that # group, otherwise things like clipping paths don't work correctly # # 'append' determines whether we add our ID to the usageTable. Useful # not to in cases like animated grobs getID <- function(name, type, append = TRUE) { # If this is a grob or ref, only modify if we're trying to ensure # uniqueness. We *really* need to do this for viewports though, so # viewports are a special case. if (type != "vp" && ! get("uniqueNames", envir = .gridSVGEnv)) return(name) # Finding out how many times a VP or grob has been used so far ut <- get("usageTable", envir = .gridSVGEnv) suffix <- ut[ut$name == name, "suffix"] suffix <- if (length(suffix) == 0) 1 else max(suffix) + 1 # Test if there are any existing names that might clash. # For example rect.1 has rect.1.1 children, test whether # these child names might clash. candidateName <- paste(name, suffix, sep = getSVGoption("id.sep")) while (length(ut[ut$name == candidateName, "suffix"])) { # Just increment the suffix number by 1 each time, should (eventually) # give us a unique number suffix <- suffix + 1 candidateName <- paste(name, suffix, sep = getSVGoption("id.sep")) } if (append) { sel <- prefixName(escapeSelector(candidateName)) xp <- prefixName(escapeXPath(candidateName)) assign("usageTable", rbind(ut, data.frame(name = name, suffix = suffix, type = type, selector = sel, xpath = xp, stringsAsFactors = FALSE)), envir = .gridSVGEnv) } # Returning the new ID paste(name, suffix, sep = getSVGoption("id.sep")) } getCoordsInfo <- function(vp, tm, dev) { # Need to maintain x, y, xscale, yscale, transform # Units of particular interest, npc, native, inches # Keep inches as our baseline transloc <- c(0, 0, 1) %*% tm loc <- (transloc / transloc[3])[-3] coords <- list(x = round(cx(unit(loc[1], "inches"), dev), 2), y = round(cy(unit(loc[2], "inches"), dev), 2), width = round(cw(unit(1, "npc"), dev), 2), height = round(ch(unit(1, "npc"), dev), 2), angle = current.rotation(), xscale = vp$xscale, yscale = vp$yscale, inch = round(cw(unit(1, "inches"), dev), 2)) coords } devGrob.viewport <- function(x, dev) { vp <- x # Modify the path so that we can use a different separator if (get("use.vpPaths", envir = .gridSVGEnv)) { vpname <- as.character(current.vpPath()) splitPath <- explode(vpname) vpname <- paste(splitPath, collapse = getSVGoption("vpPath.sep")) } else { vpname <- vp$name } coords <- getCoordsInfo(vp, current.transform(), dev) if (is.null(vp$clip)) { clip <- FALSE list(name=getID(vpname, "vp"), clip=clip, coords=coords, classes=x$classes) } else if (is.na(vp$clip)) { # Clipping has been turned OFF # FIXME: CANNOT do this in SVG (enlarge the clip path) clip <- FALSE list(name=getID(vpname, "vp"), clip=clip, coords=coords, classes=x$classes) } else if (! vp$clip) { clip <- FALSE list(name=getID(vpname, "vp"), clip=clip, coords=coords, classes=x$classes) } else { clip <- TRUE list(vpx=coords$x, vpy=coords$y, vpw=coords$width, vph=coords$height, angle=current.rotation(), name=getID(vpname, "vp"), clip=clip, classes=x$classes, coords=coords) } } devGrob.vpPath <- function(x, dev) { vp <- current.viewport() tm <- current.transform() if (is.null(vp$clip)) { clip <- FALSE list(name=getID(vp$name, "vp"), clip=clip, classes=x$classes) } else if (is.na(vp$clip)) { # Clipping has been turned OFF # FIXME: CANNOT do this in SVG (enlarge the clip path) clip <- FALSE list(name=getID(vp$name, "vp"), clip=clip, classes=x$classes) } else if (! vp$clip) { clip <- FALSE list(name=getID(vp$name, "vp"), clip=clip, classes=x$classes) } else { clip <- TRUE transloc <- c(0, 0, 1) %*% tm loc <- (transloc / transloc[3])[-3] list(vpx=cx(unit(loc[1], "inches"), dev), vpy=cy(unit(loc[2], "inches"), dev), vpw=cw(unit(1, "npc"), dev), vph=ch(unit(1, "npc"), dev), name=getID(vp$name, "vp"), classes=x$classes, clip=clip) } } devGrob.clip <- function(x, dev) { # Should be similar to a rect in description, because this is a clipping rect lb <- leftbottom(x$x, x$y, x$width, x$height, x$just, x$hjust, x$vjust, dev) dim <- dimToInches(x$width, x$height, dev) list(x=cx(lb$x, dev), y=cy(lb$y, dev), width=cw(dim$w, dev), height=ch(dim$h, dev), angle=current.rotation(), classes=x$classes, name=getID(x$name, "grob")) } # Prim to Dev # This generates SVG from the grob to reproduce the grob in SVG code # General form: # startGroup # for i=1:n # dev&(devGrob(i)) # endGroup primToDev <- function(x, dev) { UseMethod("primToDev") } primToDev.grob <- function(x, dev) { } arrowAddName <- function(arrow, name) { list(angle = arrow$angle, length = arrow$length, ends = arrow$ends, type = arrow$type, name = name) } primToDev.clip <- function(x, dev) { devStartClip(devGrob(x, dev), NULL, dev) } primToDev.move.to <- function(x, dev) { devGrob(x, dev) } primToDev.line.to <- function(x, dev) { # NOTE: MUST NOT evaluate devGrob() more than once # because it has side-effects (within its closure) dgrob <- devGrob(x, dev) dgrob$name <- getID(dgrob$name, "grob") x$name <- getID(x$name, "grob") # Grouping the grob devStartGroup(dgrob, NULL, dev) # This is a bit of a special case where we know there is only one # actual graphical object that is being created, so we are simply # going to modify it's name in place. dgrob$name <- subGrobName(x$name, 1) if (! is.null(x$arrow)) devArrow(arrowAddName(x$arrow, x$name), gparToDevPars(x$gp), dev) devLines(dgrob, gparToDevPars(x$gp), dev) # Ending the group devEndGroup(x$name, FALSE, dev) } primToDev.lines <- function(x, dev) { x$name <- getID(x$name, "grob") # Grouping the grob devStartGroup(devGrob(x, dev), NULL, dev) # This is a bit of a special case where we know there is only one # actual graphical object that is being created, so we are simply # going to modify it's name in place. oldname <- x$name x$name <- subGrobName(x$name, 1) if (! is.null(x$arrow)) devArrow(arrowAddName(x$arrow, x$name), gparToDevPars(x$gp), dev) devLines(devGrob(x, dev), gparToDevPars(x$gp), dev) # Ending the group x$name <- oldname devEndGroup(x$name, FALSE, dev) } primToDev.polyline <- function(x, dev) { x$name <- getID(x$name, "grob") # If we only have one line if (is.null(x$id) && is.null(x$id.lengths)) { x$id <- rep(1L, length(x$x)) } # Multiple lines exist if (is.null(x$id)) { n <- length(x$id.lengths) id <- rep(1L:n, x$id.lengths) } else { n <- length(unique(x$id)) id <- x$id } # Each line has an id, grab corresponding positions listX <- split(x$x, id) listY <- split(x$y, id) n <- length(listX) # Gp needs to be defined for each sub-grob, as does arrow gp <- expandGpar(x$gp, n) arrows <- expandArrow(x$arrow, n) # Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) # Now we want to create a new lineGrob for each line # Naming each line with the polyline name suffixed by its id for (i in 1:n) { lg <- linesGrob(x = listX[[i]], y = listY[[i]], gp = gp[i], arrow = arrows[i], default.units = x$default.units, name = subGrobName(x$name, i)) if (! is.null(lg$arrow)) devArrow(arrowAddName(lg$arrow, lg$name), gparToDevPars(lg$gp), dev) devLines(devGrob(lg, dev), gparToDevPars(lg$gp), dev) } # Ending the group devEndGroup(x$name, FALSE, dev) } # Any more efficient way of doing this? # FIXME: will lose any extra attributes of segments grob primToDev.segments <- function(x, dev) { nx0 <- length(x$x0) nx1 <- length(x$x1) ny0 <- length(x$y0) ny1 <- length(x$y1) n <- max(nx0, nx1, ny0, ny1) # Gp needs to be defined for each sub-grob, as does arrow gp <- expandGpar(x$gp, n) arrows <- expandArrow(x$arrow, n) x$name <- getID(x$name, "grob") # Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) for (i in 1:n) { lg <- linesGrob(unit.c(x$x0[(i-1) %% nx0 + 1], x$x1[(i-1) %% nx1 + 1]), unit.c(x$y0[(i-1) %% ny0 + 1], x$y1[(i-1) %% ny1 + 1]), arrow = arrows[i], default.units = x$default.units, gp = gp[i], name = subGrobName(x$name, i)) if (! is.null(lg$arrow)) devArrow(arrowAddName(lg$arrow, lg$name), gparToDevPars(lg$gp), dev) devLines(devGrob(lg, dev), gparToDevPars(lg$gp), dev) } # Ending the group devEndGroup(x$name, FALSE, dev) } primToDev.polygon <- function(x, dev) { # If we have only one polygon if (is.null(x$id) && is.null(x$id.lengths)) { x$id <- rep(1L, length(x$x)) } # If we have multiple polygons if (is.null(x$id)) { n <- length(x$id.lengths) id <- rep(1L:n, x$id.lengths) } else { n <- length(unique(x$id)) id <- x$id } # Each polygon has an id, grab corresponding positions listX <- split(x$x, id) listY <- split(x$y, id) # May have id.length == 0 so use # of groups n <- length(listX) # Gp needs to be defined for each sub-grob gp <- expandGpar(x$gp, n) x$name <- getID(x$name, "grob") # Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) # Now we want to create a new polygonGrob for each polygon # Naming each polygon with the polygon name suffixed by its id for (i in 1:n) { pg <- polygonGrob(x = listX[[i]], y = listY[[i]], gp = gp[i], default.units = x$default.units, name = subGrobName(x$name, i)) devPolygon(devGrob(pg, dev), gparToDevPars(pg$gp), dev) } # Ending the group devEndGroup(x$name, FALSE, dev) } trim <- function(points) { n <- length(points$x) if (n > 2) { remove <- 1 while (remove < n && points$x[1] == points$x[1 + remove] && points$y[1] == points$y[1 + remove]) { remove <- remove + 1 } if (remove > 1) { points$x <- points$x[-(1:(remove - 1))] points$y <- points$y[-(1:(remove - 1))] } } points } primToDev.xspline <- function(x, dev) { # Setting up function that turns an xspline into a series of points # which is then used to define a line or path splineToGrob <- function(spline) { splinePoints <- xsplinePoints(spline) if (spline$open) { linesGrob(x = splinePoints$x, y = splinePoints$y, gp = spline$gp, arrow = spline$arrow, default.units = spline$default.units, name = spline$name) } else { pathGrob(x = splinePoints$x, y = splinePoints$y, gp = spline$gp, default.units = spline$default.units, name = spline$name) } } # 'grid' does not allow NAs in (x, y) for Xsplines if (any(is.na(x$x)) || any(is.na(x$y))) stop("non-finite control point in Xspline") # If we have only one spline if (is.null(x$id) && is.null(x$id.lengths)) { x$id <- rep(1L, length(x$x)) } # If we're dealing with more than one spline if (is.null(x$id)) { n <- length(x$id.lengths) id <- rep(1L:n, x$id.lengths) } else { n <- length(unique(x$id)) id <- x$id } # Each xspline has an id, grab corresponding positions listX <- split(x$x, id) listY <- split(x$y, id) n <- length(listX) # If x$shape is not defined for each point, repeat it for all points pointShapes <- rep(x$shape, length.out = length(x$x)) listShape <- split(pointShapes, id) # Like x$shape, if the following attributes not defined for each grob id, repeat it splineOpen <- rep(x$open, length.out = n) splineEnds <- rep(x$repEnds, length.out = n) # Gp needs to be defined for each sub-grob, as does arrow gp <- expandGpar(x$gp, n) arrows <- expandArrow(x$arrow, n) x$name <- getID(x$name, "grob") # Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) # Now we want to create a new xsplineGrob for each xspline # Naming each xspline with the xspline name suffixed by its id for (i in 1:n) { xsg <- xsplineGrob(x = listX[[i]], y = listY[[i]], open = x$open, # Could use splineOpen[i] but grid.xspline applies this for the entire group of grobs shape = listShape[[i]], default.units = x$default.units, repEnds = splineEnds[i], arrow = arrows[i], gp = gp[i], name = subGrobName(x$name, i)) sg <- splineToGrob(xsg) if (inherits(sg, "pathgrob")) { devPath(devGrob(sg, dev), gparToDevPars(sg$gp), dev) } else { dg <- devGrob(sg, dev) if (! is.null(sg$arrow)) { devArrow(arrowAddName(sg$arrow, sg$name), gparToDevPars(sg$gp), dev) # The arrow orientation is determined "auto"matically by # the SVG renderer, so we need to avoid identical values # at start or end of points (this has been done in # xsplinePoints(), but we need to do it again here because # we will be rounding to 2 dp for SVG output!) dgTrimFront <- trim(list(x=round(dg$x, 2), y=round(dg$y, 2))) dgTrimBack <- trim(list(x=rev(dgTrimFront$x), y=rev(dgTrimFront$y))) dg$x <- rev(dgTrimBack$x) dg$y <- rev(dgTrimBack$y) } devLines(dg, gparToDevPars(sg$gp), dev) } } # Ending the group devEndGroup(x$name, FALSE, dev) } primToDev.pathgrob <- function(x, dev) { x$name <- getID(x$name, "grob") ## Grouping the grob devStartGroup(devGrob(x, dev), NULL, dev) hasMultiple <- !(is.null(x$pathId) && is.null(x$pathId.lengths)) oldname <- x$name if (hasMultiple) { if (is.null(x$pathId)) { n <- length(x$pathId.lengths) pathId <- rep(1L:n, x$pathId.lengths) } else { n <- length(unique(x$pathId)) pathId <- x$pathId } if (is.null(x$id) && is.null(x$id.length)) { id <- rep(1, length(x$x)) } else if (is.null(x$id)) { id <- rep(1L:length(x$id.lengths), x$id.lengths) } else { id <- x$id } gp <- expandGpar(x$gp, n) listX <- split(x$x, pathId) listY <- split(x$y, pathId) listID <- split(id, pathId) for (i in 1:n) { pg <- pathGrob(x = listX[[i]], y = listY[[i]], id = listID[[i]], rule = x$rule, gp = gp[i], default.units = x$default.units, name = subGrobName(x$name, i)) devPath(devGrob(pg, dev), gparToDevPars(pg$gp), dev) } } else { ## This is a bit of a special case where we know there is only one ## actual graphical object that is being created, so we are simply ## going to modify it's name in place. x$name <- subGrobName(x$name, 1) gp <- expandGpar(x$gp, 1) devPath(devGrob(x, dev), gparToDevPars(gp), dev) } ## Ending the group x$name <- oldname devEndGroup(x$name, FALSE, dev) } primToDev.rastergrob <- function(x, dev) { # Finding out how many rasters we're dealing with n <- max(length(x$x), length(x$y), length(x$width), length(x$height)) # Repeating components as necessary xs <- rep(x$x, length.out = n) ys <- rep(x$y, length.out = n) # Finding the dimensions of the image, c(height, width) rasterDims <- dim(x$raster) rasterHeight <- rasterDims[1] rasterWidth <- rasterDims[2] # If we haven't been given any information about the h or w, # blow the image up to the full size but respect the aspect ratio x <- resolveRasterSize(x) # Use widthDetails() here (rather than grobWidth()) # because drawing context already enforced widths <- rep(x$width, length.out = n) heights <- rep(x$height, length.out = n) # Generating the filename of the raster fileloc <- tempfile(x$name, fileext = "png") # Because of issues regarding interpolation, it's best just to # store the raster with as large a dimension as possible. # OTOH, never want to REDUCE the size of the raw raster (?) rasterDims <- c(max(abs(rasterHeight), ch(max(heights), dev)), max(abs(rasterWidth), cw(max(widths), dev))) olddev <- dev.cur() png(filename = fileloc, width = round(abs(rasterDims[2])), height = round(abs(rasterDims[1])), bg = "transparent") # Need to ensure that the raster is oriented correctly in the (more rare) # case of an xscale or yscale being big -> small # To do this, position natively in a new (temporary) viewport xscale <- if (rasterDims[2] < 0) 1:0 else 0:1 yscale <- if (rasterDims[1] < 0) 1:0 else 0:1 pushViewport(viewport(xscale = xscale, yscale = yscale), recording = FALSE) # The raster stays the same and is only repeated for each appearance. # Given that we know the dimensions of the PNG, we can safely say that # the raster occupies the entireity of both the x and y dimensions. grid.raster(x$raster, width = 1, height = 1, interpolate = x$interpolate, default.units = "native") popViewport(recording = FALSE) dev.off() dev.set(olddev) # base64 encoding the PNG so we can insert the image as a data URI base64Raster <- base64enc(fileloc) file.remove(fileloc) # Expand the gp such that it fully defines all sub-grobs gp <- expandGpar(x$gp, n) x$name <- getID(x$name, "grob") # Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) for (i in 1:n) { rg <- rasterGrob(x$raster, x = xs[i], y = ys[i], width = widths[i], height = heights[i], just = x$just, hjust = x$hjust, vjust = x$vjust, default.units = x$default.units, gp = gp[i], # Will be ignored, keeping anyway name = subGrobName(x$name, i)) rg$datauri <- base64Raster devRaster(devGrob(rg, dev), gparToDevPars(rg$gp), dev) } # Ending the group devEndGroup(x$name, FALSE, dev) } primToDev.rect <- function(x, dev) { ## Finding out how many rects we're dealing with n <- max(length(x$x), length(x$y), length(x$width), length(x$height)) ## Repeating components as necessary xs <- rep(x$x, length.out = n) ys <- rep(x$y, length.out = n) widths <- rep(x$width, length.out = n) heights <- rep(x$height, length.out = n) ## Expand the gp such that it fully defines all sub-grobs gp <- expandGpar(x$gp, n) x$name <- getID(x$name, "grob") ## Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) rg <- rectGrob(x = xs, y = ys, width = widths, height = heights, just = x$just, hjust = x$hjust, vjust = x$vjust, default.units = x$default.units, gp = gp, name = subGrobName(x$name, 1:n)) devRect(devGrob(rg, dev), gparToDevPars(rg$gp), dev) ## Ending the group devEndGroup(x$name, FALSE, dev) } primToDev.text <- function(x, dev) { # Finding out how many pieces of text we're dealing with n <- max(length(x$x), length(x$y), length(x$label)) # Repeating components as necessary textX <- rep(x$x, length.out = n) textY <- rep(x$y, length.out = n) textRot <- rep(x$rot, length.out = n) # If any given label is a vector of length 0, we don't want NA to appear if (length(x$label) == 0) { textLabel <- " " textLabel <- rep(textLabel, length.out = n) } else { # Checking that no element of label vector is empty if (!is.language(x$label)) { textLabel <- sapply(x$label, function(t) { if (is.na(t) || nchar(t) == 0 || length(t) == 0) " " else t }) } textLabel <- rep(x$label, length.out = n) } # Force fill to be col for text if (is.null(x$gp)) x$gp <- gpar(fill = get.gpar()$col) else x$gp$fill <- if (! is.null(x$gp$col)) x$gp$col else get.gpar()$col # Expand the gp such that it fully defines all sub-grobs gp <- expandGpar(x$gp, n) x$name <- getID(x$name, "grob") # Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) for (i in 1:n) { tg <- textGrob(x = textX[i], y = textY[i], label = textLabel[i], rot = textRot[i], just = x$just, hjust = x$hjust, vjust = x$vjust, default.units = x$default.units, gp = gp[i], name = subGrobName(x$name, i)) devText(devGrob(tg, dev), gparToDevPars(tg$gp), dev) } # Ending the group devEndGroup(x$name, FALSE, dev) } primToDev.circle <- function(x, dev) { ## Finding out how many circles we're dealing with n <- max(length(x$x), length(x$y), length(x$r)) ## Repeating components as necessary xs <- rep(x$x, length.out = n) ys <- rep(x$y, length.out = n) rs <- rep(x$r, length.out = n) ## Expand the gp such that it fully defines all sub-grobs gp <- expandGpar(x$gp, n) x$name <- getID(x$name, "grob") ## Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) cg <- circleGrob(x = xs, y = ys, r = rs, default.units = x$default.units, gp = gp, name = subGrobName(x$name, 1:n)) devCircle(devGrob(cg, dev), gparToDevPars(cg$gp), dev) ## Ending the group devEndGroup(x$name, FALSE, dev) } adjustSymbolSize <- function(pointSize, pgp) { # Points are affected by cex and fontsize but only if they are # char or lines, etc # Solution: push a viewport with new gps from the grob and can # therefore can convert unit safely to inches because grid's unit # conversion routines can handle when the *viewport* has the cex or # fontsize information but not when the *grob* has it. # Also, not recording on the DL because this viewport wasn't part # of the original vp tree. if (!is.null(pgp$cex) || !is.null(pgp$fontsize)) { xscale <- current.viewport()$xscale yscale <- current.viewport()$yscale if (!is.null(pgp$cex) & !is.null(pgp$fontsize)) { pushViewport(viewport(xscale = xscale, yscale = yscale, gp = gpar(cex = pgp$cex, fontsize = pgp$fontsize)), recording = FALSE) } else if (!is.null(pgp$cex)) { pushViewport(viewport(xscale = xscale, yscale = yscale, gp = gpar(cex = pgp$cex)), recording = FALSE) } else { ## if (!is.null(pgp$fontsize)) pushViewport(viewport(xscale = xscale, yscale = yscale, gp = gpar(fontsize = pgp$fontsize)), recording = FALSE) } pointSize <- convertWidth(pointSize, "inches") # Use width, matches grid popViewport(recording = FALSE) } pointSize } primToDev.points <- function(x, dev) { # Finding out how many grobs we're going to be dealing with # length of x and y already checked in grid.points n <- length(x$x) pgp <- x$gp ## Force a stroke-width, col, and fill if (is.null(pgp$lwd)) { pgp$lwd <- get.gpar()$lwd } if (is.null(pgp$col)) { pgp$col <- get.gpar()$col } if (is.null(pgp$fill)) { pgp$fill <- get.gpar()$fill } ## Expand the gp such that it fully defines all sub-grobs pgp <- expandGpar(pgp, n) x$name <- getID(x$name, "grob") ## Grouping each sub-grob devStartGroup(devGrob(x, dev), NULL, dev) ## For testing validity, convert to numerics if (is.numeric(x$pch)) { chinds <- numeric() } else { chinds <- which(!is.na(x$pch) & !(as.character(x$pch) %in% as.character(c(0:25, 32:127)))) } pchtest <- x$pch if (length(chinds) > 0) { newpch <- integer(length(pchtest)) newpch[chinds] <- as.numeric(sapply(pchtest[chinds], function(x) charToRaw(x))) newpch[!chinds] <- as.numeric(pchtest[!chinds]) pchtest <- newpch } if (any(!is.na(pchtest) & !pchtest %in% c(0:25, 32:127))) stop("Unsupported pch value") ## These can differ for points pchs <- rep(pchtest, length.out = n) sizes <- rep(x$size, length.out = n) ## Check whether the point symbol has been used yet pchUsageTable <- get("pchUsageTable", envir = .gridSVGEnv) ## Update usages pchUsageTable[pchs + 1, "used"] <- TRUE assign("pchUsageTable", pchUsageTable, envir = .gridSVGEnv) if (!is.unit(sizes) && is.numeric(sizes)) { ## Just a number -- convert to a unit pointSize <- unit(sizes, x$default.units) } else { ## All other units pointSize <- sizes } if (any(pchs) %in% 32:127) { asciipch <- sapply(pchs, function(x) rawToChar(as.raw(x))) } else { asciipch <- pchs } pgp$fill[pchs < 15] <- "transparent" ## 46 == "." ## Don't do anything for a "." because we need a ## stroke for it to be visible noStroke <- !is.na(pchs) & (pchs %in% 15:20 | (pchs >= 32 & pchs != 46)) if (any(noStroke)) { pgp$fill[noStroke] <- pgp$col[noStroke] pgp$col[noStroke & pchs %in% 15:18] <- "transparent" } ## Size is now relative to text so use text grob ## pointSize[pchs >= 32] <- grobWidth(textGrob(asciipch[pchs >= 32])) ## Enforce gp$cex or gp$fontsize pointSize <- adjustSymbolSize(pointSize, pgp) pg <- pointsGrob(x$x, x$y, pch = asciipch, size = pointSize, default.units = x$default.units, name = subGrobName(x$name, 1:n)) devUseSymbol(devGrob(pg, dev), gparToDevPars(pgp), dev) # Ending the group devEndGroup(x$name, FALSE, dev) } grobToDev.gTree <- function(x, dev) { depth <- enforceVP(x$vp, dev) if (!is.null(x$childrenvp)) { pushViewport(x$childrenvp, recording=FALSE) upViewport(depth(x$childrenvp), recording=FALSE) } primToDev(x, dev) unwindVP(x$vp, depth, dev) # Ignore wrapping gTree as it was not on the original DL if (x$name != "gridSVG") progressStep("grob") } primToDev.gTree <- function(x, dev) { if (x$name != "gridSVG") { x$name <- getID(x$name, "grob") x$classes <- class(x) children <- x$children[x$childrenOrder] } else { children <- x$children } devStartGroup(devGrob(x, dev), gparToDevPars(x$gp), dev) lapply(children, function(child) { # 'gridSVG' is a special case because it is just a wrapping gTree. # It is not useful for us to track the entire gPath as a result, # only the path *after* 'gridSVG' if (get("use.gPaths", envir = .gridSVGEnv) && x$name != "gridSVG") child$name <- paste(x$name, child$name, sep = getSVGoption("gPath.sep")) child$classes <- class(child) grobToDev(child, dev) }) devEndGroup(x$name, FALSE, dev) } # Viewports (and vpPaths and downs and ups) # on the display list get recorded as wrapped grobs grobToDev.recordedGrob <- function(x, dev) { x <- x$list if (!is.null(x$vp)) { # recorded pushViewport enforceVP(x$vp, dev) } else if (!is.null(x$path)) { # recorded downViewport enforceVP(x$path, dev) } else if (!is.null(x$n)) { # recorded up or pop unwindVP(NULL, x$n, dev) } } # grid to SVG # Given a gTree created by grid.grab() gridToDev <- function(gTree, dev) { grobToDev(gTree, dev) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/mapping.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000004174�12164147366�013557� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������testUniqueMappings <- function(x) { idNodes <- getNodeSet(x, "//*[@id]") ids <- sapply(idNodes, function(x) xmlGetAttr(x, "id")) length(ids) == length(unique(ids)) } formatTypeMapping <- function(x, type) { objs <- x[x$type == type, c("name", "suffix", "selector", "xpath")] if (! nrow(objs)) return(NULL) objNames <- unique(objs$name) objList <- vector("list", length(objNames)) names(objList) <- objNames for (i in 1:length(objNames)) objList[[i]] <- objs[objs$name == objNames[i], c("suffix", "selector", "xpath")] objList } formatMappings <- function(x) { list(vps = formatTypeMapping(x, "vp"), grobs = formatTypeMapping(x, "grob"), refs = formatTypeMapping(x, "ref"), id.sep = getSVGoption("id.sep"), prefix = get("prefix", envir = .gridSVGEnv)) } exportMappings <- function(x) { x <- formatMappings(x) paste("var gridSVGMappings = ", toJSON(x), ";\n", sep = "") } gridSVGMappingsGen <- function() { mappings <- NULL function(newmappings = NULL) { if (is.null(newmappings)) { mappings } else { mappings <<- newmappings } } } gridSVGMappings <- gridSVGMappingsGen() getSVGMappings <- function(name, type, result = "id") { if (! type %in% c("vp", "grob", "ref")) stop("'type' must be one of 'vp', 'grob' or 'ref'") if (! result %in% c("id", "selector", "xpath")) stop("'result' must be one of 'id', 'selector' or 'xpath'") # Because the list itself uses vp/grob, rewrite type <- paste(type, "s", sep = "") mappings <- gridSVGMappings() if (is.null(mappings)) stop("gridSVGMappings() must be initialised") nameData <- mappings[[type]][[name]] if (is.null(nameData)) stop("Name not found") if (result == "id") paste0(mappings$prefix, name, mappings$id.sep, nameData$suffix) else nameData[[result]] } readMappingsJS <- function(filename) { jsData <- readLines(filename) jsData <- gsub("var gridSVGMappings = ", "", jsData) jsonData <- gsub(";$", "", jsData) fromJSON(paste0(jsonData, collapse = "\n")) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/gradients.R�������������������������������������������������������������������������������0000654�0001762�0000144�00000030543�12757205367�014107� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# High level functions for applying gradients as fills to grobs grid.gradientFill <- function(path, gradient = NULL, label = NULL, alpha = 1, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) { if (is.null(gradient) & is.null(label)) { stop("At least one of 'gradient' or 'label' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.gradientFill") registerGradientFill(label, gradient) gradient <- NULL # use the ref from now on } else if (is.null(gradient)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerGradientFill(label, gradient) gradient <- NULL # use the ref from now on } grobApply(path, function(path) { grid.set(path, gradientFillGrob(grid.get(path), gradient = gradient, label = label, alpha = alpha, group = group), redraw = redraw) }, strict = strict, grep = grep, global = global) invisible() } gradientFillGrob <- function(x, gradient = NULL, label = NULL, alpha = 1, group = TRUE) { if (is.null(gradient) & is.null(label)) { stop("At least one of 'gradient' or 'label' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.gradientFill") registerGradientFill(label, gradient) } else if (is.null(gradient)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerGradientFill(label, gradient) } if (length(alpha) != length(label)) alpha <- rep(alpha, length.out = length(label)) x$referenceLabel <- c(x$referenceLabel, label) x$gradientFillLabel <- label x$gradientFillAlpha <- alpha x$gradientFillGroup <- group class(x) <- unique(c("gradientFilled.grob", class(x))) x } linearGradient <- function(col = c("black", "white"), stops = seq(0, 1, length.out = length(col)), gradientUnits = c("bbox", "coords"), x0 = unit(0, "npc"), x1 = unit(1, "npc"), y0 = unit(0, "npc"), y1 = unit(1, "npc"), default.units = "npc", spreadMethod = c("pad", "reflect", "repeat")) { # Vectorising colours & stops nstops <- max(length(col), length(stops)) col <- rep(col, length.out = nstops) stops <- rep(stops, length.out = nstops) offset <- round(stops, 2) stopCol <- sapply(col, function(x) devColToSVG(x), USE.NAMES = FALSE) stopOpacity <- devColAlphaToSVG(col2rgb(col, alpha = TRUE)[4, ]) gradientUnits <- match.arg(gradientUnits) spreadMethod <- match.arg(spreadMethod) if (! is.unit(x0)) x0 <- unit(x0, default.units) if (! is.unit(x1)) x1 <- unit(x1, default.units) if (! is.unit(y0)) y0 <- unit(y0, default.units) if (! is.unit(y1)) y1 <- unit(y1, default.units) # Convert gradientUnits to SVG values gradientUnits <- switch(gradientUnits, bbox = "objectBoundingBox", coords = "userSpaceOnUse") # Need to get npc-like values from units if (gradientUnits == "objectBoundingBox") { # Convert to npc x0 <- convertX(x0, "npc", valueOnly = TRUE) x1 <- convertX(x1, "npc", valueOnly = TRUE) y0 <- convertY(y0, "npc", valueOnly = TRUE) y1 <- convertY(y1, "npc", valueOnly = TRUE) } grad <- list(element = "linearGradient", gradientUnits = gradientUnits, x1 = x0, x2 = x1, y1 = y0, y2 = y1, spreadMethod = spreadMethod, offset = offset, stopCol = stopCol, stopOpacity = stopOpacity) class(grad) <- c("linear.gradient", "gradient") grad } radialGradient <- function(col = c("black", "white"), stops = seq(0, 1, length.out = length(col)), gradientUnits = c("bbox", "coords"), x = unit(0.5, "npc"), y = unit(0.5, "npc"), r = unit(0.5, "npc"), fx = unit(0.5, "npc"), fy = unit(0.5, "npc"), default.units = "npc", spreadMethod = c("pad", "reflect", "repeat")) { # Vectorising colours & stops nstops <- max(length(col), length(stops)) col <- rep(col, length.out = nstops) stops <- rep(stops, length.out = nstops) offset <- round(stops, 2) stopCol <- sapply(col, function(x) devColToSVG(x), USE.NAMES = FALSE) stopOpacity <- devColAlphaToSVG(col2rgb(col, alpha = TRUE)[4, ]) gradientUnits <- match.arg(gradientUnits) spreadMethod <- match.arg(spreadMethod) if (is.null(stops)) stops <- list() if (! is.unit(x)) x <- unit(x, default.units) if (! is.unit(y)) y <- unit(y, default.units) if (! is.unit(r)) r <- unit(r, default.units) if (! is.unit(fx)) fx <- unit(fx, default.units) if (! is.unit(fy)) fy <- unit(fy, default.units) # Convert gradientUnits to SVG values gradientUnits <- switch(gradientUnits, bbox = "objectBoundingBox", coords = "userSpaceOnUse") # Need to get npc-like values from units if (gradientUnits == "objectBoundingBox") { x <- convertX(x, "npc", valueOnly = TRUE) y <- convertY(y, "npc", valueOnly = TRUE) rw <- convertWidth(r, "npc", valueOnly = TRUE) rh <- convertHeight(r, "npc", valueOnly = TRUE) r <- pmin(abs(rw), abs(rh)) fx <- convertX(fx, "npc", valueOnly = TRUE) fy <- convertY(fy, "npc", valueOnly = TRUE) } grad <- list(element = "radialGradient", gradientUnits = gradientUnits, cx = x, cy = y, r = r, fx = fx, fy = fy, spreadMethod = spreadMethod, offset = offset, stopCol = stopCol, stopOpacity = stopOpacity) class(grad) <- c("radial.gradient", "gradient") grad } print.gradient <- function(x, ...) { prln <- function(label, value) { cat(sprintf(paste0(label, ": %s\n"), value)) } prln("Type", x$element) n <- length(x$offset) prln("Number of stops", n) cat("\n") prln("Gradient stops", "") for (i in 1:n) { cat(" ") cat("Offset:", x$offset[i]) cat(" ") cat("Colour:", x$stopCol[i]) cat(" ") cat("Opacity:", x$stopOpacity[i]) cat("\n") } invisible(x) } flattenLinearGradient <- function(gradient) { # Flatten all locations here if (gradient$gradientUnits == "userSpaceOnUse") { offsets <- getAbsoluteOffset() width <- convertWidth(gradient$x2 - gradient$x1, "inches", valueOnly = TRUE) height <- convertHeight(gradient$y2 - gradient$y1, "inches", valueOnly = TRUE) gradient$x1 <- convertX(gradient$x1, "inches") + offsets[1] gradient$x2 <- convertX(gradient$x2, "inches") + offsets[1] gradient$y1 <- convertY(gradient$y1, "inches") + offsets[2] gradient$y2 <- convertY(gradient$y2, "inches") + offsets[2] } gradient } flattenRadialGradient <- function(gradient) { # Flatten all locations here if (gradient$gradientUnits == "userSpaceOnUse") { offsets <- getAbsoluteOffset() gradient$cx <- convertX(gradient$cx, "inches") + offsets[1] gradient$cy <- convertY(gradient$cy, "inches") + offsets[2] gradient$r <- abs(dToInches(gradient$r, NULL)) gradient$fx <- convertX(gradient$fx, "inches") + offsets[1] gradient$fy <- convertY(gradient$fy, "inches") + offsets[2] } gradient } registerGradientFill <- function(label, gradient) { checkExistingDefinition(label) # Flattening all locations gradient <- if (inherits(gradient, "radial.gradient")) flattenRadialGradient(gradient) else flattenLinearGradient(gradient) gradient$label <- label gradient$id <- getID(label, "ref") class(gradient) <- "gradientDef" refDefinitions <- get("refDefinitions", envir = .gridSVGEnv) refDefinitions[[label]] <- gradient assign("refDefinitions", refDefinitions, envir = .gridSVGEnv) assign("refUsageTable", rbind(get("refUsageTable", envir = .gridSVGEnv), data.frame(label = label, used = FALSE, stringsAsFactors = FALSE)), envir = .gridSVGEnv) # Return NULL invisibly because we don't actually care what the # definition looks like until gridSVG tries to draw it. invisible() } svgLinearGradient <- function(def, dev) { svgdev <- dev@dev # Convert grid coords to SVG coords if we are using coordinates # rather than the bounding box of the referring object if (def$gradientUnits == "userSpaceOnUse") { def$x1 <- cx(def$x1, dev) def$x2 <- cx(def$x2, dev) def$y1 <- cy(def$y1, dev) def$y2 <- cy(def$y2, dev) } gradient <- newXMLNode("linearGradient", parent = svgDevParent(svgdev), attrs = list(id = def$id, x1 = round(def$x1, 2), x2 = round(def$x2, 2), y1 = round(def$y1, 2), y2 = round(def$y2, 2), gradientUnits = def$gradientUnits, spreadMethod = def$spreadMethod)) svgDevChangeParent(gradient, svgdev) } svgRadialGradient <- function(def, dev) { svgdev <- dev@dev # Convert grid coords to SVG coords if we are using coordinates # rather than the bounding box of the referring object if (def$gradientUnits == "userSpaceOnUse") { def$cx <- cx(def$cx, dev) def$cy <- cy(def$cy, dev) def$r <- cd(def$r, dev) def$fx <- cx(def$fx, dev) def$fy <- cy(def$fy, dev) } gradient <- newXMLNode("radialGradient", parent = svgDevParent(svgdev), attrs = list(id = def$id, cx = round(def$cx, 2), cy = round(def$cy, 2), r = round(def$r, 2), fx = round(def$fx, 2), fy = round(def$fy, 2), gradientUnits = def$gradientUnits, spreadMethod = def$spreadMethod)) svgDevChangeParent(gradient, svgdev) } primToDev.gradientFilled.grob <- function(x, dev) { setLabelUsed(x$referenceLabel) label <- getLabelID(x$gradientFillLabel) # Allowing fill-opacity to be set by a garnish because # grid only knows about a colour and its opacity. If we use a # reference instead of a then nothing is known about the opacity. # We want to ensure that we can still set it, so use the garnish # to overwrite it. gf <- garnishGrob(x, fill = paste0("url(#", label, ")"), "fill-opacity" = x$gradientFillAlpha, group = x$gradientFillGroup) # Now need to remove all gradient fill appearances in the class list. # This is safe because repeated gradient filling just clobbers existing # attributes. cl <- class(gf) class(gf) <- cl[cl != "gradientFilled.grob"] primToDev(gf, dev) } drawDef.gradientDef <- function(def, dev) { svgdev <- dev@dev if (def$element == "linearGradient") svgLinearGradient(def, dev) else svgRadialGradient(def, dev) # Adding the gradient stops for (i in 1:length(def$offset)) { newXMLNode("stop", attrs = list(offset = def$offset[i], "stop-color" = def$stopCol[i], "stop-opacity" = def$stopOpacity[i]), parent = svgDevParent(svgdev)) } # Going back up from the stops to the parent of the gradient svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) } # Ensure the gradient fill is retained on a forced grob forceGrob.gradientFilled.grob <- function(x) { y <- NextMethod() if (inherits(y, "forcedgrob")) { y$referenceLabel <- x$referenceLabel y$gradientFillLabel <- x$gradientFillLabel y$gradientFillAlpha <- x$gradientFillAlpha y$gradientFillGroup <- x$gradientFillGroup class(y) <- unique(c("gradientFilled.grob", class(y))) } y } �������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/sanitisers.R������������������������������������������������������������������������������0000654�0001762�0000144�00000007743�12164147366�014315� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Takes a grob name as an input and returns a selector capable of being # used as a CSS selector in JS, e.g.: # jQuery - $(...) # D3 - d3.select(...) # document.querySelector(...) # # Note though, document.getElementById() works *without* escaping. # # Mathias Bynens has written a *JS* implementation of this escaping which we # could use for any JS code, but I think an R port is ideal. This is because # we are not dependent on any external library, and the data is fixed. This # means that it can easily be abstracted away for most purposes. # # https://github.com/mathiasbynens/mothereff.in/blob/master/css-escapes/eff.js # # No escaping necessary for XPath! Should just be "//svg:*[@id='OUR_ID']" # Only need to escape quoting character, (') by default # # Params: # x, a grob name to escape # escapeNonASCII, if we have unicode characters, should we escape them # escapeJS, if we want to have safe values for JS, we need to escape # that too. This is FALSE by default because RJSONIO does this # for us. escapeSelector <- function(x, escapeNonASCII = FALSE, escapeJS = FALSE) { isUTF8 <- localeToCharset()[1] == "UTF-8" # *must* do \ first because it is the escape character and we do not # want to escape any escape characters that we would have added in. escapeCache <- list( "\b" = "\\b", "\t" = "\\t", "\n" = "\\n", "\v" = "\\x0b", "\f" = "\\f", "\r" = "\\r", "\\" = "\\\\", "'" = "\\'", '"' = '\\"' ) # If we have a unicode string, we have to do some special checking if (isUTF8) { # Line separator escapeCache[["\u2028"]] <- "\\u2028" # Paragraph separator escapeCache[["\u2029"]] <- "\\u2029" } chars <- substring(x, 1:nchar(x), 1:nchar(x)) n <- length(chars) # Begin CSS escaping for (i in 1:n) { charcode <- as.integer(charToRaw(chars[i])) # Some unicode char or non-printable char, just escape it if (escapeNonASCII && (length(charcode) > 1 || charcode < 32 || charcode > 126)) chars[i] <- paste0("\\", chars[i]) else { if (grepl("[\t\n\v\f:]", chars[i])) { chars[i] <- paste0("\\", paste0(as.hexmode(charcode), collapse = ""), " ") } else if (grepl("[ !\"#$%&'()*+,./;<=>?@\\[\\\\\\]^`\\{|\\}~]", chars[i], perl = TRUE)) { chars[i] <- paste0("\\", chars[i]) } else { # Do nothing, no escaping required } } } chars <- paste0(chars, collapse = "") # We shouldn't need to escape anything because RJSONIO does this # by default, but the code is here if required if (! escapeJS) return(paste0("#", chars)) chars <- substring(chars, 1:nchar(chars), 1:nchar(chars)) n <- length(chars) # Begin JS escaping for (i in 1:n) { # Would ideally do grepl([\x20-\x26\x28-\x5b\x5d-\x7e], ...) # In decimal this is: 32-38 40-91 93-126 matchVector <- c(32:38, 40:91, 93:126) charcode <- as.integer(charToRaw(chars[i])) if (length(charcode) == 1 && charcode %in% matchVector) { # Do nothing, we do not need to escape this character } else if (! is.null(escapeCache[[chars[i]]])) { chars[i] <- escapeCache[[chars[i]]] } else { chars[i] <- escapeCache[[chars[i]]] <- paste0("\\", chars[i]) } } paste0("#", paste0(chars, collapse = "")) } # Much simpler for XPath, just escape quote chars # x, a grob name to escape escapeXPath <- function(x) { # We're going to use single quotes, so escape only those. # RJSONIO uses ", so is safer to use single quotes if (grepl("'", x)) x <- gsub("'", "\\\\'", x) # Look through the entire document for all elements, # then return only the element with the matching ID. # This could possibly collide with existing IDs if # embedded within a document (e.g. HTML) but very unlikely. paste0("//*[@id='", x, "']") } �����������������������������gridSVG/R/gridsvg.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000027127�13547244232�013570� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Functions to take a grid grob and call appropriate # functions from svg.R to produce SVG output gridToSVG <- function(...) { .Deprecated("grid.export", "gridSVG", "'gridToSVG' is deprecated. Use 'grid.export' in future.'") grid.export(...) } # User function grid.export <- function(name = "Rplots.svg", exportCoords = c("none", "inline", "file"), exportMappings = c("none", "inline", "file"), exportJS = c("none", "inline", "file"), res = NULL, prefix = "", addClasses = FALSE, indent = TRUE, htmlWrapper = FALSE, usePaths = c("vpPaths", "gPaths", "none", "both"), uniqueNames = TRUE, annotate = TRUE, progress = FALSE, compression = 0, strict = TRUE, rootAttrs = NULL, xmldecl = xmlDecl()) { # 'XML' can sometimes give us namespace warnings, despite producing # valid SVG. Silence any warnings that 'XML' might give us. if (! is.null(getOption("gridSVGWarnings")) && ! getOption("gridSVGWarnings")) { oldNSWarning <- options(suppressXMLNamespaceWarning = TRUE) on.exit(options(suppressXMLNamespaceWarning = oldNSWarning$suppressXMLNamespaceWarning)) } # To avoid having to ask to redraw, temporarily disable asking. old.ask <- devAskNewPage(FALSE) on.exit(devAskNewPage(old.ask), add = TRUE) # grid.force() the scene to resolve high-level grobs # to their standard components dev.hold() ; grid.force() ; dev.flush() # Important to know if we need to modify vpPaths/gPaths at all usePaths <- match.arg(usePaths) paths <- if (usePaths == "vpPaths") c(TRUE, FALSE) else if (usePaths == "gPaths") c(FALSE, TRUE) else if (usePaths == "both") rep(TRUE, 2) else # Assume "none" rep(FALSE, 2) assign("use.vpPaths", paths[1], envir = .gridSVGEnv) assign("use.gPaths", paths[2], envir = .gridSVGEnv) assign("uniqueNames", uniqueNames, envir = .gridSVGEnv) assign("prefix", prefix, envir = .gridSVGEnv) assign("addClasses", addClasses, envir = .gridSVGEnv) # Saving how to export exportCoords <- match.arg(exportCoords) exportMappings <- match.arg(exportMappings) exportJS <- match.arg(exportJS) # If we are exporting js but returning a character # vector we need to save the contents inline, because # we don't want to touch the disk if (is.null(name) || ! nzchar(name)) { if (exportCoords == "file") { exportCoords <- "inline" warning('exportCoords changed from "file" to "inline"') } if (exportMappings == "file") { exportMappings <- "inline" warning('exportMappings changed from "file" to "inline"') } if (exportJS == "file") { exportJS <- "inline" warning('exportJS changed from "file" to "inline"') } } assign("exportCoords", exportCoords, envir = .gridSVGEnv) assign("exportMappings", exportMappings, envir = .gridSVGEnv) assign("exportJS", exportJS, envir = .gridSVGEnv) # Ensure contexts work correctly assign("contextNames", character(0), envir = .gridSVGEnv) assign("contextLevels", 0, envir = .gridSVGEnv) # Ensure we're at the top level upViewport(0, recording=FALSE) rootgp <- get.gpar() rootvp <- current.viewport() roottm <- current.transform() if (progress) { assign("showProgress", TRUE, envir = .gridSVGEnv) ngrobs <- length(grid.ls(print = FALSE)$name) progressInit("grob", ngrobs) } svgdev <- openSVGDev(name, width=par("din")[1], height=par("din")[2], res = res, strict = strict, rootAttrs = rootAttrs) # Create a gTree from the current page # NOTE that set the 'gp' slot on this top-level gTree # based on ROOT vp # Use 'wrap=TRUE' to ensure correct capture of all types of 'grid' output gTree <- grid.grab(name="gridSVG", wrap=TRUE, gp=rootgp) if (anyRefsDefined()) { # Reducing only to reference definitions usageTable <- get("usageTable", envir = .gridSVGEnv) usageTable <- usageTable[usageTable$type == "ref", ] assign("usageTable", usageTable, envir = .gridSVGEnv) } else { # Emptying the usage table assign("usageTable", data.frame(name = character(0), suffix = integer(0), type = character(0), selector = character(0), xpath = character(0), stringsAsFactors = FALSE), envir = .gridSVGEnv) } # Emptying point usage table assign("pchUsageTable", matrix(c(0:127, logical(128)), ncol = 2, dimnames = list(NULL, c("pch", "used"))), envir = .gridSVGEnv) # Because the root viewport is never entered into, we need to set # the root vp coordinate information before we start entering into # other VPs currVpCoords <- list(ROOT = getCoordsInfo(rootvp, roottm, svgdev)) assign("vpCoords", currVpCoords, envir = .gridSVGEnv) # When using referenced content, the ID generated at the time of # definition may be different to the ID at draw time, see getSVGoptions() assignRefIDs() # Convert gTree to SVG gridToDev(gTree, svgdev) # Flush out any referenced definitions so that grobs can use them flushDefinitions(svgdev) svgroot <- devClose(svgdev) if (progress) { progressClose() assign("showProgress", FALSE, envir = .gridSVGEnv) } # Adding in JS if necessary, always write utils *last*. # Not strictly necessary but may avoid potential issues in JS. # NOTE that we call in REVERSE order because each one is added # as FIRST child of the root svg node jsutils <- svgJSUtils(exportJS, name, svgroot) mappings <- svgMappings(exportMappings, name, svgroot) coords <- svgCoords(exportCoords, name, svgroot) # If we're annotating output with gridSVG call info if (annotate) { # Realise true values for some arguments if (is.null(name)) name <- "" if (is.null(res)) res <- round(par("cra")[1] / par("cin")[1], 2) # Ignore annotate in this list, because it will be implied # Also ignoring the XML declaration, we can see it in the # output directly. Ignoring compression because it is also # implied and does not affect output. Progress is also not # useful. callAttrs <- list( name = name, exportCoords = exportCoords, exportMappings = exportMappings, exportJS = exportJS, res = res, prefix = prefix, addClasses = addClasses, indent = indent, htmlWrapper = htmlWrapper, usePaths = usePaths, uniqueNames = uniqueNames ) svgAnnotate(svgroot, callAttrs) } # In an on-screen device, we can be left with a blank device # so refresh just to ensure we can see everything. Also happens # with devices like png and pdf so just force a refresh. # Sometimes display lists can be large, flush all drawing at once # to speed up redrawing dev.hold() ; grid.refresh() ; dev.flush() result <- list(svg = svgroot, coords = coords, mappings = mappings, utils = jsutils) if (! testUniqueMappings(svgroot)) warning("Not all element IDs are unique. Consider running 'grid.export' with 'uniqueNames = TRUE'.") # Return SVG list when an inadequate filename is supplied if (is.null(name) || ! nzchar(name)) return(result) doctxt <- saveXML(svgroot, indent = indent) if (! is.null(xmldecl)) doctxt <- paste0(xmldecl, doctxt) # Now save the SVG to a file, optionally a compressed file outcon <- if (compression > 0) gzfile(name, "w") else file(name, "w") cat(doctxt, file = outcon) close(outcon) # Write an HTML wrapper for this if (htmlWrapper) htmlFile(name, svgdev@dev) # Return result invisibly invisible(result) } gridSVG.newpage <- function(wipeRefs = TRUE, recording = TRUE) { if (wipeRefs) { assign("refDefinitions", list(), envir = .gridSVGEnv) assign("refUsageTable", data.frame(label = character(0), used = logical(0), stringsAsFactors = FALSE), envir = .gridSVGEnv) assign("usageTable", data.frame(name = character(0), suffix = integer(0), type = character(0), selector = character(0), xpath = character(0), stringsAsFactors = FALSE), envir = .gridSVGEnv) } grid.newpage(recording = recording) } gridsvg <- function(name = "Rplots.svg", exportCoords = c("none", "inline", "file"), exportMappings = c("none", "inline", "file"), exportJS = c("none", "inline", "file"), res = NULL, prefix = "", addClasses = FALSE, indent = TRUE, htmlWrapper = FALSE, usePaths = c("vpPaths", "gPaths", "none", "both"), uniqueNames = TRUE, annotate = TRUE, progress = FALSE, compression = 0, strict = TRUE, rootAttrs = NULL, xmldecl = xmlDecl(), ...) { # Avoid multiple gridSVG devices (because referenced content can # have side effects across devices) deviceNames <- unlist(.Devices) if ("gridsvg" %in% deviceNames) stop("Only one 'gridsvg' device may be used at a time") argnames <- setdiff(names(formals()), '...') gridsvg.args <- sapply(argnames, get, environment(), simplify = FALSE) dev.args <- list(...) dev.args$file <- NULL # remove file arg dev.args <- c(list(file = NULL), dev.args) # readd do.call("pdf", dev.args) gridSVGArgs <- if (exists("gridSVGArgs", envir = .gridSVGEnv)) get("gridSVGArgs", envir = .gridSVGEnv) else list() gridSVGArgs[[dev.cur()]] <- gridsvg.args assign("gridSVGArgs", gridSVGArgs, envir = .gridSVGEnv) # HACK! # This renames the pdf device to "gridsvg" purely for convenience. devs <- .Devices devs[[dev.cur()]] <- "gridsvg" assign(".Devices", devs, envir = baseenv()) } dev.off <- function(which = dev.cur()) { if (.Devices[[which]] == "gridsvg") { # If there's nothing on the display list then nothing # can be drawn if (! length(grid.ls(print = FALSE)$name)) { grDevices::dev.off(which) warning("No grid image was drawn so no SVG was created") return(invisible()) } gridsvg.args <- get("gridSVGArgs", envir = .gridSVGEnv)[[which]] name <- gridsvg.args$name image <- do.call("grid.export", gridsvg.args) grDevices::dev.off(which) if (is.null(name) || ! nzchar(name)) image else invisible(image) } else { grDevices::dev.off(which) } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/R/devsvg.R����������������������������������������������������������������������������������0000654�0001762�0000144�00000054720�13165014206�013410� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Functions to create an SVG graphics device object, complete with # "methods" for performing all necessary graphical operations # This is designed to foreshadow the time when graphics devices # in R (or at least in grid) are R objects and graphics functions # include the device as an argument (i.e., no longer have # the notion of graphics always going to the "current device") # This will not be called in this way yet (instead, I will just # be running down the grid display list and calling appropriate # methods from that, BUT I thought it was worth designing for the # future anyway. # In another forward-looking move, I will create the device class # and methods for it using S4 methods ################# # Utility functions ################# # Any non-grid parameters is let through untouched # BUT code later in svg.R will complain about things that are # not SVG parameters # NOTE that 'cex'/'lex' have been incorporated into 'fontsize'/'lwd' # and removed by this point devParNameToSVGStyleName <- function(name) { switch(name, col="stroke", colAlpha="stroke-opacity", fill="fill", fillAlpha="fill-opacity", fontweight="font-weight", fontfamily="font-family", fontstyle="font-style", fontsize="font-size", alpha="opacity", lty="stroke-dasharray", lwd="stroke-width", lineend="stroke-linecap", linejoin="stroke-linejoin", linemitre="stroke-miterlimit", name) } # R lwd is in points, pixels or 1/96 inches # However, most (perhaps all?) devices use 1/96 for their # definition of an 'lwd', so use that. devLwdToSVG <- function(lwd, lty, dev) { svglwd <- round(lwd/96 * dev@res, 2) if (!is.null(lty)) { blankLty <- lty == "blank" svglwd[blankLty] <- 0 } svglwd } # An R lty has to become an SVG stroke-dasharray # This is going to be imperfect (to say the least) devLtyToSVG <- function(lty, lwd) { ## If necessary, convert numeric lty to char if (is.numeric(lty)) { lty[lty == 0] <- "blank" lty[lty == 1] <- "solid" lty[lty == 2] <- "dashed" lty[lty == 3] <- "dotted" lty[lty == 4] <- "dotdash" lty[lty == 5] <- "longdash" lty[lty == 6] <- "twodash" } # Convert lty to numeric vec numlty <- lapply(lty, function(x) { switch(x, blank=, solid=0, ## These numbers taken from ?par dashed=c(4, 4), dotted=c(1, 3), dotdash=c(1, 3, 4, 3), longdash=c(7, 3), twodash=c(2, 2, 6, 2), ## Otherwise we're a hex string as.numeric(as.hexmode(strsplit(lty, "")[[1]]))) }) # Scale by lwd scaledlty <- mapply(function(x, y) x*y, numlty, lwd, SIMPLIFY=FALSE) # Convert to SVG stroke-dasharray string sapply(scaledlty, function(x) { paste(ifelse(x == 0, "none", round(x, 2)), collapse=",") }) } devColToSVG <- function(col) { zeroCol <- is.numeric(col) & col == 0 col[zeroCol] <- "transparent" svgCol <- paste("rgb(", apply(col2rgb(col), 2, paste, collapse=","), ")", sep="") ## Handle "transparent" as a special case transCol <- col == "transparent" svgCol[transCol] <- "none" svgCol } devColAlphaToSVG <- function(colAlpha) { round(colAlpha/255, 2) } devFontSizeToSVG <- function(fontsize, dev) { round(fontsize/72 * dev@res, 2) } devLineJoinToSVG <- function(linejoin, dev) { # Only need to change spelling of mitre, SVG takes american form ifelse(linejoin == "mitre", "miter", linejoin) } devFontFaceToSVG <- function(fontface) { # CSS uses two different properties to configure the appearance of a font # Setting defaults to CSS defaults N <- length(fontface) fontWeightCSS <- rep("normal", N) fontStyleCSS <- rep("normal", N) if (is.numeric(fontface)) { ffbold <- fontface == 2 ffitalic <- fontface == 3 ffbolditalic <- fontface == 4 } if (is.character(fontface)) { ffbold <- fontface == "bold" ffitalic <- fontface == "italic" ffbolditalic <- fontface == "bold.italic" } fontWeightCSS[ffbold] <- "bold" fontStyleCSS[ffitalic] <- "italic" fontWeightCSS[ffbolditalic] <- "bold" fontStyleCSS[ffbolditalic] <- "italic" list(fontweight=fontWeightCSS, fontstyle=fontStyleCSS) } getSVGFonts <- function() { get("gridSVG.fonts", envir = .gridSVGEnv) } setSVGFonts <- function(fontStacks) { if (! all(names(fontStacks) == c("sans", "serif", "mono"))) stop("Font settings must have fonts available for 'sans', 'serif' and 'mono'.") # Need to ensure that basic font fallbacks are available and # are placed at the end of each of the font stacks. if (! "sans-serif" %in% fontStacks$sans) { fontStacks$sans <- c(fontStacks$sans, "sans-serif") } else if (tail(fontStacks$sans, n = 1) != "sans-serif") { ind <- which(fontStacks$sans == "sans-serif") cleanedSans <- fontStacks$sans[-ind] fontStacks$sans <- c(cleanedSans, "sans-serif") } if (! "serif" %in% fontStacks$serif) { fontStacks$serif <- c(fontStacks$serif, "serif") } else if (tail(fontStacks$serif, n = 1) != "serif") { ind <- which(fontStacks$serif == "serif") cleanedSerif <- fontStacks$serif[-ind] fontStacks$serif <- c(cleanedSerif, "serif") } if (! "monospace" %in% fontStacks$mono) { fontStacks$mono <- c(fontStacks$mono, "monospace") } else if (tail(fontStacks$mono, n = 1) != "monospace") { ind <- which(fontStacks$mono == "monospace") cleanedMono <- fontStacks$mono[-ind] fontStacks$mono <- c(cleanedMono, "monospace") } assign("gridSVG.fonts", fontStacks, envir = .gridSVGEnv) } # Setting default font stacks sansFontStack <- c("Helvetica", "Arial", "FreeSans", "Liberation Sans", "Nimbus Sans L", "sans-serif") serifFontStack <- c("Times", "Times New Roman", "Liberation Serif", "Nimbus Roman No9 L Regular", "serif") monoFontStack <- c("Courier", "Courier New", "Nimbus Mono L", "monospace") setSVGFonts(list(sans = sansFontStack, serif = serifFontStack, mono = monoFontStack)) fontStackFromFontFamily <- function(fontfamily, currentFonts) { N <- length(fontfamily) stack <- rep("sans", N) sansfamily <- fontfamily %in% c(currentFonts$sans, "sans") seriffamily <- fontfamily %in% c(currentFonts$serif, "serif") monofamily <- fontfamily %in% c(currentFonts$mono, "mono") stack[seriffamily] <- "serif" stack[monofamily] <- "mono" stack[!(sansfamily | seriffamily | monofamily)] <- "unknown" stack } devFontFamilyToSVG <- function(fontfamily) { currentFonts <- getSVGFonts() stacknames <- fontStackFromFontFamily(fontfamily, currentFonts) knownFont <- stacknames != "unknown" blankFont <- nchar(fontfamily) == 0 fontstacks <- vector("list", length(fontfamily)) fontstacks[knownFont] <- currentFonts[stacknames[knownFont]] ## Assume font exists, but also assume sans-serif fallback if (any(!knownFont & !blankFont)) { fontstacks[!knownFont & !blankFont] <- list(c(fontfamily[!knownFont & !blankFont], currentFonts$sans)) } ## Assuming a sans-serif font if (any(!knownFont & blankFont)) { fontstacks[!knownFont & blankFont] <- list(currentFonts$sans) } # Formatting the font stack for CSS fontStackCSS <- sapply(fontstacks, paste, collapse=', ') # Returning the font stack fontStackCSS } devParToSVGPar <- function(name, par, dev) { if (is.null(par)) "none" else { ifelse(is.na(par), "none", switch(name, col=devColToSVG(par), colAlpha=devColAlphaToSVG(par), fill=devColToSVG(par), fillAlpha=devColAlphaToSVG(par), fontsize=devFontSizeToSVG(par, dev), fontfamily=devFontFamilyToSVG(par), linejoin=devLineJoinToSVG(par, dev), ## By default just pass through the actual value ## e.g., lty has already been converted at this point par)) } } devParToSVGStyle <- function(gp, dev) { if (is.null(gp)) result <- svgStyle() else { result <- list() # convert "cex" into "fontsize" if ("cex" %in% names(gp)) { if ("fontsize" %in% names(gp)) gp$fontsize <- (gp$fontsize * gp$cex) else gp$fontsize <- (get.gpar("fontsize")[[1]] * gp$cex) gp$cex <- NULL } # Do the same for "lex" if ("lex" %in% names(gp)) { if ("lwd" %in% names(gp)) gp$lwd <- (gp$lwd * gp$lex) else gp$lwd <- (get.gpar("lwd")[[1]] * gp$lex) gp$lex <- NULL } # Just remove "lineheight" (this has already been incorporated # into text object information by this point) # Remove it so that it is not exported as SVG attribute gp$lineheight <- NULL # Scale lwd amd zero lwd if lty is "blank" if ("lwd" %in% names(gp)) { if ("lty" %in% names(gp)) { gp$lwd <- devLwdToSVG(gp$lwd, gp$lty, dev) } else { gp$lwd <- devLwdToSVG(gp$lwd, NULL, dev) } } # Scale lty by lwd if ("lty" %in% names(gp)) { if ("lwd" %in% names(gp)) { gp$lty <- devLtyToSVG(gp$lty, gp$lwd) } else { gp$lty <- devLtyToSVG(gp$lty, 1) } } # Font is an alias for fontface, set to fontface if ("font" %in% names(gp)) { gp$fontface <- gp$font gp$font <- NULL } # Split fontface into fontweight and fontstyle if ("fontface" %in% names(gp)) { svgFont <- devFontFaceToSVG(gp$fontface) gp$fontweight <- svgFont$fontweight gp$fontstyle <- svgFont$fontstyle gp$fontface <- NULL } for (i in names(gp)) if (!is.na(devParNameToSVGStyleName(i))) result[[devParNameToSVGStyleName(i)]] <- devParToSVGPar(i, gp[[i]], dev) } result } ################# # SVG Device Stuff ################# setClass("svgDevice", representation("graphicsDevice", res="numeric", attrs="list", links="character", show="character", # Object created by svgDevice() in svg.R # has no S4 class yet dev="ANY")) setMethod("inchToDevX", signature(device="svgDevice"), function(x, device) { x * device@res }) setMethod("inchToDevY", signature(device="svgDevice"), function(x, device) { x * device@res }) setMethod("devArrow", signature(device="svgDevice"), function(arrow, gp, device) { # Angle is specified for the arrowhead in degrees, need radians ratAngle <- (pi / 180) * arrow$angle # We know the length, it is the hypotenuse, need to find the # length of the opposite line for the entire arrowhead, not # just one half midpoint <- sin(ratAngle) * arrow$length arrowWidth <- midpoint * 2 xmult <- cos(ratAngle) arrowX <- xmult * arrow$length xs <- unit.c(unit(0, "inches"), arrowX, unit(0, "inches")) ys <- unit.c(unit(0, "inches"), midpoint, arrowWidth) x <- cx(xs, device) y <- cy(ys, device) svgMarker(x, y, arrow$type, arrow$ends, sign(xmult), arrow$name, devParToSVGStyle(gp, device), device@dev) }) setMethod("devLines", signature(device="svgDevice"), function(lines, gp, device) { svgLines(lines$x, lines$y, lines$name, lines$arrow, device@attrs, device@links, device@show, devParToSVGStyle(gp, device), device@dev) }) setMethod("devPolygon", signature(device="svgDevice"), function(polygon, gp, device) { svgPolygon(polygon$x, polygon$y, polygon$name, device@attrs, device@links, device@show, devParToSVGStyle(gp, device), device@dev) }) setMethod("devPath", signature(device="svgDevice"), function(path, gp, device) { svgPath(path$x, path$y, path$rule, path$name, device@attrs, device@links, device@show, devParToSVGStyle(gp, device), device@dev) }) setMethod("devRaster", signature(device="svgDevice"), function(raster, gp, device) { svgRaster(raster$x, raster$y, raster$width, raster$height, raster$angle, raster$datauri, raster$name, raster$just, raster$vjust, raster$hjust, listToSVGAttrib(raster$attributes), device@links, device@show, devParToSVGStyle(gp, device), device@dev) }) setMethod("devRect", signature(device="svgDevice"), function(rect, gp, device) { svgRectString(rect$x, rect$y, rect$width, rect$height, rect$angle, rect$name, device@attrs, device@links, device@show, devParToSVGStyle(gp, device), device@dev) }) setMethod("devText", signature(device="svgDevice"), function(text, gp, device) { # SVG text will use fill, but fill has already been # set to col back in primToDev.text() in griddev.R svgText(text$x, text$y, text$text, text$hjust, text$vjust, text$rot, text$width, text$height, text$angle, text$ascent, text$descent, text$lineheight, text$charheight, text$fontheight, text$fontfamily, text$fontface, text$name, device@attrs, device@links, device@show, devParToSVGStyle(gp, device), device@dev) }) setMethod("devCircle", signature(device="svgDevice"), function(circle, gp, device) { svgCircleString(circle$x, circle$y, circle$r, circle$name, device@attrs, device@links, device@show, devParToSVGStyle(gp, device), device@dev) }) setMethod("devStartElement", signature(device="svgDevice"), function(element, gp, device) { # Ignore gp, complicates output svgStartElement(id = element$id, classes = element$classes, element = element$name, attrs = element$attrs, namespace = element$namespace, namespaceDefinitions = element$namespaceDefinitions, attributes = device@attrs, links = device@links, show = device@show, svgdev = device@dev) }) setMethod("devEndElement", signature(device="svgDevice"), function(name, device) { svgEndElement(name, device@links, device@dev) }) setMethod("devTextNode", signature(device="svgDevice"), function(text, device) { svgTextNode(text$text, device@dev) }) setMethod("devStartClip", signature(device="svgDevice"), function(clip, gp, device) { svgClipPath(clip$name, clip$x, clip$y, clip$width, clip$height, clip$angle, device@dev) # Because of the fact that we never stop clipping until # we pop our current viewport, we need to store information # on how many times we have clipped. # This allows us to traverse back up the appropriate number # of SVG s. cl <- get("contextLevels", envir = .gridSVGEnv) cl[length(cl)] <- cl[length(cl)] + 1 assign("contextLevels", cl, envir = .gridSVGEnv) # Can hard-code 'clip' and 'coords' because we're always clipping # but we're not a viewport. # 'style' is always going to be NULL too. svgStartGroup(clip$name, clip=TRUE, attributes=device@attrs, links=device@links, show=device@show, style=devParToSVGStyle(gp, device), coords = NULL, classes = clip$classes, svgdev=device@dev) }) setMethod("devStartClipPath", signature(device="svgDevice"), function(clippath, gp, device) { svgStartGrobClipPath(clippath$name, device@dev) }) setMethod("devEndClipPath", signature(device="svgDevice"), function(clippath, gp, device) { svgEndGrobClipPath(device@dev) }) setMethod("devStartClipPathGroup", signature(device="svgDevice"), function(clippath, gp, device) { svgStartGrobClipPathGroup(clippath$name, clippath$cp, clippath$classes, device@dev) # Because of the fact that we never stop clipping until # we pop our current viewport, we need to store information # on how many times we have clipped. # This allows us to traverse back up the appropriate number # of SVG s. cl <- get("contextLevels", envir = .gridSVGEnv) cl[length(cl)] <- cl[length(cl)] + 1 assign("contextLevels", cl, envir = .gridSVGEnv) # Also note the ID because we're pushing a context, makes it # easier to locate later assign("contextNames", c(get("contextNames", envir = .gridSVGEnv), clippath$name), envir = .gridSVGEnv) }) setMethod("devStartMask", signature(device="svgDevice"), function(mask, gp, device) { svgStartMask(mask$name, mask$x, mask$y, mask$width, mask$height, device@dev) }) setMethod("devEndMask", signature(device="svgDevice"), function(mask, gp, device) { svgEndMask(device@dev) }) setMethod("devStartMaskGroup", signature(device="svgDevice"), function(mask, gp, device) { svgStartMaskGroup(mask$name, mask$mask, mask$classes, device@dev) # Because of the fact that we never stop clipping until # we pop our current viewport, we need to store information # on how many times we have clipped. # This allows us to traverse back up the appropriate number # of SVG s. cl <- get("contextLevels", envir = .gridSVGEnv) cl[length(cl)] <- cl[length(cl)] + 1 assign("contextLevels", cl, envir = .gridSVGEnv) # Also note the ID because we're pushing a context, makes it # easier to locate later assign("contextNames", c(get("contextNames", envir = .gridSVGEnv), mask$name), envir = .gridSVGEnv) }) setMethod("devStartGroup", signature(device="svgDevice"), function(group, gp, device) { clip <- FALSE if (! is.null(group$clip)) { if (group$clip) { clip <- TRUE svgClipPath(group$name, group$vpx, group$vpy, group$vpw, group$vph, group$angle, device@dev) } } # If we're starting a VP, then allow for "contexts" to be # added to children of this VP. A context is a clip path # or mask. Coords are only present via VPs. if (! is.null(group$coords)) { assign("contextLevels", c(get("contextLevels", envir = .gridSVGEnv), 0), envir = .gridSVGEnv) } svgStartGroup(group$name, clip=clip, attributes=device@attrs, links=device@links, show=device@show, style=devParToSVGStyle(gp, device), coords = group$coords, classes = group$classes, svgdev=device@dev) }) setMethod("devEndGroup", signature(device="svgDevice"), function(name, vp, device) { svgEndGroup(name, device@links, vp, device@dev) }) setMethod("devStartSymbol", signature(device="svgDevice"), function(pch, device) { svgStartSymbol(pch, device@dev) }) setMethod("devPoint", signature(device="svgDevice"), function(pch, device) { svgPoint(pch, device@dev) }) setMethod("devEndSymbol", signature(device="svgDevice"), function(device) { svgEndSymbol(device@dev) }) setMethod("devUseSymbol", signature(device="svgDevice"), function(point, gp, device) { svgUseSymbolString(point$name, point$x, point$y, point$size, point$pch, point$angle, device@attrs, device@links, device@show, devParToSVGStyle(gp, device), device@dev) }) setMethod("devClose", signature(device="svgDevice"), function(device) { svgClose(device@dev) }) ################# # User Functions ################# openSVGDev <- function(name="Rplots.svg", width=6, height=6, res=NULL, strict=TRUE, rootAttrs=NULL) { if (is.null(res)) res <- par("cra")[1]/par("cin")[1] # par("cra")[2]/par("cin")[2]*height)) new("svgDevice", width=width, height=height, res=res, dev=svgOpen(res*width, res*height, strict, rootAttrs)) } ������������������������������������������������gridSVG/R/attrib.R����������������������������������������������������������������������������������0000654�0001762�0000144�00000007771�12616256403�013412� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Add arbitrary SVG attributes to a grob # This works by ... # 1. Enhancing a normal "grob" to make a "garnished.grob" # by adding an 'attributes' component # 2. Intercepting primToDev() calls (special method for "garnished.grob"s) # and setting an 'attrs' slot in the SVG device object. # The vectors of attribute values are given names # using the same name-generating function as is used in # normal primToDev() methods, subGrobName(). # THEN the normal primToDev() method is called # (which will create SVG code). # 3. svg*() functions (like svgRect()) are sent the 'attrs' slot # from the SVG device. # These functions look in the attributes that they are given # and pull out the values where the 'name' corrsponds to # the 'id' of the element that they are drawing. # The idea is that, if only ONE attribute value is specified, then the # attribute value is given the name of the grob, so it will get picked # up by the devStartGroup() call and the attribute will be set on the # overall element. # Otherwise, the attribute values # are named using subGrobName() so that they will get picked up by # calls like devRect() and each individual SVG element will get the # attribute (rather than the overall element). garnishGrob <- function(x, ..., group=TRUE) { cl <- class(x) # Should check that attributes are valid # Will need to be generic check with per-grob-type versions if (group) { x$groupAttributes <- c(x$groupAttributes, list(...)) } else { x$attributes <- c(x$attributes, list(...)) } class(x) <- unique(c("garnished.grob", cl)) x } grid.garnish <- function(path, ..., group=TRUE, redraw = FALSE, strict=FALSE, grep=FALSE, global=FALSE) { grobApply(path, function(path) { grid.set(path, garnishGrob(grid.get(path), ..., group=group), redraw = redraw) }, strict = strict, grep = grep, global = global) invisible() } garnish <- function(x, ...) { UseMethod("garnish") } # This is intended to handle all basic graphical primitives garnish.grob <- function(x, ...) { x$name <- getID(x$name, "grob", FALSE) c(lapply(x$attributes, function(attr) { n <- length(attr) if (is.null(names(attr))) names(attr) <- subGrobName(x$name, 1:n) attr }), lapply(x$groupAttributes, function(attr, groupName) { names(attr) <- x$name attr })) } # A hopefully useful default for gTrees garnish.gTree <- function(x, ...) { x$name <- getID(x$name, "grob", FALSE) c(lapply(x$attributes, function(attr) { n <- length(attr) if (is.null(names(attr))) names(attr) <- sapply((x$childrenOrder)[1:n], function(x) getID(x, "grob", FALSE)) attr }), lapply(x$groupAttributes, function(attr, groupName) { names(attr) <- x$name attr })) } # NOTE that this has to be a primToDev() method # NOT a grobToDev() method # OTHERWISE, viewports will not be set up correctly primToDev.garnished.grob <- function(x, dev) { dev@attrs <- garnish(x) NextMethod() } grobApply <- function(path, FUN, ..., strict = FALSE, grep = FALSE, global = FALSE) { paths <- grid.grep(path, strict=strict, grep=grep, global=global) if (length(paths)) { if (global) { lapply(paths, FUN, ...) } else { FUN(paths, ...) } } } # Ensure the attributes are retained on a forced grob forceGrob.garnished.grob <- function(x) { y <- NextMethod() if (inherits(y, "forcedgrob")) { y$attributes <- x$attributes y$groupAttributes <- x$groupAttributes class(y) <- unique(c("garnished.grob", class(y))) } y } �������gridSVG/R/animate.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000166755�13562666047�013565� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ####################### # "animValue" stuff ####################### # An animValue is a vector PLUS a timeid PLUS an id animValue <- function(x, timeid=NULL, id=NULL) { if (!is.atomic(x)) stop("'x' must be a atomic") if (!is.null(timeid)) timeid <- rep(timeid, length.out=length(x)) if (!is.null(id)) id <- rep(id, length.out=length(x)) tu <- list(values=x, timeid=timeid, id=id) class(tu) <- "animValue" tu } is.animValue <- function(x) inherits(x, "animValue") as.animValue <- function(x, ...) { UseMethod("as.animValue") } as.animValue.animValue <- function(x, ...) x as.animValue.numeric <- function(x, ...) { animValue(x) } as.animValue.character <- function(x, ...) { animValue(x) } # 'multVal' controls whether columns of the matrix are used as # 'timeid' or 'id' as.animValue.matrix <- function(x, multVal=FALSE, ...) { if (multVal) { animValue(x, timeid=rep(1:ncol(x), each=nrow(x))) } else { animValue(x, id=rep(1:ncol(x), each=nrow(x))) } } as.animValue.list<- function(x, multVal=FALSE, ...) { if (!all(sapply(x, is.atomic))) stop("All components of list must be atomic") if (multVal) { animValue(unlist(x), timeid=rep(1:length(x), sapply(x, length))) } else { animValue(unlist(x), id=rep(1:length(x), sapply(x, length))) } } listFromAnimValue <- function(x) { if (is.null(x$id)) { if (is.null(x$timeid)) { n <- length(x$values) animValueList <- as.list(x$values) } else { times <- unique(x$timeid) n <- length(times) animValueList <- split(x$values, x$timeid) } names(animValueList) <- paste("t", 1:n, sep="") } else { shapes <- unique(x$id) ns <- length(shapes) animValueList <- vector("list", ns) for (i in 1:ns) { animValueList[[i]] <- listFromAnimValue(animValue(x$values[x$id == i], x$timeid[x$id == i])) } names(animValueList) <- paste("id", 1:ns, sep="") } animValueList } print.animValue <- function(x, ...) { # Generate list from animValue and then print the list print(listFromAnimValue(x)) } ####################### # "animUnit" stuff # An animUnit is a unit PLUS a timeid PLUS an id # The timeid breaks the values in the unit into different time # periods, and the id breaks the values into different shapes animUnit <- function(x, timeid=NULL, id=NULL) { if (!is.unit(x)) stop("'x' must be a unit object") if (!is.null(timeid)) timeid <- rep(timeid, length.out=length(x)) if (!is.null(id)) id <- rep(id, length.out=length(x)) tu <- list(values=x, timeid=timeid, id=id) class(tu) <- "animUnit" tu } is.animUnit <- function(x) inherits(x, "animUnit") as.animUnit <- function(x, ...) { UseMethod("as.animUnit") } as.animUnit.animUnit <- function(x, ...) x as.animUnit.numeric <- function(x, unit=NULL, ...) { if (is.null(unit)) stop("Require 'unit' to convert numeric vector") animUnit(unit(x, unit)) } as.animUnit.unit <- function(x, ...) { animUnit(x) } # 'multVal' controls whether columns of the matrix are used as # 'timeid' or 'id' as.animUnit.matrix <- function(x, unit=NULL, multVal=FALSE, ...) { if (is.null(unit)) stop("Require 'unit' to convert matrix") if (multVal) { animUnit(unit(x, unit), timeid=rep(1:ncol(x), each=nrow(x))) } else { animUnit(unit(x, unit), id=rep(1:ncol(x), each=nrow(x))) } } as.animUnit.list<- function(x, multVal=FALSE, ...) { if (!all(sapply(x, is.unit))) stop("All components of list must be units") if (multVal) { animUnit(do.call("unit.c", x), timeid=rep(1:length(x), sapply(x, length))) } else { animUnit(do.call("unit.c", x), id=rep(1:length(x), sapply(x, length))) } } listFromAnimUnit <- function(x) { if (is.null(x$id)) { if (is.null(x$timeid)) { n <- length(x$values) animUnitList <- vector("list", n) for (i in 1:n) animUnitList[[i]] <- x$values[i] } else { times <- unique(x$timeid) n <- length(times) animUnitList <- vector("list", n) for (i in 1:n) animUnitList[[i]] <- x$values[x$timeid == i] } names(animUnitList) <- paste("t", 1:n, sep="") } else { shapes <- unique(x$id) ns <- length(shapes) animUnitList <- vector("list", ns) for (i in 1:ns) { animUnitList[[i]] <- listFromAnimUnit(animUnit(x$values[x$id == i], x$timeid[x$id == i])) } names(animUnitList) <- paste("id", 1:ns, sep="") } animUnitList } print.animUnit <- function(x, ...) { # Generate list from animUnit and then print the list print(listFromAnimUnit(x)) } # duration says how many SECONDS the animation lasts for # id indicates the identity of multiple animated values # (i.e., allows a vector of animated values) # If "auto" then it depends on the number and size # of the elements being animated. If there is # only one element, it is NULL. # rep says how many times to repeat the animation # (TRUE means indefinitely; FALSE means once) # revert says whether to revert to the start value of the # animation upon completion autoid <- function(id) { if (!is.numeric(id)) if (id == "auto") TRUE else stop("Invalid id") else FALSE } animationSet <- function(..., duration=1, rep=FALSE, revert=FALSE, begin=0, interp="linear") { animations <- list(...) if (is.null(animations[[1]])) stop("need argument to animate") list(animations=animations, begin=begin, interp=interp, duration=duration, rep=rep, revert=revert) } animateGrob <- function(grob, ..., duration=1, rep=FALSE, revert=FALSE, begin=0, interpolate="linear", group=FALSE) { if (!interpolate %in% c("linear", "discrete")) stop("Invalid interpolation method") as <- animationSet(..., duration=duration, rep=rep, revert=revert, begin=begin, interp=interpolate) cl <- class(grob) if (group) { grob$groupAnimationSets <- c(grob$groupAnimationSets, list(as)) } else { grob$animationSets <- c(grob$animationSets, list(as)) } class(grob) <- unique(c("animated.grob", cl)) grob } grid.animate <- function(path, ..., group=FALSE, redraw = FALSE, strict=FALSE, grep=FALSE, global=FALSE) { grobApply(path, function(path) { grid.set(path, animateGrob(grid.get(path), ..., group=group), redraw = redraw) }, strict = strict, grep = grep, global = global) invisible() } applyAnimation <- function(x, ...) { UseMethod("applyAnimation") } ############################ # Convert to animValue then take value(s) for shape "i" # This function is designed for animValues where timeid is NULL # so that each time period has only ONE value # RETURN a VECTOR ithValue <- function(animValues, i) { av <- as.animValue(animValues) if (!is.null(av$timeid)) stop("Expecting only one value per time point") if (is.null(av$id)) av$values else av$values[av$id == i] } ## If the API is available, extract unit "unit" the right way unitType <- function(x) { if (getRversion() >= "4.0.0") { ## Call this way to avoid R CMD check errors in R < 4.0.0 about ## grid::unitType() not being exported unitType <- get("unitType", envir=asNamespace("grid")) unitType(x) } else { attr(x, "unit") } } # Convert to animUnit then take unit(s) for shape "i" # This function is designed for animUnits where timeid is NULL # so that each time period has only ONE value # RETURN a UNIT ithUnit <- function(animValues, origValue, i) { au <- as.animUnit(animValues, # Only take the first "unit" value unit=unitType(origValue)[1]) if (!is.null(au$timeid)) stop("Expecting only one value per time point") if (is.null(au$id)) au$values else au$values[au$id == i] } # Convert to animValue then take value(s) for shape "i" # This function is designed for animValues where there is a timeid # so that each time period has MULTIPLE values # RETURN an ANIMVALUE ithAnimValue <- function(animValues, i) { av <- as.animValue(animValues, multVal=TRUE) if (is.null(av$timeid)) stop("Expecting multiple values per time point") if (is.null(av$id)) av else animValue(av$values[av$id == i], av$timeid[av$id == i]) } # Convert to animUnit then take unit(s) for shape "i" # This function is designed for animUnit where there is a timeid # so that each time period has MULTIPLE values # RETURN an ANIMUNIT ithAnimUnit <- function(animValues, origValue, i) { au <- as.animUnit(animValues, # Only take the first "unit" value unit=unitType(origValue)[1], multVal=TRUE) if (is.null(au$timeid)) stop("Expecting multiple values per time point") if (is.null(au$id)) au else animUnit(au$values[au$id == i], au$timeid[au$id == i]) } ###################### # applyAnimation methods # # There is one of these for each primitive, but they all have similar # structure: # if (group) # animate the element # else # some sets of values (e.g., x/y) are animated together # so bail out if this combination has already been animated # recycle animation values to full length # for each shape ... # select anim values # animate sets of values # animate anything else ###################### ###################### # FIXME: # When animating some cobination x/y/width/height/size AT THE SAME TIME # the code below only makes sense if the number of time periods # is the same for all of x/y/width/height/size (that are being animated) ###################### applyAnimation.rect <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { # We may be dealing with multiple rects that need animating n <- max(length(x$x), length(x$y), length(x$width), length(x$height)) # Rep the original x/y/width/height out to be the same length x$x <- rep(x$x, length.out=n) x$y <- rep(x$y, length.out=n) x$width <- rep(x$width, length.out=n) x$height <- rep(x$height, length.out=n) # Repeating animation parameters so that each element can have # distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) angle <- current.rotation() for (i in 1:n) { subName <- subGrobName(x$name, i) # If x AND y change, need to transform together # If width/height changes, have to animate x/y as well # because SVG does not have justification if ("x" %in% names(animSet$animations)) xi <- ithUnit(animSet$animations$x, x$x, i) else xi <- x$x[i] if ("y" %in% names(animSet$animations)) yi <- ithUnit(animSet$animations$y, x$y, i) else yi <- x$y[i] if ("width" %in% names(animSet$animations)) widthi <- ithUnit(animSet$animations$width, x$width, i) else widthi <- x$width[i] if ("height" %in% names(animSet$animations)) heighti <- ithUnit(animSet$animations$height, x$height, i) else heighti <- x$height[i] lb <- leftbottom(xi, yi, widthi, heighti, x$just, x$hjust, x$vjust, dev) switch(animation, x={ svgAnimateXYWH("x", cx(lb$x, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) if (angle != 0) { if (!("y" %in% names(animSet$animations))) { svgAnimateXYWH("y", cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } svgAnimateRotation(angle, cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) } }, y={ svgAnimateXYWH("y", cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) if (angle != 0) { if (!("x" %in% names(animSet$animations))) { svgAnimateXYWH("x", cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } svgAnimateRotation(angle, cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) } }, width={ # If x is also animated, this has already been handled above if (!("x" %in% names(animSet$animations))) { svgAnimateXYWH("x", cx(lb$x, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } if (angle != 0) { if (!("y" %in% names(animSet$animations))) { svgAnimateXYWH("y", cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } svgAnimateRotation(angle, cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) } dim <- dimToInches(ithUnit(animSet$animations$width, x$width, i), x$height[i], dev) svgAnimateXYWH("width", cw(dim$w, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }, height={ if (!("y" %in% names(animSet$animations))) { svgAnimateXYWH("y", cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } if (angle != 0) { if (!("x" %in% names(animSet$animations))) { svgAnimateXYWH("x", cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } svgAnimateRotation(angle, cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) } dim <- dimToInches(x$width[i], ithUnit(animSet$animations$height, x$height, i), dev) svgAnimateXYWH("height", ch(dim$h, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }, # Any other attribute { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }) } } } applyAnimation.circle <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { # We may be dealing with multiple circles that need animating n <- max(length(x$x), length(x$y), length(x$r)) # Rep the original x/y/width/height out to be the same length x$x <- rep(x$x, length.out=n) x$y <- rep(x$y, length.out=n) x$r <- rep(x$r, length.out=n) # Repeating animation parameters so that each element can have # distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) # Because grobs can produce multiple elements, if animation is to # occur on a grob it is assumed to occur on all elements, but # elements may simply have their properties assigned to the same # value multiple times. # # Also note that when casting to a matrix, units lose their "unit" # attribute, we have to set this to the same unit as the grob # attribute that is being animated, for this reason, attributes should # be in the same unit prior to calling grid.animate() for (i in 1:n) { subName <- subGrobName(x$name, i) if ("x" %in% names(animSet$animations)) xi <- ithUnit(animSet$animations$x, x$x, i) else xi <- x$x[i] if ("y" %in% names(animSet$animations)) yi <- ithUnit(animSet$animations$y, x$y, i) else yi <- x$y[i] switch(animation, x={ loc <- locToInches(xi, yi, dev) svgAnimateXYWH("cx", cx(loc$x, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }, y={ loc <- locToInches(xi, yi, dev) svgAnimateXYWH("cy", cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }, r={ svgAnimateXYWH("r", cd(ithUnit(animSet$animations$r, x$r, i), dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }, # Any other attribute { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }) } } } applyAnimation.points <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { ## We may be dealing with multiple points that need animating n <- max(length(x$x), length(x$y), length(x$size)) ## Rep the original x/y/width/height out to be the same length x$x <- rep(x$x, length.out=n) x$y <- rep(x$y, length.out=n) x$pch <- rep(x$pch, length.out = n) x$size <- rep(x$size, length.out = n) ## Need to grab the lwd so that we can keep line thickness the same ## as we change the size of a point if (! is.null(x$gp$lwd)) sw <- x$gp$lwd else sw <- get.gpar()$lwd if (! is.null(x$gp$lty)) lty <- x$gp$lty else lty <- get.gpar()$lty sw <- rep(as.numeric(devLwdToSVG(sw, lty, dev)), length.out = n) ## Repeating animation parameters so that each element can have ## distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) ## Because grobs can produce multiple elements, if animation is to ## occur on a grob it is assumed to occur on all elements, but ## elements may simply have their properties assigned to the same ## value multiple times. for (i in 1:n) { subName <- subGrobName(x$name, i) if ("x" %in% names(animSet$animations)) xi <- ithUnit(animSet$animations$x, x$x, i) else xi <- x$x[i] if ("y" %in% names(animSet$animations)) yi <- ithUnit(animSet$animations$y, x$y, i) else yi <- x$y[i] if ("size" %in% names(animSet$animations)) pointsize <- ithUnit(animSet$animations$size, x$size, i) else pointsize <- x$size[i] ## Enforce gp$cex or gp$fontsize pointsize <- adjustSymbolSize(pointsize, x$gp) angle <- current.rotation() switch(animation, x={ loc <- locToInches(xi, yi, dev) svgAnimateXYWH("x", cx(loc$x, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) if (angle != 0) { if (!"y" %in% names(animSet$animations)) { svgAnimateXYWH("y", cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) } svgAnimateRotation(angle, cx(loc$x, dev), cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) if (!"size" %in% names(animSet$animations)) { svgAnimateTranslation(-cd(pointsize, dev)/2, -cd(pointsize, dev)/2, begin[i], interp[i], dur[i], rep[i], rev[i], additive="sum", id=subName, svgdev=dev@dev) } } }, y={ loc <- locToInches(xi, yi, dev) svgAnimateXYWH("y", cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) if (angle != 0) { if (!"x" %in% names(animSet$animations)) { svgAnimateXYWH("x", cx(loc$x, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) svgAnimateRotation(angle, cx(loc$x, dev), cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) if (!"size" %in% names(animSet$animations)) { svgAnimateTranslation(-cd(pointsize, dev)/2, -cd(pointsize, dev)/2, begin[i], interp[i], dur[i], rep[i], rev[i], additive="sum", id=subName, svgdev=dev@dev) } } } }, size={ pchi <- x$pch[i] docharanim <- (is.character(pchi) && pchi != ".") || (is.numeric(pchi) && (pchi >= 32 && pchi != 46)) donumanim <- is.numeric(pchi) && pchi <= 25 ## If we don't have a good pch, don't bother if (! any(c(donumanim, docharanim))) return() dimsize <- cd(pointsize, dev) svgAnimateXYWH("width", dimsize, begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) svgAnimateXYWH("height", cd(pointsize, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) ## Centering the point trdimsize <- -dimsize / 2 additive <- "replace" if (angle != 0) { loc <- locToInches(xi, yi, dev) svgAnimateRotation(angle, cx(loc$x, dev), cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) additive <- "sum" } svgAnimateTranslation(trdimsize, trdimsize, begin[i], interp[i], dur[i], rep[i], rev[i], additive, id=subName, svgdev=dev@dev) ## Ensuring that stroke-width stays the same. ## Only do this with low numeric pchs because if (donumanim & length(dimsize) > 1) { swi <- sw[i] scalef <- dimsize / 10 swi <- swi / scalef svgAnimatePointSW(swi, begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) } }, ## Any other attribute { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }) } } } applyAnimation.text <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { # We may be dealing with multiple points that need animating n <- max(length(x$x), length(x$y), length(x$label)) # Rep the original x/y/width/height out to be the same length x$x <- rep(x$x, length.out=n) x$y <- rep(x$y, length.out=n) # Repeating animation parameters so that each element can have # distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) angle <- current.rotation() for (i in 1:n) { subName <- subGrobName(x$name, i) if ("x" %in% names(animSet$animations)) xi <- ithUnit(animSet$animations$x, x$x, i) else xi <- x$x[i] if ("y" %in% names(animSet$animations)) yi <- ithUnit(animSet$animations$y, x$y, i) else yi <- x$y[i] switch(animation, x={ loc <- locToInches(xi, yi, dev) additive <- "replace" if (angle != 0) { svgAnimateRotation(angle, cx(loc$x, dev), cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) additive <- "sum" } svgAnimateTranslation(cx(loc$x, dev), cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], additive, subName, dev@dev) }, y={ if (!("x" %in% names(animSet$animations))) { loc <- locToInches(xi, yi, dev) additive <- "replace" if (angle != 0) { svgAnimateRotation(angle, cx(loc$x, dev), cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) additive <- "sum" } svgAnimateTranslation(cx(loc$x, dev), cy(loc$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], additive, subName, dev@dev) } }, # Any other attribute { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], # Apply these to child element rather # than parent paste(subName, "text", sep=getSVGoption("id.sep")), dev@dev) }) } } } doNotAnimate <- function(animSet, animation) { # Avoid doing BOTH x and y if BOTH animated animNames <- names(animSet$animations) if ((all(c("x", "y") %in% animNames) && animation %in% c("x", "y") && match(animation, animNames) == max(match(c("x", "y"), animNames))) || (sum(c("x0", "y0", "x1", "y1") %in% animNames) > 1 && animation %in% c("x0", "y0", "x1", "y1") && match(animation, animNames) > min(match(c("x0", "y0", "x1", "y1"), animNames), na.rm=TRUE))) TRUE else FALSE } applyAnimation.lines <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { if (doNotAnimate(animSet, animation)) return() # NOTE: only ever drawing ONE line begin <- animSet$begin interp <- animSet$interp dur <- animSet$duration rep <- animSet$rep rev <- animSet$revert subName <- subGrobName(x$name, 1) if ("x" %in% names(animSet$animations)) { au <- ithAnimUnit(animSet$animations$x, x$x, 1) xx <- au$values timeid <- au$timeid } else { xx <- x$x } if ("y" %in% names(animSet$animations)) { au <- ithAnimUnit(animSet$animations$y, x$y, 1) yy <- au$values timeid <- au$timeid } else { yy <- x$y } if (any(c("x", "y") %in% names(animSet$animations))) { loc <- locToInches(xx, yy, dev) svgAnimatePoints(cx(loc$x, dev), cy(loc$y, dev), timeid, begin, interp, dur, rep, rev, subName, dev@dev) } # Any other attribute if (!(animation %in% c("x", "y"))) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), begin, interp, dur, rep, rev, subName, dev@dev) } } } applyAnimation.polyline <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { if (doNotAnimate(animSet, animation)) return() # If we only have one line if (is.null(x$id) && is.null(x$id.lengths)) { x$id <- rep(1L, length(x$x)) } # Multiple lines exist if (is.null(x$id)) { n <- length(x$id.lengths) id <- rep(1L:n, x$id.lengths) } else { n <- length(unique(x$id)) id <- x$id } # Repeating animation parameters so that each element can have # distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) for (i in 1:n) { subName <- subGrobName(x$name, i) if ("x" %in% names(animSet$animations)) { au <- ithAnimUnit(animSet$animations$x, x$x, i) xx <- au$values timeid <- au$timeid } else { xx <- x$x[x$id == i] } if ("y" %in% names(animSet$animations)) { au <- ithAnimUnit(animSet$animations$y, x$y, i) yy <- au$values timeid <- au$timeid } else { yy <- x$y[x$id == i] } if (any(c("x", "y") %in% names(animSet$animations))) { loc <- locToInches(xx, yy, dev) svgAnimatePoints(cx(loc$x, dev), cy(loc$y, dev), timeid, begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } # Any other attribute if (!(animation %in% c("x", "y"))) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } } } } # Possibly multiple line segments, each of which become elements applyAnimation.segments <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { if (doNotAnimate(animSet, animation)) return() # We may be dealing with multiple rects that need animating n <- max(length(x$x0), length(x$y0), length(x$x1), length(x$y1)) # Rep the original x/y/width/height out to be the same length x$x0 <- rep(x$x0, length.out=n) x$y0 <- rep(x$y0, length.out=n) x$x1 <- rep(x$x1, length.out=n) x$y1 <- rep(x$y1, length.out=n) # Repeating animation parameters so that each element can have # distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) for (i in 1:n) { subName <- subGrobName(x$name, i) if ("x0" %in% names(animSet$animations)) x0i <- ithUnit(animSet$animations$x0, x$x0, i) else x0i <- x$x0[i] if ("y0" %in% names(animSet$animations)) y0i <- ithUnit(animSet$animations$y0, x$y0, i) else y0i <- x$y0[i] if ("x1" %in% names(animSet$animations)) x1i <- ithUnit(animSet$animations$x1, x$x1, i) else x1i <- x$x1[i] if ("y1" %in% names(animSet$animations)) y1i <- ithUnit(animSet$animations$y1, x$y1, i) else y1i <- x$y1[i] if (any(c("x0", "y0", "x1", "y1") %in% names(animSet$animations))) { nvals <- max(length(x0i), length(y0i), length(x1i), length(y1i)) loc0 <- locToInches(x0i, y0i, dev) loc1 <- locToInches(x1i, y1i, dev) xx <- rbind(convertX(loc0$x, "inches", valueOnly=TRUE), convertX(loc1$x, "inches", valueOnly=TRUE)) yy <- rbind(convertY(loc0$y, "inches", valueOnly=TRUE), convertY(loc1$y, "inches", valueOnly=TRUE)) svgAnimatePoints(cx(unit(xx, "inches"), dev), cy(unit(yy, "inches"), dev), rep(1:nvals, each=2), # timeid begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } # Any other attribute if (!(animation %in% c("x0", "y0", "x1", "y1"))) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } } } } applyAnimation.polygon <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { if (doNotAnimate(animSet, animation)) return() # If we only have one polygon if (is.null(x$id) && is.null(x$id.lengths)) { x$id <- rep(1L, length(x$x)) } # Multiple polygons exist if (is.null(x$id)) { n <- length(x$id.lengths) id <- rep(1L:n, x$id.lengths) } else { n <- length(unique(x$id)) id <- x$id } # Repeating animation parameters so that each element can have # distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) for (i in 1:n) { subName <- subGrobName(x$name, i) if ("x" %in% names(animSet$animations)) { au <- ithAnimUnit(animSet$animations$x, x$x, i) xx <- au$values timeid <- au$timeid } else { xx <- x$x[x$id == i] } if ("y" %in% names(animSet$animations)) { au <- ithAnimUnit(animSet$animations$y, x$y, i) yy <- au$values timeid <- au$timeid } else { yy <- x$y[x$id == i] } if (any(c("x", "y") %in% names(animSet$animations))) { loc <- locToInches(xx, yy, dev) svgAnimatePoints(cx(loc$x, dev), cy(loc$y, dev), timeid, begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } # Any other attribute if (!(animation %in% c("x", "y"))) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } } } } applyAnimation.pathgrob <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { if (doNotAnimate(animSet, animation)) return() # NOTE: only ever drawing ONE line begin <- animSet$begin interp <- animSet$interp dur <- animSet$duration rep <- animSet$rep rev <- animSet$revert subName <- subGrobName(x$name, 1) # Rather than looping through 'n' different shapes # need to generate a set of animation values for a # single shape consisting of multiple sub-paths # at multiple time points # If we only have one sub-path if (is.null(x$id) && is.null(x$id.lengths)) { x$id <- rep(1L, length(x$x)) } # Multiple sub-paths if (is.null(x$id)) { n <- length(x$id.lengths) id <- rep(1L:n, x$id.lengths) } else { n <- length(unique(x$id)) id <- x$id } # NOTE: according to the SVG spec, I think the animated values # HAVE to follow the original series of M, L, Z to be # valid; otherwise behaviour of browser is undefined? if ("x" %in% names(animSet$animations)) { au <- as.animUnit(animSet$animations$x, unitType(x$x)) xx <- au$values pathid <- au$id timeid <- au$timeid } else { xx <- x$x } if ("y" %in% names(animSet$animations)) { au <- as.animUnit(animSet$animations$y, unitType(x$y)) yy <- au$values pathid <- au$id timeid <- au$timeid } else { yy <- x$y } # Only one sub-path if (is.null(pathid)) { pathid <- rep(id, length.out=length(timeid)) } if (any(c("x", "y") %in% names(animSet$animations))) { loc <- locToInches(xx, yy, dev) svgAnimatePath(cx(loc$x, dev), cy(loc$y, dev), pathid, timeid, begin, interp, dur, rep, rev, subName, dev@dev) } # Any other attribute if (!(animation %in% c("x", "y"))) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), begin, interp, dur, rep, rev, subName, dev@dev) } } } applyAnimation.rastergrob <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { # Raster may have NULL width or height x$width <- widthDetails(x) x$height <- heightDetails(x) # We may be dealing with multiple rasters that need animating n <- max(length(x$x), length(x$y), length(x$width), length(x$height)) # Rep the original x/y/width/height out to be the same length x$x <- rep(x$x, length.out=n) x$y <- rep(x$y, length.out=n) x$width <- rep(x$width, length.out=n) x$height <- rep(x$height, length.out=n) # Repeating animation parameters so that each element can have # distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) angle <- current.rotation() for (i in 1:n) { subName <- subGrobName(x$name, i) # If x AND y change, need to transform together # If width/height changes, have to animate x/y as well # because SVG does not have justification if ("x" %in% names(animSet$animations)) xi <- ithUnit(animSet$animations$x, x$x, i) else xi <- x$x[i] if ("y" %in% names(animSet$animations)) yi <- ithUnit(animSet$animations$y, x$y, i) else yi <- x$y[i] if ("width" %in% names(animSet$animations)) widthi <- ithUnit(animSet$animations$width, x$width, i) else widthi <- x$width[i] if ("height" %in% names(animSet$animations)) heighti <- ithUnit(animSet$animations$height, x$height, i) else heighti <- x$height[i] lb <- leftbottom(xi, yi, widthi, heighti, x$just, x$hjust, x$vjust, dev) switch(animation, x={ dim <- dimToInches(widthi, heighti, dev) additive <- "replace" if (angle != 0) { svgAnimateRotation(angle, cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) additive <- "sum" } svgAnimateTranslation(cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], additive, subName, dev@dev) }, y={ # If we are also animating "x" then this has # already been done if (!"x" %in% names(animSet$animations)) { dim <- dimToInches(widthi, heighti, dev) additive <- "replace" if (angle != 0) { svgAnimateRotation(angle, cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) additive <- "sum" } svgAnimateTranslation(cx(lb$x, dev), ch(dim$h, dev) + cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], additive, subName, dev@dev) } }, width={ dim <- dimToInches(widthi, heighti, dev) # If x is also animated, # this has already been handled above if (!any(c("x", "y") %in% names(animSet$animations))) { if (angle != 0) { svgAnimateRotation(angle, cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) additive <- "sum" } svgAnimateTranslation(cx(lb$x, dev), ch(dim$h, dev) + cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], additive, subName, dev@dev) } svgAnimateScale(cw(dim$w, dev), ch(dim$h, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=paste(subName, "scale", sep=getSVGoption("id.sep")), svgdev=dev@dev) }, height={ # If "width" is also animated, # this has already been done if (!"width" %in% names(animSet$animations)) { dim <- dimToInches(widthi, heighti, dev) if (!any(c("x", "y") %in% names(animSet$animations))) { if (angle != 0) { svgAnimateRotation(angle, cx(lb$x, dev), cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=subName, svgdev=dev@dev) additive <- "sum" } svgAnimateTranslation(cx(lb$x, dev), ch(dim$h, dev) + cy(lb$y, dev), begin[i], interp[i], dur[i], rep[i], rev[i], additive, subName, dev@dev) } svgAnimateScale(cw(dim$w, dev), ch(dim$h, dev), begin[i], interp[i], dur[i], rep[i], rev[i], id=paste(subName, "scale", sep=getSVGoption("id.sep")), svgdev=dev@dev) } }, # Any other attribute { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) }) } } } applyAnimation.xspline <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } else { if (doNotAnimate(animSet, animation)) return() # If we only have one xspline if (is.null(x$id) && is.null(x$id.lengths)) { x$id <- rep(1L, length(x$x)) } # Multiple xsplines exist if (is.null(x$id)) { n <- length(x$id.lengths) id <- rep(1L:n, x$id.lengths) } else { n <- length(unique(x$id)) id <- x$id } # Repeating animation parameters so that each element can have # distinct values begin <- rep(animSet$begin, length.out = n) interp <- rep(animSet$interp, length.out = n) dur <- rep(animSet$duration, length.out = n) rep <- rep(animSet$rep, length.out = n) rev <- rep(animSet$revert, length.out = n) for (i in 1:n) { subName <- subGrobName(x$name, i) if ("x" %in% names(animSet$animations)) { au <- ithAnimUnit(animSet$animations$x, x$x, i) xx <- au$values timeid <- au$timeid } else { xx <- x$x[x$id == i] } if ("y" %in% names(animSet$animations)) { au <- ithAnimUnit(animSet$animations$y, x$y, i) yy <- au$values timeid <- au$timeid } else { yy <- x$y[x$id == i] } if (any(c("x", "y") %in% names(animSet$animations))) { getSplinePoints <- function(x, y, grob) { tempSpline <- grob tempSpline$x <- x tempSpline$y <- y tempSpline$id <- NULL tempSpline$id.lengths <- NULL xsplinePoints(tempSpline) } # for each time period, need to convert control # points into (x, y) and then generate new timeid nval <- length(timeid) xx <- rep(xx, length.out=nval) yy <- rep(yy, length.out=nval) xxx <- split(xx, timeid) yyy <- split(yy, timeid) points <- mapply(getSplinePoints, xxx, yyy, MoreArgs=list(grob=x), SIMPLIFY=FALSE) timeid <- rep(1:length(points), sapply(points, function(p) length(p$x))) xpoints <- do.call("unit.c", lapply(points, function(p) p$x)) ypoints <- do.call("unit.c", lapply(points, function(p) p$y)) if (x$open) { # animating a polyline element loc <- locToInches(xpoints, ypoints, dev) svgAnimatePoints(cx(loc$x, dev), cy(loc$y, dev), timeid, begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } else { # animating a path element loc <- locToInches(xpoints, ypoints, dev) pathid <- rep(id, length.out=length(timeid)) svgAnimatePath(cx(loc$x, dev), cy(loc$y, dev), pathid, timeid, begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } } # Any other attribute if (!(animation %in% c("x", "y"))) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], i), collapse=";"), begin[i], interp[i], dur[i], rep[i], rev[i], subName, dev@dev) } } } } applyAnimation.grob <- function(x, ...) { # If we got here, then we've hit something that is not yet implemented stop(paste("Animation of ", paste(class(x), collapse=":"), " objects is not yet implemented", sep="")) } applyAnimation.gTree <- function(x, animSet, animation, group, dev) { if (group) { svgAnimate(animation, paste(ithValue(animSet$animations[[animation]], 1), collapse=";"), animSet$begin, animSet$interp, animSet$dur, animSet$rep, animSet$rev, x$name, dev@dev) } } applyAnimationSet <- function(x, animationSet, group, dev) { x$name <- getID(x$name, "grob", FALSE) animations <- animationSet$animations for (i in names(animations)) applyAnimation(x, animationSet, i, group, dev) } animate <- function(x, dev) { UseMethod("animate") } animate.grob <- function(x, dev) { lapply(x$animationSets, function(as) { applyAnimationSet(x, as, FALSE, dev) }) lapply(x$groupAnimationSets, function(as) { applyAnimationSet(x, as, TRUE, dev) }) } animate.gTree <- function(x, dev) { lapply(x$groupAnimationSets, function(as) { applyAnimationSet(x, as, TRUE, dev) }) # If you want to do something with the 'animationSets' # for your gTree then you have to write your own # animate() method } # NOTE that this has to be a primToDev() method # NOT a grobToDev() method # OTHERWISE, viewports will not be set up correctly primToDev.animated.grob <- function(x, dev) { animate(x, dev) NextMethod() } # Ensure the animation is retained on a forced grob forceGrob.animated.grob <- function(x) { y <- NextMethod() if (inherits(y, "forcedgrob")) { y$animationSets <- x$animationSets y$groupAnimationSets <- x$groupAnimationSets class(y) <- unique(c("animated.grob", class(y))) } y } �������������������gridSVG/R/MathML.R����������������������������������������������������������������������������������0000654�0001762�0000144�00000056625�12164147366�013256� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ explicitMathVariant <- function(fontfamily, fontface) { currentFonts <- getSVGFonts() stackname <- fontStackFromFontFamily(fontfamily, currentFonts) switch(stackname, sans=switch(fontface, plain="sans-serif", bold="bold-sans-serif", italic=, oblique="sans-serif-italic", bold.italic="sans-serif-bold-italic"), serif=switch(fontface, plain="normal", bold="bold", italic=, oblique="italic", bold.italic="bold-italic"), mono="monospace", switch(fontface, plain="sans-serif", bold="bold-sans-serif", italic=, oblique="sans-serif-italic", bold.italic="sans-serif-bold-italic")) } unicode <- c("\u0020", "\u0021", "\u2200", "\u0023", "\u2203", "\u0025", "\u0026", "\u220B", "\u0028", "\u0029", "\u2217", "\u002B", "\u002C", "\u2212", "\u002E", "\u002F", "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039", "\u003A", "\u003B", "\u003C", "\u003D", "\u003E", "\u003F", "\u2245", "\u0391", "\u0392", "\u03A7", "\u0394", "\u0395", "\u03A6", "\u0393", "\u0397", "\u0399", "\u03D1", "\u039A", "\u039B", "\u039C", "\u039D", "\u039F", "\u03A0", "\u0398", "\u03A1", "\u03A3", "\u03A4", "\u03A5", "\u03C2", "\u03A9", "\u039E", "\u03A8", "\u0396", "\u005B", "\u2234", "\u005D", "\u22A5", "\u005F", "\uF8E5", "\u03B1", "\u03B2", "\u03C7", "\u03B4", "\u03B5", "\u03C6", "\u03B3", "\u03B7", "\u03B9", "\u03D5", "\u03BA", "\u03BB", "\u03BC", "\u03BD", "\u03BF", "\u03C0", "\u03B8", "\u03C1", "\u03C3", "\u03C4", "\u03C5", "\u03D6", "\u03C9", "\u03BE", "\u03C8", "\u03B6", "\u007B", "\u007C", "\u007D", "\u223C", "\u20AC", "\u03D2", "\u2032", "\u2264", "\u2044", "\u221E", "\u0192", "\u2663", "\u2666", "\u2665", "\u2660", "\u2194", "\u2190", "\u2191", "\u2192", "\u2193", "\u00B0", "\u00B1", "\u2033", "\u2265", "\u00D7", "\u221D", "\u2202", "\u2022", "\u00F7", "\u2260", "\u2261", "\u2248", "\u2026", "\uF8E6", "\uF8E7", "\u21B5", "\u2135", "\u2111", "\u211C", "\u2118", "\u2297", "\u2295", "\u2205", "\u2229", "\u222A", "\u2283", "\u2287", "\u2284", "\u2282", "\u2286", "\u2208", "\u2209", "\u2220", "\u2207", "\uF6DA", "\uF6D9", "\uF6DB", "\u220F", "\u221A", "\u22C5", "\u00AC", "\u2227", "\u2228", "\u21D4", "\u21D0", "\u21D1", "\u21D2", "\u21D3", "\u25CA", "\u2329", "\uF8E8", "\uF8E9", "\uF8EA", "\u2211", "\uF8EB", "\uF8EC", "\uF8ED", "\uF8EE", "\uF8EF", "\uF8F0", "\uF8F1", "\uF8F2", "\uF8F3", "\uF8F4", "\u232A", "\u222B", "\u2320", "\uF8F5", "\u2321", "\uF8F6", "\uF8F7", "\uF8F8", "\uF8F9", "\uF8FA", "\uF8FB", "\uF8FC", "\uF8FD", "\uF8FE") # See ~/Research/Rstuff/SVG/PlotMath/greek.R greek <- structure(c("\u03B1", "\u03B2", "\u03B3", "\u03B4", "\u03B5", "\u03B6", "\u03B7", "\u03B8", "\u03B9", "\u03BA", "\u03BB", "\u03BC", "\u03BD", "\u03BE", "\u03BF", "\u03C0", "\u03C1", "\u03C2", "\u03C3", "\u03C4", "\u03C5", "\u03D5", "\u03C7", "\u03C8", "\u03C9", "\u0391", "\u0392", "\u0393", "\u0394", "\u0395", "\u0396", "\u0397", "\u0398", "\u0399", "\u039A", "\u039B", "\u039C", "\u039D", "\u039E", "\u039F", "\u03A0", "\u03A1", "\u03A2", "\u03A3", "\u03A4", "\u03A5", "\u03A6", "\u03A7", "\u03A8", "\u03A9"), .Names = c("alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "mu", "nu", "xi", "omicron", "pi", "rho", "", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega", "Alpha", "Beta", "Gamma", "Delta", "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa", "Lambda", "Mu", "Nu", "Xi", "Omicron", "Pi", "Rho", "", "Sigma", "Tau", "Upsilon", "Phi", "Chi", "Psi", "Omega")) symbolNames <- c("..."="\u2026", cdots="\u22EF", ldots="\u2026", greek, theta1="\u03D1", vartheta="\u03D1", phi1="\u03C6", sigma1="\u03C2", varsigma="\u03C2", omega1="\u03D6", Upsilon1="\u03D2", aleph="\u05D0", infinity="\u221E", partialdiff="\u2202", nabla="\u2207", degree="\u00B0", minute="\u2032", second="\u2033") # The general idea with each of these mml*() functions is to # create a single MathML element. # This means that, if the output is a collection of several # elements, we wrap the whole collection in an mmlJuxta <- function(e, fontfamily, fontface, svgdev) { mrow <- newXMLNode("mrow", parent = svgDevParent(svgdev)) svgDevChangeParent(mrow, svgdev) e <- e[-1] lapply(e, function(x) { toMML(x, fontfamily, fontface, svgdev) }) svgDevChangeParent(xmlParent(mrow), svgdev) } mmlBinOp <- function(e, fontfamily, fontface, op, svgdev) { mrow <- newXMLNode("mrow", parent = svgDevParent(svgdev)) svgDevChangeParent(mrow, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) newXMLNode("mo", parent = svgDevParent(svgdev), newXMLTextNode(op)) toMML(e[[3]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mrow), svgdev) } mmlParen <- function(e, fontfamily, fontface, svgdev) { mfenced <- newXMLNode("mfenced", parent = svgDevParent(svgdev)) mrow <- newXMLNode("mrow", parent = mfenced) svgDevChangeParent(mrow, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mfenced), svgdev) } mmlBrace <- function(e, fontfamily, fontface, svgdev) { mfenced <- newXMLNode("mfenced", parent = svgDevParent(svgdev), attrs = list(open = "", close = "")) mrow <- newXMLNode("mrow", parent = mfenced) svgDevChangeParent(mrow, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mfenced), svgdev) } delimiters <- c(lfloor="\u230A", rfloor="\u230B", lceil="\u2308", rceil="\u2309") convertDelim <- function(delim) { if (delim %in% names(delimiters)) delimiters[delim] else delim } mmlGroup <- function(e, fontfamily, fontface, svgdev) { # e[[2]] and e[[4]] are the delimiters if (length(e) < 4) stop("Invalid plotmath group()") delim1 <- convertDelim(as.character(e[[2]])) delim2 <- convertDelim(as.character(e[[4]])) mfenced <- newXMLNode("mfenced", parent = svgDevParent(svgdev), attrs = list(open = delim1, close = delim2)) mrow <- newXMLNode("mrow", parent = mfenced) svgDevChangeParent(mrow, svgdev) toMML(e[[3]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mfenced), svgdev) } mmlSup <- function(e, fontfamily, fontface, svgdev) { msup <- newXMLNode("msup", parent = svgDevParent(svgdev)) svgDevChangeParent(msup, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) toMML(e[[3]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(msup), svgdev) } mmlSub <- function(e, fontfamily, fontface, svgdev) { msub <- newXMLNode("msub", parent = svgDevParent(svgdev)) svgDevChangeParent(msub, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) toMML(e[[3]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(msub), svgdev) } mmlSqrt <- function(e, fontfamily, fontface, svgdev) { if (length(e) > 2) { mroot <- newXMLNode("mroot", parent = svgDevParent(svgdev)) svgDevChangeParent(mroot, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) toMML(e[[3]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mroot), svgdev) } else { msqrt <- newXMLNode("msqrt", parent = svgDevParent(svgdev)) svgDevChangeParent(msqrt, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(msqrt), svgdev) } } mmlFont <- function(e, fontfamily, fontface, svgdev) { toMML(e[[2]], fontfamily, fontface, svgdev) } mmlStyle <- function(e, fontfamily, fontface, style, svgdev) { displaystyle <- switch(style, display="true", "false") scriptlevel <- switch(style, display=0, text=0, script=1, scriptscript=2) mstyle <- newXMLNode("mstyle", parent = svgDevParent(svgdev), attrs = list(displaystyle = displaystyle, scriptlevel = scriptlevel)) svgDevChangeParent(mstyle, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mstyle), svgdev) } mmlSymbol <- function(e, fontfamily, fontface, svgdev) { newXMLNode("mtext", parent = svgDevParent(svgdev), attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode(unicode[as.integer(charToRaw(e[[2]])) - 31])) } mmlCSL <- function(e, fontfamily, fontface, svgdev) { mfenced <- newXMLNode("mfenced", parent = svgDevParent(svgdev), attrs = list(open = "", close = "")) svgDevChangeParent(mfenced, svgdev) sapply(e[-1], toMML, fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mfenced), svgdev) } mmlAccent <- function(e, fontfamily, fontface, accent, svgdev) { mover <- newXMLNode("mover", parent = svgDevParent(svgdev), attrs = list(accent = "true", align = "center")) mrow <- newXMLNode("mrow", parent = mover) svgDevChangeParent(mrow, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) newXMLNode("mo", parent = mover, attrs = list(stretchy = "false"), newXMLTextNode(accent)) svgDevChangeParent(xmlParent(mover), svgdev) } mmlWideAccent <- function(e, fontfamily, fontface, accent, svgdev) { mover <- newXMLNode("mover", parent = svgDevParent(svgdev), attrs = list(accent = "true", align = "center")) mrow <- newXMLNode("mrow", parent = mover) svgDevChangeParent(mrow, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) newXMLNode("mo", parent = mover, attrs = list(stretchy = "true"), newXMLTextNode(accent)) svgDevChangeParent(xmlParent(mover), svgdev) } mmlUnderline <- function(e, fontfamily, fontface, svgdev) { # NOTE: and are currently not supported # by Mozilla-based browsers (2011-11-21) munder <- newXMLNode("munder", parent = svgDevParent(svgdev)) mrow <- newXMLNode("mrow", parent = munder) svgDevChangeParent(mrow, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) newXMLNode("mo", parent = munder, attrs = list(stretchy = "true"), newXMLTextNode("\u00AF")) svgDevChangeParent(xmlParent(munder), svgdev) } mmlSpace <- function(e, fontfamily, fontface, svgdev) { mrow <- newXMLNode("mrow", parent = svgDevParent(svgdev)) svgDevChangeParent(mrow, svgdev) if (length(e) > 2) { toMML(e[[2]], fontfamily, fontface, svgdev) newXMLNode("mtext", parent = svgDevParent(svgdev), attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode("\u00A0")) toMML(e[[3]], fontfamily, fontface, svgdev) } else { newXMLNode("mtext", parent = svgDevParent(svgdev), attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode("\u00A0")) toMML(e[[2]], fontfamily, fontface, svgdev) } svgDevChangeParent(xmlParent(mrow), svgdev) } mmlPhantom <- function(e, fontfamily, fontface, svgdev) { mphantom <- newXMLNode("mphantom", parent = svgDevParent(svgdev)) svgDevChangeParent(mphantom, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mphantom), svgdev) } mmlFrac <- function(e, fontfamily, fontface, svgdev, lwd="medium") { mfrac <- newXMLNode("mfrac", parent = svgDevParent(svgdev), attrs = list(linethickness = lwd)) svgDevChangeParent(mfrac, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) toMML(e[[3]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mfrac), svgdev) } mmlBigOp <- function(e, fontfamily, fontface, svgdev, op=NULL) { mrow <- newXMLNode("mrow", parent = svgDevParent(svgdev)) # When checking for is.null(op), # Either specify op special character or format the first # element of the expression if (length(e) < 3) { if (is.null(op)) { opmrow <- newXMLNode("mrow", parent = mrow) svgDevChangeParent(opmrow, svgdev) toMML(e[[1]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(opmrow), svgdev) newXMLNode("mtext", parent = opmrow, attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode("\u00A0")) } else { newXMLNode("mo", parent = mrow, newXMLTextNode(op)) } svgDevChangeParent(mrow, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) } else if (length(e) < 4) { munder <- newXMLNode("munder", parent = mrow) if (is.null(op)) { opmrow <- newXMLNode("mrow", parent = munder) svgDevChangeParent(opmrow, svgdev) toMML(e[[1]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(opmrow), svgdev) newXMLNode("mtext", parent = opmrow, attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode("\u00A0")) } else { newXMLNode("mo", parent = munder, newXMLTextNode(op)) } svgDevChangeParent(munder, svgdev) toMML(e[[3]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(munder), svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) } else { munderover <- newXMLNode("munderover", parent = mrow) if (is.null(op)) { opmrow <- newXMLNode("mrow", parent = munderover) svgDevChangeParent(opmrow, svgdev) toMML(e[[1]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(opmrow), svgdev) newXMLNode("mtext", parent = opmrow, attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode("\u00A0")) } else { newXMLNode("mo", parent = munderover, newXMLTextNode(op)) } svgDevChangeParent(munderover, svgdev) toMML(e[[3]], fontfamily, fontface, svgdev) toMML(e[[4]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(munderover), svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) } svgDevChangeParent(xmlParent(mrow), svgdev) } mmlFun <- function(e, fontfamily, fontface, svgdev) { mrow <- newXMLNode("mrow", parent = svgDevParent(svgdev)) mtext <- newXMLNode("mtext", parent = mrow, attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode(e[[1]])) mfenced <- newXMLNode("mfenced", parent = mrow) svgDevChangeParent(mfenced, svgdev) toMML(e[[2]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mrow), svgdev) } toMML <- function(x, fontfamily, fontface, svgdev, ...) { UseMethod("toMML") } toMML.numeric <- function(x, fontfamily, fontface, svgdev, ...) { newXMLNode("mn", parent = svgDevParent(svgdev), newXMLTextNode(as.character(x))) } toMML.character <- function(x, fontfamily, fontface, svgdev, ...) { newXMLNode("mtext", parent = svgDevParent(svgdev), attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode(x)) } toMML.name <- function(x, fontfamily, fontface, svgdev, ...) { # Convert special names if (as.character(x) %in% names(symbolNames)) x <- symbolNames[as.character(x)] # R does NOT automatically italicize symbols newXMLNode("mtext", parent = svgDevParent(svgdev), attrs = list(mathvariant = explicitMathVariant(fontfamily, fontface)), newXMLTextNode(x)) } # A "language" object may have class "call" or "(" or "{" "toMML.(" <- function(x, fontfamily, fontface, svgdev, ...) { toMML.call(x, fontfamily, fontface, svgdev, ...) } "toMML.{" <- function(x, fontfamily, fontface, svgdev, ...) { toMML.call(x, fontfamily, fontface, svgdev, ...) } funCallToMML <- function(x, fontfamily, fontface, svgdev) { funName <- as.character(x[[1]]) switch(funName, "+"=, "/"=mmlBinOp(x, fontfamily, fontface, funName, svgdev), "-"=mmlBinOp(x, fontfamily, fontface, "\u2212", svgdev), "*"=mmlBinOp(x, fontfamily, fontface, "\u2062", svgdev), "%+-%"=mmlBinOp(x, fontfamily, fontface, "\u00B1", svgdev), "%/%"=mmlBinOp(x, fontfamily, fontface, "\u00F7", svgdev), "%*%"=mmlBinOp(x, fontfamily, fontface, "\u00D7", svgdev), "%.%"=mmlBinOp(x, fontfamily, fontface, "\u22C5", svgdev), "["=mmlSub(x, fontfamily, fontface, svgdev), "^"=mmlSup(x, fontfamily, fontface, svgdev), "paste"=mmlJuxta(x, fontfamily, fontface, svgdev), "sqrt"=mmlSqrt(x, fontfamily, fontface, svgdev), "("=mmlParen(x, fontfamily, fontface, svgdev), "{"=mmlBrace(x, fontfamily, fontface, svgdev), "=="=mmlBinOp(x, fontfamily, fontface, "=", svgdev), "!="=mmlBinOp(x, fontfamily, fontface, "\u2260", svgdev), "<"=mmlBinOp(x, fontfamily, fontface, "<", svgdev), "<="=mmlBinOp(x, fontfamily, fontface, "\u2264", svgdev), ">"=mmlBinOp(x, fontfamily, fontface, ">", svgdev), ">="=mmlBinOp(x, fontfamily, fontface, "\u2265", svgdev), "%~~%"=mmlBinOp(x, fontfamily, fontface, "\u2248", svgdev), "%=~%"=mmlBinOp(x, fontfamily, fontface, "\u2245", svgdev), "%==%"=mmlBinOp(x, fontfamily, fontface, "\u2261", svgdev), "%prop%"=mmlBinOp(x, fontfamily, fontface, "\u221D", svgdev), "plain"=mmlFont(x, fontfamily, "plain", svgdev), "bold"=mmlFont(x, fontfamily, "bold", svgdev), "italic"=mmlFont(x, fontfamily, "italic", svgdev), "bolditalic"=mmlFont(x, fontfamily, "bold.italic", svgdev), "symbol"=mmlSymbol(x, fontfamily, fontface, svgdev), "list"=mmlCSL(x, fontfamily, fontface, svgdev), "%subset%"=mmlBinOp(x, fontfamily, fontface, "\u2282", svgdev), "%subseteq%"=mmlBinOp(x, fontfamily, fontface, "\u2286", svgdev), "%notsubset%"=mmlBinOp(x, fontfamily, fontface, "\u2284", svgdev), "%supset%"=mmlBinOp(x, fontfamily, fontface, "\u2283", svgdev), "%supseteq%"=mmlBinOp(x, fontfamily, fontface, "\u2287", svgdev), "%notsupset%"=mmlBinOp(x, fontfamily, fontface, "\u2285", svgdev), "%in%"=mmlBinOp(x, fontfamily, fontface, "\u2208", svgdev), "%notin%"=mmlBinOp(x, fontfamily, fontface, "\u2209", svgdev), "hat"=mmlAccent(x, fontfamily, fontface, "\u005E", svgdev), "tilde"=mmlAccent(x, fontfamily, fontface, "\u007E", svgdev), "dot"=mmlAccent(x, fontfamily, fontface, "\u02D9", svgdev), "ring"=mmlAccent(x, fontfamily, fontface, "\u02DA", svgdev), # Used "macron" "bar"=mmlAccent(x, fontfamily, fontface, "\u00AF", svgdev), # FIXME: these are just normal accents positioned as limits "widehat"=mmlWideAccent(x, fontfamily, fontface, "\u005E", svgdev), "widetilde"=mmlWideAccent(x, fontfamily, fontface, "\u007E", svgdev), "%<->%"=mmlBinOp(x, fontfamily, fontface, "\u2194", svgdev), "%->%"=mmlBinOp(x, fontfamily, fontface, "\u2192", svgdev), "%<-%"=mmlBinOp(x, fontfamily, fontface, "\u2190", svgdev), "%up%"=mmlBinOp(x, fontfamily, fontface, "\u2191", svgdev), "%down%"=mmlBinOp(x, fontfamily, fontface, "\u2193", svgdev), "%<=>%"=mmlBinOp(x, fontfamily, fontface, "\u21D4", svgdev), "%=>%"=mmlBinOp(x, fontfamily, fontface, "\u21D2", svgdev), "%<=%"=mmlBinOp(x, fontfamily, fontface, "\u21D0", svgdev), "%dblup%"=mmlBinOp(x, fontfamily, fontface, "\u21D1", svgdev), "%dbldown%"=mmlBinOp(x, fontfamily, fontface, "\u21D3", svgdev), "displaystyle"=mmlStyle(x, fontfamily, fontface, "display", svgdev), "textstyle"=mmlStyle(x, fontfamily, fontface, "text", svgdev), "scriptstyle"=mmlStyle(x, fontfamily, fontface, "script", svgdev), "scriptscriptstyle"=mmlStyle(x, fontfamily, fontface, "scriptscript", svgdev), "underline"=mmlUnderline(x, fontfamily, fontface, svgdev), "~"=mmlSpace(x, fontfamily, fontface, svgdev), "phantom"=mmlPhantom(x, fontfamily, fontface, svgdev), "over"=, "frac"=mmlFrac(x, fontfamily, fontface, svgdev), "atop"=mmlFrac(x, fontfamily, fontface, lwd="0em", svgdev), "sum"=mmlBigOp(x, fontfamily, fontface, svgdev, "\u2211"), "prod"=mmlBigOp(x, fontfamily, fontface, svgdev, "\u220F"), "integral"=mmlBigOp(x, fontfamily, fontface, svgdev, "\u222B"), "union"=mmlBigOp(x, fontfamily, fontface, svgdev, "\u22C3"), "intersect"=mmlBigOp(x, fontfamily, fontface, svgdev, "\u22C2"), "prod"=mmlBigOp(x, fontfamily, fontface, svgdev, "\u220F"), "lim"=mmlBigOp(x, fontfamily, fontface, svgdev), "min"=mmlBigOp(x, fontfamily, fontface, svgdev), "inf"=mmlBigOp(x, fontfamily, fontface, svgdev), "sup"=mmlBigOp(x, fontfamily, fontface, svgdev), "group"=mmlGroup(x, fontfamily, fontface, svgdev), "bgroup"=mmlGroup(x, fontfamily, fontface, svgdev), mmlFun(x, fontfamily, fontface, svgdev)) } # Table of Unicode math ops at # http://www.w3.org/TR/MathML2/022.html toMML.call <- function(x, fontfamily, fontface, svgdev, ...) { if (is.name(x[[1]])) { funCallToMML(x, fontfamily, fontface, svgdev) } else { mrow <- newXMLNode("mrow", parent = svgDevParent(svgdev)) svgDevChangeParent(mrow, svgdev) toMML(x[[1]], fontfamily, fontface, svgdev) mfenced <- newXMLNode("mfenced", parent = mrow) svgDevChangeParent(mfenced, svgdev) toMML(x[[2]], fontfamily, fontface, svgdev) svgDevChangeParent(xmlParent(mrow), svgdev) } } # fontfamily is used to set explicit 'mathvariant' when it is not # implicit in the formula element expr2mml <- function(e, fontfamily, fontface, svgdev) { math <- newXMLNode("math", parent = svgDevParent(svgdev), attrs = list(display = "inline"), namespaceDefinitions = "http://www.w3.org/1998/Math/MathML") lapply(e, function(x) { mrow <- newXMLNode("mrow", parent = math) svgDevChangeParent(mrow, svgdev) toMML(x, fontfamily = fontfamily, fontface = fontface, svgdev = svgdev) }) svgDevChangeParent(xmlParent(math), svgdev) } �����������������������������������������������������������������������������������������������������������gridSVG/R/clipmask.R��������������������������������������������������������������������������������0000654�0001762�0000144�00000041322�12240527563�013717� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# High level functions for escaping clipping paths and masks popContext <- function(n = 1) { if (n < 1) stop("Must pop at least one level of context") # Not even giving the option of configuring a name because # it should not be used in any serious manner grid.draw(grob(n = n, cl = "popContext")) } # We have nothing to draw here, just rip out the SVG device to # start unwinding the tree primToDev.popContext <- function(x, dev) { svgPopContext(x$n, dev@dev) } svgPopContext <- function(n, svgdev) { # IMPORTANT - clipGrobs are left alone! # In the case where we have reached something we know # is not a reference, then we don't need to unwind further. # This is because viewports and grobs (in particular clipGrobs) # will be treated separately to clipping paths and masks. parentIsPushContext <- function() { id <- xmlGetAttr(svgDevParent(svgdev), "id") cids <- get("contextNames", envir = .gridSVGEnv) id %in% cids } contextLevels <- get("contextLevels", envir = .gridSVGEnv) cl <- tail(contextLevels, 1) if (n > cl) { warning("An attempt was made to pop more contexts than possible, ignoring extras") n <- cl } # In the case where a gTree has a popContext, don't do anything because # it would affect any remaining children that are yet to be drawn. # An example: # pushClipPath() # -> draw(gTree) # -> *draw*, *draw*, *popClipPath*, *draw* <- pop will be ignored here # -> leave(gTree) while (parentIsPushContext() && n > 0) { svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) cl <- cl - 1 n <- n - 1 } contextLevels[length(contextLevels)] <- cl assign("contextLevels", contextLevels, envir = .gridSVGEnv) } ### ### ### CLIPPING PATHS ### ### # Alias for convenient popping of a clipping path popClipPath <- function() { popContext() } pushClipPath <- function(clippath = NULL, label = NULL, name = NULL, draw = TRUE) { if (is.null(label) & is.null(clippath)) { stop("At least one of 'label' or 'clippath' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.clipPath") registerClipPath(label, clippath) } else if (is.null(clippath)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerClipPath(label, clippath) } cp <- grid::grob(referenceLabel = label, name = name, cl = "clipPath") class(cp) <- unique(c("pushClipPath", class(cp))) if (draw) grid.draw(cp) invisible(cp) } # High level functions for applying clipping paths to existing grobs grid.clipPath <- function(path, clippath = NULL, label = NULL, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) { if (is.null(label) & is.null(clippath)) { stop("At least one of 'label' or 'clippath' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.clipPath") registerClipPath(label, clippath) clippath <- NULL # use the ref from now on } else if (is.null(clippath)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerClipPath(label, clippath) clippath <- NULL # use the ref from now on } grobApply(path, function(path) { grid.set(path, clipPathGrob(grid.get(path), clippath = clippath, label = label, group = group), redraw = redraw) }, strict = strict, grep = grep, global = global) invisible() } clipPathGrob <- function(x, clippath = NULL, label = NULL, group = TRUE) { if (is.null(label) & is.null(clippath)) { stop("At least one of 'label' or 'clippath' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.clipPath") registerClipPath(label, clippath) } else if (is.null(clippath)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerClipPath(label, clippath) } x$referenceLabel <- c(x$referenceLabel, label) x$clipPathLabel <- label x$clipPathGroup <- group class(x) <- unique(c("pathClipped.grob", class(x))) x } clipPath <- function(grob) { if (! is.grob(grob)) stop("'grob' must be a grid grob") cp <- list(grob = grob) class(cp) <- "clipPath" cp } registerClipPath <- function(label, clippath) { checkExistingDefinition(label) refDefinitions <- get("refDefinitions", envir = .gridSVGEnv) if (! inherits(clippath, "clipPath")) stop("'clippath' must be a 'clipPath' object") # Note: grob must be forced to fix the definition of the grob # at the time of registration defList <- list(label = label, id = getID(label, "ref"), grob = grid.force(clippath$grob), vp = getAbsoluteVp()) class(defList) <- "clipPathDef" refDefinitions[[label]] <- defList assign("refDefinitions", refDefinitions, envir = .gridSVGEnv) assign("refUsageTable", rbind(get("refUsageTable", envir = .gridSVGEnv), data.frame(label = label, used = FALSE, stringsAsFactors = FALSE)), envir = .gridSVGEnv) # Return NULL invisibly because we don't actually care what the # definition looks like until gridSVG tries to draw it. invisible() } primToDev.pathClipped.grob <- function(x, dev) { setLabelUsed(x$referenceLabel) label <- getLabelID(x$clipPathLabel) cpg <- garnishGrob(x, "clip-path" = paste0("url(#", label, ")"), group = x$clipPathGroup) # Now need to remove all clip path appearances in the class list. # This is safe because repeated clipping just clobbers existing # attributes. cl <- class(cpg) class(cpg) <- cl[cl != "pathClipped.grob"] primToDev(cpg, dev) } drawDef.clipPathDef <- function(x, dev) { grob <- x$grob # This is always going to be true because we basically assume that # referenced content is fixed and therefore the names don't really # matter. if (get("use.gPaths", envir = .gridSVGEnv)) grob$name <- paste(x$label, grob$name, sep = getSVGoption("gPath.sep")) # Start clipPath devStartClipPath(list(name = x$id), NULL, dev) # Draw grob grobToDev(grid.force(grob), dev) # Close clipPath, open group devEndClipPath(list(name = x$id), NULL, dev) } primToDev.clipPath <- function(x, dev) { setLabelUsed(x$referenceLabel) devStartClipPathGroup(devGrob(x, dev), NULL, dev) } devGrob.clipPath <- function(x, dev) { list(name = getID(x$name, "grob"), cp = x$referenceLabel, classes = x$classes) } svgStartGrobClipPathGroup <- function(id = NULL, cp = NULL, classes = NULL, svgdev = svgDevice()) { clipPathID <- paste0("url(#", getLabelID(cp), ")") attrs <- list(id = prefixName(id), svgClassList(classes), "clip-path" = clipPathID) attrs <- attrList(attrs) cp <- newXMLNode("g", attrs = attrs, parent = svgDevParent(svgdev)) svgDevChangeParent(cp, svgdev) } svgStartGrobClipPath <- function(id = NULL, svgdev = svgDevice()) { cp <- newXMLNode("clipPath", attrs = list(id = id), parent = svgDevParent(svgdev)) svgDevChangeParent(cp, svgdev) } svgEndGrobClipPath <- function(svgdev = svgDevice()) { # First need to collect all children and filter out unwanted content clippath <- svgDevParent(svgdev) nodelist <- flattenClippedSVG(clippath) # Wipe out all children, then add in the ones we want removeChildren(clippath, kids = xmlChildren(clippath)) xmlChildren(clippath) <- nodelist # Go up one level from clipPath to defs svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) } flattenClippedSVG <- function(node) { # Mostly taken from spec, only adding in what we use though # Omitted - animation elements, 'use', 'ellipse', 'line' validElements <- c("animate", "animateTransform", "circle", "path", "polygon", "polyline", "rect", "text") clipPathID <- xmlGetAttr(node, "id") subset <- getNodeSet(node, paste0("//svg:clipPath[@id = '", clipPathID, "']", "/descendant-or-self::*/svg:", validElements, collapse = " | "), c(svg = "http://www.w3.org/2000/svg")) for (i in 1:length(subset)) { el <- subset[[i]] name <- xmlName(el) if (name == "text") { # We know that the structure is: # # # p <- xmlParent(el) gp <- xmlParent(p) gpattrs <- xmlAttrs(gp) gpattrs["transform"] <- paste(gpattrs["transform"], xmlAttrs(p)["transform"]) # There might also be a rotation present on the text itself if ("transform" %in% names(xmlAttrs(el))) gpattrs["transform"] <- paste(gpattrs["transform"], xmlAttrs(el)["transform"]) xmlAttrs(el) <- gpattrs } } subset } ### ### ### MASKING ### ### # Alias for popping out of a masking context popMask <- function() { popContext() } pushMask <- function(mask = NULL, label = NULL, name = NULL, draw = TRUE) { if (is.null(label) & is.null(mask)) { stop("At least one of 'label' or 'mask' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.mask") registerMask(label, mask) } else if (is.null(mask)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerMask(label, mask) } m <- grid::grob(referenceLabel = label, name = name, cl = "mask") class(m) <- unique(c("pushMask", class(m))) if (draw) grid.draw(m) invisible(m) } # High level functions for applying opacity masks to grobs grid.mask <- function(path, mask = NULL, label = NULL, group = TRUE, redraw = FALSE, strict = FALSE, grep = FALSE, global = FALSE) { if (is.null(label) & is.null(mask)) { stop("At least one of 'label' or 'mask' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.mask") registerMask(label, mask) mask <- NULL # use the ref from now on } else if (is.null(mask)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerMask(label, mask) mask <- NULL # use the ref from now on } grobApply(path, function(path) { grid.set(path, maskGrob(grid.get(path), mask = mask, label = label, group = group), redraw = redraw) }, strict = strict, grep = grep, global = global) invisible() } maskGrob <- function(x, mask = NULL, label = NULL, group = TRUE) { if (is.null(label) & is.null(mask)) { stop("At least one of 'label' or 'mask' must be supplied") } else if (is.null(label)) { label <- getNewLabel("gridSVG.mask") registerMask(label, mask) } else if (is.null(mask)) { checkForDefinition(label) } else { checkExistingDefinition(label) registerMask(label, mask) } x$referenceLabel <- c(x$referenceLabel, label) # Attribs to be garnished *at draw time*. In particular needs to be # done because the label ID is not known until then, because of things # like prefixes and separators. x$maskLabel <- label x$maskGroup <- group class(x) <- unique(c("masked.grob", class(x))) x } mask <- function(grob, x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(1, "npc"), height = unit(1, "npc"), default.units = "npc", just = "centre", hjust = NULL, vjust = NULL) { if (! is.unit(x)) x <- unit(x, default.units) if (! is.unit(y)) y <- unit(y, default.units) if (! is.unit(width)) width <- unit(width, default.units) if (! is.unit(height)) height <- unit(height, default.units) mask <- list(grob = grob, x = x, y = y, width = width, height = height, just = just, hjust = hjust, vjust = vjust) class(mask) <- "mask" mask } registerMask <- function(label, mask = NULL, ...) { checkExistingDefinition(label) refDefinitions <- get("refDefinitions", envir = .gridSVGEnv) if (is.null(mask)) { mask <- gridSVG::mask(...) } else if (! inherits(mask, "mask")) { stop("'mask' must be a 'mask' object") } if (is.null(mask$grob)) stop("A grob must be given for a mask definition") # Now convert *at time of definition* to absolute units (inches) loc <- leftbottom(mask$x, mask$y, mask$width, mask$height, mask$just, mask$hjust, mask$vjust, NULL) x <- loc$x y <- loc$y width <- convertWidth(mask$width, "inches") height <- convertHeight(mask$height, "inches") # Note: grob must be forced to fix the definition of the grob # at the time of registration defList <- list(label = label, id = getID(label, "ref"), x = x, y = y, width = width, height = height, grob = grid.force(mask$grob), vp = getAbsoluteVp()) class(defList) <- "maskDef" refDefinitions[[label]] <- defList assign("refDefinitions", refDefinitions, envir = .gridSVGEnv) assign("refUsageTable", rbind(get("refUsageTable", envir = .gridSVGEnv), data.frame(label = label, used = FALSE, stringsAsFactors = FALSE)), envir = .gridSVGEnv) # Return NULL invisibly because we don't actually care what the # definition looks like until gridSVG tries to draw it. invisible() } primToDev.masked.grob <- function(x, dev) { setLabelUsed(x$referenceLabel) label <- getLabelID(x$maskLabel) mg <- garnishGrob(x, "mask" = paste0("url(#", label, ")"), group = x$maskGroup) # Now need to remove all mask appearances in the class list. # This is safe because repeated masking just clobbers existing # attributes. cl <- class(mg) class(mg) <- cl[cl != "masked.grob"] primToDev(mg, dev) } primToDev.mask <- function(x, dev) { setLabelUsed(x$referenceLabel) devStartMaskGroup(list(name = getID(x$name, "grob"), mask = x$referenceLabel, classes = x$classes), NULL, dev) } drawDef.maskDef <- function(x, dev) { grob <- x$grob # This is always going to be true because we basically assume that # referenced content is fixed and therefore the names don't really # matter. if (get("use.gPaths", envir = .gridSVGEnv)) grob$name <- paste(x$label, grob$name, sep = getSVGoption("gPath.sep")) # Start mask devStartMask(devGrob(x, dev), NULL, dev) # Draw grob grobToDev(grid.force(grob), dev) # Close mask devEndMask(devGrob(x, dev), NULL, dev) } devGrob.maskDef <- function(x, dev) { list(x=cx(x$x, dev), y=cy(x$y, dev), width=cw(x$width, dev), height=ch(x$height, dev), name=x$id) } svgStartMaskGroup <- function(id = NULL, mask = NULL, classes = NULL, svgdev = svgDevice()) { maskID <- paste0("url(#", getLabelID(mask), ")") attrs <- attrList(list(id = prefixName(id), svgClassList(classes), mask = maskID)) m <- newXMLNode("g", attrs = attrs, parent = svgDevParent(svgdev)) svgDevChangeParent(m, svgdev) } svgStartMask <- function(id = NULL, x=0, y=0, width=0, height=0, svgdev = svgDevice()) { mask <- newXMLNode("mask", attrs = list(id = id, x = round(x, 2), y = round(y, 2), width = round(width, 2), height = round(height, 2), maskUnits = "userSpaceOnUse"), parent = svgDevParent(svgdev)) svgDevChangeParent(mask, svgdev) } svgEndMask <- function(svgdev = svgDevice()) { # Go up one levels from mask to defs svgDevChangeParent(xmlParent(svgDevParent(svgdev)), svgdev) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/MD5�����������������������������������������������������������������������������������������0000644�0001762�0000144�00000015601�13651737533�012107� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������8e03f7c85be7be631c547344bc53ce52 *DESCRIPTION 74498469bcff4e6c33cf2dbacca586dd *NAMESPACE e440d5f8086540130b160855cc636a0d *R/MathML.R 184a2488e8ea2450691dd6ee788c87fc *R/aaa.R 3873f00dfb9ed99edacf6f981b7aaf22 *R/animate.R b212b754e7d56b44a45846958f195263 *R/attrib.R 2afd766655813068aea44afbc21db6d8 *R/b64.R d5f6ba4df6ba4f72d794f6a7e3ece917 *R/clipmask.R f22f176156b7131171669c3bd875926c *R/comment.R 4130578d4f7d8c3545529686ca004777 *R/convert.R 8cb4acdaa7359674d6386f3c9eb44f89 *R/coords.R dc54ca2bce22216d5a7b20c5d2f679e2 *R/dev.R 1e4e4bfe4aa46fdc4b8579b0dc7bdccf *R/devsvg.R 9c0eae3158de3b4bbab6bc2eb61f0105 *R/element.R fd2265617a2603e6c55bf29c62f867de *R/filters.R 3c61bbcc1ee029a4d288f7da34ff1825 *R/gradients.R aa8f3c2f607fd70406f6e3d6ddc0a985 *R/griddev.R d44fe293a944fbf21349dbecfc644102 *R/gridsvg.R 14048aeec7d54ef79dafde8b4ee8b507 *R/gtable.R 89537d57aa0e1210fdebd6f323a7f143 *R/hyper.R 7ce613b928993a06ca2570d3657458b6 *R/mapping.R caf3e34f8ac91943928943eb458e2c24 *R/options.R f7f6f5f795023cbed81facc7e5a5b9a2 *R/patterns.R e32c7d1dcecd2db0a3f04805094c7dd1 *R/progress.R 27ea7296352ccaf7ad8816466fc98c24 *R/refs.R a3ad95c363e98657cda6d18fcb3699ef *R/sanitisers.R d620018bb1505e397cda73f940490689 *R/script.R b7dd7c3087e4596dbc947fd47a28836a *R/svg.R 7ab3487c54d6a14c25a8a0db6392b7c6 *R/svgStrings.R f4e77caf38383e872e530df688883c21 *R/zzz.R e8b5746d8fafc31295ff5336ec2685d5 *build/vignette.rds dc3406903bd9ae9daac6e57fe6fb9fd8 *inst/NEWS.Rd 6893e658e779057c2adcf56d81ebac69 *inst/doc/Makefile 2cb8f0d3adaec82d0180087ac9432154 *inst/doc/animation.R 057a85a0f37f9e0e6dc028e0767ce68c *inst/doc/animation.Rnw 6cae6521e9d104b8ce1b03360a0f7820 *inst/doc/animation.pdf 7125d362ab24bd7289e20cc297643594 *inst/doc/extensibility.R 9a20dfe04816ae5a3f2b601b3fe092cd *inst/doc/extensibility.Rnw 66d4300313fdd14591e0fd88a5d06511 *inst/doc/extensibility.pdf f6c8caa9d7dd128ff1f9304a39f883b5 *inst/doc/gridSVG.R e019ea7dc398b352a803cf3a28e53ecb *inst/doc/gridSVG.Rnw 6506b567c5a4d7b7c9318d5af9ee496a *inst/doc/gridSVG.pdf a0d05eb085ad6ec74ff60dedd111f210 *inst/js/utils.js 6a2970881555127cafe615cf6aea7b08 *inst/svg/genAttrTable.txt df7fd50ea1d5c06e16c85f496dd271ab *inst/svg/presAttrTable.txt 2605b94d65829d6cfac2a1b3d74e4f3c *man/animUnit.Rd 29c0d2f90071c2a4c1a544c7a3e862a9 *man/animate.Rd 54686c0667a10fe4ecb9f2a95fbbe862 *man/convert.Rd 5a85277ed4cb27d2af7ba373666d27d6 *man/coords.Rd ab775a15004faab59c4811c0f03e43e0 *man/fe.Rd 96b471a9e1785a5ca5b2ebfa3d4b4c6f *man/feBlend.Rd c413d04a80f68a444c270616063e175a *man/feColorMatrix.Rd a55cca88f3ae2253848ae13f3c004a42 *man/feComponentTransfer.Rd 975eb10e3202243fdd612120a13eddcb *man/feComposite.Rd 173b527b14a406994fe73575c0b66ee6 *man/feConvolveMatrix.Rd 3ac0fcce16006e77c817907bb45e1f28 *man/feDiffuseLighting.Rd 9cc341c62baadf21956bfd405da51cfd *man/feDisplacementMap.Rd acf5787098e73be2454a55f58040c9a3 *man/feDistantLight.Rd 6f297c2735f1e88928b284c866dc146d *man/feFlood.Rd 0b9af3a974d0d0b6f23876939fb70270 *man/feGaussianBlur.Rd 5999959bb76702b6d78739bf38db7028 *man/feImage.Rd 910602efafae3ed641a28db5ecc659c9 *man/feMerge.Rd f9a2fb9f2fba572cae110162393ca2ae *man/feMorphology.Rd b8805bb49624be4d9e7efc5ff96d7c98 *man/feOffset.Rd 6ca6808a0f4ebcf35e860375c92c2fe5 *man/fePointLight.Rd eb612afe501a84805f1ee80cdf37b649 *man/feSpecularLighting.Rd 868ddee3a522f89a52fd0de164288ce7 *man/feSpotLight.Rd 85a89ad128efd3ed0d7cdc62cb403c7b *man/feTile.Rd 517433b05de2d5c3be954585c72bf2d3 *man/feTurbulence.Rd cb15b0710d79fc4e78254fcca2debc91 *man/filterEffect.Rd 82da3c36bae916bee506021856143d17 *man/filterInputs.Rd 6c9676a8578d9f32192c5f79a2e84ee9 *man/garnish.Rd 009c753f91b2b4d2ba0cf8a92e398355 *man/getSVGFonts.Rd fb9ae45debe5a79ab41ccf20e6f429ba *man/getSVGMappings.Rd 0cbffcfcc9940c70cb19f40c3b9cceec *man/gradients.Rd 50ba25a1289af4eb150350f74976846b *man/grid.animate.Rd ee6565cc659e52e11cfda90de75f2731 *man/grid.clipPath.Rd d6000085e25a2db881944e14cbf94ca8 *man/grid.comment.Rd 8200b5bcc2d3b272900eefb337651e8e *man/grid.element.Rd 3f3ba60e15815c9f35b7701699bc2766 *man/grid.export.Rd c1ae86d75403aea705cea957d2c9a82b *man/grid.filter.Rd b95484121689b630ac4d8dd56eee78bd *man/grid.garnish.Rd 55c4f7c5d29dd55587c9be0af333fa5f *man/grid.gradientFill.Rd d7a263fcffe55138a3a2fac2df0dd86b *man/grid.hyperlink.Rd 527ab1711c7fc9ce7938329e4fdffafc *man/grid.mask.Rd e4172826001cd568c8312413612ea1eb *man/grid.patternFill.Rd bc4564ce39d7a0b2b132a2dbadf88e95 *man/grid.script.Rd 0be32ede4385f7cad7e3c89680ea6641 *man/gridSVG-internal.Rd 1dccea5bd62a41f4f2bd50fcd3e50914 *man/gridSVG.newpage.Rd 2cbf462421d3a2a399ed7dd8b67a6258 *man/gridSVGMappings.Rd 1c0fb87010657ecf4788995359ae4275 *man/gridsvg.Rd d9f8d5155595f31039fb72c28493bc74 *man/grobToDev.Rd e5b8f71df56d2a98e7cf8c8705047a83 *man/listSVGDefinitions.Rd f7c53bce018871bd94c932ff69d2b28d *man/popContext.Rd dd6bd2a2f353f1abb49c81a677373bd4 *man/primToDev.Rd 78142ae68ec68b6d462b58f93800f883 *man/pushClipPath.Rd de54fbc4785e65b3d7fd8d1cd7e788c7 *man/pushMask.Rd 2fb3c4e5cdcd1b34a6be244d56904c29 *man/readCoordsJS.Rd 7200ec6a262dc9a606d08fca9c2fb9f5 *man/readMappingsJS.Rd 82dd911923a910ef7bb29cf6dbcf6755 *man/registerClipPath.Rd 4635f190d2342463a55077c139e5f55a *man/registerFilter.Rd 492b0ad8b4b08e3ddf520091a49c28dd *man/registerGradientFill.Rd d0dedfbef926e8392262866ccce88659 *man/registerMask.Rd 56c22692d60bf587a8ac3d3b60efdec9 *man/registerPatternFill.Rd 0f2a2771862011f725e574aa62065e92 *man/setSVGoptions.Rd cce9618faff0a0a0365bc032a1b0809f *man/viewportCreate.Rd 9aa59d73abe414c7333583281626e61e *tests/test.script 71fbb18e38a41b5f3ce06f1dcc855f0b *tests/testanimate.R 0fba88a56ac2bf7079fe51ac2211546f *tests/testattrib.R f6f962a69d47d49b0fee4c007b3196a5 *tests/testball.R 1500188c9066759a7cc4f21b048f10c0 *tests/testclasses.R 4a69fbdc0f9b583baf2ac4d82c26f50e *tests/testclippath.R 3211a4b3dfb4c49a88c39b9f543db98d *tests/testcomment.R 0dcf5e080c0adb714a585dc1fd34132b *tests/testelement.R 668022374403ed92f79ad7b33860b64d *tests/testfilter.R 3225ff0b68bc5c42a785909a8081f317 *tests/testforce.R 411c1e76e7cb93c96dd32a08b8cda1f9 *tests/testgradientfill.R 2198e3689860cd80ba3d95c6c1c158fa *tests/testgrid.R d2605ccd3e13d2228a66929e9d930c6f *tests/testid.R b545a2e79ef7aa9f27c7e5ea26366a67 *tests/testlink.R 295bf0947f6e9bf984fea4e876c5dbc1 *tests/testmask.R a5dec3ed4c347dde195ef0de2bfd394b *tests/testpath.R 5641b302bbedebcb58ef48922806992a *tests/testpatternfill.R 766a28d1aea840179f464d28a51ab7a8 *tests/testpendulum.R d2686dfe593ed59082baf05d08455ba1 *tests/testplot.R 5d602bf58a22f9992f8a228cbb19e838 *tests/testplotmath.R ff60c749a98e55b7246e981c79b6e146 *tests/testpolyline.R 82aa80b13df456252582e92f040da118 *tests/testprefix.R 37d34feb7ab64698d9c112f5a32a8a2a *tests/testrotate.R 9ba28a8b16c67bf7f79813366de22b25 *tests/testsvg.R 771adc295d8fdc7e35ba003e9c3fda32 *tests/testtransparency.R a584e8aa0525478382132390ada0e637 *tests/testvp.R 057a85a0f37f9e0e6dc028e0767ce68c *vignettes/animation.Rnw 9a20dfe04816ae5a3f2b601b3fe092cd *vignettes/extensibility.Rnw e019ea7dc398b352a803cf3a28e53ecb *vignettes/gridSVG.Rnw �������������������������������������������������������������������������������������������������������������������������������gridSVG/inst/���������������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�12765642435�012552� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/inst/doc/�����������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�13651654530�013311� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/inst/doc/gridSVG.Rnw������������������������������������������������������������������������0000654�0001762�0000144�00000024351�12240527565�015314� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\documentclass[a4paper]{article} %\VignetteIndexEntry{gridSVG} \newcommand{\grid}{{\tt grid}} \newcommand{\gridSVG}{{\tt gridSVG}} \newcommand{\lattice}{{\tt lattice}} \newcommand{\R}{{\tt R}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \title{The gridSVG package} \author{Paul Murrell} \begin{document} \maketitle @ \section*{Introduction} This package is an experiment in writing a graphics device, purely in R code, for the grid graphics system. The specific device implemented is for the W3C SVG (Scalable Vector Graphics) format, but there is also some effort at a general device interface that would support other specific devices. \section*{User Interface} There are five functions of interest to the user: \begin{description} \item[{\tt grid.hyperlink}] takes a grid {\tt grob} and turns it into an object of class {\tt linked.grob}, with an associated {\tt href}. This allows the association of hyperlinks with elements of a grid graphic. See {\tt gridSVG/tests/testlink.R} for examples. \item[{\tt grid.animate}] allows the user to associate a duration (plus some other things) with certain aspects of a grid {\tt grob}. This allows a grid graphic element to be animated. See {\tt gridSVG/tests/testanimate.R} {\tt testpendulum.R} and {\tt testball.R} for examples. \item[{\tt grid.garnish}] allows the user to associate arbitrary SVG attributes with a grid {\tt grob}. This provides a way to associate with a grob things that have no corresponding grid concept, like an {\tt onclick} attribute. See {\tt gridSVG/tests/testattrib.R} for a simple example. \item[{\tt grid.script}] allows the user to create a grid {\tt grob} that contains an SVG script (e.g., some ECMAscript code). This provides a way to produce a complete SVG document (complete with scripts) entirely using R grid code (i.e., without having to hand edit the SVG file that \gridSVG{} creates. Again, see {\tt gridSVG/tests/testattrib.R} for a simple example. \item[{\tt gridToSVG()}] saves the current grid graphic to an SVG file. See the {\tt gridSVG/tests} directory for examples of what can be done. See the section ``Known Problems'' below for things that are not yet supported. \end{description} In addition to these functions, \gridSVG{} supports alpha-transparency by respecting the {\tt alpha} graphical parameter which can be specified in a \grid{} {\tt gpar} object. For example, the following code produces overlapping transparent circles\footnote{The {\tt pushViewport()} call is currently necessary to set some default values. It may be possible to remove this in future versions.}: <>= library(grid) library(gridSVG) <>= pushViewport(viewport(gp=gpar(col="black", fill=NA))) grid.circle(x=0.33, r=unit(2, "inches"), gp=gpar(alpha=0.3, fill="red")) grid.circle(x=0.67, r=unit(2, "inches"), gp=gpar(alpha=0.3, fill="green")) popViewport() gridToSVG() @ \section*{Internal Structure} There are nine {\tt .R} files in the {\tt gridSVG/R} directory, corresponding to the nine different things that gridSVG aims to provide: \begin{description} \item[dev.R] This contain (S4 methods) code defining a generic R-level graphics device interface. In other words, generic functions that may be called by a graphics system (such as grid), and that a graphics device (such as an SVG device) should provide methods for. \item[griddev.R] Code for running through the grid display list and calling generic device functions. \item[devsvg.R] Code implementing SVG methods for the generic device interface. \item[svg.R] A set of R-level functions for producing SVG output. Callable directly (see, e.g., {\tt gridSVG/tests/testsvg.R}), but mostly just called by code in {\tt devsvg.R}. \item[gridsvg.R] The function {\tt gridToSVG()}. \item[hyper.R] Code implementing the {\tt linked.grob} class -- i.e., an extension of the standard grid {\tt grob} that supports hyperlinks. Includes the function {\tt grid.hyperlink()}. \item[animate.R] Code implementing the {\tt animated.grob} class -- i.e., an extension of the standard grid {\tt grob} that supports animation. Includes the function {\tt grid.animate()}. \item[script.R] Code implementing the {\tt script} class -- i.e., an extension of the standard grid {\tt grob} that supports SVG scripts. Includes the function {\tt grid.script()}. \item[attrib.R] Code implementing the {\tt svg.grob} class -- i.e., an extension of the standard grid {\tt grob} that supports arbitrary SVG attributes. Includes the function {\tt grid.garnish()}. \end{description} \section*{Known Problems} This package is a partial implementation of several ideas. This section describes some of the known holes in and issues with the implementation. \subsection*{Overall Design} The package is ass-backwards in its design. Normal devices receive calls from grid to perform operations; gridSVG works off grid's display list so only has the information stored there to figure out what to do. This means that it has to replicate some of the work that grid does when grid draws (e.g., in order to enforce vp slots in grobs). If/when normal devices are implemented as R-level objects, so that grid includes a {\tt dev} argument in all its calls to devices, it may be possible to make gridSVG behave more like a normal device and this may lead to some simplifications. \subsection*{Sizing of and units in the SVG image} Software that tries to render SVG on a device has the same problem that \R{} graphics devices have when trying to render \grid{} output: Locations and sizes can be in a variety of units (cm, inches, percentages, ...) {\it some of which are physical units} with real-world meaning. The renderer has to figure out how big something like 1{\tt "} is in the native device units. This problem is worst on computer screens where it is not necessarily easy (or possible) to find out how many pixels there are in a physical inch on the screen. What \R{} does is try its best and it seems that SVG renderers must do the same\footnote{According to Section 7.1 Introduction of the W3C Scalable Vector Graphics (SVG) 1.0 Specification, ``a real number value that indicates the size in real world units, such as millimeters, of a "pixel"'' is ``highly desirable but not required''.}. gridSVG works off the grid display list. This means that the image must first be drawn on some other device (e.g., X11 or PostScript) then copied (via the {\tt gridSVG()} function) to an SVG format. It is not possible to use the SVG notion of transformations to mirror \grid{}'s viewport transformations because the SVG transformations work on ALL graphical elements, including text. In particular, any scaling transformations scale the size of text. Furthermore, \grid{} actions such as {\tt upViewport()} and {\tt downViewport()} are difficult to replicate as SVG transformations. So the copying of \grid{} output to SVG involves converting all locations and sizes to a single SVG coordinate system. There are two (serious) possibilities for this coordinate system: \begin{enumerate} \item specify everything (including the size of the SVG image) in pixels. In this case, what we do is work off the original device's concept of a pixel. The SVG image may be rendered quite a different size compared to the original if the size of pixels on the rendering device is different from the size of pixels on the original device. Things should be pretty consistent -- something that is supposed to be half the size of the image should be rendered half the size of the image -- though this will {\it not} be the case if the change in pixel size is different for x- and y-axes. An image drawn first in a screen window then copied to SVG and viewed {\it on the same screen} should hopefully be the same size. If the original device is a screen device, there is no guarantee that physical sizes will be respected; this will depend on how accurately the screen device can determine the physical size of its pixels. If the original device is a file device (e.g. PostScript) then physical sizes will be accurate on the original device, BUT the correspondence between ``pixels'' on the file device and pixels when the SVG is rendered on screen is very unlikely to be good (e.g., ``pixels'' on PostScript are $\frac{1}{72}${\tt "}, which is highly unlikely to correspond to pixel size on a modern screen). \item specify everything (including the size of the SVG image) in inches. In this case, there is no guarantee that the SVG image will end up the right physical size (it will depend on whether the rendering software can find out enough about pixels-to-inches, BUT everything should be in proportion (if the image is overall a little smaller than it should be, at least something that should be half the size of the image will be half the size of the image. The final rendered size of the image will totally depend on where it gets rendered\footnote{This is not to say that it should be riciculously off; it should be pretty close to the right physical size if it's not exactly the right size.}. This appears to have fewer problems; unfortunately it is {\bf totally killed} by the fact that the locations for drawing polylines MUST be in pixels! (technically, that should be ``user coordinates'', but since I have a single, flat coordinate system structure, it equates to pixels.) \end{enumerate} \subsection*{Plotting Symbols} Only {\tt pch=1} and {\tt pch=3} are currently supported. This is just a matter of filling in the other options. \subsection*{Mathematical Annotation} The use of things like {\tt grid.text(expression(x[i]))} is supported in the main R graphics engine. gridSVG bypasses that and so does not support mathematical annotation (and probably never will!). \subsection*{Time unit arithmetic} Animation is no longer achieved via ``time units'' so old problems with arithmetic on time units in previous versions of \gridSVG{} disappear (i.e., the user does not need to be as careful when doing animation; just specify some unit values and/or expressions and it should go.) Having said that, there is still only support for animating a small set of aspects of grid {\tt grob}s (basically the locations and sizes of {\tt grob}s. \subsection*{Acknowledgements} Many thanks to Nathan Whitehouse and colleagues who contributed ideas and code for including arbitrary SVG attributes and SVG scripts. \end{document} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/inst/doc/extensibility.R��������������������������������������������������������������������0000644�0001762�0000144�00000016673�13651654527�016353� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������### R code from vignette source 'extensibility.Rnw' ################################################### ### code chunk number 1: extensibility.Rnw:32-34 ################################################### library(grid) library(gridSVG) ################################################### ### code chunk number 2: extensibility.Rnw:60-61 ################################################### tg <- grob(name="tg", cl="timegrob") ################################################### ### code chunk number 3: extensibility.Rnw:67-71 ################################################### timegrob <- function(x) { textGrob(paste("text generated at", Sys.time(), sep="\n"), gp=x$gp, name=x$name) } ################################################### ### code chunk number 4: extensibility.Rnw:77-80 ################################################### drawDetails.timegrob <- function(x, ...) { grid.draw(timegrob(x)) } ################################################### ### code chunk number 5: simplegrob ################################################### grid.draw(tg) ################################################### ### code chunk number 6: extensibility.Rnw:110-112 ################################################### bt <- grob(x=unit(.5, "npc"), y=unit(.5, "npc"), label="hi", name="bt", cl="boxedtext") ################################################### ### code chunk number 7: extensibility.Rnw:117-126 ################################################### boxedtext <- function(x) { tg <- textGrob(x$label, x$x, x$y, name=paste(x$name, "text", sep=".")) rg <- rectGrob(x$x, x$y, width=grobWidth(tg) + unit(2, "mm"), height=grobHeight(tg) + unit(2, "mm"), name=paste(x$name, "rect", sep=".")) gTree(children=gList(tg, rg), gp=x$gp, name=x$name) } ################################################### ### code chunk number 8: extensibility.Rnw:130-133 ################################################### drawDetails.boxedtext <- function(x, ...) { grid.draw(boxedtext(x)) } ################################################### ### code chunk number 9: notsimplegrob ################################################### grid.draw(bt) ################################################### ### code chunk number 10: extensibility.Rnw:178-181 ################################################### primToDev.timegrob <- function(x, dev) { primToDev(timegrob(x), dev) } ################################################### ### code chunk number 11: extensibility.Rnw:187-190 ################################################### grid.newpage() grid.draw(tg) gridToSVG("simpleclass.svg") ################################################### ### code chunk number 12: extensibility.Rnw:199-200 ################################################### library(XML) ################################################### ### code chunk number 13: extensibility.Rnw:203-205 ################################################### simpleclasssvg <- xmlParse("simpleclass.svg") cat(saveXML(simpleclasssvg)) ################################################### ### code chunk number 14: extensibility.Rnw:227-230 ################################################### primToDev.boxedtext <- function(x, dev) { primToDev(boxedtext(x), dev) } ################################################### ### code chunk number 15: extensibility.Rnw:236-239 ################################################### grid.newpage() grid.draw(bt) gridToSVG("notsimpleclass.svg") ################################################### ### code chunk number 16: extensibility.Rnw:244-246 ################################################### notsimpleclasssvg <- xmlParse("notsimpleclass.svg") cat(saveXML(notsimpleclasssvg)) ################################################### ### code chunk number 17: extensibility.Rnw:280-286 ################################################### animate.timegrob <- function(x, ...) { tg <- timegrob(x) tg$animationSets <- x$animationSets tg$groupAnimationSets <- x$groupAnimationSets animate(tg, ...) } ################################################### ### code chunk number 18: extensibility.Rnw:293-297 ################################################### grid.newpage() grid.draw(tg) grid.animate("tg", x=c(.3, .7)) gridToSVG("animsimpleclass.svg") ################################################### ### code chunk number 19: extensibility.Rnw:305-307 ################################################### animsimpleclasssvg <- xmlParse("animsimpleclass.svg") cat(saveXML(animsimpleclasssvg)) ################################################### ### code chunk number 20: extensibility.Rnw:325-337 ################################################### animate.boxedtext <- function(x, ...) { bt <- boxedtext(x) bt$groupAnimationSets <- x$groupAnimationSets animate(bt, ...) # Animate the children of bt btrect <- getGrob(bt, "bt.rect") btrect$animationSets <- x$animationSets animate(btrect, ...) bttext <- getGrob(bt, "bt.text") bttext$animationSets <- x$animationSets animate(bttext, ...) } ################################################### ### code chunk number 21: extensibility.Rnw:347-353 ################################################### grid.newpage() grid.draw(bt) grid.animate("bt", x=c(.3, .7)) grid.animate("bt", visibility=c("visible", "hidden"), begin=1, duration=0.1, group=TRUE) gridToSVG("animnotsimpleclass.svg") ################################################### ### code chunk number 22: extensibility.Rnw:358-360 ################################################### animnotsimpleclasssvg <- xmlParse("animnotsimpleclass.svg") cat(saveXML(animnotsimpleclasssvg)) ################################################### ### code chunk number 23: extensibility.Rnw:391-397 ################################################### garnish.timegrob <- function(x, ...) { tg <- timegrob(x) tg$attributes <- x$attributes tg$groupAttributes <- x$groupAttributes garnish(tg, ...) } ################################################### ### code chunk number 24: extensibility.Rnw:405-409 ################################################### grid.newpage() grid.draw(tg) grid.garnish("tg", onmousedown="alert('ouch')") gridToSVG("garnishsimpleclass.svg") ################################################### ### code chunk number 25: extensibility.Rnw:414-416 ################################################### garnishsimpleclasssvg <- xmlParse("garnishsimpleclass.svg") cat(saveXML(garnishsimpleclasssvg)) ################################################### ### code chunk number 26: extensibility.Rnw:423-429 ################################################### garnish.boxedtext <- function(x, ...) { bt <- boxedtext(x) bt$attributes <- x$attributes bt$groupAttributes <- x$groupAttributes garnish(bt, ...) } ################################################### ### code chunk number 27: extensibility.Rnw:443-449 ################################################### grid.newpage() grid.draw(bt) grid.garnish("bt", onmousedown="alert('ouch')") grid.garnish("bt", onmouseover=c(bt.text="alert('watch it!')"), group=FALSE) gridToSVG("garnishnotsimpleclass.svg") ################################################### ### code chunk number 28: extensibility.Rnw:454-456 ################################################### garnishnotsimpleclasssvg <- xmlParse("garnishnotsimpleclass.svg") cat(saveXML(garnishnotsimpleclasssvg)) ���������������������������������������������������������������������gridSVG/inst/doc/extensibility.Rnw������������������������������������������������������������������0000654�0001762�0000144�00000036463�12240527565�016712� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\documentclass[a4paper]{article} %\VignetteIndexEntry{extensibility} \newcommand{\grid}{{\bf grid}} \newcommand{\gridSVG}{{\sf gridSVG}} \newcommand{\lattice}{{\bf lattice}} \newcommand{\R}{{\sf R}} \newcommand{\js}{{\sf javascript}} \newcommand{\svg}{{\sf SVG}} \newcommand{\code}[1]{{\tt #1}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \title{Extending the gridSVG package} \author{Paul Murrell} \begin{document} \maketitle @ \section*{Introduction} It is sometimes useful or necessary for the user/developer to define a new grob (or gTree) class. The \gridSVG{} package only knows about the classes in the \grid{} package (basic graphical primitives, gTrees, plus a few others like frames and cell grobs). This means that \gridSVG{} cannot export, or animate, or garnish new grob classes without additional information. This document describes how to write methods for a new grob class to work with \gridSVG{}. <<>>= library(grid) library(gridSVG) @ The assumption in this document is that a new class has been made because there is a need to have a special \code{drawDetails()} method (because what the class draws has to be determined at drawing time rather than at grob creation time). There should not be any need for the information in this document if you have grobs or gTrees that are entirely defined at time of creation (so do not need any \code{drawDetails()} methods). Those cases should be handled by the \gridSVG{} package already. Users wanting to garnish or animate pieces of your scene should be able to get at whatever components of the scene that they need using gPaths (assuming that you have named all your grobs properly). \subsection*{Simple class example} A simple case is one where the grob being created (at drawing time) is just a simple graphical primitive. For example, the following (contrived) code defines a new class of (text) grob, a \code{timegrob} class, that writes out the time that its text is generated (see Figure \ref{figure:simplegrob}). <<>>= tg <- grob(name="tg", cl="timegrob") @ Because we will be able to reuse it later, we will write a function to create the grob at drawing time. <<>>= timegrob <- function(x) { textGrob(paste("text generated at", Sys.time(), sep="\n"), gp=x$gp, name=x$name) } @ The \code{drawDetails()} method for this new class just calls the \code{timegrob()} function to create a text grob and then draws that grob. <<>>= drawDetails.timegrob <- function(x, ...) { grid.draw(timegrob(x)) } @ Drawing the \code{timegrob} object calls the \code{drawDetails()} method above. <>= grid.draw(tg) @ \begin{figure} \begin{center} \includegraphics[width=2in]{extensibility-simplegrob} \caption{\label{figure:simplegrob}A simple new grob class that draws the time that its text was generated.} \end{center} \end{figure} The important thing about this class is that the grob that is being generated in the \code{drawDetails()} method is just a simple \code{text} grob. \subsection*{Not simple class example} A slightly more complex case is when a new grob class actually generates a gTree in its \code{drawDetails()} method. For example, the following code defines a new class, called \code{boxedtext}, that creates a gTree containing text and a bounding box (at drawing time so that the box can be created from the current size of the text, in case the text has been edited; see Figure \ref{figure:notsimplegrob}). <<>>= bt <- grob(x=unit(.5, "npc"), y=unit(.5, "npc"), label="hi", name="bt", cl="boxedtext") @ Again, it will be useful to have a function that creates the gTree. <<>>= boxedtext <- function(x) { tg <- textGrob(x$label, x$x, x$y, name=paste(x$name, "text", sep=".")) rg <- rectGrob(x$x, x$y, width=grobWidth(tg) + unit(2, "mm"), height=grobHeight(tg) + unit(2, "mm"), name=paste(x$name, "rect", sep=".")) gTree(children=gList(tg, rg), gp=x$gp, name=x$name) } @ The \code{drawDetails()} method is again very simple. <<>>= drawDetails.boxedtext <- function(x, ...) { grid.draw(boxedtext(x)) } @ Drawing the \code{boxedtext} grob call the \code{drawDetails()} method whch creates a gTree, containing a text and bounding rectangle, and draws it. <>= grid.draw(bt) @ \begin{figure} \begin{center} \includegraphics[width=2in]{extensibility-notsimplegrob} \caption{\label{figure:notsimplegrob}A not simple new grob class that draws text with a bounding box.} \end{center} \end{figure} The important thing about this example is that it creates a gTree at drawing time. \section*{Exporting a new grob class to \svg{}} If \gridSVG{} knows nothing about a grob class then it will not export any SVG elements via \code{gridToSVG()}. The technique for telling \gridSVG{} about a new class varies depending on how complex the new class is. \subsection*{Exporting a simple class} The \code{primToDev()} generic function is the function that converts a simple grob into \svg{}. There are \code{primToDev()} methods for all of the standard \grid{} graphical primitives, but for grob classes that \gridSVG{} does not recognise, no \svg{} code will be generated. If the new class only creates a simple grob at drawing time then all that is required is to define a new method for the \code{primToDev()} generic that generates a standard grob and calls \code{primToDev()} on that. For example, the following code creates a method for the simple \code{timegrob} class. This method simply creates the required text grob and then calls \code{primToDev()} on that, which exports the normal \svg{} code for a text grob. <<>>= primToDev.timegrob <- function(x, dev) { primToDev(timegrob(x), dev) } @ The \code{gridToSVG()} function will call this method to produce the appropriate \svg{} code. <<>>= grid.newpage() grid.draw(tg) gridToSVG("simpleclass.svg") @ The \svg{} code is shown below. One important feature is that the \code{id} attributes of the \svg{} elements are sensible. This has happened because the \code{timegrob()} function that we wrote sets the name of the text grob that it creates from the name of the \code{textgrob} object. <>= library(XML) @ <>= simpleclasssvg <- xmlParse("simpleclass.svg") cat(saveXML(simpleclasssvg)) @ Another feature of the \code{timegrob()} function is that it sets the \code{gp} slot of the text grob from the \code{gp} slot of the \code{textgrob} object. This is important to make sure that any graphical parameter settings on the \code{textgrob} are exported properly to \svg{}. \subsection*{Exporting a not simple class} The solution for exporting a new class that creates a gTree at drawing time is very similar to the simple solution. We need to write a \code{primToDev()} method for the new class, the only difference being that this method should create a gTree (rather than just a standard graphical primitive grob). For example, the following code creates a method for the \code{boxedtext} class. This just calls \code{boxedtext()} to create a gTree containing the appropriate text and bounding rectangle and then calls \code{primToDev()} on that gTree. <<>>= primToDev.boxedtext <- function(x, dev) { primToDev(boxedtext(x), dev) } @ The \code{gridToSVG()} function will now generate \svg{} output from a \code{boxedtext} object. <<>>= grid.newpage() grid.draw(bt) gridToSVG("notsimpleclass.svg") @ The \svg{} output is shown below. <>= notsimpleclasssvg <- xmlParse("notsimpleclass.svg") cat(saveXML(notsimpleclasssvg)) @ \section*{Animating a new grob class} In addition to converting a \grid{} scene to \svg{} code, the \gridSVG{} package also provides a way to animate components of a \grid{} scene. The \code{grid.animate()} function allows the user to select a grob by name and provide animated values for features of the grob (e.g., a set of x-values for a circle grob). The \code{grid.animate()} function actually only attaches the animation information to a grob. The real action happens when \code{gridToSVG()} is called and that calls the \code{animate()} generic function. The purpose of that function is to generate \code{} elements in the \svg{} code. As with \code{primToDev()}, there are \code{animate()} methods that generate \code{} elements for all standard graphical primitives, but nothing will happen for a grob class that \gridSVG{} is unaware of. If we want a new (simple) grob class to be able to be animated, we need to write an \code{animate()} method for that grob class. For example, the following code defines an \code{animate()} method for the \code{timegrob} class. This is similar to the \code{primToDev()} method in that it creates a text grob and then calls \code{animate()} on that (to take advantage of the existing \code{animate()} method for text grobs). The only complication is that the animation information on the \code{timegrob} object must be transferred over to the new text grob (this is done in a brute force manner here; perhaps a nicer encapsulation will be provided in the future). <<>>= animate.timegrob <- function(x, ...) { tg <- timegrob(x) tg$animationSets <- x$animationSets tg$groupAnimationSets <- x$groupAnimationSets animate(tg, ...) } @ With this \code{animate()} method in place, the following code draws a \code{timegrob} object and then animates it so that it will move left-to-right across the screen. <<>>= grid.newpage() grid.draw(tg) grid.animate("tg", x=c(.3, .7)) gridToSVG("animsimpleclass.svg") @ The \svg{} code that is generated from this scene is shown below to show that the animation has been recorded in the \svg{} output (it's actually an \code{} element rather than an \code{} element for text grobs). <>= animsimpleclasssvg <- xmlParse("animsimpleclass.svg") cat(saveXML(animsimpleclasssvg)) @ For the case of a new gTree class, things are a little more complicated. Again, we need to write a new \code{animate()} method, but this function can be a bit more complicated because there may be animation information to apply to the gTree as a whole \emph{and} animation information to apply to just the children of the gTree. For example, the code below defines an \code{animate()} method for the \code{boexedtext} class. This creates a gTree containing a text grob and a bounding rect grob. The \code{groupAnimationSets} information is added to the gTree and then \code{animate()} is called on that to output an \code{} element for the entire gTree, \emph{plus} each child of the gTree is extracted, \code{animationSets} information added, and then \code{animate()} called to output \code{} elements for each child of the gTree. <<>>= animate.boxedtext <- function(x, ...) { bt <- boxedtext(x) bt$groupAnimationSets <- x$groupAnimationSets animate(bt, ...) # Animate the children of bt btrect <- getGrob(bt, "bt.rect") btrect$animationSets <- x$animationSets animate(btrect, ...) bttext <- getGrob(bt, "bt.text") bttext$animationSets <- x$animationSets animate(bttext, ...) } @ The following code makes use of this method to animate a \code{boxedtext} grob. The first call to \code{grid.animate()} makes both text and bounding rect move left-to-right across the screen. The second call to \code{grid.animate()} makes the whole gTree disappear after 1 second (once the text and rect have moved to the right of the screen). <<>>= grid.newpage() grid.draw(bt) grid.animate("bt", x=c(.3, .7)) grid.animate("bt", visibility=c("visible", "hidden"), begin=1, duration=0.1, group=TRUE) gridToSVG("animnotsimpleclass.svg") @ The resulting \svg{} code is shown below. <>= animnotsimpleclasssvg <- xmlParse("animnotsimpleclass.svg") cat(saveXML(animnotsimpleclasssvg)) @ \section*{Garnishing a new grob class} The \code{grid.garnish()} function provides a way for users to add interactivity to a \grid{} scene, by specifying (\js{}) event handlers for components of the scene. More generally, the function allows \grid{} grobs to be garnished with arbitrary \svg{} attributes. Like \code{grid.animate()}, all \code{grid.garnish()} does is attach the garnishing information to a grob. The appropriate \svg{} code is only generated when \code{gridToSVG()} is called. The crucial action happens in the generic function \code{garnish()}, which transfers the garnishing information to the \svg{} device that is writing out \svg{} code. As should be familiar by now, there are \code{garnish()} methods for standard \grid{} graphical primitives, but no svg{} attributes will be exported for grob classes that \gridSVG{} does not know about. Fortunately, \code{garnish()} methods are once again pretty easy to write. For example, the following code defines a method for the \code{timegrob} class. This is very much like an \code{animate()} method: a text grob is created, the garnishing information is added to the text grob, then \code{garnish()} is called on the text grob so that the method for text grobs takes care of transferring the \svg{} attributes to the \svg{} device. <<>>= garnish.timegrob <- function(x, ...) { tg <- timegrob(x) tg$attributes <- x$attributes tg$groupAttributes <- x$groupAttributes garnish(tg, ...) } @ The following code shows the new method in action. A \code{timegrob} is drawn, then \code{grid.garnish()} is called to specify that a mouse click on the text should pop an alert dialog. <<>>= grid.newpage() grid.draw(tg) grid.garnish("tg", onmousedown="alert('ouch')") gridToSVG("garnishsimpleclass.svg") @ The resulting \svg{} code is shown below. <>= garnishsimpleclasssvg <- xmlParse("garnishsimpleclass.svg") cat(saveXML(garnishsimpleclasssvg)) @ The method is just as simple for a custom gTree class as well, as shown by the \code{garnish()} method for the \code{boxedtext} class below. <<>>= garnish.boxedtext <- function(x, ...) { bt <- boxedtext(x) bt$attributes <- x$attributes bt$groupAttributes <- x$groupAttributes garnish(bt, ...) } @ The following code shows this method in action, with an additional demonstration of the difference between garnishing individual components of a \grid{} scene and garnishing the overall parent component. A \code{boxedtext} grob is drawn, then the first call to \code{grid.garnish()} ensures that a mouse click on any part of the text or bounding box will produce an alert dialog. The second call to \code{grid.garnish()} sets up a different interaction on just the text so that moving the mouse over the text pops up a different dialog. <<>>= grid.newpage() grid.draw(bt) grid.garnish("bt", onmousedown="alert('ouch')") grid.garnish("bt", onmouseover=c(bt.text="alert('watch it!')"), group=FALSE) gridToSVG("garnishnotsimpleclass.svg") @ The resulting \svg{} code is shown below. <>= garnishnotsimpleclasssvg <- xmlParse("garnishnotsimpleclass.svg") cat(saveXML(garnishnotsimpleclasssvg)) @ \section*{Extending complex classes} A more complex case is one where a new grob class defines its own \code{preDrawDetails()} or \code{postDrawDetials()} methods. If that is the case, then it will be necessary to write a \code{grobToDev()} method for the class, just to get \svg{} exported correctly. See the existing methods for \code{grobToDev()} in the \gridSVG{} source for some examples. \end{document} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/inst/doc/animation.R������������������������������������������������������������������������0000644�0001762�0000144�00000011674�13651654527�015432� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������### R code from vignette source 'animation.Rnw' ################################################### ### code chunk number 1: animation.Rnw:28-30 ################################################### library(grid) library(gridSVG) ################################################### ### code chunk number 2: circle ################################################### grid.circle(.1, .5, r=.1, gp=gpar(fill="black"), name="circle") grid.animate("circle", x=c(.1, .9)) grid.export("animCircle.svg") ################################################### ### code chunk number 3: polylinesrc (eval = FALSE) ################################################### ## grid.rect() ## grid.polyline(c(.2, .3, .4, .6, .7, .8), ## c(.7, .5, .7, .3, .5, .3), ## id=rep(1:2, each=3), ## gp=gpar(lwd=5), ## name="polyline") ################################################### ### code chunk number 4: polyline ################################################### grid.rect() grid.polyline(c(.2, .3, .4, .6, .7, .8), c(.7, .5, .7, .3, .5, .3), id=rep(1:2, each=3), gp=gpar(lwd=5), name="polyline") ################################################### ### code chunk number 5: animvalue ################################################### polylineY <- animUnit(unit(c(.7, .5, .7, .3, .5, .3, .3, .5, .3, .7, .5, .7, .7, .5, .7, .3, .5, .3), unit="npc"), timeid=rep(1:3, each=6), id=rep(rep(1:2, each=3), 3)) ################################################### ### code chunk number 6: animation.Rnw:83-84 ################################################### polylineY ################################################### ### code chunk number 7: animation.Rnw:116-117 ################################################### animUnit(unit(1:4, "cm")) ################################################### ### code chunk number 8: animation.Rnw:140-141 ################################################### animUnit(unit(1:4, "cm"), id=rep(1:2, 2)) ################################################### ### code chunk number 9: animation.Rnw:152-153 ################################################### animUnit(unit(1:12, "cm"), timeid=rep(1:2, 6)) ################################################### ### code chunk number 10: animation.Rnw:163-165 ################################################### animUnit(unit(1:12, "cm"), timeid=rep(1:2, 6), id=rep(1:2, each=6)) ################################################### ### code chunk number 11: animpolylinesrc (eval = FALSE) ################################################### ## grid.animate("polyline", y=polylineY, rep=TRUE) ################################################### ### code chunk number 12: animpolyline ################################################### grid.newpage() grid.rect() grid.polyline(c(.2, .3, .4, .6, .7, .8), c(.7, .5, .7, .3, .5, .3), id=rep(1:2, each=3), gp=gpar(lwd=5), name="polyline") polylineY <- animUnit(unit(c(.7, .5, .7, .3, .5, .3, .3, .5, .3, .7, .5, .7, .7, .5, .7, .3, .5, .3), unit="npc"), timeid=rep(1:3, each=6), id=rep(rep(1:2, each=3), 3)) grid.animate("polyline", y=polylineY, rep=TRUE) grid.export("animPolyline.svg") ################################################### ### code chunk number 13: animation.Rnw:197-198 ################################################### as.animUnit(1:4, unit="cm") ################################################### ### code chunk number 14: animation.Rnw:208-209 (eval = FALSE) ################################################### ## grid.animate("circle", x=c(.1, .9)) ################################################### ### code chunk number 15: animation.Rnw:217-219 ################################################### m <- matrix(1:6, ncol=2) m ################################################### ### code chunk number 16: animation.Rnw:222-223 ################################################### as.animUnit(m, unit="cm") ################################################### ### code chunk number 17: animation.Rnw:231-232 ################################################### as.animUnit(m, unit="cm", multVal=TRUE) ################################################### ### code chunk number 18: animation.Rnw:246-248 ################################################### l <- list(unit(1:3, "cm"), unit(4:6, "cm")) l ################################################### ### code chunk number 19: animation.Rnw:251-252 ################################################### as.animUnit(l) ################################################### ### code chunk number 20: animation.Rnw:260-261 ################################################### as.animUnit(l, multVal=TRUE) ��������������������������������������������������������������������gridSVG/inst/doc/animation.pdf����������������������������������������������������������������������0000644�0001762�0000144�00000402706�13651654526�016001� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.5 %ÐÔÅØ 4 0 obj << /Length 1846 /Filter /FlateDecode >> stream xÚ­XÉŽÛF½û+„9QˆÕfo\8@bd‚ B.q4E-i8¥YþÞµ5Q²ÆNšé¥ººªúuÕkþ4óîÖ&*£½›Ì—$*3ù$Iœ2Y2™/&G?ÞOu´ß®€?‡M ï§3ÇÑÖÜÿ:ª°­£4÷8¹€ßŸðûkj’èž|€>ª*qìnêmT¬hé?óßÞÝê|¢µÊ½7hQÆez2³‰ŠsÃý15))8Âo :~Çö^~Õ–&@,T h‚}•O½8ô r›n½É ýVÚÐŒé[äìD;e]BÍ´õ 3™Ì\®b-Aú•‚b!¨»FG£Å±<àõ=ëÉ&¹Ê“ –x23°<Îxù|ÝÀÇ=9 Í4q[õ ÇÈ*‰d{BÒ?6}Œ}ÌÿôØ„Ô+ˆ¨h^b8QMy]`õÌdŽÚÒÄ©¾¡¦§ cÛÚZ)‡ŸÁá,°p¸�:Ô®µ,kxèÒ©ù¨,¤Û¦¼­þ=Š„t4ÒÝ8±ZãYaY£#Ot×°µPr¡b•8? ßí¼GÀÅgô`÷@— ¶[å\Þ¦YÖ[™åc%Œ­x®¬ÉâENGÁjX°àÙr#GSn» šš'CÌ`!³ïÔdŸqûGt¹’ˆ“yt„;îlñ"-ä|,nË¥—Óµ EØÁ£,R”¤¥i¸K–TÜnh õV÷<‚µ»]­Æ ç¸e£Q@Üi  p)8ƒ¸É½ÉÅcí0úçÒñ©rÆ,ßœÉ/¤M!g,¹Í}œrú¿_”Ì*oÒ ü­àÉÅQ3ÔS�:å,0Ö0¦±Ñb;1€  7‰F%kYk'ø§aø“(Ù·ðk*ñ¥’°¤'Ù:S&–ôÃtæ%Ï7¤Wòÿ¥Ë¼§ ;dâIþ¿jäüª!½µŸ±÷\õ(/œ¦ì†"š+#jÀ®ïº¸èýX ÷y©Ð.º£Þe[}ù÷ž�ÃŽo[z ¡ð8y¦2'±ûn:K2Í -¤UOç%o®ŸÇ7ÖÛk»JœžÅÈò‹ñÎ;÷GÖ&W­Å-Ÿå j™? -ýö ~‰YœÀo.óý 3R“ZºÌÐ^U’Þ Û×{IU(W·e„’A(–@sNkõ‘‹•O” -E¸>xÕ(x/ÍÛü�B´!•›½(®yâ´îÈè™´y‚žì­\Ý`ÿ}Çúár^¥yz°jӬ؅ŒîbÏŠÊP š‚sIIMB©æ)AqÙ‰ú6h—ÁnIÌ#Yê Ô"4ænµã–ï1¹:å®FŽ{ëÈûô¢½xöh²Vå{¹¢iÛCŒð¢6zKFU“ÁÒ,ž_…44ò㜂Š]Å}Žj½¹çb?Že o;¿ÎQF­Œi ‡ Ê9£€é/ܯ˜œ0Zq ­}ع„±ºæf‹ƒdÞ—s�€'_ÇßwáuE¹Í,]¯–nÈTB( ü¯$‡[–{ ÙøÜËÀ@tXº!‹™‰‘’mÅFäÃø?°kl_x\Œx&Uæ_ùÂóI$û/qùª`YànÇÏÌEûæ—,Ó®"vZó@@È�©U·`)–â ¥Gp›€¤•<„p°ä×3S^Î guš©¬#æçxÄ—oЕ/ ™VI—íD”H·Xy+ÚVÇ}7¨ûXÇTþŠýÀ,£]ôQ[ѓ،qØû¶QnZÒà™€?uBÈ üýfÏ©ƒ]"QssËy¹¾ÃnÒ:z7•`0>B¡x¸ØøÕ†¸ „JÈÜxU¨.'«2^•VýO.œ ΩC!¥¯¥Ý -%P¶ê-O2½æö¾’“ä"Å¡ÿé˜ p§ÄÓê,“Ôá7?Ïß|H} endstream endobj 18 0 obj << /Length 258 /Filter /FlateDecode >> stream xÚMP»n„0ìý[Ú/Ƙ”§)é"¹‹R #‡N|D§ü}v DÈ?vƳ£5PÐ2`Ðj_ `ƒºöÇI\…v¥«lR쮉2뿵¿Nž£x§µQÙæ™íLAä­‡F7„[ëÊzÀºÐÞY=|ÈVy& ?7Ú¿TV–¥4O*³¶”á¡Ð˸/*ÃZÆ‘d¿>Ï3ÿ¹3²gƒN‘æ1/•nqZÝârçfó0nÍP»1Ù¥ÇwTŸá-o«b‘‚7<’y`Û5vOЄ !®©þÓq§Ô'YîGájš@µjЭ×ÞÒé mYÇ2'^‚øgRcP endstream endobj 1 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpngXX2Q/Rbuild32e831c33c83/gridSVG/vignettes/animation-polyline.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 19 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << >> /ExtGState << >>/ColorSpace << /sRGB 20 0 R >>>> /Length 136 /Filter /FlateDecode >> stream xœU‹±‚@DûùŠù‚sw; •„D¼ÒØiC P _Ž\³“ì¼§ì©ù°ä𹞎ìĉ÷7u—å[~q»Sø€²_2B3Àóê¬0+o»z?™àÿÔ&ºJèÅrÍPk]šÆÌOÐÚ\³í,´Î„œQ¦ÍðUÈCÙ³1àÏÆ+ endstream endobj 21 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ�"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}Öº�üƒÂLX € ¡Xáçň‹g` ð�l�àp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁ�ÿŸ”¹Y"1�P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6�(’Ü.æsSdl-c’(2‚-ãy�àHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™Yár�fÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ �°¦eµÙú‡mi�]ëP»ý‡Í`/�в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~�(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 �E@ê@èÀ¶À¸�àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº� C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎè�t,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 24 0 obj << /Length 1779 /Filter /FlateDecode >> stream xÚÅXKÛ6¾çWA2°f$¾$åP šEÑK\’´¶×ëÆ¶¶~ìfÿ}çE‰²éÍMsØCrøÍÌ7Cÿ2}öâu5ªUíµMoF…¶ªÊõ¨Ì½*t=šÎGï²éí¸Èã‰Í]öÍÉýØù¬YqxÏã7ÐnwÜ>@;ZÒlWÐÙ48Œ­vËãkl'ºÌÚ8b³}»YÀ ­GÉ-ü-qÊ“0}ëŠ7öÝ98.j¼Ï]vã?ECó¸è¥›ÈàAíaüaúû(MŠBÕÎñÝœZmà鿘Ã?8¤€ÏK”ñÚå~°Zת(¹ŸD;\U¤¶ Ô?\~'BƧM†UðW Rwð7N¹ËSÃUrš6ª.žÖL…fæ›435ûŒjæÇ€fœª|žC¤|JàÛ þ_Ãú´fúºâgT3ÿ?hCº á^ñѯǕ%Ôð „í÷ya¡»Cê9ðÐ||Ö"%!§®ßu+€ÈÎù¥v*·Î¥óÔrBäNy_Aa¬+Ø»¶Èdp†ùœ†¯7‹Æ¬(°¶ìrAÓ"¯•­Ê Áႚ¹²6©&¨wÛÃñ˜&q]!‰÷bãÜž¼£·M££€OåÊ3ô—v'÷\®ØRB•>ñ*qѲRØ’+Ì8?Ä®}Å.<-ê–!™œáâKâÙT'¾Ì³W‚:ª7ȱu†w^Ì(¹Î{`=ìëm1XKûEÁµ'Іk;¹v—â«â ÉÂze9HF[oÈ¥‚?¯Òù¶;&|Þ¨Ü_Ø< °ùB€a‰€)ÙÏEÑ:I×^I˜ˆ\Œ3öQÒ-í/›ög†Öçª6Å0m'7Už]73´áG ÍÛ^®Ý±W ÌpP*JKe}ý½½×AœN#Õ.„3NÝ š²î‡ö¾÷mìÞqÕØqgp& ó¢tÊ{RÈ�]š¹§Â’ü•†uÖÞ$¥I÷dà"VßD~íA$}™ûU—Ð «Íÿ¢üƒ7F˜f(|óÅVÈUyV Wn‚lØãUp€«Ùój¦2Œ®ä»¡Ø_p‡l±¹äŸ¢½ç½D#/ƒwl çbý˜*f-îrhœy‰Ñémv}db7®âèt4Ži°¡H”9ªÜ²ÁØ0ì$ë5/x@µš.je‹–\“ÍdëæzíÙ²ä­b§Kj’îÖ]rzúݱB3Èh‘™‚×…jA!¼pœ]„š?FÉ^2%¡]>5xëD 3&Þ£ÁËö¤{'ÊsÒx‹ûì0âë*›ò‘Ì::âµ®»´¿ xŽ®þõÿíœT&aÕ�'ôBäÃø‘Yb%`rßµ8~ˆÎ6üaoÛsİ?,8?b â€jçËnŽ=ž·Äé5¨Á¦àìâ^@l@³±cÜHܲKÑ(™8•Ly:õR\H�›¨d³_Ì™½È ›>{Öa-j_ñè¬%gÝõxðø<¸cX}\xœ |Ç]ˆ799Ä,t;‘¹nEµø-ÙêAtP®e.Xìz:nS;î6Q„±‰PÍnâ„L%fðBæ= ¼Zˆ{OÛ_Tì¬ÖŒ «ŒõZž6W….Ão(P”GRF«Zwõ|ƒÆ µß·¯©½=4Ë.|fëFxŸˆšº„ qôNÉsy§¼Ú¦JòL•�"ü½‰ú‡óc ô}±ßY:¨Æ bd¨æo›=7ȶ„)¦xŽ„tBÐó¥^Ž'¥÷èr(Ìi:¸ýâ£ßª&”º'¿e“Å߀¯´õÑ‹$§øásšÄ1ºT®î*¨ãÓ8MŒÖªÒõ0ëàUD!tÃÔ©‚.~\C-:º;¿šUÞöpt@†’E.KD‰Õ×ý-§CWÔ¹ÿÿøƒþÎŽÕ¹ª*}þÆ£«QIGÔ% P5|íž?!*]•¸–øÆí÷¼Ùéë•k¸‰)´*é­•rÓÛ oØÉ:÷eÁוèéâÛ9åŠÎë©”Ú¿ iïR„ÌÉo©][nÎ(Rù·O)Ò–*´Wuk_Ë…*{ϼâsHø–;í–‹eêâºâÄx¾²_ðd)SÕ'õF¼ÕD;ð!þ‘V¡‹ ö—ÇMŸ.¡�*á=Ùýpnña0Ìtqõn “ å¥9-€‰Å6d†¨Q_¯ûC¥í‚ûw©š£bIÐ$r¾ŽªèA \Ò´$AW^þyìg~;~¡wÓÃüË{‘Ùþ1úœj ÞìyÏžéð(|­ ûuúì_dà endstream endobj 28 0 obj << /Length 1753 /Filter /FlateDecode >> stream xÚ­XÉŽÛF½û+„À ˆÚìK€H€Hä$Ÿlh‰#)Ñ2%ý÷©­›l‰ (õZ¬õU›¿zóÖç“ZÕ…)&ó‡‰6NU¹™”y¡´©'óåä}özª³G»0Û×v¹ðÈ »8xÉ ;ØZU ÌÔNˆŽ»;Šˆ–(†bcG,v'‘‡ßtMe–»VrYª¼Ž¾ŒÅfD«^)×T€ U¸° á¶Ž¾ƒoÄH=G^çså\|]#¯ ±õn0yµsÊ—u¸|�U{—ýƒ,… ÃÔ:{Zo­@wkfg#Š@gíÈoÙm‡¼Ò˜6[’~%‘™k•C.H4þ '1<³Ö€±IŒÄÅqÂØK‹Mpõ©«Sàu°lƒ'áͺùkà­´£û§àY-Ÿd„á½V|‡$H\//²Žxz.ŽÙ0H½6gUªºr/5§WU»CfÎ'ºÀŒ³i{H]Ÿ= ±pЉÌtê‚UhT¨ÌUQ\�Q(í¬M3ºOn8>Ñ«QxÌ0Ú¦•Œ\ ¼V¹Ö^åÖ¤:—¦èBï•*ËX|QX-Ç"øKzf„ž¹£ÉCˆÑ§`u”¿5®¼ADª¸µ¾–=A-¸Î P‹K:¡qK%¿\_:n¨Ã*ï¿­Ž™5¥*J} ­c*IŠ(Q‰Û¦-möÆæ0VÂE9äB(' Ý/Ü>ŸÜc»p_ưþ‰zM o$øCl)5ûàÇÝà?ÇÃñ‚žéo˜žý6CÁ^ÇNîFwŸÐß÷SÀa󒖺תáØ|K$sS¤âE%Æèšïúmá,²�æ$3ÐxÑtRÞ@ü§Õ.H"Å1�FÄç)Å�]ox¯‹ˆ¼í/wÔ. >bsQB’8seÙhd’æû¡2ƒ]ê–»EHµ’j–¼ù ùùÊãçŠU^×s [U"…cS˜Øs*Rp{ 1B`U…Âj¬}HºÜ .Imxvßr?K“g $<0VžôoÄòg $Ën ÉÒI«oµ²e°°ï;!.d+ÑW;õ†+d,`Š`c;ä¤K) ¼bâCUTù³µxôÕ0-ÜñéƒXûçªçu¬VpÜhðŒºXÄyàïÀëô*øöø1õf‹6ôp{ܹ¸/Ê+åíE9’¦äœ%àŒ>$"ÿƒ‚b:ïiŠäKÀòÂP¿–ß®.J_ßSlYŸÐzaUÑðßµEe1 wz¼kS«ª*™0}m~õûüÕÿ`xu3 endstream endobj 31 0 obj << /Length 1201 /Filter /FlateDecode >> stream xÚÅWÍŽã6 ¾ÏSÁ´ÑZ’%ËE§@ töÔCz(v÷àqœd�3“™îÛW©ø'JâYdÛƒS¢H~$E2¿,îÞPé$c™z²XM¸H˜‰Å$5ã"›,–“ÑO³¹2Êg<ªíz´ëÉ®?;ôÞ®O±ŠíÏ!¼Ííú~…]ߣЩý,Hà¹y{ºï¨+é{i×½];Ú{>ÕÑ‘¯[™îçóâw 9î@Ž's‘2“iûŽÌv¬pÈ9Ë”Âää3 çGãçîH@XCzLt¨(NOGÉ?ösþ2S:Ê+R6¡(:*wˆõ˜ß%ÒÇSÜÞ:£—xF9^2°‰a†ŽK†y‰[Øù²ÞžVð„¶OHäøÓ1Weà¥3Á-"B¢«¿8?!]Ÿf†Ì˜ˆSq ð¶íK ÁÅ”0Þü"V.'! ,áiß¡{ï§,jÈ}ÀX9³D×–$a±ô¦<Ì”ˆ¶ûM,gqvdÄÂsŒK&Ä‘)¯[®ž,n˜³…‹Ú©Ó8“­l6›'BE ÿt,Ü•‹jåðÛ4yí&¬õhÑ&]Xƒ6çQˆ@¾/)ì‘{•¾¢;¥3å²ÛÊá¦ðˆ…º. Kl™ê…*õ㧘CYt9]ÖpÏÊR Ð––>S…À·Ñ ëʺÓêu—.«8yúŒ‚“ž/[ÿK³ ŠïÜ•ì¶-vÞ.£t¥­ßÐÍñ­UµíË«¶×>ÿÚ^ ¤ì“*ØUùeµol³@&}RÕJÅŒ í«Ò!†·¹ã£FH÷ŸÜ|”ðUOråêú¶ V=Éõ êIžD‡† Ün§@•‚ÞVóq Mý.�¥˜L´6àná_³íÄG{¶øù¼ët|Ë_´˜Õôm‹Âªfßì�|·ÙÃ@Bµ95Œ«¬²ÊO8Ԥɢ¦˜üÉÍO%n­¨BÀ �ôÞGÂ~ß®¿8D‡VPSö±Ú楹ˆ~Ûw.v³7#‹a. 4éXîÈ«ŠªU¨ËŠŒ3ÕŽS*YÝþ1˜YÈCþfØC¤’9 -Zšu¦¨ÇLƼÛç79µ"g~MëÇ$^HM‰cÏÙküÍý ç1Èw°ÂuºP/›“½²KmM¡ô¯šu°½RÈ [yšßÃâtAªo)Eø¥ «ÇIÃs’\´Ÿ¬ß·€”}2铺O¦}Ò\ïÒ©QÙЂuQ‡¼È,GZp›ž>VÛš¤ßSÂøäÙµ+Ê+o”:'Z÷E×$Ê<÷4,]Ë…éõ»&â/dûÑU†Œß6+Έ«”g£eœÓ´îšÂÿ6ïy¢ÓSßû|©)gŠqÃ6öük§m9zR>—ú¨þŠº½ëã€|2½÷þÛÚÛÒΪ¶;2cR´Tßݯ‹»|kk© endstream endobj 34 0 obj << /Length 1632 /Filter /FlateDecode >> stream xÚµXKÛ6¾çWE^`͈QRÑôP 9ôTŠ"ÉA+Ë^'¶´µì&ý÷)É–7FŠhñ13¿yп._¼|“f³BÞøÙr=ÓÆ©<1³,ñJ›b¶\ÍÞ͹[¤ÆÎ7wz~€¶…¶‚¦ •ЙÛËø­†ö>Iøü�í Z mí_ùn…µš{Þ—_ÝÀòWÏr©'a]BûÚ[h¯Y}÷aùÛ,™-´VEš~õ\(îË@‹ƒœkp¦ó£ÿþ…Qlíh‘4{ùÆÙ™vÊ:oð@Q[¨L{VtùX3•×C*kTaêÓÑD­Ð�Ív úµýt¢•q:ˆZù©©ŽÈÚ6ÌP²ÐÖ)íÓÙÂ*Iò %”¨Ód@n•Ø‘žC»½Œ—{9§|js…V-;2%lžÌ7[2©Éç5ÎäÅü$ß#«CýÙdS3O»æÙ'øøyÛu(ãA®Lh:^¬+Ñì}¢öK4å¶mz pâ‘WHêç;“Å}ñâÿFknDõ=!qááX¹ãU8gs±t êvÜmQ6Ÿ…}B]v¤81­ÛÓuÁ¾ˆß]Í“¤~‡uà8Χ€”3îKü/Ó=ðÉy@&éº^=êàU78Ík^k˜¡´ÚS¿¹¢ ¼jqñi]oa­j¬"W¡t0#ŽÝvH{SáÙ&˜¦Êg~ä1WÙ•Ññ{b43Ê$nì=ðSE@Û°NC¨à¸*ea°¢q2A¢ÚC¼»®ì8ˆ[U=XÂk%i“©<ƒ,„¥îȶ²žØN˜ËZe2ó­Ž«Uæm`–:Ú)nŒaAëà7¸Vq£þ õ¬™†xÚŽ/<È-B”+2OÙS‘µNáV°CÎ9²�uŸÄ¬âk âÚl‘¥ÊÒ±E9Þî‡Áaa]¼©Ÿ—;Ù­/Ä‹7w¹#—@šgÊ}Ä>\¢M ©îzOn6œ’Oý F«lÎïòy€Þþ’`Ëg…áŠ×¢µ¡ÿ t4˜ ‚5eÉ þ\å×Ì?že4(Ù¡ÌBØîeµãïºÝI&ãf¯?+Q`[ãUf²Qÿ_ÖÐ~‚æúJâtFùJòt%’Æ9{ä+gjý(& w²ûÞUÇ„ÖXUè±sƒ3)çL½A½A!wƒ7”3ŽÁ\R;¼æ,Î%(¦м߱¿¼gÇácªàÈܰ0úƺõJ¨÷*µúùPÊïËO¡(Áá)Ä,ç©üÀ¹p‚­ÐTíÀ‰AäPÜš§¯ËÀü©V. IèÝ™%§ n…;eNÊRZ}ÎŒ>W‰Žáÿô|¸‡‡ƒïsàgnQ¡½ØŒÔˆC*BÒõ€´æ>Z¹.a{$ŒòŒ·ýù¤‚ Õ÷†gûº˜dÕŒ2ba”×gÕA¨3“ºlú‰‘NNê”Ê,¬MeXmŒÊµÿ^Puy+gŽðzþQìØ‰Ú=sòukzÂÐjÉg ÜÎÆb‚±>6‹dL]Ê&gø¤ªp×úáMYŽEüÓ0*X¥ç=‡V·Œv¤à”OY¥–ÛøHXÊjôûˆCÏŠ¦‰É—yœ'@Æ+ö\4Ïiß×Ãt-‚±›’Øÿxa‡}þîòeýEZÕs*‰×BÃ"àé¬ÎTÿ“íÇ÷cÒ¾Œƒ>=}k E&U8çêrƪ›ŽÃ+û{Üà$G Ñð)Ü,tä”Rºˆ�yNa7V;&T;æ²V¯›ÑbLŸHƒà4Îåg%ú¬Î3ƒa s¶/+Üô‘GU*Æ}Ãb®¤Óüº‰Š“gã ¨I³‚À%­C)LG?2ÝȆP¸fyþ…8?ìs¾\d!«­ä~ ‘-ÏÐu~ÊSaU°ZnJfÔ&æ°‚E;Å€ ¢®\c!*Úïo3•ô¢£Y€ÅC«­r™×ÎtÚrðþãpsꃘ\óÄ“¶PÎù[“tïÁ˜ÑŸ‰O‹> stream xÚ½WI¯Û6¾¿_a=Ø@͈¤¨%Hr(´ÇÂé%ɱå,ò“¼ßÙ¨ÅOî³S´B\†Ã™oVý¶xxýèÒI®òÄ$“Åz¢M¬²ÈLÒ(QÚä“Åjòiú~6wÆNýLO Î÷0v0*{ëŒÏ‘‹äèW¾}¾ x㌥½â[zöeñõ„Š&s“(“g,Î/ÂeƒÈ‘@k•;7F i}ºFüIˆ¾°˜ºIhU¹þg¾æ¾f”ï Œí Œí%cëT–$Ï›— 2wBß•¹*w+TæN¨’>ã×Ùˆ‹¥|ñ÷õlnŒž~Ÿ™tZàÜL·äö°þ63Yجp]»9P¶.„àÛÌ%SHU4¼{€O2-ŽüJ¸W¼ÆÓtZï(bà­_’˜*$7 "ËÄ—=žuù„gõ>„ ‰cÔ¥{é÷üÔ¦8œÉcˆþP!4~"ð»Hî£<ŒÙJâ¤x­F• M¨ GS0W «ö où†iWòêçH[@€iÁJ/0M[tӔ΅áÑãÍK‘Ë[‚èÚ{ANáE„ yˆ˜V.}E‘žä\ŽÐçcîŠÜ×Oò ‚º™Í­µ,N1b§8Viªƒ™*A*¸â_b®ò¹!l9¢½è½Í¹êaH^ƒo£öÖV®Fm¿ïyç+y)‚Pò>y Ù/)ó,V‰5Ã�ûßJŠ^dž¯-`ü)~¸«Ý_X.êÁx¿È¥·æÎxÈÖ —7$@ÑlAá0–"•hâÄp6+}Àšk‚ö$òˆ7Û&FÚ®>RÁñǧ‹¥o¤�bZ Åçb!|Õ¥–$ûÁJŠÝ vrÂÕ=#¯xþ°úÁO0!3qp—)›dÿ‡[e­‡+v$kµŠ] æJ‡šøª�µ¬_“õ¢¤mKlI)ÏóAyÙ­Ü÷ûÎÚ0‚‹Ï;ÜõáËŸR.5'fFÑ�û”zCÞ•+¢:U1Þx,¬wqE.t`±ºÞêŠ_èý²kÓ¼+Ö¸X¶xI <7p¦•²~oóÓýŒ3ÊDq`%í–‚\›%TQ¶¨_q<”ƒJÙÆiÆ)™ N¼‰n¼mÉfDj·À㫃èZ _äЮnw”áÃ-;—¶V9m†0öjyÙ‚1<õ!9– 5ðçRÒ*IPvMñ.ñ‘ v=Ö5stwxVx‘•Ž †JµýÀ̘'×=é ž“›N(r^àÔ&¾Q/ºKMº»ØåÜI#TmÔ,q>•mÂN‚o¬º(­Òú”üyKRÊŽÄÚÐõÎ㉮ö†~|Ú&gôwúj·$|bᓼÈ'ÄÀ%ž­B×û¥´kVº†GŸ]òoû¦apê$‡Dîð§Ce™€Ÿ"ÝÇÅÃßc5Þ` endstream endobj 41 0 obj << /Length 1065 /Filter /FlateDecode >> stream xÚ¥WKoã6¾çWèЃ Ä,ß’-л‡[·—Ý=(Šbµ­`%%ȿp†\8#ç3~ÊäÂssEëî=á³H¨©¯t²…RÖWÖ‹†?¶k®°kÎí'rï/ ë •¾1TöÚPéCå® •¾1Tgyœ¿Ÿb¿lK<ät¿Z[-ÓוÎÓæÒ¤Uy‰NÛçÕZû´®Pò Æ šæ}Çr.¢2L›#+6§š*Ag¤Ò²Dó´ÐJÐ:ŸÛ`±j¾Ã GE†æ20GQ 4ð#𒃡„¼ÑB?ϼ¶§‹ÁZƒ;kcÆ©¼óZhë# t¢g£Ö_ÁÉÃ%|S@ÝAAäÛÕk¾Âà¶Xàðµ’Z(éç5ðÿ¨üžµßǯҟ`l`ü,}º©ÜNèg4¼Ìžçv-gÝÔA­I”Æzœ³R(±áÍ.¤…WS)£E¡í4éOt CDû1¡æö3%2ë¢fuˆ7Ú^æd‚Þn)C¸ÿ ÖB2²Àt5Uu?2moY„=¯vdQŸsMTÈw» Û.\µr^änpô%r_ø>„ïa’vo—Ž8¨"9 �¨(jˆiÛtŒƒ ¤?ÖÁ¥}ÅÛfQÀ[•‘!‰e[6,Ì !V.Ÿ§ÑG(?Ðuï‘€%üº‘ Þxÿ‘ÅŸ"DÜÆy]3ÃGµ†z ˆu0›RÀûU*;¨YŒ8©÷±p;&¤—•s)1o»Š@'‹ôó*·è)©`ÛpS¶$¿T$ƒBŒ¼’á6i 4z™�ÀQ.Ïf‰>¡œ)ô¡}ÈêÌ©h ÛtæªÉ…Bõi×0¤*æuè–´9ò5-!Zž“ißô£7c/FPU ?Î'ùÓ†óÐ$? |_d¡3CøŒE6oÐGÔÝî˜È×&ÏSz<ÔÌ´ø(xŽвÀbl  å¯éœ7Ç9ó�·ø(ÐT¥¯»=ó@1½„leýpýÛX“áÉ·µ 4p#Äcù7?ëÂËYeÐÕ<…)¤5— ’œ1z¬>“Ï•ïð•7«†(å…ìÔÉS,LR(¾ÌöÌÔ å a¼LRþÙåøÓݧÍÝ?Žä5– endstream endobj 44 0 obj << /Length 1075 /Filter /FlateDecode >> stream xÚµVKÛ6¾ï¯ÐQb†oIÇÈÉ5î©éA‘e{[YZHò&ûï;’–×èA9‡ß7}Ø>¼´&SVëu¶ÝgJ[QI•Ò ¥ël»ËþÈ¿œO…ÊO ¼¦×âÏíç÷UV‹Úk{d¶Ñµ2h?•ÍÇ©Økó©ƒM=<ͯ§—BW9‰^y}F)F¥Ž…Í@¢´kà=¿ÃÅ2oz²HŠß ]ÆM¨Óu;žà¶‡.ß]†huæ!žû\l´Ï»Å{x‚K k èêù„ÎNèDË«|ƒ$ˈòwˆB ”¨cðöV•tB™xØŒ§|ëù\kðSªK<žpIk*¬€ËGƧxrÓ÷lƒ¯I„8¹bDy |”à¹sX€p´A'ðÃ|¡cTþU:ÉuËvi„¬\4-Н+äܤ[Ÿ˜•¿ãé9CÓ?Âå‰á a·ÑLÖúBƵûhîH7P¿Ã\ª8Žœ–t‰5­¸ºÆ¦!ÆÖ§€\¿ÎqŒQyfmD­ ñ‚îìfÖæ]àÆ‘ƒ5úTÅc¾JeiOéq^îÅL;RÄq|Ef:’-ĆʿüäŽOάՃ ?)…¦'Æ^לšø :}8 ¼‚9°¸çåsôa™Y�ùǾ²Ö|¦�Q¾í( 6Fj†pqùpä$ ¹·6t œ$ÚÄ÷6º¾ªÿŸàvÂ)M·ÈäS,ôä˜Îg´5SùЏ£¿ç‰ÌGàîÂ"—2äR™üÓºìaÀæß8Îx2Ï•fº “R�”¥x“=ÄÓnÜ.¡S3¡„ì\g…÷©r4§Õ=P_Í—V }©˜6èIß›05€0w¤³SZÞ³mˆ.Ì,KÕß䇎–’ø»L‚ùÑ¡2p&ÆWí�ш¬g×£Jv°’ P7L6p\–.ÿ­_…Þ4¤–ÏK²˜©Š5®”Ô Óì‚Þ8¡ÎÛØþì:Þp¨%4q_­IüÏÄ9/¼¶ÑÔ|Œõ;ö!ø³ªÊHÊüÆA(ò^ û¶Èϱoö¡>b&s·ð€(çUP¿ú= 9”nJw‚ÁWW„¡Vúg€5þgàòŒófˆcè­*wÐuNHbùyU†_AÔJ¡e*_§.ÕL*ëáôý‚J´ÐÆ^ãv‰ä;½¿Rý"÷·¾Yš”¦"Îæ¥"‚ju )Ì›ÐïqÜÆˆ%nèLKÈ5.o8¦Ý¼URó¢NÓ®1šSé):\ºçˆóóµScôN;rÙ†8ú›‘„�¬+uHrǘԺqœneB¡R<¥ü e—oŒÑØè»®; LÁ½‘Z) ã”Z¿Ê×Âx—AI€Ÿë*”Ÿ×>nþ¾§Æs endstream endobj 55 0 obj << /Length1 1415 /Length2 8219 /Length3 0 /Length 9178 /Filter /FlateDecode >> stream xÚ·P›k- ´8·bÁÝÝÝ¥¸[€�Á%¸w÷¢¥xq‡bŠ»»+Ðâ~iÏ9Ÿýÿ̽“™äÝ{¯mϳÖ;*2u&1sS´ƒ=„‰™• ¡$®ÃÆ `eå`feeG¢¢Ò�ClAÿø‘¨´@Î.`{þÿ@H8ƒ€Ÿ$òTr°È»ÚØ8�lÜül<ü¬¬�vVV¾€Îü�I Ø Ä w°¹ QI88z:ƒ-­ /}þyКÑØøøxÿ¤Äì@Î`3 =@ ±Ù½t4ÚÔÌÀ ˆç• ´‚@ùYXÜÝÝ™v.ÌΖÂtŒ�w0Ä  r9»Ì¿W(í@¯ÆŒDа»üPw°€¸A€‡-Ø dïò’âjor¼t¨Ë)Þ9‚ìÿ+þ`ü}8�6f¶•û;ûw!°ýŸd ™™ƒ#ÐÞlo °�Û‚�酪!F�ÐÞü7hëâð’t‚m¦/€?£Òbª�àˆïçbæ v„¸0»€mïÈò»ÌË1KÙ›K8ØÙì!.H¿ç“;ƒÌ^ÎÝ“åï˵±wp·÷þDz�Û›[ü^ÃÜÕ‘EÓìä ’“üóâBú·Ïp±²²òpó@N�‡™Ë ?A¶ßî—|½/k€|Á —$o �qvùzÿgà¿-$66€9Ø 0Y‚í‘þ]ýÅ ²øË~¹g°@Ÿõ…~l�Öߟ=¾0ÌÜÁÞÖóßð?WÌ"ùNMCY•áï•ÿwð�x3qq˜Ø¹XllÜœ�ž—ßÿ®£ÿ=ÇäÊÙ[8�øþ÷åœþÙíoÐþ-:À×Rvxa.@ûo¢°r±š½|±ý?ÓýOÊÿËWù¿ý'’vµµý§ý ðÿ‰íÀ¶ž#^˜ë yQ’Ëìÿª úKºâ¶æÿ“ƒ�_´ foiû¯c»Hƒ=@æ*`ˆ™Õ_tù˯ù[h¶`{Šƒ ø÷«ÀÄÆÊú?±u™Ù¼¼>\^8ù'zÏ·”²7s0ÿ­2ö—:;=‘^.ùÅâx³½ÈÑäñ‡Å�f{ÈK àe9_€…ƒ3ÒïýÝ“Åü·ïo“Àbù&€üo“ÀâüÇü¯!Ì\_¤ø‡&/þcÿÑ=ä2CZœs0¶® n¿©#tgÚš¦ÚÕN§cò^tþâz÷>…®êÃûuç+±”Áô•m)ÚKÑ%ÒGzø°Ö$Õ¶{ŸãµÉÝ6¤… ÜþñÂ#±º>bD"& Ñ=ŸG'­@›W-ÐòTyN®¼oT °nÜ{e<êúÊ–GBçvU÷ª¸ʦ˜b4£ ‹g¨òM³gñÉá LÄô˜gh3—WÓ˜¹ãϤò H¾Ç1Ÿ¼õ6Øcog½V+4Ø]º( ôð‰_]bŽLR{‹ï§ÊãÍ{—E¯ ÍçðDÄ ,÷&Î*hû©à;—2 e(vbQv庛e9Ûj™+¨iHë¼C¨Jd,’*)KŒ³‰Àþ·Äê‰:Ðæ _ºIºŽO4;é}ãðùÙb¾Ù‘\ amudûq?ܱ”'eaS, Ö(–”ßáNªçûJ© ºÄÔzë÷=ç3]3Y¿²ó)‚جñ÷"{ð⩌ݛªÔï'þxüÔo5¨ßP}‰4nÜÁ¾=aâHjäùÌ(ÇŽ'þæGy6ï€|ú:ë,¶ ‘&Œö„ê¹Î1ÑdŸÈ›éÇìŽe"˪'˜Çœ?@jQ²1ȆӑÌŽþÆ£D"wxOrøø›4ߺJ&ééÛe± �¦Wöüç8Ól/8gqw!Š‚~Ô¤Ú™!îŠ@>KL„n'«MՀ̱<Ü.k·ÊIºSC—'5òljªo!ñ “.⦔ÛGX=Ù³gé,Ák)ù‚ÚûLÂIfe¿£Ò�­éj'EyãIëéú-$È“®›Âbé+B†â™ªS¬ V¢œØ\ÈÛÃ[>`;¼ñ õ¡´dŸ …VÛ§[Q7›ÈAH3³‘Wy§^8K G¹å) ïùÂ$z©¬ØOÇœˆ0yyÎÇl<Èqê »�ýän¸-r'²´4ª¸öÎ[ˆ: ÙSL!;}Ã1!Ų̈ a4/¿N|kà/[Íò·ðÍÁr"úîå0o·FÌ©õ¾›L–æv¬U£¸˜Ë‚¤‹Òhp›é]ööQ§&5ÌùfÄ…QèïC–ôcG€ ”©–µlmhðû)ð¬ˆQÏ“˜?á““ '¼ËuŠMžï8û˜eRܱ+v–}TnØÅ-WêÝÏMmº¤«s‘•+Š-¬bÍE(âmɸˉ{,aöâ¼o/1èo×N~¤L"c1ª«î¼a/j+¸¯ ¦)±ÿL``Rk¨Ä¿ÿfkµ¥‡Û–ÀžÕ”/Ôΰýì'ãËRÉ']Jî·ú šR‘ýÍÑJùïŽiQÇk™%6«¶Êð .é7Eo¼8hŠ‹¨'R¸‹‚ÏØÓVà";©`hS.2mLjñ%ןXj`Rlh1cãlÒÑ«Þ@L®ŒĿޅáoÍÖÈúêb_•'Ö?á Üc™Qu¡ùÑb“-!ɻͻ¼AóMÿÆç4ç¾7±á½ÇŠY9æ2–„¡œxC­ÊôÕñýwšêÈ %êZžzŒŒTˆÞúýkgb®¥âf.òº÷ôUhÄÇK‡‚ÕÑc)’±ÑuŒmŠçÖ É ÇC_:‡¡¯Žr³É=X{®­(^•¯»ê‹.ùnî/’Ï! šË%HÑ#2¬;÷ ÷úܘ»!-8¥ˆ§‰6Rݺ¶UE¾æaÌL yäïuß.%âSàý‹„HK¶q$Q­í«äÈ=±uÂQV$}n¨Ûóÿ^ÚÛ{Ñ¡°±<ª£L[\{D‹B'k�Œ§Z-.Ù^])»bf¨þm¨2$Ó(ý‚f¶¥ý§ã$^ê²Mæ¯jcJ¸_g§Ž@úºH `V 'tòl-g^ }±I4Ô¥›{í¼x ËKsÚ*¼¾Á#››×fÝ ßîOÓÛH‡áŒÔºÕ8[—+38Wó©à•ž_–Ä÷4¤(Mæ×¨RQm›¹°¾sV ûÔÞâ-)¬„ ²Û@‰}‘QJû 'Š p+3úøF{žå'x—>HDÁdi0'¿}ñ‘ðÙ÷ÀR`¬3¡­"I´ðK´ðœlU@E÷Ñýíié²=ß[ÆSØõnÞ=N©>z" tÅ>Ô¯(ß!Ö<È}J«ž[^EÁ{Œ›"zgM¢{wjØ*â`áó‰£O§ÇËnáZÒ³bV65é•°èx_“ÂÁd¼>=¥‡ëì'ŽP–{«êVÌÇ ãÕöÁ9mˆ°ç¥#–Ì>\75ü¶˜ÿ,x:ªIk¹{¹p»F[hòŽ=-ªå±ÙË”–uyø’ _C«Ú»½ ñÆXö4>Ê(L¿„e+þmk 5-–ø3Zùg`§ë.·EX¸S”[Ì¡š4Á”IÃê9¹þ£?7–âRAÀа¾NÈcp‚ 9ãª\!àˆI"ý:ÖN°Ðú¯­gÎG_-s³F˜+P.+¸,Û¹éÅݪÒÊ“lÛFkX} ’'LùFÃj�¨‘t‰½êp4xK[‰¢mî¢)w#tjx7®ä3 ›™`.c [¦ö¦\Æ3�­‰Óœ}]9n›¨Ù›×öÖ `h3PÉ«…”q}z&v*$4~ã| ÐÚ1ò¿¢ßµó¸¤]Wý2èª&»}Êû*Þ˜cÊ0Ñ2©ƒ:—¡TZý¥>ú3æBñ&É1v#=Šî›ói)JžßÎ*Ûy&rÏ|\&¼ €¿9c•Ñ4÷§]‹lF•.DZŸ³J›v5ÞVž† a0r8\xc `Ô\÷![yª€H´­Ú s?Û¤J_\:¬cQ‘jÆN“èCû>V½8( ž²šÔÞÁc“C€~Ùs®EÙ¡_ ßý’n¡)@ÀùS›C  gÝržx\— gÙFj™¶î°¶‚JFE¬ù»«Ý*âSiÛ íL6€ýr¿e>·®³&¨ ˜°Y¿‘ñå¾þDx☱H¬6dXp „E %¥|Oè³ÝjOen]åU)v–T¬ó€6J÷ôd¢Cò§ ,(Ïí¹ˆE:ñ‘È3ƒÑ%ËÀƒèqy;€”“Óbrð/§ÑÜäÐZç¤dn#ðe»°¹kÂûó`qf¹Y½± “ó’íbýi›ôû,üœ¢ÅÖ…È|ÊkE hË)$~{SyÄð;ÅÖ^§¸·Éßœ¿[sõò½*SVÓª“Gûþ™„³ñ+Þ¾–êxs¼K·?Åu�2çŸJ²ü:³¿9j[Љ\"n /Vrkøðñ#,Ií%¡þ »§§,v¾÷a¨¦® mçðIé'1l: TG�ƉËò|Ëšñd{ïýج°ôXToZ¤[¢jØ 5ZîÆ[˜Ä»Êlnª³€W…ßüâ‘Ó"‡ßíÁ¢¾ÁLE$„Ñ�ÕÙ2ƒÂ�{=ÒÈ®¨.F`rüƒÃÏz÷xÆä† ?D‰³O‰~[jý‰&팄ÖäA ‹ 61¨ª\x†ä‚ʬ‡¤BšjРU¡å‘Ç„Ö 7¸¬ºÝ×múPâ1s&Ñ‹N»ˆ,#oÂÇ¡êMû¶ œcøÞˆ•Ýмuc(‚«R”ØiKc(!^æ…‰ÃN%ºõŒbö˜ZìÏ¥~ß©Y’â»h ·û6Ü™4{ènOÞ’%»k“oYRÿmé ž6ë×[ŒnæÔcb®5–å»/%Þð|&•¼8hqQ[½KÒ˜’ÔŠïG|ŒgŸ˜+òÝ€‡ê»i<šT#6¯¶QÄÅMN 6…¾ˆR=»h á²j¨ý£äÒ‡?tЫÃ|V<ÇO]ývU1¬Êm:Ý8µà§ ó q0´[Dzy–$û÷p`ÅBßcÌê>-$0ýP^¤õM'öEžMb>OЗã� §‚ … ÝƒŠEˆÊßú|Ð{ÅY89i8UFöX{3ˆTìþÁŒ%Ov¼œ$v„JÜî ‘‰g7G=“ýô1”þgŸTò7'ÎðÙ¶q–=ŒØVîCýEô¹t‡ænÂ& ”_+¥ùÒɵÂBíè?xÏ#)ãsrÍw£¨)XI'n’!®úõÓª£#÷RšßȈðû† H×â]°Ü¥žÏo*ª¹[˵çcC±TyQÔ ¢PyØR#Í]|F?ñ·ÚÚ®/X'g7h1dÜñŸ®uÑ–¼±•þNß©Ëó°³´`Rˆ\ã¨.BÕ öŽº…ø@é#\ãš Þò( Ý~˜âÁsœ°oxû~½q²Ìs }>¤ËœÅôDÒOŸ®êÞ’³8ŸcÿqU†ŠÅQ9¨‡ -…xQàs;$i::ßqÿåû¶Ç×])ƒÊñÓxEÀGVfÓÒ´mk2½íXQÁ¨Â=Ô÷WO^žs¶3tÏäµ€å³K…|¬ñí ®UM;‡©Œ„EöB(3˜4_º€ìíï^Iü‚5×§—ËÁÒ·¤ˆy=g}Aè¥9;û2ŠhžCK<¿¥–O·žºœ"´ý$ê nít Î…¾ƒ¶™Í©îPöX…Ÿ‹Ö±:ãšš(w~Áä 3ê~`&–¾_I.„ÎÌ¥‚N–ùŠ×ŠmÝÁH u‚«I=¦^QÆŠv˜A]ž®þyÔ²Ã`»¹ç>2ãhuò5ƒ/s6Ù`q½HÂ3§/,CßÈàE~ú©¹ÄÈ\¾ÀÕ‰LoGõÇ€Âþ>= ±úDüüÒºÓ)t“T‹0L§šbâû§�…QJŸEIíÏQÓ,*ÊupF)ô¬ —;½+ýMt¾Ó¯*å”,ɧ(¹îxwX–K¸°K4ð0*dç¢Íæˆ ŒµÓåí¥„s®¡Ü½Ya£€îqh-OmiÂÑ#Õ1ËV¹^ð‹hb|<@�þz¿cô©óg›x:™Îšø]ÑÐ D5rð|Œ1Ê+Ÿ¢æÃZO‹¸Døþ­œª SPÐ}«DÈF$yìÕò“µh…Š‘Í®?çGé§ãP_zǯ EÖÅçfކþ~¼‚]¢ÛñÝé­[vÙ³ÃÞS¥@óñ(QzùÅõtGÂÛ)~UTÞæ»öŒ8ªë&=F€�çéàÆI5è$™EFç æøÚ³«,8Õ®ØËNc'uZZFPÜ)HЌռôF\éœ67¼wXWo.8¬¶Õ׳¾«àl`Hõ%zÀÑñ"L÷"$QÍ¥õìÆ« Î8ôŽXLDùÍYd 9}øÒ„-ß[^!I¦·Ü1« I88eÖ}}H»+X ƒÿ-Ÿ9{ŸtBö •C7üTH©|ÜeÏ+ž›ÄŠa’85†f3ÍÍrb MhÚ:ÒÆ)#óeªú.ò_OêQÌ }e¹Ô>í-Yâ©8T ‚±õ­’ÍzµÝ>! ,öÐÑé§€‘sá‰BŽíºZÁ˜ÝD.‘7ÛâdP'é jƒ£¤í;‹×_“¸R§U-o~°9ÿÑ£^¯xêy¼füd}3œ®6ß(xº ø5Ò2‹àÌÒTÞ—e ß½âI¼½¦ð‘'¾Ç›K]•B! OŸe¾ï¬%�ö—€`–y )ú믵ë[ýb‹4 D¼¢žžªêG®C§Éã:^O9v‹ó`²˜Ï.®Q‰æQu‹BÎø5:"ç¶íA)#ZþÚæž«Ë\òhñu“û6+G¬G“7Èê­mVê« -;1tÍ8°$óweo#Rl›M7]ΫŸ¼¡øå¼ëM¨êŽO³3(µÐé •ºk–ů„ùJ¯'Fè+ΣdAüçqÜ7ìß.  µ¤�DÅî3E,c{^+'8…¦½æ„ªåE§ëÓø4ŠØgÕ…¹Z’®¦Þ2®04ÊdÃùñ{E!ÕwQ€C0uùp¨Að0  ®i3çàx^ÿlAÎ%*…X°÷ÓÔ ûÚèªC{Ž^ë]‰ÒgÈÒ£ú™¥1‚±aCkHdå!“ÌÎìWÝ>ƒŒO"B¾…q¢³¡”LÂò:ÐiùC¬e|±â¬aƒ’ýÇç47ÚjÉZ–ú‹%EÓr ÿƒ¨yó­ÓEµÏË2Y""@ù¯Zh›OžFûËŸŸ›,?ÚùmdšÔê±GïoN„ûDÁNxïˆÉ›¥©ªÝ¢8Ù›Ó®¡-ðÌøÕtå 9j¢Q&/÷zå\6ÌK ¸rñmšXå¡öñã|2úüaÄGÿ Ѷ§è$%Ç1Aý¸Öq‘’GÐ7=Ë8†R5ý›˾ñâ˜glœ I¼d lH'y™Ó£Ó¹³êŽõÅDúí‚§cçëãÅŸ>•üüMèZ°Êñâïº5½Þ ®Èšžeª$eßTý ä¦ä„(¶7 WÉ›B7 µË(ËáKÌ}pj�2+d`0öFHôD²MAà¡É±³HB¦®wbëÛ,åÙ?M…”bìº×¢Úu¯‚”Ç s3`DÙ�ââ÷Ç8'¾z´ù3x„*X]ÐÂ;&evî÷ž¯*j7: “|Yœ6åç|d\,žnpî¬jIˆ‹–*~¿÷es1.­  5`ÚÖÛéÐcž^A’¹^Ý" <½ÍŽ®wmlä=@EãØpL}àÅtbLêï ¾YEÓçPB¹Øtë…̱`—u7k |?I¼oD“ÀI6””¬qe]…ÿˆ2[¨ú /äð4ôI%Ÿ^ABÓ)Ñ&*9èH«+xú9gó8ê¶ùpbTuÅÄÝvŒ°:+íÓŒRe,Ä8"TÕ<3`-6´¨“®>Æð±÷L£ŸDUŽ4tbvó!ÒšC#Û$ußù"z×wƃÙß.›\.­z‘.° 0C¿6ÒILQÜ*H2IÀx”­Zßt}2ÓˆOÍ–K Í`4׳ÒaTˆ-’B¨²J“å§•â¡QV…ÑRÞ ½õ!]‹õƒ67¬¶Jz{*˵.BvüÜáC‘0Ô•ÏZXÊÓ¡-þ'˜Flwù üxÆ|~‰6X1Òúªgã‡FNŽ0ФX‘ýj@/›Ùò3+· Ÿ5*6ÃMtt@/c"’GAvTÀÌ þ«óx‰ÂºŒSy-&×/ëq›txU‘Õ„›À’ŠÙ48׫ਙOºàK¢šÚÁ„m}Âè¥|·íÂÚ;u“lÔ=ÝÜxö#R#ýÄK¶ß~™¥¢Eª-ÐÊ4ªÎ>kfY@ —~ÔBÁ-[G½»ÏF¼ÅÛrô‹‡Î⣡•ÐR¼ê›Qû„.mJÌ-f½\ïãñÁÓ(íÏV;÷Ð/™ÆàågHãçü*ü–#Ô2)ý3 ÜF>{SìnÓ)ôˆmÿ˜çîÂßDæ —Š—ëʜף™ÖZ[êø¢äW`š#j Çu1‡"¤g¨÷IIÊâ«5ñŽwGqgEô•¾Ðtºiúš îšEÝ‚²Ç¥jÂ]ìû«^ƒ‹tùP41[9üsQ,#yQ^@™I{élÑ9@8JæÞ¦½‰aÈ.à ù{àaêέ¦¨£Ïè¦öq¸Q²½Üa4¶b.ž$$y>ÒüybZæmÑsÎ÷‚^»§3–¡ú©‚¶=­]qHôuK4Öž?á‡=H�I Y3b…ŒïŸûÕ¦‡Î×R~^Â?ucÆ‹PòuoÄDP¶ž6Ò/U>8ÚqW&“°'x XèÆ¹b9ëyžÆ~W /òS|¼J<þWÇÃbÀ›ŸaÁÙqy®¦Õ2CBÛʦd’É'·°í´ÊÛ¢¦Ûu‰S£lê´üZ"°Ðá Ÿ'Nµ­³ªuLòí*Þ…{æ´L4n}gôóò`r }¼Rb6/'ë}ÿªadñù=JˈÆ÷³Áá>…ÞQi×öó}íëþÙ,Ý2#Nðá0®ëõ¼›`^ìÑ^'€2°ý¾Q¸’£ñûŠ€ÙV*PÝ+xÀݤêpÌyÆ×JÀp(^L[§W’QºI>·óËðø¸Œ#k1sM-šÛóâ2+û;®í RÿácðŠÄqdEìKò/t|ÀÄ‹šódˆ•™ÄS¾éPu±1¡žY¿­ºÝÌÝ+‰š=š“o÷1ÉMmŠ‘ß+Ý¿ur‰Ã2L¦a&ÚS NÐîI“¬U$é©“p\óyÞ­‚y. B³§hµÏõçsy1Ã'»Çå æ“vó ÂÊ5XAÑw3üa^>âPpc™c¢bž¨V|x?ñÈ t¯rݳNp¤Ô#ìlËžý‡oe\”’bHOb”aˆ†Uº-Œ{¶öé.u¤V{T.)ÑdµêæáëX©0^íZJYF¬@Ìì©I /:Ãfõ¿ÿšqí’W¿™(;ƒeìxñÐÏŠæ^u$þáœm.1Ê*ô<¨øœÎE¨`£j +gžˆt±5ANÅM«<`1“Š4k ÜCèµÊl’Ç¢4Ë,Ö”ª ‹ºžåÀçªy;úµ–={d¶q Ú÷åï&â*V›"—8ÿéŠc=G“[ƒœÆ·.k^Ôú,ùE½rz{ºZö7ÅT@ô€ýœÔçzñ°½×_æÜ×£….¼™l™S´:<{t¡7˜ºÏÍDë;PAqNa˜ÓÅÊù³=0àr¶JpH^æ:JÂêA?ÅrHÇ­É7íŠíÍ ¸­ÅÉIaVÁ$浞+Á£j‹ò‘w¿fïØô䉲L,§Âd=©µÐ*ºò<* ŸscCÀjÅ>KGÝcj#8¡z…–.ãk…¯\£H«däÑÈh t5r®¿èÞ¡ÞÀbßÄÆÍÄ![ÓYUð>l­`"/öOȺ€´åÏ«ý…†ø…•ŽÊȵ4vëºä 4«ÝluÓ öͽnfÞ8Ä xô9€h_‚=Ùˆ4EÅü®TEÿñy$«j…BWOo ­â+§ËwcÞf{ û¥ê: U}93ÊõB÷FWœ9©¼½G-êþ Ê…5Ü!8Dê«›‰0gKzªÞV;UB‰/ÊnåëÒ;Œ“Ct6`°Ä°3;ŒÐ±¯â»*ÍMÕ¯¹§Q2{‚ÝÏÓ“§°pÄ Û^Åv¸ºoÙweô¹;P¥¡éf(î ‰å*uû6ÞåkÙ¤n‘…ÊKÈ/›]åN†,·0~ä£2Ë:Uxý–¦o°É—¶Òkþ‹l™ÑòÓÄæÏ!;Š`6Y�^…yªw‡Š²Ò‚ÿä~¡‹t—ò+ýàTÀ{¨ÕRM©íªn¢£¬ëè 3Þœ3“ñæ73¥ªÓ~QöŸƒ­™á4ÚÄôì.78eA­ï÷ k‰Þò«%t†ã£‚8¿¼Û×üÁ•ÊŽ%+H-­SΠç–'_%Ù¤â’þ΂CÉãè­K ¹9W_ǹ|©Ão¨è´fšYÖ§õÐYÇòC¯028Yÿ#Û‘•†#ê–u[„çÛªnñ1k}l[~ïU5äφªÑ $ØŸ‘5Ôé6×ÄŽ¬Bµ««ã_×dyÁ_M¤»Ü‘¤Æ Ìö?¯ßç|2)}‹Ç=£«òæãT‡œˆÛ/úd¦)ÆÍÙ�#ò/އñUþ(‘dÒP¸ù\¡~M–®¿fëÈråø‰!¦L¸¸(GVd×-H&Ð< ûjóLçÆÆëÓ¿# IMÐUÞ.dµh¶Ùòú"5ênOÕW‹KZ.÷MŠ�ãN>""†‚"¦‚hµ¾'ò° Ô¦!æB(Ö»oÏkPãÙ$&ûàÐÑ"‡•ë¹Üo¢ËBó7¥Ü§ý¸švZÁðôâ\:ÒXØõÆ“¶ãÙ ¾]ttœ#Ó6žIÔ2âáf)­?ÔÉÖ}T¦47V~Ùýä“î³i¯#xc„›éJ~z¦<Œ-ÊLbæ Ÿ[oª aU÷ßnÆH‡ÅuTŒ4ŽQÉ7|T˜ÞëP¼o. •©Î.ÉÞAî èÎEÔS¤©9Óq7ÎzçÅáO+Rßµ‡=iXÕp é´.5–`‚àq©’JÕ³0qØJX—lØPë2¢ËÂc׸•Ð릶0( ?Üûæ*Ó*^p>,Úo#�C®0Õ}žÜµÚõÚ°Ûô]yQJSŸ>Í× _ZÄ$ÿí€ÏÐïcq™Â0²‡³j„!´Ò†Sˆ¼a÷ðåb$}¬Ü½âá­{=î'ƒXqhXÀå“"u¤ÿÁküà®Ùš ·fùVYºè줤”Í2½ÊPøz`§·ÿ›Ñ endstream endobj 57 0 obj << /Length1 1635 /Length2 8878 /Length3 0 /Length 9930 /Filter /FlateDecode >> stream xÚ´TTm6LHHK7CI3t‡´ ÝH:0 30t7Š !ÒH—t‡€tIK#  !€|øÄû<ïûÿk}ß:ks®Ý{ß×¾Ù™u ø H¨*áÎ'È/ PÒR4ó á±³ÂÜáпåxìÆP” ‰ú—… v¿“)ƒÝï µ�ÈŠI ŠK �„$ÿ6D¢¤�Ê`O Å�!P7Ô Šò„B�¿[hƒ¡µÆÇ0t€¹ý©0@Ú¹{QPÀ�³…"Üî\<( p—` ® Ðq"þ4ÖüÓ€ð×p�‚ü‚ÿ ÷—÷ï@0ÄÎ`[[¤³ áCØì`p(@GU“ßÝÛ�F@~‚ánÈ;°'ÛÜüQ: ª �ßuøWn¶(˜‹»¿ þ»Gàï0wcVA@”ÎÎP„»Þïú”a(¨íÝÜ}€®é…ðûÙÁ»ßm@<\€F˜«T]ù/›;Þ?2{¨;@T@@@\L�u@½m€¿ú¸@ÿP þßõàç‚tØÝµ €ÙAï>x~n`O(Àå ðû·â¿ž  �³uØ@ía¼¢ß‰¡vâ»óGÁ¼æwôü~þógyÇ0÷ùÇü#ê)ªh(ñüÕò”ŠŠHo€Ÿ¨0€OHT ((, �üw]0ì¯:þñUGØ!’–{7§¿Köü‹œ-à¿ci#ï˜ pþCt QÛ»—àÿ3Ýÿpùÿcùï(ÿW¢ÿoEªpøzÎ? þ?z°3 îó—Ås=Üï¶@ y· ˆÿ55þ¹ºŠH8äuêîà»]P@ØÃÿ3F˜›*Ì Ñ…¹Û:üI—?åF¿ C@u‘n°ßW €OP@àtwÛeëtw}¸Ýqòônyþ;¥  ù½eB¢b�0 öÁ¸£’¨(ÀOðn!Pï?X �ò#îw.€»æ�vHÞï�Õ‹þ@wÈà$�þIŠ€à$�hûô»r ä_P�„þ €vÿ‚wqþE@Ø¿ �ÿ¼Käü¼K„ø¼K„ü¼‹Œú¼‹ìö/(�ºÿ Þ5äñº åóü¯Ûz Pw×Ì+p7ý¿ñwê µÅ›ŸAÚJ‡;¾o½¨R óâÛ•ýľiò†‹ÏoÕæñ“'‰«2#tu¦4ÐM²¸¡ÂyúhéÆo·©çYs¢^Ë•ÿµu‚þÄf ÞÜ8eßXþ®BM/Ã}z>ÃG[þ7®þÆ!N˜Mè ölW "Ý\² ¯5ïšÞ’ÏÑ3›z[•bø×%“|/b,B §ØslÞNS³`»ó1àr“zOž}"Í»e%ðà|)\àg¶*{9í»Tf(äÖIÃFcFÍ€yJ:<ñÐOñk2ˆjÖ¯è](2úƒÕLƒ\1ØU¤š¹c^¦dhlmˆú›uˆR ñÆDdœ­Þ:»âÀ7¸AV;5ivxáä už›^ûö ¥otùT*L¾ÏÉ}OWèYê‡WpÆðSNyìö¯Ï¾&ÏŠÍÑäöõJNrÔ¾º z”0'd“ãnÞåö&ÜkÇ¿ø06¦†ÀÍ4?1|²'g8ŽF?À t`Î’Æ~º—iÒßWAzë$‡NWürCÃq¸zÔáKtûA;s×6L~ÁJfëòÆê¬«á¦Gø¤Ä:›æ(êBÜÒ¸zÁ*d[eþz·÷­¢ ©üp™z(2ü½xeœŸ•ËAÛøÌþ¤ð\—Aj´v¢xò9þ7H¥"ä•ÿ„zÉø~Äc+¯çZÄ¥cPVeåÁ·¥Â&‰yQüÃãÇ ~J±ÙŠ)™7†4ZßYêäÂQÔœ4eÚ¡)2“ ÖÃXÓåÌ»ÎrêxÞýòª¼ý±w]ËÿåÃøºÅš‰6¿R§ñ¤ÅöÖ}v[w£ð"¬)ù#¸5‰[W±V¤nÃy ~{¬OÑÚL‡ÍꃑO%=\bûÎt×ûã«´=P3\š²űӡ“ýÊ£ó9Í]ºSÑV…Ô LXSx_øŠF}¸G>3 —mžm<.ð¢ óÝԓ˜Àia"šYá=AaëÝ\B™çIRBË™J*c&óBl.MTãóTZ ú'ßëjm9è\A¨'e‰/¤f+ÉlsÑ) ‹sÄÕ§Cn°f6³Mn›Òõ- ë2${°ÌÌÒœým©áϪãCBÕ-œ#µÑ"©¯w6÷βi,hnì4 ÒQ÷æfî%µ†èôÜâ.,ìŦ—w£cJ£‡sr,l1…¤tÙU‡^ lMR”ß|¼¡)’@ü©ßÇiA\Þ+—ÚÛzC–TÿgW$±•AŠa„Ë¢Þú¤qz@C #Çû8°Âª´ÝH®2ðér ×=Iªdµ,>rëpž±©gØ)B­ñÎi°­ËÑ·‚h¨ê¤âï'½rf¥ûÃËòc±#ëºfèÎ_ã±Y¡Êº'iEÏÅšé^_J¾ó”uPé´6åìó‰Ô¾xƒÃ)I[¸M‘É]6)Áj%cŽ;$0UJÇ®RaÅ–¶7XÌMYšæS7'3ÖV¤_Ïù§†é¤žÐ×ñÉÑ» ˆŸ%5j6_Õ~œ3Ëü¨Xó~zyZö‚´’*˜?" ù °gæ%ÿˆ×¶ð2‡Ho”çGRØØО¤÷>³«VQW¿N(ŽÆ,Í„îãʳ¶UúƒpT›¤°‹…}Ëó܈Ÿ^È3cÐ%ᩲ›áÑq1µ~îM6Ó7c“qÈVZözÓÆôãJDWìµ—ƒMGÐãKa˜J@xh9qówßó$}Š 6†Oטæ*Ù"~d=.¾ú@“ËoD|÷[BŠÀÖêX[u‰Î‰%P»#ŽÖÆàms×ô†B\þ·3JôF¹ç ßÛ–l~æU˜¸ïÅÇÂ#Rö\ 7Ù”ÿF–µúHƒÛ£U%ªÒýžõ�¨íõG|†Ñ¼gyÇf¸Ãb‡gÉñï£ãzä¼µ÷Šs—]6âÜ0ß½mRÓ ž×)p;Îú„|yòi7»è-m'ÚHúÄcáŒ7ÊD¢¹£ìv¢!‹q‘dÁÖ&�æþùvËÑ—È% @´ßÑQ|¾¶çS.Æn~åHzzáœù­$ ¶$ò¼¯÷S[¼ÂAïÓ’'—Ü>¼U¦jYý¤•XÐmHX0%’¿ûu—RëgQ2å4Zú¬ªWPÿT”#Öò(¨Ö¬Sw„Ñ¥=vv¶þªR¾_7>@<ª™ÈÁ‡I׋7fKñ $zñ\X- Àf›#m!'ÑÉÚo%‡7™=Ñ͗Þx/x9xQõ¢ÝKKÇ0¾RÙ ôfH®¹ögW˜Îý«6Ãåö†¡ cš„ m·•ÉØ«#â vvۇ˜£Ïlô³¼kÇrY[Ïh‘ß4RX¿«$š"Î4– *’ˆs€ª9ëZ>¦O•Û êª/ůóóõ¦ÐTÙ³Štkñ÷[|m„*ªM‚—µxœ5›ú>Úñ²,…óz*¥¯Î’Åsâ]å²CH¾m}öà[«ˆdzb=ý#Äú­˜‚À·n‡Nr}Uɪ,ÿxÎ܇oÙV"⃤†N:hÏoOã´n;·qвæè¾³Ç«bP‡ß.ß`í'»ºÁHð( Š¶Ém&®¨uÔ,²ëž[[<µYÛ˜f;CɶsÈÇßÑžKÆÊ¤#ÉHvvçÅ+ø³E‹7¨ë7ôÕ©5’`jcf²‡ Þí· wË\ß8%É&G~ᘠ¶F¾¬l]zl~P‘öEŒÙlàùh2ö­Þk{Ò‡õ’v‹Ñ=tIÂî6¸˜n ½ŒºødÉ{°€'µyjΗŸ [\ô‹ÈÞÜPËšÉÄ}ô^ª/^ö³× ¼%ñu¾]­yÒø…]Ë èAkÎbûnÁ°:ºÌÓ¦ýX>ùýSKi¾ã]Jlµ�6F°?Áù’`¶ÞɃãÀ+ä¦2Å'MuçMø²Ë‡Z!Fò¦Äž�uîåZ*E¥19ù4ët¬V‘Òk©õ¤j•ílcËpÁúIãÃKÞ0–gHUˆM<˜¶ù;ÍípÖ²ˆšÕp™Ó+N¿í#R‹x¸©u¿–-ù  †9Ú¤!ÛiyŠê¬ëa‡s7ÒÑÜ ?û¬ëÜÒ3û ÞS½ýÊÀ v/ò¡Wÿ˜Fýjb¯=R¦¹¶')È*XŽ~˜«0÷¹¨_8KÙ©ßáéK‹,”Dnå‡ô9¬Iκ}?Š©j=‘jëtª>}Á„xšûÓs–bšK(-ésê«/l¬{„b—~¿p¯K·×+ê-T=O¾›0àwÃ÷ñؽ±Ìík§Hö"Å H•ð§(Y^½²r‚+½?ð!n^d§ÿÅÄ5ÎŽ¨7™VÍТ‘k‘¤ú” Om›¹¶í/0ÁÔs#BØÞe) ¦s{‡•ôZ^•l's0Á²ÐÑÝEÌғѦ,7£BŒ?¡%,è\%†Wœ¶rÙ£Á~5á±óa€Œú²Ííª Mŧ€ü´¶Ï(£Cpî=ç=w?ÐÊÛ¡¿ïûURjc¸fÍñ—3Êó4]÷$–•PîU6®M°÷QˆõyË»!Í=Yø>¥‘%‰aU'c¢Äú€~v»zJ?J!ƒ¸ý³gs¨šoÌ•˜"-7Yñ§-1vºyȆ½à­OzF®IÃñÀq 3LŠŸºXq¡Ø ]Ê@N¹@Éõ‡ –=»Ö­nYpðڹڞ™ŠnÓÉ:`jO†‚µIæÞ³¿ÄZŸñÄ\´÷”ß«y|–@¹Ëüë¸Nûä¦Ë1w]G„¡¨|¾Ýfév3¿é%º{Žê‘ÏÑVÍæé‡~Ç^zæ74_Ûêa¡‡ºÿée8ÏíŒ@q ¾>z<„Ê�ç°¼´[¬ÂÈëT‡Eeö*ˆaüðhWV5îƒLS6ñ„9K„·�9ÚƒüÔS3?¿Ð—N–™øÃ© ö$†>rԛݯí±³ÛC[‚âm6¾j˜L•îeûF¡ŸåFj¿Ì=ãUŒC÷a÷·1àrõ×Ûåk¶y‘X<@¸böD 9¦oÄ9ßV6~»6V† ™‰m *nœì[DUŒ|P·1/$Ý‚Mú]™;½¡~';¹–D—ò÷ ÆqÍ,·'~Qʵ¬"øaÊ~àb Gé6D d0‹cdDC… ™Ã%q“�ü‰ñlÑZéºà „ˆèzð¬¢B´(ÂÒñNÆ|g ,�K/‘Í‚ÿ‘Í×÷æB‹ý.‡7·üN¬kè_Ü‘þ¶Õ¼“óôÍ¢JÙFD|ÆÃZ f~÷o\eñ$v‡§ÓSÇâIرð Dš–צ©L¾ÿ�aÇENãá²µkË ”ÿÐx«ØrάÈã˪‚)'Ô@õp4•Øç“©ižåQ•6¼ÝæiÞ%¡!ký$O"5¼YEÑkR5trüd’zZ  ®hÊc½õ¦]ŸUí‹‚q»å åea{-óýàuî¬Ï¾'6_¨ªBßTÑí–¢žLì½{¯ý¢*«žýx‚Æí¨ŸÖÈô¡ÃÈs±ø9öí㟫S&£BÕV ÔñèD¾j•{×�˜vöähéÍ]›µÁ-˼Ü¿ýÓ3ZE1µm¼›þ]Å$Æë~ˆé~|ùil“©J�ZuÆ^DÄÔ„´Åúk®WL&vƒ C…‡¼R•©‰§žJ½6Ãüµ´®ÍN¹¬‡må5J½ýÁ/ý¡JyŒT®“,€8êÝ4zÅ¢êuÿ‚$¼¬Àé…ôJ;b˜“w n߷˹®€ÿIøç|M óžž~_APêåqõ®[òBÔµYáfY ÿ=Ë_]–T¹2Ìõ\Àþévæ)Jà‹‘ÂŸCÍWžùöõØ…aOn [’y¿B&žYwˆ!_¾Ù«œšëüÚD«Ò-¦6mN2IFdW[èó(XÜÔ<›€$ç„Ô„C¬¤Pt¥v à³*1Ä2×®dnßÓÒ¨ÁWh0“:˦iï"LH@W¨êå,KEÄP&6è:àPŽn-x6ݤåÁjÐ%J©jÅ,­Î_ªh-K ó ŽàNÓ—éZ9Z¯g9âÇÜ M½À}X~9_gxÿ5š&¶dZ ,x´ œü9ÙÂY‹w‹×9øé%YâÐ8ֿŰž‡h›dÇ×”Yò~³îáÖfý¡gK%1ޏdK6·~Ú]ÞüË+2ÊȼK ²½·«×žúkÙ®6 g¼ÎKji‰uˆè¡åW­fétÓëu+­îIŸ+5HÓ©&}¡ó{vFe—ÕÞ´ „K%£f ‰2¿Û ÄDM¬â½ ŽM)9Ž©–†ZÁ{Öž}ñ‰mái>% I‚ ‚pT!t´ˆ 5{7.çeã}ܺKÆ|ÞmtNêìè£KQYmt? $W¢ò´ÄŽÖš>ä±;Ÿ;wÈìmg®5R_Õ4l|GúSÈ'”Ï— §dª’¿æÞsK› O”tÛšhÔIõz³o\<]ó7/uMÎ$­ã»ÂY®œ<: BøE'1ᩳ'\»é–äWQn„ÉÑ¢oî¡siÚÀCÒ´¬ÌáÁ#¯">€¿P¶ßcÂÎë �n}6¥Âðº„o�Y£*°ð9_×xºo%õZ+8—|o²WXV6ññYjGô“ÏÔÇšHºØ°tÖÌ~xSV»‡–};©1¢• Ã’ÞóÍÀPK°[¿¤YŠöJirM°'ù(r0~F0—òlü£<_î&ÑWá•5fƒÉ}>vo™²É9ꧤ ÜAs3MÀÈ”,û0ùd†Ñ¿‘æJ ¾´ÊÙ ¬6NE82õQL?ùqè.–z –N£Û þA2æˆ|DÓ(9ígº“ß­&‡ïšGø2¥.Hãˆ#™R´.g§ &–lÑÏwM‹Å»�ºá"4�ô™Ù.– å÷çr ÅÉìU#¯K/CnpH×ûÃFÜ7¤»‰R;†Î,çJøÞƒñûFf|œ“}%<ÑG9ΓPdœ™š¼bÛnÞ+»×ªú" ßãù‘Ÿ½HÈöñÂÛÉ_ó3–s5ë꽬:ØÔÃKzâÖêmµ¸‰¸xQÈWi–Žqm_øüq¦Š9NïmT™4M\L|ÕóO‹Y1ú˶ÙNtžKõ )¿ðI3í±ß=x—Z!õ¢Úh_u]Q]B7¡n$3Ø‹ ýR½–þüYÔ±ö]›Ã�¸V<Î÷94¶­ÜƒÆu7_h14ï^O›$çî:ŒRîA¾Ô_$-¦çÇ4´Ê’é¡}î(}2ó`¡åÐËû ±2A¯˜™l~ˆcŠû¤×ïWÝÖ3E‘d‹Ôjß ü­§Œi‚É7²"£Ò¡s§´´ÌAå™uÈñ¨CŸ4S¢=ª=ß­d"©V†^¹ýžæ»Õœtþ@]¶¿T&ÑÛˆÃñpc¶—¢5O02Î'6ÒÉú Jàx†­chgõ£±pT™Y]Z´ºí˦¯ò 87RÞÒ€…vB§:˜fYp»dîBßà°‘—¥Øº™äxÁ¨©ÖpG0EúƒÞ }ÜÁ/E'MOž½Cæ™Ë @Œ’:ë·»ÞþßcF§ìÙA²]Ë‚r£a|+ŠØG#Äèº6OÞÖÈ«†v|‹°^$ãQÞa’Öá 9÷ v»zÛÊ8úÚµ¨õGsê ê ßã%ü%¿Ï¼¡\¾£ùÕ "¼<ôƒÚ’k§Ó8"°9Ò]ö¨M¢“Tòš„".¯„Q[2™ü Ï çRc÷o‰a7xSz^ø™P€HÝûOGªøMz*#«<–ìî{o„¼÷[_<}Û¡¡µnXZ‰©¥;ÄÍU<£Ìª˜Ý™oi·­ØÅhiNãÞfüëâ�~íëÍËíÈFÒýŠáÚÞ*Ø÷R˜úóÈeþ¬O* {9UCïåWš›Õ˜ë7ùUDbСBdY:ê¥Ôù¥ºÍ’ç³WKGÛãOŠÄ#Oi‘Jp†ª¿ýE'Š<öN9ó캖šÛ²€©+_7„Í6Û‘'ç¶òï»yà½eTÄ G¨ßfÀ'8¾»’3” É4ÐJάF-ð’!ÔÜô¯Å„GN„N@ª;‚ÄFóçf¨×»¹ ÈN»/cO{KjêœUÑ5ðë(yNè0Bˆ? ù$L¼ù;üñLÝh_uáS`g†À{' ^`üZ,»‡‰ŽÏ &´Ú,>©€üzhädzÅìã #¯2%j Ä;ÔƒG© Åcöæ¶èt¬ðŒA°SÏÕ6#éÖJ)ºðeÅÖõvȬŠf5W’4óªÏ×0RêÖB½¢¢)±C_·—xÅ”ûT:þê±p©Ñ|G6僤?)ºÒpžlUµ=ð¢ø|1ª¶ø)¤8ò¶Dõ¹…ÜàV½mM­¥¾zŒdxA¯‰ÿäü¢nl¹#ØØ£^Hcn´žÑÝä„ïšì¬_F2úä-7^�µÃJÃó%bô4óßž©D2ü°‰ã:ŸÅŸ^‹ìÒÓ3Ms7“>ìæ#PàC¡Íþw\ü´Ècó£þ¼"e~þœÝ‰÷ÞÍ鋉ªƒí &clõÊJ¼K|ÍŒ…9ì `ÛrdÃ|éªçÇ«sž°Ê¹k%.Ù„AŠ{rvzüU§Øœ§–ئ`€ýÔ–l%ûUMOŠoØlUÕ'˜ ÉþÁ4ûQ¬¯â}©©n/�µà½¡˜r“ôî3ê¥Sc̗ܳZ‰Í-׋ì+ù£÷ù©,"µ w4ú Í÷Ö}®üàs¼ûö•ºvw÷ó8ü5bŒä$ÓƒHvœÐÚ"ŽÜ[ði4'޸ꡯ‰!ÏòŠÞ­›È›Bé€E¡¾í²Ž©`®ïû‚ƒ²TD3RŽÍÅ“ŠÔÈ/?£s$žöáãñ ,ö‰Xcñ$dÊÖÍ­ZöŒT`±×)‹S,öMìÐæ°!ä••~U¶$%k^Ál=Hq |GYªè¾­É g¡ puê‘Ã1d{°Ñ1ØyI i#ÛáΞ>k²Ër¾_¾¾æÌqç Þòº§©ýX+3ý«W¥†úçðYù»_É ¥WÙïkÅL˜ñ˜Kc^Ìê´>gÒÚ‰•Û]w®&ºªŠ(R”<Šø5³³¬Ü;ð¡LÝIë‚i>SQs„ñ½`qø×Oìù ŠóÚí9óÝUçw¯«Hfg’uƒ÷Ù2rÓlŒRTŒb*·ëN9µjšv9{©¿¦ÃÂì›èyÒ”¢úÊ ×x²«osZ½„XÑÇZñýî?5bšäª &îpœ€QZOC™‚ÎèÀPšÖô#"IO¥yç§¥&ï—Ñ–:‘ò Ú-)œUg”:6gš©…lŒ~‚Acy!§•¡~OX¿Ó–GáƒÍu³³—úñȘu÷Ãò )w½LCùjX–ÊÏr”ȃ­4ŸSþ`‰{—hhOø…m ŽP¸e£OBíÒþñpi ¤°, µ«‹V¹-nÖ(³öFÒm™.ÛÓOOˆOúzÊÔ¯Qg˜æ³%y­tﻊgUU.yŸo:¶ú¯.WóÇï4Sƒ½Xó£óíK4°ñ?“sq_¬~l6”^Âý¦«wEBb+X÷eÑãòW«gÅëËëJ©Æ\P[éa HƒcÈ×PZ¸üªE­QivlËÍÅàÖÉ^øíòSW’ûîÍvò.×p~:&­£ëžÛ"¼§|>ÎbçšÇkf:K?v<¢f»ÂRªyÚÄÏ¿}’“6íZÍÛá¢F)|·;’ÝÁô—Öx¥9wŽ-$ìLdFð…93_…õÇÐuX(žÄó5nx©@ù¬dñ2™Añ\˹^&úU  Dtç�ý9â\…Þšm˜¨ï]¸è wï÷ÀöZȽ/R'Ë4›ùJŸÂºÛ$+ ´Èß¾6 ì B6xJITçÈ=ÈR§¡b¨rî5]‡»z¯Á#?æ„Îzi7¦îù~ÑxE aéü”ßj!5Ò†÷½†Ãé*o·×ùmˆÄû¸„f#fo‘à-3¾'š¯,%­ ŽÓY–ý'C=ÈöXЮГDýýµ�?"õewÍpl)]ûÍÒ9©†¯—ÖvÓã¹æa¾¼ÕĨçŸT-Wˆ4ÊbN-L_æÒ®ž\i�žW¾xLàoµ#ºj¦÷y! š(\ÌA}8óÞQG7³`²À²?ÇøÚ0ÅÃ^ªÓ{R{¾Œ•Ò%`Ä LA6k²:s˜êwAoƒráTˆ»ÆÃ¦ñ)1+hmA Ãt«ª£Ô z9¡È'“ñk¹1¬Ín+D³™ù:Ž«æŸú¬9ø109Žç#+úx'?µÏü0:¶ endstream endobj 59 0 obj << /Length1 2235 /Length2 18550 /Length3 0 /Length 19878 /Filter /FlateDecode >> stream xÚŒ¶P\ݶ-Œ;„àNãî®ÁÝݽ±à4îœ ÁÝ]\‚[ðàî®ÁG¾sîIÎýÿª÷ª«º÷˜2Öšc͹zS(©2›Ù›�%ìí@ ,ŒÌ¼�Qyf�33#33+…šÈøo3…ÐÉÙÊÞŽ÷¯�Q' 1èÍ&f z‹“··ȸØ�XØ�,œ¼,\¼ÌÌ�Vffžÿ ´w∻Z™ä2öv@g Q{'+ KÐÛ2ÿó 6¥°ððpÑÿ“¶:Y™ÛäA–@Û·Mm�ªö¦V@ÇQPó[‚@¼LLnnnŒÆ¶ÎŒöN‚4ô�7+%@è trš~ P0¶þ«2F €š¥•ó¿ìªöæ 7c' àÍ`ce ´s~Ëp±3:Þ¨JË€vÿ –ûW�=àßÚ�XYþC÷ïìßDVvÿ$›šÚÛ:ÛyXÙY�Ì­l€�E 9F;ˆ`lgö;ÐØÆÙþ-ßØÕØÊÆØä-àŸ$„•Æoþ»œ¿¤eySÊùOy¿Ðõ/)9ÞÂßnÐÿlêM�gcgË¿(Þöùg·«‰ déü«}ÞŠ¹Ùÿ•ðÆáò|Óßõ/ø&¡Û_½ó–íþ|£÷øþ×øšº8½éúç‚}›íÿÁÿü]î@S„…Y{S¾`ë¯Ámw5Âøn ;cS;š)4 ^ Ní.(°_hª3לn„¿ u£.o‰S_ -?{5×Á~jIPn}ô~2ŒS™ÜiE˜ŸÀê/8þÖGOÀ &´ëýìè­ð²¼C†"ÇÑ…E)ýέWÒý[_ÙÒHèìŽòn5§,âSÙO†hõ(½€âiŠ\“ÌR!-Ú¹û»éë›)´ìñWb™8:Ÿãh¶B/uÖ˜ûÏ• 5VçN\r\BÈk´‘IJ/‘ý$ì9¯’Âåþy÷fþBâldúäeTÆ}Öôj+•H»ÆžZב…ï,Û9_�ÁTøýèÛ µ¥†N¤Š˜Õ­†‘è Z¶@Âýïæ"+m7]æÖɋލTH›8J’¹-ÿ´Ë5ꨈóˆ¦Uu7áºE‚Úôé~àÚñà”l;3†àر  ”*cU®ãu6!ËzÓ3Sè8¶I ÊYïë*Æ5H¹€^§68ùšØ‡0õCø‰Ý'Î/Ù?Ý%s•íÊñÓ"p·­ª)f³Hæ&äXÁ°ku³ÒÞ_múÑD™‡h™Û⟡Âü›ôK]‰M<—$˜·ö=Õûõ— a™wՌР½_EeÆÀd@e`”=^\0Ÿ9kÈ4&z&:ff¥fð.#™J HÌY¸‘Jp$ƺýR #÷®~ °WæÛKFDœ4òmàÏ$ba.õ†K}åo=°=«k¼ŸÏX²<_Í ^«<ð‡«¯¯©Iÿ0„kôá’+é Ñp$Z÷Ë÷Knw%~v–ÂKÐøØâ;d>ÎÔæ&'Y–¶Ç4uQ0h«4¬:)På×É)Ÿ¢Ù_S" ½5Ç3½––]vEvWÝtÃ[é–¼š³oÕO˜ý»¦‘xÌk„åò2÷òÙÚÌ#±®^œk8‰³zw=�§lÇ¡4R6\[ÈÄLµŸÚ²ŒË²8‡C4]ôØ’?d½ŒÃDuD$³Úˆ=–¨Q"d©B{X™§4’«8¥•ÈÉm*š°×u;qަ£C‘wxp¸²#s”¬‰&ÕžŸneFpSé]ì}å+X{qMsÒ¦µÒ!÷u#—O¾òtŒ•¬}èÍ—MÄ2¥Á¿ÝÐ;·ÈUR~(ÝŠï½z´ƒQ;rkOØm#Ï1SÐmJ/[T¼™*Ôdu'Þçv$‘3ûYµ…oä»Í¢Á5(" T{õpBÂߥkïyO~r?q;àOÑ[Ù19„é¶±ºÁªo_Ö³¨2|þ m9üÎe?WÄöT›·žn>É ®tЃó6°sq@(\Œ#gÇ¡záFYÊp4US%éyWÂsˆ#0H¿M=òÜ&ýd©ðP7ëµ­ˆ@Ia”s5±Å„¶ª/ê¤$•?>´íjÔœ ­Ä)¨´]6¡`^H¦}0J;‚íÍMXK`2¿îÉ´i§PgÍå%Ò¦Q‘cÚå/Ã:å@/ÍÎ_»Í´á«òîD¤&k™×‚¶“€‰'…‹K æöR™·ßÕ«†M½m¨ya"üâ'ëm/hˆ>;•¬ù~í… ®Ùc[~ÿ•Ó¿<§Ö ýÖ”E '¤Èr”Ë” &ñ‹8±Íƒˆ,uËô¼üÜ„dŸÎóŠ.¤mÅk‹çx”„ <šMÙ}9i·Œ`j^C$VS„ÀgOƒæ3Ô²êà’.}îYÀjñ™ VVa{«Dô�dY»R&ã~»Ô¤¿ûTŽ¡î˜–FØ{ìË+åœjd5¥×k× œ{àúx‡—E¼ '?Ë„‡¦¬_Ÿƒ£Œèl¼ðànÊ·³Ÿ …̱9Ùð¤Ö”Œ]'=qÕG1 k²G1úuÊYˆh˶¢ÑªcåéLüCù¼VÊFà*•Ù°ö54øæsÛFæPѪ³Ö­èÛ¸¹Ëg‰‚Ž{BC,²ôÖ…H%Öd%îÔrMSâ¾kÄØPÛXTue.šü¬Œ^!iÚ/›IšÖÛx¾7fWfÁ®ñ”ól:j6â >žä9›Å¤Û¡xÆuÁÁVæïðÎÈeyâêǼ?/sBŒ(Ì+ rUû)/ÉÅC.-gõB™ VB±þ‚_~çHi´@1FXç‡kh‚ßêO›<ʽú;í¹:ª…10Íʼn ÊÎ<æ�YÀ .f“¼ÕÂOx“,¼nQî^Oa©Â™l6pÆ Ý÷æÍ‹°KeY&’ƒð8£.{¾ê<«‰[")�TZpª�Äñ$ùº‚ØGšJBä»]ÎGÇå WàæŽ‹¦½)‰`°Â!^5º¼Ÿ€‰Fm¸Üœ$Y»q~àOM$ŒdÓˆ>yÊb´ÌíÂxéBwºµ@úp)ÈwNïç9T7I`ßZ½–ã9Èœâø~vM“EÂ}ütz?y `ñb]ï®áq]¿ø~2“TŸÌÓ'¹ØÁõ¢ 9“04.õf¾¯„ÑI„'œÓ®I[´R”å¡Tf&Dv[ 6ñQáÓt¤l xÎ_~çát‚M€Ä5 â|”ÂeD8ßúF¡ÙKE÷ã x|%êÓm[Qî—­>ô`ô2HçÎ"þzÉXdQq£ƒ<Ëõö¡^ Lå„1‰B{¥öÞÍÉ÷A~äeŸÛI'ÙØÚn•xæxŽu¢y>SmU!;-jÞó*$:O]$6 Á˜!ej®„P²²»¡•Úx"î’O³jž¡u[ é?Vä1yÍß!U,ÊFÿ1ªÙC+¦¿ÂTdäQ¥\ 6”¨§ü¥_‚¶lÙJ ëWô¾àÆÌ0_Þ(¨ T•Bí›B‹,Wl5Jêì±®SaúÓ öuú‰¶#Ч­vž�©0òv^û“ÒØ¸ºxÞñåKÔù”lPçÌ;©(ª¯õ‚à:ÊBcï¤ÖAùÛ¯Iº%4\½”ߟr,Çì2‘jq´©¦—Œ»Ôz~Qi9ùM¯¥2ÙÚ}”‘ËÅB„£NBøº—3<‘†PY¯@è%+Q¿¶tnð1ÝdµÛîÐëÄH®:_nɸ@=¼¹Ïë) ÍuóLnm¹e7=áŠ%…ÜÝÉVøõÔù Fwÿå…Î$mj«@éíçësût !¯8YD8QQâH/lS8FM?†ã3¢]fl;Äu‡ g¥3r†I½›ê±étJ9~‡(´¦w6èHÞ;éuÜûŒC½I tæcž%®AĆ_E<«~|ʽbýà:ÝqxÙv=÷©G Ü8Ÿ„w¦À!iéŽ…Û ,Ü׎¼¶‡ª¾ï¯lˆÔÊ{{‘ÙƒŠxâ¤LWæûýƉÄ@¤•µ‡ÓRñ5cݰ@ó;%wv©LïCXͧ:¾%I¢Y TmtR6‘+Ž…Ë§Ý» )=Ò©r]˜;–¤±ÔS…;ž2AV.™V‘çËzg&ÈÓˆ ê«RwLez nÕ&÷h‚¤s_S�/± 9>'e؃­GU=n„ëÐu÷fI¤\¯Šˆ¡Šˆ±MÇ‘û7Ü9íLÞ¯òÅÕPk»§Kg°è1­•ïêñýJ™¬ BÖûrI|VOÄ(5 ü˶g•µšÉa¤ÖŠ÷Þ€¤ *Ûàýg´ ~ ÍÛa–;%¡^Û-tÃ!W|Ú +@3È!Û%E&€6\Å20 Y²Àˆ¯÷ÍÂêå‹6"ª™8)‘ù´zÎ ìmèZ&®ŽkBLÜ·éPvˆ Å+Ïó›¢é mȼ¯/¼`ŠæƒUÅ¥B2h¾æÝAÉÔZ b¸— §f–üÁ7Ö‚¹¤ìS:øQªù< •/‹ÿ³#¾Ýü¶K�ÈFN”%A«À1Š—Œà7×ëø³0àÃvä„'‹¨*]'A¾K/pB•u‘­\&I~ñGðê_SõäpD-À!å&[Y.pÍg`„7MÏÒüªq„TRåºNóT5»K´ºOG_ï^ÏU †:`’d8IûËñ!Ø=É4¸4Ü´öNÉT6®,ži¡xuÓ1Ñcº€Èˆ´>¾¿* Ë-€ìrªå½%ʈ®r¨œe™6ÃN ¯ªÓ‹‡1@^I[²tf‚ˆ*š@ªt[ +2DˆÃ?~em’á.#N1³'¨qHLÊúSê–3¦f ûrÂ.c·àâÄluuîøÇäªE›^>ʤj2þ½Å´š àgóÉm Ït£ÆÆy[Ò¦`BªR”Iü¯Ðmñ§P@W;0nô€L‰@½-Ú2¶¾KãJa¶-Þ_StY¦$ùîçÐI&ãò/³áLæ>lkIéGÃE[¤’¥Iï+÷¨Ìå'a§‰µ4ÕŸ}žnê›´{ë£ ý§ç(¬GH¤¾ŸE*J½Â ÆÞ7Dòíú:vá·)Óäš‹ò5@™ |¶ìÝ•¨å‡�ŽTþ`UœgÂÖ“áš®_B •8™ðiÆuþ ©Â~¦¡6öšàuòÔ±0N`ÅdKFsvÚ^ÖKFlÞ6®„UF-TÒ69Ï~ëµ$;uO¹×SJÝ?޽ó`Ä«SÎÆŒ÷ æ-?Be6ž¦o9Ü= Ur»x,“;]$­\~qA0÷1uì¡ãèòð%y^ÑŸÉ|À¿ë}~îïvÏ4 aSwì>9Ǥ0ÛÑ¢x¡TÛ|Ð)õ¼Œüò-R°iû„ØAn’r0ÿòLÖH`TWBÑm””wºÒ1ä\ö¡Åu¸µß@ï)œ6söYùÇF‰‚‰yÝRÛ÷Õà,{Røè…buø6ÏÉK‹C‹Qãí˜Ï.u9“©ü=èZ+Me´mƒ7¯ì´Xõ»?³—H¥æ¥Ï]¤tM8Êí¿f¤¨Ÿ\ú"ÝÆÇOp Óô\¦JÙ}΂h)©æ"=ð Uágb=Ë÷ \Ý;ïù?~ä‘ÖºŠ7Ï/͘„Ü|~¤C_(Ò?.NBd<Ü éœè!¥•YRåBé\Ô&ª†#؇>³^B&¤ü¹ ¼/ƒDW¾ÖÑÜ ‡¶ˆ&p¤»CÎéúUOMû}8ÙN•\ò+ûXñéÞ‡t°qª›ãÛž{? l3 I¹Yzº=,gÌ É—‚u¦¦RǺ¨¡p˨¾w÷÷:DžÁb¥ !$¶[ ZZzö¾ü¼ 5 ¿¦¥Ñ¶|[˜àë\ÞЫïpýDCLfÆ;¹¥EëÏd±¨SÄ v¿Ú ðà>¢9Î3DJ~|¢’téT›ìÍÙXœZN#ŠÄíƒÞÞó­Át$!$"_*|§÷¡ @L¯7YÊešóU¹ïy"…*S™mЄϬ)†˜í’Xu„·ÌÚäýÉEH&–IðG®âëi¡“Æj@7®»~M3L› ÍæYvW½¾¿Mæ=$‡ýwTÝ½Ü >TzÊ*t«Ò½Zå.é ©éÑ« âÎj¼'BógØ{ ¯ˆ°ªZ]+̵ü4­–ëš³0íìæÍb–±KŒóßÔ h T¡'ˆBìÜ|žéÃtšÄ1'DÁ¯ªoµ£U õžÝÓ7çlm?õæA'//ÚF±Ø¾†éî]ÑAêYÞ‘TZñõŸ‚%…Þ©Ï¢rJ#ê§ï-ß>ñi>B ÎñÐJ3û`MÕë‘zÍc±©/zöÿrÙ–È0‡Y(¹VZ+ùA#þ9Œû]à“zaƃMÕ¹zÄ0¦ã4ﺙ5Yasõ2f˜%¬ã�baF›³=2C³P<‚,¤$Wìi¥·òÄ'ˆÝ²‡€Î…§³wH O~¯ÜL*zD!¯¿yÙŒm[q·0ÛYìì¹*"k¯�nܬî7³Æù„'™ ½åoXD•X¦Ç‹8þO÷ï¼a†Aß­Y&ûÓ…÷œ^"0«:'«^pGd\»ée‰½Áá/êBÆ¿h¬~þœò”®\§»¼Ê¯Þ¥ÅK�¸¸ôÁ”î†b½þD¡uYD•ƒ'ô.¨ëxtYiÏloÆ7‹}µƒ¶•m“RÍ>8˜%꯴ä€(7˜Š»}̈¨„­ §ÊmÏBþÂPJl§d>a3iQ|#¦°�k�8§§Þ°ÍÅ»‘çˆ Yv<ÚÑ�YܹÍBÕ¥ÈÑ*á2Iª ^¬Þåìo?GÄÏXç'¤”¸º°«‰N´·5‡¾J ¡‰ËÇÍé§ Š„of“£éÿb¥àWnÞÝôÝ…´4Ø Ú:9®ñË [ð2+rp› &³z°:$¶‡ãqJU÷²óöáTÕ¿P2Ü:Á ¯W´)«9(*¨èGÜ*Ú$O{r*çý!ÔÑí|qd»U>'íl®…h‡Æ«57‹ñÌ»nÉÊ!Ýš8œ5å÷ê€ ­‡¹MM*|ßo\¸–e[9�· Ñjΰ3g›"7U¬º�‘ĶRã.&3³­XFë¥:Á„‘±?6¼¢R肾ÔÞˆê®ûê=I7©&R¤­Åçg—©âF¼,A™AíÓ)½Ÿú¤ÌŽîÏS·_T)µ[hCƇÜ{7EªùÛÓJŠÄñ!lŒ.†B¥\Ø2†ËB«F5Cë>±~"Ñáó–2Ó¾óŠ&µ :Ë,ísË5âü½/qÿåý¦²»W=â„w‡»Ž?ñùÅnÞÕ¼-‚üÇ ‚2R·@æÍ™#³o\—„)-Œ ÅDZQèrŒ(·ŽV'øÐé,W^â[³(ý“-~ˆÌM¦i¥ÐkÌçÇï\Oyñ^‘wnÂÞ¥cØ™S'bä^ƒÑrPÌØßNv›,š£p¾CóŸj Â±˜wH,~\×€?–îª.usA²bL&oL ¨*K³€õó­ä ¹µè¾ŒÂE©é¢ŒhõÎÖp4~}¢¶‹/sÀ{ÏáŸh]ýœÀ"³.µT ¤å*ߺXØ’­Ü{¾Œ]žÈô¢\j°kÙVa`/·œ¤«íR†Ïªfϰá:îÔ£¶¼½ìŽî½²%NPN&N‰¡Òû›Ü›—Ù­oÝè€é­¶eÌB…Ú7ÁZ ¹š›á2µ2kcC¥Ù,Í4-Š¢cjÉ­ÎmuwŒE ÌQ~Yïöþ‘‚<èû¼lwð‘óÂ!ˆœ³ÿyä„ 3ÞSÜq]Š¡^§d†J\HÒŽ¯µ.ý5òÔ×àx8ýÓyoÊþ\s EÅ]9†±_²‚|ñî¡ëqÛ”¬z]öqæg—uL³ wßK£=>è`Fú6*@1ÀöXªýŽ×A‡-˜fU§â[í4õè°<ËàÎî’–ÃÏH=Hè!˦R%WÿŠ|w¥oÈøm+h½AÚá\¸åL<8êñôâ¤_fS¤×B#%xÏ.[«Ø¡ª… 9ÉI©«‹ðÎG‰¤•šàý. Ð'ÀQdøý¬Rm±$pMÒ/^ DÏpË;e—TÖ/šI,U,%f?M¢·‚%·ôWÊüü逡î!U£Qbîá_á@62ÎÎãLB·G€*kþH"& ðj|(¬29Ò¿ŒWóà´Øn¸;Qq7+Ï~$Õ§Ä»kñýqǽ„l…﹄WPU-O‘î–ƒ6ÀµM-¡ég^§•½‘9îÜǸòøÅ7×_79„f,ˆè¸:Ñ×b©LU~VMüËäáðç®®Ú3µ ¶Ú O²vÈ*cJrG…É#×Úê¤c|>\¹ý\é³8’0äÒÁìãã¤Ï–½ÙJžBVkeE1ô§›ŸÉ篺]•ÈìIâªê¦OPz3 1¼Û¸9¼È+Wø$Г\˜gÜ¢,EaÔ`’oÙ«ŸU%D„'T”q§î@P˜Ç#~Ý[³"ŸLÔ'T³s S „üì%+Ÿ€_å3¿–å›_4š±vÎCèÔˆà�>X _ôœå¼ÛÖÀ_¤°žtÏœlZÎ"›tÁ&y áÛ4ùg&}ôáçoòwn9Úôàu¥záúsbQHÝÚû¾ë™Ã0x”¯°üG0Aån_âlD©Þz3­¬Ë‡Q(J”‘ƒ<Þv[ ”2IÞ.pUEZ©ôEýËÓÉ}Ñ:TÛÏȃìn e#„!£0•zè0Ç`Ç3‘:c)c­oá7¢$Ñ(;!Vd÷ê+1±»Úæý2ÅŸ}¸|‡‰môHV;û~9ðZ-«ç¿ä gº2Œ-Æ]äãJ�?Ô•ÒÉD3 >¹žk 9må¯\Ì9páóG YS(t’¢§¥ä¸›€•¹ÜG¿LÀ»–k.ݰYÆÍlF©>ìòb½¤ô7 Ž÷ kàh;TUû·œõhö…y÷|}x®ëM¢›òáþ…¨ô ‹ïœ~¬Ñìòý5„tƒËz•©m™ß<à “µ¶¸aѫfž@)J}‰F. ±K˜6’î€G¯sëÕ™¼ xgþõ3KqöV®d_ôq¨ePn³' ~- 9¼î¾jù™ý„À!Sc'ê+ H¼©Ö©$_&˜ ¼1¾dçÒ `H~Çþ�æE‰ÑÁ\SÓNÎQÑUjËÄ8NK¼¿ÜöW‘´õÜY4Uìˆnqëéj›÷zl)s¤aç®i·§3º§9%h–;‚à×)BãmÙíhß–üÇvæX·á.‰ük¢ær7ƒˆiõŽ…ü9W k:"rã·½@™ ZòL±M‹•ˆ$g3o¯çtÇœ•£ÙÕöÇ–¸Ss…»uÙí©@P<•Ö±J¹‘\ÿEÛ®]H­”M³ÛNþu·íôq‚¾ÜèÝ™bê@=gÎóÏyôrQËwÏ{ˆ‚2±qkb<­ôHû_•3îÓ¸è½#ßSWÇ©¹F–X™žyˆA/1º±î½À b…ÑwëÊúïfÓvL kÐ –÷@ »)ÕXþŠv4kÓö¤VG¯ÖÒé¾Ç£RÑ.ž¡p¼ÎÑjÿ îè°[›C©ÂáožYïÖØûó7ÏÚTg¾àð÷öt¼¸é9E0Ý»¸›í;ØÞS°ír£ ‚Ìü êpV0‹Ri šó–)/Ÿò)%u÷ÃwÆÌžúØMa˜íÐéÒŸò’³ï|%“@™ñè¡yï§:¬†dFÛÙ3Ú÷9•KÎ\¢D7^Öwfô”{†DPt[·övkªéÑ¡> c5ÙÑâ°ÄQ®uîmßqùêZ­¶Ö¡T]ÊêÕ¦ ÂðnrJ8tƒ‡t «5§íèN'æÀcý¢ÔV b‰W1ŒÇ…б$üñ .î“BªÔ¡³>ÕîdžNüóÔ¦N DB¿ÜMÙoïJ3䢼¦Úw@ºÉŽô² מæBi>؉#µ™½NÐï\·j÷-9%LГŒÛ°Š~|Ó Iâ·=¡_­i¢ £¡zX}ißn�î›!²NLÀ©lèC\Ô ‡`çÀ…½# 'Â,O’Œ;áSCk$ËÐ…ÿò`öÕ¢ß>nÖ7,ñ~a î•É<,Ç66Ñë­4æ$t•1;ß;åϼÈéT ›7’ §ÌE¹ ½T_êÎçÔ½¦Øše j·\´™¶ç×j2¢yÅû¿ïè ú¶˜ØÇcõ‘’õ:´xûÔ “f ,tGÀ¡òhÊÊÏf¸©Øµ/;¼ÿÙiýuœë»'ï§wfŠQoÀ ½•Å?·tC¬éœƒ~®V½m‘ÌÊÅœà£ó5³Ñ1ü™–Ïåø%E×;îBGsÀö:Ùx­D¢N‹c9H•4ƒ82B"P„áO‡�Ôx—d;®ÞµwíJ,:uL$ÊØJNìt°ÂDóX,£=ôÙ©ü¡ßULìõ̦#ƒ>m=àÉšò7hÇ~p»öS•ü9ÀMÆ¥ :6Œ‹3âõ¦<ìÓg/iqåþaÁ;'YLtByÉ â¼_oóXƒWJk«[ý¯sÚ <™Ü‰ô@Wþ9ÁÚ³ë"RëÒ¶:%faPÄøÐldÕR©£ˆb\QS™Ë2½]œUô.ÂpÁð;þ¤lŽ#19O麜¡ÈXar†åUÅßP?„ØñH"ÅÇ(Ó!±×–ó{ùg4†Ê1ëÈô|ò•,âÔg•¼gÓÄÏàÝù ÓStÛYY›Á¢¢²: pSì6µìOÀŸÿè[3YÜ®Š#¦7À³¹ÜçIä*,U6mý¸ $—³ñ ^ó‡,ÕÏå"ªb=¼ÑÚýÉyÊÙ(pWòÁ8udNǨt1\ŇúK.‰é°«ƒµœel§¥¢7+ïcR¤ú{€mŸ;Â.º; ðúά ȼ”d®W#‹‹Pîù@JŽµÃ–Åg¦K—Y×;ïOà ,ˆõœ%Œ9ÓS)sÞ0l£,'¥5í¤•x²¬WÒùS³ËÑåœáê| Ÿ3€r÷y&·ìû¥ª µû>V? Ë|=B…ò # 6SÕæ Â6HÒhD/¢Qºvx±"*\±ÝvÍovÂ^‡Î˜$ Ecöyê¦ âá.šÐi„¬ÎýIÕýr†´2å9w¢²?ÖØTÚ•(=誻Ï÷l“ãÃÃݯ"[Us|˱ã;÷Q½°v@þh°X=—®laúÏ„ÁA_’äf{‹Mvœ!¾Ý¡ ›.†æÉ´í~6ë„77'ËÑýÌÂÔ¼í XÊm]OFC˜U’¥¡Ò3õ~¶÷¶s´Æ ÔàÛt¯U®ê$w¶TcáOØZÆàìøÔ˜& ƒ|Í®~±•[>& ýüŠ`ÛØeÌÝBL’[y¶7ÕÓ†ÜÔðH4°/ÙÉ=Sow†q³´º=I_„Ädm‹¥¨*êâûñîKî¥ewšƒJr]ÒŽèÜ©¯æÉ(C€Ë• CN´u‹£!D{OlÿUúQuj§vljbà_FÃUª¾O0è{ú±n¼MõšýéQ–t÷´j¢ajZ\D¹ŸíA7oà/èX¬Œ|Îâ…�°ŽÖT2Eg•µ&Ü­P…jŠ*›Û2œC?U)«ò!k‚Æ`X>32Öó¥Ðh g’ó‹ÝÔÕäù ÙZ_–Ø@?%­q•‘¸Å§LQβ¢Ó× •ØŒSÈ+¹{cRïð±üÐÉkÁ)™<3EÜ—™›/lÑåG¶Á9è#ŠÍïE/¾¡1møm\Ÿ _Îí‡Á XÊv$îñYj¶*¡ÍDõv[ZzÙ~p¸Óñšeëxr°b³I ­<ÞüªUŽä6ìGmûB_è]¯Ã¢R֝Г‘c¡exÀö~fïù~in|AbT�mjúi Yô…ÉZëiæGÚq¡›€ËiN*Ù%�êƒFñSRã<²ë;%$§t‚({vr»bÁsNÊ‚>ÜdC;B}ƒs­uˆÑ}ìåSâTÓz¹Û8ͶŒô™F½•6ƒñFŒä… ~Tœ$™"—Þ~Êîv¸ÏIêàvÚ¬¿Ä)ÏöI;UXæÝ’´X(­ZôAfБ˜9fšà&ÌKtد>"¹÷ÉÒã»û{56õ˜ÀCÀ¡ñæ¢o„¥³=8§îFÓ+2†"‡ÌÙ·þy´#3O M<ì™téô’6!A+Ž&9åíÞ9À&ËÓ¨S_¾¨O­â:ÿ÷+‘—ðÔ´-]]ü~At~7¨5ÈD íí‰<Åw—˱¥ÜQ¡3ƒBöåqÒJQ,/·T=ã kÁ¦LóØ#¸+eQKu¤ÈŠªW» ×Óù5†Øoþú°,Æú.,ö(L¸=M’œk’x»Ý‰é½¿˜‡Ôž¬ß?îæ˜a )ü裆kU•>?x4© µ.Ç"ë{ÿŽÉëÚZÖáÖàÖo¼Ê•cË#0ž?³U•Ûv§;‡¶I‹·]ñº¨~2ʪ«~µ_HVÜÑh¬³'; ѺOå çHÏÛÖÎìéØ Ä“š•Ž2ÄÖÆí\›¤¯2¿OàVÀ]3i±ƒíyŸ‡W†ƒ“žéa© é·«TÆ,Zbá¬G[9d²ØÿUœÏ4éÙ Fžu.nw+‚PcÄk¿ÔÞ¼RÖCp˜v .3¡>>.ü*ãË‘ücÝ©˜©œþKçÁêO¸;v»Í>SÚò\Ÿ¯6Éñî>I{¬³X ‹Þ:À—ÂuCOUq0#e-kÅÇZw7¼z©æÌÝÆxC–^Ž8©•ÜBðÞ!æ®þS5#N´åSï$nj$j F|%‚û—ÄŤ24—µ@’î­4µž„ÙÂûš]È â^°³)mmHZHŒ5Ý{Ø�…ÓÉæÒ¨-BÿÊö6¹ž¤ÍÛÞYšša&ÓšÇ%^«SC†‰è-}¼;ùÆH†ÈSá™\5拎ÄÍj5gÊ©Í,hná™P·!w¼òÉ-ôéøJ›D¬>°ñ-r,­òT)‘iS’ËM†Û¼“ŽÄ¾`x˜](B¶rK¢×>f©‚bÓ·ùic·É«adè3Ì}GÜÊlh°¹y½ öÑŽ ’è=y‰8-Qù§i›bˆdK©“g•~ÏQzÒPÈÖb]6µn6ù×a€@Ì–k>6¬"Ì~çLcµ|È3n Ô’#WÄâÐNݹ„>œeùÞ-Y¶â¼"–BæÝ„†ñÖ&ƒ˜JŸªñù¸¾+A ç«8h ‘Òîö‡¢á‡Qäqb»^¨®pîp¹ãÝ\>ˆïA² a­¯3 m e_7Csôi`iG}=¨ ÁY1Rx±ÀT¡u®GìýÅ=K¼¡“8#ð¤8ÕžÚV^hÎ2µ:[K6 z ÷c~,ˆŒóÊØàÃÆ`¯¦YL§\Š;2? Ø+Ý3±•%Y´"ü±Ú¾ ¬›Öê¸G~×ÊvÍòr‰´yA;浞Ë1´¸ »™\}KÑíb\ÑÑÑŽß}rËí—sÓp·0�ñ…]Ê*M”³Î\R›“ ¨ç½ ­¬‰Þ)&Îá‡X½ôA¯s%Q aQ§tŒ—ßH¶Rÿ#YiQõÙ/jÌWéç³Voe9¿~gŸaÖ½áסíÝÒÍBhì/Õº`º¿ª7üªùÊ&uf!ªzîÀØÛ&Ò×Çͯ3zŸó´{iî–fÈœä¸áY¿TE|ÛmJÏaúN»ô„´%èÔé× HåñÃÁ«•§EN²;2”ð*öN ZÞGT•d£{5xYäZ]§ûœžË’Ñ’SàR89V=Áì…)ŒŸ–¡íÃñäNiæcáÀ”µÛná qŒ’®û>ý”©ë+X+Ìoµö?´pq±ê–ÕÝ/5ÉF°¹h2*®ßTßB ¬4—ag‚ê ä$b\/FŽí4Í<$°åã)ÛëÃ…½Ç+G1šòÕ(?ƒ®·‹£¼2Ÿí)œÖüÙRÒ«¢êôZ½9|Ï>!Ñ_Ý|üF­¬aæn]P;XvÁÀ³`£¤G§›¦yVF|Ss< óº¥ À‘á‘§§PÈÆ¦”Üfúš¨£:~UeeW¢âÈ8Š'Z'î¶ÔXj€ÊØØbG[âM}è·¾îq/CË´q‡ðìŠqúL’Be3Xˠ͊ΖD>•ð§Mq]< 0•§Ôu÷†н÷ãnnãÓ¤#_Þ}AÔˆ£øëg¶;­ €µ§ÞŒ‰$'[_6>ž(©¹q3úüJ”å6‹ý4P;ѳÄUÀ)snh¢]K¢ˆÛ—ÂÜ·¢È”RžØá~ã>5k‹²%¢ÛôS"«òT\ÈæÜúŠèBßž.ææ¹Ÿjѽ1Ööɦ¡èªÄµ«ù¥B™£`Ij·öJ$�Û½ú‰:Ùz©Ôö"´#¤­ÕLǨÍßk’æ˜=4©óÁæ‘=*á±ÕR󆋜]{á O£apXU0q‹�eMÒÁ;köÓ`z ~Ë÷~Ô,6~Ô*ü\/³I噄+ǟ㶼T- ðÿ®†³¹¾ãâü¢$?ß”s˜“þ¯]‚ø-d<©Y)êèzèÅBÏXr7ʶ‹Ãþ§z-lW΃QU×£¾cÈ–[´™sG 3Š5|³hy!Kű ê½§K4ÚNoLW‡U(äYêþAþM6ç +à B¥Á ú¯)Sh‰ÖÌ”Ç;[ľ—†ê éF¾w2F::5P|sw§£$r——vÂJ½nbdûC¼=Óµ„ £Ë„͈ºš§º¨:ÅXL˜bù]<(€ÝÓ¶Óqñ?]C6û+<¥ãœê`ÞŸ_úƒÏŒŒÄÊþª¼ýä­y”’ÙàºÐóŠÞ߯¤½…¶+hêmé#.Þp¡Ù÷²š4Y+ 2’éÙ‘„•ÀóÅk UÖàîr¸:øK{ê3]"ÂóµÏ¤eð0ù9…:‘äLI׫m<§ç ¸;LAÆÀ¶°ÊåuF«dmw'ޏ’Å'dn:uи¿&¯“›îѪ»ŠlgcýØò¯Ê&s±�ÊM¥ §‰¥Çû™äéóÏT_ˆjÒ19&üîŒCD0ÈÉQ¿Vÿp«¿Ⱥs·2Û“j-Sž”œ÷/"·‹Þ�¥‚ú›¡tŒ 7péÂÜïÚú¡Æ¢Ÿ4^%¦3ôÕW3Xýeëâ¿Ýÿ¬)Fˆe§G‰,¦QÇ*Ûî5r ÈïŸX@‹‚ã:·¡"ð~êæL¶³±Û2ðvøí„u̶ÀûÛàÇ'ÚC·.d ]Ðeô¸¥”t–3Øs ¾äQõQ¦‘ES/^”¶Âô?ï®÷àô¸Â Ë)¤EÙ ¦mF‹­ç_ÿ(0²~q$œ7Áã.³KùÌ×¥¢.8Ïå’ƒ0ë:¨³)´^]t´­wh ѼÎäe­fÒ7ëÜÛ{÷Ì‘&üël!)?šG˜Ñb¥H_¯ÿYš ›©ÆŸÖ8õèL.½5ÜÄêøãí¬â/¼‘À´ðZ-›Ý§ŸôÊÉpª·W,KC±6!Û_)ãI’qã?GÝ|ö¨5†Î"œl“ÏHóU²°Îœl¶EåL~~¼ `‰»Ðnz5*—è"œãªU>¯!·×w5Ú•{™]õÕ‹hï¯HÍØÈ{B)Ö#¿Ñ;zøRþx/4@Â÷ë@Týs}õ]õ.B¯‘ô#õ€Æ)ñÖ8öd› ŒâdÊ e}BÐàOîòqÌšÙð<†F{ã(`[d32ŸØ|'qÉ¥=‚ÙSe»P‘»3š{„âÊÔÄ:Ó`LnQÃS¸!½EÀÅù(DîèmXú½œé;_Qkw¢%púÁvkp±Âñ‘f[,çÝ/¥ÐUƒT‘8ù3Ϊµ¯Ð.‘-îù¼Nmêû¥ºã’Ë4â±ÃZZœ”ÜÛ'“ÄÒÈ©þà ìòYHðà è› öhUæ§ÜuUpÖõí–è, Þ‹åQñ²óµnˆñº}ƒ¶ezžšÊRøŠf`;5G~‡,ƒÕnÍÐ(œ„´ÜnÍY…BñS•$þºH=Ír@AljîµfˆöjÔðmKD´™«§…”Ø‘Í±Š”vþ ž G•‡ü§*¡ÿ' ëóÜ"ß6”ÀÓ±;-÷áàêSÝ®€ üŽ.ñ€„cʸõº'¦U]ú[\*0MÞ‘ÿCÞ4÷«£U´rãîs|¼~³(L„Íž >=âû¯8¯}þ›¿¬24û*`S,LPx×Õi/ôUPi€óï`E2—7 †úGÿtžD„€k¼-ÝWh¹ÌóÈûð-3dzàbÕ#�ÛØoׇÝ¥¬¸?îöÌýk:©@HˆõÓ½|geÁ&ØmyÐV ãó0þÓƒ©ћ°×Ÿß´¦ù%O†+òøó*F%ð ¶ýb¹olDï~t mHͽY5›P8#Š¢œïmÄ=N0ØþO¡]…tº#~T,(˜÷è6v|’F†ûûþb‹š1¼™À´FÅ£× \uK�­lqšÇjç)ó(¾7‚?lKö†T{j5Ì$àëÌCÏô±©%øÀ~Oc‹ñ/Ú‡$ý<ãfpâ)< @FÐú-à¬Ø›'”åSÕ-ª†Ûäv)!^ô&ÜÕ¡-|6Yß!ò@&°-v.`;Ò"nÀ˙º/XåöC™&œ0ed ¿ß¢"W’LåÄ€ñéªËã•c!à áí4ë­ÔÏjSÉ»rbp‡k©ÎnûŽiëvÀ½z¹4Õï¼éžHµÂ=¦»¸Ö‰&}9Ö¨y!l¼mê‘Ôä¼tS¤j çÙ„…3ÞnÓäÆ_s¦âå\˜|w±`ÈLr°¥±¬#šf2wÓкïŽwóSt½s‡üt….ÍøÏ9`Ýlœkß*6/n{ƒ<ér<³2i}kAIÝðšÌšI™£ÌJ×</ ¯˜»¬7†>׿˜é½„ŸÏîøuº±K|â­1Æ3ÿ´rV‹—ve¥,(vWóõ—>u"yð&Üe._æoûØ©¼¡€©èñ«±µÞPÑíŸ^– D±ÎŒ¬ QKqMXôœo�Ð!H‚*v¼ëC—h¦r5„ºË—2Xº..¦X$JÉJ¬;¤éFW¦º”‡>ôŒ_8»S3Ýk;GèYÆúV„C0ÐYÍN#4d:Œ¨ó窕Kp½# —‹x8»ŒI(N¯Hj1‘#-X\iZ“êy•ëã•ÿ·å/+Z¶ p‚ç5¥°[‹X?¬4¸ïÁãîˆø§>@âõÚ’ëV•Xw…èžj\swoó çš÷žSdfJóøôsu¶OSuáwì édìüμŠçæCâgŒ›ø@ý™_‹¹t©/:N§µ5un`iáƒKÚuÜ; ÚÐYƒ;íEžÃÐ1í=Wƒ´”»¿—Ñ'B/Œ·h-[ª’ ž7µTO€ûН8CDÿõé98u7%ò!ñøcŸëå)5”=þL„±÷ ÷•“Ô­ NCXQµåm*^µ/H‚¼2pÜÜ2ÿ2àØØ®a øj<îð)·Ìév*`ºG7n2a$ÕÂUz¾Ô-ê=¿íh•amXÖ;ÃÐ!ô‹øØ�EÆfR«„¥L‰—y‡˜@­ÏñÐ ïºZ*{=ÁF±æÍñš}OMLj£+G*¨ L0ÅMcp¬·ðÙ+iÏîq èyt¿öÓ&%¼ ô°ð¾»¦æi1ÀŽºL?¬/؃€©ÍæfQs•jo»¨¿ÍÑTiîÙ¥Ú–J®˜ó9Ú´p4¥D×:¯™}¬ê]äo_…Dg¼â£™LhŽ VêXÉܘõ`®œÞä>à¥l·v•“®RqHw›ap›̳öR¢íòñÝÍ$\O³8(Ä)—¸¡!EÕ9XË[Æ[($-Oñb7C"šoš±,SüA¶¨Kóñt{Űš“9IýÑJà©Úµ@™?ݲL:e`ÌLÿt`!Ö–<6å Pì ›à©ôEgº€-):%]Å$2õ¦/|K­˜$V¾Ì1ÙšŸ—¼Ð¾B71WYñ÷72ýí¸Çæ±ëþ“ÿ’aq°â_ÇMrº4–%Ī¢Šòئϴôï(ú$¿¯y :–†ÇIîñÿ¸üŽ#±.º )ë}Ê9'aÚ|iqŠóŽ›Çg8snyjOùÑSýœ¦¢~û¨£aTÓ¸/žË©ðp´ñÄë²ö£1n¼ã”OH8ËqSl;’ü¢tAåÔ„æ1|£k±‹û-Ñ9Ea &JïxO£™6ññõ’ kg{9é>|™p’•aXãz&TÓË`Æ7ì*1îU¶c6© Pªa‚+2«x°kº!íñ ÑXŽt!¸Æâ<œB™½$¢Ú…}ëS<îIY2u1Mgýò"F¥Gû è÷¸¢ðô 8µ0e…ò§SÒPô)$ ŽOk§qÑ-IQ3–>Á #øÓ½7ùM„$ÿ§³ËXÃóïxÔ$±¨„Ô%SåPžŠÍ¶Á›T=ÉQ‹ûGNÁ-SÅ0<7g¦o¼H vXÒÍ£ùK=ÏÃ=¾Üg¸ú·“Ž]%ÁëѶ߈‡ÎðlA ¦¹>Ú‹SÊ©g+ßSVtf­?óèÞv©ŒìÙÀÀ 9~‡QcS;`ØÁIn€úÎÑ*Rxzæü÷9ãYF€Ð)wp»Ö¯-Á-]Âa(¥ŸkFšõ‹c¢¥‹xøÇW‹ØÂ:\{á«`ÚÉ´]L¿$ÛM(5]P“Bª‡£“6ö¿“ã„óªç®Þ×¶¾–G&“ÜN`È Ç»œÜTÊnû”Ú§u§Ý×Ë̳Â’ æ ¹Qáä•Ëàz‡YÀè‰]G‡”é—Ù©&ú˜:61KžKJ„ÛäFÇÅai±9é^›Š÷"o¼\Ø0“S]0ÝüËû¯WM˜8+(ÃOó ˆE W¯Ûæ’=ʆ¼'cÿ­ïëQ6KÇû©È;Š/S}ÞåÀ?£¸ðÙœž1oOoº©tG ôüíý&åò‡ÿS©(–?鳨ñŽðåê 0 +ôÏÔ³À‹ÏØM¨ÂóîáH¤a×ý Ñûñ älø�¾‡%CÚÔ §ÚQÁÝ«?h\ÿIýôzd…•Æ5Ééü8KKëå„¡ìU›ã�Åáèy°Eפ¬/+T+7Í%GOA‡è{MÈ^)#×�VöðìÔŠPÜ"ÁFµÈ’n)µÄö7óê¨Íú¤ —¸,W³!§üÃwÂU;Lú*Qx^é”�á#Ã%¿jã’“§±,ÌWÐgt¨yˆ±YÙ�° E$¬iðÝîA>×PWD Âu½+ãjÒõ°!ëýXèíóˆÎâÔü<-О‡WÏ(iÒ²0+÷õtMô|v–*=éç¬ö„uÙhôk4ˆÖ#ç4Et'läzFZãõ P©8Á}®Û×ä7ü=5§ í(;“¡tó€Nx½ø¸vÃqy©o¦6qE¸c•wèÉ¥GªŒ4AÈ^„ÀÄÁ¥:1yù6m줟G2KËHÿ¿DÜ©ð¤ù3ÍŽ]Qh¨*Ú"¹¨PfC;û¿½'Ed¯aà%,¢=,D»’ÕFµ ÷Âõó¹V¹ì ]ìe¤@O×ʰå lF§µÒ#Ÿ)¹Œƒì†ÍñÕ ~âøø•.ÍÅU{¢Ø;iþ˜¿JÞºVÝñ+™™„A•+ÒëšòÆÌ™úÒçé¯d‹ùš 5Tpó, QŠþ~$÷å5 o üMS$gfk’ºæGhulŠÄ§d¨05ê‘‘—ŸäÚH).ü]Ý—¥3wíË)á"ÚËœohzÒhONø…r|„ðœ¨ÅyÔŠÞñôxYÚhH'à1gˆÙ?YE/ÉëÚXEÿÖŠ‚â6KΚw´Þ1ì4h½ÌÉßÚ mÏZ‹Î@`´õ¢t$+J ¾Y¼Ój*Âd%ŽÏܦ42Ð~ýÃU(¤€ˆq•ב4Zë½�A§e'M x +£ÁžW—î€fjÇÛb ³¡ÜWt8¾¦SMKÛ³+†3{ê)¸äs8¾j}T‰–Û4øí¦³º(eÌ´‘ôç:ÞÏì�dq0a¶†?ù³H ä(6ìÇŽˆü{¦} endstream endobj 61 0 obj << /Length1 1563 /Length2 8055 /Length3 0 /Length 9093 /Filter /FlateDecode >> stream xÚ·T”k6LwJ÷ tÒ!!ÝR2À�C ÃPCwJw§HIw H#ˆ„tŠ HH|¨ç=ç=ïÿ¯õ}ëYkžgï}í¼¯}¯5ÌŒZºÜ²ÖΖà'ÎP7n> 8@^]‡� ð�ü8ÌÌz7Gð_jf0Üâ ÿ/€< r»×)€ÜîqêÎP€ª»#€O�À',Î'"ø@±ÿ�áâ�Ä ÎPu†‚]q˜åa^pˆ­Û}šÿ|جØ|bb"\¿Ý²N`8Ä ¨ƒÜìÀN÷­@Ž�]g+ØÍë_!Ø$ìÜÜ`â¼¼žžž< 'Wg¸­;Àâfл‚á`kÀ¯† 'ðŸÎxp˜zv×?z]g7O ¸W8B¬ÀP×{w¨5¸OÐUQhÂÀÐ?`µ?�.À_³ðñðýî/ï_ ÐßÎ ++g'êÚl Ž`€æ57„�µþ9º:ßûƒ<@Gå=àwå ÀYm�è¾Á¿Úsµ‚C`n®<®Ç_-òþ s?eE¨µ¼³“êæŠó«>lu?v/Þ?'ë�uö„úü%Ø@ Ö6¿š°v‡ñêC!.î`…¿ ÷*œt¶`7€€]�`„•ï¯ðz^0ðo#ß/õ}~>0gÀæ¾ °Ä|ÿÂñqy€npw°ŸÏþ-áðñ¬!Vn�K°-ŠóOô{5Øæ|øp`¼ç�øëùûËìž^ÖÎPG¯à¿Ï—WAOKYOƒóOÇÛääœ�nA�7¿@LT "øý;ŠòWÀ\U 6Î�±?ÅÞOé?{üuþlí;àß±4œïI °ýÃqS Ðêþ‡ïÿ™é¿]þÿþ+Êÿãÿ[ÐwGÇßf¶ßöÿäqôú pÏYw·{þ«;ßoô¡†à?;«¶†¸;ý¯UÅ t¿²P[Ç¿Çq}A€­µ nVvÈòG¯ÿkÉ!P°–³+ä×­àæÿÇv¿YV÷7‡ë=#›À÷‹óP+gë_Æ/$ �Áá /à=‘ø…„�>|÷«h Füæ0€—êìvï¸oÏ`ã Çùu¢ÂB�^Ù_ªß’ˆ€WýoIàÕú[»·þ–¼÷ëíô†ïž¼à¿ÅûjxÿÌêÀ}.ȉ¢�^ÇÄ{ÊòÂþK¼O�ÿ'Ú})nžÎÿe¾¯ÆýŸjîCyƒáìÿš•;~Cüfðýðþ#ÿ¾ŽÀ`Ø gaÖÙêq¨}}hçE­,'÷Ö{Éiæ-à vnŸx—ûf*{MNðü\6uä-Ñò¦"Û™Ì"ÃÏ^[#fD{²vÇOßëç‰:“[8óÈ'^îÉ6 ÐaÓrëÉlûÞ¸ø9 ¶!w«2¸¸‹h‘\xö+!*–ÆÂg·´·k„Ÿâ^WLqÇêǘ•Î0Zæ~¤|ˆáÆM‡ÅñàA8sv>ý âŽA5‘Ço?V ÄÇx?îò£÷Êk=~×*&*cJ:Ô³c“,>r;iªs>e%kð±ôä]ãN)|Ž;lÞ[:ðÝïæ,ÌâlT”¼¨¤*/bÖÚ•“œJ“0s–U×*ßEÚ,]¹4“ wšŽ" B:¸b[½Wù Þ;˜ldõF:vd© Ð>¡:äü‚Èâ-Û¡ëXŠUÓ!«•ÑÒ¦V1 Eº¶®ÀO¶9õžA»+zŒ#ˈa•™cUï©HÝMGÒ£S«lçÁîíqWk'*säT榦`ÉÚöÔ|\Nšä ¹tîçbm4èÔ±Rs² Úš´p‡ž›Õoíá²g×ìt xâ\D|Ý$­Ð¯¸“­©*Í!~‰­ŒwÙ‚±1îN®ôaC\aõAĆjdÜ-[xщaÕÛ“ñ7'‡fÅÜ@ ž []9B< Çã<͵ÃéÂ8!s±Æ>Ò[ñÒ§íè¾ßžà‡ÞùôE#+f¹Ö¨ò~ºt¢PHuÙÍÓ{iõÚ·¬F}»»aQ*¼‘ÇT^Æ#Zgn­h›E(äRwuó˰/ô|AºµÈ~ñCâ¯zV+@'Ö@»þ9Ÿ€� 'ŒüžcùiWáda¶Bƒþ¨ÁiÇH8—!´4bJÁv1þ'3캓”øaÖÝ•(ª}H³jô./κ™iÂ6%d0¶f]r~°^1“ÛM#—J²-y5ʾªŸ4ÿÜRa&Fž%ij Iå ‰y£ŠŽ¨Áï-Þ^ž8|æ§óeÂvhKÌ¿æÃ®Û®£þ™7c…k\ú§4‡ ÃÚ…oÂÇóI¶"ÅS¥ÞÁnôÉt¯ÃXJ¡32XÊQ«N¾þÖï$,CÀÎö2’„`Ö4îõìòzQ’ÔI7•;YÇX1Óã²-ƒ*¥r .måc^¤ýõÀ}iFÇW±ê ¯'ùmI4w–xHÃôúE’)¯š='’Ø¥ÛPKä±Ö Ò ,IEÌ?9d畟©>~m…£Ñ“Âq‚¿«DÛóêåú‚ovÒL}¤þË;«ñêµ¢‚‘2Ç™€dá)»,atlþ…µ¦ù ô Æëú§YŸ;µ|™Ù †Z œŽÚç*sé)Ý+.`Ú×G'¸(V¸¿1o4].=^Ä^å5fEDàp:õMˆ4꺔ï.CFDWæ‰ì« [m'$ò7À8ƒEÞ”+ìõÔ&'"ÕcÜÈ/¼^úűҬ�±xz°ys|Sát~K›à1lþ {½!F¥/ˆ7·#Ìv9Ö}>·Å ïhnŽ1æ·ØÌí"&Ó>¹¾[Å–©ë¸}…YÐâí© O¶"[Ó"cûœ'á ÚYó8µBdH™7¹¸E0]gQ™²CèMÕt Æì–~Ù×ZßqŽå˜PT’×Ñ †-Xeˆ†.ÞF–*t’Ú­¦�ß?œ˜Q¤ôº&j7°váîaµÏdÔ¡Ñ-îï -˜¥© µEéN=•léowâZ—`´.;Ž:cS·ñßà%ëoœœ¹÷ÊŸ}ÁL=ðLïŒUç4fˆÚ~ )ßy–N½ê§vωt”,®yÛÄ;fñC&äËtþtÜÙˆ`k\c¥*A¨Þ‹±a¦Êg µÊdز‰¶@ríª‰ÕÇé?=|%„1g”>˸ź…ÇHmŒÄÃT(ª˜kÙèN=RG·EüøÅ+ekž.V"3—c¥¥™%÷qf]­×9&ž>&;aM£Úû °láÀ¡‡×ÌV]n–×G(,¤3ÏmÒ˦Xµ/«Ê(à*Žæ-úº\<†‡n|[1¬èÚ¨1ãÔhõ¡â˜‡géR /âmäô÷)íî–6š´!DõÖÞX›74ƒ ;2ÜA¾¬ÖÆÅ{!õ&DØ%Ê“#ÆÉsnkïh\�§·s£‰/- Î_â¶p¼àÅBó$“ÑSâÜ…áà ¶ã ú4eùÆã,Y ôÊ2©ZÚ£Ÿä™Æ{NÕôÁÍ’a–¦ýìŸ ¸^¾>‚þ˜¨E…R‡œÚ×òè}NÅE:‹ Üa©$ŽÝšÉ÷®ÈUrŽë›yhNQu¨Cô’ákÌh>@øÆS4gS7õm¤ât—+(HÃkY­q·ÏJyŽúté­ÀVññ÷ݺ JM» U١̬†N)óÒbùÓ ^4˜¬*Nn­ÓÕâÖÓƒ‹SÔ¦i¶A:ˆ‚>ưkkÆ.\ä”ì€È¬&ŽãŒ îÏbÛºÕ Ö$ó}ÔI–LµWÇCáæni‚~vBàÄUeHx¿r•J —f ¦0ëz ÕÆ±cQCx6Nè]¸†æWÊÅGö¨¦^–Áw[ £jS‹ñ/£5ì®2F³ï¹e™9žæÀòK2<¡ƒ(¤ îødµF¡çðå­Ý*ÛàÒ^zø—Ò`¢Ûñ-æäÀkë¯Ýi=ˆ‚Ù«½ŒÑö‰Â¢ëgÖ+l¡âyαÖ‘EE²êWZ–¡1áÜЗ‰»5nhIfšJ¢mYF¦ÁeéU„;i–BÖ$“šŠØB øuúzvWT+ŽÝb4ÏÙ‘/g¨Æ˜`òÙYƒ{tDœcl­êqØ;µ~¼HÒ„Ž¹YÉ[´,øÌŽë¯¬zýL–m€u7)’O5 —º†$eZr*­‹‹Û�¹E›Ö\~ee÷\pîßÓg…5œMÖ³RæV«/„�ݸ†oHI¨Ø_CÎQÁ�M††ªé|!(ñ+ˆ¨œÐ-Çö`h:bÚ%ÃЫøEAëNª½�ÌDªr¶´oÞ ]èá>«"»(,rx´^í)Ý ëÛh¼Oî»ÙpkÊ%§[êa|Îèœî·†×û”\[ã%mr%OÉ|7ãœoN슖_"ôn;ƒû íuöõ«»ŸÇÐr±| ZÜ¥a¨5¥¬JXþü¡ˆOM®¶râÁ#ÕÏõÈMG='·}Ç­t0 Ù8€é½Q˜êâħ"Æj AÅ©§6Û*|e´Ò3ön}¬#¢â¼l1*yJ…ù‹˜H£MÂÑChTø!œ…õåðsÀE"oÞ>èddc@M‡X÷–wŸÊF´WƒÍpb°’F·‘L6*MCßÕÌò±m"2},·šø—˜¼d¯«Ç`$ ù4,BñÍ|ˆË¡”ïß-1 zRYQòƒ¤›­ˆ( f/Hñä—Ò‡2EDê¹-†˜ÐjªÔ=Ö0¿Ò}%÷mcqíyW-lÄØoûj=a’ìIü94Êj½—î<ãÌð£ôyØ~Š3?Á¦ÄJG6Jdí~/! }B=A¥Û§ë´Ê„ÉZAï«ñ,Ñ%ÞTŸ}Ëzp2ÄW“ç‹¢˜§¥.J»ë€¦wÂÆlÖp#cS¿íÊËÙkRá2¢õ¥qKL+xCÛ÷¥DCj>‚�Ù‡kP£¢±c¾&äÁ0hbÐSº^Mynr Ùò I1 [!ÉCsÄø:"¨±ÿn1O1€¾¶wÑM”‚ÈO#ÿtV%Na44%)#ª»2«„¡›1(re=ð¡™róÒîžÄE=þa'ˆö«·p9pho€‘ÞæSÒÐzG´n‹!™Í,R5ÆÒó;ü ‚õþÒ&ÞôLC+œ ü-¾äy¡|¯DÑ^¼öY ƒöÍšÒÓ…Ò¶¾ïAÁ¹DæOü¨IãiÑlǵrc\ú§Q;õùÛ¥ä$a=ñ 50D==šç!Â4e}Vt>wjOK9ë»ý@Œ3§k€`Õ.B¸Ñ¨ÝémᨠEi?Ø:à5‰F颥4IÔÔq—R\Km)õOà–x#]ÕØk½«á²7ü”B®³Xí.Òè‚¿ßqaïäˆ%ϸ|D%O Ý£Ž…`ïY¸÷‹2Ö 1Q7X¡•]êëg^kŽ>ö÷[*#l%¾°– ¦Æ%K»Äg°mƒ‰Žì¨íìQrÏIÜðP›Ù[²Ÿ©L Ù]¢…LUXG)ý|´qy,ÂÃiõsóÙe_G~éÙkI-y¿ÐëåçüËC37g¤$,{ƒ(¸»ÁuJ"sIè%*i1]@m›^ÞöÄsìèŸ Tk‡Ùy`FÝO¾üqÉO><ŽM€’ ˆŸ)Ù'Dü`÷wHÍ[Pg•}Qº¤#%OÛ¾¦nîwen­&çÞÊæ™1<Àø¨¤ÊAx8óF7èKº#tî.hÄ>•ÑɈÙ#ÍøaSÓÿyå2„µöå[È,¼Pd=œ™¶ˆ=9.X"òâ@ô]ËAh`]Äp‘ƒÿGñÛ®\OØÃÊÇöǵ²hWUØï-tuL›Ÿ¡ÔñLyj¬SÜÈ×%:ly‘Tú¯º+?Úe%˜Ði�x®ñªPÐãÚ>ÞIªÛPûÌ'ý|"@‡¢ë© …ù)Ô0¯öN½Î>ƒl^†–åÈ H+žÇñèåË ¯¡o¥£[Mèûj~/ãlÓ§cj„OJ.DD%TÓ@n¿YŒ¥s­oðΙà IS‹ÎJiçhÌ)C0C^¯ýÈI´M‡Iú„O?'ÎÎ(K±½kt7ìš.ñöÍÖkÜ4PQ߬±áX+~K†9fõ¥zÑ\"=GGh܃۳šcKp>>òò$/Ø è$BúsQ°ªœMXUîÎ+LˆÏgåG‚v¸laÈ4¶þ8¢o¸gãæ¾†u“Ê\°ùígS^Gm“ëå`èᪧç„jUÕ[Âf" -¼c|nY³s"xQ‡dœYI8ï($¾I¸Í%‰id-ôŽ­9ª(Ó¬¸æöIº‚ kÇ>¡Qœ¼äS}_QÎ;WÛ]®f’ÙÒëÊae{&3ïïä`ãQ&/º2:DŽ/¦3–‰7'D- -€ˆÀZ*ù›SƒµÕ*Dê_Âzð[È­e¾°ë˜õÞÙI/š8…Á¤í#ŠÓ\hžÛÒÎÞ ß³[–±T>¹kÈ)²î#7ÅQ VÅ0 Ï€³Œ:Nxü\/¼Æs³Ø–üÄø¢º€=Ÿ]2"û1~¸£GmŸR|©u*VÂ÷Š4}I!ÿ]©€=ˆe­ÇI=Š™m³`¬3ËM¶»÷ÃØw˜üë‚bµÒ%ªrmÀ³sâ³lÿËb§;áÇ!qUØZŸØI”j®7·´(™ ëm̘ã5Ý‚âÛ¶6)m:e0?>™ÍÛhbðk–‰|>ÑR¿y‡^~bHÊò¥ŒýÑåû¹ÀÚ¬˜ÙŸœ…L# üÛç™år¹Þh‡´fò»CfVœ;A“1í¡è!£—MÕ[ê4À¶Îð…s¦ã÷΃ K'q'Ní8å\%z&'Å ³ ÐCÖxÜâ›…–÷’œ<»nÏ›¦¸X_½Õb_<ùPšç˜&Þ4 ƒÍ1àÒêûÐqÇ4—MËEÑœ�òc©] 2‹p@šc¾.›QÖè…«ïv©Q§ûÚ™6¾òžøN©ë\µp[ÄЬ×à•?ÞV¿òÈï³õÿøãÀ½Â¤Îñ;›sçÂÆL-u¦£"á¾grKkïl(g`L�ìÔz±ÁÈ‘4^ÁÈ´(O ·Þ’_\…¿Åž›»Xƒè,!DÛdwÒ¡ºRMuÈ 1 ¼Ò§7ƒ²ß¢f¾ ¡±Ÿ¸Öã£<ÔJ.…×4/œšéùöOº3½× Õ£u¿HÖ&$£ž@iW¨C¦²/³oûc±À3±\;±ý/d‹gŸäÎ;4òZšžmîÔ{¨¬üØAiÁE-Ô~°úà$Y¡næëÉO‡ ×´";©æ,‹°Ä|Pl¹V-›¿=³Vuxëðˆ!N“’¡cªZФ4JfnÄ禣ËWçh+‰å,½ÑvîgH,]ô²ÈáLD1Á±3ÌWqbV¦Zx•Ø®â |ª¸¼9k ߨGéé%M"BòC£ÉOç|˜ü9¦•t±5¤Âà“rtfÒÙ"US,ŸÒbþeDô§g„»zõãS•#È® Ü}0ÝŒÊ^ù†úqœ`T11Ø ÃLgÚÇ[¾5¢]ÚK³]w–g›s]ï‘ŵÅÃy@ö CbŽ¿l¶Ô mˆyýÊ•Ž÷¤¤ qÔnû…­½ìJ2+"ÂRNËZ¢f³Ä|*Žkš‘°¯Ðãã–Ó<®*cb‡Du¯n=Êð[Iõ11?#:“%+Y~N뽇Ÿ<žc+ž%™ò¾Ÿ6ÖÐV ¡Û|û…ÁŽ’,¦Ø—áÁÑÓ/RBS/x„Øžn\‘MKqb†‡p vx}”)#[EÏû ÷ñ›É3†ÖΔ3ì×tÜ×Ä1©Q)‰Ç㉌%¥Ü¾åg:êpalk&bûØ•žÕ`êüöªØ6f žóïøn=É8”ÇÑy;çñP¾-;�!Ô{r ¬“»øzéô™tU³åv!œÒ󭧦;‡ÆÐÂ*:7óΠx¦Wìµò[ÑZþ‘—ÄÇE￟ ø˜}Z¤›…Á9L!ÃBØhÚ?iÖ“ki¸VÈX¤±Z[ õ}&ÙÄw:Ư@;¦qbña˜;òpñãÚ:â­™}m"4ÉâÏH‰;¤ŸÆr ›hPÉE}èäõç[·h»ÝÒlæšTG¯U< ¶Ìjô}†ª-È0¼-/Af ž˜ÿFáüyëJ!ž‰3;©,‹T£ñIwç,NÙYý›ƹ:¶ul¼ý›>·¢\%í¬†>Âíg„t‘ 7­ÙNÁ»lÌä-¸eû]ô¼•±ú¯Z>ú@b!¼íha\›„WªY¯ ?MÆJ¥ã‘DݘF?ž‹Ëã¾N:éÞ?Ö z,«-ÊfXØCÿ³y23V‘Gg´ÃÛ3Š?L¨èM…OÊiWX›–\yVH·°#"Á/X<8¤[%Ο°G¦z{=»¨?hÙ³ËÐ<¼Ľ Šîâ*]ÞJ2›œ6Þ-Úk%Î\±½÷Q¶ÕAÊÛÄຜÕzÑîí¥U|ƪny—Ù¨$ÜAøƒ²È™ONÄR”Ä«:ó%0lOÒ¿)ÆYl·»3hrvà2b…ðk™™Ÿ­³q³º\ÏZÞÔ4…'R6qî8tÙÔŒI¸<Ì8µÀ-;U˜í£K!äÔäÔR™›—·‡z^¸5£áЗñë*OÉð—ãc6Þ³‹ˆ?ã(,jj¨äJc#SmßzÇ+=½VɹËñI)c\hQç¸ñ*^£›¥ ÐÛTNÂuê8ûI^qDø¼d™§ÕdˆfÂÓ:Â+i[ŸÝ¥n§Ù/fĘîïKªe,"FUfrt‡]¨ Ž*K•Ó•s=G\0Ä6öHËéDå,LÈlP‰¥‰½N¨êŠãÞ‹ ¦O½ðq–—¶Ü zybp/ŠužÜ°â͇6ãÜ[î~qó|CZ0«ûÎa{†%!š’ëá<—¯OfaÇSD¿l´Ÿ~ôÍ=H¹—¯Ì<9æ›F˜fä¿=DÇ/~–û²èC¸-Zëcj%ÏÛ­÷7¥ ³aŸöKe®¯ïÖç¥ÐÒô—Dåš÷¨¶8ÂSŸ{ãåaE­W“÷š¤žR*K%·ˆI¢¢¥<$Ð ¼X‹Íeõ­“×ýü´l*_Î5— 䱄գLÉ{WUõ¡iüÜiý°`\t{¼E³Ü¡§·é˜ßr.ÜÓÙó„æ6‹ ¡ai¨ý¸ñiø ß°.÷A!’ßú@MݳçähÕòM•¶[ÊR7mm{¨}Tx£`«zhùÓѵ Ã+¨.ÐN³Xg¼<‘³Ñßu\üÀ;¦h>0;)åK´˜„~}&;Í@#òÚÕ›cÞórŽ÷i>a–Õx¿9„[ÒFqôZǃ&4ƒeŽÿÜeÃ:ýNºÔ¥“4DŠ!g/*Täˆeu³ÿ¤cÖâë¼bõ‚©â cÏh)”¶t¶–†³E´çy̕×¾T²þô¡<1üöìVÓÒáBž¢C_x¾ÑÖp“mJ9ϼ2D5üw©˜�ãe`) ­8Ku(w¼õQ;Y3 (—O^€¼;ovǤ‰ qª×Ï' nHÝ%‹ï|ƒ™òdm:( šsÛï^§ùëVô6ý/è'\ÊGž>Ǧ7¼>¨Ži#üJ6ònlë@/Öñ ¥7.I“‡Z½—’èþUO®\{ÝкûJÝ»‹GîîJéÃ×fª¸Ñö«d{ݧ’ãBm÷Ŷ–™…bf)s�—à»É¢Â(úW’×õdD³zBLì½"AÐW#OÇßpðm¿޹âØ ò§ñ­Á±®íâÞ>Ò°ëW }=zÕ½¤eIlZÑ‹vÞ³/gÿxúÅGSb·)4óÈØfŸMù#kI…èwág¯Ô_(á°º‘ˆc)F­q% 4—B`%i§î€·µ“sõìhzhýk¿HO¿ÕSO:ôœyb‰Ë¦HÒÓ)¯‚ñ.gj‰ßš.W…ÃÓ¤GÀRÅÈäµ²žîî\lD®k:±hÉ„šªnÊ2 J _ ô#Aªˆ…HÀZV/hÝË´'eö¦®=XX]"yä Ú±Cë§®à軵¿<‘ˆ0¦ÿØo,ÛÙUàkâØN7!N÷1ƺ¡` õÙ´¿rd™„ZPòdpJåÑXа&aÏ1là«ZˆŽ?‹Œ~ê¾(JQ(+­žóryئ í–ÄÏã\±‘馱!iyYš%[Ã/¿;½±\6c© aûJ>Á‹‰1…ƒLåN •=÷nÔG,eàG"WÂ@Ó>¾¹ßÿÉTøû×­ù¸tüŒ6?Uåoò•3i7¸U9;"S`¡Œæn¨�y”—JkóÏe‚Ì 3h¹Y ÍÀTý9%Êéó›Ð´¥Ì]mm’÷¯ E§Õí*jÄ'k›"áéÔËÁïmÊK? ‘k¼Õƒqc~gHMRzoŽ6R……¯É)‹ª-ºÐ类'+p?AÎ#xÆŠ[þÉ`צ£hì+n7¢FËžÂ䤨X£Mø&XlÈå2¨‰]1§Ä‡$Ë@¬„ã¡øJú„½œJCvÓw’�Ë£§Ñ5ˆ±–f˜]ºÖˆ>ù²xTÈJxiºÂ!–æž‚«9šžC9Žß·¼JÏÔÊŸbvÛ³‹’]ˆ=ãj…ªÃõ@r…дh怤OzXïúÚ•*WXíÈ9iÅ7ü°„bÀ–qðjU‰‡®©™‡û¬fÖÓpNo‡÷(#Œ€·y“«T)ý=} HBÅ6j › ®ŸÙûÝþH'!è²ë^ÇÜ¥LñQ_%tæ—ÚUV­â7h‘¼_(R5}zË͇/¼>]�~¾<­š=ˆŒŽzôÁ�Ø´åtû@Ÿ=BraÍÁÙè£ä”5ý „¥éBoþa(˜+%Øvª_Ïà0ƒ”º©`FÌkVÝ+ûTüÌ%T”"šºžAäYÒsëe€ÖSÃx6ï ÷ÒÜGµÏ¶Åö`æa$ãÓQÈ$6“Wm~o<âJ<ÁŸñõ±9ýŸÆ=ä,ÈtOë­y&ˆ—R\?sþÓ½P*Fì IÏ| '6›ŒQÚÏq˜w9."´â@Ü9÷UÅ£q|ë¼½žFF™-¡¦ŠüÍü`Åv=–ŒNF¹qáb/Îvò\dÈÒªÁéS®oüÑ©«ˆœí¹:Q~`ÔµÎ×ÿ¦y¤ endstream endobj 63 0 obj << /Length1 1627 /Length2 9624 /Length3 0 /Length 10676 /Filter /FlateDecode >> stream xÚ¶P\Ù. ÁàN'@‚;ÁÝÝÝ¥Fºq î$ àîîîî\‚[xdfîÌÜûÿUïÕ©ês¾åkíoíjª7Jª Âf ìÄÀÂÈÌ•Waá03³123³"SQ©œl€‰‘©4€Ž ˜ç_¢@c§™˜±Ó‹< q¶°°X>ð°pò03X™™¹ÿcqàˆ»€Ì�òŒ�èˆL% ±sw�YX:½¤ùÏ'€Ú”ÀÂÍÍIÿ‡;@Øè�25ä,¶/Mm�ªSÐÉý¿BPóY:9Ùñ01¹ºº2Û:2B,hè® 'K€ Ðèà4ün `l ü³3Fd*€š%ÈñO¹*ÄÜÉÕØxØ€L`Çg°Ðð’ *-P´‚ÿ4–ûÓ€ð×l�,Œ,‡ûËûw øgcSSˆ­1ض�˜ƒl€�E 9F'7'z€1Øì·¡±#äÅߨÅdclòbðGåÆ� ae€ñKƒµçhê�²srdtÙün‘éw˜—)‹ƒÍD!¶¶@°“#òïúÄ@@Ó—±»3ýy²Ö`ˆ+Øã/`›™ÿnÂÌÙŽI ²wJ‹ýeò"BþGftp033srs�€ö� ›©%ÓïðjîvÀ?”,¿Å/xyØAì�æ/M�½@æÀ—²‡£± àäà ôòø·â¿2 À dê0Z€ÀÈÿDÍÿÄ/‡ï�rè2¿pÀüûùûKÿ…^f°û?æœ/“””˜¨¨ÝŸÿ­¸<ØØ� ¬Ì�nv�';7Àë¿£(ƒþª‚ùWi°9Àýg±/SúOÁ.?õ_»AøïX ÒÔÿp\™ƒÙôå‡åÿ™é¸üÿüw”ÿÇÿ· g›?ÔÔèÿ?jc[û_/œuvzá¿<äe Àÿkª üsgåf gÛÿÕJ;¿ì0ØÂæï1‚%@n@3%“©åŸdùS®þ{Él@` ÄôûV0°03ÿîe³L­_nÇFþ¡¾,Χ›BÌ~o+Ç€±ƒƒ±;2ó ‘X98�,/«htûƒÃ�&F0ÄéÅðÒžÀâ€üûD?p�˜„‹þ@œ,�&É¿€IõôÀ¤ñ7âæ0ÿƒ¸L¦£ß}0™ý ¾Dþ ¾„µød0Yþ ¾ú|Écý/ø’ÈöÈò’ü/ø’ò/È `²û|Iäð/øÒÓ¿àKd×?àÍ×ÔÙÁáå†ùc^†ÿüÇuºM‘f!¦¼V•Í·åÂÄ® ;£üST;šI4  -Î÷è_hʾú¯9\ èÄ\Þ§¾Z$ò8l¨Fiü¬Üôàùh«2±Ó„·£õÌ"[¼'Ì¡‹«FDûµ6úÁšÒ”àÉÅìLL¸%¥dÎVŒ•ÔŽÝD£CÄŸÍM„XQ¼è¶þ|·‘³jò›cyòR¯6(¶ç&Üu$[âMÏ#ߨ•km$ÞxYXÛs§Iaá¡áÅ^y”<1 {„Þ Ü«ßá$t¾ÛÒœ9¸b÷Û»¦uÛ´œl^c©!•vM°CŒãKãš=ÓfÓÀßsIé›(}’&c| z„Œ¯„ªWêËKtÕÒ?®ô5j¶FœÓ«UÍ›ô!­2ª™Ã¸MmvO"­Â %ÄGS8û˜ó‹>¤]5òóo5]†…ñè¢ÊÉÛÏ|g¶’¾i4>$SUDņÂPØ=neâ R=Fq‹£Ÿ“Õ'?RÔðÂØZT”5í=YtWNŽ¿l÷ʦ´ˆ2oP�Ï£§n#�4Ðkw~e…”ûAQ5tŒRJozUôgª—2ád¿j¾ÝµøAÖ¢tôâ8Qïí÷3œÿãw}ò˜•›‹X½^”§¼Ï±á’ý7ƒáwü. hÜ8X}XÞBõ¦˜Éú#ú2DkCŸZªù‘Ø‘3Ïç]AgsdRhùW)¬x !ÆWâfæ§!áÙŽi3b«ˆØ˜c î_”qâ·lI0È}]c$ÑÅ}ÖQyZöÒ=‰xÚ –q¯$>J»fΛû =ì®ûú”ÒÉ™DX!PÕ w;Èç{6A.t–W¢1ÕX±¡l¹á›0¢1\ŽïWý-ƒ¨îP|ëìOêUžü—¹YÃè¾çOß Ì·¢o¦ódø´øÅ‘¾fýÆ«ô(VÇ–z.äé$G4I2î¤cÝ¡.”žÎiÎf§'/v‚ˆ>&N®ûlíQXÁ 3j{(*Å"D,¡(€‚r¡ö^¿¢îd’9ahq±†[euÓp®#"vFR¸åú#6'o éKk¾¦¶ZçjoÀ–ï‰Ó›ŸžÓ£–ýt´ôOóÜZ–îE>¦lTy¯-SމW9­èݦBê®–“ÔœCë[e»”•¿x½¿Ð’VÏƒŠ¶óÆ/@ó›ýÒñý©w²Òtm·d¶Aúf+|¥¨ì8XØ%ãW…WÑü¿r®Ó´FùU ÓFù?VÓJ5îfˆòŒ(±™>Öšp.¤?½·ú!MOF Úì±?Llu¶2.N ³æÒi–ä¼WP/Ú ¢â ¿XŒ ¢cæ§)¤¥QJ\Ðͱ෩¦U]º¸ësmþª‡g£¬9íNû¤¤B±‚XRå`¼ÎådôZ Þ¢V²–Ç+ÞÉ_'cÖmñí%f”.zcÊ…a‹ý^Ó±ø ç ?¡z ÷º@1õŒÉ'Ö’ ô ˜@°o5Ésά.ò‘!ñê‹ó|ä3¦ÛG¹5wZ¤-,L|·-nµ;ZÏ¢)õò'!Zr[oÛ¾'­dÁ0I€†ûkä]9 µ'üísã[ÈïL!ø«mAV&*McF™‰EoG½ô bÈ_dž»å¶«¾_`uÏ8Å9›{Ñ ^dÝqj¶‚óý©œ¯:{|\}N5z*S!:ݵòSÚK®=:LU·µäÞR6emïs;µ\7éIüAID"vc~ñ[|Næ ›D+±ÐÆÉJ ô½Û`‡§O×’F’Û>ÆJ}|LЬ_¿ÃŠF…ÄV8´¶±&™| 80Æw§Â쥻™:•EâS¶¡×Pí ÌïþráÊ6¡–¹¡¾Á*‰ ;å3Ô/ýƒ\ÑþJ;àËBɲQÊ-/úDŠ Ñ×d솬òüšøïd}(=ÇçÞ34,ž@}U©€8q½F:½±²ƒ£Û®kc„mä«Ho%R>Džgî¼ Uáï’ç(ÔmP·=bÝ.¸q‰dº‹ÕÕJ ÞO–vQþœŒÅmP󃱦ù3¿ž…Ò×Üâøºswš£L|¤ZZÔPAÝV‹6ªñÏKoÃ~½QÃmF—J>Êa'ò<8æ›¶œŠÃï$ò÷¸#{Bé<+Ò­—oÓŠ³S )Òœ½’`¹—¹-7¾s+'a¥¿Üáûˆ°DÚcœ4vjkFÙßG<Ù^«»<bÔ~RU¥.ïFØ$ûû“n8rÙÔvB¼âì%HÏ63 �ðB•WXÛÏÜ#Sß \–ÔC”x±ü—ñï~¡¸3ît¼Âœ6'ÒÈ™!‚¯_gÉG†ñóÏ^ Ú ËÐŒµ Åò`¶C6›¡Jyû‰‡¶G1šy_¸Xð¹Î¿³C!M™Øz½è X+ÑצñZÛ]0m½`h¡U¾ð‡Ð…akÑ L˜7É@Œ�ãW—((X­eS$©û6mD”—²Ý'«�¾Ð Fy2 9n’£6xU­è¢Ý|ì®þ2ÅtX,„[º Vq*ûF—I4öÆ KQòM*»¦¬ÖÞƒþ×JºMŠ{žØ¸Kh#×ʦölsÖɈÜEwÞ7ÌPîÒ}šË*õQ½Ó˜7†×3³­›¬_†ŸÎ±>T¥¥n_¼zí1ìÏtÕ”¦ÿ®Š0!^#лxt²]Ûl™PA*¾ÎÉ-ÉE€z¬D‡* ‹Ž$¾c§S·§mˆ+B,†a¬Î"Y›!‡r>Öÿ]bùIAð oཀྵ ©!L­îŒ Ú©«ïÈG«­ÐZ­$ùI�nÝ8¢>ÔØ|–d]¢^-¤SçGÛ‡ŠÇldmŒ;þTf×TWgW³\œXÇ@Þj÷ÖY–léáļJÁ6‘Î6:Í}Û/à›½u›!–€E¼5¢z}QÈñ¾�oô,ÐYMž–¢‘¶ Nš².9G´0º´r,:µÜ&¦’STvŠA$TÑF¹NZ×TÃ’¤å®;“XÀ+±ë©ÄËSäPyoRì÷D ¾:T<;öÏùÞ¥CÔø)Å ï²]Åh D&²{ 9Ýâ  S#+è[‹¦´ïGí„ O§1á5žzEHYÉÕ ²À‰h¬£xÞß: @¶]%$»Z¶Œ…3yLn³V=dLÝþ( õÌÄŸÐd`ìð±6×=ìéCfчX’i°èi÷Z;žag|/IÿJÍ‚-~sÆ:fåEKø°¤Ø¤4`Ê+#Ü$-íø´+pì\\€–ƒ±�iÎ*‰â­(¸¬¥åÚ8¹C‹ð(@G YÛ$‚óûõ^Ëz…þÌš¿  t»)»#7~ÔóJߊÎVÔÝ®þ)18;Ó IÓÉ^Ë'èM¸·Ò#5ê,O§þÞ”†y;”.£G ·7lí’0+Åw½,ù'Ÿhd`ÇM̨Ú^ÙÕ¼À.¡E¢p©þ®‚Z&Jè=Œ×x'ÿ‰Ù£ÇsšãœVóg?E&ˆí7—° «°êJ0Ï8p?=oÊvñ¤¤ö•![àT˜ŸhjÙ(ºûN„ y¯*úD’¯ª6OdŽ7è0WÊjL#ª‡,‹ºòç}¶D9]§†5ÏãgJ}|G&¯vZß+&‘k#ÞÊÐÔº[#Û~bc»äíë¾|q”*P¯(¦1S„Rë8"Æû�ŽYÞ[5Pøä&B‚€‹ñv%ò‹©`0E*þ›ðe~øŠË_½› úøOs!<ƒp’\àûj1ûøÍCøGùìÂiå#ÌÑ”RµÔ©Ô.+óŸãÀUmÊ«ü–÷,'r�}¨ìºT›xáÂJ†ë©°‘ô´ÉÁ¤þnYøR­Dôp%á4¹µÔºÊš~Òm¶ÕLUƬÓbqvFÏ@AÚÓv—Ì%#%§s.õ³U‘ ¼à mî.ŒŒ™{ OOÛ¢ÕÊ»û1K³K¡ÕÂkî›k€ÿ4Ššèëw¡™‰ßy"ƒó¹ck=’·"„›áUm5«v}õ9ÞF<9ˆ»,ì„RÜS“,Zžg}íVk·QÔѪmäNn!• óN¼g =·ïÿN—äncNØ¿Hëì^fÿF÷ÔÉžË_©©ÝùåJfÅ}ä ,®@Ÿ|4éÏøýädÜU8%Æ8F—æ?“æR†.årW‚ë¹?Ç ´Û†C±lìuÎùLqºVŸæL‰ ÈÆ´‘Ÿ^ Ñ_Š¡l°éµ+ߊGéMEÀ¦n40ø0’%Fp'F^g'›‹ŸXJ «Vo„(—¿’(@VD8>×å|uoi½™ôxV©Šæá§ß¿1‚eÄÝ_+|I.'D\DÁ8x„h|ИýÕôM>tlÖsáU¢W,^Z™ÝÅcœüÛã'Ul{‚Ÿ¶ñšåI_…(&æcé}TÂ.D„ ÎØéÕ¯­pw ÔƒTíÑaÞ>{Tž0hfÒQÔ‹cÀߨêΑE ÏŒ„NR=ó©è盿‘:v”kí¾n#o…eÏ[úõÙ9ëN|ÚùJz‚l~v—\6øòiðñh\JpÞP`g.ˆ-îRnØii’Io¼Z ê9e—Õ½@qÀ¥“jßÃÂóÇßÊ/o`ËñLüvÍ€¹ºÈâ?$,y{ÝåÅRï$ÄæÃQÖŒ*È7¡£ŸEÛ“^-_ë# |1Eº\ïVM—MÆâC�"/Þ|ÿ¶©0GÚ)ß- ¡lë‚Ùœ?¥yOàŸ- IŲR±=&±|7°+/¡5üEyšºG#µê†J�嬽/Áñô9¼ž1i33 ¼*Í¢I{Ðs†¾÷Ù½u·ö9½íûù.C¶púÜÏA=’½û“*âXýUÿ ¿A…Ûˆ}™ŸñÐb4–ÿí5©g‹^¹9ÏÓZõ|’>ÝUñĬÇçaám$ù/ôCø„šñSío) ‡¯©‰ÓÔ± ¸’ᆜÛÖ5u¡ö‚õP„úÅ—@̈}Íjaûz¼<:ü#ëTñˆÖ|müžÛLn”iv.ìò³Sð½#)Á[ÓuÆÁÁ\óì°fŽ×ƒüc·'ôæ ÂÑ0!"ë;s$jÒ�´…5ÊÆGÕÓ\Ú˜¬$)¿’_Ö´ðmð8:´ð"‘UbÊÛÅZüà w<æÐ]vVkÊnû§&Á z§ŠIO*K9ÞÄ _öõC¤ç3$’5/1âs­´ìV+¯<×TÌO^'-§}™™”“µ~/¨ÎHæRÙ+“ÏÏÍ!&:‰Irq] a—€a‹áø‹,Ä<šG�f*GT5±-³ñ*Å T‡ð®TÑ÷ÏD¿P'Ùˆc3T.½ù‘2Žn\˜Ç¤š8¥ô5…ÎPë2³Ô-¬n8÷íäÁդî;ÛâlT.²Âþ£bÑè½ìžŒˆàÂüDlþft–£àIJׄÌøûr“ÎVñ†x0) ÝÚÄójƱÛÞ�Îît]×…û3Á.¶æÀ@s‰öoÅŸ‚|5ºû£¡}!—ëvë˜2•¬Æ $Ë ø.½Ú®ñyÆDy³Ç¨†÷êŸïa‰—n8 &@2£îös_”ð|-ÙMbµñ˜p±ír á×-n\-nÝ*îÓM¸¦vî ¡zñ$*ÝK~ì‹F|~XŠ^¡L‘7¤])– ¸Â¯YÕ ð¥ˆÕ­"CéÞ-²Ë'�{ó—‚™ãêIŸ¶ÎÍÕ3?2ãi%"d¬´½¢ó¡Ë:v“¾2;ÔßeB}óiÝ2Içz=»6,Ýæûî¹¹ŽßìÝ—"/@½ùý`HY©›j¦ú˜àbd{·“< °££ˆ6 {QùÙ™ÒJ½pU‚ßdpÑКÈÊÒ¬@NäB.ßÔÊÑPÒœáûÁáY €zz¬`ÖŽK‡ÂQwåæSæÄÃ{îfƃ d5‰ÅéjÔëÙê­1ï-ë�'ø<.Z6QÿùUâ¨ýêôOw¦˜iŠßBb’M×4úà»@úsmňx2H’ßAÿ“¡_<1â.f˜ߡK;O.éÛwðE½>”¾UmŸÅ"LÚWNgùÙÑõzàÒýÊ/›ÛÖ?¼âÜŠJ›^âËÌáímsÔTÈ».¹nåS™¤s®µe¹–Ú¡[Ê< ÙÿuyEÞž¯„`sW­ó~„e¯¿7²$Éá+Ùs% q„äc3×ÚLŒàAÛÆt‰GŽÒë©�úój Ùö‡Òã÷DÌ+=gUø5ö=h{\ª}'Wóž«9S¿Ú­e€ïý™Ûvʈn¶-å(¾ 4F¬QH>PvÌx:ÜúDEZ´$IÐw–ð•ÍÉ#/”¿4*ÏøýÐkëÐÄé‰xàhQ9Æq¶÷G‹3JÚ„}¹)Ivy½ õvÂ9”&YºÚ"ÿ{xô•†|\^TÒñž¨ç*Ó©ÀŘDµúÊÚéÉö.}÷¯ùI?¦J£k‰[M¦H/MÀ]8yÃw¢˜uͪ—~;20d•’¹çåãßýbLôåÊ„Ã4cÏs¼c(´9lÌõâì[°<Žã{XÂdP¿å¦W$LdD훊Lª N5Üó!oÖ�§k\¼ðï_½uÕ,þr¥%aøŽ)ì@–Q&[—·éµi I)Ú!´b-¼ÿÿ›n~$5ÿBÌ:ï]öâ¾Útj;‡¢°PðW]TäÖ}+Sx£ú¶ŽÜóõÃÚµ‡Sªó6å¸ j4]¡Â™Ì¯‘ÖD2IR†õ”¥ô¹>"ðÁºò*'ï [ÏÜbYŸ¼«H\¡m°F×ËzÜb T`› d¡pí]Êr‡Eoöë÷OY^1Q¡@M¯–ų|óY°Œ£Z¾AÞ'yÉ ›ihd‚w““’°·ï ÆZ'¼ãÇ€=ˆû3a²{Ç8z<[½Cº©NÁiF"”m囤Q✤tp'‰æ–\ùt_MB“¢·÷Í5 •>ñeVn Ç<¥µ3ã ¬8J˜$'ÁiÁ;Ô¬‘ŒQl[Ìøµo™e¹Bâ†pí~¥ 1\Òš³ÁC/Î Œ”„¶ÞVÝ`‹¿Í»ðÞ›¹!ÌØ“fˆX:Õ•³+hxCׂ;nPˆ &–\&/°5àíôsÚòÀÎ|åÞ†Xh>£€"—Îá‘§+IµOÖF½Tä)nvdÎ3P¨²÷ðûòû¯èÞQÏ)‹ùCO‹;¯ôó×ÝôPáˆ(¿¶û¦'Â9D™¹%0¤Ç"ýsúÓÇÂJÖéRõTpZ¶¹ØöL ƒKžîFvؼOìØåÆV©*(8œgP”Io*¾y}JÛ~N+-Á÷þ:ù­tsuo¾@ÂGZ©n+Ü!™ÍGL—~ú¤óµµ45Ýòî‚x¸=kk%†²Ë1Tײ¥(œ6‡¶o/*V_]Pp)u攎˜cáÚO«MÜÀck€?B$l "]Ú¾Ô›3– í¿Á2¹.·t|åmÔç@!‘¸meÂjóhòœ\ 7­ª»Ø|_09¨¬aÐP¿AWaD§a(B‚|eÛ%x„hè@øáæ#nŒò‚ý¾@éW“õÎ0ĵò]5a.³—=ŽÁôñ®c>¾ƒ2rö5nì•Uõ…wÉ £«Îe.Xè“9ˆŠbrñ0\Q'ÒÚÑ%Ù]y °¶ÑP*Ðøæ‹dê/gÄn„ïÁ ½‘ŠªL~„Mà¾åOrQïÜpíZе‹¸hƒþЕR±MþPÄêjúeÃÏ¢g¾OØ'¶£oÏ'3X­Ü8Þ|Œ*atÅhR^wý¤/¬eîwŸ“€ˆü0˜$bï37zPØó#º%Áâ3r Nq´IüØpE^Î_À⨟¾´ÖŽ»Y~­Z •(ë^íÆûWí‘,ó$ß�ºVOs9êG2ty2@Oh¢îøèA÷ò1”]'¤E•xBKà*ˆÁ'ä ¼OJ«¬òÖsZk[’Û¹·qB—`l©$^/]¸ÍÉ.Ó.&{|Lƒ¤yt2a¤Hò‘0|ˆØ4‹ú±_åj_!‚Ö¼1…’x‘+s}Bš&.!s"RÏ3ÁÝ3õ†L$õá=+"kM$ÒÂÂ(ªy¹ Õ¥7¬¢>DÞ‰>ÞyþùÙ¯ ²"nkžV~Â5koûÌ•Õ>"èØp„PBá}•÷Í­t±!£w» ®XÁ³EÚ¾û�€©.»qº¿Ô(þhúëžÆù_Ò®qëÔÉYlƒVü%“¯ñ U7ærX„bƒÐ‡Ãk­V'VG1-ŸçP@ú¬òåºO±ÛõG)µ¨ž‡ÉÚíUêܱ²Ss®zU"å\|@0* A2ß�ù¾dg…TØ(\eX@ÔIJª)'‹úì>à¨|ñ‡žhöHí9¡=çP¶š²Þö.Îoœ‚“¿ÓÞѵÐî'4È•æ†8¿DÖeXáª(~L„¯.ÜMALã´çcÅF7H¾]î5IØàçÓ¶W8~ãKü6£©YågØIì÷ÎB~±¾ÕO.aÇÔÊ#Äzî¢oM³ÖRp¹kª×›¢o2ÃMa©Ü¡QPªì?sõpÒžFÇ?Üä/ë‰àëd` žÉfö;dãVà¬Á¢Íò‰Aêlìæ±ë™Vnt †Œ9”H`¡í‡Ñ‘òÆøï/ôQ“ÆA\·É� î”È\±¾Å¾÷¶õbx>¾@ÁÙä¤éÙh$-‹ªÛóù«÷Ð<(‚÷çåG̼69IÔ‚kÈ„odÝ0ê1]½‡„q#¿ «÷¹ãøq›yó"R¿+ìuKC²$èÔ¸?LBX¾ÞCÛö_ûh|PÊíš²gQÂ|EˆqcyÅܤš8PÕ˜îbûì_ %òWÌsm¯;;}Ë1|b&u*3Íü€{hñNêvÅ6>,eÚ‘õ1ô1»/ËLj”dÚ5!ä¢e3Òjµ¦åtu–s€¶'øÓÝÂyˆˆÆZ¼®ŠÞ“_†ûïØJv¤®Û v`ºî»NëûZøÚ¸}ñ©QÔôLgùáêîÊ^Ü6…Sn ëÔ¨�¯W-m£ñÓö½Dêt>5¹Ñ»ÔŒ‹ª ÜÃêm+Ä÷gŽëMîUBI+z¶Æ… r‹8W sA‰ˆüÙÁQëvk…û‡“*»ûWjæ,’ÆÏŸ‘´5ßàó~ø:ˆ´ÝJBWEôÀ…ðɼ¨~± ›C’‘î“B6ÙVÙì'þ&!L…Æ<®Ó6[nÁ®â£1Œ·Ã¥g‚³ZPÐëϵÍßþRÞ‡ endstream endobj 65 0 obj << /Length1 2222 /Length2 13823 /Length3 0 /Length 15153 /Filter /FlateDecode >> stream xÚ¶eT\ÙÖŠ;Hp…»;—àî^@áîîîîàîîîÜ]‚CðGºïíôýÞûñFQuæò5÷Zû‘¼ ‘HÌÆÚ‘Ž‰ž‘ ,£$­¬ÌÄ`dd¡gddF #S6s´ýÑ ©‚ìÌl¬¹ÿe#l:¾ÉD€Žo¦26Ö�I'K� €‰›‰ƒ›‘ÀÌÈÈõ_C{n€ÐÙÌ C´±9 ÛØºÙ›™˜:¾eúï#€Ò ÀÄÅÅAû—;@Ð dof´È�MAVo –�%C3£Ûÿ„ üdêèhËÍÀàââB´r ·±7ᣢ¸˜9šA {gàwÛ�Y èŸæèÈ�ʦf«”lŒ]€ö À›ÀÒÌdíðæädm²¼å(IHälAÖKÿm@ ø=�&z¦ÂýÇûw 3뿜††6V¶@k73k€±™% '&MïèêH �Zý6Z:ؼùf–@ƒ7ƒ¿ŠÄ�À·ÿÓ¡ƒ¡½™­£½ƒ™åï.~‡y#ZÔÚHØÆÊ díè€ð»>3{áón ÿ±…µ‹µÇllfmdü»#'[k3;'„ȬÞDd& G�###çÛÁ‚ì� WCS†ßI”ÝlA)™~‹ßúðò°µ±¿µò23½ý x8�A�G{'—Ç¿ÿ‹˜˜�Ff†Ž�‰™5Ÿèobñßøm ìÍ\ZŒoCÈ`üýùçIçmÎŒl¬-Ýþ˜ÿuÐ B¢²ªBê4ÿ4ýZHÈÆàAÇÌ cfa°3q�عØ^ÿHhöŸBþå*amlàú»Þ7¢þ[³óò?{BøßX²6o Pþ™wmF6F÷/¦ÿßSÿ—Ëÿ×°ÿŽòÿcÞÿoMbN––YPþ×äÿe´2³tûÍÛ;9¾­ƒŒÍÛRXÿ_S5Ðß[,22s²ú¿Z GàÛZZ›¼6=+ûßb313W‘¼™£¡é_cò·Xå÷ÚYšYƒämÌ~_5�:&FÆÿ£{Û5C‹·ëÄám:ÿRÞV鳊ZÚýÞ9f6v�ÐÞè†Àø6TÌll�¦·å4¹þ5Ï�zkÇ7À[‡^�c{„ßGËÎ`þ-úqDÿAL�†Ïÿ NF�ƒüÄ `PüƒX� J+€Aùb0¨üAì�Õ?è-ŸÆ?ˆë­àÄ `0øƒÞ, ÿAlo:CË7Òþ+aeý-±²úãÿ›M£Á·n@"¼Õñ÷iþÓûo½ÓÛ(þqykÒøË[“ÆfÎÿŠñ[mãdÿ/‡7“?ßô&¿ß ›¼jú§ì7rLÝlMAÖÿ²x“™ý ¾±bñ/øÖúŸÙßz´ü=ôoDYýo7ߨlo±¬ßæê_ú·®mþ”óæló?ê·lÿ¨ß‚Ù¾½?¬-AƈceúÔþø|›Û·M·ùs¬oôØZ:ý©–å ;'G‘Á¿hgz“þ‹1¦7>þ¸°ýF çÆöfîðvoþqxËü§Ž·Ë‡ÁÑÔô¯s{kÃÑÅæ_o´8ý ¾Qìü/øFŠËøv¡2ü+ó[x·¿àÿ쥡“ý#Ž]¡oKû_ü׋r",ÎÛòš×¶ÿªÄs¡ÛgéeW¹}u"dEˆ²ߦ‡ø&‹mQ‚ÇšsÙ”%"?bÊW©) ‹'ÅábÁ%ÔA‹þ>B< ÷„¾î“,7Ò9åäc/n\$vÊ—Ca·~ñ3¢²[ 2>á1t¥` ‚_šûvr0xËò*àå橸0üʉ[z+pÃÌuŠ0šû‡¤ Jv5NÝSHj"6žÜ½¯è@ן›ïBfó™ þŒàX{n€§QÂÁÝ9ÖÅü`Ú!%Ð ÞM[þ•bÿж`ènQ2Þ›„”מC³-àô-±PDlþtŒ¹õF"JNÇÖ…ob–:{)ÕÞØÅï¸ÀTüg´{6GÉñ/ûŒ8åÙôé.³éQ}’]¨/²Ÿ0ƒs$HC„ÔÂ'LŃ[šNpn_-ãvÅØãtõêqà5žæ7P}•%UËöÑNA´ˆÐör"=3úR@­<üSOšIÊô‘©ÍùÞ¢bÊZœíL-@×ÄmŠÅ¼9nþigÍóžò½J·àº ™)&š¸u÷“©zŸÎ,:þ‚8/m¤¼ñ¨‚:“ àû8³¹.f$©@]D(¨f¡ [½ÊLǧgHßgÄÁ½Z4{À^KG)ÝÚ¡ø* SÊhø÷î§¡Œ–)È ´>hã­>‡¢ª¤pêO0ªã•,1ΡÝF¥-ºØ­Ó“`zRÄ.ƒˆUAžåL`–Ã!£4ÐcCÃîM¿Gv;Rö$ª.wÕNé¯'ì £. j À_õ¬ßEåBíAA’çFÀì sÀŒD²x-$)Là‚0b¨6]*ìg=9cÀ/‡ï˶®¼ˆ~¶½'‘S»4#äâÅ¡=Œ°5þAΪn ©seZõ:Så¾RBçȆ7 Õ°[å†Agfv‡ [‰ÞhÖÒa@š4µ³3…ñ匃ècÙUèMa0úÉ{'¶³vbV\[žx•x<û^_ÃÛÚ+ŸÝ”J˜"H6løÊ¦“'0†Ïß“¸55)”t„e˜Q¾zÀd¦@ÉedrØšåÄ–:ŒÀQ¶¢ÀX4 â~¤’¡GÑùÕS§¨¡;Cn¾îZ‰~§“ü8++|‡á¼ÝÞ+¨%äPÔçÿ£· €¶­ë—»úJƒà˜‚‘ª|ì›ÄÞëopNÚŸbw§ ˜‹/6ª SÃîp®%À  ëÊTËnsò 2êÍ~Hz•õÒòéÛ¼ˆõ©Ÿ¾ÿãþTbZ.„ê Ž¬SèL¤7‹)BLSò;Ûk4?-*y½’íhiÇÏäo|)íaƒ+ t IµçeÈ×6î°5@±×›1Zýaýôn4ôýUm]½2cT -õi!ž¤<ÐöÌ—7e)ÂLÆø0Á÷øV!ðrê¼צɿ‹þbßbS7Ö=¦‡9íˆÉûThLãz§6¼^Vá]"ZùSôÕ‘Ó»èƒHMH½EyA…DÁ4>UãŽÃ´Š’_bQEë@ R~a7Þw=P—š‰(\†Ÿ¥™Ô®‰us‹p``o™HŽ´ßñ£bE‚>RvÚ®už\.©ÇázYÿÕ_¿™*·Ò–V䊓–IJ—·ÄJ72¥qwLï.H;÷"Â'¶ÿaÁÙPý æ^]U%z‚þ£³²V÷ÞYiÔ†„|îÅ:e^”¼ !ÿÒsñÖª©¤ëIm½*”ÒqŠÂ Z–¬PwÆG×S_vÝYažï¸d„rítÑù> ÁlŒ¸ '?oÒèܲ²e¹rjQœV}+[»õy„ªat@ºúöÓÓÒ¶?4ÛMÖ9Ù»'Ý-©ÃYåeÄÐ\Œša¤ö~% NìIKËŸBÛïÀN·1–’ Ì ðyLO$¹æH˜ØY@ý&ÝmP¯ðv%•bX‚ˆÑFŸ{ö‚¼VMÁM¸\|×%i˜+§TYëЬÕ(NÙ0ÒØ?Ú7äãwú²ì\  (Ý©ÚN½¶bÇ\ÖšÏÌ„íO[Ò/ÂïʹŽŽYéO‹*~æ örM}QŒs[íè1‚”G÷ hÇü’×ÔŽb:Ãþ‰`ظÅh7f®„ÓÀwÿñÝÓV9œ WÛ:M!XŒb_5–­MÞûìËÇÜLé°±=ŒCúå*on°ŠE¢ËPÌÁ ]Ë}xþgþ¤Œ /~•O§²Âa”3Vù3÷£``ßÒkÝ/ýÎò§¬’çz´„Ìjž”óék›Û¸1ô ø¢\2îÅ; Ee29"›¯²ÉêÏæú…,÷èSzæhšX;¡ÆÈߟ¿v8·2wÏ}BhÀ_&1yRžÏ[È…6O6!KÉby鈦x&åz¦¦‹>µ(Ëè2ÏS§MžèíÍ æ ·Û’aTäO�_°ûI)êœ]ŸïY«h?@sê© 6íX Ô0ú„Î=9Y‹"_ÖºMÙn¸öH°Óè,¹õðRçÛê¬D/HA.¡¹ËÈh[½gEÑ­ X‘f`t ·(ÍÓ’NWe˜†¤WÒ%Aþ´û­¬Á7áóýnýȆ%H Ì#çýÙË&îׇM£ÊÓê¾4¸gŠÊÜIl©Zn•°Ëã?>壿 «ì”¤yÕR›•0¹ËBæ8p¢ûF4rOš×{?Ñ«‘‰žŠp„nŒ:É¢Ü.¿ò0Æü¹¥†>û =õ÷)÷Ìð¹IìTÂïÔÙc™YÑW|ĉëâ"¼•Ì]\*´ ¢~D›Ýre0Šºø\+ñï›Úç¨ }.‰Z?õÔb\¢Ifvà­ [<Ýl|—ƒªŽVì;ò17Áx5¬"3üd!›?R=ƒeF·8*çT¦DPe=…B«ƒ­DŒs_ŠÚ3ÁGÏROq…·³ùîLÀ³å M}˜§Q·Iˆo&Íè’AëzâL9¤ÑëY;æä¹óí?Xëæ“=¢¾$$±Âk¹¤³ZJS˜ÛBÿFè(]ZùÏÜ ƒcK7rõê‰ ÝÀÎòŽŽ’#­QçBìŠó¶plñ ³¤‰Éðõºé†W¶Ú¶dö!A>ÒË}o£6%l“¯Q|ˆ×L¹¶ÐFàìy̾ª¾5çΙ‘륳'-äÇÏ'=T[­˜âK|®%û*ˆÝ¬ô žšl¤Zúf\Ï„ü–ôˆëÐÓXï³Ä纒QîÏF¨¢N¼'é²n¬|¬ZwŽPhâÅõXÇÊ: jiM°ñF\E˜¯Z¦ºzÚveù]É-b‰×«x±;C¬±h’°Ÿ‰—ìKvÊäÓ J™oüy޳Êzš³hàY ³sÂçVµÐ˜‚°ÍïÊä­ßÑäm=L/(¨Ê8"¦|…ä3Ácæ`á@Pc‰ƒHe4ÙÞ/:Aþuf4Ã+ªW–&Ä–83Îî§ùÀ�f§a –´Hs%3¹[òõûgD‘Fµ_?èÙÖ>ú·i̲S©Ð­CÞMv2$7iv¡ÉRçÉHZ*¿¿á…î~yªCNïg8ôbp[äHÐŽˆÔW� ’Z£‰å.Å;:YÁßá2÷ü¤aNÅÞ°^<•˜™¤Úƒ«—ínÿQŠ%IõèæÕI‚¦y<’¸YÔh- ß’ÎPºZg8ú×(D â!/ÑJUZJ®×¬ø€H[™øÇ„c܈IÛ´<Å^Ž ë+îh?£ĉᥑls(m5\Ø =€kÔ{Fí,u4ð�dxµW¦Âo¨;"!Þà$®ûò6¡&ý ŠáWEÓîì@žŽ¿¢q¾'ðO]&ä&vmXÁ ;“Í~[k©]³§ûù‚©@Ø$x‘È|<<ðؘéj}ÂK…¦ÂGÏS0¥•@‚¢fñ´Í¤eÝæW.®b=~ÅŠ\€ôXU!¸©´—úP4ÍIòv}N;E;ãKÐBùë&h…¬˜æ—™1Iæ†íïïÍÑ Þ’†—Ž#Ýê>]4ŒÄýâ·ìø¤—ÖãÚ!±‹˜È™0è[臨„uà’ÅÑî´SsÄ?ä÷•\b{eGbý«Ç ٠Ͳá9Âa$gü‹˜˜#[TXÜóD8¢Mf´¶ÙX)“¥Øpqß/¦-6Fç\ñ„¶@ÿsä#ý4,‰­Cáùmž €_Ü'Ú ü…—Ý®ËiÓ_êêMÐÙÇã¼¢ %¨ŒÑñ±ÓHU“× >øÖ*dm(^ÍþvD'TÄ–Á‚µl•¹Í›Gkåc’lYoj4/­Büæ ۵ɾ_‚¦X …¦„BP¿tÌþÃf%©y 8ŸFs Ú!6¦éÄ ,/øcþ«.4¸{ÝÒB‚ÄľýU?¥!Ò™$b²=Âdù‹Är¼Ô±gÍKð€÷ö»†%Eüâ¯WBèÞÏBá…Fƒ³<¢s›o§�Ÿ¡4ÌãNwóòBú¿ª:ù‰-ÏW&3„¡ù ×lÒÞö˜3³û±ô ïnÇNŘ÷"T]Ÿ«ºk\Ý„ãF™Á·Ù_ ­^5åÅ_‘7Ù´þr2[š8¨júÀÁ’±ÞQ6Ç®ñ³|7ž…„Ý×ü±,ÃT«` ¾—™}µy-q\zþBÃð>’þºŒN›Ùhóbf«È%uƒŠÆ)n)€î GKQ陋Ãu>ûªv_«5îê1{ Ã47¿2„-áãÊ3C¿.M¯v¬ç›×~žúJzòÃgˆL„â<=üIùå+Öl½å˸pÉpP7#u'€Ä¹bä`-Ñ­ÚWÀ»@Ã2µZ§¨¦o­¶‹³äôüN8ÜéŒøx›piáåF©h±1Òuž*Óõ$ ÐaAôÓÆ®·btr³�x‹ÂÉÅ© Ç««öeˆ¨y,Êøõ.H¿r÷¼x`{¨Û_=´©Õ/¸ì®Bäi¾c¸‘Ø þ ÐÎ\pðªz¥ž'ÖÉ9îQe‚¦µòá±Ý©¥Dê8Iùàp8>€ÕãØ¿ÖÕåÛÍÉí£cˆÆjC»±Ë}pèŒ?ÙXöж;Ÿ·¦Ó¬qÎæ<@¹H Á“¹…p–ŠúeÅ%hé”Vº_ö±¦!ÊÞŽRF¡lð°Ã›Í µå8ý>„šN"ZV£!>ͪÜWj—dUïr ·åµŠîG@*ÈÂÔúŒÜçQÞ4¨…q¨ÐSt#®æº˜O½úŽš›ÙÈáM]‘‡8µ{/É÷¹`ƒM,§AS „Bá™PuXèò;=Ž<¾“½Þò¶lÙ“D½Ž†d÷Ãß‹j‚ÂsOL<«µ“ëÜæ‹œ+W7©`•CÖ1Ì–ŽI¦>SÚóíóYYþçA¦§tjÁ^IRYÙ"ߎkDÏgÜ}ÅÛKõ0ÀÒº9«F\Yb„­‚v °¨”Uúçô°N±>MÀ˜kð#Và¼3ç1O«jšGÔaü†é$UM~«]µ8u)Žf}á>{SæDÄ8"ç }ñë³÷ gêÜ AOß7š5ɦ›• îW,‹E:#YÌ/t㦂¼U#¹<2âçdZ\t|–’Î3â _ª ø×pÀö äÔæ´a=³èÏÕ(œÌNáM\YqjÁ9Þ‹ F²|l=Lék\¯aˆ‹æp¡ŽÞ‰AŒók~_ ÇÈ_­±Xž¶h+[:ÙOe[r$¡¦ˆšKÖp­«§¦ÏEwçcÖ v㉑ƒDb.š“ÖVâáVàªÄ—²3› @+”z–± à'„lB̫׼ͧ žŠW¼GVb)ßu®2ªòôòo‡Kî¡Â€êm 0;bÇÉ,kþ…’*)p¤¦8°áyÚð1N((þ/„©Ät¢ 4æBD·¸l¥£Ýý‡ãù £z®£M¡;,ZZž¯.Ü W` ¹’€‚eóU;11Üaꤳ"`Óê×ò™ÚšG²¶‰ GYZŸûîÄg ?±šq]ê‰xzDÖE„ùAÕµ½°w*–ÊIÂD.³16˜Øâµ»Õ‡=îkß9³™’Ã’!R>†HW¼ôBiÅpØ;‹õÕŸo£§8mÄO·¢üfSÇŽXýàÇÏ÷Üâ¥K'>6$ÑŸ´éPÆõA1œ^èl^U9øP2T€šñc¾ïü„õˆÕJGÜÈSŒž[_Y¢{öÕ¨ƒ!ôÚ%hÍH�3«énCÖälª‡ii¨þvã¿|b¬ÆF- ß®?uG,Â[/ωŽïÓË]æÂ,u—‘X¥|ÄŠBT¥€ ÕÞ‡"åþ ž8HUIJè*"õ^íxu¿Îž°¤½¥Š.N±¯^ßWbV9ȘüÙt‡Âœûý¶¤õíTF³ßþ]–(ìñfỜ+€û®WÒíw½ÇƒítÔçhðvå¤z&?!acG Á2ÂüÈßB¬WF@삱!H Ù¡_%Qs½¤ºƒÏøÑb ’�VÌ$å×ç !D›Îgã]~røÂ¤_÷b<Ò:Ÿ}*˜äu.çG‘Í­È.-à›ñ‹´F@iüUhø2‰‡^­‹5¢4mUˆÓÈsE¡®hhßY)rúdìÌdÉêXšmc,lÉ,ËÑ S©!×nÕZ¶BŽrÍhÑëŒl2Ûûó¶¡ÂàA7ó/cØ–sŠåö¯Z†Œ§%Ö ’Ï ƒšÚsncdp›[”‘¼Ó¦ìdž µ\m¯ÞÖÏñhÌP€žlÅW ÌcŽÐŠü»|Þ€q†ÀžcÈì)SóÑÏÓá"¸î¡B„_‘Ä+*`rGœ®!î ˆv—x¬]6ÔŸW]’Ĥ!(éŒn™i³bf·s¹±-D J-wqv‘Ž”ã¯ø²ÔðSÌGÐÜWÜ'žŸ¶^è0I¢èÌîù.#}ä}tbÍéO´ó•zø#÷/BÒŨywÛf(Oœ¿HIsÅWÁƒ–¥ÅñQ#˜ª3·=ªíÀtÚ?#ùûë]ÒDÓor•ú=#À^Ãå`cƒGt*è†zÇ7·Š|¥´ƒÀqFÃR§Ï:†cbPãS¦4A+ˆàÐ?ù  ôX"|W¾t9 ){¿,²Ç=T¸[Á—]ª|²=²b¯LÌSy8Óù6Ø\Õ™Ëzì–¸Äm5ÉCííÞ¾€”o3Y;~ÜÉ„ÉS¬(`Öþ™AÅ©†ýÄä[च„B°¸Ù‹¡~)¹»“WE›öK€Äw=7©$Ú{ß´‰C#ó­­u¿-WÒ¤JM£íW0,mÐ<ˆÞ+K)F7Ö= þ—Íæó Ã4àËai‰„¥[†)(j¡YS°·þ‹+ªzœs#ŸEÀ>\!}²DnM¨ÓŒœ¬S1^Û .דVK?AOËh­†pÃRLƒ]-øÀ´>Ï Áí�ÔdÎÁX|JªîÁ½˜%* #çÜ‘ÞÌɦ‚®ë-Á$4}b ƒû0¿‰øØƒñyšžx+Gåž4 Éã{@´ºÑÂ`ðÖW8¤ëõáñ]¾*¾Xž2N7”*š¾äçˆì#tù¸Ë°•YÛ$4Gò×/dŸcB&õŽà¯�U»Y¸°½þ9©«$¾‚ÅaÌm6ž¢ÆóšéPx{}¿Â>ìæË&W¦a}ÊKñÖÉLžñ¯‡!N“=cú™é¶s!¿²´Õf¤kð¥p·B2”Ò•´ÚïÚ¥áõò+8WXèj!ÌàVv³;Yû1–—ˆsšl„?ľÐðaŽÎÞ}xoG'á¸|bH­Ó9=üÏT‡n@›—y9+µmHbU™Dt†È[X¿Tl:ý‚ÕUÌTfÁ¶)Îe¿µÁ™”zº\!½´××í˜ÞÖ²>Z»g…æÜå¦Ñãr†ô²ÖªrçÔ„7 SìX`ÀUº¼[QÿÑTHš+›®³3j}´j|‚ o»…=ÎÀì݃"ùÈœ²ÿ÷QÊJ%Ìn̆¼A´¥‚g½C`ê àJ‘¶Ô¸¶ÞÜjkpŸ„÷Ü·Æàz … ÑØQGËŽ:(> ÃOîør(¶Œ¨Aÿ€¡kÞ<±!„~J³ý…Dhã÷˜ïüÇ!ÍF ©Õ)ÕΪ¤wKØÕ6€D#119t܅އ‹Ñ⢵ó}ÑÄj°Ü„ÊÄsõ×ÂCñ¶=hs¼u]ñì#Aø®¸¨>Üį?‘Hö$·¸ž8ZRµ#ñ!… ãÂðŠn\¼Îúv~} owÍ©Ž³]ÔpITn•Àlë¬r>Z¾¯¶Q³–ßÀ9ÔùÊcà–ˆÔHìRdÔÓZ™b=þ#Û£_ æKA>ÈŒº˜ÉëÚVU8#,Ò©_Ó o ’¡µ{ÐDŠ›ýF­WÃüêϰ9¶Èä éìÄUÞ¸—½õP¦À,Ø œìÆÊž½ =Ï0aË’zÚ†vhNor!QC³ì›8}Ÿˆ-wd•f܃4ñÞGé$H=ÄÉÚuwÝZ:i?`hy ŸÏBi¢jùúŽŸàÁâeöÛ! ?p;Ü;13ùPºÌzÁÂèÒÑHêœrgn aÌs<€MkOŠˆºÈºMz÷4å »ùc¡Îå5Cí®ÕC;õVæÏ!ƒW¢ÉôÜÊ1Å“g±p±×jv‡Äã|Ÿ3ûƒæaÓê4"ú˜I€æ8ñ²¼õ.'µˆ>”TŸLž ‚ˆkå|œÕ\NfÅ/¹÷KЗ\#‹S_ßÙÎîVªÉ¯ßHÆ9\˜aŠês\p¸Ó¯‘ù^#“boÔ Í©x\(o&ûÞ=³_Eª]šÞ™eüÒ%âÜ@B*ˆQÝκYÔMÌÖC8x7ܧ)>ñ¹Š¥paŠ1¼ûýÄÜQdÚ~»‰u@„®¾b˜´†¾÷õMÈj›H™² ÌnjڶݑÚ? ï•6;ÉAbz­ÝÍC*´³w2á ¸×ç•cøO Ç[ÞÌ ËzuïqŒFOÈž)lÔP„JJX–Íã=Ä?†p5t'vÎ\2»3Ø=±|#»VYÖÒ¶Ú‡m§í3 1úyy) Õn.×EÁÜbu{ìa¿©s®ÖBštW¼ ì¯J­]š�5 :¹ö•€²ÒÕä¥÷s;DЯ ¨lýW4᩾¥ERt»LÇî5 –«—iV+§“2ë]Ë~ØË¢ë*ÿî>­´‰¢•D’pû5…Åþ _ ž Qeñ¦•ÖÏu¯vÇ(ç¹2×Ç6lSËwÌî¼ÊÖ¿–KtÀ*l@œÑq*³T¿­ šˆs3'¤J®¼ ÎÏ„Ì{û˱b+ÓÈR¶˜—40Y¬F’¬M�ë4Is`‰¸lÿÜ?JY«ïdk°½- âÖ€¡R?Èw£×—ÓS4Þùí`_W›|{V3_ªƒa鸣•Œ:x›�q0áú.ßÜîøDˆ®­Áà©(SoÂ.Ìè:’‡6c æ ÷g9˜jŠo³¹{øPj`²–9¦åŸ~™©Ý Ù”‘ÊwJº2¥²É|Ç×'ð‰äg„Hô7(·Žð˜ ÞDa[OøÌP[A è9>û•Q> °ŽÚY(ˆIÎÀh@ÖE¿$@4qÌ7‡á3^Å~*¡-2ÌÎ~­�‡Íµ^~ÅŠ‘Ta~›É|M$‹ÕMë ³ZUQì}žLš´7viO´¤–Úàÿ”4~¦zÊö­nÀrê mn |KÕ[äDf}18ïîgJG‹¼.©d²©cû 4Î^ÎU(˜¥ûê1X¹õæ³Å±V?kÔ‚>üOÊuXÓ2¼ÄÏÁ%”êÕ“è£\O+Ž÷®¡»]F %V×lGXØ&MI3ñÐ÷íúQá¹3 \äÂGejÌ,±Fıœ«òø žTœáœâs…ïvÆóŒwyq ø ÂÒf‹S=~1kS§»8‹¤¹B¤uk˜)¾ŒÜý)" &3‰Q1ˆò %«7Ø”ŠsYÊð’‡Ì/ ³C{ñò´°ÝGVÙŒ¹²tC‹Ë5¥HF1Í·šñ,HúðÂì÷ õZ¼o½ üõY(x&{4yí ?ø±]=ä~:¦GžÆn¡šå‰Ø}.9r—.©ãoH¦ë¼\ýòOg”<~5ŽùxãÈë¡y²²!^a=Wg@Ä­’ž»%q€…†ðd@…¯rÎ’èÓ–¶ãÀF Ö´i±s0ºM¦ç×§å»ÙoõêÑå"žÆDe) ‘(tËH±$T >þ'ÛÎw§7lóÍ¡?qncã‹LŸÚ3íZN—;wLCÞɧ›B9 ýš–àòi×°ó¢°:v¬}Üð¡ÿI.Cqݾ†2þÉÊWŸ±œÚlݤså›úì”T££`ê ²Ç2ó£u"Ý2@ ‰œ¢†„zŽº#4€€o;µ6 CÇ=%4ö…àS‘‘4³Ç­¿ÍP±yvàL%Eý3¿Ü¹ìæØîÍG'“;ØêØX5Aq2œë)ƒÀ³~7XD¼Ý;ÝÖ¸P\r@ø0A±™ÐöÅ¡0rc½ËµÒ«¨$®W¥j¡VE¼xȲ„GÅ^Msªt8¢ڔы› 1÷¡\Ãâ¢xìhöÉž"H÷¨Ž5ïr¸ŽŒTtb!n—^¯Zl¾~xÀŽßg(íá¡It²¥àzç8¨t»ÜG¥ÅT †º°Äáüi ËÂà#’ìÊdU&°†˜ìçÚ}?Í>f7êûºÌÞµÈs8~ÍR½$'¯qg¬ï­÷HøûÇ~ïö:ÝÎFÃǯò” E*h ›/êv›¥{â Õ‚FÇÚÇsIC.BpÊ ÇðRµ%“>ñò³#t>‚_)3.Šfü̾þ§Ò ¾‚fvÝŇ>,¦¾Ë-˜U;œÌÖ «Žô®!y¹‚€|4¨:„j°4Rس¤¢Û UZÌ<5ÇmôT?ª}ßQç6ö©lÙˆÚ…†‚묑€ü²Ý ÎÚV8~P¡@fàêÉø"ÉÖ”¸8,AÛø~JćwÎWö[<‡$»Zòú:†½UÆ}ª+ª`‡sCVç‚9WÛëûFg]†Ÿš)ï΢uöÑ‹ÌvFê `Ѫ¿q^ˆ¤ÍìÐÕÁ…}‰t‘¥«‹¶ÈÙ'íüáHö½ŽŸ^ïKdØØéE E12½Ñ)䬑€ÞøÍ.̦/ˆUÄžÆÚp¿‘GÓnÍ•HìˇaÙ]«’½¹Ð"z©_ä»tìIã—âo˃BçÌU´J*±ã\%¬zpÛzqæ´Ê{(­¼}á¿Q¹" ·l¼—¿¹PKFƒÔ)žª0_5}åÌÍp6„uºUÕU¥³¡-â š)]fÎëO|}̆«Zƒ~Ú7ЃÂzîÐÚ¶ò<ÊÒG+ÊÞ¡*žm<~>a—i ÌV'ciO;<˷ש‚oåãk.é N‰\ Wêæ9“z%8wq:"ÄOKª©ÎŸµ±ç_ R •VqH]S~öš¥v¦¥—ÂjhÀ!âýÕÏ0áÊ_ΔyQa¡£Úg Mê¾ëoUs¢O“f^YáÁü•…Sþ`¨‰ò|Þ»'Û«Qt´Êó’ w!{»]ßLùqÊÞ ÅL2­úÎHfÆYà°Ÿ®‘µí=ÿ¿÷ù{*"¥cþ¸|‹ûS=¨ îl4'HÛ òò‚Q•K¾žX,-ÃÄl¼I)0¿•–ݤ�S²hµòdz;4,p³2÷õ«1÷÷]Ä b°”®ßh½n¥Oã½73ðÏqÕ{ž¯ˆÐçH7O$Ÿœ?º±<=ÇÖBïî]ê%QèBþ Ë_‚ƒtPZ ´_¿þ³Ó*ÂAÖ¬ËI汓ŠÁÃ|g ^ÝÖ”.ÃA²'ùd–ôƒ~Ä[:;a®Y4N{œ¥ˆ…ÐÝ{í!gp]Üâ ¤&e$Ï/®@"nBG ›z8ä)Áî–Ðè­ˆb~iT†Ç‘ؤˆµDKÞw½Ò8ë¶áµÈêËþ C€ßý§[SIaøU¾»f§áÂpÇõòƒäi£Å1=ó¯&n¯k«]ò$<«.þïo±‡êêüŠqyìyU”œcOØ{g݃•L!quWÎwNTC|¸“@´m¢Zá‰Sʦz‡Åz›pµF¨ÎÖí%ЫP)ÂÉ‘»KŸ5òÎ(±)ä8!ÇÜÔ|PŸŠ«Œy'M¶’¦yÃŒ_©¾L¬ÍÑ1á)¥ìk"SÔ‚—z•yO$Ükûñ»áÐR™FŠ8"Ïî» ñ'èp.ô²ÝÅ÷6€î¾¯+Egȧ¬1€ ©»&Ùecßá®;-S®óê…4^q9¸óm «ª`¯ b`OµYˆ°Å~ bE*å”U»›û±™2†‡‹!!ºø*1÷naTפ­åêùRæ–­^C¾ ݬ¥(úž¿õÐ%Ã5µ"~º,—ù©éöÑçØRxšf¢•劀>{-ÿ±HíÇ)¹W|1–•ý³ íàvÅ3ÓtwºK,Žš¼—T`8qËX¦ð¡ \ëfYIƒ¤XóQnqËÄbPßú~¡7KN ,)LˆÉ7 鮘‡­±ÍÍá¸Õ´Z«õ[R«£ÿ)9å6µ#ÑûÑQÞÁKT›kÌ/.Jeõþãc@ûà÷ñ7Û!u¤©«­'kÏ“îðõžÈÇ@qTYZ®DFã+ýæÈ侫†Ïuñ­™†[Êè„?Wl“uÀ}~˜÷ªV§ÜB�Ûù.¤ˆöQ4$C·^Ÿ#rœùuÐ ðtQ1v&jv Sž×n ZŸüÁ?¸›¿ó–­ÉÌÑÀà” í/ƒDŒê9 Å·òÄ"v–ì ;,}¹’„çÍíòCµ] ìÿ<(~®X@Ý5‚,Ó£×È;›[cƇ* œ†Ú�ŠïŽÌ®¸Ñø<Îv÷o¹ár®Rß–”ʻۢXí,…Õ¹¹è ™8ΰƒ]êÙIPĪ"Bk ·É‡º 5?qÃ^°wíZÔ’>öyCéHjgBÇÑÐÜX¸=âPxADÿ ª*•_Ât.¸±B$ˆD9’çÌ#ÏÝ(…mô,cÜ~A&<ºw˜3…ÿ†Â艼]D ôÕ;”¶=Ò½¥‰~[n'.E¸¿ä!BÅ ÏUÈžàâÉÆJÞ ^`#c ÛŒ’†j‹b‡[_2uŸìI)\+m•õøQÎù·ÓNÈè>MWÙ»ZïÚûA(ûgó&äÛE¹#îÑG¯³Žñ^&¹Î( á~/Ò¤\À~ó…A´ú=¤­œ„ä%©€Ë\"µH“ «íš(r˜Žé|o'†bÊFjGü ,‘½I7ìÍAbÌdÌ•ÂÛÎù/“žN)ysÅZì` „+ÊÁ Õ+(,Óp¶=9ŸØqZâõ±ÒA¶l@/ú˜'ŠÔ2Ô-ªBH‘A ‡þŒDÂàÕ3†v•€�ó:Ñû’ìdÜK&MÊ;Õ 0cv‘ÉòS­º§Œò¦­M»ÅÛ3fé–ÓŠSL¥×“jÕtÑ'ÁÑÜÁMnm¨ðŸä”\.,{Ãݰ‰ÎÎηˆß>! ²5³  WØy#èÈôµrš®%JÛFî,>ït©èìÏÒ10èûè\›vóߪì î0�ä[9‹ùÐM›íÊî¹ w¿$óÇ1° }!]öKŒÈi6°br(­{M=?„OûEÉÆòǰ÷)Ѓ+2_— Ž‘wÖ+ѦâRVÀÔÏðÓ¹ý»ßG1âéÆo…é~µÉ1­ XC{½˜ü”VÍ`y.‡3ˆûQÐìä„Ö2PZš û¸uS«D`’¯§‹Œþ§&S†qÞat]ÅÝ ÍElÈ@ù=‡2žîþ&<¾¥®?kõ¤¶¡«pðÉaÆþŒ‹ØØ–[GåÚ%5^§¤ 8&E(–·fR·æÙ)6`žL?ù2)tWVmåSWÆ\Îw/Œ²Ô9³±”´ý*ƒYõ§x"«@‘ªÌ+<Ñ£VÛÞ0¿”ó“OÐSØŒçHƒKƒqs¾µd­uOm9î7û"ú_†w^eVCe>š ’®lôx‘ÆòÆaï)êa{P’yêŽEGMuóKÈ=‡”¾Rзi+Ò4O{ 1}¹Mô!°;Xb݈º²cógÖî¸2šŒ3 M W€tbh-1a ŸÔAHNÖèñ¹/ð˜˜7ìIÞHÊ«ÅËZ@·­èÃt°o˜˜>A÷![…¤âhÿ5SŽ3½°ù{ñþNp0UNhÝëÃMüA•˜®Qô#­AYGË2‹µ×Zò¥kÑaÏ¥Œ©ªK:í IC¾ßª,_ÃÊ3díñLD‰®†+$ù7¯Váq•íÄÏÁY*ÔmÎcX“;QD‹L2ûD‚šÔ冊öÐXIîÙµ¥=‚"ü¶qÕàR ,òó~œe•Ì {Ù.¸[  ÎyèZÛ@Ÿ|'. œ˜U%`!ÒÊÙ€™jÂå;Á–OÁ˪v¤vvýTÚŸ¾&�’}/EJ?4Þ2U0å†g?È>‰®Ð‹·A¸ X•rf‡Èá—ù¬IæÁù^ÅØëÒó Ay±M)k­^�&£Ü£0n˜‚Üûë«Öª¨_;‰Ï»tƒŠMÐSN—™Ê{ú¹&àUWgø·Ò”ûÁ £Ø…ëx}Õ›>’íbõ#ö±–+©©œNNä•à¯;Äùæç LhŽ“d_;¯‘÷ª–4ä§éòT»º\=7íWkpæJß–<“žE2ÜcÑ9ÍÃM§±aür°²ðŠ®­2•CWns@·jÿXË\,܌ƎÎ?5o'[se›™hªW'Î/F ¼ÙùÝ—rqÁÚ[¸8¼ÝåÀ̧Z;7¿S÷3ó³·ž¼@èã+)M<&ø­V9E×g²Qá­pÕ‹„¦£ú"q¿Ž43˜½-£‚­w¸Žj–$kµ]윋q=( ¶ Pay#‘÷á°YšÉyO�_¾Êñ¤±Zîð+ëÂÞbZëCµ FÆ»’BÌÞɳvÅš ‹×¦9ý¬„;2ªª…ŠÃ"´CøØÙ›"ê•2=!eÒh³íÚb‡· n “ý9 ÕÓWß߆³Žk¤¬Lh‘o·dÿRe’¢=\ûª|¼°Pî ‰10) ‹…~ÛîK÷ XLw©DâKr“‘ßGŒQ‹kƒ#;âîѽüYîTcxÁ×:•[0Ú¸bËãF„‰…ºç±c!$£´Û¼wYY¸¶nŠOV O©ú\‰!«¸ß#×}’6;´+¾ª¶•îIIÆ/“Ò´˜(JÎÁ<òñMO”2"7ˆ÷„x’r-ÂYwýt8XººÆg§¿ºì°"îi'`š‰ÀœÇmÔCùî2CÄfTîN¼~BƒƒH„<Š2[oç€%˜Qºg¥Ý©KPœõGႪIìµîµCv;¤²®8aXм³hÄ›Ê^ç¨]¯à5pV¬„G(ìýÙ Ä  ïQÝÀ¸÷I0¡áAг+JÒ¬…îC—ëî‹ƈ¾òëæÖú"å`ßß=Ê$Ž}}ˆÕ³«poº–jìBŒ$M-Wkñ_$¥· !1WaËö ,¬Ï¢Qòl_Ø9»hh!éÒø.. 3%]X|ݳ3l¶íÈYî)"§Ç§¾©¹þÁ…T×kÁKyŸøS‹›ÒÖã½`Ï“Pêüȳ§5rsÅ| ä+Œ‡°YŸc^ã¬ìëC~m¡àé E•‰ $¬þ*S Ê-ZåÁ—Ý~¬0}išè­- 9jŸ‚q{#ãT6çÕ•þp*ãJ)ÄáeëˆÜœ\=ÿI£Çª endstream endobj 67 0 obj << /Length1 1458 /Length2 6968 /Length3 0 /Length 7948 /Filter /FlateDecode >> stream xÚ·4œk6,‚¢w!Þ½†¨AôÞ F™ÁŒÞ¢"„è=zD'„Ñ{½D Â'99ïyÏûÿk}ßzÖšçÙ{_{ß{ß÷uÝk #­º§”Ü"‡!9y¸@¢€ŒŠ–�ø¸@ ^,FFm(Òò·‹Qâ‚€Âa¢ÿ…q€‘·>Y0ò¨‡J®�À#(Ê#$ ¼ Èß@¸‹( vƒZ*\€A`1ÊÀ<] 6¶ÈÛuþþX,Y!Žß途#Äj †*`¤-ÄñvEK° ·„Bžÿ*Á"n‹D:‰rs»»»s\p VÀŠ´4!ˆ‹Ä ø52  v„ü ‹ж…"þ hÁ­‘î`pëp€ZB`ˆÛW˜Ä¸]ÐRTÔœ °¿ÀÊ8€?›ðpñü§ÜŸì_… °ßÉ`KK¸£æ …Ù�ÖP &¯Ì…ô@r�`˜Õ/ ؿͻ¡`‹[ÀïÖÁ€¼”�¾ðÏ|K¨Á…€:üš‘ûW™Ûm–ƒYÉÀ!0$ëW²Pˆåí¾{rÿ9\{Üæý·e …YYÿÃÊÕ‰[uv…(ÊþÁܺ°þñÙ@€�ñg�âaiËýkmO'Èï Ï/÷í ¾ÞNp'Àúv ˆ/ÔrûÂòF€Ý �ÒÅâëýß[X<<€Ô X@l 0¬ªßº!ÖÙ·çïõ�Œ@·ôã@¿žÿ|™Ü2Ì sðüþûˆ¹žjë+h°ÿù?Aii¸àÍ)Èpò €�@H@ðýwu0ôOÿ•ª³†"u{»Mwìö‡,ôÁ ü»–*ü–¸€åžƒ@–·?<ÿÏlÿòÿGò_Uþ¯<ÿߎä]~ÇYþüâ`G¨ƒçÄ-q]‘·"PßJö¿P=È_ÊUXA]ÿ7ªˆߊA fãðŸ„"ä¡+u(ÒÒö/¾üå×ù¥4( ¢G@Ý-�'ô?±[yYÚßÞˆ[RþAnÕóï%å`–p«_2ãÀ..`O,Ð-—x�ož[=ZA<~Óàæ‚Á‘·)Àíx¾€5Üë×™ ñ�ÜO¹~[Â|�·Ö?– À­ûëWwÜVÿeÞbmþË�¸¡ÿ˜<ü�·Ëoó_íZºº¸Üªö7¥ngùÛþ}E@ K¬©q¸¥X°]Upóy¥•;çÚgŒ…¥–ˆƒîp$ÓD–·­ò½”§_¥Í­ÊÈûÕ'‹B‡Ç}¨ØöÎ=ŒÛÓæ2‘(rÝ+ÒœÙ}?ŽÚm 4VpJ›!¡Äˆ‚ýX jÊEÉ›u1©w®4î °ë¤PAGz;úQ�˜ÿÌúÞÞÓÐ|>Á$êª78Édn´ ïme{ˆŒúËe#ïzoc¹úÜs¥æiœ·¬;÷z!pBgšv¡Ð÷<Š7ƒ´²¶oûí³•'I^÷mBHç§LæÐAL8Ãwf›5ËgéR€Åàfÿî³ #:öÖ6ÖÍÂÊ*ÆÓ%€)\¸‰Èç~Ø ¿óç·Å¸“I”s(µÃaµ¬{T×" Ë©«6[Ùõ96ÐãL˜½ÛëCMKÎf;¬òœv~KÂMÝç£áè¾N{Rñ¬Œæì½1w<}̆oÛÖñš,g•iûD”wÕpу̨ 1-w!-N¶‰ÔÆ2Ê{íÔ¦nºX×?ÛzÞs dOovΞã|/Å]¯ÿ.±sÜnH>D*‰ý‡Ó€î$Û~u»ù­ YËÒ­m·ŸQ_¬p²·¸/OMo¸V“t[Ñú.hÀTÄÅíĸŠ4‹¡ä×¢4ׇÛ)ÖlØï³åYˆòkÙ;Ô"¾føúóßÏo»¸O e‚ãg®Ÿýªñù"l÷‚øü$ý`lUâùÃàŽÖÍÙ–(7=xô0|{}\˜ùHüÚ¨AÞæYÄIÕ€™/i˜êV úÎÔFâQÖ2®¨yjÀ7?'šùj‰câ|çÖNÏ;è5B)ýæ^ÕݪDÇS§û~&Ç?üC?‘ù:ä.kÇR·UÒÖ*îGËn;c­­}¼G5š¥•fE“Y('†{ÐvD²—rT0b`om:ö$ЩàCRlSýICMg¹¾ÆEúmáuœEKa‡‘ÄòÛN ²·}}?1Øâ¦L¢9.ú~}t6Ÿ%òF_ÚHUœJi8,ÈšMMÔE2*)^Æ5ýcƒÐõJ?Hõr”žw¢–K êYñé;*¹ž‘`G Ñ=hÚÎÁÖ+ÄÓ3¢›ø×±y$.}ÑÒºŸ!/Í]$òN„©tµž { =,ô½«»Ã9ußôìÜ- Ûeˆ:f'›A8zÜÈ3F�¡¥þDw»Ç?GÑÈ‘Msoq#(yÁʘæÎòn‡¤þKôýo/ÃcT†²ÅjF¤*7ûº«>åîMFŽ?h›¯³u®œs†–°Æ™©n|ì]Tc¶“‹iµÆSMÛÂHÎ7ÎYŽóå(Ïë-èÔn-wš2·š=¡p­òF)u©ÐK1åa—bcù‚Ïͺ¨‡ ëÖ¶˜T–8ZÓðìÂÿÁ^a¢d(WØ9 <¤Û7Ø ¥ìŒæAÁ°o×/óÃÞ½`–©Ž+<öò¨> >"tò–Ÿ³ºÊ yiÓgÛï…Å4;²®\òým0ý!Áe×6ÁgøÝN61’#ª¢Ñé„õYøÒyù,&ϸSWý&uKfòÍ<¥®Cæc×p´ôö“é¿ù¢ñ&Gq:Ý<Í®ŽŒ4W=³Ú‹à¨È®•¸!WfãüùÕÆž:táôÑ Ãl¦¸{Â*dËT«- Iñß{«ÂÍ\Yjü£ýËëëÖWäóŽº+pNzµÌ!¢Ç7uX¿£©ÈÒ[­8õì‹¢.”îÜ6Et<ýk»)»ê1rné!NdÀ@Úp‰Á19NOÑg%ÿBÜÚðz[™wˆkµ±‘²éAÚ’?§ähÍÅMl0ÚÖî¡Õh¦àåzŽîÞ ö@?é§nþh±k°ôÄ,óʖɸóŒaÁF/¹Ü,eÕ9‹_lHww:•|´rX°ñ&¹êÊûî>±÷da¸ôŸ‰±ì’EV8KÖEî–%ð~?éuçÓ (PtžŸ-{¨uPý€r  ³3ÅÂÆ’<·ëÙ×6oü!yvÈCª"þÏ—SÈo[žøý¾óÆZ]ž1 À8û#†@0+ÖX®ªÉmeéMy«”a€ms®¢ÐO­!ao;Ž ¼/|ÝT(R/pÇ-4¢Ã:Ѓ ÿ}ÌõƒÈ5R·OL£›?z÷ž¶ø_ÖN-ËoW§÷%jõ¿T¤·£2É_n-ÉL”71|CÇ?æ^Î07¥#Â1¤4f ¿fXâî"K”¤ŒzœÜOì¨6JCÝ1>Ô´ýéèUrl^ætQ ÓŽÍ=oe¥ƒÝ©ý¦Û(Q”Ø;!K¾— ñîàñ{(´¶±¤÷@W‚æ,9¶-rìKÐ5æÒÒËÃ:S䩲øø':tg§Ÿü¯ÕÄ4ÅÕ^b}©•’Tl‡›Ä+}ý¯b‘äƒü¦¢®O÷³u²#Cðš|7øË)@›n¾¬eR%£ûæc|¯ÜzfŸ.Ô‚è :D ‚ñà1ޣȾ«G‡¼vA½hpiJ&bVï b-´íÁ»Á<Õ,ÔÄ®ÝïPað½’l[æI¿B•lËÏÂÞ륽£9·¹•àG‘›evhÝi¼K;¨$l_¯ø…Á¼— ¬n?à+ÝÓ¨Iÿ#Ü).Z‰Øï2éϤ›Ä„¦ 'œÉAzÕY¸†âå¾Ä¦3ø˜ø®lw³í¹C˜(DpŠó²ìÙRrQÒ˜µ«ëü-¨DÀ+ùjNÊ]”�Ê�µÉAóÅúE#v Œ±5Ÿ/mûë¡/,J·Á}êÒSæøSò7¾…‰ñÅ–#d•Mòiã®ùV[;–©g†´×@Zùlh ¬ƒ_9v=C3 ‘åJßÊG‘SÏ"ðetñ"h_SÆ>઻�#–ÝÈyHƒÆßDÑi‚?Sˆ áñð ŠÔÌ…ï²ØLƒ·º1°a®Þ¯mȃ] #î›Ôu™û̯Y:ܨàw‘~XO ìð´é|x;3¬8ÉÊ#°<ç²È¿ÈðÚuw" lBo]naÏ£|—Ùw9O0‰YÇ9P÷ÝÀRÛ˺k¼ç?ÍèÍŒ?tbÃuìŽòóà’#êÌ:3Q¼Lw×b[ÅT²Ø k¼Ç?” 8”–6žØ$òU2î-^‹·¤6#?~êÝÊ»<í­‚Õ§M%¢{vñ(°Éëæ8™¶h åIÿPehRuM$çIÁ|ºXw)—í»¬5Þ”Øýãp ’±Çìç æ>E5¯/¨=Hƒ ʉ8…14.“,BÊGK¹ ŠM® ÏÞ‰ÍƒìŽæ%Z„št&µ[íßLÔæ:˜y³ëUA³õp$—¬%õÉIHËŽ™Höm‹¤òÎ+ÛT'šE=Xreé¦Ð}¹+ñ(R9û¥£äž ŸT¢qõS¢/64-pG•ú±¬w'¬VL†�D?9 'Q#U^ÀÝcæiyþ©ë¡œ}Ž­Õó1úÕ‡Âd¨F*y7ãÀ)Ÿ(^;`벘í¬ó¤:5]PHò匎­ÊuûîoçWp¢yÚ•é”lŽCXµ-N:i7µk^¤~4uVÁ}‡…•âÙözr¯}qëqè®èHÈé„Zƒè§,ˆ£jµu cÖX¤Ô­xFq¬®²ñXCàQ€&gŰ»[+íÉÕÊE=±ýÖCß/9fŒæ¹:Æš$¶KÓlÒ9ÞDÉ×s³éðN@®‰Ù¢,Œ­É¬2zˆŸ*ŠN»]cª$Ä×FmÝöeO:4Ï­ŸCÒ•\ÕZ¬ìtm¢-·µÿîP*‡ÊVÎñîæíqG8&H#òþc¿Ì–ò®Ãìë§íñ±¸ý§üŒ¨4”p¶~déº;YS#…zŠáú ¶§N”4š­_ÑÝi“GÂàñ˜ÔY^òh}}ÆF¶ïB@c÷3IRõÙUE½ÀÖgbÑ~ç$rÿZĤ„©J°Óý ã+Ÿ¾ÁŠuje8X±3×±BËdÂ:>àGºSýà|\Í·Hã±×má’šÞ›uÝRê!¿êi9•&ÕòH¤´§¾ ´òÓ,b2u]˜ŽX˜n á “›+ãô!v;~›-¡9wáÃ?VaIx~Iì~î·©à‚­”ˆvѵH¢6!Ê»’a”æâçËçÿÕùé iψ%3±Œªœs?‘­H—[J«c KÄ‚ƒ¶ö5îLÅt)­¬<–Žü^|æÆYöÕúúä%ûkÓ² çŠGÜÛ©/¹6¾¢‚ ^  mzö¹ÝjF1I¤ ‹~/ëßöU¶4ÎãÅÚ=°,©ÝG[µ…ï  ¾äÄ1ý驯›ãjUÆÂœ&ºÚ2¡È;ÌG÷×95XÇ.g&‹xÀ…3o%d] yb× •ÂTèP@ï£X.†e»97x¾Ziv¶«µN¿ÝË»¡S`VV{†e@šÂ›N7!H0V¶l•îÇ5^ý²ª;/ÞföT¨¯÷^‘µ©Æ©Ù3€î0cJsp¡•§7°…Ä@ÍJcgB•5¿.¡ /øÏ×Èõ¦ËaIesïG¤nU`mŸãåÖ÷¼\ nˆ¿ÕY'@;8~ÎÑL~|…ÚV_póHš¯A>€'‡z–Úùêô.¿kdè¾â|tá\Æ•².Ç¡gãÉ„ú>3ôŸnl‡R³GûÅÔ(Ñd£ìöô}Œe©¸Ô¯Þ¹0Ö3bZöë?»Œ§q]#ÃìÌ~ð=¶²øàEIh¬ªiï*HŽ‘"yYnPï¤ *^*Z¯VR­UÅY¸4¢“–vT?n80D[j¯¹ø\Ý¡#ï7yò–ª'ZÆÞúU.³:�ç‹A]|¨î«‰êdr›ö³†ìF5že•FD!6øTjcôø=¾ gKß‹‚×È‚Îýúœµ‹ÚŠ/ð—½åëjzmá“ZKÏv;ÚÜES«Z­ ±¯†n|bZ.,Ç}a“™Z’;4¬Òœ/sÓZèq)«&³öVá•…±¬qJL“ŒäÚfüŸûh4éÉ pŒ†ëÂǵŠN›¾Ì94ß’ñÝ᤯và±y9Pˆ‘aÏW9%z_˜é‚éáùÛ]eáý¹mÖK9¬pMuéLôõ‘ãÛØ&)†ÔqS6^RQUS;K”µE[rÇéƒp€\×_ÔªºÞ‰¯÷œmhY=Ö+r¦ª»ÂL¥ûçÔ»ØqŒ‰­ÒÃ{[d=y&.Ö2Ü>´›OiS‹8<±æeƒpdœ£%&¾ìã“/³¤'$½kû Õ _à/:'g:@rp}oZ@üŠlŒù9+Ͱ‘¤Ú¦ñŒf"ŠÔ“¬…gML_¤p½‰¦ž±G3É«Oi{ñ ѺoÑ^+<}£^î¹×ÿ˜£Ÿ~A~²}¹‰v¥á[i;íQôO:+ýÝãQ¾Ÿ*Œâ?Î¥“Â8[—Wz.°?‡·i›[¸È¬/- {ð1nKœ:Â.9ɤž“?¼yAõ³WÉ¡Qø6Hžç½ªd@ÖùÌÃÓfý1©Ö@ð;þd³¤'Üþ¯²½‰mSK:ü²WÝÇrjlϾ”ù¶ùu ”^v›=Ü>hÒº6©zhØ>:¹qaگȄûtF Áß ··oà?z±Ä`AOƒlÃWž¶w7Àû¦ß…T„S>žt¾k3|¨Ò£;$“ÓbÓò4”x`Ôg$ž*%B¹÷ø”³†°š=¢ä%íêD+ ÄáÄ(sb?9¿“¥ý*ÄÄô /¥3¶N •§× °ceUï‡6¤¸ó }c€¡Îø+´•刟³æÒ¥yCk&»d?\oCYéçù Ú ¯ÂB_>56{NRiü~õÓN¶+jÌdåeþ¼ïœŒ0ôãKKnž•ç hÕšü‚'oŸ°•!xsÁ!ìú1b(_}ËÍ0']K;ñ ^q€áfrBc¶!èplj¸@p•íèQ¾EX«ƒz…s¬ð–šA°ÛœÚ:ß{· 7àTE6TJ³Y¯½€š;ó£N—g´î ¹l1…þŽ Hî+*¡îQ< ŠXe|&anòj¨Ä¬Öúĉ|’¤¨Gg¾-uÁ¸u87w¶Úf™ºd^I+dz´¸É4²@òÔèÒóetGP#æ@'êsÍ|© CÜà·^Þ.wÎEo "X‡j{C~Þñzu™û.¸ÇãìóŠ?Þ“ðpx2|>$nïâµ©Ž©û|SÉ.7OÍkü˜¼ÓŽE~P´ôGƒ nWš—±%°]£0•/6CéÙìtjïØ¼C‚^)$?6iOĹãgøÁ¯°vSN)®+‹2ô @€"ÍÐo>lW~SdÅ™_0wðý0AþdÿñŒeN—9*DTDÜ(—F¸H˜øJõT:–í³àFìе=³„«£C°˜ »¶ US¦Qïó®Îo'*’·¼fΞžHª‹íMé>þ¹Ä!î¬A=LF"“¡ëÊRr,†àiÏ'û燨˜†s"r}cc~[›=JÃÌóÝÛßì6c¼�B µrxy€OF¡ ’ç´ÇiÂ-Þw±ÏÎ(Õ°ƒÛ1âZ½fòr"`‰ˆõ…σ›ÆÞdªäþ怸”ÐÕðlÜ‹â›ÄÖl+*³˜ûÎÚ‡fA½ì€­ qŠ<‡ êéñä>ÞH*µø§*çæã—ô !'Ä>Rnˆ»ÐZÉxóÝ<~L®W¥F‹\s« Ý¼èìS£õVY?4æ�„´÷ý]íñpI’ó˜î‡YGh?ðšùŠºŠ¦i§CrGUÉ…¯ŸêÁWHtô÷ÙÅ ¶sЦTû6Jz—«_åä`ò¥½q.j$¼K3O”w>“»?¬öª¦Ä¥ýœ^^SÐ÷"ŸtëéÅa>/Ý¦Šœ^ô·;ÆW¢c|´Ã9æ@@D¨j–¿‚5v/˜²|‚ºMìJEiýÑ8ò…ó‘` !êÈRÂÞñ®š‰{¿Ics˜ÑBˆÎkßVßêìi:QþŽ´øþ—ø®¹™#n#«§š ¦xêÇÇ‹ŠkªOH/bÐú­ ®˜NÈ“/ÕœOÞ-ª˜Û]òŒ†¼Wãh:”?rõ§Ù)3 ¾XÎw£åänYIÊ–Á2'#7¯·×F¸-¤K_rYŸ"#4rSjZË–W!ÐR1ÑLŠ Bü´‡Ø—™yÂM™'<ÑñG\>f7å‘zÁc›s”¾¥Ã-™‹Ù… ›Ì‰[@ô¨ï>Ö&Ì4TXíôg‰«`îRæçÓ{ÓÜK&/!Œéu†é¯Þ¯¡Ê#zžk°NÌ4Õi=Î;/rÓ´R á[`MúDîßÊfö¼M²=ÓÙU£…"θTÀ8’B•× S3³2ï0í –£ ·beøäÍV E=’‚¯«¹ÃˆïŒí°,:nÙ¢¼Âβ|× Õ=)XPãëul;À}’sÔÏ:NÝ(ŠFƒšàåþMÏÉÅHåêr²ç/ï> stream xÚ¶T”í6Lww HwwwwJ 0À 1Cw7HK))%ÝÒ-- ‚R H7¾ï{Îñœÿ_ëûÖ¬5ó\»÷¾¯}?Ã@«­Ç!cëb RtÀ8x8¹Erú*<Ü�nn>Nnn^ }0Ì ô/9ƒ!È vˆþa!çždò@Ø“¡†  êáàáðŠò‰rsx¹¹Eþeèâ. z‚mœ�UŠÁ çâêã¶w€=åù×#€Ù†À#""Äþ—;@Æä¶B�@˜Èù)£ Ð  çbÁ|þ+³¸ æ*ÊÅåååÅ t†rº¸ÛK²°¼À0€. r÷Ù~· Ð:ƒþiƒ ï�†þ­Ðs±ƒyÝA€'Ø>¹x@lAì�=u€–+ò·±úß쀆àáäùw¸¼CþrÚØ¸8»!>`ˆ=Àìh)ªs¼aì� Äö·!Ð êòäô‚€ÖO•(Êè�€OþÓÔÆì ƒrBÁN¿{äúæiÌ [9ggÅø]Ÿ<Ødó4w®×ââñû²Clí~·aëáÊe�»y€Täÿ±yaüGf‚¸¹¹…y… 7�ÈÛÆëw}WÐ_Jžßâ§ü\]\vOm€Àv § ?(Ѐ¹{€üþTü7ÂàáØ‚m`�k=‚ñŸèObÝßøéüÝÁÞ€ÜOôãpÿþüûÉü‰a¶.'Ÿÿ˜ÿuÄ\š¦zJ²lÿ´üo¥¬¬‹7ÀƒO�ÀÁ+À àááå==üwm øŸ:þðUع�Dþ.÷iNÿ*Ùó0ÿ³ ,€ÿŽ¥éòÄ\€ù?D7ãà¶yúâù¦û_.ÿ,ÿåÿJôÿ­HÑÃÉé/=óßÿ=ÐìäóÅs=`O[ áò´ ÿ55ý½º [°‡óÿjU`À§mØ?1šƒ‡Ÿ“›ÿo9ªöÙjƒa6³æo¹Áï}sC@Ú.PðïæÉ‹›ûtOKfãøt‹@Ÿ¨ù— ô´CÿWbãbû{Ùx@ww ÆÓY?!€ÏÓVÚ‚¼ÿ"3€‹â{r<õ�°sqÇø}°"B�.àoÑßHÀeý$à²ù7ú]—íÀúò¸ìþ€ü�.‡? �€ ü|Êãô|JäüøDb.Èð)‘Ëð)‘ëð)‘ûð)ô(à‚ýŸºõø>•áùü¯™Úx¸»?]0‘ÿiàÿÂÝf 7ÈcyÁÅF,üe}xÇU­ ¥Ç·I^~ì¡“Ø34£mrÏP9ñëS¾¢¸%™ž¹ïq×¼e-ŽÆ$ÜŽëþYq¢$ËÈvÖ[ìþŸ$n ê¼ßÕº»M­ø ¶ö$G­º½Î¤gYHÙÝ~}›ÏÝSgl­¾¬r8BejþÁ‰…0™‡J&,̇…Þ)“ÛY-['3;×¥òz"=ù3õ™âÞuÖà¯ÀסÏìðàÍ,Êý}lWµ³Ü}É×»}‚jVŸ�³ Û} d·¯˜CÏ:ÂC˜­¡ãzRôby*ÛŸN”O¶Ttí[•‡73å6^Ño Ë¼õ¶fúj!ÆÚ-_ö!v9]¿Ä—O€©¢¯²R‰PBs` ]qúGx=ç[|5õº‘é }hzÞlV ûXa³¶Þ©ß"Ï´ úX\˜{"˜]¶óÙVnܛԗ‹N–k¡S°:ƒâŽ~\eLZÜØ_·Ôô¡†ÅTþ‚S‡ãJ"àâÌñ[®&®¶)\pu‡äÃý¶7ù. <§CFcq–JÑ }1oê€Xžêt®@D½› ޲R²Bûæ¨�ØIû¦´9czù'“Ùó<«Œ0ÿ•B(þ4Ønö¾m‹j,Êü1¼A!šÌ÷®îø1'Ã)ïØ(ó1â™Aݸ]r,feÀT[‚… {„ôût¿è†1Á¾À£u©XU½îúŠÏóçi gàºç¿êµâ1 ³iÞ.ë$KÀ­í¢ñÂT¾ç¬ð(†/›´ ¨÷,ªï€ûJ]µU”!rÞý­¿Ž~BC¢ ÕŽÓšàdöcåEP;¶õ,VËAùí‚9:5š"J‚Ï7o+²�@•,3ÍÖ®Ýcü•Ÿ¬ˆDbJü(xDäܦÌÏ'÷æ=)Xâ¡ ÚHËjtã1ŠÎA ñðŒ�‚_ ªF–ïŽòf·þ&núùËwéRÁ¤·Ï6³Q,0æÕªªßݪÀHðž¦Q·ˆ»vØe´›¯puÏhúˆ‚E46·>íìÊÙáÅêxÓوǧ~^Ôt¨Šeà>²ú%_õmƒ-*Ñíð×g–X2ׯ ã¦ü²\ ¸pX^¦¶µ`¾£>ø¬ïtlÏ™æqü9Ót/­–”^T{O-Qiˆ@›‡…ÈÜÐX%›ÏRïßâ¢ù¦©ò)Ê0H¿rÌOœ¡Ù8±å F¨4c:Ê;v1üNÜì6†a=2eÄF$à¡B²Î8óŶH½ØÎ¨¶VižymŽÜµÏÇKsŽ`}²WþÙ¡iZ/0Xë¼¼º {—1Íê~Ïaê$CװŰƒ›<4‘I7ípØ.þØ”h($DPí@ŸŸNO™…ª?5[�ÃBR—ƒ§¶Ï›û «{ÏW¸ a`Õw’‘\|’¥T^cÆå0 q7_ðn¡‡Ï“¾ Hþ4øüúíö�&öp÷…mù'ÃMóêæò"“2ÉcÖÒøþÉ„1+Q{Jûìâ *Ls#ã£]} ¼<ë¯çù_}|Ì �e"ZpÅ x~>t¯òtd¼Î¸~M¿çS°/d~È.‚kM”Ò Æs§çm9‡ƒ@ÇOd;5ÿÙ58êIò>²>~ý`i ÷ÁPÂË�‡T8p|r{3°rrÅE‡,°#ö씤»MìåÒ–jØÛÕR›KmÜNE)‹O §…8!ÚôþÛÇ9 {M'CÑ_ûáʘ«7ÌÅD74Ó/Ÿs¾ºN&”[!‘œ¹²u߯ï1)ðíãK›§° £a¾]«ðI)—ª¨Y¹VÂEBåÃÉ`ÕüÔT¨jTWWswn6%…¥†%¯[¾ h¯Œ©0=è*8¬~F¼¥¦j†‡Ðº€Û»ãÜ”™ŠS$cxoÎq2ºÑê?ËhM9¥†óVjŠéSoP°^´SŽeC{h\ ±Ðá>ÜÊÃNn÷€ÛjÏ‚'ƒ2E–ñ:E¸4–Íí~¶£/;ÙqÜ(Nú/úM�˜2<'d‘:C鸵\¼Â�=â½ìoíåû\™³¶†²Xh/€#øÅª¾ ­ÊiÜIyÛÄÁuŸôZV\â¹L¬P™ìYˆF+öDÍjCpßš¤¹+uÒ¦·ù�DêæÝûàmòvMö¾Õë.äS¯ŸKG› c¾«»Ó¬p¦}ÖøËÈ¡q�ni¢Ó×\Xe© Ûw¥a÷»ú¤?œB­W€ì÷ÜÁÎ’½jîj>F×SÏ~Qaµ×^gl¹¹@Ï Ü›†PÑL`;¶O(*¹ ™ða§:�ú­¾÷xjª†$Ôv¬‡0¬#¹ÏõdT EžùVò¶„dOÐÞ´sL0ü²o¦À]4:E1ÎÌ)ûØs^.ºŸp¸D§vA¥o hXtF­×„—_–ç‡ ¢¦Ð8ç4¹¡)èpÈÑ`O@3ÔZæåCªNšÌÞ‡Jèò‘ŽߨJÒš¬L&ˆ´kDëÔ£L¦sÎÛ6lVã­õ±=Èî¬"×\‘3†©ü: ]¥R9wÍ“9/%t`m+ô³!×öïâSž\Xâ×â8–ñ.(1~K€9¾cs0^n©o_ª~°Ôìqtfã+"udÑ8ësWÇ,ö¾€·nõçþÙ8ÇÒU Pé 9ÞyÈľ{U)£Nú"÷‹®œi ó7vóÆß¥š½Í©ãÀmWYß!’7G!…« £­÷ÌÓ=úRÉäaYœDØ@u$ÎF¯æq002â‹rUåÃÞ%½\‡•½)jµÝ †~j½‚RdÐm)(GÅC(ÌEJ‘ÒsV «*R‘œÔˆC|öIÉĽ?ôùBÁwÀÑÛSõížÁ+¢NáTу—ÏÀè¹òßl¨¢„©8¯~Öôáú;ùãã'c•7pU^­f‹1e1ój›‹£oB.gëæ®0œÌäî–‚7D‹Ò7ãs™ü9f¡¡>Ä ð ­1ùÒ4þ­BÌÔD=ßçLœ’w…TéWÜ…éšåÁžU’I¬´¶�lø;×f6^„ñÀ£©n÷1U±¶ìéè UÞ¦ýsNžk´-8&Pa<÷ΜYÙ>F'L”*)ľg}hhW‘Í9tß=o¤¾œ•3V£ôÐET§ÉG^À;++”ã‡ÿ†”8®íŒ—7àrÚ~è~Qe-2ÚúåZS·Ü=¼[bãh˜s«#ñ‡µð€~a–œ_,»6±ÇOL$:Œ®¡‚‰¥øg¡jø*+¾meo—·í®7ë¡;$pÝLåYŠ`/%FÞQëryqã$ÜóOÊ“—݈žs³¡'˜’Æ™ü‘'d”ƒsŒ›t0sÏ.¾“·‚¶¾W Ç ÓkjÞë ã6gå—1<n÷í•–Ú¼$þk@á%#ÑcãŽõÚ›ü.×ï,v¢ð~P}•ø†Oœ€~šUâ™3—uš€wZ9²¾2!|e ð¢Írg³wšeï „"á<ºy3*úxßÊ3—€gÝ‚€-ÿNäž4`LÑ* q¡»ŠûÒf§eR¨»Ö£ríÚèÖ“÷p¥6èÙº<‚ÎÀ±Ø:yª†‚‰›ÅY’.°;FÞ_¿ I:ZL¦ž?tkèˆjOuŒ÷˜öLz½»hç:õ”~Ù*1ù¸a©ž.YrYáÕ¯9ÓŠ ¸jk,†Ö–<{è7üýh’áP£Ì¦??耫ðê—µ5uqN¯Û—J;;|ÐÄp¼^+d$: È.‘:î¢ Wl$“WÂ&Ú{ V#ÂÂ4`}YIntŒKó¯ÛØÍg8éi¸N‡¼ä,Œ Ââ0¶¥ÆˆË.û‡¢œhÌûÇðý.ÚzûFì`&»~)·¯öØb®Z¡éü-ìòœy!Ÿ]œîžå«Ékvß×׃¾qŸºQ¿¿«aà¡M/†Îo®mˆ4¢sõ˜º¤9ŸuÝyÊÖ·Üïîj ¥å¢˜1-òZ°aÍ›ºÜï"ã&Ô`G~óݸö² ·tó륗GòvW´ëþq)å:‹ˆ[¢w¿R™»Ñ_Äö–)á'@=©_e¦:VjcÚSmq“5H ,àž^¼²47€£ÎoîM÷ݧIÅÒ?bnX>-‚ÿrâpÅt½é,éïÙc¡À×®õ–RXøü˜ŽÛxõÏå¬%G›É‹ÍC¿âÆÄèj}Ä’ñ”’ŠËLË_oŸGØjK6t„J8yZ™*‚Gñ¯ÿØoÖiÉàw «ã\éün7$a§î;`ûɲá‚—g¡`uÑRѲ·ªâ™B°My(tl‡¯ÖÑÀm/÷Íç…þD.{hÞçgëÝ êêŠù&*) r½ÑçZXne4~Lœ)Y+XÑOd—Ö‹óªÄ|¸,Ÿ#{X[áû±c¶tƒdjß4‰†¸æ˜b#á;||ܾV¶š·zNšqÁ?€ƒ‹1·A ¼¬d‘ËÅC3z4ºŸ½Û™ô `µDD%¹Óü:‚˜ÐÈ8Wð¹…>mcAè&Rb'ŠËÿ¦I®Ä˜77xn̈¤‡ÖK&ó¥ãÇ&} qi½éÐð„êNGma;òÊ6I©ÊÝÓªˆqÀ7}8Þ`5®¦Ínµn3lÉõg Ï3ç–Gb—~Ö©ëib ô)J|a‰¢¥_†ù,M¤ÎÙ×¥£XjV/è ´ž¯ŠR”å•"禮˜ÈÜu'"ÛŠK[’Ž6®Ucl†‹iä™ð…= h8e4‡:U£—ê̼Àν»ýêc¥›6ï4Z¦ó%S”Uª�ˆ¥P*Ëš:ËÛ}“c8®b¢Uåcå)4»˜Tó K,ºˆMøWl" ŸfxõPÇ[?~—kZ ¬*¼÷P*T>Rš²}Dþ ÐïLqõ»|8çaÈZè¦ùJRyΈÓïÕ‡w¡8i;ׄà7£­T¸JCØ}‚ú¨øH& ¥ð£¢ƒÞš9My¤{ajÆ@^ú ´DD˜sóÝ K(j°¾qk¼dwñ+ŽdûÐçHÂ+vÅ/Ss;eË{ 1Meƒd®5z:êùGX+ÊgùXpyíTØ+ÆûMù3¿ },¹³5,9kÿ¸O]dU˜x-íYbu[éB„޽©iÅÛyjz<'¯·U"M¾kF=Т±´)[ùZd4cå‚\3Û•¼”—]A,|Þ« {&'�\qšVéM³.‘ÙšŠ€+˜X+P@ò“½´ÉŠÀv:ÅtŸÈý×ÖÅ–Tî‘Æ$Gaiœ»˜š¬ˆ‹Zv· ™‘¾ÔUùƒ˜¶=~MÙ ´“ž-î'_s×÷mKÓèJ38¥úÆS¦kæ¸VV_8­1æîQÄè&yÉÒ¥\ÞḂ„ÙT¼LÌ•= Wë;Å è†_Óœ…mÄk’“õ®"´óŸäDN­±®¡ œKø™æý0LraSg˜X“¸¯½¼aloð Ã÷¨tƒÖ†ö”±ë|­U¬‘ÒíRræ"w_­‚7(¾½‘òÁò¹;°óþdg@ªþ*É_ç²X7Ò`•C°´²·ÜöM…¤a(vLkdGî5tØâ,£9Þ¬¾y¶Õ†xo:o2­¾¢õë]ñ¥ê{TªmxD^¸çâÆÃLrèZÔµHŸÈqriHd /P¦#E{’“„�GÅŽéö„ï7êƒLäèJ YÁ£‹—m{Ÿ©¼ãg%­¥BëUÞ§hEð»`}9ûª¥Zv|Y|Ñð°“àž97+#9,LíØöÀ+E¦Ÿ…tÈ~£óÎd]¥ív/¼AVaYµ‹Ñ½ÃÔd´VKoHl.ÐMQÄæ#ýÕ»J›Lò Y]¶êÃÅÖÜCcÝøqÙ_MëuÈTK‡’¬sJ˜ŠIËä[~brL 'cg�>{îR”`áBã×BçÌS9R§®ÒÖã„L$¨¾"nx°x7Ëè™?†šXfjù4 [ÑûUã-í5qaâ06¦Æ„ÌyÖœXÍåÒpl�ŽõãvW!ïJR4”…Å‚°lé|Qžñ%.—‡XwpéÀ­æ «U£ÔÝÊ+Ô¼íÈX9L¹ðö7'§,êó òŸñúVgŽ(ôô&á\(`ZÖ1èfÙ¨ú\Ë·g·ÁÐÓƒçƒ=4qͰJ)¹w ÚvФ¥Ùc諜ÀŸÌr´KëðòÖ½çhTã9( åÞË/~¶N›üì;R3ºOá9ÉIø’±SÀeâ“îÊç 8¹öï×ÀarØè!ù?d…ðbÁÕxX&Û” ôW‘Ó3° *÷žŠ½Ý?’sVÎ"onâ“o_HÙçœúˆ3Å|‹<'ï7ð¹Ž<„ÌbnûM¾$Žòì¾b—ÍÀgMyb¹ã/ `š=hêôñVxs:Y}4ÂT)°Œ`Zšš©†e†³Â¥’«ñ›¹ü‹­|K±vŠmg¤\0KÆnÌŽúj³­ÐÌü<ÉÜÇ.²œÔ» /JksI«Ç;ªìñEèŽÒe³üç¹<¿mßOù$â®Ió”¢ÇA¤Ó.6®ñ4«q_›ˆ_jb[Yu}öˆ4ô26ìŸÑ÷]R¤[ɳ…|ë;œ3?«ö&};bøÁµ ‹f'¤7¨o¦b`a²Ä‡R ûòÝ3â%¨wŽí77¯è‰4²J©WÄ¡�)hÖäWo¼˜ykº ù´åÇÀMÜ"r„Æê )³ÉWÏ¿ð' ·¾÷Ù2¤\¿J^ ËúRáðP”V÷'¦¬éÈš|-Yl½Ò—w[†#œ™Ô´§rbþÀ“O€ø¿ÇÕ¨ ?áNbò¨ý½‹o¬ó¬Á$ý¥ß5öR¤ûOŠ­>ëBïÁ3bYAò>‚™ä,ž$2Ù?óXö¨³uá7ðçå/hß‚ýpOŠ×²¥w'õD‘™{‹ºcuôo81OaJlf~M˜ððî6¥áª%S�ùœ6ÛÎ@“CʼÉNg ª#Š/è¦Ò¯OHî­5’PLgSI*a°É9RC¢Xtg$iôÐRº=ÄŸ¹'¡g*Kò°îuÊ·«T)úòÅ ù­fr^0Çлz¿Þ†Bà.ˆ]y5%Dظؖç]$q] ¨¬Ý§ Ó[k™þÍ“p(ExŒÜËu,ÇPf—ä Bè+2­‘×›¸{w1”š·ùQ×/ •8�[ŽP)©<ýÉ)ÃÌ#„7 É¥“”ØzîÝ&Ö>§`ª,ÉøYƒV̪ðríwüÏ9ÁqÕ[ƒ£}k |L¸Ù)e¯lC!™wÉù…–Ãé/䔫Öý×ñš{~Ö•ÀÚ}ËeàÕðŒt§¾( Á«]ã·ß.J’Ðnk‡4[éÄkåSµ'œ÷‘Å|íÍq‘É›ZÎËVÀ¡¹Ï$At)©ÉðL’.P œ›eaqJNVÑi†VFXÍk©>úËn Z½…íЋšÁu ú囕Kk•„¥†uI—p2”¢£œÉº‚Œki ,%ógHPµ@±^þ¢vòd¡þÕ—ዹ\¸ÑóÙ½ª4ƒ|Gç<&:ž„?ÅåϢœ ŠÓÎøœ¥ßáH9òqSÍÑ !Ã0bêg•^Ž0Gkx•{¨ÞŠ4´yë*!óHÁÕ‡L·^§&ôÝ'6Áog±÷….[ô„1´¿tXo0è£ÈÕŠ9%>D}©[“Ý1rHË£=ÿJm¸*÷|az1†`P¿2ñ§h<Ý3J·ˆ% ¨£ïû±ˆºiíÏä-ân/‹†}å%'q½ø±Ú´?íQÊ6¸À¹aŽsÛ6Ä@˜«¡13VSÈIBÉç2þ"K¦ˆ×%bÙÝšGöÌ{xhòS^;b~Åð±+Ä;I _ÝM¥^A`á6(ß8y5áfáJã^«®EŒRô5>¿” jÑIxÀ 䀞)[NŸE‚\„WñÒ¯¥ÚW £BöËÂÙ)!YŸ]ZD»ß9.±}2~îGbŒ¸.-u"»g²t‡Sl‹Æð+¡§ÒÉÁ†¨Ö‰ƒWƒ¹)%Wð/šE”Å~öSÛ…¦“ÊáГýJˆ9êX„óܳ=§×%猃¸Àº¬DfŠ@—–>—„$j:KRŸ]Ãoòº«´&INj×Ô´ßdžÿÌ‹äè$üAšt,<°?žËj¦Ã__®¿âùØÅÚtäìî Q§å4Ôî3ßIüþ€–}€u>K¾€C YÅ5^â§ýˆÐÝÞÃ,ä˜T©óʸ¿eÕAÌ8«¹Øñ%BœÖC¾¶ŸmýNÜ)£S¸  býÂFïKøŒz.Ù¹ ÈU÷ºÓÿÄt›nEñͨcO¼D~«8ì’Åloó»§Ž¹IÝš†¦A«Ì|¤iëDªXjÎ3‘cjxA&S“VøpS´d1!De’c‘ÖÎ%(ÊI¯ˆ_›Ão`éÚÊoV³€¥fd}xCÆ]—.xgš ­#ïC8’beÍnÆò”^ŸÂñ%!ò¨]]ݼâÔgç#¹4õ¼£•xÛ }§*K6cÊJ\VÙì·Ïêg5ò&ŠèZMûXÉ람6~ÇíZ¼·ÒŒjì›âmôè±Ö¢¦¨¤#ܵûþÙÕö\ê‡!{r$3މ@n7äžšŽ¬uí¦[ÿ±½_Fμ/©­1ÐKôõF]OAˆæ¢Ä §x²%døÛ|Il /¦¶Ý÷ßGU;cD†èEÆ lÍ[”·\Ata¶¯Íôcm;ºÓN hÝ Ý>¯w½OAzÝAÞ)‰WKºñP2Íáï-TØ8Éã:ŒÌ^ á~#âGºúƒ)”Ø?[w³¦Âª)Âá“c·b1F¼ ÔiPxzÃEqimF¨½>…½Ù$€$d4íæ«a^Ïß™WM¡nÐØ|ŽêÑóÆ•»Bæºu'ä;J›³ ü„¨D®<Ýy³Ž>²yü܉)zyzk Ò µFN!²O}óš°S„ /cauº+³2§½3poc {}{SÈe‘èY#¦‘ ™È,ÊìÒÛœíÐ)³ƒo”¼/ »8²¾?¡CïÚ5)(¹ùÙºAyYòLÅ2ª?qC®/|gœyse"iGq¿6¸¾Ÿ‰TÑ~WlW¡×ÃÔåÅS‘ @pøD´ª9¡!ú£ÜÎUwœ:SeÕ§Y XÔ~F½5ȶƒþy%©’¿t5Ok‚÷c½ØN3¶·„á+Ss/‡ÇŠòÔ Ä©ö»ñç” Ì¤¯ á{A²É&¶ðŸi}bßÝU.8“«ix/RÜ’ˆZÛâž:ã>œ®F)}gޣآ5›LóÅ;ʼ°¹S¬¾O i1/DÖÚ­KLMF3¾/ÐJ?ƒ¬dð-÷ð |íWé¸h„ÐåPÿÛ=›;ÜÇŒ,s7W¦i¢öŽÞãÞ¼Tú¼;'?9€_qœc&']õ8>å't½{›hLŠ5‡:ãîØ %·Þ‚¿ÆN—^͒ݽ–72·eðZd:FÈEf¥oWÐ_Z:1Rt@\î”׌7}pbÜ1 FoëN»Œ*;ÌãE=ã3yìrj5>¾Só¢w+¯Í,B¬æ\覑¾(©É¤­êUžC™äœc!+­ë˜¯©¶Iüy†Ü&ÿòô”!G2ÿ!ÎA|ÁBejs€¬v©O̱@·Ùи“›Â²lql´lGqòX—w[ÓÍxuó¨~ói´”êj³Ã§±¢Úi.êÈ#s›fGCž�/€%»½Ôáƒ4O@êO× ƒ‘@uøC_ÜúÚ£éGZ½pñ¼ø(ßQ°UŽ~¤7Uó49¬J úÞ÷J>!¯)îfùƒ‡²I$B¤7¥4ý+ûüòWÂ7úŒuº¤"M¨’™gGêTèÃhL} ä©Jáé3ÆqЕ1œÌ~–Gf{½j0yæ]F7ÓÇòM‹q@I­•ÚùÞoÊ>Ý66Q̳)¹8ãx¾i6tûÖÙUÕØÇŽ¹€µ³þ¢$üEWðgmc«'šÇ¼w’aYÝ2’Ê(.jvŽå¼ŒXRus-rm¾…è9<#ÙäÅP=þ›4Á[}9ž°RÍ'òb^«Òñ¯°HëpÌ£ë™$ç#kt;õØö=HýÍc{p¥Õu Oá·Þ~x6.ó>Ú­SMÍãëÜÁ…•|„G>©ä ,‡á;MØýjüíŽÅÚžýVLªì˜˜`'Сò„ǯ,‡DʵþŠ_pâ뭊ʧøûf¡F EñÚºðO’VôW~ñÃϰhæÇfš=ãÒywwuÁ{=в!úÕäQâŵO)íñuZЯÇÌ>¬Võõ9P-p\ýÈ– Í’®Kõ÷(ù?7éÇI ?ÑFÅ#JµŒy„ˆ m— )÷~øB[¢‹!нÒããöË„&QÙs]W¬év‡WCZ»°ã~©Ò@8xNº­†CƒôKU(Ž; yé«jMiQ–õ4N™ Ê//FZFâJ7M„¨W7U&‰e¹)™ñö‰[$I¿&¶&‚}œŒ¼vóXÞ‰ØwuªöSØ>¨bGìcTbÝ ŽÚWHºzºÖz똠Žm¬6l¸ÍEÚùƒ“ót&ÔĪßgëÿ¸äÖ°fí+/×A>ûºí‡žÉá%^²<Þææ¯ÿ…Vº0€áãË_âGM,)}[Ñþme'HŽ“ñ8XâãœÐˆ=AÁÅ È-ûÓoU £îŽñ–ZéÅô® ;vÞ®83ù¯&s4ñ:Àï²vßöИ¹aó¾äå-ÃáõœÉvsë ~[ºÔŸœÃþîÙèÞž¶yÛÀÀ¾BªåÌ‚O4NvYuŸu›šf¢õî:”o‡ô®æm仿e‰ÎÒu¶Ü.%V?—ÍÞÍÿ1‘ éåð¥4hå#8Ñdñ9$µJžE/¢Jj²ñ7ˆÒº>êžÓµßEÚQÄÆ«2ÆSQÝ´3Œ@<+£Ç9}í¶”uQ›òCßżÝ3hצ2U´B²šÃì|OZ|GvöEZÚ Y±‚¸æ( þ;ÏÁ.«í{¼,9§…ÐàA,L½p&/ãÙ'” YéÛS»/$ìÓ› Jß6»5ôó€r¯­„DT2l˜ÇMáÛ’ïCE×Ä=°œµdÑüLs8KohzJ—(ã(ÂÃÉÙÖ¶•ép}Þ.ݳk:( ®:ÇæèÆâ˜×†ŠaaäqvÔpÔTHÅ*µåsH»iÜE?DÝèo‰«[ÔÅhÊ`ÑL«rÏfüÜéc*bš:9; ¹`ÙIrç”’Þ{‘ëjŸ¨*ÁÒ@‘þÍ[T¤›¾ÜËuίkÈØGÉ\MÎu͘·2XæÛä ¶cŠÖˆNé1µäo)µ0« »T›áPÏkJ¦š»îtBï©d­üÈ]¶ÈÞÀ-@?Fý9‹ugÄòÌñ�ùCøI endstream endobj 71 0 obj << /Length1 2080 /Length2 13820 /Length3 0 /Length 15091 /Filter /FlateDecode >> stream xÚ÷PØÒ ãîî\ƒ; îÜýàppwNðàîîÜÝ‚»Á3wîÌÜïÿ«Þ+ªà¬îÕ½»×îÞ§ "SRù l 2J€ìœ?°2±ðDåUUYY�,,ìL,,lTTª–Î6ÀÿÚ¨ÔŽN– ;¾1DFÎï61#çw¢<È ãb`e°rñ±ró±°�ØXXxÿK9òÄŒ\-MòL�Ð Jdïáhináü~Î?hMè�¬¼¼ÜŒ†„mŽ–&Fv�y#g  íû‰&F6�‰%ÐÙãRÐ~´pv¶çcfvssc2²ub9š Ð1Ü,-�Ê@' £+ÐðGË�#[à_­1!PT-,þãP™9»9ïK Ó{ˆ‹)Ðð~:@EZ h´ûYî?FÀ_â�X™XÿN÷Wô‰,íþ 621ÙÚÙyXÚ™Ì,m€�E 9&gwgF€‘éD#'Ð{¼‘«‘¥‘ñ;áÏÒ�ŸFïþÕŸ“‰£¥½³““¥Í=2ÿ‘æ]fq;SQ­-ÐÎÙ áúÄ,&ïº{0ÿu¹Öv 7;¯ÿ"3K;S³?Ú0u±gV³³tpJ‹ýÅy7!üc3:8YXXxØÙ�@�ÐÝÄ‚ùT=ì:Yÿ0¿÷àãe²˜½·ô±4¾ÿAðr2rœ]€>^ÿvü/B`e˜Zš8Œæ–vÿd7ÍþƒßïßÑÒ Ãò>~¬�–?~þþ¤÷>a¦ ;è^1³„†¦ª¢$Ã_-ÿí¹¼>p�>°±³8Ù¹\¼\�ŸÿÍ¢ddùWÿŠ”¶3xÿSì»Jÿ-Øõ¯  ýk=è�ÿ›Kô>·@�í?c®ËÂÉbòþ‹õÿó°ÿòÿoÆÿÈòÿ:æÿ·" ›?ý´ÿ!üÿøl-m<þb¼Ï­‹óûȃÞ7ÁîÿR5€ÿY\y ©¥‹íÿõJ;½ï‚°¹ÍßBZ:IXºM•,M,þœÿ˜ÕþØ3K; ÈÉò—ð•…åÿøÞ—ËÄúýõpzÉ?]À÷ÝùßÅíL@¦,'ÀÈÑÑÈå}’Ø89^¬ïÛh tÿsˆÌLv ç÷À{w>�3#ÂWÊÅ `ýÃô'âæ0Ëýƒx�Ì #�³Ò?ˆÀ¬özSÿñ¾ç4ú½g1þ±¾#G#kàû‹kæüýoûFæo/€ÙäoÄÁñŽÞ÷þŸôˆÆlú7d¯Ädccäø/Æû™À¿á»LÌÀÿ9‚óýl3K×QØÞ —§x§˜ÿSÅ{óöïoã?Œw›å¿à{×6ÿ‚ï]ØþßדùŸXÎw½ìÞoû_þ÷ŠAÿ÷ ú÷{}öÿ¸ß“Ù¿?ãvÿ#(ë_Öÿ•“ã½{û÷½ýK²wM\@Î@SãUÌúný—�¬ïí9ýSñèú¯þ9ßéNï/Ö?ïýKâ÷jœ-ÿÒø½jg7пÞUpù|ÐõÈöNÿWv¶÷|ÿ4õÎõ:þ'Ùÿ¬‡‰‹ã»Î¾`ï»ó_üçè4AXY™ð[Õÿ]#LèöaòÓÕ¾F*ݯǗGØ$ºêŒÀMÇ_ÂI#½hë»â´wB«¤/^§­ °am ŸÛŸ¼Ÿ â•göÛ–§q§ N…ëˆá‰>¨ x¿8x«XC¶‚wÉPå8¸ð (åaþvë—t¯([]Üÿ|PÍ%‹ø\6û!Z-J7 xž*×8sÆù1=Æ•;êüݯ9Œì©7R™xŸ³höB/í-¶˜‡Ï U6§n|J|míõÌš}Hðû*†öôuö§(Kx fnn’yŠ-EýúÃað÷Ꭰ¦ò®±° ^Û+PwZ§w²§çuS:ž£:f;ð;ØëÍ"b/a>Xò0D·<ÝÞV饔µ^}VSgösîî*ƒåâ.(°Ii¨h˜ßš¸©Fâïj19tá«yÛÁàu{ètFðW%ÔÖ˜®^9ÎsǵSydŸ<Ý܈=l§Š¤91šI­Lâϵ±+ PÒ"¸³ GÊdkù~Sɬ™V Í´KœOȇÞ÷”å>™¢S˜3Ô=ž~j>8€š×Î 3òkiNÑ ŠP¸ÃŠâÔb^Ýý¨]7XpT6�ŽC(>Q¨36I-ØËq´pÿ 9j&ÏÂÞÚ¬9\A§2ƒ Gäydô¦Z¢WÐ\9M¶´^ïËDÜG•9¥À–î7ÔØŠÂOwe;:ãD} +z5¾©ãÚs=ÚË£îÃÕQuaµCÔb:ñsÇ`éÔûm üä¼Dí!J>>ñ›]}3Fw‹VL/“Ñ9«cR¤vÑú'¿ÝbGæä›çèÝm[p´ªR°ÆÎÖ‘™÷1+âìͼXĺ½¹„ʳ3ùõN˜«;-¼§¦™~+ Cý©‘‡´Í°ù¥¿N­±î¹1äEÒœwõb+ÑO°qYNœÙÒE¸º6Â'!ë+ZÈ-„£Ê-¼.ÿ¤¨„Áij%5Ê`ªY›ÅïS÷õwÖÕ€–æø’K9é÷|Ρvûµ8éïEÛ¹*�œçÒnûÏÑ,&àRió W.:gÈnZ}Éß²ö3Ù¾ë8OÏŽŒ&¯æG5dZܦE´gl¿Ò¯CPú#˜FP”BBÒ¿ð ‘æ\—ÒÅ”z«Í\–žF™áÂ<”cŠ58ÿF›7Mé-ÎùT‘žÁ9ñó»aSÁ…wÕ©¥Ð[ Îæ0:>øLø˜*3Ø´C8Úú´Äqí}\+k¢³øTàlóFžòLž?.+~_~„¾²`ò‡Ì¤Ì›Þ"œ`Xý ²§(zVs·ûC¶î\梜ìö.¡òÝnÏ5#Ï“V¢cº/ÍL[iW?"ÅݵhÚ†ËîO8Ã%Lü>ÙYu²ít,À,š`ʱ"E?ÿ?b÷7Î–Ö Ëˆèñh©ã‹ßC6[Ì-]?‰LØ?¹.z*13?£ê²Ï}úhyMªHBKãU»P7†âVþªr L§á{»›!Ü©g›šì>ð!¹—¨ôY(ÍE·ÅŸcêCõ¤\heà ž®¼Ñ$ÅU†¢€+zÍH¤~é3ÚN×xú=ÅϹ‘Q d+|…öT¹këÁ¯ò/9j]3%ÌgŠÐªT†ÔgD^Á´x²|L¢g–²¼y]îR0]wÄŸç9Ü 8IÂ÷csVÚž#¾õ3Þf›îØpÒo80&Kýb(&Ôñ lÃ+(ØÝk÷KÞ@Ã:¸L4Õ.Ê'BtÞö˜?Ï›2CB0Á‚Î}éû;’1¶Û:QG»€Xö¿ÇX/ê|@¨þ²`g´É—^ÂÓNò»Ä†‚�t¤¬Æ1|4oŒ› 0ŒýÙÕbÚ§UÖ.×lypÍçea«82u¨ŸAÖœŸN©ÓµrÏ,IVÜ~†Žyã–àe†ºŠVG*=w% jDJíÈÀ*’u—¿zæõå‹3Ññä g82¤L‚NVNáª*‘ýƒ<± ȼ_ý*è«&LÕã `阜¥‰,â—^ÃIèY s.üÛjý«ƒ°‡ÔàØI‡c·¸Qûýy›tؽ£¯8Y ¶Ú.¿>-óÀn&i¤9ˆÉ t|ñZ?7¬ÃJ6uK$ô^ F–”yódnÎ8’¢éÔ¦ þ²–¶,?YÀ]°;¨6^�÷‘{Ó«ZÎþzß½:&Æö‘õè:{PðYš*¨àYÔ·C YûÍq¸Æ«Ý·GMûW¼,{q^²jÛ%žƒwU`Ë„ïÐ9ÁX°í{Œâ¾“«âaÆKºT!Ø­yÍä2,ân&i,þÌä¦Áÿ’bì†Ç-‘³¶–mô‚å5ƒ37f·9ö.§þNè?‹‡"?lDŸ?Oùë q—+Åz“À·Ú™É±ßD_l9M3V˜]‹êtÚ$kÔ·Ã"ƒå¯°%+oêëH¥© .0 ¼o«¨Üè‘’¨´3½¯››È%ȽÝ䕞£;( Å^ƒDï íW"O‘‚ƒ ¡fmaÒ·-!£| {ò>¡±`Ü¡�ù$vøÛ¬VwÈåEÆ"î—cÕ"s‘(Ì•h^µ‰™jAr {½^ÄUèQûI‹¨åžœÉî¯%סj<þS ž¹‡?:åBëý!pŸùHd#ù«îs5Þ¨Æ5ƒï (—ÃøpGxíw$ôM¿‰L’,Ê(Ó‚sé|P¥?ç ˈžñÐ3¤‘o|¡…D¬„«>•Ç,W¦4‹÷W%7#Š"‡Þ§¼jSUîì:EÔ+a“ó? íã‚Bº´ ã¡Çf1B3 ú•œ@†ÛÆÞxåŒÖ,ÿq R“ܳƒu“’‹»Ùç)@ãã&«Õ¾å7×á e'G-¼¦¡pX*·Ïè:™«êòùÔÊ·qóéÚ‡¸Q¼a¬„vWetl‚…)¡«:†õ¢éNdÅÏQi˜ þv%=\ŒŽ‘ÆëVeð®×¤ç£¤6iHÆDòaÁôÌ„€_»Æ"ÙS“ÃÏK<Þëk’SY?6.uùÛ¤ì·aLØÂ7«ÝI5'a°rXÉù¶°·Ñ[“÷Ñpœ)Hú¶p©Zgî“̃#Tº€:žß²`!>€ÑM º”G±3$H«!pÁýgŠÁ\®wž.qBÆAð‘ð–î &ƒ†ŽkԎ݇DÈ(Òg'0±ø±«­èpȬ*'*¦Ð·`xûZ”!†t½•w3ýxK|Ð8]Ièzˆ¿•1ô¦%¤«T­Ý¯Ò­Ì³¤Lá˜hùzv.Ë3ˆ˜¢¦!R¨ ìºÊnpü*ô=ÝW½ô¿N˜è9¦ïpªšC[ïr‡T8K%¨®‹¾L-’ù§vôx(±46IÓ‰ûBÕ]ŠÒ›­ÜøéSÌ^qúPžL'ðÜ‘Ís;ÆI1¸e6g¯/Íuß7¨d–îÒdzzá·ž7ΙX+Ãù€-#°äÖööý.šð$Ü•ž«$ FV j‰T.£œc,$ ,9cÎ9+8Û  O…áé©Oz–‡wS»Ï8ãHY^ígÌØ², Ó2Ül¥.ëi1D;ÜÊÇÐ7gú¶v{®·}üá v :-š¢•J˜-¦×6¶ië’:Éõä£xŒ/Τjܨ¾Ðêû Ý€=B=¯á?¦Cù˜<–§ nºñäj¹*“£ÑCÝ…Ýê­¡Mû|2-%?"t6ÉmªØ—0ì jƒ_½^‰›Åç„KëJBO.ÿq†$ÕãxiÇŠWAZ:u3ÚbaõƒnBÄÞ‰ñA2mú}¾¾­w1»ÝÉC¸¦‘†W€ÊkßÁt°*»N£C9ý6WÇÕ”+Œ14C<혷Ó^ÊE-5(Ê»hëíÝÇíX‡ñSòŠ/ìFÆñµéãÚrsIýÞþ†zßjw¥c}Ùóø¸=[ZZ!bc ä¿[)±Íš¹IRV¿mú ·~ÕÛ…²?gÐì0¨†�½¹ï|³ÝóJt~]„M�$a¹ Œ_¦&ZîÂY€!ð*8£ã á lw±49pšØ“ñwC0ÑönêÁ‚¦Ö™!±ŒX^!Β߃=Õmuò°{ Ç{JlkqüÒ€]V!’M•Ù.Î:¦ó}âÊ(6ÖéBWì»àÇÎVv Ûl¯äÌ$ÏÒØ÷öç_¨’溈†HÔ„ Ñ58’}¸uòa‹Â÷ú,LçF sâ «¹ƒmÉÁ¡šîÀoìMâ{úøõã1ÛS77¾±°OH@vA¡œæ¼"×á3 „!éÔüuDCWC| I8ö5y”48å$cÒÛ¸¼¡‡äIQî¨ É×uè?“¿½qoË"’ñˆŒvÄØ€0­#A€îH¦p\Â]d›ƒU'X´?–¿‘×ωCl/^&"Ô 75Ê"ëûm5û3À“¡tn}´•luö0gá(n 'a=.:×­NVH7!©8¡ˆH«6G-Ì»Þ`¬�sIá•Û­]m(½+-ïÏXì¯:>»ƒÍ8‚v¥?‡×§¹z^¦]ÃW®9b K†Æ¥Æ÷©m‚åê4ÕFîWØ$H½ôÛ8ðC¹àí¾‘òû¢¢·y_ªïXfÉ¿:¥OªˆV@|êõEzÒ™š×ÿHö¡ˆ•²†S.ñ‡<:ºôWœ…Dé 0Ö0SŠ Þ ê4éXÈŠZÀÔ€yÌf“ }»:8CI%öº„†i¨¼Ï”²–Kš±ds`¥ë·CAsykNmP?hk¨$»>hÖ,'Òwó\²W`þy¹ñt"œ1-§"u×ÜzDBœ³Y25{ÙÐ(\ÙЦõprç˜Í²äÑy ž–Y§_h×›_´hLÏÈ‘kwAó9X£…â»hd˜"ί/ŸÏ¾h–ʈTo‘XÏ;\cò ‘ñ0ÝL vÑ÷wÉÉßW ]¦w%ÉËâ§yƒdÓ¥ìfÔ‚A-„n æÄ7ì_{¢½ã•;ˆѯÊiKQÀUAÒ‹êºý°kz–‹ªæÃ‘Ñ:›ÚgV¡DUù¯‰œÕ%4 vQÑ8~E´QWò~8Ãõ‚¼ŸºæÃŒ¾Îá {a=>ʵG4ý¢ö‘;°sÉ,òÃ+äXËV×ßb`Ê31>)¡tþUÇzÂÔä3²84×c2ó\íµWþñcºëÙýzË&θçâmØÇGÄ °ëäáéü 0ÞqG˜xäÆÎMi£©”ÇÓe‹¹êg�=d¼ÞÅÙyü]È,ô;?R¥‘¯ÍôÄÚ¢#ƒéŠY'*þð§,õÇþ F±¸m“‹Ým0û*Áµœ“I÷|¸¿ÂÍâ¬|èI§Çm‘­Šõbn ŽHÝԨ߃­ÂwTŒ§•„C$°KÅàÚ%Åú›Çk¹Ë¹iŒ.ö¢p_GJBã&׋Œ ¾ÏˆQgEžt ¦áZï!?ilæšÞZð@D͸*[„6Óô]R'Ð,ä¼›:¡T©Û½¥Zï[ÚÛiA¬å'ZÔ±”œ#O¾@À7Ê“GE¨½†ÜCi×*¥Û•gÓ¨9È@gô6Ï·=þ 0“BÞäêcM$ž3 ¯Ìx”…L­ kl§Ö+JG†tço/aÜtÁt›¶Ô‘rãŸç‘wå¸è*ëÍù7„.ýŒŸˆo"g ïþþfGO¡ßA@­Á•ýÈÇMT}gE`›ž ‰TFÖHSÕ…ÅÞêŽÕOøQÇp±Wuñ%ÿÔ.nC?Í©m„/[?EÞ«W› (è\åc£A½Ì¡f»}x `1Wñå:žM,pÿjfl©Oښމ̟g˜/iÁѰ±q ÷¦„X3eðÅ=y¶•73%€èÕ®¥TX÷¶N£ÐæsÔ¬/+ °Ý]ÛÓa+Å‘"þc9ƒZÆ}‚Cm·€ƒñÞj/¨O3ùð¹×}„¿‚vyÅ'ç¹:ë :¹bÁØäõA¶Ð}­IQT@^„´åíˆE²œêþèp^÷1pÊ)Áo.<ë¨áèŒ(Ññûì`嘘y«^¨‡žˆQŠ|°•v…ñîE]ÁB¢Ácöö~ЍpX*ж\{Ó™>I¶~b3dÔiÙ4oÛ,¯ H·ж­äÛûŽ¿�\åÌÃc÷ŸèH.ÍàukÈ#xOŽÕ>ãjݽר˜¶iछ-ÍS,;M}O0û-Ÿï1íJÙÀ0âØB°¯q~>±*Ìø¡¿ ¿û•€|“)Ðé‚£¯àÚLÐËը‡žÖZG_¶&n"nÍÈõîDµeù³§ßNû0Û¹ te._Ñ‘ÌåsÑA¢*AM„X<„µ“S½÷íwÜ—åBÆz0o‰Š¬gË­—ÀI­ùTåP~Þz¿Çp±4ƒ*mÅ£ß0?îç=è Ú_®ƒ¨÷£÷Põ¤Ø––ÁÖXÖA–IB¯a"wGBbY¤¹žÒ£Ø ±™~N '«F4 }„FPœOä.>8®âê€UÕô˜2”‡Yi¼zr^iãáÛRU½ã�v%‰ÆüœÇè"bÆþ<Ê›dzá%Íþ² G7q«‡82Aï0Q˜Ý²³Ðw‰ ça‡j¸Ã íS¹cé(¶ƒ0ªBn&³S¦°:Ô°g…2¡K]Wøæ–ÂmרYÞÛh!%s·¼°vÌéu|ˆzbâÞ©ŒÌ›¯N“òW.|IBŽ¢v›†NÈ.<È?q=$qsV¤1>e °P›ÒPË[­’íd}¡‡Àk }œ‚¿«²ØiXt†½•ÉëÛu]Â>óFÑÁ0²×U4‰JMêx{ØfÔõß P§4PB¼Ï¬Eœ¹ZÇ‹7”2)>‘lžÙ'ØY1ŠÖzkpÜ,ѵ5N­ôVo0¾Öhåà·¦.LªÇ*£ò(wÛyÊ“æõα’±fM»DQ%ˆÊo¢QM­c¨˜K”¸S~Tžßb TÓÑüžÿ»YC g£Ó–‘ƒ ŽˆÕteˆŽ7¦oA¬²òbÀibeMOâšñAèLÉ’ŒEÜÆ–‚Û \¬!&Ñõp±F4ÄÜæí—\6uÍŠébŠëmolñbv¤H3Òùõ}-õGê"Fè…á¸È ü¹4J²hŧU7z0*D¬'}Sé0ßúêºÛ]RÛcÝfŒ~UÔkÂYEG’”e1QöüQŽÌ¾ÓѨ_)Ž+܃‡R“Ú¦è ÒÇMåt,Ü+`~v­5>)s¬i@©öÄŸÂZÕA–_ÑÖ"F?|ñÀ\(I=¯ë ôþ%NëàË'Ÿ4¿€ÓN°zÍÕªÓ”û€,}sR­Ÿä´Öj».r‘\M¿&µ„§91Áeö˜¬ºÅÞðÕ»Ÿyº /ÃBQmùþaÏ<ÖųçÜ^¹Ú~y7mÞNÏúó‹€·–ßRnç’g§²ËÑä^ã:šÍÞ¤€Ð†5ïM‡ÿðL†E`—ï‡ÜÂD¿¬=…¥É[Ô±ÁN¥kÅ71Õ²ÝfÑoW× óúòµ>¥±ìáäÕIßXlVWÑÐÉð|˜,½Ð&QÈ;o‡p«¾}ü1tÉ«g±Î°E‘±6Q¬@ø¬ÄŠF qæ»È–pŽ}óš%„³h5~¹*ØR¼ ÂpRÉn£QŽBY/‚;Þ–ûÝ‚hŸ'I¤ìŒ‰'‹ô¹¢N²³ÿ¹¤!Ó÷Ù$ }9ô‡ˆ6`D ™±{m°é¥÷EB%¥ºž{«ÜïgA¹ˆ^3m‡Ï3˜pUèTxew­ë÷*pλ$ÄÊ(κ9/ÊO²NÛ8î,Wöó±ËØ\üâ†áâ�ê2ÉGn”ѼŸ„߬ž¦µa/öIVuxã­Ä/zD,ƒ¦ÝuV™àˆþ<žÇó7OÖ+圓¨#þÆ[³µ!C¸\„çw* Å 6U½Xýd9#«³€¢ sKÓ]G°£œ,µÍ T¶Éy]g£Õ1”°ñнG¹¢~¾žð^ËrW=Â3¶©z‘FǽƒÖÖ}Ií-·âÙ—ž–Ô’î¢ê–Èk©Ì¸úÝõΆQû£¢tàÌãÊ™£¶ys­©XÊ„G¾ÇmÜ 8ÛØK€ètò¼ü»ï."¾Lȧï±ÓïLw£‡IÌN‹ÑVàNÛýôerˆÔfæ”ñ gÖ´`ó!Œ»øUm3u½Ó¦GA‘-‹Þê¼»WÅ?"9ÛMP­­õª¶Â„u�x^¦Š0§ gœÌ ÐRd©&)7%»_Ä;¿‹¹�Ð#f99›j‰ÒƒŽ™ÒÎÆ(1Púÿ<óCSÎ7Ù€mïcp¬ãÍZ/¦VÙ…š‘øNp±)xQK ï$mت×rÿM«¼ÉÉÌŒ¡ÕJ(@R9*>Ôb†ƒ×᜖ÚÈG¯Yü6™f–ŽFÃ5Ä`¹6:kïµÈÞÃ⥤x˜VÙ#翎qwsV)ÝâÓM5œЇç]>MÑÚ¯³nTÈ-`ýqðIN[ÛQÝÿûÇÑKÂs‘aôEöc ­Öa;À a ™îî9? JÑE¡>Xæ¢÷+•?Ìs /"kö¨c´V­ÁÕŽ$ÙÀf¾]%ú$¦×ØÀÏ>‚¤óOÙØä8†,¢$aæœ%âUÊ»L§ý‹¡5³YX¯’ ˜6†àø°rR³Lö“ñ9i ÎÃk÷ù^Ã?h×°Å“Ö(µàÈ´„8éÖÚ~à�3 d cã„HÁ³ƒÞœZ: K뻂^ÙXun³Ù_}Ç1Yk¦©ê:ÌQª}µ)õzì›(ZS{b¼~0mpFëÑ ™U½—å>ðµÍqáŠNj9¦é­™ÞäÞqM‡IÖŠª#xW5"y :K#{ìè e#G«$ÊÄøÞ*tÙ¥àœ]u¬»Lú3Ið¿&$‚qùÓÄR²Î3jÀ}¯¾Œ+–·z@Ѱûí£¡;#ä|’yLh(=€ÞH9X%™¬ª;X¯A]ÁH&^¬•q³´ß8G%ÙÁè Š O1Ôvábˆºš¯%Ò¬Ði0©7æFAˆð“3˜ªßž7ú :á­-U>#$MûTàøê͵öëk •¯°°—-A{#-ðGø¾l­ä»˜æœ!¢4qï'·)\È~É(® Žívz¾¦•£2¾@˜¥†å’óeEá&„„£Ø90_¢4^\•åiÂ-DÍûC }ý­µOÛV-ÇUW–-ês÷ͬbw†ÊzJ+‘âÕ5ת¦ÆžX-;HÔj`?'VƒN#Vä‡À³ØÏ0ˆè)²´’5¥©õ¦v¯ãq«·€±:p”i‹ÔR”<$³”¦ãËè”ýœ¿K#‡lKxY½”.qÆ!»ekŠ0ʶ?û"Ïáªé*¬i¤xjöóšÜ¦åM…¥¦ü&«ÄNÐ"ç’…xmªöÃÈô‰m¾N]²Ãské’zçzqßý244Üã­ägÚW>§–‘€)““Jw‚­� [‰Û‹ììÏ NW¼þºT°à™Üô#žÇLî •èË»òn…²ßÛëéé×´5NoË«(òŸr»–6ÌŒkâØû2Ù±úý›¨C¿ð:¸º¦ú]c}\‘hö‚[EÍð³ê²8•'5sü0ötð{ÜŒå>ù÷¤¶a¸ tVfh êu˜cS×–Š|â4Îã&Žv}`¶ßA¯‡+x [Ú™¨ ¨Au„'±ŠlLv¹øá®€xÃtA×GZ­È$?Gc·gTcñ q ·D3»Ÿ€u±qScÏ_èØq–ºém™ûqˆ×ʦæ�n¤šÊéÉl†;ÂÄbä.úÓ5ÌØr<ÊE¥×õ“þ¢F}™n¢?kí%öÉ“@A¦„‘•ÜðȺ>I‡)ù9»¹Ë]×ú|»M8/‡Ÿ?凖tôñÅIðŒ‹–žhÖ e:‰ û’¬Ž}É)GœÌ»«ö6Ògbx6r²ë —PF±v/‡;xÝ£¨š•ånì/} ì ™TÚYxQÏðÐVˆï–'nð0J÷¶qƒ¨—ÿËF0 X§ü–VŸ48ųV.z®1Ów‰ü]­Â¿½¥|<êØ= ÖÀ}×½ñ±±¦‘窫ÿ9ô¼ÃÐk§kÆÌX;7M¾¡0)7b{z­ õhZÍCÜö€Yx‘@i±›Ð•#}ŠvÓv9xæPw„1tÿ˜m±é±ãµè=›‘+/a}>‘è›aøfJ"W‰ ÃK1V9,jHìÕ^Ø,V(-¸ÙL SÔÝþí-!ÿ -pÖÁñ·+g„QÕ¥èK'ê^Í·ôRmŠ®\öt¯S¼ ¨­u÷bÖG*öô�Fô$²¯o¬ %F• º¨¯qÃMÌ;a*ugEu\ÂDHó�MœF´^ŸûOà¾p¡QÊë*¡Ààs£{‘Ûî‰_Døú*®ZñÊ ân®È’OK YFþb¾•U·¯(+MŠYç¨÷ç0W^bŽÔËçùþ«_>—5ó‚|"›Ftp˜¦@ARvÃW˾CQ? Ì|ë-ÎÖwGó‡:¢”éÛ¤akÝYGAÖcF*‡‘vl%‰ŒÖpO¡¦g˜ÓŸŒi}Á|›&d åÙ=éÜZØ>Î.ó¨tÛw�:Ä|Yürõ»ú¤£˜Æ“X> šÎH@šé¼íè¹­Ÿ@E† ‘>.ÿ41¯^¨»~$YfÍ»#r>–ÇæÝû|Â)U wÚBÒ|¦ÆP*?²ÌÒX˜¿é£&ôÚz$?6“ÎŽNëⲨ¶Eh’p¤d¿»§ã+S¬; b`اÇÝݺs‘ßþΗ40€{zZÂÊ„^au5_¦îcÍût¨2TmØu/ÐÕíj›Ê#ŽŠõ5|1ÒÛŠ‚€’Ú€GFB—1%'t¡ë;O•æ¨ýËã8—s8Ê(4§ Ößž3t0Næwû ¤MTè%i™¥B·_“>h‘1š¼vïBìÐݼ-¿,Ù‚<>V>|ëô`H¸ˆ·ýÈ'‘7AvmÊ€;ywòØž4ùD¯íµ‹ðŒA{X­þf‰Ôšû½k-êdAK½Ò¦2’H·iLj•B”ëÜ]RÌÍØ�„lJ¢>OR5ÒpaÞJ[Sœ¡fîoìå‹fQ–Å‘F`Ç)‹¢(Qóqœ­sekk{ˆb…Êùl&ô–$þ½¸i2×Ì’nJ¾!@KÔ’˜ð‚©%ÙçÏíÂ< µo_qê¶áa”Ÿ¾zÖº(oX«~uíÃÓ3±·ú½aㆧ�ÎäiòKW…(³¦Àüæ~¥÷ƒÓ¹Z,UG=]Hýè†ñxb¸í©ÝêÕBõ.±ŠÄƯ=šcnŸÕiMWsZqŽý¿˜öý¹"Ôñ6Š'ø¿EÄÖÉS0ÿ‰\pi÷ ø|õ‰Ý+¿tŸ…äjÉô{ ù7šXÙkUý)ëhçú¦‘ˆ£KóŠØÛ¾=*öáÏ?_ÏB¯.‡Ôð;óTEÁMƒh%}h¯«L«†—]ÒOë̉˜­~‰·¸R† x°7©xÏÙ~ë/Ü€Í'l9#£#š.—|¹R¿ªä!•§ºŸñÇ‚œD“Ê­,“7¡MsõZ¶Œh„.ǹܑø^UŸç˜ÇNÙöFë¾±ã#BÈ„l™yZØÉ Ç÷Ý¡;“EFö(Ü' hg‚à&Ü›e…8® >…ÁËqò1V‰Ø8)Ø1–ª8¸LÙ×sqSwCãœû÷ OßèI ±æãsš%†¨eüÕïëÎ`=.'åéK}F#¿!;ÔùY‰AÀû=šïÅÊÍ‚·1qΔ§†Åú[ueL kË:A[Léóßc²»]�ú|‚’Ë‘eÔåP Û²2~|n¤ˆ‡Jšpf„þÒßãymE1ãñª@’¥IYІuKç&—ÙAá‚êås‰•ÎìÄaŠäªG±æÑøÚfõüËmO@ÕÈ• IŸ“e.ù‰sÚø|ù­‘èNÍ—Ò`ü+ü9Ý^§]òÇmÖ-›9e’Y‚-ò#ÛMò^£¸¶¢¹¾É:…ÁÊۖϘDȉnÓ‹$› —ºÓÜèÛ@¹o×¼|®¦ÑOhPË¿ÜXîƒbÑâÆé Œ`øÏ%˨Ò{%öŠL†ðD -1jðJ–䂇¦>!‡ö#ôQ1È&»è`+¥‡§{¬¬žÚ×d)¶±¦,ªÞd¥�oPœùL¦9Ä5x®×¾à=‰Ý‘ˆÔé¦6¢¤¬˜ /RwNšã᥉ ÇÐAgf¯…qŸ× ž¦þP©Íd·”¥m4MR:Lûó(°{psÿÝH»¼¤¶LPNÆÛEÏÉæ¿ÍB®‡(GfÍIÅí¯n ¦„½ø)1dç$}R"΋Ë`Ÿèèÿò+¦®’zb5A=ÆçË¥ÿWªh7éÝmLàxr8m‡[ͽ`Ó8”¨æ’•Z[ÃkéT–žU›oíxqùW‡ÙÁÍI“ÃsŒ°íê—˜kn<^Ak€©ª1ü1àn#Ò;ÖÌîº4¡›ú¢x³Î1û0 AÃÔböÛ~ ÕG‰€¼á𫱇ZÍ”­d|bq~jg¾éÌmJö‹©2\ÀÁ+.˃M7£Ù3¯Th‡Ûä`l!ê‹ fH~r³RHBüK!ù$$ùÉ©½ ·#Æ<Îu‘0×x¢Jéž¼OH@Ê,&Æ]ŒÊ^÷$Ô¬¬à‹öÌô ÿˆä·ëÝš…4Î_¯{“h¬ n¾†§ëÙ?tàžRü¶vB éT0%Ħ’0v†µ>ÛêÂ¥£-ô#;ÐI+û'˜ š¬Ûj4¡w_šC÷¸VÔúmÆÓñs}NØ»›ÍÕ Ÿi̤£ÎJJÈq6o•f „ÔÐ1v?\¡£ú©‹ôM¶êå«Ö·dF\¶þ®WðÃhY íÂrúáš›ÏÀÿÒŸ| endstream endobj 73 0 obj << /Length1 1580 /Length2 3075 /Length3 0 /Length 4072 /Filter /FlateDecode >> stream xÚT 8”m÷/B&K²d+lcÍ2öµTHÆÌ3ŒÆ3ÌbìYR–"zKÊ’Þ´Ðb)Û›’(…R)É’ì{²Ö÷¶÷ÿ¿®ï»æºfæwÎïœûœsÿέ ë°WO¢y4ˆ©ŽÑ@ë¦öŽŽ,€Fã4Ðh,BAÁ‘¤‚?ìgΠРýߦtÀ„mf&L´§A€ ‹ `p�F[££FX4Zï‘F×Ì`¯ØÐ P0¥ùÓ)Þ>Løœ$QÀèé騭„x?N! ÀžÀôýà‰*°—F¤€Ìà?R |˜L}ŠÍfkü4º·‘²À¦0}€= ¤‚$`¹e`'Á\mM¡�8úPß{id&›@Ø@¥Aˆ‡° HàÓ½ÖvÀ.úN¶ûNPV‡`40?Ó­F/'¢@+Á"‘æçO€‚)7@¦PA`—…3ˆ© Ò2‘@eÐàxB B%xÁ„•Ò €~7@€;\íA¤Sü™ …ºÜ#j9 ›ñ„)Ìß \7kþ1*"‹'g®¨žã¼ò8`HD¼i£·ÇøÞŒ©˜-ÂK±Õ?6a5ùë&M¯ß×k.øi÷Sƒ¹)\nâk|Í‹¾Ä¹›†°—¿•rCrï ;“¨/öævÙ«G-ìù&Ãù!† Ûg[]íꉃHÞbce{êÙÓÆ­Ê›Õ&>¾<7`i XvýË5Ÿ1¥’a >ަ‰<⺺8>Ž˜Jü¹Êë&ÅøÖUÖòŒI㦑S[,æÎÍy‹YÓØÏ %ÍìŽP3¬yè,;]­Á×.Y\n38½±*~ŒSÖN¨d>«»è¬Ë ©¸gâoyâNû„¸úæ g»Ý2e]çØÕœÓ“4à#RçöAˆ†FÕÏMo'ó«¸mó2ÎTêÍhûÚlT$‡—·Å8¬e^¢O!ÿ°!ò1>gï{½~A}×¥³å­ÍÄNÞOUö“}w–¦ œéŸß}d­o“´ËÖ;Å —ºŠäUL¢—FÚ%GMßܾԕWNP‚ØQŽ{kršG•QçßZ-*¾2¿m!ñ5nÀ‚ä%œ­–™óöÆö €ºŒÏó6¹B;�‚}hø^šªºeï¶Ñësñ»2Psuþ»/D¹É<úˆ˜~x,CòdcUÖ=²b§¾V^ñþ‘JsÎ"ï;·•›,…z"$)rKn”и x¾Ã7Ý{Îw6úŒeWwhô¡¤>‹êó†­b–ĉ°€q„‚P‰àõˆ}»31!/Vl&*ùÈxÿE7õVýn÷ì›ù¸H¶pOB´få™gUäK•oÊŹ÷{ðüTÂpýÅf›éQ/ÌX’«xÉö4¤åRÓ[½tZvª}•ZtJöÅ-²È:)þ\í‚þïénCoè̘)¶Ì“øRxã¬>g[}JÕ®Z(™ˆ81�åX¿/ƒØd¥ ‰üÚuÃð±‹D’u샓[å—Žî+œ»qSîÒ\§Vž |çâ›É'-ÉÖJ¹‹ÆIu =Û"b*sYŸNi¾ ¢Ë%œ#†Õû‰:û"“-Ä’Ïx„u»¹pø‹Xa`ô¤*5@ìk¯Íì+µ²»çRTˆ]xç¹ Å0ýÐÕsû†øU ùFrà±ÍHÑ¥|†ÆûÝýžùéžÕ¬—oU¿­çf³9ST2…]IºqÿÀB?ˤÝ#÷ãi—m“·ÏÌÅ¿ŒE¼ŒÛšm…4Ø-¿ïp¸?ºøî¥F÷…ñ^)ÿ¤˜ÉËÝesH‰¿6œ=­æÄ ¾+Ì%Ex¡ó¥hꃘggú#µHp¤þÈàߎ !Fò‘‘o.Ÿ‰zÑËk销ÓZʺÁÎ QÒŠÞåqÊ\CÈÈnDæhi8ïNȸ„¹_Å_f£xÓVcX0t8º Ë ÄóHYf»y¨éχ¦øwíq+–<|*ÿÒF²Õ¢{¡g�.0¾÷°£òìm.帪ÌX®A¥¸Wãô¶í6Ô-²£5h™¦üc/ Ķxç?ý7ä,d@u 7³2E˜\2l›‰°ÈZˆotm5Náhèz¼®ÆñlãÚoð­Qq¤j9E ±ß¢ÁÍúSÃNÙë1#"Ž[Ì̱_Sê¥?èyžçqÅßÛ^#þkàs‚\i¾H*(t7ãçÙ±µõñüñ¥xáâ’ˆŒO¢‚餧Iù¾Qv¯"sªo|mj‰s~c&U¿;n ñ |†3w4ú®ÑüHy,Kðøºä˜+r›={-4½gL•ÀÓ ¤ kOf²" y»J¶Ø;}Ýó•ž3y6È¡hpP9I¨s²-åôO/ËíæsµrJ¡®é“i/­üö°ˆ€Ûb{¥«o2ðSÝ£©3ø„¸÷©|çô3' 6ñLý˜‰›ãëò3¾Æé„«8ª³eDrŸ˜ì›Kq䬽qÿ†€ åá”ÑÛǎʉÆÖ¶šÆÜ羽o›Ó±VG»Åîíž6öi)Ç9\‹k»ÉAOabv¹Rœ»;“‰Oæ]3Q׸ uŠvæe·t.:…-­ukç\âæâÍßxÒ;›|q¬âN˜É/œ¯‡íÒ‹v]š ù'll-)QjvØÔErNÒòÍÒ|øÙøÌëRPÕhŠR Røªý‹/Ww*ôÌLú~xµÕÑqÇ[¥™Ê$…¯:1î¬A`‹½séÓ±]íó÷ÌÖ­=ûvosüSÃ夳²Ì‚×ö[9ÛŸÕ?ÇÓ‹zY?î:ö7ª¹âõ¥ÆÆ5Sg>ã¾¼o“àÖQò«{>¨1©>Cpˆªž ™Ñí;6Öxù íX;Vj¦_ˆsa*ðPZ²í½ŒŽ9ɸ¯›ˆï7…);ý0jì$AîièK£­ò’3IIusn ö(Ìm)oBWä¶F¹7jÞÕ¶`Ü´jl/÷Nºçê 4Új<¢¯‹¨l’óx£aÆ[½&pûù‰§Žê¹ÓkŸY¼7Ïð©³ælàœçÊŽ´TøÖ´G[DÒ¿t‡Âe±ŽOO¨›‡Tu¤£m° Õ¾!Ñ}±i&­ÙIL(›& m!Ü’²Ö°v ÉS–;÷ï*ÉÆÓ\gç¾y6×°²rjƒó6€ˆÍ÷‹Û;Y¨w¾.t™Ï7¨Išeó}“ÒtäÃ,îZ”ÛXàýÍ90Joýâ|þ­Óë¥êìÛ­‹žì–AÁK£¾¼_·7 ìÛyÞF5¨†‡Þë“UõÈõÜ©ÔÞkéÇã3 1å©m'¹é† erÛÚ§Æ~ 录Ò|£©/˜N3Ð1;éìÝ;v~Éå”ëà#Ñ 26§\›Ô$·9:ók?Bj˜í¸‡  _ JÝk?©¶ÈÙ=ô"…*ÀWWM¼ZÖÍòéÊÌ׿í¹øÍ¡QuêÊý5ø}%V²w¥úDk÷ïÙvAÚ“ˆO¾ž}ßwgڤł4‚SäDQšÖ½ÒÅI(XÇäáÕ¿þùpOÂ).dxüøûÜSÍÌ—…˜ Áv–¤ªC¡Úý*vZ]“!ÃÌãù?™úXG°S*¼3¶J0ôRõM{ÅwôfJ#-¯¹¿CÕøˆäéufÚEíé*¦…Èò=²ã2+^«W…Ò·|<þwÆç œ{N¯‹.¼UÔ˜¹#®åèÙÜpfžf)V4ØuïJù~ý¥KŠ"ÄÍ«¯|xÖÆ1qG]µ)Ñfbÿ».ÏSÜ}w¦Äagz>Iç¿Ç¿“v:&œVÑpwÓ…ú½¨"›s“ä˜]ëã óÉä‘ÚdýÈæbU‚ƒžÆA×¾<¡bÛǧÏwU[ox4þ®aøb endstream endobj 77 0 obj << /Producer (pdfTeX-1.40.18) /Creator (TeX) /CreationDate (D:20200428101446+12'00') /ModDate (D:20200428101446+12'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj 14 0 obj << /Type /ObjStm /N 54 /First 411 /Length 2388 /Filter /FlateDecode >> stream xÚíZ[S9~÷¯Ð㤶bµîÒTjªÈNBpfSy0¦žìØM.ûë÷;’l·Û4ÁÀîÃVªÜò‘tt޾sÑÅmÅ &YpL8&µ`"0¥ÑT0mÑh™ö–IÅŒ3LJffÒ1çñe™÷ª£ ŒÆ€ÀDa1X1!ŒeJ2!aÊ2¡ŒbÊ0¡d- $(ð[ˆÐàwR3 ~/UGƒÏc:š´bš¦åñí™ô˜ŸPe¦`JxÃŒ€h#Ñ‚¾Ó ˜H_Ȧbæh<ºÐoA癕Ì/˜Õ ÖZ`¶èòPH®“ÃG¨hæ¬/:B0¤gŽù:<óÂA*óª€Ræ5° ɼÁÄDÁ¼….LÇ{tæi¨4,Fu¾º•gA’>Ôìà,¾ƒìh0Át%dÁj]>v eŠá0äþã¨`BÙ“'ŒïÂS±¤ D‰„\&5S0~˜“’`fš|?§£2M@4”ò×ÓñਬØàÚÙe¼W~¯ØÇù|®,|±°w‡¼=-ûÕp|¹Ó¯JöÛÎï²E¡¥…ÐÚ<‚Ðñik_oXÐsÈö¦ýÉùp0c¯®ªÉUõ(;½”SêU]ÛU²®15="õøóíí­þ¬uód?¡»tNøUþߔɫ¢‹£-ⳬ©Âv]­-Õ—­8¶B Îu]œ­ìÊÌW“'ñ¾KÞÈ¡òhÒ‹ ùõü×XØ*²<®ä=#º:^OR«õÔjáÓyK0¾«2Ï’;qh§bÄXK^tqJGþ׎¼kƒ&š¼î16q8ø\d9™Ö†b&Æ. ±t]èŠrƒÖ :—1¢¤sÂ%£FEíyQ’1ÂtœIVi£1©UÆùÈ(_Gy©Å…åÈ%w*!û¹ÿƒÈ5^!rR„¤Ò+jIeòwÍ£ÇaCË@5I±é⪇B‚ÂME‘»k$,IÍ’ªs©,j‚+}µé]7±¶G®ÍÂÕÒ*•©… å´J°,¡ÈId˜óš’“.þ6-ÇKœ–îÔ1”£œÔÇfé1=“Á³|“Ì) ¹P'gäh“ª™ ËÞ¨Ñ5ïÅÖŸÊ¥Œì ³Ê8T •FŌͩõ&‰Ž%âJãÊn¼ ßº3Ýø{ -Þ 3L.ÐO]“i¯-Y°œóмՑ/€C+3™Ê´Ž)!Q’žLY¹hÍ-šÖSJ˜â· œJ+Zm"?µæ1©5P™Z‚r™cÉ›úµ¡yhŒ@ø,¹bŸOºÃB,"Ä•Ävé÷*„š'#ܧ$)óÇ!ÑnÉl©L-·" ý¨Ž‚LÇ@ÄZŒ=D%ó«È¥Œ"*Ž”1î!ŽRsyid–-ã. ²‰ ( »¨˜àW¯RˉÑÊД ¡[ï#bm>Ö½Èc\©OŰSž¦›hôцÈùÖh*–~T#`Òh,XÀ,õFN%‰G;wº¸mºPbÆ~jóyt¦¡‚¬ °‹²ÎX·ÜZ‹Áº‚×ѱ8ØkèzK’¬ 7Ï%-mõuž<6µÇµ*µ8'ãjÇÖeF…Ò!&Zô’3öFDk·)ºð씳Át8©ÆÓt:è_ gçÕaïàÍ?¶_n‹£þîV‰c+^«ËKZó„Õ´ÚáVõt6 [8¸£õ'ûåðìUo;œÔPßcAÏ«þh8xzy6*ÄUåÅ;BÏq„å2ÎûSºdýÆOùòé£4ƒÝ!Æ™•;ÿϽÙzöçÑv$[)$0J®‡T„V@Ïùïñ>ZÉ?ñsÀñ ~ÉÇ|Êg¼âWüÇ \· Ü¿Ús ¸‡mîÓEv_Qü ­ºZ[«DìS¾ÍŸñÝ ú=`Ÿø`<_¢¼¸èG#Ä¡0Å'ú yü|…mFü.÷€s~þcr^^ÂTóÏÙ\—ÃË6£œð ]ëGå§*QÓ(qRN‡ãSþ…¹WåéÉ(2Ì+‰‡L>+¿BöløÏFýÙ9\POË’W߯pÆWþo¸$lâ’ÞëýÞAtIKbɼ˜<ò’¿¦ð‹ÖŸÛžBp[$Äÿ.§ã:\+6»¿¿³½½áº¸*E`ÐXžu¸5\Óר:ÜbîBïÝ"ßÎb¾}Îù!óo+XÕ&X·ž¼Û¢l;zÑëµ%œ¤„f+°[ƒ+Ä \ª.àJ)Wá>·H8J·=8ø0&Ü[ ÿëÆ¤+¿\õG”z1áR¶ÑˆrZÏ:ʹQ9›m–x“ÑÕl‘nLûiŽÙVùý½Þñ>m[GGmn@§¨ ´ìÝuT½E’9ߺƧ˜»fë²­åoÿu´G™Ô{ÞJ™ù^,õ}–ŽÇ´çèò­Ñ•"i}ßš,v®¯+h7Z&wß÷^íÚÖLÒ)‘ŒºW"·Ê£üyô6®'üdÚ|.«è™N¡>X¤Ôéx4êO—ÛY-£y´éÎu»ÜA欭Ùn£5ûÝ»½§ï“í[ö(ʺHº›˜ûÛ¾}‹J6/æºÉB1êVp·¬ßÐ{uRÅ*5B!½??ü¯yWÌ„£~z±°;œÎ*š%œ:üE^£Ôy?<­Îgô÷‚µ7¨ í¾©Ý©ºr)ÊÜ\y㸸ªÛkÈE›nq³¯ž‹ºeS7-±5£»¥î;¸¼qHièÖMÝ­5Ýa©[o®{ýÐÐP¿pJ·˜]»;@ol• åëñ&Ú‚=l®¼¹¥­*wkÜŠr¿Tn7WÞÜaÊå­ÍnŠÍ•7—؆òµÓEK¸ëkFôvtF¯G¯hE^¼åtù5ôŸÃÓû^Ô‹ô~S¦šL5•þ[¡Tú3I»lÕ&;ýÑG'9ú§rÂ|`zŸßÇ6Fl÷±sŒÏ:iè\#Xþæ2p endstream endobj 78 0 obj << /Type /XRef /Index [0 79] /Size 79 /W [1 3 1] /Root 76 0 R /Info 77 0 R /ID [ ] /Length 226 /Filter /FlateDecode >> stream xÚ%Ï;NBa„ᙃ ¢ä¦"(àáê /PXP¸—@c\†‰¥ ,¸ ,¨l( ,-$36OÞù’¿øàH|#B Hyž‹3ѧâJ\Š–¸ò§á7b]D|ä[L¬É/Ï¸Ø òž×bS$ˆÒ›o["IDϱM´>=S"$:/ž·"-v‰îØ·¬Èw¡gNäŞآ EQ”ÄÑõ³cb0s•‰aäªÓ{W•øí»NÈú“+"iW|þÿ~|p5Èù‡«)º¢G.‹`[`>Šk endstream endobj startxref 132073 %%EOF gridSVG/inst/doc/animation.Rnw0000654000176200001440000002333712472704522015766 0ustar liggesusers\documentclass[a4paper]{article} %\VignetteIndexEntry{animation} \newcommand{\grid}{{\bf grid}} \newcommand{\gridSVG}{{\sf gridSVG}} \newcommand{\lattice}{{\bf lattice}} \newcommand{\R}{{\sf R}} \newcommand{\code}[1]{{\tt #1}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \title{Animation with the gridSVG package} \author{Paul Murrell} \begin{document} \maketitle @ \section*{Introduction} The \code{grid.animate()} function in the \gridSVG{} package allows various features of a \grid{} grob to be animated. Calls to this function can be quite straightforward. For example, the following code animates a circle so that it travels from left to right across the screen (the result of this code is the file \code{"animCircle.svg"}, which can be viewed in a web browser). <<>>= library(grid) library(gridSVG) @ <>= grid.circle(.1, .5, r=.1, gp=gpar(fill="black"), name="circle") grid.animate("circle", x=c(.1, .9)) grid.export("animCircle.svg") @ Things can get more complicated though. For example, in order to animate a \code{polyline} grob, it is necessary to specify a \emph{vector} of \code{x} and/or \code{y} locations for each time point \emph{and} it may even be necessary to specify \emph{multiple} vectors at each time point if the \code{polyline} grob specifies more than one polyline (via its \code{id} argument). To give a concrete example, consider the result of the following \grid{} code, which draws two polylines from a single call to \code{grid.polyline()} (see Figure \ref{figure:polyline}). <>= grid.rect() grid.polyline(c(.2, .3, .4, .6, .7, .8), c(.7, .5, .7, .3, .5, .3), id=rep(1:2, each=3), gp=gpar(lwd=5), name="polyline") @ \begin{figure} <>= <> @ \caption{\label{figure:polyline}Two polylines drawn from a single call to \code{grid.polyline}.} \end{figure} The task is to animate the two polylines so that they appear to ``flap'' (the left will transition to look like the right one and the right one will transition to look like the left one, and repeat). The y-values for the animation look something like this (the x-values are not animated): <>= polylineY <- animUnit(unit(c(.7, .5, .7, .3, .5, .3, .3, .5, .3, .7, .5, .7, .7, .5, .7, .3, .5, .3), unit="npc"), timeid=rep(1:3, each=6), id=rep(rep(1:2, each=3), 3)) @ <>= polylineY @ For the first polyline (\code{id1}), at the first time point (\code{t1}), the y-values are just the original y-values, \code{c(.7, .5, .7)}. At the second time point, the y-values for the first polyline are \code{c(.3, .5, .3)}, and at the third time point the y-values are back to the original \code{c(.7, .5, .7)}. The y-values for the second polyline are the reverse of the y-values for the first polyline. Specifying this set of animation values is more complex and can get pretty confusing, but at the same time, we still want to be able to specify the simple animation values (like in the first example) in a simple manner. The \gridSVG{} package provides a consistent, but flexible system for specifying animation values that is based on a single, coherent data structure, but which allows the user to use simpler specifications where possible. \section*{The \code{animUnit} class} An \code{animUnit} object has three components: a vector of \code{values} (as a \code{unit} object), a \code{timeid} vector (default \code{NULL}), and an \code{id} vector (default \code{NULL}). The \code{animUnit()} function is used to create an \code{animUnit}, with only the \code{values} as a required argument. The following code generates a single value at four different time points. <<>>= animUnit(unit(1:4, "cm")) @ As this example shows, the default interpretation of a \code{NULL} \code{timeid} is that each value belongs to a separate time period (and the default interpretation of a \code{NULL} \code{id} is that there is only one shape to be animated). This example also demonstrates the \code{print} method for \code{animUnit} objects, which is useful for seeing which animation values belong to different time periods. This simple sort of \code{animUnit} is sufficient for specifying something like the x-location of a single data symbol (where there is exactly one x-value required per time point). For the slightly more difficult situation of animating multiple data symbols (where we need several x-values per time period, one for each different data symbol), the \code{id} argument can be explicitly specified. The following code generate values for two shapes (\code{id1} and \code{id2}) with values at two time points (\code{t1} and \code{t2}) for each shape. <<>>= animUnit(unit(1:4, "cm"), id=rep(1:2, 2)) @ In the case where we have a single shape, but that shape is described by multiple x-values (e.g., a single polygon), we need multiple x-values per time point \emph{for each shape}, the \code{timeid} argument can be used to associate multiple x-values with a single time point. The following code generates six values at each of two time points (\code{t1} and \code{t2}) for a single shape. <<>>= animUnit(unit(1:12, "cm"), timeid=rep(1:2, 6)) @ And in the worst case, we have multiple shapes, each requiring multiple x-values per time period (e.g., multiple polygons from a single \code{polygon} grob), so we need to specify \emph{both} \code{id} and \code{timeid}. The following code generates three values at two different time points for two different shapes. <<>>= animUnit(unit(1:12, "cm"), timeid=rep(1:2, 6), id=rep(1:2, each=6)) @ The following code uses the \code{animUnit()} function to produce the flapping polylines example from the previous section. It produces a file called \code{"animPolyline.svg"} that can be viewed in a browser. <>= grid.animate("polyline", y=polylineY, rep=TRUE) @ <>= grid.newpage() <> <> <> grid.export("animPolyline.svg") @ \section*{The \code{as.animUnit()} function} The \code{animUnit} class gives us the range of possible specifications that we require, but it is overkill for simple cases, and may be less convenient even for more complex cases. There is an \code{as.animUnit()} function that can convert vectors, matrices, and lists to \code{animUnit}s so that we can use those simpler data structures to provide animation values. For example, a single value per time period can be specified with just a vector, as follows. <<>>= as.animUnit(1:4, unit="cm") @ Even better, the \code{grid.animate()} function makes use of this coercion function and fills in the \code{unit} based on the units of the feature that is being animated. This means that the call to \code{grid.animate()} can just specify a vector, like the following (taken from the first example at the beginning of this document). <>= grid.animate("circle", x=c(.1, .9)) @ When we need to specify values for multiple shapes it can be convenient to use a matrix, where each column provides the values for a different shape. The following code shows an example (again, in a call to \code{grid.animate()} we can leave out the \code{unit}). <<>>= m <- matrix(1:6, ncol=2) m @ <<>>= as.animUnit(m, unit="cm") @ If we have multiple values per time point (e.g., a polygon), we can get \code{as.animUnit()} to treat columns as different time points rather than as different shapes by specifying the \code{multVal} argument, as shown below. <<>>= as.animUnit(m, unit="cm", multVal=TRUE) @ The \code{grid.animate()} function guesses how it should use the columns of a matrix, depending on the shape that is being animated, so for relatively straightforward cases we should be abe to simply pass a matrix to \code{grid.animate()}. Finally, we can specify animation values as a list of units (if that is more convenient than calling \code{animUnit()}). The following code shows an example, which shows that the default behaviour is to treat each component of the list as animation values for a separate shape. <<>>= l <- list(unit(1:3, "cm"), unit(4:6, "cm")) l @ <<>>= as.animUnit(l) @ Again, we can specify that the components of the list correspond to separate time points rather than separate shapes (by calling \code{as.animUnit()} directly and supplying the \code{multVal} argument). <<>>= as.animUnit(l, multVal=TRUE) @ \section*{The \code{animValue} class} Some features of a shape, such as \code{visibility}, are not numeric locations or dimensions, so they do not need to be specified as unit values. For these cases, there is an \code{animValue()} function to create the various specifications that we might need, plus an \code{as.animValue()} function, which \code{grid.animate()} makes use of to allow convenient variations. \section*{Summary} For relatively simple animations, all we need to do is specify a numeric vector, or possibly a matrix, in the call to \code{grid.animate()}. For more complex animations, how we specify the animation values depends on what we find most convenient. Specifying a matrix or a list of units may suffice, although this may rely on \code{grid.animate()} correctly guessing our intention. It may be necessary to directly call \code{as.animUnit()} on a matrix or a list of units to get the behaviour that we want. Alternatively, a direct call to \code{animUnit()} should allow us to specify any set of animation values that we need and the \code{print()} method for the \code{animUnit} objects that are created by that function should help us to check that we are generating values in the right format. \end{document} gridSVG/inst/doc/Makefile0000654000176200001440000000026413651654530014754 0ustar liggesusersPDFS= animation.pdf extensibility.pdf gridSVG.pdf all: $(PDFS) clean: rm -rf *.tex *.bbl *.blg *.aux *.out *.log *.R %.pdf: %.Rnw "$(R_HOME)/bin/R" CMD Sweave --pdf '$*.Rnw' gridSVG/inst/doc/gridSVG.pdf0000644000176200001440000046076413651654530015332 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 3 0 obj << /Length 2148 /Filter /FlateDecode >> stream xÚÅYK㸾ϯ0r’1‡¤HJÊm²Ø]$Á‹™NrÈä «ÕngܶaÙÓÛÿ>õ¢DYrOIƒ[Yd=XõUûwï>ü” S(k¼[Ü=,¬5ʺ°Á)[†ÅÝýâïÙÝÒdðk—«\›l¯§í=üý ¿¿.mÈ~Æá»n–¶È¾.½ÍjøÜ´ËÜýéÃO¦Z£*ï-²qV•Á-VyPº²ÌåW\‡K.ðÛÁ†Ög¿àûI~íŽ&`;X¨ìL•/<¯ÿxºí°Þ–ðþ^ÞáUÓ–ȹ…q*w$Z™ÜÞa±òZé²â=ÿäûen²3î}@-³ûKsF‡=ïS.*Up½XÙJi-ËïEœn¹²¡ÊŽhœ²,CƒÉ|½çg C¿ñ=k£FO-É6:ãDIƒBÿ‰ÎòÜodC~lNõQÎpÛ ìðÛo²¤iÙT¶´tŽdyÛ½Lø}ân6‘î“Å8z¢csð¡³9Ω• •°¾O¾YP¨Ãá"ë^HbP™<©åÊåž}² 1UƒË¾hãp5ïy­"Ñ“9‘Ï®½2,ß4"ÀhC/ç„çßà=ÿ™H3ZÑ^K¬45ºp½Þ±\ŽëÊ$Gõ ý,~\£û4)æ  @ w}f£;ï³õ…NŸ¦EL:>]\!¹cø»;™dÓÄÛÍi;5xž‹ë€çŸã⇺G€éèÈ+&ÏhËÁÀ=tøq¤º[§ƒº¼[דáàµOÁÔí;5  ™ÓÊØ‚5û F>…cƒ(ž h… NÞEÖoh.ˆº Ý›߇½¸'ÌØÛ‘ÇèíÄLg>óÞÜ-_º(ÊïYlo®ä.Àr¶›`шJÎíE§•ù]D!ø}Z£(•lÞƒBý•´EX²äjÖ‚«˜ÏT,@èÊ—qƒ(Õ~ë)7›CŠq‘¸Þ3Þ ƒsD91&Ž1ˆ’#§=ð44<ëåÊ»ìŸ- Ñã9ೡïºÁó*·yfl'¶_´ëw´ò…r¶×ê½$Ep²ÊWã€|ŽyáN¼*I…¼*PBÆîF¤¨þ¦b—^•àÂì1¦côø{kU–6Z‡¼%B‚Rù½õyí)Ð1S ëÄ÷‰‚üyÄ]^$è%a’e£Ye÷Äd-£ƒ*t!Ö’R§Ý‰fOmö”--Ÿo`÷ ù({áôuö¢s\9« ùÛvÎr§4¼êùðâ´ÂùàƒÈÞÆ\(Ϲñk·Bwú4=(6Ui¹KÚ&]¨þ¨13£="DŽ€|T™C!g`ð5˜¨EJ½òÍrOä … ƒQØS(ÐYð,­ËαŒ€÷ac“¯A½[˜×ÓxH'¨¥ÔÊMà8HÒ™8$. @~$9ãj ÁÚ·bæu »¼€Þ¼ëÝøLŒĈ%Œm®ê&™óÙqlÄ{íÆ[s|q©ƶ} D¸ RúÒgŸÛÁ«Æ f”qå;ÖnûuŒ;¨ªÉ²˜-÷Âþ=M¶¹²Ø®’ÙL\æ.¸iù ±yc„Ý`ê½òvXH¼&J Ùª”·Qb#«v±ÿ=”°E_Óû…ª7Ä·B÷½°”¨cÓ¤(‹êÓ:i¬È—O/<•ÔüLzN¨p…Tä†Ë HãV°¯†í,p¼%xM¼ÆJFI ¹™á¿%ÐÊ,Êå4á5çVFƒ¹Ir&»µL7ÒsØôĺ)îõsÔ¦cŠ´ @"zg) ýhp?HÑP°bÄ­G†:±V}×@áÒsW™\º µGi®¬Ë9¡~•‚œ*Ôýl6‡R9ôeÒAø4IFnæ â¼T…ïŽ=i-¨pn¥ Ðá6Æ«Œ ÿ Œ›x÷m¼€c‚?ã³Hq£5nÅw±ýÒã7äøSo;_v8¨\ŠïWØ<ŽI‹)–Xf}¥âÐv|wa’¢C›¾è²&VÆ8YóÄëÙ9÷ª*ò·w4eY¦ýSßðóx®¦0€šAÂ:J2øX_ˆ^_f¤¶r–/Ìõ.£ò²[´ÏtcZš¢"~“kö~ÃOîxl•.¥¶é è ³#Ü ’áŠOüè ‰R{ó´H¹U±Hy?§x"-h|AתR@N@Ôé>Ÿ:-®(M6Nµse¡Ç«²Ï½VÝ{D@:ñéi°X£Uîn£Ü$p•¶œQ¨Rå² Îe76ÒS[ucåÇæén° twüÿ`“WJ¥î-äMê¶·#¯RN»ï4|w‚]©¾âw±%z €»˜ôK±B[#ŒŸMÿŸÑ½8$çQcngs¢:nt®ê9—k8±§]î㯤™qP ^Pü­ÆLJ ¹òÅÕ]n¶NL!Dt]ï“~ÞO uºÑpr£á³ç¾ê‚†˜ÞûŽ ?ü8ðc5"–k…&=$øìÚ«KË•ºí‹ÉÝŸñÐúûa÷+ե뾨»%•è~ôºŒâ ¹z¸.Ý”÷w¡ñ²9½{¥âRÆ_–ÒrŸÓ+h¾c:ÄN½åJ…5Î)ç¡Éq%¤çœE&_÷ãÝ»²¢h endstream endobj 13 0 obj << /Length 2604 /Filter /FlateDecode >> stream xÚÝZKã6¾÷¯0ædc_"¥v$Ø &‡6Ó˜K’ƒÚV»qÛ^ÉîI#~ëE=lÙí\ö°·%²HÖ»¾¢ûûû»óI¡Š`Ãäþqb¬W¹¶“¨ƒ2¶˜Ü/'¿L?mgs›Ór93Sü¬ø>;™Á÷]÷øŸª©xà^ŽðÙ.à-„UfÚ¼ŸývÿÓ‡™éïŒò1Ÿh>xtµ…ç~†ÏøüÈKûŒ»øÍÒÂÜÓgnãtWËѲÁ)䲜äŒrÛà`‰ÏUb÷•éf6OÏ4ß´[#é÷˜#O“¹‰ZíàÁ¨"˘ä»úY?ÕˆìÎ*oŠ$A d‚=Ùæ*†NW$ …Ç-@F:7 ¡Êçê ²Õ<õˆ(Ü,Ê-?<à×´â—fÏo¨‘õ¯ÚxÜfÉs$?–#BY©<˜qƒÒª•YÒÔ™>*]´vÝ_™ŸþÞj]±ÖñÊø­œåM?wÎN«?HxÒW¿ça±=?î6¢ôÝ ,û-YÍ97]ˆƒÇéR¨÷u7„¾`¿ 9Zÿ2÷¨7d‘sÎ/»ŽúÞíqàk¡Xlx{ÒOœUD—“×P‰§‚¹Íˆ•ÔÔýMŒzTsg!ürP£…h2ýÿ•[G¼)„Ø!¿ˆQÂo"ÛN¸E¹~Õ™†¯—ÛÈ’ü½÷\ ™,dåFÈÞÁçAÞK™ÿ*ãï™çG9|Ó[ö/ø|Ç»š“/t%=ô!þ4)9¯5Puìþ!çi!wòÖj™¦Ì(;õôa;Êw2»•sžäœFd Þwœ¾¡ÈóÔrÎ龓Ý*ÑÅ»ÿ¥|âÿ‹W=MVÂÛíÚL‘´¿=ÿ¢}îe—®ì^Þ)¤(­x?Œì|°˜W€Æk(ÏBó‰DuÌYUoY“sýôó¡¦\z8²^Ι¦Ü¤µä¦{2#ÓÂzZöž·ÉÞcÕ6äBSYA{ý|~ˆàm[`¥ðmØkè)~øØÂž‘³2­¢¾Ô˜é‡qF`ƒ"Ú´!°ä7T ß¼Îr‡çM˜.häªìZöJPâ{‡¦'ˆúÀÌy¦4`³ç,¸ÖýòE;¦mVMWô(`„hU·šø‚%óG.qô¹·fÇ{ŒklZZ¥zOœ%v~GtXÔˆŠ¸kÑâ”û£ð|¸ölñD䤻;Ÿ¥x@#z¦}®$èž:tÐP¼Ð‚$#Ä—xW«ôoV2ɪÚ&¸ãÉŸç)a¾ Ò«× oîMïA©”y?´d*Ô 4?ìÆŒ-åäÇ’0ŽšÍ# cS€t»ÖmjÜ4Kˆ{Ùpô™H°`ÂÇ”µ];ÑðÔ!9¾<—¸ã+¿<ꦗE™R*ÂQž&Ò‘‡š ÅLnx¸¡C‘´Ï<(¶mÞ1JÆñ’å=Ïíª‡‹9À9†·H;ðvXÓ²Q¦Â±^ˆŸÁpë¢É·°ÇÈËi%Å“;ÛZ˜¦XkÝq#lwè–`¬¤*Á½ÜEàÜÅ&úf}·»¢½¬¤Œ×špIÛÀe夔6ã÷tƒ\>š;ÁRÖoÆF2Þˆ·,]ÈT#Êaùºi¤OY]ª Z¬V'ßÁ©4Å,=ïñr/ ªÉØC'‰N4õü7ãf½î5•¸¦mCa~ÔxðQ»O3?´NX>lÄzÀà2AíŠXÙPÖ#OÌ•ÑÅ0ƒ¤¼CðS[fQ§ 'E¹îèxè½èzü ß—Æ[ó\@jV+ŠªµéØçÓ‡£X žŸwi×Í+üŽzn:ŠaM¡õrûã|qV½S<×ÅÜÐFnF‚[ä¹A.oT ®ƒ©#þ‚ ×rë›ñnU‘O?眺íº…æÂ%£ßÐCœðtgWE6¡P¹·C¡Ÿf5^ì: yà’J3å³b<Áeì‰9mšÝzÙ<ÓÅU´oŒVN· Ùôϯ½¶YõÀ]eœ±¬òEk}º*NÈğ°’]¶›Þ&ñ|%ýóÅ€uéÊ—AÎbX_8¨¯fúýVÀDFEåv™®—<¼';×AnT(ü©O\ÓB_ÑÒÒÉ„ü ‹]¹ÆÅóŸ¸"ótàÔߪû+—Çy(bU¹B;2’i·8ô¤¼ÑßçFÝ |»ÛxP¹o¯]Í™;\…ܩ̆뱠s?'± Y†à9ry¨F1$ǃÀk߬÷½ b„Do²†®«sܲw9ó,7%‡¿ Ѩ¼£‘àu†‘@\Ëf•’¾ÃZ œ£`H§Òuëš­ p 6÷'ÅJ:¬Oâ¬k Ò0p¦ÏÕQh¨Š7³X@Fþï[gßÕx|Ùª· pï5¸ºY;.Ó-õ‰hC|yÅ÷WÖÜàû׌~Õç#€­üzþ/¢* {Žá­QG5žùáÄKÐ6Ûé‘èp1íëLYÛ:}#÷ŒI/ÄÕèµC¸àØÎQŠ'ÎP©•h–P&ÇÆ¹6ËwŽ-YgÉ]ÞƒÖyÊæ½ß¬¢'w~³SÖø#5W2= ”¬“ú-çÛÃT/­±½âáÈ@ÛNà Û9Ú§‚€ž®/%zܼWÑðõÆ\o5 {ñêN ¾:7ôN¢ÊÃõÄî€Æšü$±è‚týp2¾ ðñ´ã{g¹Øêõp>Æk ¾Pä;űo8*3r9úgÇf?—gFryŒc¹\\gÑå}êïÓÝe P%Oî.»8h}ÝyßÞêŒÜ[uî —ó¸³fÌÕñ.nàêC`ƒÓTZÒíu*6¯<;h‘ú «“ >¤f.14òñ"‹HÚ@ú Þ+oÔݵPYõ~EÙ¶¬|þÛ5a.wÿ¼¿ûÏ*XOLûo ÔsAºx¾ûå7=YÂäO€ãE>ùF¤Ïã ÁȱIÝL>ßýûî{ü°TÜGù'„LåyœlE 3øQÕê Ÿ*¢_U g«rã푆¬GjreÛ ¤f½y¢m*ú¹†sê SÀà(p½¢û=õ¨sÂtÝð÷w­k,[EÛáúM·]÷5MYËÈaÇßMu‡ÝsÅOË Í]â^›oü2 Pn6ÇJmÝÃ'n˜qš«;œ)›ã m‘ü©€¸Uâ…sð"=ÍõÆn&±ä2?­©ëÚá~/3ìãx˜Êîºá—õ–¿É1QÒc-d¼¤–F'ÝŽ n ¦®l2ϼ"{#K6yÔÿš'÷ endstream endobj 22 0 obj << /Length 3237 /Filter /FlateDecode >> stream xڥ˒ã¶ñ>_¡òÅT•EørNvomâJÏÔ&U¶Š3RV"eRÚñúëÓO€¤4öVå°#h4ºýÆ~óp÷å·Î­Œ‹­ËÓÕÃÓʤ..“tU$ylÒjõ°]ýý}m¢®_[½àh½±E}?À¸<ÀßöÆõÏûòÛrUÅUžæˆ,YmÒ*NAó°°=nÒ2‰Nu³NËèý:Ë£ú¹åÉ=.UT㧉N^ãIgÜXxÇÇ£¶CÅÒ«±Â¾ã…ç¡ÄY Å°Ñfi½E\_vrÖ¤‰)çfiÊw=Èé ÈØ$”´[–M?lÔ#@µ´ëÆ…¹›ÌEÿõAcD©å`/¨Y9Q ¬œß|“hQ>‡‹ v䕚Ýhf&~ÔØ*6…èè­'ðÊãš*Nm¦€ä-Ÿ/S†ÃérÜáæô^àsîï„â ”ˆ†uµÄ{æíàªeIz“•±Kʹ%šÂŽJcOŽÿ¨·Åkz: ñ{¾˜p¯¸E\yd« ‹ÀiïÐaíØ½ëmÍK¬oGI&pÙ'e Èulà<õ-JqÅB‘ˆËz²…žƒøÈŽ&Ç™þâzÀÆs¿Ê Ÿu›ÛwÏèô{ Y}ØrP¿t>–™×ž)‹èûw˜"¾á=1÷L‚x5þëéÈÜÓ/!ó£I9srÎrªB÷ÚjÌ*C-9P“È)^òžû Š.ø[ó†…Îò¤„°²„JXå㤱^Ó`O"øµ½Z º^5î%³Q묡>©ú4#[•·w¯s²°SÅòŠ “oéXŒÊë™TÏ`Háªß~Ã÷TElseåY¯…´ýŠ-¨*2S*0ÇdÞEœËWà3“2úŽÃÕRƒ™oIèKI_[-;@R—Å‹45ݵ îÄIÖ,ó5Ï|  „ÂaKiÒcÈð í&®·IxDjàç\–{i6ˆ‚ä=Ò ;1v9þBÉò¬Ž`”c²dˆw$ÇÂM™§qæ¼qÞ Úé &וT§íH£w{ãUW…-9ª9 :6Ο^K |L2Š…{WÅÖeÀ=dñêƒCA0KZ‹tVÿI–j9ÃYuÎ+‹"}¥°·…™ö¬PíÌË`J­îFÞJýhy,YŸ0—naÔ9#©Á ã yYDÛPv<ÓËo(—qÒ3>Ⱦ¥+ÄI­e‘E­e]’Dÿ1høeÉ>¢Ì£ï×ê"ï=":ÉŒ¸Š²ª´'ƒ§Ú±d÷£„Ô“Mí “[6Šf •–0˜^å%¤SuË’Ø&>AÀ‚ûÒ-ú—ž ÑrQøZú‹3Ńù§PYŸµ5¸ÚÈ93å} ÷œZ9 âŒº^æ^«âÒÐÃáeœOï§7jD×i¿`O YËE‹îD[o6—ÌJŒÀ“±¶ÃJ Ϩãn v)Vj(OoV7{UH•‘¾>Q¾£ïšéÁw£L¢µŸáß*°ÿ8çì+â̤±)šRlRAõ­*Ì8)«C îŸä¡(«ô=V;Q¾Ê–v”˵[ßV¹ ˆçìû•o ÑuC²P á8ô3yG挕Ũ“Õö' ¾í”å"µ·_¸¸üI¹PÛ/®ÞŸR¾Z*Ϭ¯:rësî<]Ý<$ûùäõ§U!žY'<=Oƒñãó€»!Ïß´'}ÀJ¹é›§dð3ç=¾õ¤Þm«…¹”ÓJV¾Þ€¥I’_]5l5y®¢_ÄÛ¨öʆšH HjBþ!Žðj€Môÿ€‘‡W‹Ò«Ï­ÛiÅ]rñ‰‡þJ.J÷¿)¡"ÏÒR,ºêàzwc!is¶´· ›4¼[_â¡X|©+üTËÃ4Ÿëù¾ûëÃÝ/wX3$+ãÿ ˆÉR(ÎWÍñîÇŸ“ÕÖ@@±­ÊÕ AWƱ£D÷°º¿û×Ý7øÿIR³Ê B.ä*ƒT¸X—ÅyVÍjä4Y5É‚Õ&Kcêk䱡 ¾¥‡ gàÚ°Ëg@ÛÈ™œ)÷ÇïUÔðø-3 ; +cU¹4¾V@ò ˆÜL`+UéÏ‚Ÿ;,µ4ˆhîÝ”¥mÎè8ñû ðwZGžCÅ–`“èø˜7Xq&úà§‹mªØåN@ÐC‚7höág¬wà9LÕ«±NjHcá^IaD|^ŽxÚ#ñJ50,|Xƒ÷¬—–?ÏÞóÀǾÛJŠBÁ@— ÔMLÇø.$µ“K^ð\ßËÅenŸé±3¼4HÔŽkÑQ)(È=´µ:”…ºP²f“ÉKTf‰søül Ñ…-ŠÍ‰'>ÞA~ô‡€0”…´çÝá#ï'{÷ƒ¿QÄöx9ój×Ë`hÉë쇕†‘Ç7^Só*¶@0ÄÃØ¢ÖVMé°íú endstream endobj 26 0 obj << /Length 3188 /Filter /FlateDecode >> stream xÚ•ZKÛȾϯÐú`Ñdwó#È&°ˆ“Qrq| )ŽÄ]‰Ô’’Çãýó©W?(qv‘à ûÝÕÕõøªZï7wo~,WU\å*_mW©©â"©VE’Ç©ªV›íêS4u÷iôþÚûµ®ªhxÄo°ý¶àß$=wž¡ißry¡Òípxõ›·-T¾bkƒ‹Ä÷ëܤÑfƒqÜN–œp©áÿqŸ-7~¹_«ÜRt‚vÜ£Å]Ï÷ªŒžy‹fÀ…èÓ™N€$¨}Þü}•¬ÖiWYÆý '¥´ßpÄ¡g¢çì°+áSÕg¨”uL~Ê©8YÃÔný„‹HqÁ'ÑžøðÈ Ñ6ÒÁÌ– sZ¶õcº#ÎÞµ~ï+ö$Ž= §$F![ˆÿcË“TYÀÉp…G®{ª²¤]ºï¶^iØ>V¤açoÁRDán´ÿ°þÔ ù¤øÍ… „R©*NòÎAô÷ÙÍ7ËÜØ!N8(lêÉÒzuXæÖZ™,®´ð,町3Lâ¼bÉàâIå[K‡à‹ñW ")[lüo’êÖÊlòzæeQ\FùmÍߺßráyÂM¨,*‰Þõž’@(T´Å¥k¤ú©çÙ°§Á-'R‘¹p§)a¢S¼†hl}]„rËÏÔÝjËÖ„ÒkB=@ñ?8ù¯²]o·Œ¾ÚiO÷¤-ر ÚÄÊ]7Ú“Â-¢Á1iN„×G¾sì˜ÄÆŒ÷™‚6ú‡¤ÞˆÑZž1f‹gC"µ"IN¢Ï D'½)Y­û•P¡Êä”ØÝ  á½? €ÞœbyqüÌœª¢ŠðJZ˾F¾pf ‹5nîõv:v¼FݨüÕŽ²°`Ï—ŠÅÝ¥YAëSëI°çGˉ+œöl£EGšú°$ÞïÀnŒÚRÇ|^›2ðØIç™Øþ¶ 9 _½½_gy9³98›mŽ,E§—É"¸(Itï­¬c¥nš‹(o}¶îï™'7ÕkN‡§ÓrÍ÷µÎ4p¤çÂÖz5º€£u2Ì9Y(Ÿhg ’ØŠëk¡wæÃ3ÞÚ;aÔäé¾Év\ M–d$‡×;²['Q샭®ô‚©Á[Ph£à£¬u:ë eIœyd–1î b‰>âчIŽó@ÚÞ‘C昖òŽîŠz®ÏgwÃÓ`ï\¡!pUT÷BÄÕ85Ž–Ç ýB«/ª56/ê¥.Šè=ÿ½áAîZ Üauðˆ„,6‰v#ã„p‚KÎØ"S”.§Ú\á»WØ£àåå5õ³ \8ì­˜›Ì~(ߢIh|²¥ñ‡„Ž™ zçç,ãì!Òá;5Ö÷Ú¥;™û™AÓž¹ãÒË¡pƒ_,—¬‡ìÖì@‘E;2’l*‰šÂÌy‹½Í*fý"÷36H8ù#:L^ÖqË:õ“-nÅs®ò¸*tI8©Ô±I²•Ž+¥˜ÐGÝýes÷ë] ‡HVéJë”à–÷P«æx÷és²ÚB'œ3?½z¢¡ÇU®JAé°z¸ûçÝ{ (ÂýÜJY~UL^¡˜°, \o§0¨Ó2êÕ­{†5”uú¨¥ avìùèt—ðµØ}··×¨š}pŸ¥³ÞØë/sVY\åüN2y3Õ*¢Á ±8ú‹²Hnðˆ*t•0°æÏѺR‘[ÁR‚+®bÉÐø1*.¢Uà’Ω½øùÀv|LU‘z1÷‘ƒ.⬬5F 2é² ¢!\ÇÆ-*»X¡ààjÀƒUW¬^E°j ³mìy{·¯ÅÝ­ø"£“èC/«{‡Ž¬pœ/¬Æyíë«f´Ð$'iÁ¯C2 4¿c-Àœœ7™Ã˜<eùÌ Ñºö„TsXC1°;.§ùÒ-“à<ëžÑÍ PÓú%¯ÚßJU+¹n/ôŒÕ4?©Jg1ÞÀ) «•á€yÔ"TV×2ØJ öRHýh] þQÈ" Ãô‘ÿ°Ø æâ^ŒThOâØš­íp9ój·ösMª¹^¬×(X:zî§‹‚Œ¤2 ‰‚˜ÔÜFÝH†Ç©¶âŒE›Ÿ˜¬ÈYX´Œ ý]‹=ã7T} M5TP$¤êé¯é’C@ ºñ¸íÓ‘14²ù™mJ·$ûœe  Q€üTšô·¦mêi>w8¶ë%<|m´6AÚÍ!‡c6ÙÝA¬e‚ÌŠàª63À:A`»¸ ÎL ¸X ÑÞÿ¹Õw¿æíV/¨¯ØÄ˜£‡ðcj[¢KËpíË„èÍÂ_&ë,“€£7ü[áW¥*㽊èËÅZII÷6ô…=>,éS(¤œ^l)˜rrNë`GM®6ccª8XÚ¼c²>‡¹ó£¬{‘Gj’ìQF¼æ"Ó¸¶þzñçåÖ)Ïï*¶ DؘŸVq~ÎÄUR€rgqR¤Ìx¤$ˆ”«0ÿð|¼‡àbtÊ"6Ýj0SeqVÊRÿ°áÁóB„{ÚÅ'‘äÿŸá/½]\Uq–¹,¥»·ët7Õ‹ëê?\w´=—ÔC˜V,w>¦p¥ÉÐH‚ÐolÜ4ñœ øó…ecwüà?Î:<ýMî’‡ ”ØIÜ’èä`îû;ô\¥L‡~RôDÁ®·:ñ’¸$"(¼úOµÅríÑ»¦ó®ïÙªÚÎa9Kl…Fè{]ÈH!ø}Áȉ¹B47|º ƒ¨¹ ÞÙø^œc0ü›Oo%A“{ãg±Ï — Ãqè'éúìCK¯}ó·Aei©r¯7 çðà'1磥nËgíú9#„W„8;—]+]Æ™º ¹ÿW£ªh7’¿Þ[+=q3N?âû¡1 FZVÍrDª²>è$,:µ²ÈÌÍAÝe¥ < üÝ)K8`”×Ï#µ—¢td.þ~ÜF–×íw~•”@nÍÑÃO < þ ^TÔÓÓªÔòäÀÁW9„—”FLâ†Pb+链³ &›`=ï6<ìš?4°ïvŽ]XÃ(ßè)²ÄEâŸhà·‘ÇÕÎaw÷.‘±å>Ê.‚YBwŠز‰Ç~c.áýŠNƒ$ÖÄ—cù ÐáBÛSçò%LÎØ ”c{vùê…{¦k”ÇÇT¨_,ü°‰xhëhlÎ÷ëò¦ÃEº}|7 ÝL°: .&©õK…5%E¹¹?]ÅeâÞ^ "Ðó•èz[L¨ Xc›Ò|Í*Úq<«EEš¡|´B¼(›ƒ$S]ÍyHšÎ^8¨nÊ~A{=q#Á¹1x¡£^—SÆ ‘à_FÞ"90òê÷–0?£šK‹“ókØ>ÈÛ#.x“ÛѤ®.Ë8¤º"’)?ÿ<òBHÜÎLúäŒyO™ÎÄLh&®ehÙ 1§Û>DÔ r˜?Õ_,°ŒòìPÝ$Ñì¦BËd¹f#É"aviÖdÙ\y3ܤ£S@^e¢ÀÁ·Ê~/ê"6åUBZ¥« "È‚UŒ[Yð-cU˜Y©ÌgIÊad :´Vq™êÀÑSz9÷/PdÔÀe‹k¡8Õ÷à'ð̹áT(y¨t2ØÞЖ›QˆK~PÉÀ¸’X5‚¶—é òû~Ø$î˪ÓÞ?RËj¯fÀŽ´€Ž=9ÍÞÊd¯ói÷§ßììïÉA2dËb¥! ¸š ßN{Z“Ÿùè肇ÆÎ>4žÿ4q‹sœP&ɦG³3_íóâèv—Ly!¿þáG¹ä³²L~±d¬ ý³Ët endstream endobj 29 0 obj << /Length 464 /Filter /FlateDecode >> stream xÚS»Nì0í÷+\ÚEŒÇ^çQ‚HHÐq‹ …7É>D6A›¬÷ë™ñxÅêBE‘dì9>sÎŒsU/.nJQé*·¹¨×ìR—ÆŠÂäl%êVü•aP w{|…™"ZnT欕?Ó>ô¸ÙÓ äÔaâ³bø¹ktYÚxbþgãM„“ªÓ$¹ ?X ùÚvŒî#{f ÙDËt`$ω-¶£MÆIø?|uiTK]€Ãtå=Ë@Ÿ?øí\ñ;[šË¥à2–0(H[¨ðëµ)€¡—äV9¯Ã¨œ•ïä®k©\·§9 ”œ§ï%Ȭ׾LD÷Ô‹AaW¨eÎpËâækêMÚ)ù/ËÏÄÌŸßÑ.ÞŽGïJL‡¡å€z>ö}…ͱ;±ƒ|ß~Ñ7<Ô3§ÖÑœVGÅÃì]¼U‘)q¤éѰLšRÎzK#ÖÉ5Õ8Pl#Ñ@Eûc$8ûHÀj—ŠÓ">øà#.žHç-¯Ãü³à)¥¹ÿŸsñª5§così Èxä•v¹™w€ÿmɆ<å×õâ¶Míá endstream endobj 42 0 obj << /Length1 1670 /Length2 11533 /Length3 0 /Length 12599 /Filter /FlateDecode >> stream xÚ´Pœ[-Œw ¬qwww îhÚ¸îîî.Á‚ww‚»$¸?®ÌÌùÿª÷ª«¾>kû>{íCIª¬Æ(j 6ImY™XøâŠbÚ¬,v&6DJJu 'kп䈔š G °-ß?,Ä@@§7™ÐéÍPl s¶°²X¹øX¹ùXXl,,¼ÿ2;ð$€.¦E&€ØäˆH)¶sw°0ÿìô–ç_G -€•——›áOw€¨ ÈÁÂh P:}Ù¼e4ZÔÀ& '÷ÿ A#ðÙÉÉŽ™ÙÕÕ• hãÈv0¢e¸Z8}¨‚A. SÀ-”€6 ¿[cB¤¨¶püK¡6sr:€ok ­ã›‹³­)Èð– &«øh²ýËXá/Àß—`ebýw¸¿½ÿdaû§3ÐÄlc´u·°5˜YXƒ¥˜œÜœ@[Ó? ÖŽà7  ÐÂhüfðgé@€”¨ øÖáßý9š8XØ9929ZXÿÑ#óaÞ®YÒÖTlc²urDü£> ÉÛ½»3ÿ=\+[°«­Ç¿™…­©Ùm˜:Û1kØZØ;ƒd%þ¶y!þGfrp²°°psñ@ö›Égæ?¨»ÛþT²þ!~ëÁËÃl0{käeazûCôpº€NÎ /*þ!²²L-LœÆ s [ÄÿDƒÌþÂoów°pè±¼ÑÀòÇïß'ƒ7†™‚m­Ýÿcþ爙UT¤¥eéÿnùßJ11°Àƒ‘“ ÀÈÆÉ`eåâp¿¼þ;Ž2Ðâï:þá+kkðþUîÛ=ý«d—¿9@ó÷‚Ðþ;–ø¹ ͈®ÏÂÉbòöaý¦ûŸ.ÿ,ÿ#Êÿ•èÿ[‘”³µõŸzš¿ þ?z …µûßoÌuvzÛEðÛ.Øþ¯©è¯Õ[›þ¯NÖ ø¶ ¢¶æÖÿ¾F G) 7©²…“Éç¿èò—\ãE³¶°)ƒ-þxZŒ¬,,ÿ£{Û.«·çÃñ“ª@oËóß)%mMÀ¦lÛÛ„@wÄ·!¿!N€ëÛ:š‚Üþd1€™ÉìôæxkÎ `v@üc¢ÅªNí¶"þœÄéŸ(8­ë#B dTÙó|¶÷Ôô³‚n†ì£Ì±wæAUÎúsí•v«ë+[ šßUÙ«æ’Gz*›fŒÔˆÐ÷+ž¥Ì5ΜÃ#ƒub$‚§Ãäû®ñÁ¹@"^WÏ&ÕyØ0³²ç3Ï‘ ß`}Å17‡³ë¤ àME¢•Xáªä5ÇT†ï²ÿ¼©â›6žƒÓiéR5ExfàøÍ^•ìy²z ü)tÚIô=ñþFWÞGYæ<ÖA*]àVR.¯ö1Ÿ`cŠIÉû¸ÔWs¦Æ^AŽþÓ¼åLý¢Ó‹Ž‹übɾ3|ªÂ¹Š}”€fœ¬è|à‡£{^`ܧ5jª#)‰ï¼Òäš­…÷".VaCNML’„ž_Ê;tó,Òù³”¾!”'aæyÀ';‡ŸB/•]ânŸ"+ÏÊÏÄu:Irå§›Ú ±æDê@’’BÓÚy` T#&}éƒ*`£k8!€3"ˆàáÓŽiñûm­Qþ®)@6ïJXϵêÃÖ¨ •î¾Q1þTivûZ ²£© Hª(™§‰ÎqïezÒOÝ”wV ¸QŽþ5pI/jK‘d^ËÚúd†§ÇrˆÀý‹¨:aˆA“ö¤€k‰A>BjãºÆÖJÞj;â°Iáþ:¥ŽùK.!Þ`Ò£\»Øèõ£I:Ñ«±bgÙSùŽMìÈ|¥ÞõÒØªSª& ÉO©¢ØÌ’?ÊT˜<ÆšŒžë¤œ¨Ûj/Úãþƒî~íôW2þƒšÊ*[QkÞcu‰m%¾¾Q­Jx€?ßêÖjs7—5¾-‹1oAÛùÃ1óRI¡¾×=z? É0òþ¦ÅÜ'4(µLO› Õ[exú×t›"w_Ø©‹‹¨&¹ŠÎÙ’W`Ã:(aèi¯Ò¬|jñ$Ö_˜k¡­h0‡â¢¢­RÐíªQŒn Åz‚ñ¶æ¾éËøyé`}º)‰«yÿˆeBÙ‰æMƒMº„(ç²àˆŠæ•2Àk?ïº7¹á±Ã„Y5î8¡ŠpG¥ÂØc÷uŸ:”*,U‘ª–»£#ÉIwýñ¾‘'g¢bq'YÝWºöj´¢“¥#šˆñD‰¨ˆ:†V…K3Kú„Ø“áö#7ÇÙC™dn,Ý·ŸÉ¡Ë×õD–¼6Éæý‡Lec%é–{{}.L]NnÍðïKÎâ¬$»t¬óª‹¼Lƒ™ArHûu×â1‰p>E‚$¥òÛ8 (–¶Õ²dîØÚÁÈ+žwTm¹!=×VB™mÝ‹'èØXn5ÇÆÍÎÝÂEASßâ ©gšÍŽ™_:ŸvEMP|ZQ¤‰góúL¬KûÏ&‰¿¨‰Ë|7…þ¦YÂõ.3iÔ©¯“DjÅ`R;gÐÚ|zø‡Uœíü;‡Åk곡õ n™ìœV#ÈÞ(¸6êÞFZ Ä–­Æé¨ºlé¡ùj¨Â¦ Õ†3\…»f™ Êvã%žçUVmª<-Ü WÄBH!°!ß@ÃŽ€ºŒL¥écš×qhÒ¶áÃ×IôÆ©2W6Ž5ô…ÀNSfãS o=Úê{8sŽâ\öƒçUi*f;%ÿnJ´D¢EþÊ6§ø=Èd>È<»ƒ#ä#ìûn/WÅ´÷Ì…¾ù,LÆ¥ÉÛ–¤ºÛQ"á{(_o^¾¸Ï[ÏÒ¾>“Õ–ϯås±&¶ý;W5lÀÓ©§ð‹l&PÉ^´¾™Ûû_â7øð0¾Ýž]/HÝ“ 䀻ÏûüÑK³v¤Ð܇՗¸ H.Ÿm½tÚ‡jy‹×çÝÛèà_ ™L)÷X„^‹ø×±:¢¿§Ø¹0‡ÊbÐÉ`"’z\I(€L˦„LîÁmÁ¶lg ‚8ÅÑ W«(cA;J%ˆ(OQ«3o×ßnê~ K=^zGÿ™‡)›t¨¸^8ö•à †¾otè*7åÌT|t>—ÿæ˜Xº·½&ß· ¿O—\´>/·´îld/Ù,„Õ¡ªP†ðõÅWþ§…碄VejøÌ³²R¬ád";‹üõŽßaïóJÿwZ¯è*¹CEs²i Ξ‹OíæåâŽlâ Ü ò™ÙhsYÂðã­ã´9{‰!kȨ+¬äÝà–ò¤æï¸ïeI´M2•oz‡~gäÂÝ1,ìãx~?ÄE4“@kIô±h øÐ D1»?Gæ”OSñb­'‡^Ãï”Sæu¸n•Z 'ŒC/¿XŠT({ZÝàøpäK½œ9zÑi?÷ü”/²,N½4±3ðñNåèÙŽéJaoÌ·lÞeË þJ™ÉË­4~NñÅ;ư»+ JÈF¡GAi›÷Ö=ô¸® ?è\ … Ñx¢•`›‡˜çmˬ6ãP½a+;‹šÒnnEw%'Fû¤ú…^wÔ™Ö~sÃð€uƒz Ïþy[íd=}_ùý†Äp_œ,-üÌI/|<å|r÷nŒŠÀ,¸wÔl2Ü{Þ,]Ð>ãÇwl¹Þò RÝåö9y ‚¡i“®Û#š],]zŒ™ëÇ¢ä¨Ày½1~«@réÆÉ5oþÉå Qa\(YÝÔŸç-K[/OÊ®}1îú BAåvÓã¶+Åi”ÀDpcÒ¯Ï_,š-šÒE Á®ˆ6„å¹Z»½ *(µ»úæøËGž5åÑΜ9ᬷd‰»âH €,`­g9˜`Òû¬å"_ˆ€?¸\馭ÝO% äGŠê¼YÁ˜ÛD*‘3Ùâ¢W#îðo…¥$Ø‹×ß‘ :P%W/odX]þêV«W8s?Yûôby7’¢ºÐ(p¶ ø=Ú<ïÀü½¼ 7Ý®kÅh{M>Ÿá}L7›SM…\> W y¡oïʤ9æ7¿@ºi3 ú»žÚõ­~ÑEêCzBwwµcçaŒ³„ í//Y6‡‹ìn W¡ò¤‘•ŽÎá“q¦áu‹‚xâß´…/­ÛüG5}´LÝW—9åÐbꦬVŽYާîÔZZ?«­Ê7ïDÒ6½‡ñ%ö]x(ûšØ`Ýd¼éxNPóâyÌ'ëQoDP³{™›E®…ÌK‰­ÒY3/†â-½ ¯8Œ™‘úóå/¼wݰE%YâGkNŠˆ>È#¤ ›Gu¿Sе:J~ÇQ˃NÛ­^8†Ðgщ¹Z’¢ªÖø/'·'‹žU||ßÑ5a”bÄ>vi|AZ‘1>JWKÈ Vÿ¢à¢àpRhk@¯–3†l@l“=U’şϰo2ɧb0ôW" ùŠÇ¹#Z'ÂsSgÙ˜Å#QÕƒ‡Yû6Kù÷,^¦K1v‰jQlºVAJ¾Ù©P"¬ü1±Ç“÷§^º4¹³¸ÊXìBf¡;ðFeW6®îÐ?+j7: â½XàíÁ›r ¿©W‹gø;«šâbb~¥ ûnc¬ŽŸJ+ðiôÙ†·uwÚu™fV¥…oW·üŽ@2#êyQÐØ7ì’žx0$ìâûÛ©îVÑôØ‘¯6a{æ™±&ʺšÔ‘ù÷OãÑÄùß'HH|sfY…‚ËGž+PyÒüâû2\¨œK'/®ag•‘à¿M>-¼oÕ\ƒ„B«ˆpñëQšP•¸f@K…„LU‡û¼Xë¥uebæh¾¿æ8ô,u›…^d¼nN}UI}@ø 7¢`ùÔØ*WîæîÝ̃?èl×ç‰Ò"ÌyVƒÿJ¡Gëø¬d*IU=¹q¨Q®8KÃ3‰Bœj,Ù¡r,ƒ¹ ‹îÄÔmƵÿád>·G{t½ _˜oØâãŽ'¾mð|¹SâKÂ6Kf )^²ý)d[JŽgê¹çytˆÍ㪣HσÕ?âý‚¤öPh3D"fÞ¦GGåìR ¦TÞ Âp ‹tfFgÈæÁÇüoJH|MÆs-þ Røì+YEYŸhx²øøŒÜÜ5u)²caß­†™KÍ6½0–QѫĞ,%¾ ­û®¦#‘AÐpØ\ ¢½ç_¾ÜRy·,ù5Pë€ÿÝáu=3q–Ye–§€@ÒÍ3E Í6ÜÈEv‡zŸÂ|f%>©?:+ ã˜wä—? n÷h¢ÿš(Ô|3o®ò&„ä‡Ù$7iK/eh)ÿ¸ùʘ’ã=MP¼ƒÕ·™ÌžS•KHêlÖX‡m_²ù+‰ Ãò‡ûeRÅ [î"_$ ˆ‚À¹É9¦Uð¼:bÂMjP<+ÍÌ­¹õAÞ[¨Å¹â²Jv)iÓF»§¤´¯<ºOeßOÝJr܃®â©ýûL| VŠoù´0_’†Ž‹FD°Â&p,‹ ·siÃÂr÷~é«–Åמ¹ME³[!4û®ÏÿÈ1õ¿[}wd»/ؾ›`–[7Ë(dõ}ëY» ÂMhSpBŸ‰BqPCóÆlà—_¨Hè÷GÏÇZQMìjêÄ€ÓS³çùÿ“È÷ÔÜÕnL°î¬pr6…“&Žw4ŸúFCHkìv8ç0‘cÁBiÏ+¶‘F@±Z‰=Ë@qo@³‹f’ij؉|Kó?ª’ŷʤ&‡¯°A½˜bÞQ0©‡ÝÅÙãlàb’N€OøÊ,y´–-BCì*šEÀu)å&ÇÁ΂­ÐCÞUVõêmêbêoP=‰k =–i˜¼s”8nDéïUzHÐé¼­Úi[±_÷’_Ì€"‹GaýáÜðŠ’Íò_9(„Ò»ƒ1ÊGG`u¹‘Ii¬ š’*øÉZäWiÖá1žÑüR~Ãi¨ˆ œ«­Â©¸5 ¢Å×Óˆ¹)à†u¤È³ˆMU(x#®=™¢_}Ž¡ò!Oº»BX¿6VþÊr´IóÁ#H [*¥"2B‚ÂH@WôW+Ž·Çiá{2=ÚMYC3.¤4 z) &ëóZø­L«9;›lDë!ôÄq€Áƒ/ÀöG³ªàþ÷ ÊÌ•Y9óà°Ì3^g—Þ Â-þù‘d'Ý+pK€½ ÷Õ Kaâ¥RâXEoUï+_b™[u«Á`Bä»Ïûˆ(/ÃñØ™àùL½»Z¹Ë¯2âÜ¿ö~J…Ø^<€#Pt8mèfÅí'ß¡DcnàRp.Co¦¥¸ÙåŽ- äzJ3X<ò‚Œ6‚_Ú_dQ2 T¿l¤{õÖEÚošçúì¿åª ZVˆV:(9Ôƒçh´ð­0¥Rînkôºò’·¬GµYJ>¾Ž¾Œ„žÅê½´&þ %µé›îµ»ƒHö³;A'iŒß›J›$'ÍÚ=5ó{0$;ßKßFܹÍ>6ø]è*"«H\C‡Öùîd!"n¸Q‹¿dÓàÅUåüž…Ìájo¯’*€^} ÕÜØ÷$®×ðmB–OŽ ”ÿ‚WÖeC–˜xü‚êÑ:¹pçït…1ùRÂo 0’Ç8©x¦C‰&öŽ‹±®&pŠ7wsû2éílòÉsÍjOAË ~1ýðl›uqL±æmì~ 3I½}ÙÈHIà¶žˆž›Ö×%_ôëÙŸ™Îhñù%¦Q£ÇÌØÐšœ]g¬ ï±×?#Â6L¥¤Xº‰XH|ñ‹4ÚË¿J-ѲqñHäÓ€rÊÛÄêHÜ:U`%fÊÁ¬ãËZ²à£ù8¯»Ë?˜|âQ$a¦ù»ª¨ DxIÄšÕs(5q)ºÿæû°66’ xÖOduô »ÍçƒØR‚¼ß†ÇoÓxÜVÇ ×àh_1ýò<­Pp&Ø¥nC/,*(ŸNå§´)ut?SJ<Ø»‡e¾–èšæQ°“PfØ0£·)>…t’‰ëCmÉX¯UÛ¬ÿç§R­žq2}´Õ ¾BŒ67ÈýD°’ T'¥½ ®Lñ6ü½#3ˆq\×ÞHŒ½öü*{Èþ^nUÀÌKÞÕjx­ð¼ÏÁîä~'—ÅÒÒÓR溠üÁT™ð©¿|BHµyÆ{vËpÜöQÚz×ñ«ƒ…8xÅÚ¦éœUå8BÓÛHjDÝêÉ­M£*r—®ïÃÊÁÎQ">|L͸—Ìôsß-ë>4]ÛM{Ãh3Lô\òо· 1áû©Fiâ)H½d5~>½0zè”ç*èQ{JŸêß1Þ£`D÷ÁIi©l½;ûbýWʳ¶qדŠëqÙ3È‘uƸÄ{ S+ó;aÑœ'€%E«‘jÅH2ØPeh)MîÅñûw¿N¼YÁ+¿n¯œ÷£r±ªhÉ:—ËâRñ¢¦’*?Ž4|š‡Šæ¥‘ŸÚ)“C;¨(›Áç½HÅç5×ÍrÊfrfµ²úî5hÌ=EvAìÄ [:ȵ·ê5ÏÚüIÔsR¼Ø*^nke² ÝÁòKò£.¦@Ó@³^ê1|Â=æ‹$n9Eyuch+_}4ÿ-iÚã] ò3ƒtGÄ­¶úvl5äJ¡7>V–~èù’þHžNÈ•^YÛHH‡øTŒò’öëz ‘3ü¦§_!~šV ¿2Nü$‹y°še©æqžØÀÍUЗcŠ9Ò(öJÝEˆ×$Y½æ†K¼Ûþ É’5}«qûfÚŸÁô »þ¾|ŽˆRbã’YXÔ“•÷4€Šp¸øæsOWkZ‰­ÛÝ/§£Ø_³=ÍSã8f .d“ ò¤¦h …Ó9…YÉÕ`q%Ò]Üõ~0ÂÜçÚ=Q¥»3EÜæÈ3жpcÝ+âP¼>îã™· R0¸ªêGHœ¶ožç™+)#IO]Õ.m™ï7cXq?qÝìeªyΠC;ÔsΠ~ñ{¬cP Õqg{4¯%jéUdý€/àL1-2`Aáxu]¹¬æ°¿ßF]Æ‘ Íwôe›b%Ø~20I¨+¥ðÏúÒZÞ“ý¸íašèÀ>p óÉ]¢ÕRö*xwÅÌ×™£kð6+4ù×åì%2Ë%žá¼¦ý^:Û©õ÷X˜°&™µÃÓÓuÎ0ÿ88EB±Ñ“Ð œK÷Tv‚b¯4¡“Ã0mf¯‡8]о¸O(ÍÓõc™zG³'ÙF­@4BI;ÂMU›~ÚÞ$|èuŒñ—F‰âS5Âì5Ú+b™•» éu`:0R‹˜NÛ)CWП(O]Ìà©%çv¹\ë‡iú‹¤Œjí§ qÍðML«´éÕmƒê6ï‡bº>Ø€0·8™ªI’ ?èÏø®å;]ÂÂé–SlöAFÜÛô”±ý’Q03”ÝjÉ ¦4ö6úá)’O‘´¨äó+i »-þÂ<~ uö(Uo²Ü|Ø]Š|ãôìkì‡ØQL[ø} ›ß<È4þG&Ÿ0L …W¦Ù¨ÒQ—Wº¤(–Ë¥–†í­SÉøàwç^»ê0ç\†ôMúÜ|2Ù +„‹——r1(Âqkk¿ÅÍÒ¤ð"Ó ÞìAeÆÃÝ‹ñ‹6¯+K5j fŸ~¬-â6CÃÄ{oc9èû¡Þ¡–þfGÎgâ'ËM:˜¥ñdÃö ¦æ>=»ÕG_‡Ã¤i ¬‰cY² ®¤FMšŒñ%SñçÉ"·X­-Räµòv䘥O°Íê«»‹&{±Xv¶Fö{ñ $™%&®·îÁ±˜|º¡Gå6Lvγ±Fz¦Ôá;:ŒSS„ \>îC¿ _®x€ÇÑøÔܬ‘qA‡šùÇXi|ÉIÊjCÊ!cå¸S¶æ$ú6¿i™rÛàC@zî5²{¾{¸GRÊZÛÐ^Ü6"]ÎØºëݳýúÒû 6ƒ­TŠÆUý »Õ-hÁ§²¬£ "‰ô¥«–|&Z8Û‡ÙþÞQÛîô«ËJ›UÓ!Üï¾¾ÐD­pÐ<’¦!O×ÒTúT|qÛ?ˆ¨XxL[€]ãGDMàÿ©šX„)•¿zÔ¶¼Ë˜”1™]˜ÏgöûÕ +JÑ·'“ÈBˆÆ:A.»ü%â„waêß÷yáœïj¿Lœ UŠ“f$„ŧ=gê0ºb?÷¡¼¸d›T&Ö¯JîØÈ#Ë÷œq½tâ©p„ÔABƒiø›¿ Lô/THík:\zcB2‘Ìz”ò#Ó§¸ýÆ,²{z÷ȇ»Ôª!'°F-EU,„˜\c‡Õ×&]BƒÕf ¹QÓ\0Ç‹_Ÿalý¡—ZE8*ª¡L’Û '|ñtwÊàINbË<„ôóè‘§2Å#:$·Œ7_0Í]”—Î5+h©Ü½}æèmQDE°(œAåíjFMQñóïg¥H'Y¢q=@õQ(C#Òl÷…*Q9[¥ˆÛT"jAEüºlÖŸ-sÁ!B°Df+Ê0€™Æüì™òLç„Oú»&ckɹé_Oíö »!_ ß­ÈûÆ1„côd¾r‰‚‚ˆ“sìÄ♓¶C<>G^M¼‘wǵHI˜/Àø¦H°È{ˆcTÇ´h¨°#œy;ùÝŸÓb ‡sNŽ>çgͲޅ©š˜t'u;Êó~X1Êì¾+z&à“‘uà˜rc Ü;Š\òP$£¸¡“”ëf„.añ—˜•öìÉk$°æÇSµ˜üp#šTdð‰nMYð<ØZ>:‡§pSX§|ðß´ h¼(=ˆ4u¿/Ùw®4|L8CI¹³om½ ‹3Ræ '⥡v†~µ3`yG¿ßx§%Ôjîó æB6äMóñ nŽãv«`\é@v%ÝË»eìÖ¯D¡ÖDv­cìu}@¥}na‹™[ͧð¡´»É|ãàý;›¶­] gÏ‚ òîôAF˜O’Ìž_Q)U]Â'ØšöÀó§]ÛÇéÁèBr¥T^ y”¹ã¾¾@’xRÎJz¹ßûþ%­Â]‹Zeôç·ö«I¼Ý¢Äªì…ì½,h)µ¸{È##]÷:¯“.Û í¦ä’(¼hæ¡o©ÄÂÖß„+ý!¦0/­ÒnÅ5B!MB`œðªgýßiüI5*"•Ëì :.§ÊÿŒÐ\ÇD"¸šõk¯*€™À¡CáÛ‡äžßb[^óñ=Âó7F¥šâŠ¿›q¯·õšŠçž™gJQ“K9«HŠ[«)u\—z,ÇÎèÃ<ì):uE×gwùB¡ƒ0¼…½+À1LÚ¦_7QHÈìLj( mõ>§ÇB«†ÙûsÉWšDæßº#Ž.`ê/…βgå–¾´ðsûC ©cNíÕíã/ƒí³2eôºˆf9RSçLÑ‚OÌsõ—~Í ×ÊBž£BñnØcFCü:Ñ3ôää3$Æ=c:O–wÚVœ~iÃtèӳϋÎëp:äy±È»cTØë_K¹æü†—ï1ü¥¯ÓÞáy d,´œStŠ&Ù]ßÞñm/cr‹qȶG'ri_¦Bx2Ä]àØˆ„jêØG©"ˆ• i‡>Zúr èÒi$úäg;ÉÝm?ê‡Á •Ÿލ£Ú¦)á_> TÂ*æSÛ/?Œò­~u ›æ3ÉÅ{±õ’ob”€‘8è•v*=S¶$ÌÄgbR:ÿÒ㤟xyµ-&˜'†¾{A^^“iGÙ‚Å7q,›')j©Y4.¥p’1–:²¤¤p|–®<OÃOIˆYù¨B­+\¨æöÔß²öŲô7TsÓåç›êRÆ·ºçË)²­HÂeÚŠ¶ÿ0ù/ªy´_rÑâ¾*‚õèΖlÒ•´çºW=Ål†¥™œÃû Æ_á%ƒV&všY`XÜ^„ðlÁ€(H‹ì.!F`ˆ´WΤpÙ&á‡<Ô2i®„ImŃ÷äQ–аC”öQ¥3™ˆgMC;Ï„~ë:½Â-Ì]ëú*.'í§Ñ2¿²}ž’F»Æ¾t|¼RáséZó«— š†øˆrÛ!%[ìZž·ÉgÇXR\„Ø™L@ˆ]u5$Òsn/ù<°†ìZÁ·Ž£sdž°ÙcTþ‘hC•Øg+‡le)ÃÌéú™lìYž«¼H¶vZ{ˆ7m Û«”xðÙnÖ‹Y‚X=Róúõ¥”IGœ_é hMìk×õy>îEâ‘,žêÅ« œÊÑAæ¹'Fç¦Ú‘f\’3¥™µ»fS°’®%Š¥o©b¤ƒ»¶Hø»Cþüý‚jÉþ {ôCv©TÃ<»½ÇNl1é€øÛ®›ã¤¯Äý•¸+(ç4«fç~>7qŒï¯ÚvïÞY0ZOMΕè ýb1 8A]"ƒ<–ˆö]Jë…Šo±ëÀ ·Q5èi¦vù:hw¦½]I^õ>/ÓWiõ›SE%„¬û2ö ý»ÝžyÏR=M"ñ/&'^\}FzÙ˜ãŸÏìýßÀ÷”®j™åÃc^“®¹6NŸÒÕ˜¸ cnÛI¨ãúc”ˆqç§-‰D³à™ÐYsJ_¾›QµR®€+Nc݃‘i·ÅgùÂZ"jÐ{CJ?F¯*ç$59ªþQFªët• èêks—v¾êz¥· yŠ!¿š×7x-ÌW²·V•Æg.½¥›ìœO1Íd—ã¹\0’¸¨©ÌÙæ°=ÛÜ9K5•IÈxuØ*ñŽZ¦byÑÄYª„ÅJVNcž%åB9†\’‚Él÷­“ŠŒ5#„w‰²><΂@€–Qå€õFÔ¼žÛkJça2ÜRÛ­¢¹èþ÷·0ʼ£^\˳ù\ùEƒrD±4âIù÷ß(ÆÈ$nVؾ—®Ù;b§‹ Òב‰$r­ 'y–.Ó¤¬*6N„ÙÆEµûÙN$êy«ŸŸ!­D FPšÌ¢š<ôqñ}˜>(+sóI Ãdªä¸i)Oêýƒ"¤õ endstream endobj 44 0 obj << /Length1 1850 /Length2 11933 /Length3 0 /Length 13073 /Filter /FlateDecode >> stream xÚôPÚöÀ #EŠ»S‚»»»»»œàîP x¡¸»w+ÅÝ)Z H‹wGî=çþ¿oæ½ÉL’ßòµ÷Z›š\M“YÜÒÉ$ãäèÆÌÎÂ&T–Ðcç°±q²°±q QSkÝìAÿ‘#Që€ ®`'GYHB@@·W™ÐíÕPÙÉ àn`ç°ó°ó °±8ØØøÿcèH=À–e€‚“#ȉZÒÉÙ¶¶q{ÍóŸ¿: z;??/ÓŸîqlt(Ýl@¯-€öM' 0ÈÍûBÐ Ù¸¹9 °²zzz²\Yœ Ö"ôLO°› @ä ‚x€,´ P:€þn‰ evýK¡édåæ „€¯{°ÈÑõÕÅÝѼfhÊ+TAŽ+ýeÀøûpì,ìÿ ÷·÷ÀŽ:-,œœŽÞ`Gk€ØP•Qbqórc-ÿ0Ú»:½ú=€`{ ù«ÁŸ¥2âêàk‡÷çj;»¹²¸‚íÿè‘õ0¯Ç,íh)éäàrtsEú£>)0dñzîÞ¬_®£“§£ïÈ ìhiõG–îάڎ`w¼Ôß6¯"¤dÖ 77/?äyYذþ‘@ËÛô§’ýñkþ¾ÎNΫ×6@þ`+Ðë’¯+Ðpƒ¸ƒü}ÿ­ø_BbgX‚-Üæ k°#Ò?Ñ_Å «¿øõþ!`/€!Ûëø±Øþøü÷Ÿñë„Y:9Ú{ÿcþç³JJ)«Ij1þÝò•N^_fnN37;€“ÀËÍðÿß8j@ðßu°ýã+ïhåàÿ«Ü×súOÉÏÝß BøßX*N¯“ Ðý3èFlÜl¯_ìÿŸÇýO—ÿSþG”ÿ×Aÿ¿ɸÛÛÿ©§ûËàÿGtÛ{ÿmñ:¹în¯[ ìôº Žÿ×Tô×êJ8Ù[þ_¼ðuÄ­íÿ{Œ`W°ÈR ìfaó׸ü%×þcÑìÁŽ 5'WðO €™íÿè^·ËÂîõùp}É?U ×åùߔҎN–l7½‘Ø^G‰ƒ›àËþºŽ– ¯?§ÀÊâèäöêxmÎ`åAúãFy¸¬âˆþ">«Ô‰—À*ûqXåÿ¡W?ňÀªüñXUÿK|lVµè5Šæ?Ä`Õú‡^cjÿC<Vÿÿkà?ôZ§ù?ôšÏâ¿ôÇ)²Zþ _»ý 9¬VÿÂ×z¬ÿ…¯Ùü _+ÿ _‹°û¾Vaÿ/|-Ãád-Ãñ_øZ†Ó¿ð5ä_øšÈõ_øÚ»Û¿ð5¯û¿ð5¯Ç¿ð5¯ç?ÈñšÈû_øÚ¯ÏŸø?scá¼¾žnöëPý‡ÿ|ªA /Ò·E' Á0Ûú°ÎÛÏâĞ̻“ÂsÔ»ºiôÌ¾ß ]î÷h)ôµY!›kñ”‘/k;ÒtWb+dO¾‡m‘íÉê~¦‰3»HËÓxƒSE‡â ¤oI˜µÄöüž\üt‚í`Û {¨ó\ÜùÐÔ °o=¿Êz5 T¬ŽG,îªïÕò("?VÌ2Çj0 .§Î7Ï^  €wc&EdÀ:óBŸ¿ºžÃÊz!SHdDò?Šå,ö5øÎw·à³^¥ÅáÚKHEh@@ {…5>Cã+qª€¿ä[V¯SbEj²Ø"Ò…táª#ïù&T16µ5FðÓ4X²}g&"ÞB}›Zbä§½fn7V^oéì»i!’«z÷þžOLõ|$TtÐÎíX#2½?Éþ]Ø(|÷AäAêÏ2aÁàÀ,mcÒK Xâ2‡y¾›aŸ/Ð õ¸†÷ö·ÿÔ”¬#bŽá¥–þ±ˆÖ4É%p”݆˜²]ùlÐô½ýªäh¥Zœ‹h< Ôò|^y…à'¸ÅÝ<Ý—¶L cÔ¦,þ¯p™¤~øNa‘u Á#!òF*PŽéí£\ç²>Y)¡dBÞ,/¾Ié Výú€¸²>q—YÝ‹ +F7J»²Gü©Ïª.õ‘µØB÷S¨TÚÐatèè½Æ zYXû$vÁ›¯ßf{2©œÏ°“ɧ)H×.ø>h„y Îý˳ÖŒ}@á:†é£o‰àš˜»6wz¿s•àP}û¨#eÀ\›ÚW“>¯»¢˜êÜT‹rRÐÚœ å~S|¶¨zØÀŽ›XE~L̤áå* ݇ûðsm¶gI¸q¬BGßbs€óóáŸÝ²Í‘)Ü1¼}#bÂ&0c·)¤åZ¥wu¾Gà,¿Ô0j"×R`l»˜nû$ù ÌñÃlœR£!PHð£¡høþ{u÷DÀ÷g‹<¬%e³·eߣ°É­øMEÔ~Õú#Ê•_W‹À-ï¥a§4§!ì"r%w’òù€`´Žáîí0 Q„D˜äjL*‡¡µEj0±6èßðã§Êæ2㘆1NÍGÂâ¸íLpÈïÝMf³CAêRÊ.D *OÆ7D§â&ø¶Õ  à)@Rj—3eïyÚ‰?Þñ—xÛH÷šêÑ z'D¨Ü¦!Ðñ•îã[r/ lèqUÀupc“ÇŸ¡èIf–~§pWÙÝ‚a´I³‰óïuJ«RûCãвAÎd@ÃýÕÝUU4V‡e:{Ñ„kð=Àšœ g©kÍ?6M}’ñ ŸSÇТk¿x([ÓÔ¼Ê E.Híí¸µWùuV¡1%PüþížÇ-+dza%+Ô€T ƒžë³Õ"£ª³žé{·wªa¼†•Mžä†gZÙï.5qìž6æ=rwœ`iÿ°&Côb‡#Ÿ› Ü[*Ò¹GXCé<._ìð¯Î>¬ºw?јßv—Måáöš’l’+@Vç´­Aû†.™-¥ˆ,Ù‹’lî$Ú7¤G]4»«Lâ3o=™)¹¨6ŠEfÛŠÒ„)k@bŠ º0ÒQµnoLG˜º>!›“NF^XÆŸ•ÛD¦&ÔÇÄñR9./ØpÞ‰w…-Én“U ú¦Zl#r‘;ç{9w˜W–MÔ µ¢ x¦Àhä€4IF¢@øÀC0úÅŽ;nÑ!˜Ÿ^`&5ÛgØu8°áñôG·Þ¨ñðÏGWƒ’,ÞDœeˆös_útd¥8ÈxYÍN\[š¬éxW4°@hŠÉaLšÓd>#ǽS˜gºŒ¥9(V]yï½4ï Ñü¯£À²:<žÀhü-*‡ú! ub¥…}6•_.×ä« ¼#îJª“Âæ'¦ë oŸ$CäE…¸Ã!k¡ø¸–6û»+™¥*/UtSðæ(vÏ!ÞÜìwœÿˆXçóVÄøžŸ'ùåy˜Ñ¿ûÂ"AB™ÿm/E‘*…§ðàmz'€‰3°>#uvݵ?[ ¿ãûœÆKTrñ-Ôæ q‹:„JŽ£ÄPêàGo)#åFLM~¹å3õØÎ…lˆÕ¥l©É£7wd åÎ7\Ãpý©FzÜ}<ÅšÅ&$ŽméÕÊDzL|4…¼@ÔAKªçOë)È&n¬ºXÁËÞS==_ J/ª¸ZÕ}é¿ O@…ëJuZŠt8~­d:K!‡1ƒÐÅÔ’”^Ìãýª®)á(xzcÑ”ÈÔôÆ6}ÌÑJr ",foü_‚é©ñ•–­T9Ð×k‚·¿èTæµj™A/]ÀÜçî(•mÞ´ììñDÚi¿×ËÏ¡lðÏ„0¤¿ëyp¯Cêugıo´¼úÁÕô³Õ§ÜBÉ52ïVKÞP®Êc’è1|n”ÊmŒ2.C;êg8ð鉒Յ•Ì\§ò°òöU 91ïkPEï}wL%Qh&s܃~ágûùŦGC†ÿs®Ö"Šo]MÚÕfxB ÀØ¥MÑÍËU¼ò‹mï>BY.Ê2ñu‚ ¾NØËÊ{Ùía–xQ3Mï‡ gÁñæôÛÀmþÌJ¨ycëBú7†ŽÃŸš«/‡6`âqæ¾wo-†òý¢ºï¡¤!N c-Ø‘"“þ¶Ú° ËOÿ;†\ƒUÒˆ¢æI,ÝÄ_z5E¥Ò¶"TðTöòžÂV®CÏöIB´üKº¶ñ({Aé‘â€üˆÁŠ€1“Z[<*qj…I”«wÇ‹7õ7%qÏ ü"Zøýå0öÃòHʈ{1~ŒyA+kò¦lOÃ%@NíÆ¨ÜÈÌ|kgê"ÜM?!šÀZBtÃ'”é„-¡ñëðo KwùDóކ< ½¡˜HA C޽CCê…Én½WzXå’f—"œqô`ÀÞ[Û¹.gxZ“ñCÛ®é!6[þÙì¹?ëMùd™ñóeì4ƒÚut3 Ótu;gLwº‚$°{äh/Á^[ó ÏÛÝ‘Í]ÌA«Ì·¯ºpîñ|ë–mŸÕ‰¶ê¸TÀìÌ_ë>,—‡2k;‰c=¹2d¾8ă—õפzôC¹ÙrBYj¶s§=õÌÄxªýä %ó+-lù¿‘ãN[òWy†F| É)oÑ UÓh¸N®OXÛ)uæÒûy:Æaìͳ:gwæL¡‘ŠN2l–æ @¢ö#—ñÜ +.Y“ñ*»$:ßýþ 5$Äô¦ç cfB˲9QʘEð‚(n]îã¸ÍÈ+#ÖdA`ôý i“kfΠf=~ö)ЭÌ ]÷{fòÜFÝx.ÃIøhQœ[¼CS ì¿¼Z6Ì™+e7lck” q·Ùü-xn'6í>‰ÂEr’1I·°»RÉœ¹%s4+¸÷XÂ] çÈHYMOúAEyŒÊs7ãû|ŠøX¹¿]Ól$ãq¥}¤KŠÜd‚DíghÝ8qnËPŒ%‰<»F‘”dbg/YêÞ¾FMòLF?MíØ¬» “¥Ê …£Œ‘î]8‚3¿paàÒu\¾B–/¦*É•ÓÊdð ­0~¨ØO¥¿$çBC»qd¦ê@Í;ìFëÌA%®¨>$Õ\uÒ[CŸÛΩ™a´ó ­>kéñγ²…[DâÅ#j¿yÏtcÃ{ʧ\À5õ‹ä­Ï¿ÀÎxÖí³Äã*Sí2ŽU$)Ñ<Èë¼cÇô¦£dL©¿õk.²weDErèçË)nô 1V_«CuÉßþ•–£½ˆÃK×Ë;†Ÿäµ°\O¹3 W¬Ô ZŽƒz”çMh™ÒÐNxLYWu}m–'FNGX£f2~Ûî7húÏ>+Dú ϸFD/4ÿˆÞZ´Å[¶Ñà“©äë"n¥1kCE#࣢© ´îMbk’óõãPit É;úY­é€iEXqÜ{56¸øx5¼:‘þmšþâ ¾m“ ÄP¸nú®H=î}baX•Ù  Ær}9u,;Üö¢<ûšµ‡è~Oo°Üu"Þ!ùóE“ÊåSŸmÁ¶*iYηnóõ—Ý¢¶Xh·|™sïó½†Ý«ß4§¾žê†ŒÑ I.­HŒm[bȧ;ŽL›¶ÊŽÒVò(Èe²¤µÚoªõÑjù¾dܪ„ã—¾d+bD -’ ¯ÀW RÀ>ݧ]g¹¶ëõRþòIt—ŠÕ¼`‡ÚB£18b˱“ü CèÎyF>?_4Ùš º»©Vö¯ öf2š8P‘Š M©»¼ßÕ]ãË"[y²2t‚%¾&ÂYuåžmÏ+U 饇@Òé³óCa™ø~¡A²<ôCŠp/6(Ì'äô+_ߨþË 2–0”c¾±!Úfƒ·}¦@jkKÔ€ŽÀóEÝùÊCí<Ÿˆsè나Q•숂k&yÀ4èüvÆ^¤ùq¿zËb§0¢Ž‘Õ^"o&Ö'ü†y/¹[.K[×¢?ý3< ÿƒhà&Ë h#*Á’*7-^je¾>©£ÀÖi¥\W}ß(©FJ.äÛP)_`¹‘­` •c1†åh.íÄ„¢4J*­sò. pîÝõš©$&>4û¢%Úãè#PZm‹¢§DÈð×H•?o/õr{ú~+‡|³]mu©'¬¹Ð¸D ֵߠþv"rM}¯ŒïrîuÖ^1?6-“H¨ý!I¡‹‹Øg3¼(ɘÏ'Lh<„+~çÚ„õ†Cå¾·­ã»{¾—¦ $ѯÃmŸÝiØKw•¶&]µžEÓ¨HÎÂæö“¾ª8Ãêìjaþ‚7>Î~Æ1CÙsWO( Ùoµç6¿õlÓ€ƒ²cTÀolº“g#‰Kîîsñ¼äw€|”t\±Ãåüï ê¨Zs¦/†^!Á[Ãúáb-iß!$Jø-½´÷dœcfÅâ¼’ñzŒ¦{iÝ”²?Äu¾ºGKmX¢v7’¿]d Úfvß„[õ¹4ÿÿ9$í3ña%D渤^%úsn3õÅ ¡5"Ôù0‘¶ÍÄ{ž„eÕîý‹ûïóº“u&+· Ðh>²µÇ°JÞìdåÓ“·U—©æ Å7‘k³k" Ù}¤§áC‰”wÖz' M8WqmzÒþPuYÇáá{ ]¬Óƒ\{{õrlž'x°SYXp’ŒPCç|ú£ìóú¶ 5Þ†:¼‰ç$ÁzhL¿o&tõ;azÔOâß$eu-ò~Å)H¹ +™µVŠå`;¯b@ü‰OŸCS+yŽóþ[C€Ã±’F!sq`ˤC®îÐ5u%jåÑ t·ª‚åñsŸ1~y3® ý8 ß/ÓÊP·Â~-‚s5xÔp3Ògm€_zªÿTÚ‘Êt`9itÑÃã›v\;¿Ü{ÐF$ý…JvÁcͪ±Ô[,ˆWÏ0#á§%–.-O‡‚xÙƒì•ë)2U€$iyã¶êNÐeÅdñë<Âî>ÔÄD'œñõü ÍxÉ-j6šx“{+mOÚ…àh¾J‚•ÓFc“›gòãýUÉ¡îèá B}›çÛͧ,°‡“é·ˆ4Õßš´Þ~„R"Váo fNvóYï—":è‘^z`Gç^ ü6­SÃ{¤Û…Ž]³ÔÈŠBkc^iÛîÞ@Êßêø|ÓŽwT©†¦%!_ªÛŸ=#¢´ û”-÷Õ»ÓŸ7¬£¦›<Ö×)ÇÐhŒ”Û3Zx¯·M”¿Ìz?ÈZ¶])‘”ò×S¿SÜpþžÈ”±ãè܇÷N)@WŠÑÏuÔRW–§¦Þ›Á¼A NQ¶¸žòë ïÌ>ç3#‘‹ÂuRˆuÂá™.u_çḭ̈ћŽîý@²‡¬`%£0A¹‚µŸØ…„"¤,¨ä“){kªû&²%ïA@º=*ÙÚjÔ%dãò «ª÷c<v¼àŸ ïnïžû— 뫽èu'ò•¸þ²Ü“¯ññÒ†«à²*î‡`’úÏ+î%Œttš;Ø%¿Y.pþŠÛ!W=*¼Óg™šŠÅÙlÈ=ØeÎ)ÙÚïsš“vg@$ Ü:> …²p›ªŸ÷ß*Ò«¦á•cƒ¶ï7Zõ%‡º{c¤Ì)]crSm‰?½¨¨¿}Åá…íOLï ò7 <2§hçA=ð‘)œTdó3ôß'YÑ¥€õvQ™ñ]`S0ã$”‘ 7í‚´.aï˜0Ý@úŽÙ8ʪ`yÄq‡ÞF©Ný<&B¼5}ÓÚÞfFt# µï¼Ôó4» ”>Þω4“®wU¸ðéd·Ûœ¬úÜ¢ n·-aäñ2©ÁŒÏЀ[Þ¾Eä= ýDÔÕܶ= Ö%°’þj­yíñ¼iÄ\pó øÓQ08'o zMá[ê°ï‘1uxQÄîì;[@Kͤ ƒóžJŒ‡hJê?tyâ´yKV´Ž s2§Âe¤K\gyªÎ0…² Ï%”ê›(Ý2JžÝÅy3¸âÀÅâOf°q2™»×®Œ<Áó4ÛÔ<™²ÞÁÅ)á4÷lkèŸ&•߉"ív+¬M"1Ž˜ÎT#yŒñäb”ímžÖ+´^}‰_~ú} Óje5·s“©ŒÜ"¹ ÍïTï„è­ªjqß >^É.À;ÇiÃ.ÿÁn$â—”>gtMvŽËT°”) Ú¥¬êÑZ¿ .Šä…ù˜÷ÓPÍ:¬DŽ­Rúš>[vŽÉ«©=Åh*®ßÞQó=aôoÐv¡'.Õ&‰—’¦8{ô(×1B· Ó²>5>ÈìÞ¹û+}Íç3¡Óé»¶=Êv'•Ï [[,|ó“Å„TL2´`ŽßÚUÒoµís[æwâs`#zò¡r‘ej Bctu—Þc·#«Eç9Ùð܇½ŠP<ÌFm@¬ÕnÇ4¶ZBGD&ïœ/1‘b•3]¿b‘uXwææL—iç‚ß0Ë7ììT.lØ÷±]J0‡Ë$DK–pÀÜщ:éÍ´‚²)$߬—Rp¡ÎvÒ¬_Øó úÙÞð—• žTkðÄšì÷‹3;Çåk áŒIC‘L[°Ÿnxë*I©v¦×<Û§â„çIhД®Á˜Ä{ÌþAí/øuIbNéï~_2ŸZ“ˆáb÷1ÑGÄðú„µK& ”P`Ñ5™ëþŠdxÓ}q# ­}4ö:žk²Â/ ßnqúbW[…™ŽéoÑ„¡¯ÑoyÚœmxI?[ÓÿÜÛ9Ë_¶÷SíÂ?Uo˜Øà•Ð d¡Iås0,èΫ­´q»µ½‘´7žÄêr>½>SÑ~G¨%E؆ä oÛ©”‚,`´f÷ueëN¿fEŒKÖ(Ȇì9æÛ…¯u”›}Àf„±4ÅÏQz’#p–W'“˜«¦îb`ò”þ£ê/¹Ùàp¤˜®‡8Þ¤ÉÇÃN{aYj[Q´µ;‰÷–JŽzÜäŽ6Ë<®†ÏÖHXp‰Ã|…u›±¼‹:'“ö‹HéFËÛX4é.Í‘ð aëAÈ* -ÎwâDß?c¦È}Ú*uÊVŸˆdý"mUÂ}Ô¢_²K,³VÓz_I¦㔓]™qÂ.»T¯=“ï©ÛlÝbË•ÆÉÚ ß®„th,es̵ÒiC4 ÀÍ—¾%Lši'QÂV¯Lÿ nÿ£œ… ž\÷aZP ú0ù'éÎu>©®øÀ¤\*Å„i±UÎñÂ.Ò‡ê »3^漞³«À¨§¬•-ÏÝ=JR½ˆ€–AL¹! W“#ÒMj€÷ó°PG!6oºü"&Ù­Å1¥I›‘þëÜüYÅ6-æÏÓÅKÕØ« ’‚_<†ÎEÍ•›¤úçh‡ÎÂïfÑ™¥› 8Ní°¤Þ\âZ¦ß€òê7v‡Å®<¹‰N+P) .Ñur˜it'¡¨ða¯¤«,«°N²2Ë¿Þþe˜U늅Z[ÿ¥)…¸¶nn¹îõ˜/OajºÎ¨Rê¬åi4òÃR1C¶¹—ì¥mÀÙh¢`ã‰5µ Ÿ¦XUà&Î’Ìðe)÷×[št ˆÈ°DYõøð§¼Õï“)«E0잣l)9êo/„{C?âWnÇyîQ¬°Ëohø¤Béy­äÒR®êüp¢gûrÿ©SÓœJZ°)B,xËç1JC$TëðNc¶Î½Æ QŠ×´v§¦dÜïhèRV3=¢_ÃÂÐͨ„¸d"û½Í«Âs vMŽ |ï*2•]óAéÙòRVÔ—…?EdbJÄncÝòGŒ¦@n̦™&ø†Ê&r¤Ø\íc¥¹evÓÓ›šN¬éÙ2?.At ÜN¤.qr¨ÏiaK ‹ªûÚîsL?<òªö‘L¬_:ŒÜņ'„̤Ç?ܯdF;4¸¯å">Í’<áXýÈéðe˜š}†<-÷'{äp!D¥‡ ILû!›ƒ§BHß`h¢Hñ«¡ñ%ºàõ³ÄR+ 6K tMñZ¾äÌ¡lõDyZýh XAzNØEZåg3e %‡™¹œ0¾¶¤šD.<˜Í&dù¼×&•ìý ; ÜΦn!޹/†Â¬—;7ï±áìh¨1NeømèˆÚ„²¨àƒv« ÿÂç²Ç»ÈR°O/€t”ì:ô%Kï=’#Ö7‘ØÛ:¬âoÞæCì—w¡Îo”èÆ-uM=Ç ³“¥Ý} ÓО½x‘ NöíD—PÐ8ö½?S”§ÀpÀÛÝ.|™r/æÕü¾ý­,²âÉ…ø2.gâF¸àn—aë†~Ó㪺‘îøeî´ÅÌE5x¤9`!öÀÍ(œèÇ‹£ýmÖ/ öAëW8X)•¼8¢œ³±þâÞ‡›Á$¢!VH–'Ec!¢ïxúSÿâA.×ûX( ³ ó>Xh=SJa?ÞW$æRØhúç,KñÆI¿û«ƒƒXµ\@)°+hX’©_l§Ûx•j¥ÿ[4‚xÛŽwvV‰ƒ2ü¤ 6ß}‘™ÝüÆzZZ[÷|Ü ¡N–éí•;L¬ëN ‰¬G» õ3£Zƒõ¡ -¢­sPGÿ»$Qô` .Xƒ î¦Å­ ÷.ÈÜ—R2‰Öù'˜UnýpÍJŒß~Õ”…ÝF ÝÊÇI¤ë˜ÛæJ9 3#¤[Úa0Ú 5üûXøèÍÕ.¢{ #Ÿ;OMÁ âÓÍd8´siϹKÔÜS\q9Ê9d+sÑ8É×Ç ˜¹d¼?¬úιxÍôKgü‹/ ùPâ´Å[Cñ*úC‡çQ nË©·¸~,9q ´+bݸoÆÕ®`&>/}¿¦Žr’#ªW¢"êàm ËóYz¬T0_æñDcüü²Óâ¤&0 ”´•ëµñ(üº¨ùÝ,ª‚V·Jù»6ËÇRè%êVj B±ˆ[‘Ò‚`“BÜoƪ•Üš!Ɔ óq…ܾƒ}y©ªšP–ŒAÆA™§$·|XÆŒ6EËÒr_}€˜ fÙ˜>ég*¸¸ÎEáëo»ÊW¬¿ÅÎ×·ôìØaÄLŸíOö+qµ´Á¥÷¡b[@â Λ2aɈ„ƨ£Ý"‘OØ¥ d†@’´Àðïu²gb´¿XŸ?àíÛJ˜ êìÓ =OjsÃ}¦wÀíy†¯EtÝÞÏ¿F<øX€L0æpBƒ;qf¤4QKÔh½þÎE&‹ÓkNFæ&ü+‰ÞgndjBK0J\C>û½a°eÛ$uÉÌ3é8h553þ¦A‘qáØÈ©—sd¼Zñ¯üÑϸú¬²í+ 4ã7%?…üÔûÈYM²SÑVÅ Ý~Ó¼A‰‰ÞYTåáEñv«5_|r~ɺ¯ù¬ôÂu/`™¥¬¢lé%vXV‰÷‹OÔ¨"2–‹‡1lh:N§ž¿‘Uïƒ9õ õƒ¬¡ü¾c8Añ [²$>ûÐåc}ì^ÚRû\Ù÷ñZù¦’pï;ikÑMÄ|a/xÕ»ò¼#÷³‡sÌýLƒCÝ¥É×§÷(®ˆ§Z?œ%|ÌBEmá±d*5"§F|?Îg}XwÁÏÒ«ò§Væê¢-R€j¿¶›zZ± ¥­Sš¥Ùg' º}øÐW¾ô6©ï‚tpZjºoÿkšyEA€È½ÆÁƒãÈÅÑ øˆ`­þAaUšµvò7Ï/` ]ym¾>Ðù@ìÀ§èÐäïšû‹RCØQke¢e=½OœÆ0ØŠü¡ 47«lü[f“›”E9ý™š¨9L`6Ï]QXFÑ#ò~„4g Ó2‡8„-„}lÊ|£¨·P ´ì©Ÿœ„¾pu~]Šø4MÈrm:âÂÍK5댫Ô|UžûÓkQ…Ò¼Xð«í=‰>r<4"Â^Hà¤ÙgÙˆ·¥,›puä0iaBâ™,ÌääçóBÞhýÞ£Iõà7Æ4ö+yXè—þô²?åã“S¤Ž4bj¬;zëaVþæÒØ)!ÃKÁíÙO¸ÃÞ •´®uf÷eöë ‹š÷Ì 9¶[¡îŠdù ¸0bùgIrø4ô§é ”TII¿‹{’È÷fÚ- ík¸NÇ͹ûlFݵéû¸:‘Ï€«–ñEe³—b¶óÞäzöªô[Ôþ&ÞÖ¾YÇØsFuPn¦™LÄ8¯®Ñ*ôm±/=‘NUA »á³"j.bã‡KŠ lG:\ :Ö›»*Omée$=»™É2YHâ–щxõnTóå“Uvjüà‘T·²¥MA²á:¬n¥Õ‡z’Úû/h@S!Ô'\eÌ Q¦à´‡BÁäVÁv¹7Ánï­iHÏM-$FgT§µ©Ž9NÖ® +ÍÊ3Üí½°½±  >ü—þc²ô‡ñø£´ë¶Ï~ëŽ:.3£—'Ï2ÅÈzë}ô!z>Øã¤³Ø(ë¢g)Æ}%‚Ssà4~Ä•.&Á®}ظã„ÐyIbìûÑÅ*âC³|„†Ö]Þ჉!ÜÉoÀŠ+ûk¦ÂusïOÑüvD¡¬W©OÆ×XÁáá0Ë(i ×Ëã#©®´½\ [(¯ÿm~)Ày"¯Z¤ä¼ýˆPÅü½Ü /1À‹î»áüí~¢‡Mqqž3¨p‘™ˆEñ[f" v±NŠÈÅ’Ÿò•)÷Ðë öãÖgW°á¢ÛÁ鿈“3™t1MËT4b^%¦’{ÆËê~¼Qü•a~¡4åKAOÁdc?3ð½+qÙ“×K“ÙdÊâ|«Z£{~ƒ+ðÞ#¢ÈÚìÙ„¤;ÁtÌ–^8þOréãsžÕÔqníÛåp©h‰«g*fRoï\õ³ Pö $G×!²I3ñÜ/]˜‚Ëi~FÄŒýZæš$ü%z¾¥0, ¨° "~$Ë€Ë ƒ(-\Zó ¾ W±–*D9Ml TÒ(Y×°ì-‡¡9ÉE×iSÇðvÛ¨á8D5‚fS]¸ûIí¡ : ( Óè³$zîûäëÍ>3²?¹+†;cÉ<ハߚÖD¾š§;ìµ^AYÿkù'ä@¸\' jˆÛ—6A„ûlIJ#G6ñÒÆ…S.c¬{¿3iû+Þý/ûè¯ÞW¿ÌñÞ¨|¾áÅÀyëÁF×¹cU˜þÿ„ZB7 endstream endobj 46 0 obj << /Length1 2447 /Length2 21272 /Length3 0 /Length 22679 /Filter /FlateDecode >> stream xÚŒ¶P]Ͷ¨‹w‡ ‡àîîÁ]î,Ü5X,¸»w ÜÝÝ-¸\òï}v²Ï{U÷U‹ù í1ztÏIA¢¤B/ljo ”°·Ñ330ñDå?23˜˜X˜˜Xà)(T-A6À‹á)ÔNΖöv<ˆ:@o21#Л¼½@ÆÅÀÌ `æàaæäab°01qÿ¡½@ÌÈÕÒ ϱ·:ÃSˆÚ;x8Yš[€ÞÒüÏ#€Ú„ÀÌÍÍI÷;@Øèdibd7Ymß2šÙTìM, ÿ AÍg9ð02º¹¹1Ù:3Ø;™ ÐÐÜ,A€@g “+Ðð»`€‚‘-ð_•1ÀST-,ÿ%W±7¹9oK ó›‡‹)Ð ð– "-PtÚýËXî_t€÷ÀÌÀüŸpÿöþÈÒîg#{[#;K;s€™¥  (!ÇrÑŒìLÙ8Û¿ù¹YÚ¿ü³r#€„°2Àè­À—çlâdérfp¶´ù]"ãï0o]·3µ·µÚœá¯OÌÒ hòÖvÆí¬µ½›×¿ÁÌÒÎÔìw¦.Œjv–Ž.@i±›¼‰àÿÈÌ ;'7+躛X0þ¯êáüGÉü[üV—ƒ½Àì­ ¥ðí¼—³‘+rrúxý­øo‚gf˜Zš€Æ@sK;ø?ÑßÄ@³ñÛæ;Yºt˜ÞfÀôûï?OzoãejogãñÇüŸýeT—RÓV§ýWÅÿщˆØ»¼èÙ˜ô,ìLæßCÆùöàóßa”Œ,ÿ½Œ¿|¥íÌìÜÿZí[›þgÅ®ÿêÀÇR°›Z €úÏë2±3™¼ý0ÿ?ú?.ÿþ;ÊÿmÈÿ÷‚$\llþQSÿ£ÿÿ¨l-m<þmð6´. · oÿv ìþ·©ð_‡Vhjébû¿µÒ £·ƒ lgnóŸ6Z:KXºM•,A&ÿš–ÉÕ~Ÿ2K; ’½³åïk@ÿ¶5ÿK÷v´L¬ß®ç·‘üG|;9ÿRÜÎÄÞô÷caç99yÀ¿mò±¼˜ß΢)ÐýŸ!02ØÙƒÞ\oåùÌìàï(;€Qø·è_Ä`ùCœFÑ?Ä `ÿq2%þ3€Qò±¥þ+€Qú½å“ýCoùäþÐ[>ù?Ä`TøCoÙÿC\oÙ•þÐ[¾è-ŸÊb0ªþ¡·ìjè-»úzË®ñ‡Þ²kþ‡¸ßtFèMgü‡ÞVfòbÓ™ØÛ¼mçÿHØØ~KlmÿøÿÞgFÓ¿ð­{À?ÈòVÀÛ>9[üGÆú[änbcdû—×[Õfð-†Ù_Èö-ÿ úÆõ7ºþ•ô·Àæþ·¹½‹Ó_ÙÞ Ìÿ·ø–ÇöÖV   Ý_o²¿ò3½õÚê/|k¨õ_øÖ5›¿ð­¥Uúv›1þùw©ör¿Ù¾½]ÿR¿­ÝáúÍ×áí gg4ý‘2ÿ[ú¯Ûé?â·E:¼ÝIömÎïÎ8þÙì·àŽ.ö  ©±ÍEdeû£øï ¬ÜÿÖü·˜ù÷ýÕ`æ·~9ÿÙ€7'g ­åÿ¥·®9Ûü=ÌÌoKþôí~eY8ÿ´ãíÞ`¹ÙÿåðÃå/|ë¼ë_ø–×í¯©yóvÿ ßÂ{ü…oÍðüÿëJ2qqzë,蟗ÆÛÿÿó ºMàfíMxƒ­j‚[彩߻ÑïŒòOQìh$ÓÐ{-8µ¹< Ã$ÐT¦®9Ý' v£.o‰SÿZ$~ö:jª…ùÔ¯Üòèýd÷qb§~~ûÇXÞ‘ð÷>B8zU¡]ïgGoõkÈ&ðŠ,G.d¥Œ;·^I÷ï}%Ká³;Ê»•²O%“ôŸÕ¢t §)²ÓgpI¡Aô„°ÐÏÝQ¦ÝL¡g޽ËÄÑÂûfÍ÷Ò^g‰¾Ÿñ\)SeqîÄ#ÇÓÆ%„ü…>¯À ‘|æÍ<&&m®w=àçìYÞÑ>åuç íëÓhs6nèzA¯A ¯ÆIççyx¬â†i¡ÔÙ©â]áÙ«1Tʼ5Àºé Æóõrl±bb¹/›ìóýäùlÒ’=;sƒºV÷ܹ §êåj-±ì¹Ê$ÛÇ‘ô#ûu"A!½Ü7¦û›7¥¥"úXöê÷çåna"ƒÑªœÁÙáíý3;S$…#! n·fzàŒÉNTE\IlbP4Tù¶F: žÜèJ¤Å(¨òäûdø>y/èÍ‹å÷àUù a‡ÿjðg©iS¼£CLC]‰¦HÛ]‚$3hlP¿xÁy¯¢z—Cæ¹Ö379²Eòsb‹Ü˦\·­·ÀË•iGI2·åÿíjŸ:*âÅ,¢qUÍM¸v‘ :uúpíx`J„ ¦• S`ôX WL•¶*—O‹ù:Ÿaµé™.ô@ÓÈ_á¬[³Šù‹/¤”_·S œ|ML0Lín|÷‰#!sÒ]2[Ù®¿ôý·¼mËJŠÙ¯$sðr,`8Õ:ßЮ·òýhH¢ÌB4aMöÑ"aÁ¶øf¨0jb/>b(±Šg“ÓóT£Q¡­¿Œ #Ë T2¼[è­•“•€QöxqBÇrTÓ¨÷ŒwÍÌJͼ¿Šd,B–˜3w#•`ÿãv¡Fî]ù`¯Ì7º7š„€0aè[Ï—NÄÌTì ›òÊ×r`{VÛp?Ÿ¶:hq¾š¼V~à[WWU•*8ˆg(xÅ™x„`0œõN'¡ýŠË]‰y†ðŠ4v'¶ˆ‚ÄË‘ÒÔèã$ëÂ|ÀúøMMìå7ìZ)PyÍÄ”Ï.Ñ싯 …îšã™¿nsó.›"›+‰NªÁ­tsNÕÙ÷Ê'¬»&‘øLk„¥—ò2÷ò™ZLeÃ1®^k¸_guïzN™ŽƒßHYñøo!¿¦«NjÉ2,ËâÒtÑáHÉz…‰j‹Hf´Áz,Q#GÈR…ö°(2M©'UpH+‘“Û<<”5ÒÇã¬ëtâMG#ïúñañd‡ç(Y(Ì¿Wz~º•ÆK¡s±÷•/céÅõ\uù’’õišã÷–H}ÝH¥¯Ü£Ek‚½¹²_±MhpŽÝnèž›g‚Ê)‹·¢Çz¯í UÜÚâw[ɳLtESóFofÇ„ò5X܉÷¹IäL'+¶ÞÛùn3«3F ˆð U_?œ0}éÒʶ÷¼'?¹¿í÷§è-ï˜ÄrÛXÝ`ѳ/éYT< J[üDqÙϱ=•€Æá©cF†O4…-ðภì\\J ãÊÙ±«\ºQÓMUUfHzÞqâòP}Ù¦~n•~²Px¨õÚVD '3CʹšÌØb½³¬+è¤ •?>´íjИ -ÇÍ+·]6¦`ZH~÷áÁðÛLovüZ<£Ù¯žt›6 %q–l"ua9Æ]¾ìSvŒÑ áܵÛtÞ ¯ŸÔdÍóšïì$ ¿ÂF‚%ƒsy}œ·ÿ‚ÖÕ«ŠC½m qa,üâ'ëm/`€1;•¤¶öB׆ä±-¿ÿÊá_šU­ßvkÊ †Rd>ÊfL“¸ þZÏêAD–²e‚"/?7.Ù§ý¼¢i[öÚì9%á ‡nSr_JÚ-#P„šW‰Ñ!ðÙS§‰…ZVX²Ä£Ë> X-<ûˆŽÝˆßÖ"ñ¹²¤M)a¿MjÂßýª×@gTS= §ÿêZ9«IUéõ—kPÖ=ì-Pùv6Ö@È ‡ƒ_jMÉÈuÂOmË *só‡v)3ч’íþÏè•1ò´ýÆþ¡¼^+%ÃpåʬØûêê¼óÙ­#aSÈHèŠ Šë–t­\\¥³DAÇ=¡!æ™üºüëB¤ë²wªÙÆÉqíêÑ6Ô6æ]鋯“åŸWH÷Kfg~ên<ß±)3ãT ûJ¹7Õó ‡ó_œõ­OrœM£Sí=ãº`aÊs÷òxf ä2<ñô¢ÑÎKœ"òsJ‚\ÄÚ#å%9¹É¥å,_(ã…çÍßoØÙpx€’‹‘P¬»ä“…Û9RÉSŒÆr ÷[´É¡Ü«»ÓÚ™«¥ZÓXß ¢ìÌa ¼àa}c´„³\˜t3ÎÀï…çêïõ–ÊŸÉd‡÷`¸ÔÉroÚ\1 »”—¤#:1è°åªÌ³»}¥5€ŠóN€ø¸bÃ5+}¤)$D¾Û¥¼´œºynîxèZ›’ðú+ìâ#ËûñXè™ËM‰’u·çþÔDˆ6 §Ì†Ë\. W.´§[ ¤W¼çt~žƒµðö-•kYîLÉÎh³xèÌîc§ÓûIkóÛ¸Ïuîê¿êÑ&ÒIõÈ<}q“ \/»Ò CãRnæûŠœD¸ÃɱìµDËE™zA%¦Bd·E\`ãÖ Ÿ¦#e«À³¦xs;§ãm$¨¡æ£®" Ày×7òM_ʺOÀ¿”£>­}hàûQ°Õ‡ŒQéÜYÀÍW'ƒ$*n¢~c±Þ6ØK¥?*‘o¯ÔÖ»9äG^ÛF:ÁÊÚz«Ä=Ç}¬ýÙ™û8•áV9Ò±Ó¢Æ=Â×üãç©_ý_ˆ… Í‚Óô 5VB(YØÜЋm<vɧY4Î0jÜVB~+r¿æî*db hô|@×[a,0ô(‰R®† üª«œÐý^âCɲ¥*öÅç}}À©A®¼aP^¨ …êw…fYΘJXÚ)³Ç:Nù©OZ¿ú0N´>­Õóˆù‘·óZŸ”®áG%ÀÕÄsޝ^¢Î§dƒ:gP¤¢¨jêÀµ•…FQ¤ÖA¹Û¯‰i:E4œ½”íOY£véˆÕxZTÓKFÝõª=TšN~Ók)Œvv 2rÙØ°Ô‰Bð5{Y?Ç¿Á—×)zÉJÔ­-ë[§¯vÛúbŸÊUæêÁ.å©eƒ7õy=…¡»nžÉ­-7ïæ°Å_3'“ûa8Ù ¿ž:'`vÿ¸º´Ó^ƒüÒÂ_|;äüëÜ>ÓXÈ+Îc–DT”8Ò Ç–AÃO»þøŒh— ÇaÝØ!ÄÜY)Ù”œ~B÷¦rt:•RŽÏ¡ ½ÅÑ»É7µ–kÿa°7±žÖl´ßÓ£È5ˆxàFijbèSfè5‹ ët+,4ÄáU믹O=šàF¹$\x3y¶ð‰KŸpÍÝH`àaï8w$à´„»'™—†ÖÚ)šÊÄ“¥Ø7ɯl<&zLåY–Ö{ï¯Í| »šjF³@ÖQ•³(Ñ¢ß ôUqzñ0bÈ+iIÏŒóqC}&Ѓ*žÀÑÃŽ b÷ÿ²²6A—'€ÞÔ0(&eõ)uËË +Ð}9~—¡[`q|¶²2{Ì:©bѦ——2±’Œooñ[Õ%0–Ælb[Â3Õ°¡¿A0gKÚLHEŠ2‘ïõ]ë—S( «F@ºD î–zu kß•Q¹0‰‡GëÏÅ-f† I®ûù»Ä@ã1ù—Ùð F3ÖµÄÔ£Ÿý[¤’ʼnhå{TfòÎ0ÓÄšjÏ>O7u Z½uŸõü§ç(¬FúI¤ÚÏ"¥^aG¢‰ îë#y÷?ÕŒ^úÅmÊ4ºf#×è-“Á“/À” ,Q‰Z°§ð«à>¶œü¬êºŠ/ÇM‡ûfTVëO™"ìgz`c¯^+O}íÖPH¶d87n§åeµdÈêmáJXaØL%m“õì·^M²Sû”ýkJ©{èØëk´xeòÿ¨ƒÑ¾>BÀ¼Å‘¢5¤azÃiê–ÃÝb9—‹Ç2¹ÓeâÊU‚ ¼™‰c-{—‡/ÉóŠÞLúÃû»Îcd5ºrðvPÍ®%ÔeV»bHïu…P1à€PB½ýÅq[ Ìe½—^’'lã¢×3(#$UJ[—"FíÄu¾ŒiÜsKwý§Èg ÕÍÆzV~Ü Í£uÁV[L™/wØôS¬Á·„–[sRB˱fcAÏÖŽR=»Rù÷Û2 S¨lu‹µ /Øx<ãrÆcç jýšý^Þg{P§__)éÂn ™ sW·À\ðˆbŒšFxYÿ<¼y¿Î^Í\nfð(&àãM»kVbÎmANøPÔ®'t&o8¯?Ù$){ÃË^ çÖÔµ-íäx&\Äj&¸¦…féRæß½²ÝsÙ6qv<‰®å„z@(öë†'æó¢)ÌÇ|È@¼0 ñˆ¾$–“f³Ù¨$o°ÙbsŒ[gºÐåVe—[ö ^0Z¯ªl±‘&ù¶›ù`|½bÎ&„{ä{Çþ \(iêÄ×V+Tv¹ÂéN“:o ¢Nò8O±M µ±îX·­Ï´mÏeÚ<£g{½cy}iÌ—u6~ ÀÎ÷ýà†.wBøÞPeÇÄX³Ëaûµß~è/r¼?eÌð˜x44:ÏF/@ŠÐ©@5œlÏÈívÃïzwlDô1Ûs×òRÎ(ÝÇj¨joPè17bǧÏÏe÷L£þLÊŽÝ'çèd&»È^È•6‚ÚÅžW‘ Cè‘{\'Äôr”¹g²†ÃÚ"ŠnÃĜӕŽAçÁfן-?ôuŸÂ?|Áš}VÚ(R06 ¡]jm_ ΰ'…û¼P¨×ê9qe~h>b´ëR+‘5‘Â׃¡ùà±ÒXR6ñð¡bÀüæ•MP“E¯;–­HêÛHNêÜå7ý®qG9 }MZ²ÚÉ•/âmþ—/ãœÇ4?ò®R¤ìb3 š‹Ê…9I¼ÄB?ò1²€žåûú¯ïw ü­¹¥5¯¿˜å§M@n¾Ž=?Òb,hŠ&¢0ntŽ÷~YRáDî\Ô"ª„%Øwfµ„DH9¹ ¼/ƒH[ºÖÑÔ‹¾ˆÎÿ+Q!{‡œÃµF_U -œl ·B.é•m´ðtO0lŒêæø¶çÞOÇT]Rn–ŽvÛ«Lò%o]Ÿ±±Ø±¶jðÜ"ª¥ìþ^›¨Ì3X¬$„Èz Dÿ–š¹/?/$`Eçaa¸-ß&ð:—3øê»\?Q“™ñNjnÖDñ™(uŠÀù¡: <°`†û ‘œûå«’ï»Ò©VÙ›)²Ñ8Õ¬d‰ÛÝ=üç[ýéxHB|HÞ¸NïÃ1ÝÞ@$)—iŽWå¾çñdªteÖc^w²ÆhbÖ+b•až+c´“%ŠFL £ÀP¶âëi¡“új@7ž»^Ut«ÍæYfWž¿Mú=$»};ªÎ^ö¸/*e†eq„nµ‚r—ô¥ÔôÈõ8q§ *ωмÄΞÂ+ŒŠf× S5_M‹ÅºÆ,t@›Y“„XƒEÌÃüwU}•wôD!vn>ÏtaÚ âXã¢àו·ZŸ?¾ÖyvOßœ³¶NêÂ×σN^^´6Ø cp$| RÝ»>AªexGRi~©ëÿ,)„¢6‹Ê! Kœ¼·|#ðÄ3¨nð1(0SÀýAšÉ{ªN—Ôk öŒUmÑóÇŠ˶DšäðB^È/¥µ¢!ñØ0.”À'µü´7šŠssŒˆŸXŽÓ<ë¦VdùM•ËXa0Žýùi­ÎöHôMB_àe!%9c¶H˽•Ç?Aì–<ì´/=½C}r{åfjU0"òyüÍJfl[ »…YÏbfÏUXzùñâfu¾›6ÌÇ?ɤé.Ç&*'¸Ä69^ÄõºGñ†þ j·bžø‘*¼çôUÑ9Qñ‚7,ãÚM'Kì wY2– ¾›Ÿü”ª\«³¼Ê§Ö¥ÉC¸¸$hB{C±^ w¢Ð²,¢ÂÎzÔõüsIiÏloÚwó}ÕƒÖ•m}ãb>Xè%êšä€(7è²»}¬ˆ¨ø­}L§ò-Ï|¾üPJ§$^aSiÑ÷†Œa>ðôVpOÝŸ6—(ÃÏi²løFdéñæV4òUv”"G*„K$©‚z±{—p¾O‹Ÿ±ÌK)qváThmk Ò×H ¢‹ËÇÍé} ßÌ$GÓ»`¡àSnÚÝôÝ…´Ðß Ú:>®òËí'[ì÷2-pp›&³|°<$¶‡åvŠQó²óüéá¢wůd°u‚^§ hUVuPÎWø¨Sq«hŸ÷¬¡ÈQÂ`úc£_ˆdo.i_X¿gO¡bY´—´<<ÒÂønW…¶Q£ I§#€t„h=*%Bf<ÅOì+y Î]B4¥4)ÑŠÕy½mjwoÑ'6ï.Ú Åªl·¹?ì¿M7Œl¡ƒ-J‰Wß— f™éýòr<¨­…“±ÑG’U„mU†m–ÌŠ|68M“i‰Ý'LŒ"'²:Ë9?­›ž¸A™ZìN|©º%dÕ˜Goh£¥Ä¥ÑA-ÜïÕ ¡ýýÃp[[]KRÕ)FÅ=Q- 7ÔÄáûtí–—kò:J74êÀ†¡¨¸Ö%0d™†_íB²9vìtéY”ËžÓÙáæL¤Û›ûÏÅ#Û+""çΟŽšô¹ÉÑTÇÒ;†ë°t]’gçÐ0'Œ6Xzß«¨ñB4€ûô»'N¢"}‹ÓûsèÉÂVlr{Ó/ÇF~Á²$Q ]zäÆ7o¸Y´ÎIƒ\Vjг€È”…)=~u6¯ÔbcÖ”\¹ÂÞ~¶®»:õUçGj¥\~“û‚¹YêžúŠ5«¹å*¾ËmrÀé¾öøöe{¶çñu ±VÀ'£·ØÕÖ[¾G9»lwþPlcm!RâOŸï·=³C ßtム‡Üœ\ýÄã4ý™Ú$1Q`{åFO­Óðr²•wçd @Y¥ºm)ý‰|J»uwÕ ƒ™uß¾HOÆ:0_[“ïÓŠÕ5xN|y0è I‚Ê,)Œ©Gø9ŸûOQÿR2œà+‰×F/¡°IÀ»¾ÓÏ žhøŒwÌÓhq çÍ߬ÙNÏÚêÆ×t±XÇ˽CšÓ6¦)ð¸ñÊ¥žâ»íC.“‹ZcàzÍéJ&¶8$³Š¼œöà¨ÇÒ½*M%¯zþh´Š-Êk&3þø½ë«à¼÷î%~êí„Fš‰Û5[ÐfbÙò¿K‘ÚàèoW½  ’P-<&kñÁ~ƒQy´ŠnP䳆˱† ¯Ÿ7\óY¶ X“ ±,v=­*ëÑ8¾Çç~ï¯\Ö½™è¤‚ªSS¾Ð©{wœSÉ5i&¥>Ë@Ím\®Ù{ƒÒÄ1N(VHiÆe?FCÃäz•ø‰¶üŠŠ¹Ð+;GG1…ðÁ‰/™8.ùÀ]wífìcyÀËÔÚ_{ŸÒ†nˈ€XÍñ“G‰d:ö{?4OŸCVb>ÆÊ4©§†ô!îL) ûŒ§e]¡"$QZôá~¹]aJÍè¹™kPî/2Uô¾Šù~JÜhêáYp‘#tðu}y±&NëæpÏ«"Œë¬-®Ž¢[€ÎOL’“8–Ãd¬X›YYq dˈººë¼á6K•Þ'—¬ʤñTl²ÍOs(šS·•}?1Wܽ2¦W ª«,>÷·Ô‰5 ê¢|Qcÿ”–ÙRíxF›»‘þ eîsš“Ú¹CÑ„=ºÒ|Z]ˆµEZ±ßŒ—š£]HK.½«U:„“¬¬ôôí)Ål:KÞºSf¼NnÔ x wùøöàƒ¾§¹†e¤A¾›NuÀž(;MÆÁß5H Sçµq Ö½µ E-}z²G ƒøå:«©ô¤¯®'û Ægþò5Óö|HŸ¯º¼dg¬5m±pÏ"÷íŽw eã鉦™ò³î#LQ¶f R [Y¢Tƒ"f® t¿®B… ÐOéþ²a¶UÜ„J;K1xÆŒã»C$0á"¨@s4˜¤ÀðœÌEI[Mч.b@æ—‡Æ>=å'—úºÅIªý¤»´ˆÍ%ÐRz:(.N–¬Á.=5;Ñû9t¿jÊo¬¸óöCy"¹'·¼KÏ ¼¸Áéˆ-ÆÁ)‚~¦ü dfj¸ÐãF¤ó¢Q¢_ùÉÉ ô j”ûúÄÞA4°k«”†nðÍø§ŒÄgKÖ•“,•PÊiŸåPÇc©o6œ7¨;A|ü—žn( íìÒâið;÷Ì–¶C#<¤…ax[ÇâÒ‚ºuÛ¸I‰ƒ»Þ_"œ›à ºÖGÙ0?©·bÂrÄâ –d´|ªvƒ¿×÷€ªŒ ¨d,±¾í͌콾ðIÄ‚=^½¯H3kxr¤È0¥HçNÞ.(-UÑf@»<#÷FÚZò½„ñõ\Ê‚ÌîANw7ɘsAkRYáU²a–š#ý¾´jƒ¬ 4Ë7|€°‚Žî…Ù+:¼+dÆd\¡ ¯iMº¸yWÈï÷¡èU‘/HmîlÇ(tëJëCpå &¼°¤ºÑçëQÖ‹Õ9èKr¦ÏŒþ' ”Îòù“5Þµ±Z#t}=ÆždD‹5âÁA/VTõ²{î(Q\´ã^\ÄeÆåÒk¥÷ýÞg(Žôw*¼´¶ƒâÙ¬F™ÖÓ9³Á¹DwlJgÊ÷䈧; ú)¬M‚GãÌýW4ù‡ŠHeÄlEÁþŽ£ë÷ <™[ŠÛub’®²É`q>ï—|3ZwáC¢í›)±Ö>ãY.+nXüápŽEdgcØKYøk{G:T9ƒ>}ÎîF„c?%ÎNd(îä¸:hñôK™d>ͼWGSƒC÷Ùb4†g>{0n|“§³Ì-“%v¦wCéPžn¯'[†î9L(°öÒŒö×ÅÖO¾Á0¡ñÃFÞЂ:µ„—Ãú ÄþtÿTLØJŒ¥Räú Ý; ;„/»ƒ@µ&¦O®ûc"„E6{h,Š^5ûìUòcÅõWÕýw\¤´.eõ¦£XZÚ‹1+5°)ñ)v³Ýw|ßê.„Ý‘˜:b†Œ ~ܾ½e™l}Köš †à5h×­¤Ÿ}xÔx¸»ÍU÷àB¦ç>„fÌBÝšËMmúÄÇ.p*.|Ý”ÿu¥ybG=ìÂPegŠpC (´¥“'1ÏØ¤ÏT^<ùõi`r׃(Eċǡ7ÒØE±Ðn|*&)Y«¬•‚ÙÒºfÉ÷Y}o¬ZM‘mAÁ>¸Ø¥bஓ›‹™ïRð ºÌµv77Ÿî×HT]‚Ù.;¬ßÃ÷;³#©%är) )»SnôCh®j”ÿôÜœê C•l¼—T"U‡¾*&êµ.·Ýøü”P^O žíÇÁÓM̰ÐtæïOÙ.“Z’Q7ìbÏB ¦Úp™½]ÂÿMlïÀô™2wòêûcÇ<g^uÉ9Êýn˜ùãoÜ#¿fgÝ  j_Z?«qÈÁ¨5B¬0ï¡Ù‘ý¥g8 ƒ}«:çk_ŒÆà“gJGfG;C4%²o”Ü[”‹F¹Á\^Ä#  ¿‚¹`4/–D(¿}(^]ñhuç+λ^Z´‹ô1n‹ÒB¥)g‘N Ì‹,¡iÓn8‡Pž~jZÐrÆ·°Ù›³îÐɨ¥Jzo[:Øv_ö”ê=ômÚÔï&hF°]iPþùÄë„l}à»_¼äw|G9ò8=Ô>O%‘…™$pf…niŸZÚcZs “guvóá®Keš+2ä­”À.`füýÚâ]‰ñº[½|ëè —™¢Èðjàú¨·¶¬Í˜Š‚µæáœõ9a;áeWYkôÇâaã?opãÔ×ò¬8¼÷¾&ZôúþÝe8/ÁÚKò啇~…r0ªá~c_©;¯¥°Ï´ƒô¶ñlpêÝðr?'ƒ®°š[º|uX¯®sÈ’÷/UêlUØoлîle ’Ïѹ$z¨4kQ¼v½½±P‰~plªHá™ËÆÚ(ÿà45o¾¼%²Õ¶·‡ÿ;‹¤HEk4‚YYòžŠ¡ÀD¿×| h{§ÀO’p]ÙwÔ5¤ß[ï2°KÎÅJqúÏ-?漢¨–Aooq”Ka»BÞíÔ?<ñ î1M Ú˜ ètÏ=eew;3rò§Ä—½]Þó#¸h׆¡‡z¸¿ˆN5å8ò;A(]HCÄ©ÓÙŒéÜfóŽØ†ú,ß}áÃ8€akÈ42åbï!ü„ã×›ró˜åÐɇ Öâ¦RW»Ê$ÀÉRrXû¸ó±bdqL «œP_×@ÒM{W­õ‘DNm 1 ß–¢¤òƒ\ñõ‰²ë«û–01¥c”º¹ rkû²äjÇ}†îãGm—èTøaœ¡%1O\AW3-ë©#èhU')KïÄö÷ûîǯ»¨ªlÙhâwãÒ’Ï`B÷¼XC’¯C·êã·éÖš²N€¹½@¨´Ý Ô`܈‘u±§jžx/¡ÏÆÚ?Ä«)òdÖ&·‹ Üœ–ôäJKÈOË÷}:—¬GuNò=ѽ|!sˆM>Å,›3åv°åš„þì÷‹ãš-¬§-©D–ª»ä3·}ÓVObù‚y3~Ú.Jß,‡>áDó(s?Ê”°ï>NvO:!è7­ñÑyB¿N­AA†|áý– *EHœsUÒþÞÜ6’\ÀK¯¬ÊBDÙoÖD­3TÚÌé6—”žh’ä:áŒ,€4QÖŠ¦ ô]Q¸úJ¢ËN”q9¿QÆ© ’}Ø–›ZL``•‰(AÑüjà –AËfÜ`7yÐÛeY<ùž":í™íÔÊǶS:¥>ÊÖÆ)Eµ H|ž™«­z¤L ÓÚ*fÛÂ,µ¶ü!S¤†*uô€&R*¾TÚq‡rWŽ jÕðë òÁò-ZäÁ"Nëí\_O"7™î2KU"z-æœØE#Sf–“Á,›äøŽ×Dœ±gäÂO÷Wõ ½wšû½xU n«×Ÿ‰ ïñiæ›åzñ7×6è6º 8‘|Õ{®ÕýZ”S8¤Æœì" Q›Xl´067“é Ôë"±KâD©ý´Žª§GE¯ÛOtÁ”Üb”[ðÄ´ž»Ò¾:{“ cYAQ”ã1¿otÏpî¯Ø׫ˆ²QE÷«iI¤Þæ(²Ê®æõî?ÃhÀâ„ÄáÂb‰ûOó¤”î})Q™í\Ɇ„ç·sÅaC¹ÐdC5R­œâv†ñ¾Pr¾v5Qææû拸ª>çeÁ¬m-RÞd{Ë ¬÷†á†/¡b‘Rg™Ér~ƒ6䎙Nî?Q».¶äÞBQ«øHxÀÝm¨úÊ|c×e `–9I¿™¥¶Ms¿‡ôK Ý8]ð}Õ=–ᣣո‘þ •:#ê›·®NŽyæ([²†ñŠyìÃë ú'ê%Κ÷VìÜÏ[-|‹÷9J’ÃïqCaèçÌdúk‚Ÿ˜6„ÑC#:¥rçkˆ(qÚS21r™VIb<ˆRXÖï¿÷noZ0ø{K©„³°h¡þòòîMu"{_­¬ÙtHÎ’)dýòdà–€ÛÄ‹³3¥E¶Ô=«MÛÖW¿aƹ⤶£ø4ökð†¤î†ËåG‹Õ“J鳃~žÔL¸À¼n‘1j€´*‰±|8â.j®VÓ4B0s1„E¡®Á"Ö¤H %Óþ™=)‘®ÃrêdO³7ô †CH? ˜>›3‡ù„tŒö†ÕÅÔ)èŒÝQ¹ƒ9ýžEÙû{ó/fk¾&ÊÍG¿‚/HßÝ›O–QJ««:ä‹ &²ŠK_œaeS~`>;¢„.^`*РLÚ|P™c_£6g®C8`¶¦p NÈ5Üpã„‘2k¸ƒQÁseà™ ññ²òÔ úiiæ¸/Zn0¿“Å:X kíº·[[jŸÇf"Ìo-L=çW&Ù™¾¾×à¿DÒu@M³RÝ#ßVÊniP¶>x— éV:ò5½â%_p‰þ¸Š•|æj)R…>^¬q~ÖY îVž/K·Û¦GÔâ`‡¼ñ퇖ÞÔy 75…‡ hKc'þU‹ûÉI}¤OþèíÁ‹|’±­eÕvÎJ˜ðªÜ€¾ƒÿA…º'5´Ý)§Í{©4sÜ#žÃx¼C®BýIá<©¸\û+Tò€3[q­³ôrvé±¢ÑUícbâGnÈ {–ôØÑ]ßïE´7Ù¨,hl×[55l–uŸNáœÏX1Á"÷ú¾Ž+ ’È%p1Yÿê _8 Æ?E’ÛR“b´,ÏHû•÷æÒᙆŒCöª\ŽsÁd•«„0ÓU At…ç–г(‘ÕÛYï¼ÌL7@¾Eqsjƒ£>xC‰8p‘Fýv÷ê1+~¤ïÀª·]<Ñ´\í–uÉMIštRÏ7xåóFB-|\H¡.®öt™Û\EØ{f0õlxˆèÆt¿Òhßé‘|qÚHåѾr+î"™«¿“°UùUÉ&E˜š'eëYZ5çy÷¥òÄ_€ex媻áÒDbé—N‚¶ðzZïÍH@b%ù£¢ZiƒWê“MÒ^ãEå -8hq]t›í³4œ¢2Nmu{ļrˇ£'[* Ûõb‰¾‘<œ¨¾“³“aa0ÍïiÍ?G·ê ý 8¢¯øÐ¡Á½4ê +¿« ±;µ º‹½a\D¤g84 ò] >$ïGD¤&ûæOÄ—~:´hø´ö5˜À·æÁþ£W¼ù$P¸ø’‡ÿQ¯0¿càJVõ˜Ãé ;Üoìö¥îb˜ñÅýê¯9G§Á„Ú£Æl ‡PÀÄñSy=6/vHFI. f ÇØž ËI17)mĬ¥­6׬õáÞ†íQ§øçG™‰²‰JXÄ¥Þæ^äBA‹cC˜ÜퟛÃéX.â°|y<ÍøMí-¨,õB®7{%ÆÒ(>¹?Í+y€`ìénË ÌË[%âµ£û“~¦ˆô6xò•EzÊ»zÝ|Ä¥ÁÇ„wd@¼6”öÑÜ`G1#Æ«º›>èx%à{•‹²¦›rï›G|g=ñg¡+ðéãòn¦PÃ%eåÊh JLÞ;YÿH\Ú·:Ojçd4\§á]:64ö ™f%è‚Á¹—@l´.ÁêÞ^xZmg‰']ûjÆÊe‚"vD¼Nõ/½…`ã{Âö“blI‹ÉäG,]8?hoáà!Uñ™Z¢h3YþlGèI‚O<17>¡ë½¸Òùq³*ªžÆ¸ÊHÞaŽ¢è *1ó 4&ׯóµ}YEÅäRÈ®äTüî…+×<ú÷ }¾ÚƒÃ…3ù⚢8ôôK¹G°xµq7"b#Ýè}û£ áQ* ÷°—íùö¯›Tï¤baòV|‚÷®Cõ/µçQ¦´ s†dÕ&P'Ñür‰p¢>dWL8rΚwíß_x._x“–_j^e|l l!µQZ à”º¢ý¢OŸ×*üÚàªÃÒH³­c±{_%®…û}„Ôdêá{0¯w­Ç^®4º%œn]ÆÐrÁ¤ÇÇ^k¦) e û¾¼6ÏlŸ²ÝÏÙì{éãLFråâò[À1^q¬š 0BD’!/©ºÂ뀳@zÄå‘¿}¢‡ÀÍÌ ªç#ĉ<ì¬çÓ°UJš7 7e¢},S|þç…~{ÀxÖ–Š~Q{B4”‚„±lxô”,áMôâ>ÍÀÐ>䙳{ävÊ:¶7o5žížÒXŒ¬Ç^Þ“¾LÒfV©ŽÓ»T–šM!S{uÍ«Œ3ÖçäìVq%’Lò‘eßeMbÐíI¥;Á¹3Ç5wº~Ÿ+×Ýïð].ec4|á4:×,àP1à6ú´F@SÞ"úñÒîÝð@x°Üˆ"ßø Û'a­ñ>Ìn‰:j”CV´¨;»*´vp™i;[»L†o¥} ›]1* ù\{·k—IêL·l,ü’gŒò»)cƒ±b0žìp4¡F³cá稒‚ðlN&x ÛHúRŒŠÞì‹ ¢8Ä6„ùnmJž§0Rº†²6†1tS>Á7äjòÊÌØmGܹî¥)H,h­y¥> Ñ¡øCŠ‹ÅqŽ‘Í< c-˜ÓrzôÌàaýKÜ{"ë5-&ôéI‹íUʵл"Ê¢œ•oš|zãEåŽ&3×e|Ÿé]ãñîü÷¡0ß›Åâ…é$ /Ut¯ê—O©š}ø5 ‚`Õªnk§òáJ*³µòY‰ˆ>|­ŸÑÚg•‹œv=ÞÇu9ª’W9LY0°Öæ2]YL ±…ó̃È3ŽY‚ƒg^‰†Ù8‚³ütÉ ÚWe÷òPôU`†¸N˜£k»Ö(U;¯,,Æž¼"V1ÃU.zQnºÓ+••”„Ç’‰_ûì_/tðwW~UÌÕ~4N%ª?ú¹:ôÊp #vóE1Z“VÝÔ#- ÐñërŸêk굯OÕ@ð°Ã ‡Í[qJáùaͱ'+g!¾µÛÈ€Ï"¬•Vjh8ÓqmIòk†™…P±¥PV¾GíÛ¤hgQÖUÜñmØ*v±z,¨[wÁÄ_µ¢C|® 2$pmïâæwgé"=S¹Î2øya˜¦ß>®ÓM¿„^*»q¡48 ÉYîì“ìÊÌìuXyÖ·Ñ´03ðÃÃàøH>87½r†*¼™6ï"ÄòF‚1¾a¹~@Ѧ­5o¼n‰©7œÄ%´ö¾“·XÓÍî[‰"uÖ´óŽÊ¯Ü~̾¾w£ai^¤³ m/‡*u¤¨)¼LÔáüÔõQÐÃ)u0v>[åA8`îAß)ð'§æ4 [ˆ5„¼„E˜º&fW…_ÑúGNÔ6ý ¦¦¾¥,º‘:T{÷e¨nf¡ñ„yXçìMA}Vña/˜Ž¼ÁpÕ`©ÆHM5KÜ9£ï•Pºûü$””¦_KQ½ÜÎ×YJ¢÷8‰Æ#žcdjob&#_7ûi_ îÓXñ‘c*U¹$¥ŒZ(æŸj][Ÿ¾µ¨w8róIè¹zú¯ŽQyßÀFŸJÝÛÌÆ¡ •á6”k#¸åÏiá'™{XCy5À¾Wn†Ç)b¿’‡zy%Ÿ¯Ldÿ"ùjrôP‰}­ Õ% ¼RôYî1Í_*AÔÉÍ–¿jãûtV‰ÀG8ª"ºžæ†M(Ñu,´>‹ï—y47ûýæ‚‚°¹`تé&úI~ŸNȪóÔ’oü"98åÅXF5;AüYǼɹœüï­ž?Ø“Ôðw¤ —¹cKóÍÐ÷zWWrÒú²KkžoÅ3{ÑC à§t$EoëìIk†¦Þvæ­âçeBtÚL8Py¬ªæöHÑ—’Í|çW= çº÷IgNÝU6éÊÆÚÃH‹` ˜˜ô’k.ÉInÏí"“7HSOŽŽüA§Nû¸Ž4_âx}?ÐÍÑÑÙ[B Ó|,—@PÄÉOÀ籌q– ò€ªÙ=,0Gû›¢¦aýQ÷0eÓ§ý¹a s&ñq>ÆñÕ2æÉ´t€ÀÖHþØ4u5fQ#qz ZÓû@3&¥¾ ØTþ—%\lûlÏÂgk?\z÷Šìs䮈Žà½]ÆJEJðåH½Oó?%³GÀç·>“þ¤Á¯‡—˜G–óµBÌ–RHCÇüzªoÌl7²[<3e«liUµíTråÌ‹…½MìŽ4 Ë4„Ñ"wVàL¼×I¡ b¯ýp>úyiÓS ýÑ[@¥Í$©#|¢°îbZ1ívé$¸¤‘}ÛmÒÞß·ÓyÞ¯ÌåF›G‹ ¨¯j?0[QJJ2ÙÊ‚m9ãRPýL?\cùp©•·t…ЉÖ„É *±üiT‹yžFÆÃÕGEË?h5Nï6¡ËŠ»t²¤¿O¨§]S[øE °Úc™ò«RÌYÇl£|¹“Éë‹%U•Z›¯p[uƒ sGÓár±Ò&á/&‡o ÄâX9u Ò‰èîëÇS'&Â`ÕÜbB‡:?t´ÀÙ¹€3[0çXê…Ë—^ÈxqaÖ¢Hð⎴wùä²ãs,jñºÝ² b0ö!ˆ”9í]kûc`^IÁɧm©S~™)C26!9§!âøQ ”•ä0y ¶pYùzfG¡–¶¿)\×ÿ¢s§ã)¾÷³»µáZÙœåÞüs€\¬àBÉ ‰ª4¼="Ÿuqýr$9Náž ŸxNíånopj:ðš)j½‚]]:‚i­Ü­Ûj¥,í…!Õ'¶•a»'¤–Û&ËÌpk¾Wà“F(”ˆ²ç—µ™êŒuäSQüü·X>e°DÛdBïÈ™u= ?O¿+žÅªõѽ0žØ '\ƒûk+WŒ÷­ËZ'âM^jÀKu¥Í0Âc}ÖæMÖX¼H¿ió-cç1n(Û{¶x‘zG is9q{ؤ×,S¡ñK®°âò9zõÛ¥Su¸~….ÑÀ˜4éÈFœe¾€|¹EßùÁ ¨ònÒ¼<2ÿ~Àç¨2ýØÉ±ê=$CORL‡«î‚Ø& £?Þ| Ü×Eï¯ù­¡¥G†}]'·ª8÷•˜ŸÆ…‚åb *ï#I†¼-´s¶læh{êu©C3X¤+!Ã×°vµÐ\Y´ËÞ.MO½MÜä-àUPES!ÇáúïÊô‘7b\Í’b|:)އ'§h¾f’6§m=¶«ß‡ °õq‹VÒ†4q>ÈM5ä ÖQÕ>.RÊî&h¬®ç-£êNåJ³òÑ&ÿ ûž® ÞyñýÓG@¸™ñ4 `Åšqò§Œ_Tcyê¢zgè ,Iÿ5yf ¢ Ç ÙŠÄXw®OŒË{g#¸Ð`ðH\†kœD¤é’‡Èš”zÛðÑùl„åùìÖ±‚W1H¢ðÀ`ÝhßG$wa#·ápú X5%Úů̢fä¬5nâk}<å‘1ÕS¡B¾ žj£mÍ44ÏÌ“Uyð<¯õ$lì¤ù9ÿܘŒƒ•p?ŸCµ9¸Ä¢]öiêëYÝOXlkì¾ÙäËé!r9ôÔßÎ_=¸Vßh1D°H MéÁ´­6—ˆ¨©¾@u7ýü¼l[ç,%ÊD©o¶ ¦!tN[©Œ´àe†µíTQu×+­¦°ÜýX CÉjÌ•M²vwqWs^&7h'™µò‡38±G14ù¶¢HôT9â«D¢ÎB=3¸ÏÎ`ˆÇ¥‘ºA€7â×0wMá°paÍæÍ# èK~vòÏ­Ër ñætàq~ˆt¥Ïü€W>ŠNûÉÏG'±ïSdºi^¦X ´õÈ’c$”ÈDùNtÆgÒ(/CÄÀÌ6ÅÒãôÿãé-ž­Ö›ÄÙ:‰ŽtzÉ•§ËܺvN£…óÿðlÏ5ØôÅ,‡ ¦™OˆZº•þóêþ&þè£>*I€ª”8íf‰-o¾æß‹æÕ×_»Ä?V=r‰çEýcÞ¹nõ̪é¸)‹Kž<ö¡Þ»§p:¡PYçÖS¬ô4å—{J”ã‚ÓË7ØC©‘~2‹h{ÙNÙDDBó/ÁÒ=Áx9€¯ss*|Ðù…ÑÎÀW-!ÌÓ°Úß5  ô|‚)…tœ?¹ïP¹f ‡Å Ɇîæà.Iêëñ[(i´üÀï ôé7¡ÅÑ&£Ó)æ‹ÏÏÒ»ºØþp*ûzBiÛÃNòîп¢øVHtS&m°.œ4géc"ù•¡‰“Vå’̓öÛÞ¨n¼!k6ŽA<\4bõ†ÍrÙ÷Ή/7Ö&J8IOë-%%¾æ4ƒ†jjd·Üßg3UB ž‹ ÉG¦°az80`d‹b³|ð>¨ÈìµÉP›jJ€Ý8XÕe…/3»l>…a³‰k~ðrÓðø‹®%~¹ c“BPÒà‰Î¢µÕfjá-‹E¾ÖË/({Í=Z8jêß…¹¶³É*ýXx~؇'‡)Iž“<ܦ×/‚´‘]Ù§äp“¹3P‹¾IBèg’aú]|A/ŒÅÅpÞ@ypèàVŸ_ì:ªÖMäfr~íÕŸQ¦adèc4­ŒçSb &~ûìÌZ“Tpµ³DÛ §ƒÓ¶~uj!…p2[2r”k(+ ~öªÊ^Bš•oT\ï «,I6DIw`‰QSëŸÒ ž¡Güi´¯â}â¾²ˆ4J1h°«7†J+„ïì+k©È?„¼wÔ‡¬¹„…yͽ:3[$_p†d ?t[—š¡²<¢É 4ÕzÊ9ÂWéT}ª_¨ßÔ©GyX|y[6ƒÝ"ö™åB±$»¿F;UDaêNPy½¼´œ‡†ˆL³$€ÄLE 8’]³vB–³õ¿ Ø‚êIûr¢}„4ŠÜ÷z®±g¡šRN²ýZÆÛ8è ¸¾Žÿ/&¤Ã€½}?sÑ  CT#©)*²¸”ËP¡ `Øê¡ˆŸFÀ>+>lN¯¢¦mëºéGòb&ÇÔA ›«[±ÂçxÐÜ[\9×ë)ºpú~õw¼ÊeQÜEc¼nBŠêi™À’O ¯+­4« Ø­ 'E½’¾›¹öûËÞfTÅòÝú¬ì©j¸"#dÀ2Zf÷&5nßð­½u|Y~_p#µë·¤®¦À~–ˆD¹`‡‡q'3u|€†/ûù«:z5SæÚDi‹˜™Ù\è1ÙBíþ²¨‰›ûíh¹Ž†ù?Aº0úùâ/g³½)'ä×÷FýóiâåL´þâ/€8Ð^â;JnªÆfƸˀŸw[AdXåˆOtœ:É&ø'è¡KÌPú׳k—û³`+´Htß°%`—$ýs¤@¦ë‚j¬“¯™´V=ÓÉ£P6›«ü€a…Zw¹¼ŸÈÔÞ¨ñ7çc!Jû¬á<`°-IÚe´aqe¼Ywú3´@œô’ðQ7ïúû j`wö~ éªC ÔýBÇgo(ÙV]ó ÀÅðmÑqt¼ñüÊ«]C쯸v(M(>Íg¯öÙŸ†PoU6Í1oì•à}©Ûà„1h\c#«&~ SõÔÈ1½†Ê›ÒïáP¦ú‘Ëí<ŒPiJ µf-eEÙó-׳g@ý®#!F¿[`€c[|îjˆ½ú1œ$RÍÕë@ªÈÜèˆÖnðýöJ á’$ïèæ÷1nå÷ÀxrÙÃU Þ„™ù‰&Û»K“ÎhŠËšc›eS¿ 1'pÕ2Á>7¨ó ¦ûb½µR ×­â)ì˜3ŒŒ^Ã^©s¼ÚL]P×\öVü™¼øz2[¸é^Òik\,¢o®ûw|—ý…yAw‹‡iqf”ÆEÑBI¯´;™.ÌW‚œãVu/kCS·!ùgeײTsä>;FS;§ÂP|Zßw[\ÀÚÍ»žK|fÇ}-H8 Ï€Á‘=ß1[Öã1}fu Å4L’‡rG×õ¶R)jh9{½ ©vÌ}³—!|fá9oSÛ]àîìq>*¸†à¦éýÀË».^l7¹²QNäó)EŠå?0Ê» ›t4†à£äT ¨v›Š0DDFjßP6xÙ³¦ŒpY¥Z®•Î1l”H//½h²QmÏ.ĵª­ÔÛ¯°‘Ošòàrjë1<Îõߥ‘4Ìû¼çòÕì•ÿ Œ Ðð 0¬Å6&-G,AO¬7³ñúéj®Íë·¨Rîµã„l!­ŠÿßÃÛ÷&C®TZ´†¥Á–:­m}f /ûØ=õd÷GKE/Æ>ÕÇ-AdKWý_…¼ùíî=vÏÃ^H°{ì쫎šç‹¡~åì©+è ¸äL|÷="üKoÆ[vc,XL0DQÜÊÃ牯*Î Rq,) S oþ’iÃAÕèc%ª~éýÛsÉ»Ùß°_+)zÿк³#†¤¹½49@’y¥Q` -n!ñá¦ÜÂ?ül:®HƒÁA¶Û±;5Bÿ¿3wåžÿ{â‰ÖâòZ¦½EÊVÖbhCZ„Y¬!Óó®÷Oð»öb¬§œ"…5g§Š¼¦3]X»)Ö²ÜüE=ï©öÒÊ®ÞÛ“š>¹‚3™B|a"¡Âú§Ï¡#ùaÞÍ³šæ£•‘`›rJÆG½p¯ƒ©OZZÖ´ûI((NSvzðœÊT²ÝÜ  XèU:—=Ǭ9 ׌4[$9H­õ7èÀ¡<Ù{Íètmc¬ñKÂ3s›;(Ân25Îü5ÆŠÝ;ìúÔ³¦TªÈr¬5âJVý €".¡ïãA)®°ÿ §P›( ŒÐ•\sÛþßËiå yÒ¬x†8S D5B®?U‚Û2öó}—…Éçø‚ñX‘çé>q ²†ä@•S9ßÕð­OðÉî1õõ-Q ¬ˆŸ(±üélº$Ù2èÜt®äYdbÚnZÍàú9}M)ùà˜kNÃC—ðtä‘…é屘1-¯SÌU6 &Øcµ@ ¯Åã>ïÜGSÛmd_únµ3༞/K“RÌ Y¸=ÇK#wqÞb~éü¸6‚%ì—2¸[*lø!äLC°|>ƒ¢<ˆ… ú> ýOuƒ½eVHu?øãψ1»H휇Lu¿*ß]Äòm'/Îæüª iü’)]÷Ã"4†¿4 cÒÐ7¨Ùi¾£n)=óŸÒûxý²è?…_ ··O¬†º™xZ¹Ë˜Tqn_ÓŽQ×› YvWQÆI_]L“ýâóÅL¾zÙŒKY´ý=ìœSÁtU‚{ A°]?íË9THú$Qÿ˜ct¶…Öwîv ôõܪoۼƔ䋌B“¨Ùå×:$J-Îu쪇z½i…y÷€g]1XàªJKGb Mcü¤\àðM³2yÊV…c•/i”'AΠäªÎY@>ÿªY’.c‡ìéâ4°Ð4Ó”·W<ñ¼*˜ï+2›e#E¾ò'7‰¿r‡jˆ£*y}…7ÓSŀ᪩g6y×õ¯ŠqX[¶ L^A2)—XŠã¦Ï Ú´ [sï+³ý °©wýtÙ^(’ZäE.à1ø5£ßK‘Žâ´™,QºZF2~øëZƒÒó²ì Ñ{Ù‚ßdÙÌ_6ÞöÔÃoYÝübµËyÞŽ¯ô}*2¡–Iš{Ìc~ͺáü÷1]C-®ÀW…Gpîi—hÃd&ú@$¡s„BØ0¹ëQž'Ð^*[ “û ÷¥3ª§êöð5›HÙÛxB‡M%v'Yˆ@á]ì "îJô˜ â[–ìC÷V¸;w+Ðv¶ÆøØ«dp‹ówÖ?N²Á!‹I¯§×¡_ÖÛ9äû匌„þè$â×_1ø_Ž([fó÷!ooLÀvMÕ°Bã†_jáYm”a}e™3ÍϘžÜ,Û¹ýÛ(®l*íÕ0©Ò¥`ÞüRq­ßÖùa °  öT—ª9Å$Ü7ÝÖLÿ5òmŒ™\èió!Ÿ )”sÛ…4™€‘z…Á‹z¶®—¤þR ¾q‚\Š4†tæùøTš·%üß+«”¨#Úóm ‘˜×¹+”n×<+,£QÛr`7|#ˆÕxõ,ºBlý˜¯mö•¬§ó›c)…Œ³Š{.”‹ùÇfàáõ½od»‚G\¯nŠ Òˆ›kù×h,ãaoq,àâi­,–‹7ŠëNÍõÖŠŠJßµ¡‡s ˜tV¾'%¢\ŸjUmHS Ó1¹ ±Ëgr G™tgÙ-Rm¡Æ,mÁ‡Ü¨´8å6W|ÈážN{˜ÿé¿ÍJ>"Rp~m”Ì4¤èãUŒœ×^i×­‡ö;ŸñKªlQòÉÛÐ/4Áå°Mt2®—íqUÌ Ã}—[ñqÀP¹ÜmH2P¡eäöG‰9¬p$Fù@‡£d¼}òU«–Ê]Ñw˜S4ÑFƒ |âW*AéÎ:Kô×(òûè"S%ÿRò4cuª¾ úá”lLÒÊ~·ùÒgW“WŒ m©‚‹Ž#tØ^™Üİ,±ÏÝÑ9ä`'Û,;#<ÒFpQ+p¤×ºª™ËÂùš Õå9[Uœ´À¡@!ü—aÙ®4û*ª˜g”ÇF×›c~©îDO¾×'½E Í•ŒF…T:ƒê³‚‚¸Ž¥,]Óo®^5J&òû8m“4Ïðñ4ff<`(Ò!Öñ¢G /Ðâ$Ôò×îºÉ‡ùê:EøJ3‹@hÿ€ÚÅN>MtEåj;íï€È7î%2 ¢ye/"mêøK6¯% .F0)dE vh£¿Êrè®ìøæ9ü~ ×p¨•}€$ÔáÖ’×_©H6K›ÞN“6DÿLƒ 8t9¡Ï&l±-6í=±Q¦s·ÖØôÿˆ¬–P”®ý7߬ÛÛ€ùÊ걸ó†rOã|‘klЙ*ãfÄB|lbö¯ó™:ËÉÎ-dmõkñfõ“S”Ú¼¶ÓýóÃ|”$, Q5Atlñ¼º“/%`@¶Z8p"¢4˜h2/+•y|â’gðOAà2_œVØÿñ½Ì›]ѺN6F“&ˆ=û>¹ñ0,n oãµ¥Gz¹‚ ÍšNžÆCÓ>¢L¶\iÉšD ýÔXñ’½É^Þ‹¾™KeIm©¢qOzÛ‘:.‚ï ¹bƒ(‹(¢?7“sƒîjˆw©¥¦q:ä¸d€ãÕÿóM…»mzÚ)gZOCí+aÆMÆÌ9.†YNså°æ+ºH(6®°ƒp§²67åêbó¹4,#_ðÍ$`±pö2rÌÐÑQ$‚eÕóáu\²M*ÈÊB\q=*#[1wÈËÀ°ÉþÓÑi3,}«x•dRèÎ\;ZÆ Ûê¾ôÐdò‡ò endstream endobj 48 0 obj << /Length1 1563 /Length2 8055 /Length3 0 /Length 9093 /Filter /FlateDecode >> stream xÚ·T”k6LwJ÷ tÒ!!ÝR2ÀC ÃPCwJw§HIw H#ˆ„tŠ HH|¨ç=ç=ïÿ¯õ}ëYkžgï}í¼¯}¯5ÌŒZºÜ²ÖΖà'ÎP7n> 8@^]‡ ðü8ÌÌz7Gð_jf0Üâ ÿ/€< r»×)€ÜîqêÎP€ª»#€OÀ',Î'"ø@±ÿáâÄ ÎPu†‚]q˜åa^pˆ­Û}šÿ|جØ|bb"\¿Ý²N`8Ä ¨ƒÜìÀN÷­@Ž]g+ØÍë_!Ø$ìÜÜ`â¼¼žžž< 'Wg¸­;Àâfл‚á`kÀ¯† 'ðŸÎxp˜zv×?z]g7O ¸W8B¬ÀP×{w¨5¸OÐUQhÂÀÐ?`µ?.À_³ðñðýî/ï_ ÐßÎ ++g'êÚl Ž`€æ57„µþ9º:ßûƒ<@Gå=àwå ÀYmè¾Á¿Úsµ‚C`n®<®Ç_-òþ s?eE¨µ¼³“êæŠó«>lu?v/Þ?'ëuö„úü%Ø@ Ö6¿š°v‡ñêC!.î`…¿ ÷*œt¶`7€€]`„•ï¯ðz^0ðo#ß/õ}~>0gÀæ¾ °Ä|ÿÂñqy€npw°ŸÏþ-áðñ¬!VnK°-ŠóOô{5Øæ|øp`¼çøëùûËìž^ÖÎPG¯à¿Ï—WAOKYOƒóOÇÛääœnA7¿@LT "øý;ŠòWÀ\U 6α?ÅÞOé?{üuþlí;àß±4œïI °ýÃqS Ðêþ‡ïÿ™é¿]þÿþ+Êÿãÿ[ÐwGÇßf¶ßöÿäqôú pÏYw·{þ«;ßoô¡†à?;«¶†¸;ý¯UÅ t¿²P[Ç¿Çq}A€­µ nVvÈòG¯ÿkÉ!P°–³+ä×­àæÿÇv¿YV÷7‡ë=#›À÷‹óP+gë_Æ/$ Áá /à=‘ø…„>|÷«h Füæ0€—êìvï¸oÏ`ã Çùu¢ÂB^Ù_ªß’ˆ€WýoIàÕú[»·þ–¼÷ëíô†ïž¼à¿ÅûjxÿÌêÀ}.ȉ¢^ÇÄ{ÊòÂþK¼Oÿ'Ú})nžÎÿe¾¯ÆýŸjîCyƒáìÿš•;~Cüfðýðþ#ÿ¾ŽÀ`Ø gaÖÙêq¨}}hçE­,'÷Ö{Éiæ-à vnŸx—ûf*{MNðü\6uä-Ñò¦"Û™Ì"ÃÏ^[#fD{²vÇOßëç‰:“[8óÈ'^îÉ6 ÐaÓrëÉlûÞ¸ø9 ¶!w«2¸¸‹h‘\xö+!*–ÆÂg·´·k„Ÿâ^WLqÇêǘ•Î0Zæ~¤|ˆáÆM‡ÅñàA8sv>ý âŽA5‘Ço?V ÄÇx?îò£÷Êk=~×*&*cJ:Ô³c“,>r;iªs>e%kð±ôä]ãN)|Ž;lÞ[:ðÝïæ,ÌâlT”¼¨¤*/bÖÚ•“œJ“0s–U×*ßEÚ,]¹4“ wšŽ" B:¸b[½Wù Þ;˜ldõF:vd© Ð>¡:äü‚Èâ-Û¡ëXŠUÓ!«•ÑÒ¦V1 Eº¶®ÀO¶9õžA»+zŒ#ˈa•™cUï©HÝMGÒ£S«lçÁîíqWk'*säT榦`ÉÚöÔ|\Nšä ¹tîçbm4èÔ±Rs² Úš´p‡ž›Õoíá²g×ìt xâ\D|Ý$­Ð¯¸“­©*Í!~‰­ŒwÙ‚±1îN®ôaC\aõAĆjdÜ-[xщaÕÛ“ñ7'‡fÅÜ@ ž []9B< Çã<͵ÃéÂ8!s±Æ>Ò[ñÒ§íè¾ßžà‡ÞùôE#+f¹Ö¨ò~ºt¢PHuÙÍÓ{iõÚ·¬F}»»aQ*¼‘ÇT^Æ#Zgn­h›E(äRwuó˰/ô|AºµÈ~ñCâ¯zV+@'Ö@»þ9Ÿ€ 'ŒüžcùiWáda¶Bƒþ¨ÁiÇH8—!´4bJÁv1þ'3캓”øaÖÝ•(ª}H³jô./κ™iÂ6%d0¶f]r~°^1“ÛM#—J²-y5ʾªŸ4ÿÜRa&Fž%ij Iå ‰y£ŠŽ¨Áï-Þ^ž8|æ§óeÂvhKÌ¿æÃ®Û®£þ™7c…k\ú§4‡ ÃÚ…oÂÇóI¶"ÅS¥ÞÁnôÉt¯ÃXJ¡32XÊQ«N¾þÖï$,CÀÎö2’„`Ö4îõìòzQ’ÔI7•;YÇX1Óã²-ƒ*¥r .måc^¤ýõÀ}iFÇW±ê ¯'ùmI4w–xHÃôúE’)¯š='’Ø¥ÛPKä±Ö Ò ,IEÌ?9d畟©>~m…£Ñ“Âq‚¿«DÛóêåú‚ovÒL}¤þË;«ñêµ¢‚‘2Ç™€dá)»,atlþ…µ¦ù ô Æëú§YŸ;µ|™Ù †Z œŽÚç*sé)Ý+.`Ú×G'¸(V¸¿1o4].=^Ä^å5fEDàp:õMˆ4꺔ï.CFDWæ‰ì« [m'$ò7À8ƒEÞ”+ìõÔ&'"ÕcÜÈ/¼^úűҬ±xz°ys|Sát~K›à1lþ {½!F¥/ˆ7·#Ìv9Ö}>·Å ïhnŽ1æ·ØÌí"&Ó>¹¾[Å–©ë¸}…YÐâí© O¶"[Ó"cûœ'á ÚYó8µBdH™7¹¸E0]gQ™²CèMÕt Æì–~Ù×ZßqŽå˜PT’×Ñ †-Xeˆ†.ÞF–*t’Ú­¦ß?œ˜Q¤ôº&j7°váîaµÏdÔ¡Ñ-îï -˜¥© µEéN=•léowâZ—`´.;Ž:cS·ñßà%ëoœœ¹÷ÊŸ}ÁL=ðLïŒUç4fˆÚ~ )ßy–N½ê§vωt”,®yÛÄ;fñC&äËtþtÜÙˆ`k\c¥*A¨Þ‹±a¦Êg µÊdز‰¶@ríª‰ÕÇé?=|%„1g”>˸ź…ÇHmŒÄÃT(ª˜kÙèN=RG·EüøÅ+ekž.V"3—c¥¥™%÷qf]­×9&ž>&;aM£Úû °láÀ¡‡×ÌV]n–×G(,¤3ÏmÒ˦Xµ/«Ê(à*Žæ-úº\<†‡n|[1¬èÚ¨1ãÔhõ¡â˜‡géR /âmäô÷)íî–6š´!DõÖÞX›74ƒ ;2ÜA¾¬ÖÆÅ{!õ&DØ%Ê“#ÆÉsnkïh\§·s£‰/- Î_â¶p¼àÅBó$“ÑSâÜ…áà ¶ã ú4eùÆã,Y ôÊ2©ZÚ£Ÿä™Æ{NÕôÁÍ’a–¦ýìŸ ¸^¾>‚þ˜¨E…R‡œÚ×òè}NÅE:‹ Üa©$ŽÝšÉ÷®ÈUrŽë›yhNQu¨Cô’ákÌh>@øÆS4gS7õm¤ât—+(HÃkY­q·ÏJyŽúté­ÀVññ÷ݺ JM» U١̬†N)óÒbùÓ ^4˜¬*Nn­ÓÕâÖÓƒ‹SÔ¦i¶A:ˆ‚>ưkkÆ.\ä”ì€È¬&ŽãŒ îÏbÛºÕ Ö$ó}ÔI–LµWÇCáæni‚~vBàÄUeHx¿r•J —f ¦0ëz ÕÆ±cQCx6Nè]¸†æWÊÅGö¨¦^–Áw[ £jS‹ñ/£5ì®2F³ï¹e™9žæÀòK2<¡ƒ(¤ îødµF¡çðå­Ý*ÛàÒ^zø—Ò`¢Ûñ-æäÀkë¯Ýi=ˆ‚Ù«½ŒÑö‰Â¢ëgÖ+l¡âyαÖ‘EE²êWZ–¡1áÜЗ‰»5nhIfšJ¢mYF¦ÁeéU„;i–BÖ$“šŠØB øuúzvWT+ŽÝb4ÏÙ‘/g¨Æ˜`òÙYƒ{tDœcl­êqØ;µ~¼HÒ„Ž¹YÉ[´,øÌŽë¯¬zýL–m€u7)’O5 —º†$eZr*­‹‹Û¹E›Ö\~ee÷\pîßÓg…5œMÖ³RæV«/„ݸ†oHI¨Ø_CÎQÁM††ªé|!(ñ+ˆ¨œÐ-Çö`h:bÚ%ÃЫøEAëNª½ÌDªr¶´oÞ ]èá>«"»(,rx´^í)Ý ëÛh¼Oî»ÙpkÊ%§[êa|Îèœî·†×û”\[ã%mr%OÉ|7ãœoN슖_"ôn;ƒû íuöõ«»ŸÇÐr±| ZÜ¥a¨5¥¬JXþü¡ˆOM®¶râÁ#ÕÏõÈMG='·}Ç­t0 Ù8€é½Q˜êâħ"Æj AÅ©§6Û*|e´Ò3ön}¬#¢â¼l1*yJ…ù‹˜H£MÂÑChTø!œ…õåðsÀE"oÞ>èddc@M‡X÷–wŸÊF´WƒÍpb°’F·‘L6*MCßÕÌò±m"2},·šø—˜¼d¯«Ç`$ ù4,BñÍ|ˆË¡”ïß-1 zRYQòƒ¤›­ˆ( f/Hñä—Ò‡2EDê¹-†˜ÐjªÔ=Ö0¿Ò}%÷mcqíyW-lÄØoûj=a’ìIü94Êj½—î<ãÌð£ôyØ~Š3?Á¦ÄJG6Jdí~/! }B=A¥Û§ë´Ê„ÉZAï«ñ,Ñ%ÞTŸ}Ëzp2ÄW“ç‹¢˜§¥.J»ë€¦wÂÆlÖp#cS¿íÊËÙkRá2¢õ¥qKL+xCÛ÷¥DCj>‚Ù‡kP£¢±c¾&äÁ0hbÐSº^Mynr Ùò I1 [!ÉCsÄø:"¨±ÿn1O1€¾¶wÑM”‚ÈO#ÿtV%Na44%)#ª»2«„¡›1(re=ð¡™róÒîžÄE=þa'ˆö«·p9pho€‘ÞæSÒÐzG´n‹!™Í,R5ÆÒó;ü ‚õþÒ&ÞôLC+œ ü-¾äy¡|¯DÑ^¼öY ƒöÍšÒÓ…Ò¶¾ïAÁ¹DæOü¨IãiÑlǵrc\ú§Q;õùÛ¥ä$a=ñ 50D==šç!Â4e}Vt>wjOK9ë»ý@Œ3§k€`Õ.B¸Ñ¨ÝémᨠEi?Ø:à5‰F颥4IÔÔq—R\Km)õOà–x#]ÕØk½«á²7ü”B®³Xí.Òè‚¿ßqaïäˆ%ϸ|D%O Ý£Ž…`ïY¸÷‹2Ö 1Q7X¡•]êëg^kŽ>ö÷[*#l%¾°– ¦Æ%K»Äg°mƒ‰Žì¨íìQrÏIÜðP›Ù[²Ÿ©L Ù]¢…LUXG)ý|´qy,ÂÃiõsóÙe_G~éÙkI-y¿ÐëåçüËC37g¤$,{ƒ(¸»ÁuJ"sIè%*i1]@m›^ÞöÄsìèŸ Tk‡Ùy`FÝO¾üqÉO><ŽM€’ ˆŸ)Ù'Dü`÷wHÍ[Pg•}Qº¤#%OÛ¾¦nîwen­&çÞÊæ™1<Àø¨¤ÊAx8óF7èKº#tî.hÄ>•ÑɈÙ#ÍøaSÓÿyå2„µöå[È,¼Pd=œ™¶ˆ=9.X"òâ@ô]ËAh`]Äp‘ƒÿGñÛ®\OØÃÊÇöǵ²hWUØï-tuL›Ÿ¡ÔñLyj¬SÜÈ×%:ly‘Tú¯º+?Úe%˜Ðix®ñªPÐãÚ>ÞIªÛPûÌ'ý|"@‡¢ë© …ù)Ô0¯öN½Î>ƒl^†–åÈ H+žÇñèåË ¯¡o¥£[Mèûj~/ãlÓ§cj„OJ.DD%TÓ@n¿YŒ¥s­oðΙà IS‹ÎJiçhÌ)C0C^¯ýÈI´M‡Iú„O?'ÎÎ(K±½kt7ìš.ñöÍÖkÜ4PQ߬±áX+~K†9fõ¥zÑ\"=GGh܃۳šcKp>>òò$/Ø è$BúsQ°ªœMXUîÎ+LˆÏgåG‚v¸laÈ4¶þ8¢o¸gãæ¾†u“Ê\°ùígS^Gm“ëå`èᪧç„jUÕ[Âf" -¼c|nY³s"xQ‡dœYI8ï($¾I¸Í%‰id-ôŽ­9ª(Ó¬¸æöIº‚ kÇ>¡Qœ¼äS}_QÎ;WÛ]®f’ÙÒëÊae{&3ïïä`ãQ&/º2:DŽ/¦3–‰7'D- -€ˆÀZ*ù›SƒµÕ*Dê_Âzð[È­e¾°ë˜õÞÙI/š8…Á¤í#ŠÓ\hžÛÒÎÞ ß³[–±T>¹kÈ)²î#7ÅQ VÅ0 Ï€³Œ:Nxü\/¼Æs³Ø–üÄø¢º€=Ÿ]2"û1~¸£GmŸR|©u*VÂ÷Š4}I!ÿ]©€=ˆe­ÇI=Š™m³`¬3ËM¶»÷ÃØw˜üë‚bµÒ%ªrmÀ³sâ³lÿËb§;áÇ!qUØZŸØI”j®7·´(™ ëm̘ã5Ý‚âÛ¶6)m:e0?>™ÍÛhbðk–‰|>ÑR¿y‡^~bHÊò¥ŒýÑåû¹ÀÚ¬˜ÙŸœ…L# üÛç™år¹Þh‡´fò»CfVœ;A“1í¡è!£—MÕ[ê4À¶Îð…s¦ã÷΃ K'q'Ní8å\%z&'Å ³ ÐCÖxÜâ›…–÷’œ<»nÏ›¦¸X_½Õb_<ùPšç˜&Þ4 ƒÍ1àÒêûÐqÇ4—MËEÑœòc©] 2‹p@šc¾.›QÖè…«ïv©Q§ûÚ™6¾òžøN©ë\µp[ÄЬ×à•?ÞV¿òÈï³õÿøãÀ½Â¤Îñ;›sçÂÆL-u¦£"á¾grKkïl(g`LìÔz±ÁÈ‘4^ÁÈ´(O ·Þ’_\…¿Åž›»Xƒè,!DÛdwÒ¡ºRMuÈ 1 ¼Ò§7ƒ²ß¢f¾ ¡±Ÿ¸Öã£<ÔJ.…×4/œšéùöOº3½× Õ£u¿HÖ&$£ž@iW¨C¦²/³oûc±À3±\;±ý/d‹gŸäÎ;4òZšžmîÔ{¨¬üØAiÁE-Ô~°úà$Y¡næëÉO‡ ×´";©æ,‹°Ä|Pl¹V-›¿=³Vuxëðˆ!N“’¡cªZФ4JfnÄ禣ËWçh+‰å,½ÑvîgH,]ô²ÈáLD1Á±3ÌWqbV¦Zx•Ø®â |ª¸¼9k ߨGéé%M"BòC£ÉOç|˜ü9¦•t±5¤Âà“rtfÒÙ"US,ŸÒbþeDô§g„»zõãS•#È® Ü}0ÝŒÊ^ù†úqœ`T11Ø ÃLgÚÇ[¾5¢]ÚK³]w–g›s]ï‘ŵÅÃy@ö CbŽ¿l¶Ô mˆyýÊ•Ž÷¤¤ qÔnû…­½ìJ2+"ÂRNËZ¢f³Ä|*Žkš‘°¯Ðãã–Ó<®*cb‡Du¯n=Êð[Iõ11?#:“%+Y~N뽇Ÿ<žc+ž%™ò¾Ÿ6ÖÐV ¡Û|û…ÁŽ’,¦Ø—áÁÑÓ/RBS/x„Øžn\‘MKqb†‡p vx}”)#[EÏû ÷ñ›É3†ÖΔ3ì×tÜ×Ä1©Q)‰Ç㉌%¥Ü¾åg:êpalk&bûØ•žÕ`êüöªØ6f žóïøn=É8”ÇÑy;çñP¾-;!Ô{r ¬“»øzéô™tU³åv!œÒ󭧦;‡ÆÐÂ*:7óΠx¦Wìµò[ÑZþ‘—ÄÇE￟ ø˜}Z¤›…Á9L!ÃBØhÚ?iÖ“ki¸VÈX¤±Z[ õ}&ÙÄw:Ư@;¦qbña˜;òpñãÚ:â­™}m"4ÉâÏH‰;¤ŸÆr ›hPÉE}èäõç[·h»ÝÒlæšTG¯U< ¶Ìjô}†ª-È0¼-/Af ž˜ÿFáüyëJ!ž‰3;©,‹T£ñIwç,NÙYý›ƹ:¶ul¼ý›>·¢\%í¬†>Âíg„t‘ 7­ÙNÁ»lÌä-¸eû]ô¼•±ú¯Z>ú@b!¼íha\›„WªY¯ ?MÆJ¥ã‘DݘF?ž‹Ëã¾N:éÞ?Ö z,«-ÊfXØCÿ³y23V‘Gg´ÃÛ3Š?L¨èM…OÊiWX›–\yVH·°#"Á/X<8¤[%Ο°G¦z{=»¨?hÙ³ËÐ<¼Ľ Šîâ*]ÞJ2›œ6Þ-Úk%Î\±½÷Q¶ÕAÊÛÄຜÕzÑîí¥U|ƪny—Ù¨$ÜAøƒ²È™ONÄR”Ä«:ó%0lOÒ¿)ÆYl·»3hrvà2b…ðk™™Ÿ­³q³º\ÏZÞÔ4…'R6qî8tÙÔŒI¸<Ì8µÀ-;U˜í£K!äÔäÔR™›—·‡z^¸5£áЗñë*OÉð—ãc6Þ³‹ˆ?ã(,jj¨äJc#SmßzÇ+=½VɹËñI)c\hQç¸ñ*^£›¥ ÐÛTNÂuê8ûI^qDø¼d™§ÕdˆfÂÓ:Â+i[ŸÝ¥n§Ù/fĘîïKªe,"FUfrt‡]¨ Ž*K•Ó•s=G\0Ä6öHËéDå,LÈlP‰¥‰½N¨êŠãÞ‹ ¦O½ðq–—¶Ü zybp/ŠužÜ°â͇6ãÜ[î~qó|CZ0«ûÎa{†%!š’ëá<—¯OfaÇSD¿l´Ÿ~ôÍ=H¹—¯Ì<9æ›F˜fä¿=DÇ/~–û²èC¸-Zëcj%ÏÛ­÷7¥ ³aŸöKe®¯ïÖç¥ÐÒô—Dåš÷¨¶8ÂSŸ{ãåaE­W“÷š¤žR*K%·ˆI¢¢¥<$Ð ¼X‹Íeõ­“×ýü´l*_Î5— 䱄գLÉ{WUõ¡iüÜiý°`\t{¼E³Ü¡§·é˜ßr.ÜÓÙó„æ6‹ ¡ai¨ý¸ñiø ß°.÷A!’ßú@MݳçähÕòM•¶[ÊR7mm{¨}Tx£`«zhùÓѵ Ã+¨.ÐN³Xg¼<‘³Ñßu\üÀ;¦h>0;)åK´˜„~}&;Í@#òÚÕ›cÞórŽ÷i>a–Õx¿9„[ÒFqôZǃ&4ƒeŽÿÜeÃ:ýNºÔ¥“4DŠ!g/*Täˆeu³ÿ¤cÖâë¼bõ‚©â cÏh)”¶t¶–†³E´çy̕×¾T²þô¡<1üöìVÓÒáBž¢C_x¾ÑÖp“mJ9ϼ2D5üw©˜ãe`) ­8Ku(w¼õQ;Y3 (—O^€¼;ovǤ‰ qª×Ï' nHÝ%‹ï|ƒ™òdm:( šsÛï^§ùëVô6ý/è'\ÊGž>Ǧ7¼>¨Ži#üJ6ònlë@/Öñ ¥7.I“‡Z½—’èþUO®\{ÝкûJÝ»‹GîîJéÃ×fª¸Ñö«d{ݧ’ãBm÷Ŷ–™…bf)s—à»É¢Â(úW’×õdD³zBLì½"AÐW#OÇßpðm¿޹âØ ò§ñ­Á±®íâÞ>Ò°ëW }=zÕ½¤eIlZÑ‹vÞ³/gÿxúÅGSb·)4óÈØfŸMù#kI…èwág¯Ô_(á°º‘ˆc)F­q% 4—B`%i§î€·µ“sõìhzhýk¿HO¿ÕSO:ôœyb‰Ë¦HÒÓ)¯‚ñ.gj‰ßš.W…ÃÓ¤GÀRÅÈäµ²žîî\lD®k:±hÉ„šªnÊ2 J _ ô#Aªˆ…HÀZV/hÝË´'eö¦®=XX]"yä Ú±Cë§®à軵¿<‘ˆ0¦ÿØo,ÛÙUàkâØN7!N÷1ƺ¡` õÙ´¿rd™„ZPòdpJåÑXа&aÏ1là«ZˆŽ?‹Œ~ê¾(JQ(+­žóryئ í–ÄÏã\±‘馱!iyYš%[Ã/¿;½±\6c© aûJ>Á‹‰1…ƒLåN •=÷nÔG,eàG"WÂ@Ó>¾¹ßÿÉTøû×­ù¸tüŒ6?Uåoò•3i7¸U9;"S`¡Œæn¨y”—JkóÏe‚Ì 3h¹Y ÍÀTý9%Êéó›Ð´¥Ì]mm’÷¯ E§Õí*jÄ'k›"áéÔËÁïmÊK? ‘k¼Õƒqc~gHMRzoŽ6R……¯É)‹ª-ºÐ类'+p?AÎ#xÆŠ[þÉ`צ£hì+n7¢FËžÂ䤨X£Mø&XlÈå2¨‰]1§Ä‡$Ë@¬„ã¡øJú„½œJCvÓw’Ë£§Ñ5ˆ±–f˜]ºÖˆ>ù²xTÈJxiºÂ!–æž‚«9šžC9Žß·¼JÏÔÊŸbvÛ³‹’]ˆ=ãj…ªÃõ@r…дh怤OzXïúÚ•*WXíÈ9iÅ7ü°„bÀ–qðjU‰‡®©™‡û¬fÖÓpNo‡÷(#Œ€·y“«T)ý=} HBÅ6j › ®ŸÙûÝþH'!è²ë^ÇÜ¥LñQ_%tæ—ÚUV­â7h‘¼_(R5}zË͇/¼>]~¾<­š=ˆŒŽzôÁØ´åtû@Ÿ=BraÍÁÙè£ä”5ý „¥éBoþa(˜+%Øvª_Ïà0ƒ”º©`FÌkVÝ+ûTüÌ%T”"šºžAäYÒsëe€ÖSÃx6ï ÷ÒÜGµÏ¶Åö`æa$ãÓQÈ$6“Wm~o<âJ<ÁŸñõ±9ýŸÆ=ä,ÈtOë­y&ˆ—R\?sþÓ½P*Fì IÏ| '6›ŒQÚÏq˜w9."´â@Ü9÷UÅ£q|ë¼½žFF™-¡¦ŠüÍü`Åv=–ŒNF¹qáb/Îvò\dÈÒªÁéS®oüÑ©«ˆœí¹:Q~`ÔµÎ×ÿ¦y¤ endstream endobj 50 0 obj << /Length1 1552 /Length2 8537 /Length3 0 /Length 9562 /Filter /FlateDecode >> stream xÚ¶P\[.Œ»¬qwwww h îÆ%¸»×`ÁÜ=¸w—‚„ày$÷ÎÜ™ùÿª÷êTõ9ßòµö·v5-¥†6«¤ô P qeådãH«jqò88¸Ù88¸Ðhiu@®À¿Åh´z@g"ôÒÎ@ ×g™Œ…ë³*Prspr8ù„8ù…88\‚ÿ2„: d,ÜAVU6€tA£•†:z9ƒll]ŸÓüëÀ`ÉàägùãA–€ª…«-üœÑÒ  µ]½þ+ƒˆ­««£;»‡‡›Ø… êl#ÆÈð¹Ú´€.@gw àwÃ5 0ð¯ÎØÐh:¶ —¿äÚPkW g àYà²B\ž=Ü V@gÀsr€¶¢ @ÝùËXå/Àß³p²qþ;ÜßÞ¿ œ-,-¡`G ˆb°9êr*l®ž®, ˆÕoC 賿…»ÈÁâͳÁŸÊ-r’š‹çÿnÏÅÒäèêÂærøÝ"ûï0ÏS–…XICÁ` ÄÕíw}2 g å󨽨ÿ:Y{Ôâý7°A¬¬7aåæÈ® 9¹eþ6y¡ý#³ºx988øy@'ÐÓÒ–ýwx/Gà%çoñs¾ÞŽPG€õs@_5ðù…æíbá¸:»}½ÿSñß“`²t¼Ú€ hÿD­ÿÂχï ò¼æxæ'€ã÷óï/“gzYA!^ÿ˜ÿ9_vM#}--Iæ¿:þ·NJ ê ðfåæ°rñryxü<‚ßÿŽ¢aú» Ž\!ÖP€à_Å>Oé_»ÿ}þ ï#à¿c©AŸI 0üÃqc^ËçÎÿg¦ÿqùÿ#øï(ÿ7ŽÿoArnÔ ôÿµäàõ·Á3gÝ\Ÿù¯ }ÞÈÿšêÿÚYU È ü¿ZEW‹ç=„Ø8ü{Œ 9'ÐJäjiûYþ’ëþ^2¨uý¾U¬œÿ£{Þ,Kûç›Ã噑TÀçÅùK¨Õï ãâåX8;[x¡q<‰‹—àÍù¼ŠV@Ï?°³A ®Ï.€çö|ÖPg´ß'ÊÏ `—ÿ-úƒ¸ìÚÿ »Î?ˆÀ®÷o$È`·ø Ø-ÿ~÷Ánõð9ð?às›ÿ€ÏYlÿòØAÿŸóØÿ9¹ìŽÿŸ}ÿÀÿŠ¥›³óóµð‡¶Ïûþsž@K´¥y¨¥pˆ]mHûMµ$‰ëÞ„è íž~:#«÷’s‡Ûr ã§ì  ç+É”á^œÕY†K‰eŠïï-õÈá­ï4Û~ùÜ›%jMíµ¡-~!˜,ú.Y×O†Jʪ#±ïóàä£hßÛ¥DûÞÉMK£ïÆ£OÞ³®¿|e,l~OsÿŸ2ú}ù4k¬nŒq`É,mþ›œ9"*$WV2&ܞس—W3¸y“OJ‰Ìh¾G±ÜÅÞF›\q·so×*u¸\º‰iˆˆÈà/qǦ輥¾¥*.x—~ˆÆifå*xPÊ19ŠD[T¢d0Ý øìm7¡Üƒ,stµEç ëÝ¿ðEBùñV®]º%z_?ÔPÞ³G´¬I M~Áf ‡ctÕås3çv¬4U’Iz€9ÆÑ¹Þ÷Ò9 AHÏ(·<Á—ÅÍS{±¨§ó‡Ml¤óg)ÆX‡3â)òËïqW42ø;±×²zöÓÄÌ£ÍP~¶·ãÆ cƒDnbæåtT·Mê—ª*ÀmQï.LyÉw$[žÅPêTl¥]ûÚØ; æ(àa$^zW=°KzG܈݄i…ßâ§öÒíèÏ^ò~»bòܶnßà o SôHuÄIÉ•˜ÿaÈ­GøÍ=spêãƒ"9Û}è=ôËZ„n­‰ªÜçF–ûÃÁVýΘà3º9Š7ƒ(æël#:ÖH$|w/¬îHµa$DËçï YBH»µcÞ]Ô3çÙXL,kP½ù–Èaô'ÙªÃ~UÙk& ƒŒ×ïùIDfÌ&ksôsºþäkÖH¤†ËWax°Mͧöì“eOYíøŒä‹nß› ë5È"VÖ¶Å"@ ‹ao6´:†¶Ý´g‚FqÛ·fè½îGvü¸ö›}›¯äGtP—Éèf¿ÀŸQ¢oËL(ªà׿ÎЊß%zGÉ]DÝb‹º/±Š c âãÞãúI4#G[âd˜Œ›(½Ú ë¨EåA{¶èú±@®€Yr™ÉE Önq)ke}UàB”3'³Ž‚‡3Éêíeš¢ÙŠŸ¼&ŦðHÇ’õßÄêø–ƒæóJ¨Ûtõå¥Ü[3E÷#‹Ö¿ö7ü«îiEÒâõ?Éu˜„)VO^ô“Üò½˜Šžpñ œLV ÂUgT™¦‚«Éw—‹¹üØ¿%Æh]’ 1ñµšŠ”Z®{zì€äq'Ïã)Ø 'Ǹº‘Jª…hû¾Ü õ/+ 2-‚mÃõH³ ¬4S®6[â–D±@,”Î6Ù1í‹ ³/ˆÓ­ó½(ʇšÅ®¹½}{J‰¼ØAŒµ+”çß4v”`NJö‚냰ƽLwÖ™„«B(â«iÒ/®&øö=º¹¹üÖ܎ƪ2'(X“²¯Ÿìƒ°ËkX&Àߥ8%HäÔÅÐÑÏuèMjšN¦9RG——µæñ0¶Íz¢çä%;®N°° ‹‡ÛRJ=Jô uzׂwN\)úÌNØ1#3±L=, bØzñVø[rÓ¿°Í<&Yç·cQ÷œ oº\M×q‹h^îTþ¬©™âKn ¨[ ïèGXŠ4ŸÒSö00Ý m»r\$Q= tOþ)_˜;Ò·jw"¨Gd©\&ÜÆvó ̪ô}7ÀBSªXMvò©WÎ^ãZ‹Œw~Y¡ò›±OÂ1áùúêó`ÀSÁ@°~6‡ò¨L˜NFzÝrˆü—ÑóU¹àÓ´]û$þ…ϳ¬ù»áÔ­³¤kàu§¤­eØê0õ9¼×·åg?œ„&CmÀ“ª¹Ž•ÂÓ"v¤¶m[Czuص­l¶~Ù¥zqµä£+µžQ1Í4~ÌÔ¿ô£gZÃÜ™[íL~ør+Z`’Ý`D‡ø%‡Vˆ»>†ÇWൟþˆ^t  5ØôÚVtø³¾§ ˜M¡#\úú[!g'ùÜŽ¤b§r1ž&çYõ/„õ 7mz—𣳠­­Ó†G¿Âѱ]øÁ'jz$ã’¦²\¬etljÃÊD%^ÞŠj$›·ðü 6ò U“Ò qK3¿–ëCÙXóD6‰QƉ±#Úd”Ö—ŒÞ,ÖùËÏzªÓµÀ…÷ìˆn¾¸_<ÄôBn&®è™ÊW#E OB(ïînbJ2íÇØ®NíÉ|`à(%Zã‘0 ˜â¶üÙö´&P;Z¿‡bOÕ{c#7ÿ¾ÍÏãmkóSŠ1=|!Sâ&ŒŒV×6÷¯÷—Fôn±š»/úÞ”‰Të²­ÐÞŒetôÖÀ6»½‹tÑ1¼·U,Üô'‡šX­õŠ|ÄàÁÇÅ«úrY~-úXØr•ëÖb0!ª=Ÿ5/AþºžóQïvîU±9 »ØÛÆ7üK¹ôv_‰‘X"i@{Ðo<¿¦vz;Ù–gƸŠ%ô« éÕt+vBi…G¢Î—“B™9DeË™5Ò–^Úˆ:Ô3Ík¯Áœßz´g&$9hêÏz1=Y0\ _œY*ð~æg*J¿Œ; ~ÒvʶÇk~­ÙÓ ›`Bǹ9 sµ„¥jI„ÊÀÌGœ’…X~’îÁ0ìý“ªiÍ€ "Sv•>Eá»ó4h²îò¢ÅœåîQQíY'»ÈM‡gã¶Á“tf^³êI¸ÊU·XYúZ><»hl¨YÕƒ×Ìp*È©(¹ƒâÖJ¸Þj÷¦UkªmÒü}ZÕ„¯ QÅ‹¤(Ï¢nmú%.¯¼Sü tÑ}e®=×v;Ä€Ÿš%ÚóÇÇõg´§J5Ò³Ÿ×~*úªtÇGj¿î¬º³UÎÜøö®”‡A¥ì$ù°*: /­¤’ŠŸ#Ï!ÍNo2¢uº¨ø‹Ås¤GßÿóŠ^ºçöZsrBè|àóšvÔA2¢±µ!ƒb ><)r«Åáûz?k&ŸÔÿÓ–qK½°¤/å܃{Jçý–î—<ÂŒÿèâW u§KÃà”¥ªUóPôa¬©L‡WÙüÅ|f\ª¢ú„tÊþ4>_èYÛÆ—ÊOÄ`²µj ®/P€(í™w›ºØZEjr;_i~G[ä轈Ðý¬ø…·üu‹.øˆk·ôÚ=†ý6ñµAZTØA†¢»æ» \ÖÓ†¯lÝŒíïDm4²‹*“›Î¼pQ™0"Ä_wÚtÑ~y·Mù°ì‡å0±RõV/}Bè—K‰eÇ©,Ò^šh¿šŒÑ“:1óæÇ±]&i`A¦u®˜›o:‚ઠíV™ f:nîó~€‚PcúÊp’ŸÑY§wü l܇û…®ûýv#Ÿ„¶6S|u¯0Ú!ãKÿ1Ù–‹€C#`/Ü7ÉIŽìÇv I¢öw÷Ip|¦Œ˜È}E7\C7èx•0íöÝ‹m¯gÖú•^áÜ+¤æMÎ4øÀ ‚%Ú-ò<ýDÇ\oG4«9‰Lª8!¦~õxŽ%àr黦 ÞµMûÍŠÃ0ƒ<”‡Ö+C/ñœÍÒÑ¥NÕò{|bwÖeÓOŠÀâiVdøÀ¦4qñz=ŒX‡ ù×T9ãÒÂ4Ýþù¥H守G šÓŸhIÓ¼aë:çÝÖ“·Í™–c2ႊmR(3ׯ٥¯ípÕÅi(³ x Ÿºœ¼Y×r ѽjd¾¸G´ PÒ´uXsMGï½\6zã%LÉã¥8¨¿Š­Õ‹=0Ë‹}lv57߹͕"6öüc—¯.'k÷²î…÷XGèe[Ž ]qj²^ˆ_åÄt·¡Õ*±šBrSª;fº»Ãd•.>m>.3irÏ^ïëþ®Qh™Ö=ˆ.§|cž úYÔäP™Üꃚøáà0½¥8™|ãë9wÌ[Káñ·vã &yŠ“à—Mß Ñ­H ÖöéöUºõFMƒ¸ dœV®Ö¤ã¸OŽmMMŽ «•³æY‰äKUßE¦”w¶š¥pÏ“ª H‚ª}3û™'ÅV¨ó}|¦Goö€ß ªK½o©³a§¾#‘Hj+e•fµ%ï¥+ŸóX?1ÀøÓK­®Ç½€æŦºQÏó»Ü»*.d†J»`”;fB$ÿ•š+±…ãY’B›>Üïa?NöµûeÙnrIx²%ÂǪF¤ xÉz±¾¹44­—Á™~C‚ñaÒÚmªÝ5­—_C–±¾!"*)à§áM‰¼’W×å±³ªj¯³–!Ý3ÖØõ4Upo ¥i4¦ ©åó§]ÃqÙT”÷WiÕòÖ88¥¾j¥è»Œ9 Ÿ›]˜Ý‚ó†No‘o?¢µ¬‚ÃéPÓC¿¸~Ĥt4Ïí±t7`A÷³‹­¿§(ù1ÇBH6jr¦ë“q!&UŒs¬-ì±$º‚Hc÷´®{BÏáõ°+ƒø9ß!ÉÎ<ß„ŒËÀS§m¬íÚá¾öÉH tE0 &Ê0ë‘í Ã9sañÁðC°›¨Ò÷0E%Ƨç–û×vª—èÆÅPG|þܽ»Ñ;Yux¤ÖÈa›-XE¢l똃sƒ)®íìN‚öõ›µG@+&qM˰ ™æ úóí mÌBŽ µìÒ)$iñ†–M5?Œ@Y²è+9‘ÕÄ­o—>íèü:n#ÖoôK£¬,wJžú£JŽW¢Ž05šÙ’Gf¯?­ÉK¿ï#p(Læ×laqàPÕ ¿G‹Ô%'|ðÐð~‡ïrB¹Æ‹±Ý¬©r>†hµ Óȯ4Ö@\Mò\Ã×E Flà†ÖÇ©Â`¤Áä|gœùèIR5  ~W„=g¡¾˜‹RÑÚdÿPŽf—ȶÖpr7îø9+ÞscÛ³B;ì=aw\ºCçÏ2‡cÛÐMîójª71ºÁ«¼`ÙÄi,ÃÀ·–TíE­Y ìG¸×´Šá/¨’6|¿/—×$1z¥ä~ɸ—é®›¦1›ól‰Ó~Ë>°KãÑŸ&[…o¸…å 3ðý¦ #ÍoÛ6–*úkRm—ÞGåà×sººÂ—å|œ¨;-…QÄî_7Gšx’‘):©Ü”!¶Þ@œËL¼7Šæ§ùÒTCb;7yb9©¸$;ãÚWçå¼ô¥?2½õ9™z™Ü«ôûêñ3ó ;—Š“ Û]ZuM×b-Cô«ôHC=iNѦ© ’±V²*u!­ß6õA4 ÜwõÇA…ReŸ^µÆeš^t¿F7ß‘K-'^AOwø£‚ÉuÈK’6âiœ†d1¦‘~±ä2¾¶˜¡¿$&Š©脌‚£ñ£[›˜†Ÿv©ÑÀëÄä—«¶‰ˆoî3ºìµ¿³eí¾U„ybMm3µp~ÛXdŽ•JþÀ÷¾‚/‘t"}Ú·ÑM`Ö›<ÀLZ'z­Õð€ &lÏÛÄ©=OâŒZVU¾ù<ã›— i“ ‹WtyØ;v«¬ÀªÀÛ@Fõç5¤ ÖÔÜ7rŠ\½`¥„ˆÔ`ã%ìÒ %CÆ/”}#~æ/ž3‡x^º† µ¾5öÍ݉/P½[ÿSnd~®EŸ±—§QD< žøÛZ¿Â„˜*q’n‹%#Çns^¿ÌËÈ âüL¿—›Ÿ2~Š‚Ƈ÷,„ Ê @îêeœ’·¿#Ý«â•Ïj)½Á™Èühª“5Ó€ñÙÎúçàº!ÍeI=ç‰ 5À¦ )Ë!Y²¼–õj&r<7gzä+Ygþ/B…ÎW,ˆU½DQŒE ‡y¯5õK»$Áõìu¿¸fe’ÍŸ€âL§ÝîïWÍ5\Ïxt¬K„Õr ~ÆÎ›»s÷ÇöñW¬×ÞÞMÚZ]H¬—_ ^_‚fÑu¤_ÐE¼O+Š + IüÞè±-ÙŽ¤ Ö¯ÛO 0᥊~p–u_Ú‹ ¾c ]¶=ËÏîÓévÐÁQ2hlÌè SŠôK»ã‘Š8s*cN÷²/´&Zf :öËýäD©ùòÔÕI H£­Ûí ýRiÍküðSÒ€%ãh:ˆ­ìädñ¹|F2*Rôû,&sNÐ\>D@ö£€—bÏøÝ6ã."ºmë€[á;êЕî,fRpŽƒêìz¸É’BM‹Ã€“LõN2ú@®42>0k«Ï”o¼0V†èV†¢ÉQ¹ˆ0í#0²^·ªY 'WŠ<¦Ž||úå5?Ü­ ìvúýZmLï@“¶ä­q\sÁ¡FÉ  ’ j¶‰#‹ÃÖ‚lKÊØ.„üå ´iž‰9éäŽç÷IªTÇðÚJxND?ÁÉúÕéÙÔS‹‰F¡o5ð%ËQÂòöL낽bÍ m'q,øCª'ïÚï'¬ú›e±‘®Á¯ÈcMÑæÆ#¦iïÃD´LJ¬)$Ž]”&»Æ¥û®º(:xŠWß¹åßÊκ]*N‘/Î/¿¤P{D; ;žHª@k# é-ñb&]¨Œ¹®L³«|©7Ä…yÊÜçò*ÕåAYe9õs ýù[™B‰PMð&pß ˆ]ôMÖù«œ-°ø[_u¥Ý¡œÌbúfªyÅ6 [ü“tw:Üê•QªXŠ©2êÅfŸv®r®2¹rù:¸ìöÚY¯jŸ˜~´&ا½dFÿŽ:8¨@2ž…;j§>%µ¥ÞW•3†KÑœeè×ÆÎª;…§CÿÑ=˜êrúÕ̙ʹb‹wÃßœÙÍ|‰jíÞð:ÄÙù%ÛÁDð @"—†oÆ{eÅVgjªÐëöX“ÙYÏ@yÜ\€Î³)€t[¶ÐO@–¶(#‡°Œ6ñÄè¸Qð¶;[#ˆÝ>)z·,^ݾ@r%…9¡Ë£ ù Æ[×ÇnhÁÁ: ÷±$”1ç—±ì]Зðý/{ÿÓ›ÁŸtyÊå³gÎÚX1<}qÚ(“Í—Ck¢¦5ÜãNŸåHF—ãqÕDoníÉ|:Œû)¬…ŽØ7êÓM˜/+§æ½ßI¦`³Œë'ÏtSQè¢\1äèâB_öËGM™ÉÙðïÚ74E8‰7ÛT^qJ¡N ë-ÄݛɪXŒª÷\‡ •ã‹Éß$<çŠb- ‹V¿ZBî\Ȉ&¹Û®òÚçÇô }Xîûý|`÷pæÆˆQ¸è¬QÈ‚1—ö–tHiZïµO‹˜òÓ—HǸr¢v½£’˜1£*Ô¤ÖIhn–O˜¿×xpDìópÙÓô9U¹¶‰‡²¸ÖLûÐÚª§ðl~G}úJºá+Còvk¡“‰'Øn ÎgCËúäEújNÊܴв=½¸.¹{m_¢R‰¨ ´Œô4éUÞUm°œc*6#Úå‘<Ü:„AH ~¦PZ;­ë}k¶òGrs#Ÿ¦tƒù%X4:sìóryçfÐÙ’lñFçjí p…%r+L^ÚNL‰p—ÖOÄðS&Æîv@¡†§ Î<š$cœ…à § ?¯‰ä [X1àƒÞýþöåᦘS±bØ‚þz{Ù†fa°ò'Ž`Ì/Öb6v–|úC°}ËHÚþ 4»axYD6¸ý@¦Ïœ}òÞq^ˆÐ­4‘“7ò߬\…ÈkXû ÎpÊY}™õüì[‹WXµÕÕdˆPWá¡Ãtó¥,á _7æ´„øsíwøðOEä¥C+¤¬Ï øfnãˆÛ*]‡9;èÉĘp†a­Ð’w?»Ñä‚-ßÒžc]ç\´„Õ\{1{²•TnÜ3} f/Kº úh‹ ‚Ws @Êæ^!”ŒKmij™ÊÑ;°Rá Zj<Ø:ó'8o 4C_×ùuï„«ÀtñéèJÅWTÌ«¾"áÛø “×Bl¼PÔ–.Ï碥T3°†¾…Útî&:£'=×9H„í-Z×TH$@‘eDdÈÆ°Œ­÷H'2t1‹%„’ò:¦˜/x÷Uè×H²õ©ÃoVBßJôrk³Nè /<•,•:ÄÍ1ÝÏÅzø­|ž®hÜÄæ3î7ÕÙQqYJa¸²Wif[ɧìF} ˆ_éfóODìcÔÁ/G澺Å6óŸIsí ûPq˜35sw®‹Jù‰(øËdŒYF`ýÉê*OD®/ñEÄÎkÉ©{bƒ2¼(3 Dm&€–3ñV„èi!­«"•¹¬*!5ôV‘9ÿ°ó D]¹sqM>éñÂ@´…D¯ÉÑŽ±<÷Úǽ>âxÅvèNE÷Ä…Woû4Jè¦W•`ßÕ&dL7Pù2—Zdõ#¿ßšPÖ[óˆ”î”ðºZÒzù5>ìÝuwooJ%¶ä„€–Í’!*OÑŠk#¯O—Ü3ZK#”}• Î!ÔRÑȲhð³ ÇtÜ{è6ÞA¹Š¡gÜ=M7}ß^d?Q²,Åsí°68È)"{#C³>T¶2#5[Ÿd»‰ÔU6ã–ÙÌ8U'¸|ìñJãW®ãüü6AB›øL^ŸúDü‘?d!Ý´ˆ[©¿©#o0£ a²Wó½È®[áÝOLjó7×#r·LO à¥ãE„–*e ÞͺÞö×Zá±2du«@ðDìúSµ€Œ<êê“/¢ÓÜrñ9¦/‚W£`0¶_•±}C§ úÎ[y\AT¦1p*è$ø|kT‰4qÆè¼eæÞFWÚápt/|*å<ì Ì$§*´yBúT®Ð¾©ûÕ€NlK5ü\ÁûìÏÇ@œ‰Ê?êŽTµèãën—ŠFZ“Ú~«Õúx×D•|.sÿ4ðfˆ$×Ęl–aþ+ÿ„ŠïÐ+mˆûqé±Ó—šMqv ý™X±¨ˆ½òÂÒÚœrs"‡•GtÛ#RÒ´é»÷j²îÂ6îQýt­›ÚóFŒæÀ"½añáàKäÞkžÕ¨#z§Ÿ¨èܹrºWuK™ï¾³›‡wúãàM=AbŸæ6DÉ÷R pžçoÚt ËaÝâÔ à;k²ï¦šù]®Þú«ívÌ .ŽÒ¾w ÝpR³(ö®ínC¾Ÿ¹šb,¾h]3Ao„c¡:ÚFÏrù„bì'’\&‚b‚„4FúCÇÆg4e,R¢:Ÿ"F£Ü|àºÒGÐñåx¸á¨KÖ=¥ã^ÏÖËGWËÏDä9QC:Kö^®|ÅŽ¯¾ËKð°Òûï¸Êø½‹sÎ-3fôsLƒ cÊb”©R¨Å§}ÝBÛƒÑQõ16æίbÌÁå¶VžŽ¦å¾çè»x&ÑwóVVmJ Z¶Ü‘1Wmа!då4Í_kKò„ìw·bl“٫طU]®…ãhËÆ?¦§dur¹ä„Á*|#!GcÂnúzTi\wÜM?á³Â×ÈËkÙX>^]/›Â£ ÞqH롾Æ­çÑúÚL§˜ûž|K}¥q&8Ô,¶·íA¿xG>âãÏX‹.®n¯Ï²U_­Òäk!Ox ï:+=¡Ã"yÉõUb>~0"é÷LV¢Y#— è8h©1ïÚåfØë‘(]Ý‚‚†Úƒ×G>ŽÑ`&€ûÁn@Ý…—J +f÷ncŒÒxɲ]ne…,²TÈ4j.UQSq…°‡ùµ n-úHŠLÉ_|UÄxº$âª{¨ÞÎpÓã™ö"Ú¹â¯:Ñ « –I›Rò ECÓçâùÔ1¤ X;;¾%ÚÉ`ùþÌîȧ> stream xÚwTlÛ?JH¨0ºatwwƒ”0Æ€ l8lt7H—´„tˆ”¤AJKI4 H|SŸ÷}ÞçýÿÏù¾³s¶ûú]q_ñ»îsÆÎlh¯äw€¨ÃaH~! 4@EÏXŠÂ$ìì¦P¤äJÂnAxBá0éÿЫ $S!1fzp@ÛË $—’Â@ Ô¿ ái€*ÈêÐhÃaOv¸uvAbnù×ÀæIIIðýv(¹CP0Ð!] î˜Á 7€  … ÑÿÁ%ë‚DzH úøø€Ü=àgyn>€é0†xBÞGÀ¯rú wÈïÂHئ.PÏ?° Ü éB@À †À<1^0G€¹`¢¥ 0ð€Àþëþ1àüÕ€€Ð¿Ãýåý+öÛÃÝ=@04æ p‚ºAêºH’‚9þ2¹yÂ1þ oÔ ä€1ø8 ®daêû«:O0êôð„ºýªPðWL“Õ`Ž*pww éIò+?U(Æt-ø{¬®0¸ÌïÏÙ stúU‚£—‡  úÈ ¢¥ú—"ùs† b@ PBR y€ À.‚¿‚›¢= ¿•B¿`Lþ~p€¦HÔ ‚ù!ñóyCH„$Àï?ÿ”H„„ŽP0àq†ÂHþŽŽ!NdÌäPÀˆ!žøëóï“-†[Žp˜úoóßô44125áý]ð¿UÊÊpÀ_à„„¤D˜CÀ?£‚ eüÛW æHýIÓ¥%ìý×ô¹þZ nÀ?céÃ1Œ…¸þ&¸ P Æ| ýŸiþÛåÿÇî_Qþ‚ÿw>ê^nn¿µ\¿ÔÿäuCÿ¥ÇðÕ ‰á¾³°ÿ6µ€üYW=ˆ#ÔËý¿µZHf”`Înÿn"ÔSŠ‚8B‘`—?Tùƒ›ýZ07( b÷„þzPüB@àé0[vÅ<ž>þVA0KóÏ+Õ``¸ã¯í€š3bŒ$ð¬¡#õ›ÁA‰q`Ê 8Á$¿æ)*Ä‚Hä? ñÿ–ÿq5Ø À,Þoj`òú—ü{Ë!L2?Ë„?l ï8­Wºãÿ6*7žf‘ÅÍï7èô:'#Lç®Ë ]A|WJ|E±øYëDñÓ¥ßN[aT{ªÑËŸþvÉÆk/IæÆiûÆJv”ž¿½G|—ßTqÝÿò‘¿yˆ+nv·6{á#/I2ÃbªSŸ7¨ço+ÞEά­×‰ë^TNò'˜ÅÛ„”¿g/rÈ›¦c!@òß#â¹u€"ò}êVÁØ5“v2/IÀn‚H©ŸÕªpâÙ´ïRµ©°g=½Ý=Ü“[ï&8ü”73´oÏú=+]A¼Ëœ¦íùèž&ä¶É廦o|ŠØúö€ƒ}Lš‹žN—Z+.~¥]3Žœ9…@4ï`Q{¥õM¢ÍÁ“Ï zmà&шW=UƼî@}wöÁÎÊúDÓ(ÿ¶š<™H9RFƒ0^vMÆíPú5ñi©I:EñG…×R…c+óW3ëoœÆ3MÜ忊ÂÿYApê@;ÓIbézZ"gZÕÒHiÖ{K䇣Èú×H6ù­n/Ķ¥‘?Jª¤&®v§´Rµ•jo3på×°[²ùd2LUÖÈ=ÑÍ?¾LˉLÒg,è€M{PÍh}}±±&z}ô^¾ÂÍù…Q$+ìú!tI`ábŠ¡¿ì>Þ°T`ìçÑ ©×zžƒŒz¥$—¡º%Žÿ,µª { Zî*ÒÆlb•5ž•__i}ù}½æY’&_äHÂþ$#aÝÎJöÊ9ïЪûrgdäVSe„`¥  (hº ôQz´` ÁCNk5¡%â;ƒ>Î|:5ÁiÇdp÷y=É&™zD Vå>5î½fƤ(sJWjç9~ÁðêãmcÅI¦y·C,•ÁŽ1ßÐz"F;¼ÊZ(çŒÐ˜Ña¶ÄƒT‘vµ¶Ó©ÊýÝ ¸{Rl¸=Vߨ¦ѶnHÆDE!¥\]NÎ|<µN0û»I…P§Í’ü3­€£ïc ®hÖP=ýwÉÍâyfÕdfº¯ÇUúè‹ë@„~ ÅÊ—º9]ÚÐN$ ž”$CÆêÅj{ÀPJ 6±agྎ©Û®ÇŬ⼼-ýµÓ§y‹Éð £Çæ;i«Õ°ŠÀá9[ü-«$ûxÊâ½ÔHžuœ@ ÒM–|òB¢ÇâÁës?|î[‹pÊc/Íü,ó`Cv(­nÚrË2#[ûÉx}zúÌã©´'½ïûlI¬?7–‰DÖäÌÑå¦òÚ:'×oSY½§Œ¸ºy ÷ô©LÝ42 áÎm‘Œ«Å~Rzê÷–Gõ%¼Ö í°ƒ Íb…dÇÐï3]/Å™ s†4òb%ªoLêtÐID w9åÕ¨äÏA4îB^ ¡a·§Ec82lw6>dÕ9Ž\«/z¸oS¶šÝª#wi-œj,è¥gó)µ©Óv$”äí1)T“+ï¹s k6OfŸZP˜¬›)в ‹­:ƽðuò1ArÀv˜l î]vë$UöG× ø·ðû\É]ýÍ`¼Xš$ÙïÛ ÂdÔµpKŠZŒU²7tÎùqœNvœìe.ú޾l)šg\äîì^¸|Ž÷ä]åI¥7ãÏ­cZ!·ysÉu·WNÕÚ‘[ñb™|’ÁÍúl>%Fo>SIîLLŸíQ¦k ¹KÕú›[þwë‚:¹­Àû‹4³qrIécâ=pÞù”pB¼Þ;ákÖÝô`F ÷²x2ŸÍ˜<ó˜kôÖÇ"ÈDK¦~gÏÉŠ§¥¶ûêþ^U²¿5±U?øÜ%ÎÇÂË®÷ó´ø+kÚæ¹f’Dó~Û»–U­Â ì$5ío·¹cuŒÓÚ‚ü!r{ #ø•¸E1Øvá×Í@“Íð¡ ±öØ¡¹n÷AÔº|Æé¬&ƒ¼sJšúÆûÌÖŸCçç ñíϽñœ¾ù|4>O"e‰£%ä¦$ð¢ùê}cEͬ*»Ë&î……ÌN|>ä°æ†øK¶™Òòõ¸¤CW…·#è—èëhшv*YüïKËÃ)äT4Ø·3Zç{ð[•„Œ$C•øýWb„ì}kbš’2Ê.¬l(Šúû7 ¿ô{vg³¼pؾmkŒÎÎÎæ@ ¨)\tsL¦¹·«}ÅõÖå>eR]±p¶lf\õaúOì'Ì›ÎF1uP/;»ú2åÛ…ý÷Ƴ÷¯‰…å8’rùf–\*^ sí{<¿£â¤–"v®n;‡Î€¹øß}çHt›`\«;ãj£Ç°¾TYê…Ê5*8^Šäly›ø1;ÝÇ|R„Ø”cD:»S_ué²ñ¼ïRkòÅSËO&FÇßåoJÃaáUík=B¸èÊÚ*ñНk¿Ò~!µ±¶Ð´G$üã¡,³ ›pÕÓÌW_¶»ÅúÒzœ¯Í±Sú‰o¯ñS/çJjåëŒmŽsw ˜.òÊ#§’L3¶Ð,ý¤’Ê»«:ɵ5 Æ™’Ú/Êò„ÌÒGäù|5Ž’”Xbn­‡'{¦´Ñ9 Ón*ë—2öhÞw!dU~Î>JØ,yY’ýTÖ–¶{|á\ºpS#--Y¿^þWér>9eËíê+÷¢ÊÕ¬] B IVC^[<øõümy#ÞÝ]y¾UŸy”–àòÜ3¦…òã»yT†1«¸©ÔÓï"s à·fÈÕpº—6ŽÍe_Äsv(ø¹C«ÑÏç@šebùyý&a߆ª`µÝÿ”·èܾJr飢ÌkG«¢ C†Fœ;ËwPGœt«ÎJØÉ«l¸Þ=ÆÙq¨Råh«H†hj;Ÿòñ­ò®`¿Øê6^ñÜ•‰Ý+2]œb½ŒK÷$=ÖKc’ˆ-Ë'AM¹Ulã…»5Áû‘ÇxwúüËÄÛ²ý™Ö²“k<¦ÖÊl±ãäúè(@ÙŠoőǙüJî ‘Hiø{<­rç»fùbDaàš¾Ë ¥Î:ì/…·ø.Ê¿qoÐJCé‰úÀ.VÒnÝ[u“¡7dÕs$Þã òJÕuÛíôš <Ï} ·q½_BÁî(|]‹Ç{ëi߃¸O©r3T¥×Ãà iÃ-rõ¡ÞL}”ªíH,ãíW¼Ä–VÀ9Ôhö½m¼(k«À™Ð´ò/]Ù §G-âRI!Ê?ÔŸñÑi$J€ön÷šXÎ,¦üÜAÞ½ù 7ú»^7X^˜Ö‚õ™H5pc¡ÇV"¾¾©EëîýdüÛ¹ÁvË3>ª0i®Bv•öåý =h‹âþˆÍIžuÁ1ÉâIB 2}r•Fn3ÁLïf­lG3 œa‡›@¦óÊRÐä£Qµ0£~wÿÕŠE/çÎêÞœ.~o ¥tó꾑ÕO^vjâÇ;1<~·Çb§[cMbkKtf;p Ú_9à_Þ1”¨DÏtÅxx3º–›~x7kjÌËþVk©q‘9¦áÓi“:9ÀYcy+ϰ'NXÁ„ʿٽþóÕefñ®>²OZžNÍ`ÈR[{_ÿº$Å*1µrëZY“Ÿ+Ý1Iï1ý.v²ûsaxôêLã×›”¾‚Û%ç+"%«i’Kxz¸îic>yËÆYWR£ôÅô´¹åÎp%Š¥ùí±C–h ¨í}²éöõ”®÷²¤j¥Le;ß =ÑÙÆ}1P Ek­å—ex.Æ&FfìæàÚ«¤ý>\¬ôΣl<,,9ðÛ¹Dá¼´cèÂs(€XîQV CLP»ªØ¡’ŒO«îÀw³7?ú-¼ìÙjÙÌ "èöñYR×ú>ÁɈϕ™á5ŽFF˜Ü?ü,7Bj3éUÖ®œNøöë‘—Šw®‚æ,ñCäu –jA  ùõ|*¬ýoS©¿,c½¸““ÜEÓ†…&e_šo³Æ#m…ÅFÔ¾U³¶·¨<ã*Mwާ  óɈ#4øû—ÆRzÝÁk¾5kGÁkÜ"äI9{zß K5kò Qw^]›s¦” pMy֟ˬû¯Ø˜LçÞß™”²gÔÀ¿qÁfh1_±Ü;\˜sRc_bÀ@Ÿèá¨Zºä~ì;€_1óÆöcMdã‹™R|ßž(4^<”¹+‰aƒôñ±^;a¡ûĬèðE¥¥ykÑÙ§öÖœ6½‹âÛ²SžþâÙ§RŸ)£ñgtb¬÷Ÿ8Õf!dp¶Ñœâòô¥I^_I˜ œìáÄsºü ®ÂÙ7Ã\|´9e!Â>¤[²âEê0p¡óšR›ïóqã;ç4o´²_nÏ5òšºöÀoKÕf-H“¯ ZØœE{' Pà ƒ•ÄhÒÖû^9Ãr²Ux(Î}݇zR‰^`Ö,VçÌ7%-œ—½§žÐAɾá5­f¿WûkJyäóƒˆk©n02‡£‰ìAÎÑHh^(uœ~Ù‰ùØfÃB~ɘҀòMW^œWŠƒœcY‘ž¯Â"Û#ídÚ ³«[¨cpÙU\¶æI혗æÞ ¥e´ž fPÀs¸B¾Ð?(#ðïyo8ïÞðªG0Ú«n•UB‰Å¬ê5ws¸©Í¬jGó&^¸_0ñf$xæ}Ø¢*âj–~lÝ39ËËÀ·SÕ8󚑎Žo—È€ô«(ûJ>•&çÅÛJÁ[MWÍqÉx7â/Š{§ýùнåÚö¶"s™T¢+ssÑöâ–d†<­ëÇqSË=’„ìÔ~pQpšÐz»É¡r3³£!‘øN­»sxÍ´ð[îrAs…#Þµ¼^´poÛý‡A{d½ÖúÓŠé…ë&´j•öëˆCЫ«ðhs Šr%Kç‹L~\âxzØ;8]J\‹[‹…˜9ùÍ´à³³’]'ð.Ãb´ñvoe˜™ÉS{2rY¦3jf?úØ<²ñ^HohØ:—Jès/¥úWðèÇÝ6MÁ^Ö¤§égä«åNÐ Ÿªˆ²5U×Óó:"ŒöÚ'i‹©ez“ “>$Ÿ¨üþªäÍÛ½Ÿ ôSkç®A@;¶ØÇ=Ž›¡Ì²=»ÔúC7•‰ù'äÁ ƒø4³úä¬eýI‰ÏEÉÒä½ùxõ–…¶7z<×%îÖ †ÁW#ééûñ¡Õ‡QI­Î¥]VBÑ¥ƒ#ס\)nñ±Ÿå\Õ‚êªz„È¿äÎ-sJËpÏ,ÛŠ2ðíˆßöB7tç•@aó˜+ŽuɰcRX ½hó™ž|"Ì ”+S ·îI^b/>Ô:;75˜3ºIbvMÔŸ†^ä*U£áéù)ß]͹µ&}“ÑåfP¸ypæ’=ßæ‰7BÄô^¢é”ßÊu§A×Âå~ž]sB¢ìÎhø”ê./qù5ö² Í2CL£#ÕP(•ìÇ5¨Àö&ƒtýÔ([‘°*WHËe™\UÍ^Õ£¼:Ï•-oàVy7LŒþøH*€ÕB”ƒ€š¡âëäÏç›”t¸¢ dž+…ÁÛƒ¬G¬àÓÂ[‡cO˜kø µõ”xqî9ǾÉ/vu¸éÔ Çì‘Nó&k>ŽgÞþ™Ú]y!7* Q©Tp•WÁû|@#d‹->`&”ÅŸÅùÁ­ZÁ†(ÙìF5ÃJ¦ÙŽu_—õ§ä-9ªÚÑK4I߇ÂÀô ªýV‡ŸHÂÛ®­ £Û ?VRߺäü,´–e4íƒ4úÂ?$˜r²„à+mwÎ}²àÑXõG’šµa´-xšž‡ÝUªð2Oïî*(šâ„€ñÔkíWD­T ý‡Â/[[Uß®6%'¶u9.|_(Þ»êÃ{"_âarDaΚÚë%-ßéd?FÆb§œ‡¥1ûèwe’Ž¡UÄžŽ!>`=–ø9ªøT7Â\,nšqlçÎ\mM‰r|„xûÐ÷¯pËׇ‚Þ<¨K³ò´ ø•Sn?ø$«ÿVº§)«ôx$¡4»RŽHž.P-ôUªÙ\&³xŒx÷…Ý~FsÞêý‡‡Ü _<èµ@ß+gåÉs/=ÊÍDÓ†Õo¯ÓßâY‡:iù½vÔUÒOé "pÀ½ ÙTW¸©Ôjëà•7ã=ØRUòh)5ÉZDvLTOÙ´„ÆÔ²ŠÐï´®F¬\S‰Ú,”àlÖE*ÃûZß}ÎQ¯&}ü +ïrá@>e˜ó-¡c- Õ¡Ÿ™Ä ¥(tµSZ~Ò<ý<¬¾Ø“U¦ãƒÏÀ÷‘dlláÒŠØžÛÏB±RËms8àlàgXÅ4öŽQè´‡ÚÁäK’÷§=÷²×K¦wL˜_Ýød’b~ÕtzÕuœS¿£a+ŒS Š(£Œ$ôÇ=Rò}w3먥kù*,ëÇÓG=븺õù°Õ`TM ¾›mpÎq8—gÎ*T}0rîÙMˆ#ñ#*ï‘qeXwîNgt_0"Õ:¾Ÿuoói÷j¢Cn‚À ’4)á î9>3úXƒìË®²«=ÝC¦4 ×匈ÚÌ7åy]‚¬~ØJc×’ý&é-±º)Ëv_jÒ¥ `ñ~3],Æe,ñGL_X¸fFÞìè»åp‚i{.$àz^žF9e·9‚_©è•? OY7r> stream xÚvPÚÖ.MJèEz‰¥'¡ƒÒ{ïR¤… @¡Ai"EšR¥#¢TAéˆ4)R¤W¥Š€Tù£çÜ{ÿsß›yo2“ìõ­²×ÚûûöDàš‰¹˜ª Ú®…FaÅ â` º¡™, –ƒ%¬ü/ pŽñE Q ÿ˯ŽC±xLŠÅ‡¢Q@=?/ D‘Q€È*€Á@ 0Xþ_hŒPêpŠõÐ(¸/@@í„A¸¹cñ»ük „ !òò²¢ÒªH8ƒ¢€†P¬;‰ßõš£a86è%o¹c±Þ P@@€8é+ŽÆ¸) ‰Xw ÜŽñ‡» 4‚"á-ܾÁæhWlâ/ ŽòÅ'ø¡\à ~o ¹®ÐØŽú+Øà¯QàßG„ˆCþ]îïìß…¨?ÉP ô†¢‚(7 + 4Ö2ÇbEP”Ëï@¨—/Ÿõ‡"¼ Îø€?CZª¦@(~¾¿§ó…aÞX_q_„×ï A¿ËàY墎F"á(¬/àw †?õ ПkõD¡P¸¿Ö®”‹ëï\ü¼A–(„\Wãï<øæÇ¥Á`°¬<÷Âaî ßÅ-‚¼áœß0¾ÿPœ7Ú芊p…ã8_¨?ˆÅøÁCqÿÛñO ]0,Ðî†@þSÃ]ÿ²ñ7Aï€ñăÁ¿?ÿ^Ùã¹å‚Fyý'üÏ催ÕMÔ­­Eþ üo—š:ˆ“ŠIHƒˆ„P¿ýg(âï.ÀÿÉÕE¹¢ò5‹?¥5ìÿ÷í þ- !à?k¡ñŒ…ÿCp;°4†ÿ‚üÓüOÊÿÝ¿«ü?þßýhùyyýñ þvÿ^(áô·ÏW?,žû†h¼PÿjÿK®†p„ò¿½ºX(^ª(7¯"ÂW w1A`aîQå/Üò·À¼(¸ ÚñûAŠAÀàÿòáUóÄ?¾x>þqÁñ¢ùç–š(Úå·º$¤e€P À_1Þ’â xºÀÿ0G¡±ø ~¼P +ø}ŸRò@þYú þ±ñi _¸?^îÿF @Öÿ_1`<€þcÿ£˜ƒ—â²à;ý—ýG÷px ˜š@ÃnÞ÷x}ÿíqµ*G€Øê â¨ÀªÕ!1Üæß) YšÐËìˆyÌ‘jZ_Ý—eMÁC•iž Üæ›Z²è¦Óæ³sÇd³‘ÕfÀä0óû¡ç›ª5Ý\œb*k!>!·ïy¿!lÕÈóñ“£1)`<èÒ¬é.Ÿù5±jºöRFŸò¼ü“Ø#Ëx»{%cùÎÏÆYyI±b\ä {´c‡G£ ¹C—þ‡±}‹¸˜â‘ggúZ\šÓö#Û © ƒDsjÊtáå´:Ò»°²•ÔU«n7tKòNòÅ8û‡ª×Îí9w¸ïqKµ)-âô~_“”V~ò £㇣ÌpªÛ;«¥Ì“ImÞÏäF'Ýñ½§¶¬ºvÍ K!4ùη:«=J5#ׇí3m‘&}ñ“¤MÅŸ Žü»_é^P÷ùi¸0EMJ&˜’e¨±Ùš»ùIQmä”v,7-ÎÜú•™äø´”o½è™&Ë2ª›õFI€ã|#tô.`òÆÌªÅÓK¡²°«üºƒ—> MtùjÄ R†6nzÒtvo©Ì½›Éf´×“qß}±4­è®:]=?ø‘T®•/ í<áß4dž·Ø]ðÐæoväwsSú6®ÂL^ªãºÙ \ çë] qßfµ3oà:!ŸÛT\5‚¬1-iUƶI¥š}âCI_7SJß$n·5²5¶°?ûö©»gEp~o¹ÛÄæÚÄFv…Ó,AÌê4Û`a€<­˜2&<þÀA¬?iÈ…|Å3Pôª({ï|’BÄákã„¿jÍ[Z³ÿ—v O¹?çÖ¶uƒn *Qß«ÚÜçd½§ãJÓêå­›Ò#$‘©»×òG¾¦P0MvMú§ ŒH‰ŠFÀ;¾¿m.$W™Å.oe('hÔøÀ}ÚÓ;èŸ=ªà$¯ËÏ+%ÔÜÞò~yòˆ9©@Xýv±êI„͘'b$~zQÞ­4sC1ï^C®Þg'ÀÕþc´:¯¯7*¢:O"B“gž†+°HsŒ™qädwÜK.–¹Þf-ƾ‹YŽ}5˜v¬´RAË#u\»[Sd"“UJó´×@ÐQÌšü¥ó‰šfL- ¶>““'ù Ý•±p­¶RŒóc3pw «r“Íx„â|$­ÔÊn<›¼`dµ)"èuG'¬ºÌ6Í• üN¦»¨.ˆ¶2l»yªëÓbɨÚåñŠSï§ózžm¦àê|_*n í"îE¤µúÑ{9h»õòL’ªœm.rf$ùR’4ŸÊ\M™â|Eâ|j}ïƒð7òúÄåÅÝ2«Ê+«›¨VÕ¼7¸ìœê§<¢ÍO!1¸,Í£˜-ñ ³@¤‘[“çüš AcÖ/I°á ]9qkîÌÚ¢&A[ p¹AT;OþôÐûb{»4KÁ>Þ¦U:âJ~A3^6˜µµ—îh<­OßÁŽèÒ?aÕ}·CØOkï‘k÷éúíoUã)s²·¡ŽÐ¾¶‡¼b8¾íÑm–µ±{§WG ëœÎÆ3w¾ Ñïè¼xK6¦jM4­¹ÙœÚuYòÓÒ-÷–gO [gZÅÚÄaÊÑ&zwš ÝøTüWZT¦ââQ Ÿ ro/ Z8ˆƒÚÎõ몟Œ;ã~îê^¦{ê#ÿ@{$Qª4Õöº0/fç8½¡5þ¦Ü®´_ØÎêmõp…ƒ×Z"¼Ft€áQö»›Ñ¶OlªXó¡­£¡\䌈buùí.FR«<“áÉý3¢‘ž¥ž^»§¸”Ô»AiëåiöÃïh‹Ùg4á½ÉoŸý8 ¾ 9×µ·u©\Ï×Õ¡[Ö\nëñ«T…ì>ä~ÅO)ü­”½%+(`ù‚ŽžJ?—vèÚ~Á8 ¸jcSò˜ØÇŸ$C\«Ê‘ËZ5=_+ôè¡´•Z]h¼•ÒØ¨D°qšÏIIÉ]ŸêÈÂxÞàƒ_ݾ°¾/<ü%J¾kdsÛ‡…¤WÀÕ6*¥'M½¥Ò§et 8Ýw “DJŒƒ®¬G¼F«×ÎnEò¨J(¶©(ï¾mç5‹¡¯´»9ö‰†ÕŸýô× ¢Ð‡2,dn"”­ãœ?JE΄bÂsÚ~³M_6 AÂ6¯§¸Ø„HDYýȢߔ*Iˆßiv.æªaîט ÙµU®Ù¾/{?Á ²Gø‚J˜Zã–É2¤ßÃþ$v2X¯…ñ8-o–ôÛc%®ïLì¹Ê&Ž—»ØatþÀý¸´$ƒ¸°ò¸Ã.‚Ã9Š/œóÑy‘¬Læ¤JLíbÏâ'ùB’¨nÞ\ºc!^.x˜æt¨SQA×¢ŽÝ9÷ÞŠußž˜ÕédœÍÍX2³¦åãj,>)/ò –únËûšÏy‰6€Ø—#ˆÒ 7zA@°èA~#ë}|žiÜX2öÍç‰Çg‹iTØŽøvE$ð~k?GZH¹c77ãë|Rã/Ï!ÁZ—HjYN8çœÓ†@ò„WÜ ì«¤¹Úd嵌ýß9¹·"ƒË³QÔéiˆ'S_5dßô1kœ7ŸTýà[}y8Ó†Ö<34‚½ËPåjÚÝ뚪:™ä’MÿàHÙlú“<8Ò¬+–zˆ¡V{œ­’—‡â'–p¾z»3«ÅŠç`·ŽÉlÏo/Óaë}­¬_Ô‹Öè½J@ ,Ójƒ¹&s³tuašqÎäð®åeô ª:+;Ú_®~_åÉõ‰#*fa1™'ø€½uxÕp¹®£g`ÑLÔÿ¥ìCZMg‚ˆîµ&[i&EöC¥Î¬“ ²§{ÝÙLÇ…|W›ÝÍÌTk¶”$ºæH#ÉÇ•½hy}æiG4¾GEúyK9†òÌôäð•Q9µÆœ‚*È"èšÕW+§Ôn-)V¸mêÓ@@§Ðw×¶¯E¥:éõ¿øÌ&/ÝcVØ_!ó +þî…Ê0¨ùétêz2Ä^Áúb"l Ü¯9Nï•G€Æ+D~¯WßÁJÖà’P°îS«§Î†¦û.Ë–:(ž¹‡Ô‘üAÅבåkŒTïîGAÜ:Ýœ€ Ÿœ¿_©÷K§¨?[ºí‚¶xãX¡ÉUa0°Uß¼çüfn01‰U¨„Ïï¼pcvlCøV’´;”ƒô’;4öá­»¶µ šÊƒã4{ÙúŒeÔÆƒ‹´µVE:™Ø£MX7ŸÓ ´¡S£îÂÊcmõ86X÷‚î#³AWzÂZ*­òRÚW%2}2u[¦婾LBÞŸ†~Îî]ê³h˜}v¿opF=C¿TV¦ Ðýv¤2Ó”ÙÓé%¶$HÃXgµà·þÞ€¨Í"#/=Fš7 Xaëý문„>I`n,…=ÊŽ…þ¬aLl|ê¸;\9®æNJZ‹sLe<“ùÑíÄ^«£N.ÆÞ]µ1åÓüöË?²â¢QN9œVeøÖWúK¤rÙnçýÌ¥ŽÆ‹ÑV› –6ÙqKptÏwC§–)kÑ©¾#4Qpq&ÕŒ‘}Té¯/g¤4êæ{ÞÎý£­½—v½C¸˜“nV QÈ|¡Åu=³]u¿ë G|Õð–Á”þ³Pn½³û_—FÅÐÏX³‚m,ÒÕí×c= Ó÷ß΀úluÅѦ¤Ð^unD>.žô&áâó2²ûN%ÑÛ7*5Vê³ý?=c%ltèR“´ù7õ¦ºÇR2Œë”ôEîQsŠhÍü§Ðÿ²]pùÙjš–fú뜕íª4?§)]ÁÙ¸YSqÒºÅsHNÝsà¬Ò.f#ò(+};.þ¦Ö0·öDÉ÷-\ ¯»Ë ]®n1[G¡BtßÚ”ú€ÖY!äÑçM¾ˆb#~gïôðOÞ ·,Á|}Ée:Z›{'57z¾Ú°$¾ì-éÏ/ìbþÑaQ|C®¹Ï;í¹?Ð7­DpO¾K‘Tõ‚Dž|ìÆ„º³-ˆL¾øW,ê:¿gw„qÎwäÑzJÔb Ð$7½7S=tüšÝvϰ{ ᛃ s ñìU45…ŸíŒa ‰¿úkÇ‚_ ‹(ô0³˜•$îþeúbY½bwûDÀ‘øp¼ow‡Ù¢X:WL¤m¸znÖõV¿”‰K)OÒ\k»iüTÆÖÞí½§)À‚ä¸ÛqüÍH\úkïÓMÄØÏ)ØÜ櫎§Ûâ“ï3Š þE j´3Ž€ÿº¯ƒ°cÂÉF è¡ûŒÝ,ó.? òº­»Ñ=²›d5õ|µªÚ2jÊõ<Ý= †K¸Ã5¦ëÅÄç"±Že[C4SªïÛuŠÛw,îÒî麴jœö#šÒª¼ÓÞŒ4Üä°¢Ð2ØLIÙäãôñÊ‚i€eÀ9·8ýÙÔ€ôåGìbr`zË«Ýϲ†eŠëu÷«IûRrJЦ¾Ò†M®q ßvb™Ù¢.¤UG8ƒYEªE¡šW©zS ½Ä G»Êêª{ÎuW)­o@àe–ŠÂGåM Öó¯xAM´œ4ìcÈBs®.ÙþL~-T™(çQ|'š&àk〰`oóë~ }ÂÄÏ0™~;bqŠOJëx1êj(_·qŽ£û{Ùn£ÇC¨×eåšÁÓ·œ_V@)OE/qˆ0¼Æÿǹ z66Ò’JIÚØ‰R|#S‰~UZɲò|œ¦ŠËulÀ1%Éf³l­S& U-b8£CŒ ØfÇ·?' =ñ ÿÑ5ý¦VxáK–DáDJqOœ‡~¤;K3« Q‰ºŒâe;f:b÷7–#E:„ý]e‰©º¦çòÝ…6î –Î0/—ë+Q‚ë°ÅŽËÔÂNÆ%ä Òo)c ·r2—C“CŽWmš-{~&l^ã›§6ýôŽV½:=G·ð&l Íñ“’C·Ä¯aDõ„Êg7ÅlË?_$ÛÇAM’ꜯ°è³€\é‘#¤¬¢àDåsWyïR¤\’˜L0å`/«Ñ7º'âëÚ.4ÃyØUõÖ¯ HQÜš+õ`t”èßNµªó(ov14îlåY!ˆ[5ŸAÂË8:x;ßÍS) ËåSâ`?\ûœCD+ÏS­¦Õl¸LIUÚ"‰ì³kÙL$Ü‹@Ÿ­6#„¬¿ûÏ´¦ØúΉ÷§DÚRn¢ô³çå îµ3ÆW 3U85‰=‚P…‹¼"nßÏÈÚe­òèþ8£³ÿà kÿsçýð¾v›^¤«ÛÖj˦êÓ}×W%¨´†:™Ì›%/·¤–‹´za©]P¾0ãÎe~ÃŽŠâ_È%~²š”R~p< |mÂK ýr^C-ȱ c÷õ©uβjokÖ]©,§ö/·ÓCRü£–#§% ­B‰”9r]ÞɈËj5yª¯ “zÒ.Yk¬ðlíÎW±§ì‘>UéoÂy ü#,8æÛæsŒz†6BTìÞ ¿'‹‚«;n)u2ò[ÊÁÔöo¸â¨ŠrQ¹¦Ü¯mÞc(ÌjQ¹Å¡fï’ sdjÁÔk_Ÿ²8gÇÎ\ïX£%×,<ôôXÚü‚Dyò>æø,]âq’ˆ«\v~˜x¨Yõ@þG _»V:Òf¦l=,ÄHÃûE†§…Œ­À÷³a Ýy7Ö£|?X27{Úî*P8•®nâ,’7㺓õ¾@²s´û*55Q¾L ?wþÒ¡æ.墤󮀻 ¹¡Ký¿œà¦oÊC“V°b›Ë=‰´£ëû>ô$_¤ž&ñçJoÛø×t¼×©'}ÃbŒ`ÓÆPŠ('V”Éô­(-ùâö®7T•©P[ÓS­œ½æ[ dÐÑш÷· ³2~¤|›\²[’؈RëÁè½lùaB²<À^*Þæ: ²ž“±ù¤79öKÒ€‡]6qÝ-ûYOMÆÛM3'S}¹W‰Öµý{ۥݎ>³ê‚€~ÓŠp×<ÝÛÙk:ä,ÂOWzj½)7®ƒsw&¾‰2ó?ÇRË^ÏÂä2û oe¨ñ³< o”0y„Áû$=îXZµØ6üà+8Õ/ï´þüÀlØgý~©£í"‹¬ð{¡·«Éc»ÃV1ð•Ûl“³é"ÑëO2D¿Þ ]mxÜöV0+±ÀpÃ__‰Ì€1{)°-mÆõÒºâG3ý'—&¯kþZ])½Ÿ“zuöG2#ÇÚZ"‘MTï€í^~UÝ$?°Oúʱ½CÑGˬÈAÉoÅÁ)Y§ÂÜnuE ÒSŒÜ &´4…R;iLã´yY.ÁBkùÁѪ,qŠVÍ…å[z,O£Ö7 ¹íM¯Æ¯·=Ò•­ÆT)dsîø~™Qz`åÿf:ŸÈVî`ö8!>zÉ&BóŽ“eø˜Ô˜3°'„ve+‡×ÝÜ ²¤ Æ«ç=Áq\åÚ|]F-ϼӮêÓ·•A.,zÆÌï.ÅIÍÕŒ7é£Ëc{½Rœç»‡ògpg±êeÞ‡q=ü8i^s‘Ö0TµM>§Ex=cYÜëåâ@­g«n SHpÖꯤ¦4ógÛÇÓ½ýÄÚì†6!y³!¨)Áð<Ü䇨äNÛe,’–¹‰Nœ`JŸÖ2‚ÏeŒÖVo×IöD¡“\WÃ_ÉÃÔìý×|*·‰{€\«¾†ÿ/€ endstream endobj 56 0 obj << /Length1 2106 /Length2 14172 /Length3 0 /Length 15440 /Filter /FlateDecode >> stream xÚµPœÛº- Aƒ»wwÁÝÝÆ½qwwwîÜàÜ-Hp'\–œ½Ö>ïUÝ[T5s|2æ§ó''VP¦4±3ŠÙÙ:Ñ330ñ„e•¸LL¬ LL,pää*NÖÀ¿¤päj@G…-Ï¿ôÂŽ@C§w™ˆ¡Ó»™¬-@ÊÙÀÌ `æàaæäab°01qÿ¡#@ÄÐÅ ˲³‚àÈ…íìÝ-ÌÌÞoùŸ#€Ê˜ÀÌÍÍI÷§;@Ðèhalh 5t2Ú¼ßhlh P¶3¶:¹ÿÕgs''{FFWWWCƒ£Ùj:€«…“9@ :ºM¤ 3´þ™9@ÅÜô—XÙÎÔÉÕÐxX[mAïζ&@GÀûÝeI€¼=Ðö/c™¿ è—ÀÌÀüº¿½ÿ ²°ýÓÙÐØØÎÆÞÐÖÝÂÖ `ja È‹É08¹9Ñ mMþ04´Ù½ûºZX½ü¸!@LP`øžßßÙŒ-ì@ ë?2düƒæ½È¢¶&Âv66@['Üñ‰X8ß«îÎøg[­lí\m=ÿ:›ZØš˜þ‘‚‰³=£ª­…ƒ3PRäo‹wÜ?23 €‰‰‰“›tÝŒÍÿ Wq·þ©üSü¿·§½=Àô= ·…)ðýœ'ÈÐprtz{þ[ñߎ™`baì0šYØÂýÃþ.šþ…ß;ïháÐfzfýꩵÅó¸à±^©ÂêÁ%ÃÕÂ!„¸EŸ¡ð:J‘Â^ò,ýºé8žº€Õ9±m“Äl}Då±/§ôàx|¥GA>ÅC…‹Ã!µÙ&‘`SBœÍ–}±&µé&yÅÙj¢“O°x“·æ¬GÒ¸6›iHëqð$÷)¤úe§6¶Ty;¡¹5ÒõHºHE°h‚åœ~¯Ð…¾‚{æ[;ó)o"JÇ<Ì–Øq´æ•øÈ3Nå¯À¨0úœô&“Ž5<­ü I 2ÚÀo/\òñMŇöR膰OÆ’3–Çl©®œ(¹½­ªUÚí'¡V1/žÒFEvû‚C¥´ëžL×¢¦•ØŒäݵë£Áæ?ü"‘ÕI:N.ÝÎËEit½+­ÕŸÜ“h4l²…¨gqJVÕrÑvggˆ¼Kå5llŠQ[óxz«aÝÓ€‹‡B$”uy€(%—»èZĦ›-îdô1˜¿'É<…‚B‰“gaåZ‰³€DÑëJŠïušrîÍû_±,Màůz«~!–õ \¤pÃÄ ÄÚl@ã2‡ Â\ö43ld'Ø”ñ^p¥ôä“o½‘Á16{PØ©ûéÏ]'6–éñ„IŽPþ€ôz “Oeœ3:¬Á íúñüó§ÚÇ iĽ֖®ùÐöÏÔ²U=ÁQ!»Ÿa?ØlBF—òަÄ$ WyË›0ëj)Ob~²Q4`«o£&Ló– ÏT(=2c™®·f6‹ß»<Î@úµQ`˜ªÖì}åÙTòY“€ÝBJ^³üËÄ;šFšVÙéÝ3{Â/Nð-ŸV˜#­°e+ÉSgÅÈEôªÁ"½36üX'OË‚(aOqú [wJÑÕP¦h•–ñ}Å_ísÜE° $¦\Ü<íýÐŒe° î™];ŽúºÖgÑð0Ã?¶ˆËÊ™Q)ƒGìBùç©!OÛøy;dÑÇ Ï„ä6+Å»4ncE,Ú!BØ" *T/+wô)k¬Š@i[ÜEÅš kŸ;eõö_£×©êáòÇ_|1e‰hɻ伿 'õs;S;êï´i‹é¼5°üj·† ;6¾àl{ì%ŠÌ§Q¡ß½k~òàÀŠNñ‹úwÝša!ð¡^÷®Ý1‘O×:¨ÈƒëÊ@ëøuÁaŽg>ÌTBÏÈN$ÞÊÆ$ÛUåºÉ´uE†Ïú8~Ò lן™Y9DÇàžf-˜kþ”9Ìh÷>”#I†¯]°¦I'öµkPrå KÆ2õIÞK[Y5v÷ׯAH·(Žîb_›Ä`,;1µˆ¤;aQy7©'8K1›â sj\ÑNˆ|‚…éÐH®¦ÀaÂÈ•ãÏ]g˜~ÄÈ`ãBš}ÞÒ1 ÿŠÑþæ0˜µZåo¯ûIT¢zÔËAÓîo]j/F7ù Ѹ>¨<¯šÔ[â°«u´¥íëo#´\æµè€jų!üLpZÖÏÔÅ‹ ]ÞV­Ñ}ŽÏ‡–ÃjµÙeB½`U.\l,…÷+ŒdÐxÌr¶ÏzûCï>¨ÉŸ`XL&®”#ª"õšq·¹§g› §»Ì‚7 »sSBŠî¬èümjÑ Žæp  ’E¦@LÒsQ©qSFvp%–ËÌa¤Æy[bÈó’˜&^mÉ´ïš‘^Èh›\)U¶2`Å õ6ãàÆç%܈ @ÄJ¿¶ @¥Ã #J3VÂ+ÿRìP†O7 Ô":z>(®6{ VÙ×[-‹“6áééÚße –k/tÝj{­ì’x¤'÷û™·€SëÊ;m8«ñ8G×8¥ø„xÑÒ§<šß›ÅH£(­ÅaÉB4’Ý-Þæu2öñY‹c¡Xô†³ AxŸ–G:~þgxbÝö㺘 ¤œY93¬ødÛùDØÄ’iÒ·ÓÕ©½ÁÕ@f÷ì}è Œ°q×Nak¨³ƒòʺœqf±^EÓ¬ìS †4éEeˆBN7¼’·ÔQ!˜Jy„ïê}‚Ïl¤Ln¨‡ýpÑŒ¨hd™ˆ 1 êÀ,8×DCZ ÑjÉ¿yÕ"œ›1 6éÿ¨Ê=Ǹë•3§6Õ©¢†µNG¦ŸY‰ÌÇœþì>)¾$¾í6|„Àø!œ¤¾©¸FìþÖª´á3M|t ö;äeÒ%ÍK»%žMCŠ8Káuÿ‘šÁ¯Îg8·ÒåµcÎ}1P+3Æ»,ç'WCQ§èœ©5±ŸwÀu\üökN+xÔK°åЬ0¬J ’ù>=r4Ã'sŒRÞhshÙ¯vC?*kb‘§îÝž¨ˆ.,zp"\á[0åÆ[œw’ Þ}R9¿…ã+oãШ¥§ý."«‡ŽºÐ&H0Û›<[k™òE8"•™Fx4£tS-;ÃÈéÙ1ÔòƒqªºC×½“¿¶¤Ñg“í¹BM×ó;”ŒÆÆ5Læ¡@Zò½@ïâY[Z«Ö§sÒ™ˆÓ´/ 6-Õ3¸hUò3mˆlâ™O-ù>¥]Eì8ƒçR"Í,¹H.ÝdC—êÏ=´e…¡ÞPübKè$1žñ†õ8S<ÈÚV¿< ÕÇ^–Úöñ9 )¦"±±ŽM~»ˆa)pýòÂH …ðð‘óïZ¥åò —ÅB½w5½¹ÿÂþ¼ý;4Šƒp³ÂWp%CR*’2Ö“^кžÌœ÷— i•bË'v"&{Q“øYÙý›Ž‘ê¨6Ä©…B×V‡GL³rެġÿ‘EäfgÓ[µWœÊÝîéäÈjÔ²âw‚~}€³Tñ®ðUq ‡Í…Á»Ó 0ö ]'Ÿ¸©»ö¾ã÷MÇGÅÀ7L\yëʰ°ý£"Iù‘ôéuêV@K+&AN<ë_(œžŒ‹AðÓɉ0¶Yk Ÿû{­ ªn"I”îôX¢¥]C]æy%7f—ùš‚úñ>ÅK½—V?.ŸÎʤLQ ñÇŽÑ;!Èî½f1@W¥z­M½ÏvÒ·…ȲÁ¨u¡²Ð º«´ª:øØ¿ìé|ÿZ2.TðF¾ÉÂ6JòKŒ´hC:«JæM”FèØ¦Œ`;`ݘn´Öœ.÷3©i»ùoÚO›2ìlyÉîÏÇÝJ`°Ñ¤1©×Ê –˜`Úi˜ËròΡ‘íÅ祣~G‡ý\©Úlÿî¸ú€Zä^ÿ=¤ï÷¸û0÷§©ÕþkШÊ^É·”†˜ÄœÚw‹Z~ B.ÒÜlž>5”¢IØÖ{wÅ›ëBÜf}¶ÊÈÞgãb2™ìŽÌÞGÙíü¼SÃ5›„ ò4¢läúsþŠîáè ZæNðÀ‹ïÞþ·¼“:ÊiÖÒ¢•ßɱ¡‹Iæaö6®ÏÈÕD®ËÂ+#cÚ21CfZÝψÃx™°J, ʈš“R=r×¯í¼˜|$.IbâMaÔˆ¼þBê`·c£›-ÿ¥šÏƒžºâ­¢É„ð¡ØLÝÚËÖVf¡þãå®X¬¨Äl¦Ž5%þÒlPÂFëöå¯Éý8çç]Õ2`ñà‹ï¹xµP—mslŸ´ìxxö‹<ásTðæe*ÇoÎ?þ¤_ßÜN‰Ý=ˆ=Ý%o Eë·eã9m{ûžÀ'ûœYÌÁ‹cX‡vU÷ 8–-Øüß>¸rN¼Qy¿ø &ká/bWníNz»5iË¥‡V3ýc#Äú‚=›=”¬ü|u=èr¬û¹Yû(áõb*0¢ßÜŸ(Z*uàòC]h ]4~¢·8 ³Õ ½ºd9É÷à}âÉ·š.ÀÁÍdóµÃ½èUxó™/@¨8ªËµæÝ‰¼_oXÿ=Ææœ†–âoe®à‹)!Ec… 鵯F\?¼8û}~ê£'£ € ^ c}8süaCAf»??Šo[µÜmðŒ9Õa"-"gœGT³çËÁ4äÇFÚNÁ‘xÛÀƽY=>÷ûvb mWC¼Z^õM¹F-»,‡2ƒB,ŠôBuj[@-꦳×ò(G½áT’ñ]£|bå&§Ì“Ðh;úöÀ¶0{nh+i¼y•È w[˜RÞèUoJêÝž¬¼ùu‡'Œ%ÕÛ„Uˆéx2 |…ßÇú:ÀúÓ?¬-›TçÛ8îÇ]{æ’¹éÊ— -qG°yJ«D¾–zžé-ºå¥¸¡QĚ͘‡ö_H~€›þÓ¥qX¾ ¿½i­õcÿo1öQ=-¬ÌjÔЈ?„|ÉÆªØµ;ƒm ª÷A,û;L²‚˜)dlýî(E’Üš/;eÖ­Öîh²`êü)­Ãyr‰¡»ÛaW·}«Ééòj‹ÙVúÜ͘ð:`6¿ú)WKTùXhQcß'°Æñ—²åš"PÒ«h2‰­Î8’™¯6:r"\|ꦑ٠î¬J‹QE¯ß)3'®X‡ûÉÅ=|¨ÝvL¦¢àÙÖhÐÐžÜ Âx^¼R°Áú(‡³<ìU¯ õJiFýCüx²­©CU™e<>Mµ›üû”î¸YÒ„Ô-ò2¬öeW“êÐÚ4ÖF!¦²ñU¨É<âþ'GôiÌ+_·q"™!~Úœ2†êêôT‡f¼ÇdT#šqC×DòÛµlÌÐÈE\@.™L F/ÌRC1ú…ÆËj…®3=sL¾·oÜ#Í0ÿ:9ƒ¼M4ä"´kýp¼œ@¶IC\mË+’%‡X¯) ª¥réF÷¦—* mrrd =u„‡Â¡­p/ÒR/[Lg¥WðèóQŒ±KuÊ_ßÐhà\¾çÚùdãa…õ$6Ë–|C}“ùÓÍA‰j4gCóA¶)·*_hø4r‰­“žýlÝ ±ùò³H@·ßM®óE”£ýQ©è—kâ$âT¼*l M¢}‘DCÂ\ÀIÌ)51æ3ÁŠ9yqµh–"ƒÖÃŒ†{c!oÃ^‚ÍG((ß"´•ÝͽUäÍcÁ4ÒT¾±õaš~üà J)Ãéí‹ßÀsŸgÉ„ø bòÕ®÷ð!dSyóÔ+fQSN3šˆy­7æ ¥…˜ª¿£/‡%÷VÁÅ ör•„ÕS6åÎ oé(¹Wã,ãþ¢!½ìcûžÀÞ¦:çõtW…þú³=ÙŠþ­x@xDô é±ËY›f² f÷ŽŠ{øÔa_—Jg1pT!µ¬m)WX¼ï{eK M•¸i—–ŠòüèYíœÿKÄ÷Ò*É4›†EG;ÐFs¢ùÝEÀ…Û`±yö P“†6]ȶYCƒ2*þÚ)ÿØT vÜÆÊjO¢ƒÂÜ$âˆM¾Éƒ|²‡tÀc/s¢¦Fu]A«2nJ9æm%$ÔÏoc"±Mf ^!Q‘ß*ï¶Zâípeu—:æE²uÊR ÍQz‘E",qjÑ+Ó¹&¢Ž·:Æfm#`‰<Z¿«°fúϸÏi\b]†0ßÙQ_£Gï^±;ŒÂ|…Ô#?h;Ü_W郄ËX†Í6·` kžÇáÃ=<ÍþñÒ›Gb¸(¦|65¯n]àíò‹Â;ì;½ ¥N¦?¶€—æ6–Mçêi¨]eeM;÷÷¶À G°œ‹¨>“;cL˜'‚Q‹õNº›’“Šœ¥º†Y‚ë>⟚H¾÷tÆ6¯Ó$Öµl3W†yeËWP–*©9Úq”¥>D­Qá7*uF ë`Õ£¨,ÞVXZ]b+#mÑ™åÂ']¥9mŒ§ƒq´éYå?új´£(Cí^ͤÒrg«Œ§b‘’ ñ6>Œ}ȪŽZºð*%hãz‹-Wp™KÌò: ¶ïž7|ïK[9Ìøùæõ[ÏØ·H„Ž_]—éO hp y,tgz߬ÏÁÚõQ×7±‹ÁG\ˆiG¿‰ò}uwjëlc8#›Í^Ÿ Æám PÏÖçª`qøÚ¬7Ie¾Û?$ûX€ µÜÌðaQgÿÖsl1HÉø“tÒ!»Hÿr Dd¼HZ` £Äèô"…k}”áæ%k=iëIè›ÿù»%*ÛX4Ö¦g«i³&¨cç…ê÷ 8=šü~n+¥e ë[Ùîë‡ò‰’v‡Ñ>“/Ô;ªŠôªöò!—â  »zLñQR׿OrΑEÁÕ4kÅâ·YAË’jùÐkFÓ\µ™/=Þð£Û…ÞÅÜ”½âF„W¢Z³ümô¥¹u?àX¬[®’x–ëÀƒkù¾þàð™X‰Y¨°ý—/¾;Þ´p±ÎËï^Ä^›Ëu Þ>Noúåþ>Ò‘þ£ùøÄH IýîƒdÅ\tactë0íÓuš–™ ±åàJ~êºÅdç Bo‡åÞ1bb…_Ðo‹ÐA•P—ÌsŽ– Éj)ö%ÙöìœÃ“é{ u/Ûq¥ˆ"2I¡îÿeÃòYüù BöäV= Æ}?MNßî!9µS`t8­‰tI4þ1ÂÎ!4µŽÕäຬM–Ñ#šR,”Îã#M5RE ·œ™:çÌáÇ£æ…AÒkøºJ)å¡ïS8át—0úfu|§ZºÞ«aíŠÍtß ¬¤…6 §(jHéŒïŽÄD‚ž:®Ê&ËšæâçT¤ÊÊ&oÜ+d4h¾bÂ<#çDîØß{£•0%lù¼÷ ÐPø–8b2s dZ2ûärÓëÐUŒy?bÖʾ¸±çÝæ]$·øžu“j‚žÄp€úæV“ÁÖ‘>æÚH“xVßÔ›“%Ç›‡\m÷ñš›ôbÐ1êO¡lk­_“EÈèå*R8Ñ"îñ‚#ld.m…_»øÞÞ$Ôl½¢ÒŸ ”~”›VXrˆ—0V[p«ƒÇœÔ\ÜXÍkëšàÚí~¥€Âµ'>Áša˜yÐî?ì¾|’Vç„uÁ1¹1Ø^ÉÔ?³´`³¨_Ø‘¤¤P.ì¡Ô¾ÂT|•³'žãŸ±³²«ugàYû½0xʬó2œ æ6³r2²éyÂ>îøŒ—&wÚÏCa¹AØsUÇ.÷5¯ªÖàB#¨ °½Ðe ß”.(ÈO3ð,ºiµ%h„KN¶ Œ%µ=àš>z8[+ØØÅ.³Ým¢~1‹ù&ÎD#I_yrçjÀÊÿƒë× ±žœúK‚¡h"å^ÔÅ¢ŸH®k<ÑÀ~_M;y­ÞWäÞ¦âpõ;U¼é³ž_-OЈ”í$Õu¡\IÜî_ò#ÜÅ2M{nû›SšjG°(‚] è'ÄSªãc™…{ô~ÊÖm6eêZÍ\ºŒ=vÇá»S— B¯•,áàì6”ôÛeï;yOˆ¡ Xè¶¶íñWˆI¯øÖeÕ#$¸µCR¥@6” e^C-».Pn=÷‰…ôWöwÍø«Ž¤ÁGÞéh÷5úäÎü,ikðµ”¾Žçª)•+ÿíÛǽo'`+%²YÎõ6`r±‰B”­ð.Èaö•ª­Dl›gI*âå†ÇU>=ÞseúL >€*1ðÍàü+’ZKóŒUjxµÍÃ_<¬[VˆåX-`4½ŒuS•:Dí…">"Xßsº&öÈ¡£«DI+øu6d¸$@ZQ™Á`ÚB+çJÒéÉÖâêÞ¦|åŽ cBimKÉ{ÛÛÎW[¿@kè txãzÊÃõ£!´#¨VG‹G•W¢We†þÃôɽ:¹Õþ6pên‘$Ö:zw§Ëú,Æ ²r*V–DP)FVUІ@ÐLð¦éÆü¬NʃÀÇð&–¢ š…*غ–â"ŠÛhöà ¥Œ¹Y²[TåKÑLKÑÊŽÑÒ‡a An/%í]ª-øØèX¼;F ®çøj=3wX(…\LBŒÞ,|ö9†iBH ©tÞ>Y‡Ò ˜ù"Mt+‚d2Ùõkh†üÛ*}©ÓWC•ĵT¦N¿%éë)àc8cqÃðmƒÏÌøø”W˜ïHS‘i nô“Ìq{nï®åù¹ùò‹TA%ï˜Üë3ºüã> 0‡Hýs˜¤RCœ l¿>ÃÏÄ¥`ˆÌ/oSo~-oÝð å²¯ò/OÏ÷òAº´:¿eÎ¥,|x °Œî/JwqAO¼j˜Á`Åâ”O—7l Êì³XLëå/T×V¨¶lãš/ßoŠ4¢î=¿q‡/:¹Ÿà¤ïF©#ßl.YÄT£kõJ“—ÜÄÅé­`¾’„ ¨;›'G§§LBœ·^6f‘ùÓöHákiûw®‚š&¯L^¹á ƒÖà 5 :IDÌéj¦ÀK›O"òw]úÖœ »Aiô+i÷™(Ënó×5ÓèXûD™•{O¡U[æJÁÔ¨…#¾®Áðåº>IPíÌI!LGTÍò5ÅmÚ¦¬ƒÀÉï¬1ÕtêWD½ˆÐ€¨“¾xt‹£l–‚߼¥LHuJõvôëScVTŽsžÔ#÷üù±ÊçÚBÃ-:Óöt”!úEo–-ÖA߬T'§(¤5Mot.G»ÊÖ…eƒ³)ßÇ™€™ÐÅpñÔ¢H&å$SVm LÓ“ ë{³Â£“Óëc¸¨t´ŽdÇëܪ“³0Ürw1äY‹ŠŸ«êuè%ú¯•dzÌžPÓ>+<¢îغ8”BkU EI^†¼ƒ‘>Me½Ý/U’®¦ß0Õ`SŸ‹Â·÷A•ÜË:|w½J¦ÚP‚å—¥o«HÖBöö9¢}lC’ µÈˆs÷´™ŠA‡¯Zp.ÀŒÓŠÅ’1þL~‘Ú·¶zù#!9+O–!q^p9¨óc½¶S¡æVñÍö«~ɼв`8² ÌDÙvÅñËdP2Ÿ£åYNqrePBƒ`DéÉÏ6Ⳅº=–EÔE¦†ŽÝ¢9…n¿í×™ºšZªÇu:Œ;]jy?K÷)Ï0?Ʋš¯Yó½x·nØGCG4l¬62JýÚ,B{ó>Ö⨣yÄ…ÕßžTç"²ÔÚOýÞ÷¼© A2±(_ı@«•’¯'TŽ…rì~3—ðw^³"ܹÇT«#뛦]ÚÔûr²³èÈv3…ň±?îƒvTã Q½,6ž’äÞìf›­ˆ:ÐQ“‰ r[üã–íTÕÒŒ‡3[•´X‡Å vR#qä[žÕ Èz…#’¹ÛŸF®íôÉUkºGÅ£‡XQQ! ÔŸ‚Uñ4J±wo:L?þ`²Q¦Spï_AÍcü\”„ö¥Ç—éü±d¨šÇ5oê³ÖÌ ~ûÒ'¡._Žl"ê¹Tƶ–­m9Iìï1Ž©·¿k,6"iÑ´Ñç‰å¬”ZÕ I›7º§ô#Œ`ÚIFˆ:NR’^;gB;J@Ú[~Ag 5‰’ƒšÿ™ë~HZIE*ÖŽ˜œ‹™éN0ßZ€OCîó%Ê'a/z½XÜOzÍ¥›7š|´ü9§ÝœÐc¤p!pgÏzŠ'ÿÃ?:&©S#åMÓhÒ•†‰ù[ÄÚd¢ø‹'föäÕ¶”O…gõ¯ÕWß«ð‰›M7GMŸ=rÏ!´[ƒ¾â¾œ‰ð¼}»¢¦­b §£äþâó¥ZE‚fݲX¾èA,'"^éü{9n’‡û÷g[W½ Ó.zõ:©.H« eL«að^š“Ñ%Ôm’±ñCµ6ˆ–ÌÇÛ’ÃX˜ï|Ÿ€æZŸö>r6CŽ ëë)hJP%[¢*ÈÂÚ<:Wöð†­Ú‚ÛÁÍò.&K½.~VÛæBTsLû®üÖ÷¢Øå¨ÛKÿÝiN´RÁ  ûÜT'ëC5€ÊMÙÉ9­Z.å@m[DV›¢ïµÅþÅê \üC9çLîR7{LZ¶6ƒ­:dÑêQÌÁÆ")~õ™¹÷i‹¨ä‡¼Äc¤—¡”g:=âÏ‹B$„Ø+k©x ŒRøIÉ~®ÜM?ÕkÃÕô|›_Û³\TPš(&H7Étœ0‡swc~q-+ýz#’(|ÕŽ™ûÕßhïéÞýoC£»µzO½xw•ËàrÓù0‰bw0³¸CÇk+xþRûD”…m)-f–`JóIäèU-%ó®†óº½®û2tŽí\7¦§I¨Ïÿ’!§èÅ%††¡ðªuZÎi{ÅO¨=ô—4·«uû ÁÅLæ', žWO]<Ée¿¡²»6Á{2Óq­fBiña_‰d\åbŒL~g¦À5ñ_˜™¶xÔ‘íQ&Ä¥–,:³©ƒi˵Aa$Ô1áÈ7<øJOºz£P_Ý=r¢xÝ$·ÌòiA&ؤ…}!›¡Â q,±s=mŸ„Ña ³ÝÏaÀë 1raùà9KD¬O’ªËRyžjsmÀ”ëyµ˜z#’EHù|›AÊÝá$"íj_*q+'e²† å!Hûí›–¦•EôãÐHA9Q†Ó¿GD¦_F? ª]R 'k¤b^<’]ï;°®6 +†v~ÆJèPQuâ”r^/ázGÿŠìrhf™0¡`œÇ¤ŒZÉ0Þvü¹y8×’óíè:]¶ šÝ³íðì1¸ïEm§[amíª²‰@Ñ-üóùÕKA¶‡¿Ó‡®:†àLÆ!š:ë»…7¤ϳõÞ—ŸŒJ¶žmÔü@Ø‹ò¹ ÜÙ÷”•4Û¡ØãWW°Ôì~ ¬š $K§5‰¥­õÄ8?r‰`ªÜ‚en2…ÚËOÜÜqiñ¬tˆ’¹.޳ꘕʖ2 –!f•k"ÇgHühMò $ýÚà_”¡ìI€ÑCVš’Ðò/Ýû߾ŨÕãŽÁD!šLŽÐ¬°ƒ€“§7…@Ÿp+YVjŽÃ³œ­KÌb¨)MICùø{×Ô‹ú¬¸rë­%@ ±Qê+nþÐ_ä^‚§$.Ü~Ah ¸¨€ï¸&OúÙ îR©¼¨ìMô=1VVæ|›Ä¥‹iÄà>{ðkßÛÝb¦¢ÐBÓ™ŽŠ>© èA¥‰ÜR®žÚË<,>31†NÚ«²½}]|œEŒ6~+"bkv]qpš'@!PBÓéq\Þ ^§~r½_‹b»}BOÛ× Ðý†gC^Ä B3} PO¼Q<ÑH¶X0ÕÐÞ:/2X3Òö͇E­V¸z¾Ašw‘³RÂ×[‡¹¼*ËÐâ±H}Î öÎOÖÜÄ¡#ѽÍÇY¼Hp;£9õ”`ß1t²@ro÷Zƒ§—i™‡ÐtY7ž"­‚Ùf rdbXe–‘$Ô]öPšÖCöÉê/¡(bïåIDIû_˳qì·áx¾±œ4~=[7o/3Ö|YÈ4M æ s%†É‡Ã¹óÂýwV™»”;?B§TÉiÀ¿ ~„bÃ,kkd®,Ù8O9Oñ ô¦Í Û#¢»·Ù,#®¶SkhQúÒÍ‹îé‚Àû`^´t\]5áU‚¯TÊÈ…ôéåBì'~òB¡#D·Á&Ìœtš:w[½DLpÀ['ö©04ÛRG">:ê'½k7'Cƒeþ²Ç=†HÊmw+âÓæ–ïôN >;:s~Sü›Xáù.2“–6…PNP< ÏÍ#7~úiPÕ_1¦°~loG0­ùغ* ¯ÏØ"æ©´uñ¾*=Sˆšæg0Ñ&š£zÌv#|•àìzâ®$—N:f%Ò…Ü4…KóÛ\éOÅTj²÷xÍ«¯&Výòa‘j±ë¼¿²vô(pç\¥éz‹ä˼5{k¤x8¦ê™†ŒõëÃó 4te¦Ë¦±tŒšOî•™­_h}ò€¡ÅuGyà NpX3»K†üiÌæŒ‚ÕÏØåL1UƒS)©$_xh^“ÊÜ µ¾l×7Ç®lZŸ=³@\ dý¢»ÇNS¸¼H:üb¬µº¿ …Ư÷Þü≙ ªÖb`"?þÐAl9[žÛ´›DXÐP!ä ?cuv-A{óY—}ãAðLT—Ìr!LJƒÄ£ˆ— oØ© >¸lï)‹#s²7®ƒd} OY441ãÆ®@”kFÁO:UÎ3°I•¯›T({VIá!Ó÷TüÚÒ°%f#è){#J1©”Ó­s@dŒ0úCQ=nãò³§´‚7üø·³xwÖ˜ÛãC¡ž«ðmÜ©áÔùNA¾CÝG3ë+·“›‚¾-dv”3.½C'å. à€x°sÊ'¥D~Á5ïáùOZpüPDJn¬ŠÌ({Ÿ‚o& a÷9 Ê´„&Jsˆ;ël¾_ ùœmÁßÈ ZNsD®tr´óÖw‘ݧJÒ>`¹HM'§QÐó%—m ô«ûó…Æ–‚o`?Z×Ä<ˆsßüÜÞOÇòªÔô°g‚6`NvÛÍ%6éú" ~(¾lï&XŸÈõ`9¤¿P7bp>³ éE-óõFR÷¾"ä¬òi*È N6––yƾÁE °·¿Ð»º³9dÜÌì¡Ú‰ÁôÌ®GtÏ9÷"bb±m9x™7)rïÑ¢y}¹*©®ïYPeËè\½*´ýþ¹¬U ,üÔÿ×õ¶äD·èq³ÊK²f®¼lpº¨Dœ4q\ Áo…ÐMœ Ruøg4ŠÓ_ D+_Y/aÅÀÀæÕ~Îâ€ßHžõî‰ …ŒÎ,ÕÖ7à˜K`ÑÍê x+Ž'àð° jzÙ5ý¥Z[x endstream endobj 58 0 obj << /Length1 1997 /Length2 11729 /Length3 0 /Length 12959 /Filter /FlateDecode >> stream xÚveT›[×-îPÜ%PÜ‚kâRܵX‚Cpww×B)Å]Z¤xâîw -rÓsÞïô¼ß½?îÈÉ3מ{Ùžkç¡£VÕ`AÌÀ2W6Nv!€¤’†¢¦&'€ƒƒ›ƒƒ ŽNÓÚÕügNììb qúGÒlê µI™ºB©J€‚›€“ÀÉ'ÄÉ/ÄÁàâàü"ÄY eên (± `4:Iˆ£—³µ¥•+4Òÿ<Í™œ‚‚ü¬mˆÛƒ­ÍMJ¦®V`{hDsS;€ÄÜìêõ_._Y¹º: ì¦ö.ìgKQ&V€‡µ«@ìvvƒ¿Ë(›Úƒÿ)Ž ieíò÷’ÄÂÕÃÔ €ì¬ÍÁ.ÐMn °3 !¯Pq;üMVü›À øO{œìœÿ¸ûÏîߎ¬þÚljn±w4uð²v°XXÛ*2Šì®ž®¬SÐo¢© ºßÔÝÔÚÎÔ Jø+yS€Œ¸ÀZã*t1w¶vtuaw±¶û]%ð·h£¥@’{{°ƒ« Úïü¤¬ÁæÐÎ{ÿ9b[ˆ‡ƒÏlaí²ø] Èͨå`íä–—ú jBûc³»x988  v€=Í­€¿ƒhz9‚ÿZäüm†ÖáçãqX@KûY[€¡?h>.¦î`€«³ØÏçß ÿÐ89 ksW€ØÒÚíw¨lñ7†ªÀÙÚ`À!'€ã÷çŸ'#¨Î@;¯?ô¿(¯,¥#¯ÆòOÑÿ,KH@<>l\6.nn'?€Oà÷ߎTM­ÿ“È¿¶Ê;X@‚ç mÔÿäìþ!0þgN˜ÿíK0ÀøGæÐ/ÎÿoÕÿµåÿ%öß^þ?ôþ¿s’q³³û‹Áø?”ÿ‹ajomçõTÂn®ÐqP‚@‡ÂáSuÀO±dífÿ¿Wå]M¡c!î` •6› ;ßßfkkO0HÕÚÕÜê/™ümÖú=vvÖ`Uˆ‹õï«ÀÆÉÁñ¿Ö ³fn ½N\ êük ¥ÿŽ*í`ýž9.^>€©³³©TT\¼¼Nèp‚Àžédw€¸B· ú, Îh¿–ÿmú ñs€²¨üà5þ PóâµÿA‚ü éõbö €æÿ ¨èµaÿ‡ý»@п 4#ð?ï7rrƒÊå ´ø„fiù‡]´ü}CCôÔê_ÚëAhò¶ÿ‚Ðìÿ :`@‡Ah>Ah8Ç?ÅA¹ŽÐÛÖÁláúÇÊùëßòÚAGè\@þÔÎ ÍÓÉ â ™ý;¨õ_ÅpB³wùòþF`wðŸy¡tè¥òg4П°ÐɺZ9ƒÿ´*4 «Ç¿‹‚6Äí_Ú÷AèyzüÐÛø'”ë vþÛÙÉÖÜÍÚ׿n¨¦ÿÿõ¿{‚ÍÑç æÂ¡6õ¡í·µâdl;cܽ|Z×ÏnT¬¡E‡ý7«,gƒÑiÐê¼ÃËo‘x—õ šq¡‚¬Ì'aTd ª¦Žg"K(Äp.tº¬H)G×j¡“×°%¤–à.öó=ÛïꤹÈÞ Ý\Y‡œþ'£z?·ë£•Õ^¤©q*â/÷Aòœ/â÷c-=ôáUÅÕÚŒÐųDµ¹-:²ªS^ÞÊðÇ•®›ÊÓŠiIz‰D¼ènF¸ÐOÅ4—UäÔùIó¶ ” ùšóå¡á 1l¢X0%c§ãZçñÅ’n?‰àÓúí@ã÷L••ÏY¥ž$Y9´l…KÐ24¸{>ªßqcÖ°â# ka·l;¼®ãˆœ}psÆ ¿¨÷štÜðì–ç¥a+13Zòê9`.r4Z1‹_x¿„ã­¤bfhǃeY²¢äp5•lÓ˜f¥ªÉ¶ŠxWÍ–êô!^SOt< ÿfýÂfãóŽïìé;iÞýwÐãIm_Ê#CuÁñ›z!­¨‹n‹â QÍÃÖ°ËÜŒsÚÅ´•(•‹®&KXê»fz_–Ï» éË‘ñîªh´/ ¥W‚A•QE³KM}ÎçjF»ºMÞ“Þ9ù° *Ä™Tý̹£9ïã/EiR×å¤Dª¹ºö͵X¤ƒ¨¿Q©@R?K.¸²ŸŒ×Ò>Ëôµ$à‚Úå“lž¯ÇúK:0ÜE¤.jñPú{ó‹|l]œ²ÀÊ‚‹Õ¨¸œèƒ— ¹b±:|ÙÜÓoËâòO”úÀ¬!ÆÂ∱Xˆ5hHö“˱»ÆEÙ¹à.ÉÖ¾¿8{íÛv†c²>,ÜlBÚ"!:ºü?ÓŒ(A÷{4L8~섾ÓÈ|úþàŒn¢O£ö\©à®“Ñåµ0°ù_¬!«rSxvèÚÖàY»z aÜ'YÞ6Òpeu.$®¸oI&fÓ|uW°´þ¹nµá—«³¥{@Q$¬1Î}×ÛlȈÜJŽð›®4”Ø&ù‘°çƒmâ °=Nò¼âòe…§”=îfÚüD(·$êùqO ý {“¯>/­‰µà#•˜;ú:â”Þ{¹Ù®4u¬;ô³¦¸cÿ ¶÷Whöö!Ÿ¶±X’åŒyF+:àëY­ˆÉF<¥M Ÿc ¬Þ:1˜Uu¥·É¤þ\%KÜçIÄQ@–¥Æ\rþ¸]¡šeöQë*Xøè}Ewë{TªÜÅüèÙUÎp ±ÍM…ªÃ –ÂÍû©5]s%WôŒªQu˜R<)çü:Ø÷Ù˜îúô@–‰<ÅDŽ[¨f&Í*ÀÎíë˜Ãʳ%¦YyÞ02ÄsôL6»ï³ªEqUíü¦ õÕ*?Íßó1eôçL4ÅkžÔë bª=¦zVPNöqp°G<“j n[Ù;ÅOÞSÃBO®IË®ÆYÝžò;è©)_K“Ð5ˆ.C<²øÛݶëņÂòèå·V¶å×ó|Žé¦Y–Í ¼‡H~’‘qå‹Jzr‹F‡ää#JX–sú0Ê —õÝrnòr¸È¥| þyh’€C$¿y 9·%r+tl.Zxê~Ûu‘¢hu««Û‚˜ëíó ¼ý먰´J!ûÛØèI¬¶åó¹(ê§LCývt7lô+î¯Å:¹Z³ÇúW¿4^æ*û3ãø”·ž;®MôÝŠ[éZRJÀïÅöî¿WÓÚÔÁŠêµ~Ä9 &´?gAÆýUôlKŠ(À×°´"?>ß··¤1D;FC·K•®zžZI–9ú¨²ðڻРÔÙf1Rqþ‘ë«vdžߩŠ×Bœ†P€óŽùÇR1¹çKü6¼²ÈxXî_¸B6[¦z6I';…E ÊOa˜³à5J`_óÌ@³ô­5Loðš+u¯^ý΄¬±N`½tôÒ‡õ6B¡‹Zpq©òý¨‡$AË"ÉÙ;IJ}C§QÛïikXÍb>Û j¾ÌLK$%Ñ,–Ƽî¸:¾q}I0ÄÉI>]Iß;fø“,‹ˆs]÷~Œ&ï(ÊÙgÅúcëÇŒ²ØãW·wZÌâ½ ´ÊÊ¥?Ñ}I÷ÔWç—‘LËfí¯ø9H•IhàÐ6‹ÛM%¥ßØ¿“}Õ)Ó§õ ÿE:ç.p$\çi‹åw¼a5ÁTWôIŽ­ÖLX޹œD¿±d¯%g醖üY}Þ;ã²ù ™º±·ÌãÉìè<‹hs_µ×v£^hÙi¦IR{Ì$@‰åêwjº½×úr9Ó£Òá2(#«žz ©øÝLËLt¯]ã'] r'›qA3£‡ZìˆÑ£–¤ÝÞÉ+ÉTqªQÝ_Ì}ô±§»°Em$3,²‚LÉñkpÈ•Rü>-VÕI³|®Aï˜Âœ-ôÄÁéçaÈÐñqÑ¥ëéåæMç^ŽO™ÌŒøÙéUkà(ắҊﲿÎÁ«d»Õ¹7ç) ÖÑq5÷4Jl7«^éLñl`ÎqòÑAMáqá«>ƒá¬×(Ê÷MÆX‘)+>:_µzÁŽÏÏÅþÉ8\€Áî\õç`Â#þȪ¢§"‘1`h÷|Í7Ù©h)RïÈN þNª< ñª*¤‚·Ÿp7ÅÔ;Kº«i2ŠpŒl µk.Ö÷ 3[ !b[©×åv;$;‡šÉ?CDßë5gØŒàx[¬x?>¤l>ݳZ¼Œwa³¾½ˆ P 0J´a?6,ÄÔè‹Ý;x'Ã,²Ó>8Íxìþá¢`r ÊxYQŽ;†³6gË§Ö Æ¨]#8Øø‚%žý»Ðhy õ#ò…J>//*Ú ¸÷PñÔ‡¢³«˜—ÛhÉQpg,Ü jÉ<£$–fu>p sç¬âh.÷Ú¨¿>JÞT.]LÀÃ+ß-Kí }5Õ¼‘Y!W^ª~p<´ç«NÍÕº?3:úÚZÓ›Ès䕺$d?!LïïÛ¾‚Q™¨;êä$.SmÝ. Ôr«ã;¶ì БW —³~27)§÷vó«úlø"ßoìõ&ÍŒõ.0k$¨rÕÊZ—†9ö«Ð\¶Œ ʇLÍàì×]"‹UlÙcîždHÎ{ymHLè,mî4ýý »:±ä,Xð€±÷x‘G(we"U1k§‘kùщtT1ß1¾ ÉaÕýÒá{)E¢Ù¢Úÿ|Ü‘rÉïEÌa‘)}ÍMAþ¶ÙÝ–p;{¦t¼4ÊDíÂÎæ³I ù°/ÂKN‰Â8Œ0²)XíE⪯•ÐÕ}˜fO…»Ù.¢†“±íNãÈ\Îö~ªy F²ÿ8É¿‘Aüµ[ÖÑo×AÀÈpCà”fs°|X›6VŽ/™_b¥cQ„?Ã!ÚÉåW–2’NîÜž=ç(‡‚Ú7ãË¥ Xœ É]†‹p^s„ñ˜/DEÑùv_Ó·|¸aFÔS¸"’¥ll/ÑW•(µ±û틱iPîû ÞŒ!½ªz;!ÉëºCVz¶~Ißï‘°9‚_+µiÛ}‘®iH€åóŸÂÖNèž…7þTÆ¥e$4n‰‘åŸT >NôPè¯_}%gL »*Itk€“}ÆtBÖŒ,xQmu+8žÆÛ=ê àm—ŒUëœ×¥Ðz¹,Œõ³†”#4òŽ,¹FFËßÈãº:Ÿâ ¨`JhÅÞéM96~jjÀlÍ׿ÛÔ÷™?h¾0&ýÂæ\eì4+…D9)îˆ^ò”¤èE¼Íâ§èò^Æ¿‡xÈÄ×Ñå ‘ÖŽ›VöQˆ•øe7.‰¾ž‹mLeß~õ¾ðâ~És0»”à÷MºÉeè’àCYoGž¼hAëVHš&Ê ˆ$ùº›,ÂÿòÈVàµJiÁ3‘×[ŒÒâ)SÏ“ ²dHÊ‘vÁ´š8ÍmO\Æ¢ˆ…]yO8ú5xzÎ9"ç¶9Ø`Òj>ᙸOñöh(Yԯƈ-ÓgÖµe`D3ÖSFJNW»=Û¼øô¸Ó tlŸä¨SÑ;±_¼¥Ë+ŽVP¬Ùö ^IØ´eÐmrjRoÇ¿BTIn“ýèy¤‘BF)Š?µëV5S5”¦ÃLIÀ‹U9MȈiÚ×M]Àà„žb,8— ¯PY=Ádòæ6]“r¯™ð@"VðHDšàø`ëkÞ¢´Û§¥êí´Š¡ôçA¢0d\ E-Â1á ý€œOO…‰‹sçJÝvµMãµ5Ü_[t‹ð ä÷ë…2/*§aMÉ¢>è-'âêGð9ü_ìáø’‚ °V”¯Š^Ÿí¨«=øx\iQË$æªÙÕh£žó8†YS/Ûiܱ"òH¤É’I1ëÐþ(ãËr‹—¡rÏáPòRtGÑÖíÁëɦzë M/âëFEVˆ|ÎëZ\]ds<æ»&ù“N ÏcÐíl‹çœòí….À¶L÷Š’–_z¨'ĨÏ•/p°—užß]B ÍFŸî(mÀ(x†›ÎzOoã¸øJ-w/ç}æj©[½Ù-"Štp¡…ÊܰsŒô’-ùT>ð.¤Œšþ­„]@ø­ê*c*?îÙéŠJ+lÍ­" I¼†l¡êðUÔ+­*{Ö/ê÷ì1" Aú¡þèëZ{4b{j´&Ú‰ŸAy¿yØüÉÚÄ”ÛôòA¾öê~ô¸7º·¬ÃÏî&´€Ôáó<ïó!8Ï£¸Ãoðì$×C}7Û$I¬DØy“£³ÞGëB·î53·r0ŽYU MÂG)£Ø Ê¼Gž±wMÜc×Úžrdé¬L@ö›“Y|D£\Ö6 ÛN©yMÉhà9.÷Ë5C§k¼Z•TciÝË[Ä-À3¢ì„|¹¡å×^ ”öö9ˆD«^Û‘Ð@†n©Ü/fEÃ÷øÎΧŸ”H±ÆnqlQª²=E*èÁö‡ýhõó|*m^­Sî÷¨šù6WB†-´o…ôzò7Ÿ9o½ÐÆÒ4²Âäèn/0 äörÚkGÚ—.oMªI&zLħ%jvmÄ›5_z¨ ëoÈ[“×f#¶CVζû,büû^ð‡‡ÝÝÔH~йçEÍÁaWÙêÅô”¶KBÀÁ …×mϪYÅÖ{G4Éš²ü$­Ã²V¸|ëÀš­è€ Åu±Ì3éEE_Å&ž’ýgäŸqïFp©¦ßè¯t¿ÔBaBoõ,öž¥deçä–œÆÞ0Ï¿[-0‹ª;“á9è)¦³üdMï1?4»â@¾›{À6ŸŸ.{r½K91TònXu»]æËeêÜð¶–xÃÇôHH=æ1i\ FŠsÎÛ•Ï×/ŽÝ^[ô§è˜¼°X= kO^×›¹YPy#{SOc ŸhÍ«6Ùz²²Ä;Ì›d§yã½NMå…è—²Ö{¯ÃíR¯ð̾Ò§ šr Ú+PeÆÌ¤äáÌ™?©å`’Ÿ×Y~¼øbÙK#ì_Tmùe×¥K¹lëwÛŽºÒ’s‘ðI¹%ö£K¢:+•¿6ºÅ0•5 [KôÈÌ߬6ÍÏ„:Ð2.‡Á2c¼m%÷Ýd·MXèˆoX“}åÐë¹ÁãÊ·2Ë¿hŒ!œ¯ eû÷ÚCš×ÎgUh*Þï¬õ¾7dq¤Ñ‘ãz*ñçÅc2e Ýä@‰à£'rÖù¦NU ýn½¾µuã´øù×CwýÓ‡Íå̳Ñ"ùÆô^´¾ûdøRuù—Ù.f•llŠf@ùƒ_p—²cõ ¹¶èy@—µ¦lðŠ.Œä`_õÌïV«K ³QºQ×)îµþÍQöíîþSŽhúXÇ«Ê1cdÉ|¡3ñSœz½·»³QÌkEÊïè5]Œ¿E¢Ý…ÀOè›Íˆ%°¼"·¬_sBH›#‡Þû4CÊnHsïËJ–W Ï„ã\âU÷wЫ–[9¬; l´ìDˆ)Bóƒü¬n™î¢žŒ¾ÒoÀkøÝ+o÷×llZßG'iì— ÙÀEbõgE®_D‰Ä½™ì­„ _`Þ¨ Ò?åK‚5›9–x!ðÚªšIÀçðÇî)6Û‚Ü[ý=¾²=áB—ïÀÁv¸9½ôœpY|÷Ò&»<¶@9,Íù7³$b$2•?ÆÎ|s'¬tœA›!kÏñ“ÖaúÄÎ ~í;6`|~³žÉx/ÛV1MÇa£Îvù»¾Ÿ=ì¢Øú„á6*~Ëvw½/R'yRÚx¿Å{pâóÌ6TôúmâkUò–d\¾ÉÍB3âì{f f …y·P’u¼ý·ç>o.3v^&¦µؘ‚È3Íz®\”çÞ‹hÐÀdèg‰ÍÒ:F¢UžGR>3®ïðÎÑÂ2ÃfÙÀYñïSÜȘzÚô•Žå`)/³-=RPš/+í¢»xIfËŒµ\á¿jF >QY«ŠxúZbóŽnS ˆúœbf6OaX¬»M ?ý–ƒ–mu%G¬3^¹\yW¨ó.fŸ ÆQx“ ‹r¦=¿\ô…Pç0ŠoµJ&R–6º[‰µ(ÑÕ iž]#šç…ÍÂîxí”EßÉ@ÓÁB#„Oª$H0MÏ„Û.þY?½½ø(vmŒ+æ²o ®¶A’{è^mž9*róáCR=Û)Ô“q'©~ÈDžºG|Ÿ’ö³JAÅÙ€»Ç×m$Ä=øšT)ºØ)ïÈÿÙ!¼7ylòÃΗ—oTJ/æèøp²ý ¶ag¦_Ö'j>]ùyj6h§Ð‚ê#ïåõHà1&6ç%±¾·b†*ÉÍ“nÚgtƒ ›¬t4‘6±g?ì¯î3M,0\&àZ4öF«ÀGÑlÙM™VŠcz¸í£ºÓÎglÜEB*}WìóÙÆZÁCrã#Ç òß®…‹UZéîˆNbC»ªÕ-íV<ûÞ51³œÏO%°h3W%x*Ê‘ôµ/¦ ‡‰Åå1“)êŒÕsÿ0¹C2 : ×¥[ÆË¡ŒYóæÄ/ô™¸Š8M^çsO³êS³¨¿û иµŸÅþÐuvùI…( ÝKBÞVÐ µÇ(iWïí«8éÔØjmfí’²ºê¨A‘¶Í… †R“Ï·åî'nMÁí…Ý¥rJ/táöŒJ>¬†Ì>uŽà{†“•æ¸V«õ ¤{‘8€øÜñ=ÏfñØŽoÄ"Š1¾ÍʘÄðªÛ¦zš9„—‘*2ÑùRëÍî} >º”‰Þizº¬¸2?nªI­¦ ¬²¯Ê(½9¡Âk†ÍNø¢¦•“kr‡·lI –cÁ¾ŠðÅœïHŽ‚qØ ®*+³v~–Y SÃ{çÆŠ\+øª–Q%ÄzÏ’üÍWÌÔñ³@ dú]LÕ+®fA·ËÙñ*÷Z.èJ«ÇزIõm³š© £á5û›I´+f™'Q·Ês÷2WÒ/Œ¨”@Ï»ú.­CÓHˆ~êaV«{žÜN4¿¬ÞPÝL^Uil™u‰ƒ!Ad•÷ª3û? x_ù•ˆÒ¿Bó?Bëçr|u!?ÿñµZEguÒе´õìjúÛìT%üd±b85‡X~Š ø0‚n¦«˜*ëWi‡,ÖœžÁgì¼ß'Üo-@¶šÎAEqX‡‚˜Æ4ÖUM§ÚŸÊ= m_ޔǦ˲Íá%8pø¾5Ÿ÷¦~aëKÕT¼¤UK­Âz;àøÂ²ñ‘tA_|OÿƒjÆ“ ¾eÊÒíRÇÇ®»„³7+U¤“î° ~å?|,§M4s#Ã(XF¢d3úˆð ý‘Þ Ø¨DÏgm¡ZhWöTÎò©SmÛà›'LYàfk²ù¯6u„÷ó/Öi‰•½¿¶ÛÇ»ˆiP]›Þm¬;%™GË”Ur¿gRŽºÛ+Õ5S´&½ÖZe­©>¯çL>1äz{ì2_Á‚_ÙfC*þ]d,¯ôbüH—õ§nÌz/L´)ÑO§¢”tì{4®Á’aËÖó[ÿ •°pЬ0_ÆPœ¬å÷vʨä©ìºeed Ÿsãt¸V¨%_¢vŸp‰ÖySú œNn«–ýª£™ZsÉ íOú†”–§MPÖ•¦e_3XÌÓ”ä*Ñ;Ÿ¿{@k3NŽó]…/:ÅŠ!ÏÐbCö‰R—É;Ò¤JæBËÌ;&Àÿ$ü³ê¶ãÂ£Š“‚çäÖ¯úW™”—M ÃÃÖåg3lÕ±5ÁïRbÎêŒc fL~ Ë‚”ˆúÆ´‚·. Xõù©}?ÓräŒHÄ?['–_»Ú|{±jcš<ŸiPápbXN.¾S¹éÓ¯†àûÈ×+ …¼X1Êÿ« ͆ä¦f=JP¿Z¹6w„*Íñv®BŽ –ÁZ*þ4%ˆ¹º³ïÛr·WœbÅ`Aɸä™p%›êŽ¿\—²FAºê‡’i¯›LÎ+7TÖÔî=ýƒŽ8©:)ͲÇÍ(:_‡¯¼2)—_FYåúIE$ß©3ý|ŒòŒ­œÊb:ïêm«•çËüŽ8 qêWУÏ^J˜ÕΦ)]ee<‰:²‘àû¼ðeŒÍ-—ô~‚¼²2n„9ñêuÜŽcÅE^A& ’HG¥QW¯ êÌ—¬aŸr—1 3Û¹ZvZvÍJ‹ÃîVXÁp „„ÍDµ ÄA-Ryz©%aM ƒÒcÒ3Œ I äŠ }”(ÕÕªÑ Õ‰åOt2Z¿AŒ¬–e¢2¸:¢èþËf©"É#–:‘5‘d ÿko.„•øWzß^Q„¥ø Ž©ÌoÇ7ò¿ô mZV–{¬!Æ.Ï,¬¦×ŸUõs,s¼£á y9ÊcJåF]ä¶å캚ïrôù k%»0kD7¡Ê=é1ë‚Á€Çàµ'ÀK ]c‰!ŠY”`^%ñî:£9‡èÙá`’öQ“÷}ÜÝOnêVûŠFí¨ËòEð์³Æî $µT„×BxM–0lñG»פçÁ,¢YÑùNÎ…ônóv¥Om^&g “¢°½2®Ä‚ÜM ¿h¤“ó^AÌ䘂(Æí¼*" –l*Îí]{±Ët¨ÌG‡È`ˆ¬OŽ»§.›ÍQÜÝÞyGÆ^Þ¢sÌ}[æ®5¦¶ôÿËïAòÇ´¢Lf"î±êÔåÿí.® endstream endobj 60 0 obj << /Length1 1615 /Length2 10028 /Length3 0 /Length 11075 /Filter /FlateDecode >> stream xÚµTZ.Œw+Ú %xqŠ»{ÑR A§¸»)îťлSܵŊ»?®ÌÌùÿµÞ[Y+9ßö½Ï·OhÔ4_‹[ÀÌÀ20(ü5';‡ @RYKž“ÀÁÁÍÎÁÁ…ÉÀ Û‚ÿ%ÇdÐ;:A`PÁXH:‚Að'™þd¨ ƒœmœÜN>AÎ7‚.ÂR ˆ@™ ƒ‚0$aönŽ+køSžÌæ,N7lºÄíÀŽs  ‚[ƒíž2šƒlš0sîö_!˜…­áp{A ÐÕÕ•dçÄs´ea¸BàÖ °ØÑlø£e€ Èüwkì˜ -kˆÓ_ M˜%Üä< l!æ`¨Ó“‹3ÔìxÊДW¨Úƒ¡+ýeÀø{8Nv·ûÛû@èŸÎ ss˜=êZ,!¶`€ªŒ;üœ ‚Züa²u‚=ùƒ\@[Ù“ÁŸ¥ƒ2âêÐS‡÷çd;±;AlÿèøG˜§1KC-$avv`(Ü óú¤ Ž`ó§¹»ÿ¾\(Ìêñ/d ZXþц…³=P qpËKýmó$ÂüÌ ðrppðsñÀðskà ´ÜìÁ*9ÿ?õàåa³X>µö‚X‚Ÿ~0=œ@.`ÜÑìåñOÅ#LNN€Ä0[A ˜ÿ‰þ$[þ…Ÿîßò`ÀñD?NÇŸŸŒžfƒÚºýÇüÏ+ê+hH¨È³þÝò¿•°×ܼ€×\¼NN.À›§ƒ×ÇQAþ®ã¾òPK@à¯rŸæô¯’]þæóß ÂøïX*°'æ‚Ìÿ!º!/‡ùÓçÿ3ÝÿtùÿcùQþ¯DÿߊdœmmÿÔ3ÿeðÿÑƒì ¶n[<1×þ´ʰ§]€þ¯©.ø¯ÕU[@œíþW+=mƒ8Ôê‰Ñ¯9yØ9xþ’Cœd Àj¸¹õ_¬ùK®ýǾÙB `5˜äæÉ‹ƒãtOKfnóôŠ8=QóOøi‡þ;¯4ÔfñDzqñò@ŽŽ 7̧»~B¼Χ­´ø“Ì ;r<õè°„9bþq±o@Т¿hþoÄùD< ø ´üä­ÿy@È? ?hûøÙî?ð‰§@è?àS"Ø?àS"ûÀ§DŽÿ€O‰œþù@ø?àSCÎÿ€Oy]ÿ¹ž¹ý ÿkŠæÎŽŽOOÊŸtñ¿ðŸïülŽ97 3 x_Ð|U)NéúúçNÏIغî¦4¹Ë–ºŸ¤ðõ)wnø¬xÛä¯ðëUÂ=®¢Ç½ç6Æ+ž©á‚Ïçj›Q,Í6Ø<ÇEnöœ”œ¹~)¶¶¾3å†ZX=?üªÑçzöv‚…”ÍáøçTúެ0ã×òË/Ö‡hLõ¿Ù±‘F"ÃÑÈøù¹±‘¾‹§/—¨Ÿ˜l‘§w:y;²ÿBfç:µ{‹w½g¾„ ²–J¹»‹c¯x–¾+š²ÝÁG¡h:˜`Øì&»aö;køÈlæ4¤)F'”!¿9v"w²)¯aõU®w¹;Yr5†öhCüó3¦uc¡W­REßÂæµòݹy™J:JKe‰Dd0°ºf1dÆT³&PôTªê3ÖrJ̘HÍgL#ªWÓ<õ˜á7Ç ÷wŒ‚°I|±á£á‰ö~ÆÖdÉo^¥×܉'‡Å@ƒv|ûrÎO'Ê“oô`HV’M’úq ^ôÞ†2¬ÄCGu™ý‰y埯0þX¶È•Çȳԭl†—%_¡´ìrsQŸ#™ìg¢èà"Õkzûªž—×ál3&˜ÞïX¯ê9ÉŠÓÖl0láÅö 'ÓŽ[4 ?ÖEé¼yCXnM—•HG™Š¦5:– Ç~¦$‰øÒ*cò›†Æ=w΂—²¹—iÇIRlÞýÇTÙâ C õ8ÔÑhúCb„ô½WìX7ýõçÍ.,œÞÖ ‹â15£òúâ\ý"Ñ£W…q<#iHƒÖ¦‚V”êVŸò¶@hp•Õ¤>ÚFº|D©WÇô½%Íé„ënn†Ù€"U„>^Á(1M_|G:®†sÄ@ ‚(ÖS£ý–î—çeAÕ+{³]í:"FØÚ¸¤üÞC#›k‘Ä€…“+ž`Z_Þ-¡§Ï[…ÞÏn(ø?°^Í6Â2h·J YÜâØ…‰ÐÇw??N[©ØêïÈa-Þ0çßP¿§g¹Ž%’\ íýqeá¸IЦŸíÞÁ0,EaLKÍ|»TâW,VR±pãTŠä$@/çyÉK…¦Huu5yç`žŸS¨“ŸÒ°çµÜÛ¥¶0(Ïô !m½ø­ùö%U“/"”Æþ × ÒÔaë Ç”'†ÄusŽ›ÔŠ^=/®:jÀU ¨È£‹¿AÅ6h¢üäÔF ËÁÆ@øv+?¹Ým*¾ðñIôšÃÿ.Tž3²ÜoBÕ›³µ<É}}#3â9 èÔ`‰sž©÷$âU¹øš$;Ÿ~6ï“',t$°Ñ @ýy î5_å8¢36I|«Æ4`@}S4&+^â’AÃJ?k¼Ïú ޲ßiÝUSŽÖˆæÛµ :+÷’òùh ýÛ#~¬œ²Ï[õÒgjgµÇºÖµ]³ÃßÝdðIäg³[Ýj¶)xÒJJWºzIüJïþž¿SÎQÎÍhêÈ£.èÜ«˜âúýŒ*9éíÒz1 ‡!dÖø &ƒjØpÜü¨ ÑÈõÉø¾+œ~V·ŽV<÷&µl#òoŽí°/ˆ¡J1cÇnŠˆ¶ùìŒÛ…ú"ιg«ðÞ…`Räaãþ8e¤çÒî#àŸZú~æË¦f`Ñ`0[âŸ{_œåχGmwH’Vç€>(­þZ’gØ)I±aòQêã—“:Ã2? nÒ~’ Qý…‘¨=&åõjÔ‘D Î”EÍZ9"úRëƒÄÖ"Iŵ.9£¿üñ¡ß"•ü¹}†øy!‘õ«Æb@'›.Jeç6åÉ… ^^%¶M‘.×´,ãÏH¸M«µŽ0}±‰–U¡ÒÞl½óý³3sw±CãÚ ·»*f¡²l®ªÅýݳ¡×³WÞo¾váŸÞuüRȨž8ÃaÐ’6.®l”i9¥÷K¬þƒÑËpHãUê¯#¨¶èÍáÇœE†¯÷ÌãmZb±äþ©ÃìÄ8 N¥gìµ®õCPPà²Ü—Ò‡K:ÉÈצV"¤hå–K,˜ZñÕÒ²A>·Á¤à4ygib˜˜ ¥Öoj»“@Ilt-.ïÙ˜¬¾c§ýtö/ÀáçS¥Í¶î+âïüñÖ‚{ï_@0Ò¥~šSóÛP±_ØîWtàyÚzÄb×K¯? 1¥2s© c¬A/'ª&¯0m »$ïf}Ws×"Ò™<_O8ù¹’Ló"‚7¥ ¨Á·Ò¡£ÃÕÜóɸù9T‰W]9¼‰Pêož._D£_ÑXpPïìëY¹†¼WG[ûY„„?‡¬*pÕíþp3bç¼Fß@`çD0qlm!í*‡ RE´j[ééÙ–aµóÛuLàž~^]üŠ×S¤tÖ@V¢ÎB™Æßó,Êï–˜äAüù,jHÍ?£Ë:l»ùÐjðÅL`àëòµŠF±c@:‡"Åêa/ûFsÔo3þ.­œTI065ç}¬g ´˜-=iœ„Ã]³ßÎŒýµ äÜ‹>ÏmZ^¯U;m=Ghe*N•¸Ê2r ˜å“K ëEãÉ\¶"»LNø`‰ê%óQvO2®ÑÂ\Z´¹Oú²;bÀ6«ïâÌ^r]û5Úɽåôr¸o*5Qãzî¹âÿßï28dS­¶vÁ».0ÙÛ ÆÿMµ."ò“€$ã45ß%m26ø4ÿ´´ea˜ÿJ›× Ñdw«}œeç Œ*b7°v3à'øxÿ•s2߬ Gª@àžÔkPÆ4yºõ Ç¥ùVÃ&4GcÑ¿Mþ"Ä¾Ö ¢)6äÎ뎯Ѵp8yŸAÂqÔ3tø¢ÖòREað;^F®ã㽜çÍ ïtGéZ•ÕÕF›‡Ú ÚF\ .š€§.oßy\5QJ|”YâÚ©òã+j€—Ì¢…žzcì@Økxï¯Ã†o å"óÎ,Ÿ=`ÎÕ±™ÙKEV’´4.‡åRKKu¿¨üvS”g´˜Ðmb%¼0,ˆÉ5r ½Ìø•.QN¨º(?=$V|¶ö71Ïö€‹œ¥–LtCâÏ:[xÙbõ›‚uÿ°ÛBSmU‹ãËdÙ)æPãÚ ŸIWÌy7u ¿Ë* ?<ÃXÚô¢¡¤agQÞ%Žp“òàÍ¡¯%bs «SS¶”{—Óq7JÑCý.kûŽOKKèOAQq¨ýpzî+£ÞcÔdþRö‚VÛ[-ÿ@!×R¬‡ËâIòÏ•%î}Í…«ÏGwÝÁS—èÈK6qæ"î½Gç Ík9Ó)SzÒ¤ ž.‚<ÌÑðUB¹9Yãt ]÷Q÷~|ànkÄ™Š÷•Y72™ÀÊz?rd-ãd…×|]Æ+ôEÌé77A"[Á@Ï›:É|=®tßÉAÝçm4®âÉ¿)múú™´”…ßjŽûD–·Qã·$/m+Ý>ý8ø©…À嫬[ÛjUl5Ä]yIŸ<9×63»_¥¤©‚ÃÛ!#²ÌÚCC7Ãö쟎Ÿ´ªJD5Q)ŸVGúJt¾(H‘]”Qˆ’¿`¨-~×…b!üÖ„t v©üsM'@H9ky„×þ€¤lw˜Téyø®23[e´ç ±kßîT,̾X3/Pnϲ““ÿ@.t¢2©¨2¹ÝÕ?Bæ/Ê1È¢[†Æù˜bÓ®!NóÆ° Hý äÒêBúÚ÷K²ö(JµÑ ¨fЍ|â çä‚ÕµH°ðÑÛÕ.%žãVä–©B(’q$ÿ*1w`ÛQiÊúE°[Ç=‹ŸwZ ÁÙÌî*ï¿îX¬E]1-™£ÎxOáéeÎ4§ï‚UÛgü’ZDÄd6ViÒfß`j<ä#{¯Þ< 4ß‚ÕÕ•ÞìÍ5Hì²Æòñbã¦[®ä:ßúˆ3ìüþÊà1'hÓ“ö[«týNí´}5‘5Ò¹§Û}ÉYq'¹æªí˜?^©œåó–ÅimÑä Š·;(ô?«˜ßdƒ^RF5çfï“—xnmö¬“œëvÊ?×ßx3ªíýý˹I;ŠÆ!SŸé Ò¢t™³\OŽÜ¡RϨÅ#Ê<@ë{ Ü ûvpâxêóÍ”uöÖA†Š ëÅíNß9:^õIZëfYÅý‘,Õx¸O E?ÄŠ^tÑ ßO|ïJ"Ð]³²»˜èvŠñ®+KV,Ãy¼L©÷àqkæÕVÍ®â#A=êáB‰ý[(››OÏôóa§BÄÁî*iu¤;þŠz .ºLô(dg¸+sýÝ, õMp7QuíÆPþöÌ:®hSÏ|Ñ›Ì2ôÔÍÈRÎäÞXH×MN;¸DGËòrêþõ½xз¸f4 âú!3ü…‡Ï.¶›äÙ¶¤™gøX Ù,ü†¦T¡ªÄ7D6íñ y›Š{šœ'ßS6@uîKºmN¹ƒ £R•(èzr7„é† qï[|X¸?,2@ï™l-$>Šª…7vĆKò¼öUo^Ñ1«·ú ¼›‰¬ã÷ë_gâ9úkkžÙð¿Å½ ­èǼ¨dÃuHïïˆ_D’Ú mÜáQ‘(qF?iÛpƒã¹Ù—5ö&ÐæG%±‹u ÅWLm l—Ó·ˆ)C5¼£u]%hrÏâ.o¡F=ü¬ò¼®úFr.D‹Õß…´i{S¨ÏüW#TÈÉÚQxNÒ‚F—^-¡v‹x¼Ëø­Í cUb^¹¯¼d26Õ¸ôû8{•:8Uúµ±©¯WÊTˆi´ÈÚÒQZ¯!«?3ÅܰÝîöÌü?ŒYj“*ÅDë¨_æ½Å Ò^|ÍW^Ø™küÆ*ÿ¼¦'~D£kIîÚsÐ`'®2Ôì«´v¶Ñˆ|ÿnJ\iAõ¸ ïÒM¡L=ž…ªM ™ ^X¯·ÙšICõeå³1rÜôêÇšçâPÔñ Á¶Øè7€Ã<›D+"è/¨Ã˽d”RLk ¾Ãã÷;óT"&DÍÄüªåËâTy`ØËgëª EG—y5[‘ŽÉ“RÈ¡‚A½ü/m¸Ä‚É´RŸ°Ý¨èoaÈ7ÞîÔHHï (´0:6¿3Ãx>P©ªÙ#4éí #`ÞGwUPjnžLþm:µÅB©7ÏŒ£'i°• üÓ²u÷»™£j b…Â^€è«IÙ,™è9ò !I&°­¼¹ž€€-}6˜/g:•q=GÚ.ùJþ,’]CvãqX<\]€Ð۷ÕªûÂSQ(¹ ­xPŽ#Šü!¦ö–æš$'ªKyXü¢¸r»2-æ]ó*R$’GËÓHê§øñ£€úD²ê¤ÑŠw„üâ| Šï”­)“ì¤/eíõ2'³.6²L„š(6_á&Œ­XÍÕå†~ÉY¢é-diñ–%®”fF¢ž¦wTŸ†úeœ¶d/ë¥æ'3<6ÝDzž7 ÛGOQ ùð’ŽÃÌ)ì#¾S/†_¬×‘¼WÁ>75[·ñø¬ç}˜ÿ1·î¯6 Òg·¢gÒY¸f–¸ý†,¦MuZ–$ˆÝK>™mŸe¢fކÂý%HŽ#‹ŒwæNÜÂ…t¯ê$€ÜoÈ&ge~IY—9ƒ_„Ãz‡Wý³÷\õ@›$aýfÝeqoÏË ‹¥V-´~_Ф«5ÑWÒHs®­î0ŽCg¨Íüì>‘-ƒýíU|pï) FðªðeºOñ|g‰bûQ"pˆ´&àßTBºU2üi)\"8Í@”ªŠSCßVP<ëÇc€×8}DÏÎÜßehÂVÙÂ.õ4*ìo^¼µ:®7Ubß—J“°âXË㎠>æ¬OŠÊëiÝô òG?±9Ø笢d%Þ+ì” Što'²¶>Ë—:úatˆ}‘7Fzà­«Äàr¾+o¢¾VSdsˆEn°!LûÊðÈ*}ÙRùþí{#§ŽáOÄÝÖN‹›pñZ¢dCÜ9¥WωJŸØý2íO´x,èʳ¶‹µqS7ÖÕzïDLQ­¹h<ªŽì-ô¬ÆvydÎnHÁ¤Ä”Î7êZ²ÑÝao÷¨VŸ)× 'V@„Ý•Žº“ãýÎnó‘è æ.21"ÕdÄûÆ«—V¶\òгzJfÆ#Ûc¤¯òm-Æ6ÐÁÖhpX.û®gYá6½„YêðÙ&`¥Yï;¦êü°ÖT´‰¼°1º(aÓ(„1¢0ÔÔP•âßxýñ~ªœ‰yó®ð·h:ý7ð´OO°eÏaNÿÕà ‹pd¬ŒdéaÉ‚ª° ®Ò”R¬ÉŸûù ϪÈ*ð]AødÁBûf*BÏXG¿…¬DŸ¾ò¨«´t˜ZuÇå|£ÿP¢mZeÄ¥q+.yç+Ì¿¬»CîÚHÞ&0Äæb@ŠQö«å!–…ëÝQÐl¤j>“¿©’7Æå1.m›‘[é8›Rq·b:žå@~½ª:rúÈSÊ_W󽿞Hßv‰­y,—ÛpØubUá”k] nu‹ ÿÀ·_äûï.çÜ%˜a´aÄâ÷“‚)å´X•üغ4Ø/™wËoÙ¢oO õ|楷>¶·…åÃmYM 4¼‹V[LãLcÏjΛÔ(]FiÖ}îuËãk¿ÝVoäù.‘Ã;ëDä5y—ïºãjC`%ê,¥ï'}ºbh3ÕJŸ!Y¨øËfæ€ÉYÅgO·)eÍ•M3p_Y[@ýë °JÅ6p#;rDÌsVL¥ÎìÏŒúD±5ÙÜqsÉ]§Þœ|Þ^ÄÂI\ÀœWFÒa#ñ•l©/ðCÙVÏÁÉ•Q0»»S]@(ÉMè…â~9AÁr(LùÀÿ0XR[eHØ{Ênß +‡-†e/“=RÃz•%Ô<‹F_ͬ4lÃ# ÀÉLojW™iv˜†\‹pÌÝJ‹šÕÃDz›X|:²÷ìM‚µW(úu ›Á~äét3âÎb/úùw‚v±•ØÌ:J¬¯„am/<|5)I©T|ØMuMX>Ôño!ì€î™Ý³öœÁ_ÞØD˜~—ç„‚ó¢Ù¦á6?qÓÉ}©ò÷^¹¾®Ü¦ý¹oqÄóŒÛkmh­ |ðƒÆ˜Ž¸½_ܺJÜ!r¿´mUæòLË£ÿogK“÷t­ï;^¢ÒYçs“´Øzž£™Gb‰Ùºâ†Ñ¸*Iù}a C4èÃeOšoRŒ` “/ðŠüœ;|O5ñEl1gOœï¸òöuïUaæ,ÓIiË![V i ãÎ ˆeKò.Ý“9ηŽ}$ÂQŸ ÕEšU1ÑkúÉu£+Ùw­ˆ$/_xvÕ^båX#fYçNhõÉw¡7(V4Ì8‡öêbøõ›Y}ì{‘bG’ã×çâ$e€OþåQë”<ÎpÏŠ_;¸ì^eƧo($vžû¾é´4g\ðrX1µE÷弨ñ„9ZËr›1pºnø+«ÊR2ÖóÛûøºo9d(U÷ØB' áŽ6gµZ穆‡itˆÄLm¹C^3høU‘BZ=¥•(‚¸˜L€†Éç`G:ºr‚ì´˜b&‡uªDÞ/æC»ž¥ |ûq"ÜH³{lßÌí¦ ä±„<F_s;Hf—ë¶ WÞ†§î$j7Ñy ÔE`T5Gf|§M Ñ¶I¬íA ºí‰¯¡Q‡Ž‰1r‚ì:-±Ù"!™)¹Ÿ~‹‡n¦X¡gsøð•´vÿ*ˆJå•vÚa%Îm…ô—¨Èöó6>Þ¨~i*§‹ˆÎLZsœ`r›¸ÉÆú°D®ä©€˜¹…”¾ãr±ìò_.äâ|HGÃimfɶ¢V?ƒ©‰Ž©œhÖR9çMˆç/¶Œ—¯½fvâBðõíð¾’ÐÂzØTb›â¼6€ÂT˜Wù<ýýâÕ.Dî¦}ÆÐÜØ2§htªâצKWGß1a²÷ŒÒ¸ó¡Â·BdpÍçµ<ì]ƒj R‡ºË>£s? ßèËü)U ¦û%ǧñ(L5 7w1èǧ£Žß´ðJè~êìᣇÒU¦2><}f‰bJ£Ä`„ÕØ ³ðͰ s÷Æm“MÂ[§ÜQtZÌ}K…wüV.P¹S„`ZJW.ø »KD-…2žBK/äÐ#3ƒ««N †s“„¾©ãSLŒ±‡ÃæDrCé^ÆÇ‘œj$Œ¸Š1^˜æx»‰eû;i-Zó_Æ€«Ö­)µF°d*ÏÒÍ%¿˜Û[èÖ(¹;* ;¾¹qÓk‡|{ßnÓO#£#mLvÔë0•‰7ÊðØ“0ÚòFÙàkÅ :±>Ù¯ZiYRH.?BÅP}'U/1–[Õ§u‹¥—~÷µ(Åñëþ-ÝäÏ3qþ¤¨û/¸p©¶(¾òòÕ¥ê=“‰ÑÀÛ[uùzãf S´pú«¿®0….³“؉¬)³Ï³JÒa _ÆEc!$”"ƒ¢©r°W¬ÿ•­ûÍ«ZŽŒ¢×‡üÐ= ³÷Þ)˜!5u„úêºjs¼#é¯5º.yôvqUœ©Æ]ÕÜÛ֦̄* ÷ \떻ą<ÀErjùx ÆN˜í„‚üiN†™¿šüüã©}-ï~|ÝÌ›B2¹TfàÑ|`ÎÖt5;þ.ÆDù0ÁL÷¦ãÇÆï–ïÖ©¯~êמcÖ@â¯h„•‰) ·SÞÇ;¢2Ì68«kgl¬CÍŠ¯¤°#é&ªÁø’UD¢<Š¡ˆ¢ÍíK_´q˜b,Ö³¦°ÖµÎÂЙê6%ù‡*åx|ÔxÂ@[MÀµš›F*Jc ‹×4¾ ÛK¶ZqR›º-ý­¿ =É'®Î°ÉlvÛš9†#?ÏËö&h-»Ù2dŒL¨ùtWÐóÙ/RŽÞ¬˜Ö¼ÕÓˆ äýå‹ä`FÑœJ˜u;U‚!¶³ôË(SÙöªàüí¬‹ÿ¹Xs¤öÇù´ERQï^óÎÚ¤Få—EíÖpV¿é¦-Í¿®ÕM±l=rËQ/†óç××ÞD´·_¼ª'F ¿žÿ)_ùš¸ öž›­§ÄËÒÌßLÕ…²RŒ!ÿø×‰ì÷fÖÈD÷°1 Q~bZh³¿¯êȼœ×œ3pæ€]ƒ£|ÐÂÜ’ý]F!ô¤g×ê4ó…3\t8„ÇŠC·fÀetCBð#ýF‡ÛXÇšÔª¾½5¥’ßnã&UÅøé ÈW Ó¨pE_ðͳúýîü§{üTeîP$öUÁƒ÷uýÒ9UobEŠõŽ©âoà|+úÅg¦Ø71R‘¸ùˆJ?ì™5Áå!Eº÷osâÚ„œÍ¶ÉùÎãÄT´¼]-øY×^¤n•¯o c *íPýˆeÿùЇóŒR"jYS —×,ÂJ¿Ñ>³ôÇ&Âgpyÿ°Q˜T ØNÔ-»j}àÞIÒ“ã¶ä΃ýèà Ñ=Šy n5MäVÐiЗ\(S‚é·Pz[£6¿ã¼‹Ñ†­Dâ示øc4@áwtÖÊ‚¨8¤ÚfÎ-ö›Ò‘¾R'|ÏÙ½Ô.&äRä‡NÕ-òóë@iÆHá|,· ÓxòHJwi ;áÌÇ•ÍïZ.Oä3òøOf+•'cf Íñ†™âÓ¢ÒŽ"´?ë—)ùé˜&ï?F@ìVlsF=ïÔ íš !2Á{ŸdfãÑì(yrïÆþÉc'Ô¦ƒò€Î@|+9®ƒ1&Ûû{¾ ¿h€\ -:Š?_´3«³Œ5ñe¯æñI¿k ¶ˆ…ᜳ¨ûòÅ-yöÊfêºbÓ”1÷`hµæþf¹šæÞ•ÊVÁ¾oFWóRàŽ©åþçá¡?áˆ`À$²L´²±7 Ý/³r(uD½†õoþ%·—û\e6ƒªóœm[ð`9ßc.[£ tZá±J¼6ø¥ÂkÍÒ{îëªæ8¢,öSÉcM¿®F{Msöw÷¥’×&ªëŽöMã§z l_œ›oæÍb%èžøÛößP¯ÄXˆ!õࢠ'LÃÏIĹ’QoËÖÏ•ô¦$·omgRVÝZ}®ùr¸'½^è¡ãÃ4;îõc•ÑÀË>ÉVb<Ådn@˜bÓè3N!Ó’"uKú!ZªízD%×ÓÿæÇZ¹<âÓ_AÅ0²¬9Ô™YȨàÇ­B[O=DÉã%ÑïåŠt•š&Oi‹[­;ÛtH]õÈý‘áJìGúØùÉÖU®#0¯D±¬S]oÃDüÿŽ`G`ÇUÔpìWQÌÏÂNvn¢œ®ÏFn°éqýÝ01¹òxi÷=öo¼^eAx‡ DͧEsI¼·ÌR.Ñ®egå7Ï¼×Æx{òXµ\•ùÆv*Ûãô¹¤­uú€.ˆì‰E®—„‘+²A5•ÆêÞ€é>Ç€R‡EÊ4SÛÒq–Nܑ٪ø5õg©.Á]këèé"&w¨˜³¹¶ÛÈ>f»‡ØÔ —lÏ_­Úš…™dßœQâ"¸J1åÝè&Š Š}hÁÊ~(‚R Îh°ã¡#ý„Ï犱ìÞÝ5¾äöãU=CUqKŸa»«È'¯ö¾«FP³±PÕ/©d3ÌózTÞñî0VÁ*ªlK¬™ê%ïrôK$Æ'Ñ‡Ž §àÜéŠ ñÏüòïSè›ØC^¥èVM·J%T©À¯”Å9tüÀA…¨ˆ©R*]lÖðm‹ó»€fÆ{9.ó[G`R‚¼’Ÿz'Eèw[¥aÊÕ GVLL­ÇT–­µy-£,½ÿ±Š endstream endobj 62 0 obj << /Length1 1970 /Length2 12978 /Length3 0 /Length 14193 /Filter /FlateDecode >> stream xÚõPœéÖ ãÜ%ÐÁÝÝÝ]‚kÓ@ãî—àîîNpwwwàz™9sfæ|ÿ_uouUw¯mÏ^û]ûy)?¨¨3ŠšÙ›‚¤ìí\Y™XøâЬ,v&6$JJ °‹ è¿v$Ê 'g°½ß¿"Ä@&.o6 —·@E{;€œ« €•ÀÊÅÇÊÍÇÂ`caáýo ½@ÂÄ lPdÈÙÛœ‘(Åí<À–.oçü÷/€H `åååfø3 j rMìŠ&.– Û·&6u{ äâù?%h,]\ø˜™ÝÝÝ™Ll™ì,„hî`K€Èää2üA db ú‹%@Ãìü‡º½¹‹»‰ðf°AvÎo)®vf 'ÀÛéuY€²Èî?Á ÿ `ü5+ëßåþÊþ£ØîÏd ÐÞÖÁÄÎlg0Û€ÊR L.. ;³?MlœíßòMÜLÀ6&¦o¶nU˜¼1ü‹Ÿ3Ð ìàâÌä ¶ùƒ#óeÞÆ,ig&nok ²sqFú£? °ø6wOæ¿®µ½»÷‘9ØÎÌüf®Ìšv`GW¬Ä_1o&¤l ' ;äy-™ÿ8@ÃÓô§“õó_o{€ù /Øôöƒäílâ¸8¹‚|½ÿíø_„ÄÊ 0]¦ °Ò?ÕßÌ óÿà·çïöè±¼ÉÀòÇçïo 3³·³ñü'üÏG̬)«¤©¡Dÿå¿bböoF#;;€“ÀÅËðýß**&࿺øW¦¬¹=€÷?;Mé¿ »ý¥š¿Öƒ𿵔ìßt Ðü#s}NàÛëÿg±ÿ™òÿOãTù•ùÿíHÊÕÆæO?Íþü&¶`Ï¿"Þtëêò¶Šöo›`÷Cµ@ÿY\EØÕöÿze]LÞvAÔÎÂæïA‚¥À 3° ÐòOmüǬùÇžÙ€í@*öÎà?n#+ Ëÿñ½-Ðúíöp~“äŸ.ÐÛîüv@{³?–Œ“ `âädâ‰Äò¦$6NN€7ëÛ6š<þ1€™ÉÎÞå-ðÆÎ`nï„ôÇ#åf0Kÿaúñ°˜ÕþAìfõ€YãÄ`þø7âå0›üƒx̦ÿ ·LL€Ö ·;ÖÜå;ûßöÿˆäo/€ø7úc(Ìfÿ‚oå@C®?£ë›nþ xã`þ/øvŒÅ¿à ËAN3ø_ð‡õ¿à‘W~kÌöø¶cÌvÿ‚o­Øÿ 9Þbßîý¹ßÚrøÇý–ëðvõÚýÏH8Xÿ²þï@8Þfíð¶+öÿŒý†£«½ ÈÌô_ ²¾YþßÈ9ÿS図‰ó¿Ø³¾þ瘷ídv±tý»é·×Á·y¸ý ¾qtÿ²½qòø|+çù'üÁ]Þºüy§¼©ù¿øÏWä"­,Ùùƒ­êƒ;ネ¹3îM ÎSîi¥Ñ2z¯8u¹> Â'ÓÖfn8݈&õ£¯íHÒ\‹¬’>{Ÿ´5‡µ'ªv<ú<Å«Ííu }›Åž):mzH̨!²ïóìèó1Àº ²GŽ2ÏÑ•U¥ëÎ}PÚ£a¨âûdèÒžê~-—<òSÅWÆhÍ(ý€ÒÊ|ÓìE|28Æ÷t˜¿<Юoæ1sg^Iåâé‘|O£Ù‹½u7Ùbî½Ö«4Øœ{ (tñßC_cNÎQy‹¦Èá-{—•Dm.ç°Ð2AlL‘úLô|øÉ§§ ‹‰Çbã´Â+=IáÛÑÀ =ð1kOÝØ®ÞáuŸÞÜÝ]Jº@¹µdÐp4 ñ6܉ÞLÑ-^ÉÓ{kæZçäZþägýŒž×¸žù6"Ò6ÎZ‹ØºÄs˜£/¶"ñÕ>O¯O‘Uf9E÷€Õ̩üǾ‡z×p¥ä™+*|Qr::VQF37åXüu‡>b-o‡)¢~­ÞÁª”æw&Ç‹ýŽŸù“ºi<ò^îîÄMž6I3%²œ¦˜-¤VÀøŸº8UP¨é ‰Ü¹EKcòu|wä"rßÍjDæ:¤N!§ÃnûŒ*òÍ0È-èëN[…N"`t³ÃLüZ[Rµˆ#”®±#d8u˜Wwt뇋‹òÆ!q‰$§Šõ&¦©ò¢e‘û9ooP¢váRÐð-¬Í[•ôª³(qÅžÆÆ/k¥ú…-ÔÒåË >OÅ ¨Ï«¶ö¾¢ÅV ^WlëM$®|!ÿ”6©;ß§ûÍsÜc´6ª>¬n$@‹JB/~þ"“ ³i¯}‘ŸŒ—¸#DÅ÷Þ·;~£g`ÎäzÉŠÉèy::ouB†´iÝn?ÚðønØ=vl^±ežÎöuw_§&{Rèt …Éi«*ÎÁÜ›E¢×‡K¤ò ÷(›ßà˜¹¶ÛÒgf–é®TMæÇØùhÛ,›Ã5*­5¼Èõo’–‚_϶Rƒ„ëç•ï³S{ˆVÓÇØã¤ä?Éâ†s‹àjp‹®)>*« F0ñǬÇEɌӃCµërø}ëîr°÷­†t´¯%—]+I; 9G:¾Ç‰Év–låG¨pŸÊó¸T»¢9X€2é ‹¿\õNQÜuºR2rö²Ù:õ\f¿Ž§¬F5f [^¥G´šfm½Ð­¼‡¢ðG2.6Ž ¨„¼ ÉüÌ€N˜wQNSî£9w>\~eŽw_‰%ÑTär‡¾`–Ú_š'X•™Å9õ»Óž¨¹èÌŠ»ò,òšŠ»5ŠAK9>¡Á 1ëN¨¹6+uTwׯšä"9øµe½@e®À•` °^ÊPM8…1;9û²¿Ä7Þ0ëÃc«…ûí[o>sI^n+{Hå¶þn¯ï&^Çs¬ÄG´Ÿ[˜6Óýˆ”ôÔ¡n­¸=æ —ú ÚYu³mw-Â-±ãÜYßE?ÝM²û›æÊ„eEôy¶ÖóÅL/å—¯G&î_”<–™[œRö8ä? €/H•Ih¨½Ëcë'PÝ+_Ô÷ÕA™Ô<¯sDÛ l3Ó½û¾$·RÕþb‹eöóÑíñ?± a‚úRÏtKráOV^©“ãªCQ!•½ç¤Ò>˜lej<ÞÍðs®g©ØŠ.ŒÒç}\÷Z/LÈâ’†á³j "媸!Q~ù²Ów\op«¦–Y!^,cXËùÌK~%ús‹^xDì„â`m„öX$¡ž¯”F‹zŸ: âElHºâ£S¤F~hò"®Ø-XŒÁ:ºì€ ÝoºR’,Óõ¢cEgó¡Üø\cÎИ¢‘&¹zžÎ6ýá=²<5šüö< µP.F–䦊Ÿâ¡w„:»4›ª—~î¦0ã¯EC\íhjÿï‡×~R¸LŽ–i°·:D¹—6&eî“+J5šS¥ÆÕÕWÛмup»FØr_MÝ?l§¾›ìt ×øšQ-Ñ m8ƧåøÁÀ<œïÞ‘hüzXTE½×o¼ii×ÿNC#V¶ÒNæ3Èf·¹£k*á2æv Ïsýfi' Íÿfy@]Fâ¾J#S©ÃÚ¶Sù9O³g®ªŒùTùV‰Ò˜ê”Ø;˜_~ˆIü<%Ï[Ðã!3Ĉå¶-ù´ÀáaÄI¾›·Òþ‘1Èp•Sj¶mÃIm:aºîÈ"sÃPNürÈ3´…¨¤dw«;(} ïè:EÒ2R·¤˜Õ}Õgñx´`Æ ÅoÿóÝ`W æV{7ÚxÛán¢ ‰õ¬Þ×Í_â”&åÜ[”pÖYqç½±0ã]NÓ„/ºæe&f™á×ÕRšÇUÖ·\EHí§o¢Vq>Âü²æ<¦ÊÔÉ?“¬¸ÿðÁ+ÃÏu¯TyíHÁÔýˆ>2– Ú–ƒWþÐ[ùâ5œ?2P(ÉDËS(šåbLŸ:m¼rœ„PSâä…m¼ÿÁçůڄ®fÊì@9ž–ÉE–ØÒ1~ù%œ„Ž:ÏñÌ¿½Î¿Vè X gDqˆ}˜t4v“mПWÙ¥YÝ'ú§ ôï6‡áo/ßxà7’µÒˆ%†º:c¼×~×c'Žš¹'ù,£H˽z1·dÊPwëR^Hÿ¦8]Ä]´;¬‹>Y„ À½á]«àðcàö#-%æÖ¡õø{Pðiº†}Ñ“¸/‡P‹î«Óèï'¼>MÝW^ÉŠÜ¥éš-×xÞU¡Mc{Çî)æÀ¢­OG¨Û)±ê!>Y漤ËU½ÚL®£bæÒ¦’OLîZü!éö ½ˆxÅb ÖÖòMÞð¼æO 6G>•TDþ_ñQGMè (n>¿ïq#_k:åÖ<ùM 4ÃWBP·@a‡Ùµ*¡Í¦O³Fe”hý®|/[yý¸ö®<Ó1^‡F)C³ ±i’%95H.=F ºŸ²¢ç}#¼ˆpqÖ¹\qñcj$mÅ]ZÊï¾Mø ¹ ™<§½¬}Ïpfär ¬¸ÂXŠ£ÂXdC™¦¥“ª}¨ÄçÝmæÀ–Ùù\§Æ®Zd ›OÑç©ñœ:µò3‚ê{'fH"áEþFðœ‹2Λ×k8ÃÇÌ—Ûí‘“Ö‰×]÷-vý’žó#—ÎÐ}©9l’g“öDîk{Œ”e7Ú¸ 2g˜½ã a¼<Íœ¦ð=P̉ò»&I0¹å6æ–.î‚—ç{oÕ³Ëw¨s ‰¼¼ ÚNL›ŠçÖ*¦Ÿ† ¾!±ä×õÜ•LyíÈÎWFÑjT« ˜g(& ,;eÎ;ƒ(:Ý ’LƒãékHyRDt×¼Í:åHý¶:ȵ . Ó1Þh£}3Сv¼RŒ/¢kÉþÔNÔëµÖ.ðÃ3@s_|V$4U§0”(W }bÃÖ5;tšëÑWùˆ@’IôIc±íS†{ÄÇ‚Æ3‚<¸F"µ#²Ø÷¸Eõ³MÇ¿¶PQQÊíCåRc´ú¨zpÚ|´tiîƒgeÇDöæ¹Í” ÷ǃµ"CMâ/ jתñrøœñ(áÝHèÈ&áHÒ<–·­x•dõaÓ†9£-×Ñõ#îwHLpúj-”í¨ypÆžF+ªk>àJ.„Ró¿ aÅ„í„fûQü6ÑØ—ÍWÝpß“åO›úk|I!S%Jrw˜¶ÊÄI\´Ôf½mà§¾.›…m4,qD˜¡9ÿí÷ÐÇ)Ý‹ âA7Š3™6D&"5B4K¥·©Ô ó&s}1rsú¨ü· 2Î.å 7°Â2hÂ9Ý£#ÿ‹ÒÜÏáyM6áK ñ3lÕ€Jlr$_Yxy½Àû¡p†îù[Ñ´s5•IRxk°À­–ä^bQÊæ‰q¸Ë´rx‚Êp†Ídì†7>‹ò 卨ê^žRÞ»zaX–¤T‚ן/ ¿“´ëPVÜK$™(Áí ™`:ur,'.ŠÜ›uW¤ö%¸Õrb7@·gq‚p%ÌÕè[€‚*`¨WçÊïÚñ<ï_2fmm#ý3¾óKV×*dÉøT«'ö© k_öÀ÷”þº›xßXºwð¥·c­Âæõºžè>}0z[v¬Î…Š{±ÿ TtÖ×óÒALGÃ= n®ÎW#_Ã$m:<0<·rÊ'sÁ"·¤cáå—v‰½Kk>­èª÷FÙÝù0hùK^|e™— êDyªú²ÚžéÒO¼o±¦XVcaåØPî]®FC¥ÐøÄ,øìÅF=¶‚Ð̇~ªW ®æWÛHÔ²ˆJ0ÛÂcXŽVé´Hã1'óõô9Íù¢˜#sïg ¶;ʹ¨df“Äy—l`}¸ê1KßSò…]Ê9½4 ü ©´6ìlløTë¡rgè/¿ýc¯oSçA'Db"‘ì®5‰[ؼ…›$u5cã-A{b×þ0ü€ý)‹z›^#äÃ}ý)×ãŽWª;a n<ŒíŠ4yž–ÞA°„@âUrÁ xŸÂØá î;OíÊù»#u}šû°a)ÄGõæHÀË _AÈ_Én!ë7»‡ù Ù}D㽤¶t8n´à¿©ËŒ§Ém•æÑ~zŦÌ*5ÕëÁP¸âÇÉUsÛh‘¬æ,&ËÑÚóñç_¬‘å:‹†JÒ†¢Ö7‹8”¿¿röe‹"ðV¥u'”;v×ÞŒÁ³»F©a²Cid:rÆ›ú|:yH8b{ìå&0õ ÈM',VÐ^Pæ:xdF§†2æ#Y¸è‚jìiŒ/#i‡Ä¹à±ˆ’…¤¸–fH~T4öô•>.ɦ&¬Áþø’ñʽ%üGl¼+ÆrŒií”ý5É nÓ¢k¸’|K°ºð‹®@ÅûÎKEÃ{I¨­¥ó$íp3<Šá§‘ÍzĨݛ¶ÒmnÑž,¼B¥d$¬G%?õ«AÓU²ÍïÔ1ÆÄd5Z¢Ü.1W@‡Mù¤ˆjÖn6>ÕàÛSG‡_]HªsNö;2ªá én^™CA¿@á+±Æe#“ rÓÛ´váÊÔµ&¿pHÞõÓmMá"ŽäCv|ŠTÜ¿*ø\“tÍò•Ì)ƒÈ9sZ]¼fJ°ÿ«çø»G½…ÇCŒ%¬_8’~(b`È2 ½à.&ÉžA°†™‘gaÊñžQ¥ËÆB‡×f†,b6štbôeÕ8kRZvf¡Š¾3j:®é¦*Ð-Õn@a# EkN]ûAûuì]â²Ü† ¯æy¡ÐŸð6~J÷ -<}k:™ gÈEÏ«JÛ±°3€’äÁj†NËýfl®ÄlìWŠv0½}ÄÆ†.{p™@¤aÖÙñá/Ù€00qâÚYÔ¾F Öje€êŒ€€Pƽù¬zúYǸìÀXÎH¬v“IJtÁñâ‹çÝþ1¦Ë™¢ºÁÅÛª‘óƒLÓž¤Ey‚ToS{ùLÙ}»9Í`ûV"÷E‹÷—ì }‹Ñ>ñjÝŽï…1~UR?”£íCª?,ÙË.}Ô„ÿn^Ò°ŒÖ3ÚÐm2:µ %®)|Iâ,ª-£VâqGS §„§—äs‹BŠ' †n¯8/÷ÛJ4)ñÀåŸÑycÜ`ûî¶nz}y~^Nfê¼ vb$Ôµ?P–ɾßš¤)®³þfÿX‚Ó ¤8U»oyÍmzY«z€­Í¥†Þ–ãZU°—š³!)%4ñ±‹‹Çñ+£»‘ øáŽ6ˆ ó ö,„™$Ìãzc?<(NtD4ßPù*ìÛ¹f—øás|Ïý¨7¹IÏT`bz\FárSÇzÌÔì;¶42ßœ{ªõÞ­Èt;½]kÝÀôZº x@ž‚¸H-\‡àt‚ûß@–eèÒœ>žFáy4[±”ÿñ` •‚ß¿ôuA¨p}‡:ãÚT¥H,¡E‹î½®øØpf„rαz€?â KÑÿ¢I,^{àôRo;Üžzpçtò-£/÷ç@„…aÜƾL:¼VYñšXoÖѶPш´ Ý¡†]ø'åxidB»4L®RìÎØ^ðç†)†Ä³Òm=) µ»B? äf½Yò„–[ƒ§â´©¹[f[Ñ=1Ãb¨ |Mhú\s§´^ yÈÏAªÄr•^ÖF*YLüŒôד¢X° ÚDjÞ¡_ ž/ ƒâøAh fΠ1ÿ@ÖÆ­ÆSåjåÉ,j^:УÝkÎ}—ÎXÌ›R{¤ýNçÓ;;u1[§JŽÃǹí5…}¦KÆsØ>7m0í†-U¤‚Ö¤êÊŽw"muƒÅK@èòïø©øf2¦ðÞÎWs@8ºdæ3Ý6Ú<Åñ›@>nâÚk+BÛÌ4èwš¨K`z°ÙÛ<°‰ôœg»•0gŸóNìâÖ ÓÛÇør S½x%‡Z°çˆ¡&yæÖÅv\VµÈO´œ¿#²'øö£ì2˜Q}žóøPòî§yÒ/Ê—¯éƒ#w_ÜûWˆQüOÃO&¾õ¨.íD5j TEV@NäÂÆUJ`“Ô â¹D£²@5LÆZ8`ÂP ¥bzœjqbóRZ”1ÙÈsXWöy×®}vÒ˜5^³5·™»LË·¦ÝbÊ‘pðkF§UàDÚúo/ª–í+’ø ¾“h´èñ½ÓíVàåÙJE‰)œšè±SBn• ð3ÿ,yÀQš•²Ÿ#Jø•—1<¡²V%óÅÙÕý ì>õSð ։ñɾˆÔ[¡†í„H§Ù^â‡p5…·ãcóìlÿÇú´Õ(›ýèZƒcvNÚ_öã¸\Pü’+iÜ{Æ­jg›nÛúÒéKïF¸Ð¿„ÝXÖtÆóMÇ›\„Ãûô¦ðñZQ"ç‡õ…Á<‘¥zጞ®Ãt'÷pSì:Ó¯Á4Q‰ì¡pÐm¦`ú M¶5«Âm‰äË2Ú#Ä!x3Gào[<±4aêú!|²ž\ô¤~oéû.9%N^L Q•QCS“LÀLò§ýR&îbƒmkÝ» U·eÐ6û°`úÆŽ|¼¥ì×8$)áGAÓPiÆÁåÝô ÀB ¤ÅCqFqD@X lþö-°7ùÇÐq§o*ç–Pk‹Á¤íŒqn-äûH{oå‡ ì$ŸÁ—îFê…Öü±Ÿþâ•:CÍÍP>ÕEjËæ16eY¼Â 7ÞjÛLèHâƒ6¸ø…!gÑþ·—´¼Äý¡Èeé2|ƒå+¤£º;lÓ§k±ÑרÎߌT´ZW*æp±á½‹æT FôpìU´œ8´¢Ë-¬—}6<|ù®j ð¤÷KÐ .ê„⪬zê÷’eT *éD&Ìcä4}ýW÷íT‰G†Šq…vŒŠ‘Õ窂~4Ä¥ÖæÈñ/¿6´|ÜÌËvòq-Õ£™TãB°ŸQ†‘´[ú´ ž7jó§/MÉ—Ê ,¸ª§eô‰g_«!‹ŠãÌ~×¥¼l°ù¼žäX\7`ªNá¥ÚxF~kîí„ÒDŽ9WýÜj´ç?÷sÓà óz¾6´M>Ú"”D©¶:|³³•ŽõØÇ=´¡E5û|3´=þ þI×õ€@«¾Š³òöSÊ`m}ÿÀ˜DýÖBkPÖ—i2ôM†ab; =ÜŽAöQï ¾IíNjT*þúT˜']†£Yà«æqû\´ÿ)' òó:<²Óùå®Ñ&";t,65”§º¨E¨ÚÁ't* 7ª\Ðx QºÛï‹¿«¡×HvÖ‹cënöK|YÄTjê ?³b‚LÅÍñîýëJŒœ9L×l6Zfgmâɪjýt.÷í_I_×mJ‰#&[Uð´Ië²gW®§uã¤Ø 8ug+#ffß78{[Ž•òý>Ø•^Žf;:¿|þHeé­$ª¯[_J?p_"<*½F!ÉÒa´‚¼ot<Ë×r%¸>ºYŽõã$äb cbëC™˜,Ô–m:PDG)7=ã\–ašzà+v€šøÈZŭy®wµxuNM3utÇß«xT\j8²VþÕõ&§æ¾"JƒÑY& =´ ju¿Å;«¥šãS:(·±Zyi¯ñFot‹²l4Òå=g|÷J|tµÀ¥E‚-,ì‡ûÌ _Æš6|Kø¥mK FØþ÷-½¸úË&?¼7ö¢®œÆ ÌÉʰ©„Öé|†ùõœìªG¶'ªôG-u¬1U“'`jJÌ»àíâ{Ä#¨§²'(­-zŠ'~·65$È ¾›ÞûöËLš15 .‹ n³2{¤5Ý9á :àg ľàçñzAáî)™­|©ÂPÆ0,{íp–H‰ƒw³vÕ‡ü'R1±µÛ"ncÝ˲:ieñÍ)T0ðjëÜÓ8blˆê‘ƒ?%÷©·Ag?Ê4¨îS¿pˆÏc—êðÍW‰ 'ÀAÉ9b¬P%rYˆzÍ­EÔÛÙûL²,õyŸ¸å›S +¢ Àh¢]“&T¥—T ä«uÑÛGOФåRשêä¤û•$ŒTªê¶|D¦ZЇöPâf­tÚ(‡šßgDš•èBçÒ€¦ü¸ß©HM𚎡Ÿ†«èí”áÈmø‰únŠßWïßÛ‹yB§¨¥KQG)r%𦫘už`,ºÈ2c[æ0÷hÏ úÞ°óé£ib×M‚úµNålÐ8Dg¼[«ªE)‰# 3R?~nîì,sNŽ•Oñ˜/¹1ef{o~Él»Ù1ò¨ÁrØ‚µiž¸MÊPX ÑÞ¼4rh¸_+Ý£goµ8ü1Ûó†kL/7§_¿´ù5ÇIÁy,x3•ɯ¹ÃÃ_Ä Fû'H²üWÒÔkcMñ‘[‘3®ÊæJù¥¼26|âÊæÀó&Ѳåtái8]N™?pÙoÂbQ5¿3vmXyE|2ÕÈ7<ßßC¥‚^ˆ‘§âÄ! CNš8›‚?'ˆð¨£ê#ïÿC-¡2aQ¨¥…(=>Ú†ŒÅ´áô þÝN©è,ÁP1+Pb•Л»{)[¡F½GA¸Évö)à(Û‹Šý ìDñÃ&™…7™ÁÙö×.ÈHN¼U•(ŲÍi‚bTÈ'›ó[òÉÐ|Üû®€Ýk7“mµõ—iŒ µüKŽÝù¾Rõ_ñÍ$PKå%À[Tó/3e®*}:TyN #ac·—øÃ­­NÊ—½ç}µ¯ìê¶»ŽyÓÄ?{(y‰ˆL§çÇ»šä4¦¾ˆi.‰øPRŠ‹UÕP‡Ëš…"Úà1ë©rq.=%Q h5rªdò"£}Ù¸âØ7Š87À„ŽØSÝÝ?D¶tþ=ËP‘Ç[s½6 Ï8Y˜âkô›L:Ö‰¨Û]£Ú„†0*ZÁdûˆ˜Î$_‹±Ñâ(ªb„§ÊK}¤,çd=n`-ZXI ’î§yK昆æ îœôæ–ϯçËTöq%.¤”Ï}Üžw#‰±°Å&z(• ¾ât¬6C˜‡{<‘Pm»òìb$çPßX ÙQCœOªnþùÃ'iÂÒ˜ÊÍÒ½öK—Ú‘÷Õ•xú3èß|íø~l©°œþè,Îꟓèô ÊYD²~_[&˜½UÅÇÙôܶ_c‡}kþš¬Ì;žvD›xu*ü4MÛ¦À3tFTrEenAz ãE70)ÎáyÐÏæßäVf†.TÄëçJj/H›u– É}2—„NZæ­„0¾—Ô"mK¸±OTô½Enœ<ÄL&Dl?\IÅ—#àsJ!¢ÚuAÌ䈜O$ž­£c‹ü+ÙHæøJ™„ Öå5dDœQaöî;NkÎq {WS+-ôt øyp‰ÏU¦WÝÒnùÌUþ§Ÿ})§…¡ZÏ»M{?ˆ÷~$°vÛDT{)Kq¡>£ƒí™:#ƒ‰º,Û ùŽVô7€Õ8¶Lµ,k-͉­ò¤Ø¢A»FJ¿ò~c€ô‚W©Àä7±ß‘*üŒ_a.ù;¯æ)ú˜ÍI‘˜‹|$ØöÐtÚ!õXD&¤ÖíÄ1–ïûE—à‚„o,94S lqî¼·ÑÎf»iOçSeÊÇTúƒŠQÐC`‘îiyèH0)õc@¦ ·@RT«lEj—ýÇ0Ì Mmß響b³×QJí¡_z>Œ‹ï&æW J'™6µEà~׿ãš, ¡>ì¹ÁÞ˜sêl³Ý'(*rÜt­ÌðƒW;Ò¸¤èäCàöž´ímâÝò+P(â3ôTí(¨¬å%…-)æhɚȥs8‡;T6#œŸ*:¤nÒwã*h;À$?d¾‰l$ÑѤ0åx«¥Q»3L8õ¡Âó8Ø$®wý<ýUx ¿¼='–nuB5×Ê t ó]cüáÏ S¬ÏC?õŽ¢…[µ>â?¥hÖê×õgI¾‘Ï20MBòg9è1Ø•Je#82ªÈQBZºïüœÎ¥yYóYi¥À÷]hß)v¾Ekìc¶NË~ìÂþ"ãûü¼i–[)V7¶AFØ26UÉ–Vºh{-”œhÝ4,à’qÒ­Ðj{Ú1ÄñU+­ž"˜°¿¼‘.»Ò"ç‘ñJ4x滳Ýáhú 45Ô:°ø+Z*ÃbÈë&á û²r~«¸/ ‹ÞøášgÐSµ§B~Id—¢ZÊ¡RBήy,Öx DMàÍ ”ùÚ28qmþþ1ñàòÙwE´ð»*/)?|%2JM±\y¿ö¦?«+ú!píg*~ÐO^;y<Îy6(“ˆÜ5”У¦ç;Xw˜ÊÌw eB&ŽK »Ý\[~;Ã^û)îÜÁ®ìŠôeaÄ´,½,ÓÛm/ꇧ þ ®O¢ø€/,9®uñÐ&Êc“m—M¸Y$mG ò?,£ð­þÍR·xÃýêC!¯A‡Íö;s?l®ö¬æ•Sòàï*MŒWs7DnÛ çŸ™Rõ˜šJT§•ÈO7n#Р.ï¨5_øsDb*V¼ËÏX2œpuÈGÔPîüåJ=ÖÉ2äM,÷*^¡6Ål0.P(smÜŸð‡sAFÂ}ê`ÑßÈöWì5ôR‘‰„‚Ž›~Ѓ%®òû~?¡P 6¸Ðñ-$1¢ó3!v/ +?Ôhy`²6löR»`ÿ©žèzo±þñ²* â‡$ rLRYŽEyÙnB´4í•7ÿû]'®Òd'ù—)²@"nÑ)¤]ȘK¼ßlk‡=å·q±fõ…*òA´3ß|ô>~qTm$Âiæ;‹`³‘ìÅê]hþmX½k,؃µ[Ë…þÀDivrR´÷¹Â¶Šr!¬B½¯7_!–˜<Ôï}y“ ?6xß´EH\gŽ•¤÷îqJ³¾sç*£_±ÝÃs·÷ñùÂVÏ<ÿ|L§cÔÚ¹yrg´l„°Oy~ë„_“a‘Ÿ&•/ÃÉM&ö ý;ÙžGÍ#sbsÍiNOvËä‚ÛÔÖ’Ó‘¸ÂùÑ »úDÌ»¡UퟌhØ]¥f"èAÊÉ}`¹&f­}¿cÐåxߑ˙â_ÉÆ€lÇ¿òM¿Äþ¬˜e°@yËþ%/Paã ¹&»KãkÄaþ¼:s.Äè8ªN§’H{Œ>’­ªÔæƒÈ²D,W ¼Áh.iˆt|•¡ßi÷´Ưi$ÁxÅ”=ægg¯e…—¤ý§Ì{OY™ŸÉñ|eüëtWfhшÞ;£ë¤D ·’©Æ—„(çWí8+8;­™ TïÐ 4¥ÊTtñvâÝÍÆ(첿žžMáîªJ0Ç: Bw.^ü`ªDBO ‡±½®oî$9ÇËÈI'6³uviF‰çC|*€Ìy|ºµli¦Pªæ`~_nW‡U_ÂD¾²ž¿‰šÐ:übÜÊ-ðQ,öÙ<°¿ßÊ=¯}ãçÆ=,-°¢.åOu¦ EJ…;Lš:^§®š¶Üåà ¥ÂÅ0`žŠ“ÍS ®fnÀôóêâyåb\°d {6­;7 [BTh§1ODqN†.˜)£?o€QšÚ®š3¤Ýâ6 QX%® Ö¥_# Œò%¸0â)"× 'è“Unõ¾ZGøû‚i~ãý2ȞΊ¾©nQݽÙ}…’d"MQ}¡ðû—Gû <¢˜¯Òs,*ÑNÃË„ "ѾO%Q?Y)"¡œˆ…ü™îq ·a+e2h‚œ}ÜL"lñSöå½›…NÞ-Èb²,áîrôZD ¼j™õ“Êð–7…,ý¦ô* ²³ºÂPp¶¿e“TWŸY¦§sÚ“¯î¸ø0¾ú”é?Ž€9%îz~$™n.Áºd­ûicyü|éXÌåŠZXöŽO˜®°†’HͶ·“Ù(œƒ8~GßÃ¥Zú°j¢š³>Ðï" ºÞ OQCB¢ äh=4û`G¾åó]ú¥ä¥›1ê+!D5Ì`ŠfLýUªšËŠPÂÌS¼;Ñ’©'–³ñ8ØØ°ãI½¼Ôƒ¦ýM5ŒL²[;NBª¸qÇÖõD[1ÏþBIçeê)7óPg>ø@¼­Þõˆ ºv‘C<†7Ì)Øðîò—l(UQ¹)j ¼›Në-ö:\(%jq™Ï$—ocßdïp(‚DåÕ1H­–u¬¥ËZ?B~Qâ)Jµ23¤±j¹„…¹‹EŠ”’¬JŽiÏ%.ëªâù·Xð‘ŽYædf$ K8n›õ†¡‹SSWí{‰ÿlµñ±¯C®…ŽÞPØ.¦œ,•Åc…ˆ<‹mm lî,.,í =X9×Q&Sd÷£ÈÌúD}=©ü™É›§¹69H`îÈ…<ƒóÑ=•Ë+Ń!¬b2&æòöò!ÐN 9Jì8CxvL™C~ÂØB`¶Ž†)Ç~ÙUƵ‚ö=©dùêÂ9r.¬øñ=¶úXü •€k¥;A6<¸#xø‚# wÇ?ýç¯\ùN&óL`p,tfP%"Ø`"c-©!’ü.©úª@t‡ <ɸþØ. [&ÙØ˜UžVoÇÆÇ˜{õ«@x½—馶Åð y¡ÈTÔ”BËùTŽ˜‰ó³4Å ¤?ß–t^ÐÍŠˆLUþ–¼4óC7ãÞ¹s•xªf(Éû$ëg:‰S瀊/=Á±‡éP ÐJÿéw•8‘6 íÅ…üwWR&Ä*G@¿G‘“n¢ç*W¤è ò«Ä¢=²nŠ?bÚ¯~2^;3!iMç“{beÁò¹£@|"%œO™J+ãí|¿ «ÃÓ\ŠU½Öõóg@É È> ¹;ÌÕ•Ìù7LOo{^՗䯒£¿ÏÜ„PJ¯d,·Ö,ÆŸ3W-íרöta?VÑé=±È…"±Áäü0ŸÃ=³gNEÄ/‚ÜuGÌr—h:è™l87dð+¬Ä´¶PËüµÛÛT{[¨˜‰©Ïyp Õ à”ýˆ±¹¦ª¹>iuBNš´ë¦·™‘8S{Å;KÕ‰R<ïFØ V4Aâ;O«µ»Dˆ£Žþ*è/Á¤'G³_NâÂã+oaÞ¤ÚüfW…XQ¡$€¼&AUyiNl¸xܵñ2WùLÞ[€)PpP'þb¥Çà«ã…zgÚÉÃg¤e×T6—ßAÐDF Ý‚™üSì°Áªk6fŠÃ³™Í™åú¯nfúÝÜWj]ÜäD¢r,ëUþ92€bòõ„^ÿ/çØ~ͪr½Ÿ[‹Yý7z¾]»í&ÂyVÜb™Ô’ü`˜S9.>¯Ä¬K[2ñJH¯þ5úŠq¸s¿¿djÓ‡ðÀœ‹Qß鉴²¼ÿËlíÙoû•ö<Öã\m·Ab? šƒ*È2·8IûºŠ/I‘¡•3.ª±†l1f[Ó8K®ÒÒ-ŽÕMªØ•‹×gÞH¨øñeªç©Âª­ †Ãç{ Ó†b¼"’•¼)EËBᄹҗ[5 BS•-ó“ùÀijúP™,Œ né[¸ëF I/7›³m=çgÂv‡þŸ¸PK‘ƒä°ù˜Ëqéla<äRÂE!§ÆW2¾ÓÀÚC{’U ÎE/QMg]ԓôG0¿VÚ¹–HY ì1sø]inóO쪀uZéèyçÔ SêÌ=dP6¿ï„4ü~½öí¨2XÃ8ˆÎ—¬öêe”1vù˜LÉAÀVù§N©ÝX ÝmY©ËÌ Ô|ÿ펰T© _³tÇãötøIvK¥q˜{Öj"pT¼õۥב*–¦\³€w>ôb…‚Þ$éuŒwf;ƒÖuÌ^ß;/®#kåŸÆC É¢Ùfˆho@ðžMÛ»‘àÙÍÿæºG endstream endobj 64 0 obj << /Length1 1555 /Length2 2989 /Length3 0 /Length 3968 /Filter /FlateDecode >> stream xÚT 8TûûO*K¶¨$-‡lc›û–}¹®mÈV¶Æ8ÃÉ8Ã̱…ŠHLáj7J!*k%K”,e—µˆl‘½Kñ;–{«ûÿ?Ïï÷œç9ç|Þý}¿Ÿ÷+*D8"£ãFu ©0"ƒ—Å©zfÖÖ*'/‹Ãɱ‹ŠZCܳ‹Ú‚4:D…Õ~2УD•éÔÎŒ ¿ûR¼<€WRÃ+«áp€§ú·!•¦èý 7ÀLø ƒtvQ=ªw r÷@Ð4ÿ$ €WUU–^st¼@D"€ñ½ÐŒ$"8B%A øK ñVÃbýýýe‰^tY*Í]# øCˆ`ÒAšè¬6 ˜½ÀõÎdÙEkˆ¾.?B%#þD  Da:êá »4M16,¼AxÝØtÝ@ؘ €—ÅÿnÃ{5¯9I$ª—7„`w€ Q@ÀÂÐT @¤"ì¶jH¤Ð©¨?ÑQˆ®¨ÁZåDÀPÇ ¢ n´G'Ñ o„.K‡(«-bWàS6€Ýô¨^^ ŒÐÙWëÓ‡h { výd=aª?´ÈìF^mÂÍ×kC>¾ ±þ† *bÿ!s@‡Ã©ÈãÐHØÕðÖÞàš¿*F; ò¦zd´ 0"ƒè‡=ˆNô„æ †ý¬ø±ãñ€DBWЂÙDGÅ y£‡OƒÊ=<€[}þùsBéåF…)?Ì×Îk¥ggpä¨ÔzÇÿètu©@Œ" #'/(*(Jªª@ȯADh£ÜOc˜LT×kE‡ôw½~Ç/±±à×XæT”³ ñƒâŽ8E }áÿg¢¯¹üü^òß(þï‚ })”5µÄšþÿ¨‰^%pÃ¥¬/‚ÒߌŠ.üoS;p}eÍ@7È×ëßZc„ˆ®ìNùgŒÝ ÝBòX#ƺØfuÅ( ¨thõNdð8Ü¿tè^‘<Ñ{ƒŽòqM¢kókF˜Du[Ý/9E%€H£Ùq(ä <ºˆn`Àƒ¬,LEPí. Si쫪¢`mWEkò þ¬ÇOPÀB? Jb,õ'(`½ÿ 8¡÷ LÉÈ)~CºÎоh"ÚOMDÿ ¢Eþl¬ `}‚ªÖ þ2’/ ̓¬QÛßxíÁÄÞÕN%©‡ŸÈ /YÈÑô—jSà¬ú=Ëj7h à÷Ñ2LOãë_ò©ŒNòÖaÆ×>Þ1¹Œ•'žö»qžÎ½Á µÝ]%[É®ÒÁM¼‡¿ÑM}å†MÊÊŽ—‡ÝÜwOZÕøÏj¿ÁðKûÌ µ%iˆ>œà1Å"þx\–csÃEËyŽÍá¥:I¥usuÞ´>3¡Ön˜¸´ßpôkBe­œbÕÛLi&èC‚à§OœÞ&³IŸ4¯¼PÚkr¼ x#:øÂ`ÏbœDØlIx¨„+½Ž¿ùë>é-Qaùýv “žƒÖÂ8ýêlîá얫щw,žÆ6W»3ÈX);sìÙ&Z|î[…ùŒRVŸé6»=ÚåOÝòÔ]´H‰©üf¬KtõQÜ&'µåbWb™¯÷bž´Ì¬q¥pKþôÓæ\Þd3½¨‡}¸Žx?ÇøÄž¾A£ø(ÇlQ¶ÎècŽR±‚êÊH"ã5±×ëÂïtûù3 ¤Í‹G³™i© |E˜£Öi}8–-›àW¼r5šàÄ=Ïa5Ê"mÑ@ଽҕŠâ‚×^FPÂûr.óÌuì¨Å 7‚9~e±3•;ÒÓýtÕÁ¼ÓÚð¸KÓ(ï­²'”Æüý-§‚§ÚÔKáLxªMŲ){ÅU-"Ëðð+û.MN‹•ê£co~Ó‹ØîòЏûÊSû²kBÌŽT+í@ˆ™œÉœªnš‡ùcßcdXâuJò%«2“ù”OÍs5få\AHÚ7ÅkV’ßîu4JM)Ž!s9’x†Zúr!Oig yìüÓ ÂÒ@Ť ¾ vljNøŽ«YHºã¸¶üLDû’—®Ëñå ìñ‰ ˆ$MÜ;sŸZÓûuÜ]L/ÇE†Å"v‘ÈÐËl鱤Žê™í Œz¿kÍXñÜœ˜iádˆyR{ÞžÏF-HožšC†Ý1NÉgÛœÑÞ+ß|r8Z·äŠœÒ¾Èðl/80½ðj[;SÃrø¼tÔ¤ÊÇ!&² ø-¤ºÒ¸[ZOÕW$TõáOÆ”(…Mk `¸‡ŠÃŸ9.fSP]çu!Ö3|°#³P¡Ã”„z‰0®ðY¦Zͼ²DG Õë®~”©È§ÇÄÊžÆqƒiå9é±ÀÁrùMW½n—žý#)À©‘éLÚç©sýa†çš"Š'\NÁB¶r0ÛŽÞùèk¦þ4Ïáé=Œ„’³3) ×­¥^P0ÕíÕn¿œ=¬ûå/ÞóÑá¹#MK´C©g‡3¿8V·×yÇÕðq¹çä̃¨Û/{„ŠsõŽãø&cOåLÖ<«²AnA'Þ5¶ëÐßW6Ý–·¿;STðÇb¨#%Ù’¡NQ‹Ë+8ç¡ÓËÄØL˜ñ¿íbu]ᦿ_)‘§Ì~hÐ8‘­>–—œúåòïåAQS—¾.“ØïÝX¼ôÆú¬}SØÎl-¥^—ŽðÚU-¦ÃQÝžùqéEüú•zùu}ú2âû'º—¿¿›ç¢æUóÔ?²ï>„ÙgÐÃþJ¨Bö~¿Dü~£Ç•îeMfþ<_Ë»5L­¼¶p(„JÜÿ¼_ÒiOBu|½Ø68bWÖ½TðÅ­câtºIÃV WÔ;h,r[ƵŸ1¸(ÆL¥zÌÛ¸R½6ŽÌÛ‰Ò ¼&ãùy‚?7?)|2ÁY$ðdDáí=H¨Æ!éЕ’nF•÷í™âZ¾—òë5y’®«z ŒV¦°Ú­õû«+]ÞΘKiÙÈqd:iÝvî&h2$µÝS…77÷É*1œpó·‰,è܄ӄãr³œ_> ’#Í;"gîm7Ùß!ZôéÆpZääÑˬÁÊ?Nê/ìÜbÄsêlfÀ¸ŸþuЊ–o§¼=åú‹æ¸’Jû‚X\Òu0vâ2¿ÕªHhF²G ÚsÜù°“1'šAF@ðу¼2‘ìsšßöd^Ã…qWÞZ¶ÆP»Š#º‹· w.ñ¾|~(émÎg‚Ͷ‘¬M­9K<‹á©<Ðâ´éœÏ´X —„XTír¶é“ÔÞœl>6ôýÖW K»Ê…—s-,õ¾§ëp+Û>º"þ‡æáÏx.ä†cõ÷•ïˆñW Wd==ÙõwQràÇ3’§e¢²(b’z½uƒ†Mé³f¹7e8$o‡Fýé•)ö—ŠñÙäºYæ¸ÔZñ„tmÍ„—ç5Šg«–t+ÃzXœ jy6i;Å)\ñ!ÒøF:£ª+ìåªÞ%n T¡ªs„_Ã¥+/Ê5’7Y´kÔoù° õ[·QRŽÊ˜óNž—s²mÔÅ]‚³²e$Ü»®ž´-œ‘›2ü²ÂEx=W:š,ànt»5v%4Ö@lûÉoðˆøäøeÆj¼Ù|,oßE§mÅä{býDZð7¦Ä¹IŠ{¶?¦¥L³ø¼ëW¹`%nLùh±û¥‘4ExˆòÜΖ=y †/8MÚlêò²Glæææ©V‚õã|ç³VŽkä;GåÅœ¿UÁàx×kc‘ú­W¶wQêBÝ õïZ¦›\X ¤ ®·{#åì=èšÕéhª£P;z„ú¬ü¾|0ôÈCðSÖµÌþÀª9EUwË|ÎhÖé…ö‘+Ã?ž$Ö]H)Ðå|»SûôÕ÷Ÿo¬DÞR2Po–5¶øùØ`GJ²PÕƒˆ¥É9¶Ñi‚QK]+‹¦r?³TÀs¥±/üöû±¥øÜNÍ\HYvö´F_¼¬½ÒhTшÑä~c3üµùkk÷¡£±LºŽD¡ÏÙóÝ·òԋ㯟áí’ÛqÿI5èY{J²_íSî|ùÁ-“]ÿ:Ï–½1LÑLž ìI_`kù³~ {ÀšvpÏ÷[g³¡±ÁBX¯Êf%æTÏÜ<:DØ$Èê½ËýÖÁà¶ÆØ¦%æÎžO=¬¡»õbâ…9½%d»Í~s°:6§Áízéݧ-‘4$oŠUâÚ^©°Ç’Ÿ¿u$¾1 oÛë^Ö kö’g5ž’­ó‡/Š[59·;MpöÔw”•»HÍøœ,å F‡¹]Úºç]§¥ÙÌdºÖ»OÊo’¯ßÛ©UÞ: (Pľâ†`Ì·5º™­cY,Ww‹‡óf‹42 Éç2{Ù9÷ ®C ÷ ÙDŽ!= ¾Ù}kì¦÷zÝÛÓ™:[ÖQÒÏ8¼=qÓùxü´Iïi»åI™™‡-u|½[N—p,–H‹‡Ì†&.ÖF¶Öjê¼è‹=)iTõ ت%X=KÞ|爞öíû„±1wÐùÖŒÞ]M[ÊÕ rЦ‹©ÊÛ\$Xwu&$:_ÔqÑÁ›Ëoãsâ%/ÜË)ž0mˆ‘òá*?³÷~ö˜~6ŸeçdÌñ/&ùß÷îÊ(>¡J©y{Ÿ(0hÙZ˜l®/n>~ײ2‘okºI³HØr"Ï5s.Òä™{¸\³·w˜€jy‘t r/æ·¡lw3gbE Tæ'Û™—¯0ÿ.­O­ç5¡éfçæÛö¥ô ]Ua»¾Cò…¯”§ïÁã•l†ã£V‘^dÒ©ûŽN͡΢ˌ±;ûY°Ü¤­›Õ2/ û1O¼ «+±]j–bʸ²˜xRã+‰£ø×Hú³°ÿƼå endstream endobj 67 0 obj << /Producer (pdfTeX-1.40.18) /Creator (TeX) /CreationDate (D:20200428101448+12'00') /ModDate (D:20200428101448+12'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj 9 0 obj << /Type /ObjStm /N 48 /First 366 /Length 2570 /Filter /FlateDecode >> stream xÚíZ[S¹~÷¯Ðã9µ…u¿U¥¶*˜…p6°\œ@6•&à³Û䲿þt·4¶fŒ dN¥ŠÑôH­nõ×­VÏ`Å“,z&“Q3)™ŠŠ)ÉŒöL fµcÊ2gáÉ0oá)°"SžÅ:æ §˜– B¦AŽ ð¬™ÒÀ­ Ü=Ü-̈8- Ü=ÜA“ÒèŒÌHë:F0c`¾Ë`V‚0ca)ž=³ÎSdNDè”ÌiPb5¬ÑÁza­Þ+ëu1ŠŽÌk˜“Ì{မùh0³ ,Þ±`ÁN¸9ÐáY6fÑDà ‹B&ÁTiTG³r†AWÔÁ1iY´ Ð,:0 º=è‘‘a„F@ëAtž=ëðþ×›ŠñƒÁEÕá½ñõ¬ºžM™7uøQ5ßNΪ)ø„:öªóá`sü…½Ða£í*À2Ù ñ]¤L`:*Bî_%Û ”={Æø6`lpHX“ͤ1`l"Ø›(€1 BøÁd|v\ÍØ[XçÖ6ãýêËŒ½«åßi€\¶àIL¸c…|¢µ¶Ë’– ïËš†X–µp´¬¥@*°Y©¶ÍJ<…Í÷;ÌÇ-µ ÅÝv~¯mnÉ6ó´þ\aEagéÄ“§µ3.ÙéXÜθ±o­”]ÈtÍðZs,xÓ¸±¸3~®jŒ%„[BQy¬h¨dÊBê-J©/ï°@3NÑ{¶©ÇkCE`í%o(Œ£34¹@—¶T M3E-x;Ò,]ËK3³l%¨”œËF.¸¤nþ`chܤO(Æh‹K˜S ®§Ôg¥£ ‡°yîœ+i =p¹‰†1p‚h‚Â@óƒ;6øMNäqO/(N4.Ñ ƒH`X9Ÿ+ìZ^„wÛè±Ë;eÈiPà¸;è²'I6‚jý‚Vž^q ž<7õSK=Þ+Êc4·”I<ø–Eìâ›~6ت¦g“áÍlâWüšù ¿©&Ãñ9Ÿð)ŸñOüë¿ÓB·‡ Þ¨òCÉ·ìîmíôúÉnµÂnvKX.î §°[Ä•v?ç[|‡ïòßùÿƒðcÞç¯øëKx$nˆÏü+ÿ»†YŒ×/ö_þùÀ8ZFäâ[XèaáJ(´lB±É{ü7¾ €¼ H^(ûËј~šÁ9Æ×Ð^] ¨êú|0½äÕ—³Ñà `û€CNŸÇÿ0¾š—_o.«kõ¿¬ãë C ?¿ª³DMp¥uü}äodzêüýˆê‡ÄCO‰DM««aZát„ËšñÙ太øìó8»îË’óÜ:ÎÛê¼èï“óV2äg äÂÓøÎÞã»=ðÒ {|A8 Û@#Ùüw57Ì ë˜{øçÉÑÑs2ׯ0W§Xøßl®]a®Õ¥¹¢4w‡Âwi3c±¥…V¬cᛃãÃþ1Zèî6PÕ›ÿŸö z¥Cq3̶aÓZéö´wÐ;=E›V8MùÚ&¥žÄ&ïµiZ}‚·ekåέ^ÿøÅZV„c}| /žÆ2wÏöëÑ)’¢òdž ëÔ˜’á°™û~xÞKPg°‹œ·” ìZ‰owëd÷?~Ùï¯:¸h¯@Fpÿ]ë ð¥l€sð•RMð7⃮8¦êŒÐD¾úx;Ñ~1©Ôü,Ï•Í}°gœ3®ˆætøåΓd ѵrë›ÿmîc1Øß]…§¶ó}jÍXfDÃJD1¯bÔ^az3¯{>7 @·V–}µ»ÿŠŽÍÕ±cRèXý¨ÐyHɳ“ ›7ï'ƒ³¿ªEC¦S<œµB©Y>`ÿ6©QŽÌ·eѵrüQïä·ã7„èŠTˆ±£ñÕ_Ÿâ£½'¾œ•[kC {Wd~Pxû~FØ š6ÓŠþ»ôÕ€\BÿëÝN¦3\wþr¤Y'ÃóÙåDz¶òö[LK¹m+ÇÊ­P®ÊãúÊ[o -ݾ­ZèÖ Ýa}Ý­¢·¥;.nJÝX8fÝF|‡Ç›hS·•mݾa7¦½Z·\_w³6l©^޵X¨¶E¨éõ57+¸–f{¿f»Ðì¾Ã× «¥ù[aV„¸Z_õr‰ÑR¿iºiJ,ÔÛïðvë [Êõ7,/”ûõ•·Î’–îåp=ºïØcø)þBç4Ahþ><Ÿ²·ø#E¼)™né‡_ŠTëg>½Iã‹NWüLçO² endstream endobj 68 0 obj << /Type /XRef /Index [0 69] /Size 69 /W [1 3 1] /Root 66 0 R /Info 67 0 R /ID [ ] /Length 199 /Filter /FlateDecode >> stream xÚ̹NP„á™ËŽì«âÂ"‹J‚1tTöjcAxÞÅ× ´„’ÂÖg°²²¶2’™æËÏ9¹ð€ä¡ê‹ž¸]1fxÝ{{/""Ƀg7b(:b nň‰(Qžûx$"N´]-†§«-& /[0¬¦8ÄO endstream endobj startxref 155698 %%EOF gridSVG/inst/doc/gridSVG.R0000644000176200001440000000113613651654530014742 0ustar liggesusers### R code from vignette source 'gridSVG.Rnw' ################################################### ### code chunk number 1: gridSVG.Rnw:71-74 ################################################### library(grid) library(gridSVG) ################################################### ### code chunk number 2: gridSVG.Rnw:75-81 ################################################### pushViewport(viewport(gp=gpar(col="black", fill=NA))) grid.circle(x=0.33, r=unit(2, "inches"), gp=gpar(alpha=0.3, fill="red")) grid.circle(x=0.67, r=unit(2, "inches"), gp=gpar(alpha=0.3, fill="green")) popViewport() gridToSVG() gridSVG/inst/doc/extensibility.pdf0000644000176200001440000046415213651654527016722 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 3 0 obj << /Length 2088 /Filter /FlateDecode >> stream xÚ­XI¯Û6¾çW=Y@¬ˆ"µmMŠ( n/Mz–ìçF– /qÞ¿ï¬e;¯Hу-®ÃY¿òÍòÅ«w6Ÿ™"NMæfËõÌ”Y\•f–ç.NË|¶lfÎß~‰ÌüÔöðßÀo ?lo¢…M`âÚ-¶“ùæ°•Eà÷G”æóŸyf_ÃÀ >E™coÓF-}õÎT3câ*ËRä (c“V³…Íã¤J™÷QZЖ3ü: ˜fóß°}_Ûуq”àÐ8+2Þÿz/ë¶ãþ´„öKiC3¡?æÈÙ™q±u9q´06šùl᪸¨*¦ù iÁ‚üH{@)çÍyuÂ#†žé”³*®ò4G*Él‘Vq’èöìpÌÑ›éü8ìP”“ð¹kÇ©ógÖ¨Ž÷ þö¸jEK5ŠøÄãk]€äÔBž.|…fj?GiÉêöÑÌÓê¾7Ъ‰qbu¡S󇎿p{ƒT‡²HË6ei?&Y Óà2›eTZ6î‡YÃ+d¤Fq´pÖΗÌ;©3K}Vȧp°Që6âx%8Þ l»4Ó=èõ ] \2Ÿ×›–™úNôO"ö€®{‹$ ÿik@/Ýñ>“º¸(²ov¿´Ð-+:‹\ë„fóaƒ°À@a}ƒ6Ó*£ÀÁ%´g»c®€ß«é !@ÏR!÷$Eí…ÁÑäiœ¸lª3ÕÑÂ- A‚‰#]Ôú¨ŽáŒî^¹yÝh2 ÇzqÜ¡)bM‚ìjuZÈ7)²þ`O3èèg¾XkÈ·pŽ2 Ÿò÷ÈñYUl¹aâ’È.‡€cŒT:Š„ãóá¦Ö Y–ñ†<ÞA{Tt‚€çf‚š—HMú‰‰ ½u­RO™~+²9@6Ý Õ<Š’W kÀ%â²à…?F‹,µ>æ4ÎäûÄØœP®h£}'üþ;E–΀p#õÛ Š¼>J2àA‚þŠX³Û0¾FsºØ<.‡ý‰Ë!µÕ{÷É:2U-ã5$ª¨íc†zœÃ¨ÄQÛ‘‡]ÝŒ|?Ðù”Âë3'‹;Jàd‹Så›5z…à†ûâ€Ø$ŽÐ ? ªÛŽtˆ-G1;P" —±êbM`XÌŠ?g¬üÚZ CbðûF-’Ø8zŒÀ£óÖ¶húB¶ÁVPì l+áMCð—&Eœ'WðG²ÔŒ¬ÔÊz#b[5 M±'vR¥“†rd¯€ib —Tý— tVÂRêQÿ À.Ö¦íì|ý”¦Çì¬È/Bõ™ºÏ|ê\Ul—¡gYpÊÃYT×ð æ) R¨h¢¦yâ’¾m¸Ã(A¸ÔEÐ&0®ú,†©cœd²ªÍ0Ôˆ ^)Ö}°ÒÖ5Ÿp ˜§×n'´DG® cë¯kžQo#¢1œPN˜ÝƒV O<;) Å=p\)4¥ µaÍߕҚg$ŽÃx5+o&ãŽÔj´;Q^Ñ­ër»ü™(ŸTgVg”Ó1ÀmŽáîË‘ÜÜqÐÜŒ‰G®;a×/OÍ}­~/û–qaÝ·e_¨è!¹Væß«ðÔ–¯jÙæ)*U¤ÆÌ?j!Œ«¨h¨'žÕoxJñÈVZñi¤<òª-nßúòKßËÒvÕŽg¡ËáW£­NTqµý¸ýÈ%`wS~ šŒøˆÕ*¦ÿŽ:Î359ÛŸ†k)~/\l±Ï‘½¶Èưã êÐÅ¡TëŽE€•a€îT€`^Ïõ럘gц;tYöšÇû}Ä‘ ›ŽÏ\t¹~¦šb«O%RêáØÑ ŠÂÇI†Æ‘¾Þ)žbÚuܘX),D}íIÏã}^áH¢ÓhˆÏãà Hb³8IK–ä¹Î¾“ÄPàÍ –XÇc Ç–:Xv·dË⬔’í5ì+™!ž§^&ãÒRÌ/å¾ÐrûÂ!K¡Cë|^)ñበñ2Q ©`s"JYdØ:ÂÜõÕô¸vò,#/Èì‘¿£½òPb•x':èÎ=Ü%l½z¯ÙnEw(÷oVäEÓË7"FžÍßašâJ%Ö ¸“»!¾ÊLÞÈÊ,®+|õ¬<‡ñ`ÉF„‡#W#~ ù†µc\Ï€}/ù°óø›´ƒgÀhƯ°£fûru_x¿GAKË¿NgpaÈM©hîm(ôô2Pqyã½.‹… x¤Ý4š¾]*¯*‰>nb éjõ‡ûO!1½!Jáj ›¤¼½ÕO ÛbI҉ÓÔV\ÝÐÐ;ádsÖðjf “ÛäÕULn}'ö#l~Í7§Jö.Ö+vw?Àï;z#í—LAËøpÉ×ÍÈkž¿B2Ûo¦W ë$ëj{;>%a,1 S?øö ÙºŠ‹ÆâVìÍÎ¿Û ÃèE™yöÄñ½BOåÏú, \…¥á'Óú±åÁɳãWŠaö‰Zœ*E…‹ ›yDä»…É«ØB¡‡OÝe)™„ìðâíòÅ?4ÊH endstream endobj 17 0 obj << /Length 1558 /Filter /FlateDecode >> stream xÚÅXßoã6 ~Ï_{p°EµdÉ?¶uÀ ]ÛÀaö°îÁqÜ$‡ÄîâôÒnØÿ>Q¤lÙQ“Üv·µpkKIÑä§æãPÿò±’Å*ÇiÈÂl\lG¿8 õB ç'i! \¿åãÛzô“þµSS«tÚiýv6º¾KÇËbgc®eÒPŒµã‰Ïã_ƒ» ÖúZ>íôßr2¢(à_N¦RÊà >6 °Õ×㦓©àö€÷KX[Ïñ¡¡¼ÑØëÛU¾‡,ôÃ.Ÿˆ$848²_uJ÷äÍÖy†i»z½ï«-õõ¬¯=@oNóK˜¬àx7ü6ûAÇjÊ9Ë”ÂÍçF¸Ä`úúNÅN¼´p”±Tqþf2UÂq‘Ì/É@­¯9Š|mì™Û}û~è«0ŽâêšÆîCÒô-ÇEú|ý|21ÏÛæÁÛžýVã#DÍ‹·KhêÊ¢àÕ% UôG¬èÅìhù‡~Ö·/d‹9›Üöíš ¶‹šGoHß=$ypå.ð‡#‰"e¼¶*`3ŸÑ+yì,U´ëŽ+:œ3&ýæ@Õ_˜&i?KDÆ8OQp†ÙŒÙ”8r"d*Z܈-œôuKö÷4áÛPHÝð™O8i«vku¬j. ¼³H “…õî»’ZS%I§”õ}A†ó†&ßQ7{ÔUä›Ö·žBߦy"™ÔpDî®3;UŠuñ3ueŠ { ÎÒ$¢·÷íÕU5¡˜.ZZøÉdiaEôá-¯° tÁÖ±fÌœnøs0l¹«ç¯#Ž›K„8’+¾òûhEõÄÈ»´¬ k;\:ܺ0Gž;|ø×5{ÛzoŒWËþ»óå¶Jê²Ô>ò@*¦Ü.†ÜR2x J“~ñ%Θé§žF§ÀE;šÏÍS Á{?©1åËî©‚¥<¡àg½$ÿÀ Y¾ê³§Q¨uƒÞîl<*py-6VÆ„£íÅAýDx`Å,~†X6›–ñ€¡¦¯/è' xåh¾l³Ö•±w-z-ºU•¯NC4ã‘úRgÝe·9fšss—zÂa¾ñ:*&BéaÇjŽ|Òü—gíaD¨N™*£1FL`ªê°$BëHjB ðGXþ%Ò:f q¢ˆ÷ÂŽ1GHîˆysU1•’~M·…ÌLl7†“¯071ä/0›Ûšˆ:ˆBæÕ6<°o#RäM'B1†ñƒ=«`<Ç1C8ÔžsFIËà)/ötNäLJcç6ø£_ëœMR‰'méKÍ5žibn‘ß{ØSÌ”âŸ"Kq‚=Mã0Öm’Þ…¡PiL/Öõ¹(ðWÝz;†tY ¯ûG‹ž.‹€ZæÊû[ \68žã?bi†íd)-Ù¡H:}8$¤s„h„ð`ŠeQb7?§Ãê¹¥ûü\=ɘei[|d´íö¤[A/ªÄìhp4‡I?5ÌH\MÇļÉ5ÂÂ1ˆ £®Z8zã€Î#Cj” :ê&p<,ƒºvi"!<ØÕeÒ&cý¸°:2ÕoXµdSwã+G1Esl®È+wªDŠº@‘S¤ÛcµÅ{‡Un¢ˆN‘“dýpú’`Ãü,^WΛrHMú9aù ÓÌÑÒl’mí6š_ᲦìTz>Sˆ@@Q_Σç]¯ëðßüòÆ¡ÆÖAšz¢:J|ERD¢¯ŽÚÝ—§ÏOu3ýØ#hN¡Ü8͵mú®NwÆW´|ÐãmçáÂñúI{³ÄZwÒŒRç`¡|ƒÏXÛôþ _(M³é2jðV¶dßOºÄ*Ú†Ç×!ºÍZá ×€Š“J@±A®<ÓÖeGéx:‚ÿÍÇ¤å‘ ?1Ùo(¾¤£¬±"ÏÇC/'r™‡2ɼÙyâ³ÖkŸtœ’ò%è‰ÏQ¬_y'úLÌ7˜;R\\Ì©ƒÓ8Ù ¾ñôοxä|M•1Oíó+€%ú‘ÝÒ5ªÁhݧF±Ò¬š³PRñ }7ý F¡?Á endstream endobj 14 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpngXX2Q/Rbuild32e831c33c83/gridSVG/vignettes/extensibility-simplegrob.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 18 0 R /BBox [0 0 144 36] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 19 0 R>> /ExtGState << >>/ColorSpace << /sRGB 20 0 R >>>> /Length 148 /Filter /FlateDecode >> stream xœ}? Â0Å÷|Š76CÓ»KK¥cA…n•lâPj,,h2øñM­ƒ“Ã=xø£cÆCõéZ§Šp:¶ƒ"CDøÕ0.ª8HÚ»XÌ·ØdóRaˆkáî8gÑkXBöŠ˜ü⟜ÜýCÔ¸NíÝçï0[#;T†ª•› åTæ)cj¸lÊZÃÍ+«Wo>Ï-– endstream endobj 22 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 26 0 obj << /Length 1963 /Filter /FlateDecode >> stream xÚµYKÛ6¾ï¯0‚l4fDФ¨¢-Ð"¦è¥ˆ‘KÓƒbk½F½öÆr^(úß;/R”­Íî¢i¯HqÈg¾ù¨êIÿôÄ«¼  UÔ“åõÅ» ­ øÏ±DÖæA™(/ž¼¼6“§û‹ßá_šÇEçýª?/.ž<“ZÕÞøÉâr¢M­ªRO@NéÊL«ÉÓç3=ÝÀoýþÛÙ¼,Ë©ùn6·¶œþÄÝŒìØ6Ó…¯oà϶—Gö#·×¸Îþ-K/Q¨é:' ­ }hf¦š~„VÇ“¸Ð'ø#B7ÔÖÓ+oø«?Ý¿‡ÝJ6°[Æpa\HÍþ\üúä¹ó™#æVÕ¦†‡VÎkö÷³¹.lUO¯h[âÒÌü }ÚüÞÂï—[d߮暻z6w¦D-ø Ãe^&oà÷˜%¡—å÷(.£°8ñ¹ÖªvîÄt\²‘I­˜|#ï:QÕöêÐ=߈%ù´Ì„ƒ¼ZÊìGýp'C7¢è9{`-=Æ 6^×ä›E¦%³m)ÞÜH ­2±]v¿‰L7îy±õDz»Î¬¾ˆïDdÌ£·¹í »Å¥þá@ÌMPÁ²Ü‚#õÊÄL¡¬/AšÄ¢'P5fÎSQ”wÑc]ïhÙP{¥•iÙë¸ÆÕN§5”€›>7›uCyƽ3Hïá³êF_ÜlÅ¢ÑÔ«µòÖ6þ#;è!S’€{9VB$F¸@.û=4çܼ„fL½ÑYe7Ì 9%ºÔ ‹ÿ³?êƒ,¼’©§[Ewï``ÓÝYu¯8{šŒAìÐi #@;„P3líb´Ümù™®PuðqT%lgÑlél©CFŒYà ¥K÷¤Aðá i€F}¼¢Wb2ªo¹œâŽß6t.s…Å‚»dz^Ì#Q+ Kr¿ÃD:Jj KY“Et¬ÅfG§ö[²r¼’®çÍn½íñVÏ–Yõ!µzs¼%ƒ‹±Ü}`Ðo=QHœ—¡láíÒ¦Èy,@§݈. ™Ê@…L2Ï!®Ñ è ªŠ:¥Ds쇤¹Œ%)…¾mxž¶å‘Eã ïéÁ“N×­œ‚-'ÚªÒz#޲ÀôªÀÒÏ>±wJÎËͦ@¨,ÙQ´Êñi1‡¡þrBÇ’Ç=«ô6Wit¥ŒNãÈ¿Fÿ¿8?Æy”ç,€ÒŒ——OEÎJ¡ºÙ,P}iõ2(à»qÎ_èÅ}N$ƒ‰”õ4" G„dÌQ‚„Gzâ ï2â&qñ ¦͇(ð…ýÝ^"B–õQÔ~æÎ«×hù ”÷'¸ÑÆ´½n%Úi“¦öPƒÁYÍX{eª*9õ$9Þìb Êï€HW)kò*À:³˜›hÈ‘‘†àQ`ìÔZ‘¸@ñèV|¶IÑÚ+[…†E¥ xãœ<õQqƒ*]UÐ(9dr(·¯”s'ðaæü´! Úž ¡#ÛRÑæqã{áIWäl Nê#jìp8Bú›ÑÙeêôþD¸”¡Ñ tª0åýÑ@.röâ]¡f§\Ðw“ÕàRèÝd¡w…^¬Öî =$µì#™\ÝÆ—h·™^&N—ÝŽG"WeÆmî˜C‚Ö•Žåù`=Ù±`Ãó qÕ_‚)ªœSm‡èÎÑ«É##P«2T'X[…½Ê•:ËN㌜\é+9€ÇÌ@÷¼ì?˜ƒ¦u·Ó)/Çdœ@EË÷—üÌ¥vÇÅgÓ>V²»¡´Ê–þ ôVç6ôlHE››xÛD2JÇV¥ •‚ù‡œ³É.|ê„[Ê É!Î$ nÛY±9ü0{°9Ý H†º(^+#2ÖÌ'5¦o;HWÆ÷ëÈC»¶ßÑî¶8-ð#J}Ÿ@·—>겈Vn,„¢:|P_ám¹“á“°U$­Ä¦j¥c¾õ˜[gSTYçÐâûhqd¿¥ŸetÈóðUÃ’gÙ/ûË tJpÂ(ï#‰c¼9·}ŸÒw'ª¶ÛÌx!£(¸I•ëä*HæÆ ¼9°gÀcÐéø /}…kßÚ¢IâÕ†yâ<¾JÑ#׆Úå—/:4áëU…BUYªŸW…2ÇqØîY Ä‚o+Xô¤à#So èij+ƪt¸(ïPØÆÊÎ@Ö¹x®îñ«à¬KËañBãâ¦5±4]MŸã5$Âìémç1Ò—:/¸:Ôí6ñ–,Zi›gy«+ØÚÐ…Ëø­®9 g²EE9 õ¨4»fW)žláûL…öi–¸×9ñÉÇ̵íÙ‡Û3gÂä S±Íp¼è½ãjºé7rûº¨ø&˜ö±€ÝVk(ñf踜¦ø"KäM¼mbê¹zø¥ú}eiéj/‚éîâ Óm„ŽS?z§¼s_“¿:Òdù‹‹÷üye“}bA©6Þž€Ä'ÞÕoˆó×x¸1” *U‡kNÇóŠU–ªòå½ –VÁ†Ñ‚EL=‡¿fü`¬û·©&i ªñz—âäæ^âÐųÅÅ¿+¡| endstream endobj 23 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpngXX2Q/Rbuild32e831c33c83/gridSVG/vignettes/extensibility-notsimplegrob.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 28 0 R /BBox [0 0 144 36] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 29 0 R>> /ExtGState << >>/ColorSpace << /sRGB 30 0 R >>>> /Length 143 /Filter /FlateDecode >> stream xœm± Â@DûýŠ)µÙì&¹‹iT(Ä»N¬Eô ßÃ(XXÌÀÎ owê“OYÜ­ ‘„E¿‡e«<íý šó§˜lºmÅE-ØÖðWÌΗ9| å—Ûº?\×nSZ> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 35 0 obj << /Length 1780 /Filter /FlateDecode >> stream xÚÕZY“ÛD~ϯpåÉ."Y§-o…¥ȆJ…@ÀƒlËGâ K^/¡à·3Ç×RK–´²ÙàäaÊÒ¨»§ûëcZ#?>êÞø½ÖÀôœ^k8mÙŽg–Óê[=Óv­á¤õkûºcøŽÛÞvìöNŒ…+1†blÄøFŒHŒ[1L1F#çgà“´#-꩸4ôåT\îÅX‹1fÜÌýfù–ø¹ã‰æ˜°õÄS[ÏþÕù}øªeµ Û6¾¯5ÿ¢c8={ÐHu,T¯}NµxµZåúHÒ¿å³îMÀ€„ÎÀ´m@>œ+iŠÌïs Ì^rE6cvM˜]?‰ñ³/3…I¥ü²¾¼ì“8å åˆÔ k ï·òf©†¸÷Úã0½ñds0ÄzjÊùFLô…rŠ-Qú‰Ë^ê<—!0ŽòòpJÒ­¢ULr™0aøXÌ ÇóM_\Â" „Xàå±í†ëø¦ØyIa!߼G¹Ü(:ÂDôJR}©3¢):vJ1Nj¤N0B2 ÛÙékæ±òf– [D@„D]B‰ÃÄï-4y\tu±žó¥ez¢5p¥c›í%waGxy@‘)/ã¹2Y^‡+º ´WIz6À¢;%IQÌv›Qž6Ä“EF$¡ÜEiÙõìT²w<ÅÊ#ÍW*\­˜ëTûÂ÷MËq¹+2…‹®8_¤%ê9˜¥abÏyîfÉz†mY"×¼|U—ýÉWXw¥7:Y=o¡ÎŽ•FêS¾DɳQ u Ulko6(¼ ÌÍë[äÕÙíóR“ë´½Lͬ䪵2µü˜ÉŸÅÕüJŒ.Æ ¿.®70yZæÑèUþJU®ê’Aðþ#¨(½0`£[±.T=°-‘ò€Tòa¥•î2¶9âa•Iû¬·`£á9Œ¸cì–&ÅO&¬p›“Ù4R(2š¢î¹LßÊŽù#âãTãc£ñ2ÓCü{ñyÀo÷eT…S·$ϰÌÎ#+;:UXáÏ^`z+ÿ”$æ Ú“t^ ý Wdœ} endstream endobj 38 0 obj << /Length 1933 /Filter /FlateDecode >> stream xÚÝY[sÛD~ï¯ðôIðF+­nh§…†™0 ¸ôxPlÅq›HƲsßΞ›´’/qÚBZiW»g¿sÎw.ržDÉ SYăñÙ@‡‘ L8HüXé Œ§ƒ_¼/†Ú;²×Ì^O†¿_FÚWÆh{×*‹¢î²Ú^Wîò£“Ô9ÂŒ‚TEQJ»ž•vYµ²Î ûg9IâÙÇ"‡Ùõi¶:ƒ{ì­ÎqEwàg©JŒ=%Ãî¹½.q1áa•½Níõ«ùtÓ›(#cpÖt"B«’ ÍQa|Dìea7¯V¸†óWõèµUfr(à]l"³‹¿Q²¾ ó¡d²O‹¤h‡Å ¢A穯â¨ë¼Zæt8 cê.«Kø»áÆF:º ­Q~«RƒZ8­E»y†I•Ž#×£`IÒ¥ïѳM¤Â8Í \d¼7…¸QÙqzãsviMpz— kDkÚ%lÉË¡ÝÁøW­~åo‡Aö†õp)‰VIÚ —*a³Ü[ +ò,“üæ#fòeŽtFK,ižÈ,–Îj’$…û> ~ Œÿ&ŽucâœcÎD¹¶©Sz·@~ÑËö-n™œÖå¾NØ^q‹ªbð¾Ë®ÀÒ£‰…ŸìªŸÁßlá¡M9¡,TôÞæ9rJ+F¡ŠÌØ» }›Epå Ö"$  "órf'ãåt+‘Ðö¡&¾\°’È›Às„ª·'ÂHE–xÔ˜#6ŒR¯®`ãš} ùÞœUàõ(Ù´oã|ZࢠgŠkšš€¥óšù¥]ò‚eAv[íHJ½Ùx˜†È…‚QÒ¶ÄzÕnËÁð×hžD“‚yÅøÙï:ø øT¸eRã¶9s#gªcÈuCPiqÑØ$ bÈÇ~车F–• o1eùÈ3”y½œ³ùya¾-xL¦"ÓpÁÁ"UgÌó5Óÿꮪk$ZÄ]J`ŸWÈ­1BB[|SÝËß²FgS|ÿÃ3±±k}ngL“Ûñ-èâ©7#FB‰rÒ.=E8…næ œ+'«ÂËËB|&ºàt3kv3ON–Mõçóg¤du bÛeÞðcI/ZIƒ7@‹šŠ3ŒßaèÕœà- ÌcSšîgc]Ð«Ž»…-s¢2‰ž-«Sq¶¦´ƒZdJ‹'ÀEð\rPç-“­›‚,jÜKÐÑXG1✰R a¶0oØ j˜ÍiySL:žÁsS,lÚFþD™†¬§Ìõ›&Õë^1Ù,™JM*˜@¦¦[™©4d‰ lߨÉ®7mÃrIlª·õ¶yJ³Ã1߯¦ÛžT€"î åô®Ë[ÄLù) V-G—:~…MNÆCQ !_µ ¶GÅ=-hK9•Þݨ$2Ý`:¥J‚MîÔ-%!C4á1“$k_Q¼Ðs‘ãl¿'täÛ^=üp©ĵÍ^é>zÇðZºK¤VÊ(°F1iÔýFybxFÅûi…âà{iDg\íKÎ0MÑâ9Öü†27ì˜ví¢iöÏmyò3p­M¢÷0ñ=ã¦Ío» mÇKÿºóóp¼³oÕv‘ûñ!ªMÕ¨#Ô¶!¼;Ópÿמ1õ7Äj;&ßP¦÷³¢¤ªÓDã¶ž5P‰PÓjWfa³²’~p±æ¨¶Î0\ÒñÛZ”8±§eï‘¥mÚU$]nùšÚŒ&kõ¥˜ä ê›Zê™g<×s\ŸJ{¤Ny.gÉ»W÷—¸‡T‡Â’\;a¶à$Xpl7Ÿ|©ÞO&w’t_høO:[•ƒ¦Ý ¼A0HšóšîÔ©!×9·¶] w#1Ym!¡-ç*Ôº‹òßSæÝ%ŘýŠmµtì(yðK¶f»‘íq[á¤ÏŠ=ÖÖ±vë+öä f_í¥<ÿ´ùqËßüY«õžÕ"&ùµ#ÿ\>ÆÙõÇü«ØsP.Å÷Ÿ+VyÆkVO®£ šì„rÌF½pLðö_€^Èœëhǹ õÚ‰%éRÄZ†tÓn;g>ÌùdAÀÖ+Þ&™å¹“ýd»OKùÖ ë ;2¥§æ1ñj×o¦òûäŠÔï4Þëå~Šr ò.Þ®+žË¹7™°7%•N¢Íù½¤ò?XþßN:—<˜ÿÑùEÙÅï¦Ö£ÝÆ‹[ãí³À±SDJÇm¢ñ \ò´øBŒ·à;"ᤴÛû¿Rˉ¹*Šˆ”Dh~uÌ'~6|âc¶æÎôv—s'ð×Ö²mfw°?ï-gB¬·lùP…ô¡Ô–~já¤MÐç+Ëœ{³”%?>õ¾ãõ ¾Üü?Ró%g‚OL%ôDÒ$ªmãÿòÂ}ÆGÜÿ!--e|Ê!ßOU÷ðô©Ïìõ-sîÅ«6wJ»å UÆ\ù_}jHW$]Õk§7ì%UýôÒÚ!ÚNËs~8ñ®Ø Û·?¬j%‹þÝÁý}o}ýHÙÿ_vªLÂ/"*Mù+6‚u^ŒýÄÁƒ  endstream endobj 41 0 obj << /Length 2501 /Filter /FlateDecode >> stream xÚÅÛnãÆõ}¿ÂØ'/Ír†Ã[š, Ý6EQˆÑ—¦²DÛÊJ”!Ê–·ýùžÛ )J«•íäaLr.gÎý&ÿxõæýǬ¸¨L•»üâêæÂúÌ䥿(’ÜXW]\Í/þ}ùÝ;{y ccc£…ñ(óßÊw ãÆTöâs cMߓ̥—L¯dû÷0Þ*°fê-{”cKƒ£Fžïa|x÷Ÿ«¿]$kM•e¿úæŸêÈÝy¤|+ã÷&çQ޾I›ï­–w„½WØlì\a1=ÎBg«nã›H8Ãèí]ªû_’,Žoø†L>=¯ZžÅ³3Å uÖvg'òIç &¨Ç’}ª‚¨µÊiøÆ¿`ü¥“Ë,/e„£0£$ßvø~àò§(7rëõ'ýg$ì(Љl+ê45äóù8#øâNÐà.m.`d}Ž…[¶¦0ÿ°‰tÇÞ(û ‚ÐDýU@.Åæ‚Ö/”&‰Úü ÄL–>ÊR-ãç>˶¿ËékÙ¦}Â""O[@ø‡ì\ ”Z9ïû¦“’†7Q~$uÓ±r­<×L–·Ö¨bK9Ô&põ~ ×k!§}9ô¯²'Ì=üJø´Tkš!Éi ¿’¿C7r*ˆä¸q죅¸•»AÍÀe­ÿ‚©,–s= ®ç€Oö¿×r—‰Ì:Ó‘k@AØO§Ï_¸é‹û•§Oë:· §N§¸õWˆ~ŽÅý3xùJéCŸ‚ñ4n¤l÷¹ìîQ¬ÑÓŦ™ˆ5°)\½R¢ŸïsûP¾sVâr®×;]*­‚Ö¼¯û`÷Ì{>À×Ë–´¿m_G$ b’õ±Çrü¬Ÿã‰9áÈíiÕÃí×BKÎr •P|]èŸ<û"sX^NÄD›Ûøp[ #ï¶ó³V Ñ…ÈݺU7"ÕyÞòX=™=S#&:È_Ømºn§íï?úôÂz“úÜa?”3­LZz>‡U@³ ô…Òö45-Qg€[IZ„3\»ªâ}èθ<â1š`’]C¨ŽG¥¯G®ñ©)ŠŽˆXˆË…娅iilG89Ìâöé]–_NokáÙRôbÍêãÊÊdEÑ×<¼YãáGe¥5T^iž“6ä0¬OñÏgž¢ƒµiJ‰éV8 fëÕ=°!Ga¯vðth}àˆµÊŒ«N««7àýå•fºnNfÖÖï]¡Z‡Ás,T’?ÈC)Êïá²OLî²>›Ñù×iá‰)5¨oå†Nî!÷3åô ³`Ñd\ZßÄŒ’ko¬•¼@Øøº4WáÁ’µ¿ þEÕrD­Onþïx“è0ý^„jsOšÀ¿â‘ÈÜÜã Nl×ü¼æ0ÈÓëe0Áªs—¼©ˆ›¹üœeí³”ñ–m„ª„°œÎýÄ¥î6½Ÿåû¦ã­Éó‰T¾²‡Í›ˆ¶“¹¾™g*åÄŒ9Kf,øÕŒèã;(æÂÙóËéê>t‘Q¥l¼ªŸß/Ø48J©Œë™žöæ(¿Œ_I¬q­åùQFæè…«g3ÒWP”G‰Fâû±4$ÏÁ-F©l>µúõyMݪ}L¼ñIÄDéºAÝã8u·è¸¢^ÛèÁ–ì #¦k…ôh~à¤Nð¾ïŸ"!1tYvŒ«eRWö3BüfK¢]³M,¥‚J”Ô¼ çê§nsÔjÚ#5Ÿ¾ nj?åpÅA¹mSûÊUÚȆP@¹e\bdz[ʉmà†¢Ár˜~‹ÔoâªO¼¬•–ˆ•¾ƒ-º2ÓrzZ„ßüºè5ࡲO«âùn*1Ö³.D+DA7¿E ­®K!ˆ”h׎\b2?hBpÅ÷S³;4!²pBÐK¯aâåg´ÝGÍïº)Ð;Ø„në¦ë/†E~Ú£;(…÷çzŒ¼jä.ª=S¿Jƒ„UÍæ¦‚¨«V¨,ÔgARS>…nÊ j%‡òb¢ RÆî`„f5ß`šœø®›’ŵ.Á¢Òöðc‰ÈD½Î‰ó:Ô(~`޶yP!Ø'—±DŸÕc›¹Éw©EB¥3ÑúGžèÒ· ™ç}Ûë¥UÌÊžg”ùµÁ!G½À½4¾c^B×õSÈóPA§ÑcÛG7jª6kÝÀ}Ëk(­A#ˆþüÂ1ó6*-WKñÕ.ñGÀõ£dÿe¢Ãxê~Ÿ5réýkØÿÆò¬?P›†îvïêãˆö®÷WP*›4Ϩ¿_–ß™ã¾7¾zózËp“ endstream endobj 44 0 obj << /Length 1971 /Filter /FlateDecode >> stream xÚÕZY“ÚF~÷¯ œT…­XZH‚²]^§\Ž+•àø!Ƀ‹ ‚ ØÃUÉoÏ_K­AwMò0Hõôt}Lψý§çAØêٽР[ýQËõ:v×ñZ‘Ú®×kõ‡­ßÛߟX^èöÚ«·=í[ÑbÑRÑ&¢Íð¼Âóï~-Avbžß~,n-}{s0§?ûoZNËr]»õ"ÊëLÖ¢-D{~gbß ÷-ªÔá"ÿᥴh¶¸¥&(Ü÷0ç.Iÿ–ïNÏ»Ìô‚ÐëÙ®ÛÕ„0µœãòÄêø!nEw¦GÞ‰l7ð5ºð$aYŠÀµ}¯Klf„Ôå\ µ‡R@qMµLö©œ`:¡›K™h‚‘Ä^RLç'‚õ*U¸©×bœ°±"Ïtg\¡±çøv'ŒHÖS71äbSQËw„Y:ݲñçÂ>öGÉ`°:±|ßkÇRÜ¡¼÷ åRz§¦Œ ÛL“iÃ)Šl^£‚«Dᣟg ¦«¯+‘=SÉx´R! ØÎåïRÎ0¾”T$å@)›eúQM™z•h±¥{j,Ãzç{ª½” œ(´c§`u˜‹u…g™‘µ…katÍÙ°ºhÚ±A©|´/ãLß@’D'RÙ³T6Ke‡@vO ŠUÜH㇬äÚ(§œ¯ }£¦+ÒÚó$ŽèXÇSxÞ-Þ¤ÉÙÉÙwsx¼#"-®€Ï޼¨ oŸå†>B -ÁëiÅJØç‘ …ÍLxK‘5_ ì’%NÙ›ê¼]«]$ʳ†ÚUIçØbÚ!Ýh΄JnŠEe¬bâ"+r]!¥å9=;<„z¯ö™h7tª³Ô$X²”C5Ó¤)F§*5,ÉäC M‘hè{$¾s,c]ô?#xÌäù¸”ÊòÄ<ƒï‘#ÿKÀ½B–<ííš5W÷äDcÐzPÚéFF­å  NŸîADi…k§5óBÔk¶ôs“H´ì@¤›bØ%üa‚™IúC¯0ŒÊ„P↠w4).3ã±Ä³©{ºxÖ~å:v§ãn:׌mbàçÏ[­l®èÜA±vÆÄX±úeÀúÄ–úÔ¨q¬.û þÿ°Úl±²ÿ\Mùy%rÚ¼mœ±Š0ef#í´?+€St“-¼mà’ŽW 7w 4„⟮sEbÑÕ,\¼:ÃLÜw0ãC Y›Þv³À_3YS½lÐìg Åpˆµ1ä®ëÎc©ž Ó,Xê”Ö~‰gê£i@“2ßJjÕ ªÞO _ ñEøNÕ<®ß üÏÔYæçDòdu<‘L즸i&þ1Ŧ¥|ˆ7SÕV8Ç‘â[øÜ«#‡þ„-ÿÅFªô±ú¿ßªÆ×±UFTY}`õe/ZÙïÔJ_G½5s´ŸYÙsÙÜñ®€BõðãªF%Â_Lîw}v$§$ØLÍ=ªN~|ÈY5PÅþˆ?®ð˜T9CûâL÷…êÔÁ©dÕmnNwî·9ß_ì:´zÂΠMÚiõ‘µSBóM²:R½*ô˜Uìëc-<âð¨É~O#Sï±O£Ò 뫳\þûr󩢫/:&åk®ØV¦3lFç~ #ƒÜ.³…-~Ýé‹Ã¶§A±9[Þ-¶ûlÀá–wµUCG,¾&ùÉmÁâG°œ"æöÑ”< n󜙛 ¯ÎYµ˜À¸?ƒì-F_Tœ ;xEZÃáÛ–^äËmň|¾G…•8?‹åRjT@9g™kÀÎÃo ôø?˜Kª ïçl‰Æú#h&ÆIÈìgLqÂiÊ 01Ýòáð6Ö{âk¦‘¦,œíÁq½ã”35R6yýŽP%)¦5[ÒMv¥¼™·}]Øý}$?Ì4ˆÏ 2ß瑬߰¯£öÆéªb³3Î%‹ì5“î]ÍòÞddgu·lc°Ïº ìOfl8劕¯ž¬ÌÙ®‹†™¡—·,Cà°4üyGmœäCÞÃç¡_^À‡z¶ñmŤc²Ï4”w¯jÎ+ ÒARN’0Ô_©fÕ, ‰dd,$Ÿ›ŸÞT–(¦ ×Ô:áÞŒŒX¸§‚Û ïj^ç4)D¾¨¬Ã‡êu³*=·{*nWì¼qUþˆ±„Ô¬,û@Qž¬ï¶$˜kn¤“3épÙº;¨„>týmnŒqKõÌb#D‡†lvOôï¿ü}·lh©B¥«lûÔ…?rðµ’6˜UòÖæ¶{ÄÇ«ÇÇÅÞÄο{íÄç?ŸíjëÞ ¨ª!ayȸçqõ?:\/²CÇkY¾'úÀ:’t^õü ~M†N endstream endobj 48 0 obj << /Length 2117 /Filter /FlateDecode >> stream xÚÍYI¯Û6¾çWn2Ó¢vi‚È ÐcëôÒô 'ÉKc[-Çïµh{g†CŠZì·%E‚(r8œåãp†z;6» ãQ*ÒÈ‹FóÅH†‘^0Š]|§£y1úÍy9‘Î ž%<¯&¿ÏM¥+‚^R¤ax™J>Œ,j“àùb“Ï®K^w4õ%±šu5I§ÚO¦~è:õ æ”Ø–NÍìPªj¡:3õÚ!ÙIµ—sä°/Û37ŠqxŽ=⻆g·<(†Ù¾¡g¦¦©ñÙèa×ÙVû6ïjûYÓæYMcÒ)Äd¤±óf™ÑBð<'[¹m+&^LÌÜD©QêUªyÚkQ˜0cz\è¤LÚÆ€ë‰Äa-Z#cÅÍÈZáôn誗ìû&t…&šÍ¶äy+ ¤.H§©/}çšÇ¥ŠÅšOR.޼|^³ ÕNä7®_äØÊ¥ÄR™ŸzµÕÜBÐ/ Û°Ì+ÔmÈJ.^„pt<° µ¼H·§ŽÈÙfè“[õqMªòH¶#fmE"gê-°cOö­íAãÈU 'êAAoª–44¡ì;¤wÙÂk ˜áˆ-¾Näš6Óì*J-_1ø20Ø}wËT„Qƒ‚ŒÒ[¨Gjß(e{Æ@1Xì³öÈ­škýqäØP7Óx»ãg>ñ#œ^ìÙ—¼îÍoUª¶m-¡pE"ò0,¥Bê × h¸Aõ¶Ú%Á9µeAª¼Á;÷hTÀ´ ÁrRÝDñÑ•JZò1šr`“ƾðâôklRé_ؤ$û‹Úv}¡¢D¸F¤kò–áÆl¦F¬j÷šz©!„ŸööÜPG£`h”¡3×Q R ¤´Õ¶å^D6„ÜvL'r@›§‚d¶Þ™hÞšeÄD„‰³DlT×LÀ){´Ò±ªÐA{©x¬rF+3/£Ésv6,{6ê‘ÃÀ›3~_3ŽýšÔd¯žÁSØÚ¾Ô^»´?1ÂX¡9+Ø£eÑD«&D¶‘Šd»&°š:ˆòÚAòUŽ¢ ¶u<¨=îû =дÁ–mô–F!#WiIþ¬VýZcªŽ5ûäȃÃûÖóEb$yÉJœSêÕ *abÜUn˜r[2¤iéíVh—ôkƒDíŒçù@ä—_ÅžYâñqFžAØÈ•©ÌVö¥~ÇÊút*µQ€ü”¢3¾µèØnC{‡Ø,oØbû,×¶+tÆÔ5à ß îÔ¶Oì /ï³}PÖ¬(ñ¦AªPbôÅÁ!ØL=Š0H;Gøöƒïguðî{×¾¯‚Zý™cN= X çAÚw½óVd1çˆHCÑטHúE£íh÷ŽzÐ'²mgk'\Z$J¬W“ièùUðèSïü‰GlÐJSÕ\°i)ÉÀ;òFAg^KhÿRï_CIÞ˜¶J•÷—¾[ØÖòKÝ*¤½ˆt¾çzíé‡UWà›¯Êý‚½î±³´¶çœrûwjÊ›³‹Ð°•GâgΟ • 8±E’Š ãÚúnD4,òA„,-ƒ½·Œ~}Öc«KôøK¿Ë>ò)×g_ DÙ“=0]­ ÍêrdyºóºÁ`ühÙþ_Î{ünïjõ0ç!éßço±ø¨™ëJ6 “Óg³*íʲ‡\—ÄNÁHþOxpR=T*ó(•¾ð®­`ÂdÛRwšÚOSVªi_`0¿l €ŠGDnÔ­P©ˆ¤I’­jÉs­j òJ×^7¯ä zÏ·~™‡>”B}±CàÑ$rú„Y³Ä⎴æbºG"¶ŠìÆ=(ºYª”ñ„œÔÒ·)—¢¨UiVåŠc”Äç4)t¶„—/´öĎΫÈJf˜ò¡¯cG­ýr…Œk éONÎ8pN–­Ûø<ä:•;2Ûl`MT WZ'`Ú¸'õϺG¦”ùñ·ñrÈ=,eŽÐ>ÑîØ4ôb¨Æ‚¸}$tê]¾û¡¦®´ÌõO¶WãÙB‹É_ îZé4¦‚V£ÚålPϺôã¶ŽgUÚжo!ð{•µíf̼ºê¯ÓÇ@¸J½9›E®@Çõ3pw0õrùŽívâ$0ãäpÀå]ù.pÕ©UÆœ;gÀ#8ÞšöÙ;nNtæœ-0%2ôÛgO¬Åú¥ûbÎõ¾¶Týû㶯Á˜ÿêt§ê5n§$+KÞ¤¼V:Òý=Òœ¸±ï‡Äºddè%’Í2Wû3¹’kÛ[Ó† $Ãó3<ày÷p§Ì™%f0¿röf™®ë¯“×–9·ÖmnxîÑùÁ6>!Ïd(XbïÕ+迱ìg’Ú×®}?,E˜ b¥„÷ƒ·IIsa×¹B‡Eõ5$Æ”•IŽvjÿÕ4I“ºQI|á¥Q[/L4_s^²Ug’FyÉ.: cÌ  ’±šVZU}Åžmò·fêöø¥¹ÒI¸ÿµùEêöÿ¡6~3abË.Þñ°æ¿²rW„Ä þ·:ãð¦ÁoŸÛ«¼dZÕÓϬŸ³¢¼`£n,|ú"¢Rë™Y—E=Y{N'2Z¤µ X¤›fÚŠñ°æ•µô÷˜ª£ž>´ÞZÙ±žî*R~5Ì:Ÿ-ž÷…§äo…«s?è·Vå”±}2ó}ÑËÝPfä1Þ>XbÔÖyuäõÉŠk»Î™–[YŸÌÿ+S8òÜGëÙ€üvžÙÆëüý ‘zþ¾‰' Ò={7ö/»W“« endstream endobj 52 0 obj << /Length 1877 /Filter /FlateDecode >> stream xÚÕZYÛ6~ϯ0Úˆ¸"u'm4ȦÒ hÝö¡íƒlùj¼–+iä×wHå%{eg½N¸’x çøf8Cï£'—A4HXŠp0š ¸°0ö‘2.’Á(ü5üî)ΡЖÐ2h%´ìŽÏ)´5>åÜZ-WßN <5,»¯pÚ÷оé ÿ´? ½Qãjé ¡\âÔw4d84-‚æ@Ûå.±w–S\òtðé±&Áqè9îäã»;JrÐ~xúÏèíÀ8œ³$ú+1Åqù}Mx]+EîU ÝO”&»WH‘.Iq™ÑÊZËþ ®—k'øžâœN%9§äûòœ#)Ï+ü6}fÛjZœMwŠžU¼ŸqþÛÉÍZÌóZñ-F†¯Lœ¿{Z"ª×ùXÞ¶g¸Å]?öÏÉvŠ$3ty;T`…Kh/¡½C̽>³ë—ÎKz‰2‚ö+´ß÷Šñ8Z ÛWÈëŸ$W0ÑËœòj¥Çïší’-úïµÐ½ü¼¢™tá?Â÷{k~y&Pµoˆ˜d †,³Hõ…}ìÏ;s„(ϱ}v¤ûLqv9Áƒ‰äp—ù>oÛé‚pS‘#%%ß{Œ\×ɰKþvkgz‡€T)0Êuo‰zJ2v\Ë·küTë4Z ]*A©Œ©¨ÙLê°Â¶;;«ù7úÃ:)¹ëØÖIóY ¶—¨C ["¼ RA>ϳ$K´clȹ¤T šËÉñîbì“¥Þ¬p»–ΈCP¡~B’+ô9ƒú%AÂæ%1·]’lqŠH xÆiïpõ¸ãŽ`[Í«©;(¼'eé¸>n;VÔû=ÛZ‰ÒsH1BͶªÌIäšàpe©®'ÄV$w›­n,\çäˆÍŽ#ý/ÎYZ·"G’¿"‚=­ˆÌUˆÛôúµÃH_î~ç¸EŽ–V–@k+dÔß㪆‹ÕŽ’´M®€Ûñ×¾¨Ù Š; ðÀ[X5œáã[tž #Q´¡\·0~VíÈ÷葽$ÑjLŒFƒ[™ 0ï,o¦‘ôH›àmGNJ!³Ìö‡´YGd(HÑ…ùý‰ky¬ÆÜ/PõKR‹šÉ$ƒ™ƒ¾²µêçfÊÌ ÃŸúÞ}œ` }t¾»~Àr XÊ\'{$+xß>f ¿¿$…}@¤‹½ý ñƒ­"w‡'ZŸÔžüâð‘èŒÿkÇr@4/05Ø/¶Í7S¿²´ç‹™Xº$ãÍŽ›Ö Q餩Ò/-öî(®Úô‘UZÿ8)qËùNTSÐ`ÎO»ú—„}j¶GÓ™¹î°‹ú#ty¢»¦uïÈÀw$柫{Q ívˆš&hÖÜŠsWVÖfi{—ëu+qlI³Ç*aÓ*%¡¶~8]7ɶÜ;³øõIâB¦µ1"EÚ&Îæ&®kÇx¶0=–ÌO4­óîô^kìJ™ïwÈæÊ£7b»í%ЬƴA·ÛÓäñn§î‹³œd¼n“‘Å=5;';J’ã¢å—ÅGç$( ›Ó襼š~qé{î3Ï…üw§ï2.pÝ“ ®—êFT剀V/ @kðð‡ëé­~™«Ãs¬'ÍZÕN1ù·"ØG$ÌuñŠFÚŠjZãß„Ë\!`ºšf_03¥æ’Tá‹mðU¶ÅBÈWCZÚýZõå#ÄHÇÃN DTù™NpÕh* €ÆSùç£îW8*ôûµºX,¶‹ªg™~Ñù·ˆuœR˜œÐ”vYÉA$­1ÁݵÊ8‘ËI@°Ø‚S­¹¬­!˜ïùF¥JU1)€}ˆ¸· ËìNÕi4ÃÐnP!üX«\3å’=—yð†{È{ÉôFÁC*–Ы6s^Âê_6$#ÓÉ•¾F­WºW]Ù«ÍU9ŒÌ”1àe’ëar`U¾Ö²¢âK-B>Ó3Mšên•/iÅ0ô´@0[©Ê¬Öx1øDýpʦ+}Û Z/ õ8·r$59BámÙatÄ`Ĥå(]æöX”xõLíµ¥Þ ¡%_ÇÚÐ(GZÔ¾¥T’éþ[M©'ø†²¬“4¥H %ožhªNÿ^"¾éàš³Ø ×i£Z¯Kuå—h\àð„qß-Un¯€Ók<æ†Á¾X³ïFc¬ÒqMZ¦Ö®PpèàB°ÄNñ"Õ>˜aWãûa‚tÔk­ßt"µµÐ½Ä!äç<Õ'ƒ… †ÖZe±ÚS’Å fÃÜ:D*=*Ä+¸¢aà©3R&õæ™ÃBO0ÿ"RäúsT5í@ÁID ý½pÌÝZa¢•™}ÅpYêg¾Ö.­>æÓ­«WÆK ÿv¡ÃLÛØ\DŒw¸-ZÛi3æp?fBf ^„çg"'>y=zò?ù4Ù endstream endobj 55 0 obj << /Length 2145 /Filter /FlateDecode >> stream xÚÝXÝoãD¿¿":!áŠËÖëÏõ ¢H‚Àƒ›¸IÕÆqÚä@ð·³³3c7ç+w:àÁ‰½;;;¿ùØýtöäü"N'™Ê’ ™Ì®&:ˆ”ñƒIê'JÙd¶˜üìÍδWÙç{ûühŸ/ìó‹ûø§Ï~}y~a—ÐX&ÙÄÇå×–®>›AêÍó[ûO±°?êlùÆ›­`€(¶öýnn®-­J¼|¾ƒO¢D" Ï7û‘xEÙ²"%+â¹,`~¶@1ÇÑ+ØKöN•ŽE‚8V:n”YÂÖÀÉm¥I9íD:i“(Q™‰˜Í3 ˜LÃÈWYL¦ZÛÿçö+â;?sºNƒ4súls§+^lIk㣪dAû¹Ì;²9fðµÄig#`QÙ:ïØ–¸U}Æh_šEGJGšõAhXq¿8Ö<Ð*ÔÁïÅ=kXtw²Ò8m¯[íö[¢eAKR¤ºsƒÇ¢Mƒ0VQÒ5ê+4‘aç }Šr*tLuf¡ Ù'V¾0LÑùN€õ/šøÆÎ××DÿÖCDï%¼'^Yt{;û Lký-úä[áŽNܦ‰ ßJc_…­W×Ù}ÕÚ¤n•ª¶­ €*/¨ØeÔ‚w–*ߺEˆè\»8–b¡Jû.\n]Ø7Ñáòƒ ¼ öZÂäl[ÔhÏ ¼KÄ‹[RVø_ßs`„ž‹„óº„ì°sÖ&(†Þž}H7^†I ;`Jr‘µÃ$ç¯ÀRðâT¨.ñc¬òD,jÚQƒÚ°ˆ³ `›!`‡©JC##ýX8'†ÕÞï Btù¥£¥0ƒd) yvbáâÌD¤õ!ÎY³ _Âä³ÌƉJ̬‰£WAÖ÷^•óö#_æ6CÚ×ÔÛ8DŦ%(œ£^" %ÈÐdÝÜd“Å4ñ30Fˆ¡a‰‹ƒ™¢å´Ÿª8 »ŽÌ×®ˆ÷¾i*Wè‡eqMvà\Ó2UáÈ¢pvÒQI¨‚ÁÿŽMc‡ œ0ßO÷*hS nŒÌ1¶¦øàX®\à—¾H¥&nò+ÂüõßÂp¶¢|RˆW á­Ãæá$VYw-¸Ë܉rk/`sãÖÀEóPmO|¥ýËòÖ„FίB`š…§øülGsD90=`6 eV€Ö˜µh‚iAµ!‹ZŒXUm½,öÌŒŠ=ƒPÛpÉz™µÛ@Jg)lÊ.Ÿc6ƒ9€P`•†­ì7kÕ-h®,`ZÅ&y3¬ßz‚8ÖÓ°®c”À:W m0d!Ã0ic‚[˜†k[¹×œW*nde¬vØ´¬[‚ü†ê*Åõ–v©®péΕÊn·¸•ØhÕhíÛª¦ÙÈÖΘ¦À TP(º°=$$iˆ§:N*Æc¥ŠÌ §"ÖI§ß0¶9A(Ø„àÖ½°1„'‘¨D¿1œ ‹] p¯Wdwî«+#l0j`…¢}CÞþáŒØk >di<+,¶>-hgk­Óhï=‘%w 1éú¶ê sx­ÕR”äaQ¤FÀ*ë'ÿH¼ÇsŒNMöD¹e…è˜*òì5-ÅÒÈã®’kÏÐ8Hòb($?ìø­)ýkrqIÓÌ%JÿÆë´wNÏ^<ŠþCz¯Hå%Ѥ?çGðyP”çdÔ[a‚›· "x!Ïùû’¨{s\oX¤˜´ŒH¤C»lEx¸¦YúK¹£çôþ))qË}$¥¿–Yï³Ãs,<9/!®ì©:Šô1¸¸?ÙQÂXˆž7?íå~*“yŒ·k!ÆŽÆr‘®oD^+EmÊižëéïÄÿ/QS¹üÃøwôß—_¦àóQÆ;e碒—Âm¬âÙ¸¤aöÅG"ù?$à#‘RÒ Úåý.•—püóÿT@‘Yd¡iê9íÑ{D;>%k¾:$1b.ÿNÈZbKvÊ€ýqa4n1îlþ¶ îù©,ÿÍPPÖÙˆ4 žÿŒ¾yŒ·a¦Rà¬ø—ª÷5Ñoè‘ù¤æ—”þcêl››ˆQ¢§Mâzw"o„ØW´Åaœøï2 rY_PÈ÷SÕkxá‚®—¾"Ì}þŽ=r-ZvÉ(UfÔ üð/Pƒ»$î²~½g/®òÿA/É#ÿ·¢ZÞ=Yaxù»UÛ„ß„Üßôèë7 Ê×HlöPó5:Py$YPEõÅïûu«, 졟=ùšõˆ¢ endstream endobj 59 0 obj << /Length 2079 /Filter /FlateDecode >> stream xÚÅZÝo#5¿¿"DH´¢ë¬½ßÕq§;‰B'„tà!MÒ4ÜæCÝ´ þwìñŒwö³iJáÁrÖkg~3ÏÌæýøÕè*J™ÈbÆ7F"NÃAâÇBªl0ž ~9{}.ϺÝé¶Ôm¦[¡ÛŽ_âó\·­nœkúnxö"œ­qx…Ó¿Ñmˆd~dKnu5²CKâ§åºÝ×È\b3¿Gº½9ÿmüýÀxRŠ,Šþ3qp鋉äI_„¡l 6bÜììŒq1i sT€xß8Á-}b¯mnÎö3|üêG¾îL»°;DøÚ·ÒŽšµS[+˵>Â:Ë„¨ ”ŠTÍMŽ›À'Ý~ÖíC©—|c£¥kcLKþ óúsM•w¸ëu“jïë%ê1Åh^d©¤?NçÙß3tÈ‚‰œÖœèU£]vH¦@2Öà0Bªþ¥7ì|‘"¸Pß!ÉÏYý’YšÍ;¦n20|u…¯æØ>Õì§}ÄÕ×8û„¥c¦vPøg®Ê=¼nYáö»(µÄéyÌP7%”湦øzWƒîHËq9™ ¡º­ÙõÅY£½œ@úwœCcÏ$¿b‚N9S½ã€øÇ‘~"¾u7r, ¿ÿpì‘£%º•Ûš@ëšË&«ä¨yí¸v“«8à£ýïÙU°ˆ¥Ó:™ú Çö5 áÆ’«¹]%Š8q"ü(Ô·ð÷•R‰"¡t䃈…)ܤ§|‘¦êhrKË“i¢á N†­ß ÝÝ Ý¼*}:þÊ:æNyÖµÞ……^õãÜþÍ8…E_ù~C»7èpO¢ºY>ì1H¦¨.‚„¶Y1•ΚÈvQ'EC§ºÒãLj‡ÊÝ:©OµJ¢qDg5Þ< „Í´Û°KÿF„VSYàк%:±¾¦Ñå müvfM/ˆêÆGb˜IÓÒÇñQøL½Çò Ï‘tí_âN!þq×ÇêÍÅêêˆ%‹Ó¦5Ê3ˆ=oÏ¦ßØ+1e7¢¶,•ˆ4ÃUã[ÀÈ ‚ðl5ß9/£'«5ÃKAQ"Ä;ûjRؾ ¸n›—än6w8ËvS\©É¯ìÈb|ž6úÇ5S¸‹rGÚa®¢l#¿¨moyÖ3ök;r}®RmÇð„š·µ$|Á’¸5º2JîÐG‚?l@ù"ð%E+ʃnŠŠÐPîâmã(NET4×è_,«šô#¬ÔÐ 4EOÅgóÜÁ%‰˜Ñðdœ ™†UCySzº.^(ý<™×à Ü­rÏn¹jFç ?”—»À½D¥€ñW›ãüÚ,3`«¹õãÌV¶'í÷o"ϾdÞÇ’DÊ:i‹¢ÁÐáI«[ Im¬,jiœq¢ïžÅÞé{Ð;âø‘T]vÐNÝLýûhGƾ>«âØSBIñ¼¶VŠgö¸›¹83}Y>·8†0ÊΖkÛO¦Îò×VÆ0Svoë2€È„fÏf,ÚZÂ’Inç˜7sHáÖ^&…‹·ÙŽ^éþÆôÜGÁðl Ëbt¦åÛkÆ h×;Ÿ#ÅÅÄé³ <J³=ÂËÞ£0†Àt÷ ìRjÊzƒ:5MÃ2mŒÇú2É”¨@$aLÑ•gM{ðhnå@S»%H«"¥0³?z$SQÀ!4`áab APsÇ$ƒÑ¹…V³Lô‰k^ *D˜&ϸAÂLD.8ä×–!-%ô3ßÂ}{a#•*‘é+†æ0X·˜•2ÞQ4aTM¨ÐÜM‹„Y â,m(…èNºÇ“Xd™”^ÜSy²¨Š0ÙÙç‰íVnP°iîÊ £Ïx¶„Éšb“Œt¿Ã¨.ñµlµj„±îPV° e=W„&À0½½ä7÷T®[’ë’€1ìl¨ îæyë|;ø((¿Ìí+ð=¦wåØO/ŒnÚ8ãT•îTÏ/ v¹±üÀˆÓ4I¶é Ï¢—QµŽ‡HÕÅÜåÚ Äx§ÁωíÈÙV Ñ؊БáÃù˜V¼«}mçBmë4ðŒªû=?”ïŠ][±;=¾B‡‚Û…µ «ýÚYªFÉ-%˜¶Ú•M¯Ù™y>i[†•„WØX?¨âuç²cÄ+PnÂ$7&Ó BévŽÑgÝ(çÞ³üpQ- u=Tg,‹ß7#(a«C¶Ã°Œs^ *++UÔT¤2©—Qã§Tee½*+&ÇJtUO…¾Qü?ƒ»a_¶¨è6mC[Iï=ÄRøêxàö,Q°ºp!3ôEË¡¾áÒðdÕÐ@=LEP;1){[v`à¸Â,á#~åû¶íõŸ÷1’埋™zû¬€¾ ìØGÑr—³ïk9û¬[°Ò5•T†wJge% B㑳 ×zm­Ÿ—¤C§+¨v›šû))ÒÐEBSJ*ܦ®n£Å‚öÜå-¢åöÒ@¨,©ŠfR·hì+{‘Ó?)È΋ZÏ뉢Z9Ÿ³äC1‹ ¦Ë¥?¡\a1Åñ·}ÿª(Uç2Øj™¾4ý[–Án±9¶gM`àï «§XݓڨaA¬\"¨üëìç`Ñh!cmÔ±/²Ú÷݈ÿ›d‹dpÙí#ßH{–R`Cû{–È”5g˜ê×ÿÕÒø“ËðéæYùdQ=v2ŽEš˜êX¦ï¹ÄššðêÛñ« vTð endstream endobj 63 0 obj << /Length 1661 /Filter /FlateDecode >> stream xÚÝZKsÛ6¾çWh|©4Âßô´™q[;m&ÍtZ·=4=èAKJ%ÒeËΡ¿½K`—\B”D)JÔô°cöñíb± ùÛ›gç×~؉E8Açæ¶#]_8žÛ í@H'îÜŒ:v¿îÉî(ZõFøW¿[¾ãvqÚ (Ê.€Æ@  ).+Æpü 3  ²*è×#­ \¿dâ>ß þFú¨ÇˆÍâs1þùÿƒ2‰Ç ÇÁ¿¦þ¿ýô¿ú¿èýuóª#máy²cI)b߯ÀÛ†!” V Î%ë2õ®Nq˜|AàmSðL/}`œsœš¡Db#›ÈrªåK\bJ.¦Øì¯…=Æ"Ò,$~º@I>{(ñ ÑÔHÚûƒØÇïct㜺Ü 9Î@ëc@Ü7`NSÔ*Ç@NÜ%{ŽA6C>C¤9’0¬j†$ø,Ϩs†l {¾Ãw#±- KYÌ%'öø&ó~ÂùwHSd7þ™ù ³ÄfÎß[z",“ØéT¾cjߢˆÇvêŸrûÓ?Â-o¦ª=¼p t ôcîêÄ™²² ZÒÊ”¬ ~û˜AU\°º²ø_ —îY ýÌÊ¡IûÀ{@š—ŸÖ4*Þ3½ßóó%Á~ÇÌÜ£²’›³jaŠ8FÖûHõÇ s€)H§öƦMp4“¬MMÏùήq+*eß±`­\ާ(Õ2s¦^ÓÜ“WèñÖömìCžk >ëXà«Ô£9Vè}V±ãZY­µðU­kתuäê=ú7*fH›«³RÂ#ÖØ,¤ ©“úßÒ°­L-æXj(RÉ!O‡ëlaëOèP;›µ­~±ŒïkÆ>pÈz·Û´ô–í/r7êd9Ã=GQ?e‘„asÉÜM†Ÿ®Yµ˜`$ðxÆi¯qõ á¾ êìÕÔ Þ°¶tP· +JyÏ+/q~Ë#dÔmeÆ2×?/ èZ†ØŒÕn CõΈëŒ±£ÃX¿Ã9Sã†ä@ösf8á4c o»ë=ñ5ÓH[ööͱB¦˜V&†A©‘²)êwlUÒb¶¡%]gWKÀ­óï€]$Êzì¦("3JÒŽ­Œá5Û*Á‚VçסïZƒPؾ§ŸÒï+=¥vë ljiBÆ®8' ü[D‘ÓšÝÚ¡eÉ(¸Ü¦Šk'lKvÙP‡òÀ3± sÃ_Ÿ¨Xpð\qª$ȇڟ‘m±Ï†Õf•s–Ÿ¨Xª[PþÂÐ’6dª…ǜàáÃiˆn%˜Hôœ¹~´Žö¦êî 2íÐßÞ+9ã–ë:Ûµí=2ôõpŠ[Ÿ¶#…IÚ-…–Ôš4IlÑјÆ4- êKÆí8ï=Í>(1,Xù´_¦®¯,[nëžwΑâæÓø-Å ]jxnGzÂõ§¨5 8=[H'Ôë®h¿$éhšB˜º¡×fêW±™ÞO0äw‡k͹æ±:x;±°íH󾄥v¬Ë´ER¼D%ë‚CÁÚ»Ã~Žõouê1Kql¥Ü¯cV±ëëñ4Q'·«S}€”¦9òQ—ÉomYHšÿ¸L´$®ç„ÝUÚP›9±¾RuÆ6øžE× ßuM¡ÜD+k!D,täÕ ¢N‹5LÁYAPŠÏ *J—k—±"}“†K£ËÝ©Eìˆ(”$fN<&YÏàÔõ˜èYAt¼íYžÔ[oÒ_êtl9žègð|¡"ž[~QG—'=t‘š¸ªÎMõ>PbÜ^ |7ªïÕ1•ÃUg¼x‚%¾ƒ·sðè)@Uûc.²oˆÈ-=0fEäoy3íÃ.(}xôâÍP*=T’ZègJ•¨"ÆwaçQ÷j€–kŽ5om‘] ˜P„¶O:èk-þr][Gò^(Ñ¿Y‚ÔB;`®[.å×ö…ïùu7 3ºlJ踙=õ"’µåþ+D'ÅÆu™®ï—‡ù4g«2Ì'˲¢S°åzqkØ#¡ ‰É;šŒ,ƒBßGTV$  Cf”aÙŽË{ED?jBßծɳ{T{˜˜æøƒ«¢ ŽžÍQØ` Ñ~•õ¿6¨Ê"€á‹l~Ôk¥S|{vuóì_îîô) endstream endobj 64 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04W0#S#…C®B. ‚‘)T&9—ËÉ“K?\Á’Kß(Ì¥ïé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢`ÇP„ÿþ7Ô3`‡v(P†ËÕ“+ L5* endstream endobj 68 0 obj << /Length 119 /Filter /FlateDecode >> stream xÚ31Ö3µT0P02Q02W06U05RH1ä*ä24PA#S¨Tr.—“'—~¸‚¡—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEŸÁ¾Ô¨o€B¬Â@ø €a—«'W $o&| endstream endobj 82 0 obj << /Length1 1415 /Length2 8219 /Length3 0 /Length 9178 /Filter /FlateDecode >> stream xÚ·P›k- ´8·bÁÝÝÝ¥¸[€Á%¸w÷¢¥xq‡bŠ»»+Ðâ~iÏ9Ÿýÿ̽“™äÝ{¯mϳÖ;*2u&1sS´ƒ=„‰™• ¡$®ÃÆ `eå`feeG¢¢ÒClAÿø‘¨´@Î.`{þÿ@H8ƒ€Ÿ$òTr°È»ÚØ8lÜül<ü¬¬vVV¾€ÎüI Ø Ä w°¹ QI88z:ƒ-­ /}þyКÑØøøxÿ¤Äì@Î`3 =@ ±Ù½t4ÚÔÌÀ ˆç• ´‚@ùYXÜÝÝ™v.ÌΖÂtŒw0Ä  r9»Ì¿W(í@¯ÆŒDа»üPw°€¸A€‡-Ø dïò’âjor¼t¨Ë)Þ9‚ìÿ+þ`ü}86f¶•û;ûw!°ýŸd ™™ƒ#ÐÞlo °Û‚酪!FÐÞü7hëâð’t‚m¦/€?£Òbªàˆïçbæ v„¸0»€mïÈò»ÌË1KÙ›K8ØÙì!.H¿ç“;ƒÌ^ÎÝ“åï˵±wp·÷þDzۛ[ü^ÃÜÕ‘EÓìä ’“üóâBú·Ïp±²²òpó@N‡™Ë ?A¶ßî—|½/k€|Á —$o qvùzÿgà¿-$66€9Ø 0Y‚í‘þ]ýÅ ²øË~¹g°@Ÿõ…~lÖߟ=¾0ÌÜÁÞÖóßð?WÌ"ùNMCY•áï•ÿwðx3qq˜Ø¹XllÜœž—ßÿ®£ÿ=ÇäÊÙ[8øþ÷åœþÙíoÐþ-:À×Rvxa.@ûo¢°r±š½|±ý?ÓýOÊÿËWù¿ý'’vµµý§ý ðÿ‰íÀ¶ž#^˜ë yQ’Ëìÿª úKºâ¶æÿ“ƒ_´ foiû¯c»Hƒ=@æ*`ˆ™Õ_tù˯ù[h¶`{Šƒ ø÷«ÀÄÆÊú?±u™Ù¼¼>\^8ù'zÏ·”²7s0ÿ­2ö—:;=‘^.ùÅâx³½ÈÑäñ‡Åf{ÈK àe9_€…ƒ3ÒïýÝ“Åü·ïo“Àbù&€üo“ÀâüÇü¯!Ì\_¤ø‡&/þcÿÑ=ä2CZœs0¶® n¿©#tgÚš¦ÚÕN§cò^tþâz÷>…®êÃûuç+±”Áô•m)ÚKÑ%ÒGzø°Ö$Õ¶{ŸãµÉÝ6¤… ÜþñÂ#±º>bD"& Ñ=ŸG'­@›W-ÐòTyN®¼oT °nÜ{e<êúÊ–GBçvU÷ª¸ʦ˜b4£ ‹g¨òM³gñÉá LÄô˜gh3—WÓ˜¹ãϤò H¾Ç1Ÿ¼õ6Øcog½V+4Ø]º( ôð‰_]bŽLR{‹ï§ÊãÍ{—E¯ ÍçðDÄ ,÷&Î*hû©à;—2 e(vbQv庛e9Ûj™+¨iHë¼C¨Jd,’*)KŒ³‰Àþ·Äê‰:Ðæ _ºIºŽO4;é}ãðùÙb¾Ù‘\ amudûq?ܱ”'eaS, Ö(–”ßáNªçûJ© ºÄÔzë÷=ç3]3Y¿²ó)‚جñ÷"{ð⩌ݛªÔï'þxüÔo5¨ßP}‰4nÜÁ¾=aâHjäùÌ(ÇŽ'þæGy6ï€|ú:ë,¶ ‘&Œö„ê¹Î1ÑdŸÈ›éÇìŽe"˪'˜Çœ?@jQ²1ȆӑÌŽþÆ£D"wxOrøø›4ߺJ&ééÛe± ¦Wöüç8Ól/8gqw!Š‚~Ô¤Ú™!îŠ@>KL„n'«MՀ̱<Ü.k·ÊIºSC—'5òljªo!ñ “.⦔ÛGX=Ù³gé,Ák)ù‚ÚûLÂIfe¿£Ò­éj'EyãIëéú-$È“®›Âbé+B†â™ªS¬ V¢œØ\ÈÛÃ[>`;¼ñ õ¡´dŸ …VÛ§[Q7›ÈAH3³‘Wy§^8K G¹å) ïùÂ$z©¬ØOÇœˆ0yyÎÇl<Èqê »ýän¸-r'²´4ª¸öÎ[ˆ: ÙSL!;}Ã1!Ų̈ a4/¿N|kà/[Íò·ðÍÁr"úîå0o·FÌ©õ¾›L–æv¬U£¸˜Ë‚¤‹Òhp›é]ööQ§&5ÌùfÄ…QèïC–ôcG€ ”©–µlmhðû)ð¬ˆQÏ“˜?á““ '¼ËuŠMžï8û˜eRܱ+v–}TnØÅ-WêÝÏMmº¤«s‘•+Š-¬bÍE(âmɸˉ{,aöâ¼o/1èo×N~¤L"c1ª«î¼a/j+¸¯ ¦)±ÿL``Rk¨Ä¿ÿfkµ¥‡Û–ÀžÕ”/Ôΰýì'ãËRÉ']Jî·ú šR‘ýÍÑJùïŽiQÇk™%6«¶Êð .é7Eo¼8hŠ‹¨'R¸‹‚ÏØÓVà";©`hS.2mLjñ%ןXj`Rlh1cãlÒÑ«Þ@L®ŒĿޅáoÍÖÈúêb_•'Ö?á Üc™Qu¡ùÑb“-!ɻͻ¼AóMÿÆç4ç¾7±á½ÇŠY9æ2–„¡œxC­ÊôÕñýwšêÈ %êZžzŒŒTˆÞúýkgb®¥âf.òº÷ôUhÄÇK‡‚ÕÑc)’±ÑuŒmŠçÖ É ÇC_:‡¡¯Žr³É=X{®­(^•¯»ê‹.ùnî/’Ï! šË%HÑ#2¬;÷ ÷úܘ»!-8¥ˆ§‰6Rݺ¶UE¾æaÌL yäïuß.%âSàý‹„HK¶q$Q­í«äÈ=±uÂQV$}n¨Ûóÿ^ÚÛ{Ñ¡°±<ª£L[\{D‹B'kŒ§Z-.Ù^])»bf¨þm¨2$Ó(ý‚f¶¥ý§ã$^ê²Mæ¯jcJ¸_g§Ž@úºH `V 'tòl-g^ }±I4Ô¥›{í¼x ËKsÚ*¼¾Á#››×fÝ ßîOÓÛH‡áŒÔºÕ8[—+38Wó©à•ž_–Ä÷4¤(Mæ×¨RQm›¹°¾sV ûÔÞâ-)¬„ ²Û@‰}‘QJû 'Š p+3úøF{žå'x—>HDÁdi0'¿}ñ‘ðÙ÷ÀR`¬3¡­"I´ðK´ðœlU@E÷Ñýíié²=ß[ÆSØõnÞ=N©>z" tÅ>Ô¯(ß!Ö<È}J«ž[^EÁ{Œ›"zgM¢{wjØ*â`áó‰£O§ÇËnáZÒ³bV65é•°èx_“ÂÁd¼>=¥‡ëì'ŽP–{«êVÌÇ ãÕöÁ9mˆ°ç¥#–Ì>\75ü¶˜ÿ,x:ªIk¹{¹p»F[hòŽ=-ªå±ÙË”–uyø’ _C«Ú»½ ñÆXö4>Ê(L¿„e+þmk 5-–ø3Zùg`§ë.·EX¸S”[Ì¡š4Á”IÃê9¹þ£?7–âRAÀа¾NÈcp‚ 9ãª\!àˆI"ý:ÖN°Ðú¯­gÎG_-s³F˜+P.+¸,Û¹éÅݪÒÊ“lÛFkX} ’'LùFÃj¨‘t‰½êp4xK[‰¢mî¢)w#tjx7®ä3 ›™`.c [¦ö¦\Æ3­‰Óœ}]9n›¨Ù›×öÖ `h3PÉ«…”q}z&v*$4~ã| ÐÚ1ò¿¢ßµó¸¤]Wý2èª&»}Êû*Þ˜cÊ0Ñ2©ƒ:—¡TZý¥>ú3æBñ&É1v#=Šî›ói)JžßÎ*Ûy&rÏ|\&¼ €¿9c•Ñ4÷§]‹lF•.DZŸ³J›v5ÞVž† a0r8\xc `Ô\÷![yª€H´­Ú s?Û¤J_\:¬cQ‘jÆN“èCû>V½8( ž²šÔÞÁc“C€~Ùs®EÙ¡_ ßý’n¡)@ÀùS›C  gÝržx\— gÙFj™¶î°¶‚JFE¬ù»«Ý*âSiÛ íL6€ýr¿e>·®³&¨ ˜°Y¿‘ñå¾þDx☱H¬6dXp „E %¥|Oè³ÝjOen]åU)v–T¬ó€6J÷ôd¢Cò§ ,(Ïí¹ˆE:ñ‘È3ƒÑ%ËÀƒèqy;€”“Óbrð/§ÑÜäÐZç¤dn#ðe»°¹kÂûó`qf¹Y½± “ó’íbýi›ôû,üœ¢ÅÖ…È|ÊkE hË)$~{SyÄð;ÅÖ^§¸·Éßœ¿[sõò½*SVÓª“Gûþ™„³ñ+Þ¾–êxs¼K·?Åu2çŸJ²ü:³¿9j[Љ\"n /Vrkøðñ#,Ií%¡þ »§§,v¾÷a¨¦® mçðIé'1l: TGƉËò|Ëšñd{ïýج°ôXToZ¤[¢jØ 5ZîÆ[˜Ä»Êlnª³€W…ßüâ‘Ó"‡ßíÁ¢¾ÁLE$„ÑÕÙ2ƒÂ{=ÒÈ®¨.F`rüƒÃÏz÷xÆä† ?D‰³O‰~[jý‰&팄ÖäA ‹ 61¨ª\x†ä‚ʬ‡¤BšjРU¡å‘Ç„Ö 7¸¬ºÝ×múPâ1s&Ñ‹N»ˆ,#oÂÇ¡êMû¶ œcøÞˆ•Ýмuc(‚«R”ØiKc(!^æ…‰ÃN%ºõŒbö˜ZìÏ¥~ß©Y’â»h ·û6Ü™4{ènOÞ’%»k“oYRÿmé ž6ë×[ŒnæÔcb®5–å»/%Þð|&•¼8hqQ[½KÒ˜’ÔŠïG|ŒgŸ˜+òÝ€‡ê»i<šT#6¯¶QÄÅMN 6…¾ˆR=»h á²j¨ý£äÒ‡?tЫÃ|V<ÇO]ývU1¬Êm:Ý8µà§ ó q0´[Dzy–$û÷p`ÅBßcÌê>-$0ýP^¤õM'öEžMb>OЗ㠧‚ … ÝƒŠEˆÊßú|Ð{ÅY89i8UFöX{3ˆTìþÁŒ%Ov¼œ$v„JÜî ‘‰g7G=“ýô1”þgŸTò7'ÎðÙ¶q–=ŒØVîCýEô¹t‡ænÂ& ”_+¥ùÒɵÂBíè?xÏ#)ãsrÍw£¨)XI'n’!®úõÓª£#÷RšßȈðû† H×â]°Ü¥žÏo*ª¹[˵çcC±TyQÔ ¢PyØR#Í]|F?ñ·ÚÚ®/X'g7h1dÜñŸ®uÑ–¼±•þNß©Ëó°³´`Rˆ\ã¨.BÕ öŽº…ø@é#\ãš Þò( Ý~˜âÁsœ°oxû~½q²Ìs }>¤ËœÅôDÒOŸ®êÞ’³8ŸcÿqU†ŠÅQ9¨‡ -…xQàs;$i::ßqÿåû¶Ç×])ƒÊñÓxEÀGVfÓÒ´mk2½íXQÁ¨Â=Ô÷WO^žs¶3tÏäµ€å³K…|¬ñí ®UM;‡©Œ„EöB(3˜4_º€ìíï^Iü‚5×§—ËÁÒ·¤ˆy=g}Aè¥9;û2ŠhžCK<¿¥–O·žºœ"´ý$ê nít Î…¾ƒ¶™Í©îPöX…Ÿ‹Ö±:ãšš(w~Áä 3ê~`&–¾_I.„ÎÌ¥‚N–ùŠ×ŠmÝÁH u‚«I=¦^QÆŠv˜A]ž®þyÔ²Ã`»¹ç>2ãhuò5ƒ/s6Ù`q½HÂ3§/,CßÈàE~ú©¹ÄÈ\¾ÀÕ‰LoGõÇ€Âþ>= ±úDüüÒºÓ)t“T‹0L§šbâû§…QJŸEIíÏQÓ,*ÊupF)ô¬ —;½+ýMt¾Ó¯*å”,ɧ(¹îxwX–K¸°K4ð0*dç¢Íæˆ ŒµÓåí¥„s®¡Ü½Ya£€îqh-OmiÂÑ#Õ1ËV¹^ð‹hb|<@þz¿cô©óg›x:™Îšø]ÑÐ D5rð|Œ1Ê+Ÿ¢æÃZO‹¸Døþ­œª SPÐ}«DÈF$yìÕò“µh…Š‘Í®?çGé§ãP_zǯ EÖÅçfކþ~¼‚]¢ÛñÝé­[vÙ³ÃÞS¥@óñ(QzùÅõtGÂÛ)~UTÞæ»öŒ8ªë&=F€çéàÆI5è$™EFç æøÚ³«,8Õ®ØËNc'uZZFPÜ)HЌռôF\éœ67¼wXWo.8¬¶Õ׳¾«àl`Hõ%zÀÑñ"L÷"$QÍ¥õìÆ« Î8ôŽXLDùÍYd 9}øÒ„-ß[^!I¦·Ü1« I88eÖ}}H»+X ƒÿ-Ÿ9{ŸtBö •C7üTH©|ÜeÏ+ž›ÄŠa’85†f3ÍÍrb MhÚ:ÒÆ)#óeªú.ò_OêQÌ }e¹Ô>í-Yâ©8T ‚±õ­’ÍzµÝ>! ,öÐÑé§€‘sá‰BŽíºZÁ˜ÝD.‘7ÛâdP'é jƒ£¤í;‹×_“¸R§U-o~°9ÿÑ£^¯xêy¼füd}3œ®6ß(xº ø5Ò2‹àÌÒTÞ—e ß½âI¼½¦ð‘'¾Ç›K]•B! OŸe¾ï¬%ö—€`–y )ú믵ë[ýb‹4 D¼¢žžªêG®C§Éã:^O9v‹ó`²˜Ï.®Q‰æQu‹BÎø5:"ç¶íA)#ZþÚæž«Ë\òhñu“û6+G¬G“7Èê­mVê« -;1tÍ8°$óweo#Rl›M7]ΫŸ¼¡øå¼ëM¨êŽO³3(µÐé •ºk–ů„ùJ¯'Fè+ΣdAüçqÜ7ìß.  µ¤DÅî3E,c{^+'8…¦½æ„ªåE§ëÓø4ŠØgÕ…¹Z’®¦Þ2®04ÊdÃùñ{E!ÕwQ€C0uùp¨Að0  ®i3çàx^ÿlAÎ%*…X°÷ÓÔ ûÚèªC{Ž^ë]‰ÒgÈÒ£ú™¥1‚±aCkHdå!“ÌÎìWÝ>ƒŒO"B¾…q¢³¡”LÂò:ÐiùC¬e|±â¬aƒ’ýÇç47ÚjÉZ–ú‹%EÓr ÿƒ¨yó­ÓEµÏË2Y""@ù¯Zh›OžFûËŸŸ›,?ÚùmdšÔê±GïoN„ûDÁNxïˆÉ›¥©ªÝ¢8Ù›Ó®¡-ðÌøÕtå 9j¢Q&/÷zå\6ÌK ¸rñmšXå¡öñã|2úüaÄGÿ Ѷ§è$%Ç1Aý¸Öq‘’GÐ7=Ë8†R5ý›˾ñâ˜glœ I¼d lH'y™Ó£Ó¹³êŽõÅDúí‚§cçëãÅŸ>•üüMèZ°Êñâïº5½Þ ®Èšžeª$eßTý ä¦ä„(¶7 WÉ›B7 µË(ËáKÌ}pj2+d`0öFHôD²MAà¡É±³HB¦®wbëÛ,åÙ?M…”bìº×¢Úu¯‚”Ç s3`DÙââ÷Ç8'¾z´ù3x„*X]ÐÂ;&evî÷ž¯*j7: “|Yœ6åç|d\,žnpî¬jIˆ‹–*~¿÷es1.­  5`ÚÖÛéÐcž^A’¹^Ý" <½ÍŽ®wmlä=@EãØpL}àÅtbLêï ¾YEÓçPB¹Øtë…̱`—u7k |?I¼oD“ÀI6””¬qe]…ÿˆ2[¨ú /äð4ôI%Ÿ^ABÓ)Ñ&*9èH«+xú9gó8ê¶ùpbTuÅÄÝvŒ°:+íÓŒRe,Ä8"TÕ<3`-6´¨“®>Æð±÷L£ŸDUŽ4tbvó!ÒšC#Û$ußù"z×wƃÙß.›\.­z‘.° 0C¿6ÒILQÜ*H2IÀx”­Zßt}2ÓˆOÍ–K Í`4׳ÒaTˆ-’B¨²J“å§•â¡QV…ÑRÞ ½õ!]‹õƒ67¬¶Jz{*˵.BvüÜáC‘0Ô•ÏZXÊÓ¡-þ'˜Flwù üxÆ|~‰6X1Òúªgã‡FNŽ0ФX‘ýj@/›Ùò3+· Ÿ5*6ÃMtt@/c"’GAvTÀÌ þ«óx‰ÂºŒSy-&×/ëq›txU‘Õ„›À’ŠÙ48׫ਙOºàK¢šÚÁ„m}Âè¥|·íÂÚ;u“lÔ=ÝÜxö#R#ýÄK¶ß~™¥¢Eª-ÐÊ4ªÎ>kfY@ —~ÔBÁ-[G½»ÏF¼ÅÛrô‹‡Î⣡•ÐR¼ê›Qû„.mJÌ-f½\ïãñÁÓ(íÏV;÷Ð/™ÆàågHãçü*ü–#Ô2)ý3 ÜF>{SìnÓ)ôˆmÿ˜çîÂßDæ —Š—ëʜף™ÖZ[êø¢äW`š#j Çu1‡"¤g¨÷IIÊâ«5ñŽwGqgEô•¾Ðtºiúš îšEÝ‚²Ç¥jÂ]ìû«^ƒ‹tùP41[9üsQ,#yQ^@™I{élÑ9@8JæÞ¦½‰aÈ.à ù{àaêέ¦¨£Ïè¦öq¸Q²½Üa4¶b.ž$$y>ÒüybZæmÑsÎ÷‚^»§3–¡ú©‚¶=­]qHôuK4Öž?á‡=HI Y3b…ŒïŸûÕ¦‡Î×R~^Â?ucÆ‹PòuoÄDP¶ž6Ò/U>8ÚqW&“°'x XèÆ¹b9ëyžÆ~W /òS|¼J<þWÇÃbÀ›ŸaÁÙqy®¦Õ2CBÛʦd’É'·°í´ÊÛ¢¦Ûu‰S£lê´üZ"°Ðá Ÿ'Nµ­³ªuLòí*Þ…{æ´L4n}gôóò`r }¼Rb6/'ë}ÿªadñù=JˈÆ÷³Áá>…ÞQi×öó}íëþÙ,Ý2#Nðá0®ëõ¼›`^ìÑ^'€2°ý¾Q¸’£ñûŠ€ÙV*PÝ+xÀݤêpÌyÆ×JÀp(^L[§W’QºI>·óËðø¸Œ#k1sM-šÛóâ2+û;®í RÿácðŠÄqdEìKò/t|ÀÄ‹šódˆ•™ÄS¾éPu±1¡žY¿­ºÝÌÝ+‰š=š“o÷1ÉMmŠ‘ß+Ý¿ur‰Ã2L¦a&ÚS NÐîI“¬U$é©“p\óyÞ­‚y. B³§hµÏõçsy1Ã'»Çå æ“vó ÂÊ5XAÑw3üa^>âPpc™c¢bž¨V|x?ñÈ t¯rݳNp¤Ô#ìlËžý‡oe\”’bHOb”aˆ†Uº-Œ{¶öé.u¤V{T.)ÑdµêæáëX©0^íZJYF¬@Ìì©I /:Ãfõ¿ÿšqí’W¿™(;ƒeìxñÐÏŠæ^u$þáœm.1Ê*ô<¨øœÎE¨`£j +gžˆt±5ANÅM«<`1“Š4k ÜCèµÊl’Ç¢4Ë,Ö”ª ‹ºžåÀçªy;úµ–={d¶q Ú÷åï&â*V›"—8ÿéŠc=G“[ƒœÆ·.k^Ôú,ùE½rz{ºZö7ÅT@ô€ýœÔçzñ°½×_æÜ×£….¼™l™S´:<{t¡7˜ºÏÍDë;PAqNa˜ÓÅÊù³=0àr¶JpH^æ:JÂêA?ÅrHÇ­É7íŠíÍ ¸­ÅÉIaVÁ$浞+Á£j‹ò‘w¿fïØô䉲L,§Âd=©µÐ*ºò<* ŸscCÀjÅ>KGÝcj#8¡z…–.ãk…¯\£H«däÑÈh t5r®¿èÞ¡ÞÀbßÄÆÍÄ![ÓYUð>l­`"/öOȺ€´åÏ«ý…†ø…•ŽÊȵ4vëºä 4«ÝluÓ öͽnfÞ8Ä xô9€h_‚=Ùˆ4EÅü®TEÿñy$«j…BWOo ­â+§ËwcÞf{ û¥ê: U}93ÊõB÷FWœ9©¼½G-êþ Ê…5Ü!8Dê«›‰0gKzªÞV;UB‰/ÊnåëÒ;Œ“Ct6`°Ä°3;ŒÐ±¯â»*ÍMÕ¯¹§Q2{‚ÝÏÓ“§°pÄ Û^Åv¸ºoÙweô¹;P¥¡éf(î ‰å*uû6ÞåkÙ¤n‘…ÊKÈ/›]åN†,·0~ä£2Ë:Uxý–¦o°É—¶Òkþ‹l™ÑòÓÄæÏ!;Š`6Y^…yªw‡Š²Ò‚ÿä~¡‹t—ò+ýàTÀ{¨ÕRM©íªn¢£¬ëè 3Þœ3“ñæ73¥ªÓ~QöŸƒ­™á4ÚÄôì.78eA­ï÷ k‰Þò«%t†ã£‚8¿¼Û×üÁ•ÊŽ%+H-­SΠç–'_%Ù¤â’þ΂CÉãè­K ¹9W_ǹ|©Ão¨è´fšYÖ§õÐYÇòC¯028Yÿ#Û‘•†#ê–u[„çÛªnñ1k}l[~ïU5äφªÑ $ØŸ‘5Ôé6×ÄŽ¬Bµ««ã_×dyÁ_M¤»Ü‘¤Æ Ìö?¯ßç|2)}‹Ç=£«òæãT‡œˆÛ/úd¦)ÆÍÙ#ò/އñUþ(‘dÒP¸ù\¡~M–®¿fëÈråø‰!¦L¸¸(GVd×-H&Ð< ûjóLçÆÆëÓ¿# IMÐUÞ.dµh¶Ùòú"5ênOÕW‹KZ.÷MŠãN>""†‚"¦‚hµ¾'ò° Ô¦!æB(Ö»oÏkPãÙ$&ûàÐÑ"‡•ë¹Üo¢ËBó7¥Ü§ý¸švZÁðôâ\:ÒXØõÆ“¶ãÙ ¾]ttœ#Ó6žIÔ2âáf)­?ÔÉÖ}T¦47V~Ùýä“î³i¯#xc„›éJ~z¦<Œ-ÊLbæ Ÿ[oª aU÷ßnÆH‡ÅuTŒ4ŽQÉ7|T˜ÞëP¼o. •©Î.ÉÞAî èÎEÔS¤©9Óq7ÎzçÅáO+Rßµ‡=iXÕp é´.5–`‚àq©’JÕ³0qØJX—lØPë2¢ËÂc׸•Ð릶0( ?Üûæ*Ó*^p>,Úo#C®0Õ}žÜµÚõÚ°Ûô]yQJSŸ>Í× _ZÄ$ÿí€ÏÐïcq™Â0²‡³j„!´Ò†Sˆ¼a÷ðåb$}¬Ü½âá­{=î'ƒXqhXÀå“"u¤ÿÁküà®Ùš ·fùVYºè줤”Í2½ÊPøz`§·ÿ›Ñ endstream endobj 84 0 obj << /Length1 1721 /Length2 10325 /Length3 0 /Length 11411 /Filter /FlateDecode >> stream xÚ´PØ-ŠCðàNãNã\ƒ»[h ‘ÆÝ=¸‚%XpK‚»[p—à îì‘™¹3sïÿUïUWu÷Ú¶ö>gíCG¥¦É&aá`–u€º²q²s¤”%õ8¹Üì\¨ttZW;ðì¨t:`gˆTè_RÎ`ë³Mäú¨ì(¸Ù8¹œ|BœüB.Áÿ:8 ¤Aî €2;@Á vA¥“rpôr†XY»>óüç/€Ñœ À)(ÈÏúG:@Âì 1AÊ Wk°ý3£9È é`»zýW FakWWG! ÐÃÃdïÂîàl%ÊÄ ð€¸Z4À.`gw°à÷È=ø¯ÑØQéZÖ—?š–® g0àÙ`1C]žSÜ `gÀ3;@S^  ê†þ¬ôg+à¯Ãp²sþ]î¯ìß… Ð?’AææöŽ ¨j°„ت²J쮞®¬Ôâw ÈÎÅá9ä‚ØÌžþh•P€ž'ük>sgˆ£« » Äî÷ŒÀßežYj!å`o†ºº þîOâ 6>w/à_—k uð€úüYB –¿Ç°psjC!Nn`yé¿bžM¨ÿجÀ®^~>AØ ö4·þ&Ðòrÿáäüm~žÁÏÇÑÁ`ù<Øb ~þAõq¹ƒ®În`?Ÿ;þ¡rr, æ®3°ŠúOõg3ØòOü|ÿÎO€!dzü8¿?ÿ3~V˜…ÔÎëŸð?®¨ûZQVM™å¯‘ÿvJJ:x|Øx¹l\¼œNNnA?/Àï¿ë¨ õÁñO®<ÔÒ øg»ÏçôŸ–ÝÿÒã_ ÂøïZ*ÏÊÿº/‡ùóçÿ³ÜÿHùÿSùï*ÿW¡ÿoG²nvvøÿ øÿøAö;¯¿"ž•ëæú¼ÊÏ»ýßP]ðŸ«+é`gñ¿>yWÐó.H@­ìþ>Fˆ‹,Äl¡q5·þS.Úµ/š Vspü~Zlœÿã{Þ.sÛççÃåY“¸ÀÏËóß”2Ps‹ß[ÆÅË9;ƒ¼P9ž¥ÄÅË ðá|^G °ç*Ù¡®Ï)€çáü–Ψ¿o””ømú €2#~NPîÄ Êÿƒ@•¿‘À³Oóo$È‚þAÏ‘fÿ gó¿Ñï‰ÿ‚ÏŒàÁç²Vÿ‚< õ¿àsëÁg»Ág"û ç3ô_ð™Èá_ tü|&rþ|&rùä]ÿŸ§uû|æõør=ózþÿëÚÌÝœŸ¯?ëùNÿƒÿx)Á`O°9ꬃù«P›¯¡-7Ÿ%H=ضFE¦è¶tÓ˜Ø|œ[Ý~a"§0Ue¯:_I¤ va/mÊ0^Š/R>øì7Ö G4%«7ßùÞ›&jLl5£Îô}Ú—¨î%AƦ%¾íûàä«d ßÛ®@—ãä&€©–‡{ãÑ#çYÝ[ú}8|vK}»ŠOí¾t’-V;Æ(¨hš.×ìà 5’+9 3Ή'ÖôåÕNöØ¥B" ªßA,wÁWÜíŒ÷r¹—K1-±9ü%Îð½änªáœOqa¼Bxt¡%¹Él½h+ȉç Uû‚péÐØúÑžiT)ÖæDx¼¹úäàžfvNN5Ñä§i>ª‹zÛÎwtÅt–sˆXŸ­ë¡WDzw’Eè%£RÛnÄnêßˆ-šoߊ£Ã­Í9im¹…Î[”‚'â2l„:¡CŠwQ4\šyŸ ßí÷~4Ã.W† výÊ_U }JÌc iˆ°º(ºV#­™(™|‹¶gQ%i‘ä;!_:~öÚÄã­2VeÙ˜FZú˜óC·nr~G$ûðøy»;ß\å4¹pš±òàu­h¨3#q¹Jp?þÇTôšLÑz›Î+ë¼ÁZ–4íGª§ÓMÔûÚ„ÝãFëº*ìRŒ:“FÇ*ÛÛd9­] Ü/1§%ÄÎìL±]:K”ÃÕê¯KÑÚâ¼,5½Š×gÛÍÖ^Žt¿t#wŒë»RÛHø¬âæ<ˤ$âf]7<9 =ºÛÔ©6mRäGTß@‰ØÑ1úƒ­xÔ[›yä;wùŽÿÕæëÂï-u!¸™AäfJÌÙõöwøæžM¥ùîDïKI3‚q„ „£øæ3x¿OgTÃN±xß¿”kÍå€eêpÖ/OŽš«Â4σ%Ä(Éå—×™ z@œÝÊÑ}jÌÔ0ƨÍìA40È$·÷5'tø’4,od®îM÷sëý*‡˜ÃˆøÁR =Óa~!¥%HµçÉeqyä0.³¢ þl(ã7†ÅmÊ ÷–_B0îæºïC¤Óúˆ‹`C¾ýÒèc4Â*mÅÍCèY˜lϸ§u<ÁM¦§&_:¬ŽÑˆðœù•d-%³ì{ƒÃˆt Ó¿½ A²¯ekc^ÝìXã)Ä£]x§#mÀV•ÚY™>­»¨˜êX[…~”×P—ë¯åv]p2«º_͉ŸXNuDæʤççù²ƒ³·4ÙÞ‹Ì*ÒÄ2Tª#Kh¾ÍÝËýyˆ¸_À¶ÍúÀñÉ®GŠ’° ÊØª ®¿Réèǘn:É-2L§ɶ‡˜ãϦÛöKùW÷Û]Þ^–Gá4[¤s~ýXQ±âõ£¶.ùÅæbª²œ rëøÚRÔcíf÷å*kë60øa¨^QÂÁz9±¬o—bL*Ô¤Hì#"½Øv¿¶:Ï,f…«a3ñ|¶œeQuÔ3}ëêàM5Œ×0 ¶Î‘ZñHk¥<½ãQ“À}çamÖðú–"ã\kˆU`à}¢CK>uo(“ÃãƒÖãè­Ô½ÝÃd{ÑT 2•GÜ®M¶·N.[ž1´4î:eÖ¡°˜•âp#Óλ&?h¥/ÝúÎ*1ñÂƒš…§šv¥@t²ñSšM%X\‘Y®E&²ÊÁtM¡õ]?šùh~Dþ¹EüI‰uDjÂ×èøQO•Ã’¼ÇÍxøÂrJ ªÖ¢çÙS±Sû9ÅH:`^(°Ù£ŽR’)ßñ}ë²%Æ›µ¤FRA¼‘žì4l=ìZóyøH`™ ‹¬Tºûec©ÁH¬¢L2GùºH̽?°Tìc¹¨à¤ ªˆ-JÖ„Þ~êÝô§‰ 0}ÉnLþ±ÖrB…«0Éúæ4”f¯P¬X¶æ¼õbÖ¼…Åô»Š„Èéðy€êa ×ií¿†» c{¨“š(Íìp¨üÔpʸ¢úÎÌ?覤Ú2*b0âtoº¬ðâA*X^L˜÷´M ÝÛ¥¨æÐÏMéMªò|`i5ÿGŶ)4ø£ëæ³áË^ª€hŸ³³„O¾9îo˜(ºØ¥ÃÉȸs¶SiSˆñòw_¤·X¹¾f¤N.»t&l^›ÒxŠL.èÒ¨ 6ÿ‚\ÆuBtï%m¤\óRSðõü‰zlËÌgË ¹"“{#^ÞˆšÍw|Ã0ý±&üÅš&d5þÐÆô e½;Vú|~FŸíãûå4W .Nм×X{@{QÊy9Oƒº¢Ó‚ÈL˜®t‹…h³ øç¢A¦ãB $” Œ%®–¤ôdï[~EãˆHÍ×®‹©D©¦7´êm†Y˜mn>yí÷tÈDG¨4¯h©Ê…µ\´±`T™®ÑN¨b«?µ:dÇœ¹¡k”5zÅhÙÚˆ61¬}}}8…¾"8ÌöŽé¶ýÎí j‡ ž]ÅåžÚ½ïs%—ˆd‚-$C!Är÷Q’û°í1ÝH•›he|æ&ŒÏ*ˆã#%ËsKÙi`‘Z>Ìð;ìÑaSÐUÎƆäOWãKï`£VÂLÄò•wÀtgžOû»ûÊ¿ŠS f`2çd=ŽÁ¼ qÆg5j#ްqssu…ÎUbj  ÐA¬Q¥d6xÒ^Ô1sü—¥ÑK×Ür~Z°Ä; ‹¹ñКQ¸øÉœY†¶Ì„À•À%Ù›6eU­„*i…´!uÒ¦š_!>È/î‚ZµVÚê/¸*uˆ+U\V'ãîΰÚè$C­cξӒͱ®Ÿ‹foGœ;ì)¾_¤~ýa¬ s+ÐPÆ5*‰]¬=ÂÏ ð…±î¸™¼?sâ¬ÂœSM~9aýšÝ.G}ÖfP–Î&»X­•ó¨ÙÛŒk°ò‹nàŠ2‹½b}hc_¿%+õÛ?¿§êÕÝU*¿³BdÈmGƒ.0j{ šJ¦ YG&݆}â“àØë²îÀÓüœ­5‹î“À˜GŸvB»– 4taÝNrýt¯üdÓ±ƒ\œ>Oz@— G¨ú´øVncÀ½>Iì¦ÐÚ¾ØQ£o¸në&`C0³ &&ghYXÿÚ:ð¾®â¢.noj­m}6Dà'í¯vj0ʸÎŒ-9ù©åŠehnj|LöZ%NIp ºš©L­`Ñå­Jsè¢pÞCñÓ[j=Äf=øeg’ùŸ2U5f”î©w©˜-‰X2©`µ%"ǾÁ¡³Šqãtlzò§žòѶ?¨Î£DÞnÒ àÞ=  ¦ ºF›å5“WåÚ«—h¯Õ®JŒÞ˜­oÎÐ^9‹´1ˆ% I®ã„3p%µ±î/ðW²çð–lIÖmjÈÒ« AÔD:T¸›ôäž/9­¶‹öËÒlSDRÃbØœ-á±U-˯ +3~È‚à›4ÝÅ'ó!{u;“^4Op]CÇáØt.ßVý3àÁ·‘7SÆŒqÇ‹¨B[g ®¦Ob¸KK>a9[›rÙ³QÄ¿ õåÚ•ÿêum ì.´É5MêDY6_(¼lÉ]jÛ/–‡~ÓxÇ&vtiüŠí|ŸIÎO“–ä‹~½î€>WgëÆp쑉ýPõÞ+FögZèŠcw ^crŸ<óJ ¡¤Ô˜¨—X†ªé ,b Ï{œ{¡”/f2;9:Æ¡œu“:'·f¬!ÔŠ²f ’¦â§áìK9“árÛ$FŸî¡%T”ôÚÇc6°Bý¼IÊyÐŒþ—ìûaëÁkœÑ¼€¨_}¦µ.™û4¿~Ø%g¹{A`¿œN ;?6ÒÕœÉrß[ad¬DÓç)ûÍ/àΖ¶°~k”íìf!ºzúêÒ(AjÚv‰ê k:‘nn{©’9}C }“÷Ë}†‰+#å{zÒZšC ¾Û ŸÇc”û²Ê:#Y÷Kí]r´ö@»#T:ODC«šiìÃ0>ÿ)´iü%ê¤$[;©¯Ç^XMKtd”LãtÐ:ÝÙ,U ž2vºWEÀ ÞôŽÿ¹SëaÉ"%D>/,ˆ¶0[jH+“Ù3¤´×ø®t'•é‚’ ëÊc™ª3ml¿¤3“¸¨z—XyÙÂdylD=£cƒSÐîË1´ü¬¥Ç? d' 3 ˆBÑFxËzmÍ, œÇ3ö“ì…÷® ÐæpõºÍ£½³ûe¦ÚE †hRŠY çYó¦éusáRwCO6šWYxirÈç‹1^¬ q å¾ºÔ©_™Å·”¹+ÿùMçê=ª*xžæ‡ì‰„ËæKµ|‡úÃÀvå)Ö4Ì#>Sàw]ëù‘ÁãA`äDÆÏa›jM¿ÉÇC…o´ —𨙺Që³6„/ŠWªý½3•|œ$Œ`4&­i™¢…¼U4”–½ÈlL>ö¼ëO"¯…Mè#£`šÔ÷W4€—Àÿ¥ÆŒ¤ FàÏ(ê/¸Aß]°âÞ¹aòD‚ØÆÔ¡Ç»C*b ¯2 RÁžÿZBˉ¸1ëŽÄ¹då.¶ÈÃWÍôú*‘`Ÿêñ¼Våâ¡Ó&oC•‡¼¸o¡ÍlùiëSc,¬k®ì™×ÙvõÖå)ý±Ï¹‡º!‹A”BRžS*Kãº8Úñ¦=”uÕF*c)nV¬!G^¥PQ£Y%Еq£FXœÿôA;JˆÔ¸ç“$Ui/¡ŠX ~ÔñÜû•m‡°Ú@×{±-Z YÞ&¹FMPø:´… 9dó,#WO ŠrIËÍTëÃÏ Î:tJú#fDð'ú"7yßËÛP–§YŽ’Zj4!4Ø BM䓊².¾JmKUj™¹»òñ“³}Ùøná>ʬ Cê0O<˜—›hé—>>Á±Ý+”ì¡Dè‡Cý u/j:GLAtVþÍ f›»ŠºÓeûÚ9Þág°WyÑßT>„ç]±ÊÆÁG;pv¢u÷;ëæ›ùáˆ,@;Éœ ‘Ò54 #›Wõ´Ðl‹oÙ ##Š2è© ŽÉ[è )Š«%S©—„°œ³˜˜÷ßîA22˜K<Ôí…†?Ëýùùéæ›Òwm\òu¶‘ EðfÂÃ’)8W¾ý¯ô7Ñ*Ûí:d}æKYñ¯²¶ QqXECìöÉò œœÄ?¿!ˆ$“Šþ|ÄŠÉG¼è{¦M¼ûÕ«¿Äç¦axkÛç´š,êYÜvZ ;/Ó–dÊ7òèk©Ø9\÷˜Ê °-O.g¦ÏùSâì& Ê[zÂYh¾ƒí7¹ '+D\4Íß„|‡Æ[øVrçx^ß~.˜¶u>õ—…‘‰+°¿˜>Íp¯ˆ¬2cí2Ìð, ZÀÖ¯O[s&S"¬ï`øEÉ=$ô¦@‚_*Þ_Åt;­MƒFN«q”ôŠF[ Õ‹YŽÀ æ ·UÄïÞf??§}&Ý/sÖŸ8,üªõ9»Žî|‚Ø æl€D[Þzä-_¼jÛÎù¯µiÝQ®/&‹D7 °˜ÞrU‡÷ˆJÎähÙ×e«©æõ‚è»Õ›+I>¹Ô‡}ÉŠû ½£„Z¼Ë¸F=?˜/Y‡aaÛ`]œfÓÝl;;õ\¾$ˆCqhP’¬pu ÷tú½üãò† ÁŠ:’‰Ç(ÑrHt·O&½LEŒPž­+rô4ƒL²øK½¼oA j¶ÿÌbf•¥b ÄÖ³äÝi_Û@›âþµPíoh‹ª‘ÏVP¿éÜüú˾Kêbäâ½AÑVy);‚ñc§1až0U¾5Ó0 Û7ÓÒð5~©ÝR8÷÷ o†«Þ}˜½@RÑqˆþCQs*ë®ÅD„Ñy;ŸClÚaÕô|Çn#‰L—ŒÜŒ!ö$.¦eM‘—x ¿ža:v4,òžŽ._³‚DñÜ¥ðÖ_Š<ŽªfÃ/c3AY±M¢Þ@è*‡¸­#1ÑÁo¸RV=wE(Z3† ¹^ÍZ™`t{ѽñ!C;R +PF´x\ÃglrýîD~¸»¥<9Ä +Œ9CC¸sõl£ŽúXˆ~ß4ý…¾â.|¡VëÅ;%RÁj9Ðh+(øk.¼™±õ µþÛÔ“³`©uÃØÀ6ùF>´u’MÑ_xiÈ3mÃÍ ¤BsªnN(0½¥M54- îªhzôÔ6ìT¶Ø9ÜWoK\±¬‰D¯õZ^¦¤7ÞUnz•É\Ï—xy¿a¢Ü5éu'gÑx©DVÄGõ•ŽBqÅq-‘5cêØI@¡ä¯+ÍâëòÍBWޝò«'²Y²¢¢\ÁWšž#þ‰î6glìDj(ƨDªÂù)RÊ:%þ+vØxiÅØ¡%‡`ƒÂñWùfžç-û!T÷¡]º@û”®oí}¤ïeÖZ8] ð¤ÝQ¹£•gNXLø®çÇ®­?ö¶QÕhȯ)i5ÿâò f³FÁE.®b¯FxklVéîüªu7òâËF“w|iÓžê¬ÚF{ì–ñ}îl'FUr.´â‹˜Ðô¹ ¦ýLc¼»HŒÔhÞ4X,&%3»  eC;ü†À‘¤°nЂ6J¤ü?àöw=BäA[»M µdd¥"ã»:Mw×픳^ ûÒ]Ð]å±qU#›±JØÞìq]†® £U·±½RýCyÍ!LÎÓ¤âˆòGâ«Cï,8¹DË[âåh÷N‰VØý<ÇãWè3ùï#ŽÆûÅØò¶0w¹W×›4'Øè<…Ë'ç‰ÞàÔ3ÌÏ6Ãßg[…ˆ¥’wûGÓïa~+Ê€þh½8³äXk˜³¡ìßÑ?=qåK?æ½Ê Ý <ųq'nÃç=O7/#D÷qìÚ{û ‡ŸºÊTíur0Ò™ÑGÝ^s‚[Ø}ùX=U7zÍ´·=_G“‚ƒ×Žým‘ãÏÓ>™¢0 ÕK"{ûN5‡aZî?,FÙ¥f¿ˆÃmà@Ï!÷:ð0˜M Vô «i/XáqÎGîs“ô°$°Çzñ=Ä&“B·…«e'_£õf!Ä–î,L–Vª”tò¨NZýlÃJ‚¶/ÐÎ$E”‹j0£Æ¹…Œ«ŠÌÒÐlmñ•ÊÆÔ÷ú¶æ([Æ4Û0—%ø¨*„‰`÷ èºv¨éí|0ÊyËäTùèGZP«]V}Y‹èº¥§ÿë¤W›Âk¬>à©=¤zZã1¿ô ¡¶æÒÛ{—„ õÌE8æÂÞ6 Þ¿Z‡&ø+؇Å×-Ѝ„ú™LãvpÝÎ_{HMjÑÝ,í\ ·3â•£c¯³†½.‹úÆÂLrè[._ÙÖ”¼E²‡“øÎôÃtÇæK\â‘ï(› U|·î\±Îâ»’œE_ëˆÖ=uû–³ z{33;U d~ ú¾WäÆÔN„C —uÜŒb¯*ÐeJdÓùש÷Ä&ñëˆòP)¨ö}Õ¡½‰]ê¸ay¯ƒÅëÐ`Ž»ø%}óFeUË›ºý >ªÌT[ÿ¨Ç.·*VÕóþ‚²‘¦¨M^Z¦J2`¤ž¨(4+Ý£L4C°ÓR$Õ¨½u’#U¡…ût­|€$Me%Û Ù®•X¶^·îIsïüØ,°ª_`å’3–ñ¨’»L*.¯gÍ™ÅBŠ>fn»…øÎ$2eÁqÍÊÞäág¦#·S æ£;©?Iòˆ.,D]w#‘79¬(å-$ˆç»á÷¿Ê[Cë9ÉC4Þì¢÷zziF¿ižÏÜC·‡b—Ø,Pt—*x›kn¨—þ˜ëêŽüs OÆ“èñv?m¶~ `)U•‘PéLåÔêQÉ•DжD[(«¨a„BŒ Þ«±‰ö•–î\ªJ™Øaýlµ®‰4GJ|~6ÒcâÒ¢ÅL*¸~~ó–“OÚ´Ë—,¥ÚfUÚ,ƒWä»Ê}ÔØÑ£ÀV³à§Á-eÿ1WëuŒÓ$‡ŠÔò²¥¸9ÚvÓ ugÅ…´{%FÛk#ǃUD=r'?8ÆR¢ã¯ª$†—ÛíÈæ Ê0„¡½8¦ À•Þ€\ íwÊ" LÓ4N³PÉÅRÆœ²ù'e•йTG˜mP'iez(Jþå‘f( Û PcL%Kc*fýXØF^ã\ed›¬Úq•欃jâEïÞèŒ*yn’Û…5<>\éË¢e$IcU¯>ÛwÒÁ‹­'•™K8Ð 4ÙË_£‹ÃµB|ï¿Tæ;}=˜$¡3”p`ªš°ò€%Ê>úÚCaä¼zç|mÜ0ü~ÆÙ7…³:¥‘+ûŒúG@¹; Nd(øËr²ê…³zò¹Al*ŒÀ¸È‹5kW67®:J6þ}61{äî%Dä©Gæ¤Bˆ#GŒàEòÞôM@Ó…éM—w½£i ¦‹fGbã®’ÌOHF´V?Ëžp*^jï—Ô(RAƒ1FÓLIK.RNévšUtyÞ¡ÀÑ-ìhw×éé¢îBÀîIPÐ>okøÒ>¶}çã¶ô¡Úkiñ”ŸÁG®Ì•¯J)ÎH¤*ÞàˆLOËœ]9û’†ûØ@áYÖH ?¢¸ú+­ª–nUŒ¨À”5WACó^‘Cè\²Ýv8±œN4d!Ýï½#fbÐ.^G|; £–^&Ð^óXÏaâmû Îb+ÚeÇóYš?ì¶Æ•ù¨V\ƒŒøÊ¦(ì:Ào-d¼KWÒÄ„ ¥¨`ÑdU0*…°¿¯XµÂ¨6ØXל7V.hQeÍ"†Ê2Þ¨$v6S0ïÏkî® díójö*4y&¦ÒÞ.:; ¦öbõcjÚQ¿ÿ˜ù n[*¹J‰x®/î =œbëÀ²æðë D¤¤â Äĩɘ› Ç€O£=áj3ÊfÅ?r ~:n¢eã'casî¢X—ë±ôõmÏ–u­Ð`Ü›§R·Ïy¿òÙ}Ц¢zûSìüEe×tÝ2ÖÙ1#š]Á>Ö3¡ëÌ@ã›k®£ívòHÙ M+r8/2İ ›·z"Æ»jïêiׄ‹ßèU¦mè3™’‹hˆÏöí¤jâÞæ ¾û¶õ,Ù´'[>“¡KéLXéë|7šò¶á.ž^e½SXKcg;ùy­h¬z 4½ ùaÄð’SA%8ß5FAmäzû꺌ÛOxŒ:.æ\}.^h‡>MK6N€—p?tî$?_†‚1 ñTmwïÉwò@BCKó6ý(J/TÚ´<‡šV<È¿þýi+ü~›|“Å—ü2 É77º&_̬Ãàfw»$KÚ_„ð¼—+ô_ R)¾‰ ‚,¸š'åVêíö^¨£ÅÌÍ–&¾­ÙZä–·u(#ÚßoãÒ@9¯`Ä~`‹¢«W†'4Æ=¾×a›rèŒw•rá§{ÛIOáÉr$¬^+ƒ•â¶Ë§'Úy´ñ 0$FŸ©kžåýþq’Õ'k'Ãæä£²|¢ºNWMÍ›<Îõ¬\,…ETœ1Ô×LÖ-“ï‰EÉâ ÚûfßS9-­Œ‡’nÿ¬¡Ý!¡ñd[UŸ¡‘£ˆb®U÷ꤟë#qßFÁ½Šà<ç)µI%ìâWkïCžü„uû¢AN)¦)¯0Yžì¶çì©ð³9›a6RæÚ¥É†¤ÞD›ˆ´W‘Û*¥éuòðS{Hu¾ì7)ÞIõä†}mÅÖñïÉ8¯Œè1$D¢âç,{x•‡çpÛÖ£p9£‰Æsyómã÷`Úk.ìkTúRbœE¥kRöUG,ûî*GÉšz’zi)iáafhm næô6¥5/Ƕw"rpômG³¿+?dÞ åOÑ’'송ÖÖjχ}í sm˜<2køä•<ˆ¢›…¸¯Pgy!ß¹r—)# ÏB×rÈPzÚ•Œ $Ñô8½àBï\ì9hz:š9ïÆF¶xGWe3©`25í¸/<¸žA¤‚¥9aAÅå7úPI±ûòðštdoEšÉ/ÛèJ‰Ój¶¿@åOåÆõüÐxŒ¥?I=Í Y`áb^Ž‚¸º;L„½7NÇqLHÔ<áž9Xï:íÕÒ1=ͤ|YnP1C^Rè»ó×½ÍçÃæŽôþR6ÙßÈõ¦ød²»£|~cŠbÓ‰ „k<%@ÆÖ+2‚Ì=J„¡}  ¹)ßVdJº©­öªµ\ýx¡Ha€ý>ÿP£~H9._)Á\“}Hz;)ÌL9OôÒBΕ¤AnI3YЫã­üûlq¢êâÙl…Y»Iu&L`n¥ŒqR¼ÖWî¹ÓißBó!¬1…ÌË;ËþWÃÍ™µ°hhnwÌýd¥ÉËsÖwÔeƒ9-ª)í¸™*ûÌQËj4w»ƒÈ3ÈuŽ+² ˆƒed¤9 í¶Çmž’ ”?·B¡Qî?LØ“ k‡ðg¢èhR9*)ƒ5/ä3ZF­×z'Ÿ S$‚¾Æ„ð™^‡uýL^‰€™Q¦Åµ+6[üà0/xù®Û9 À†¿Ö\?Ïe xÎѵ0zbÉüZª²"¬¼Ñ7è઒÷“Ĩ*¾Tf±Ðß°^£m“¼'FÄù¡·`=ƒé#ý÷jŽ­f…èÒ ïPy¢(ÃâùןXI[ÌgÓå9³¥í%œG+/ØÍI ˆ} ~MT_²b)AÑI´ª°/¥=•s~å(@ðÎͦ)úÝ;CÚeöæ; E@ºÂÃ$N£ QJ›1íCžÀ[Šï¥Lm‰-‚áÜ&–µ¹i+3xûU²KPD œw]§¸…8꬛‡ž&JC6Á–²rDÄYNvQ Öp«}­ùü㉰¥¾ò]wÔ²QEß0×ö]]ñ£)ìà«ÃÑí’Ý£Ð×¢yÂNÕïÃ} 3êGn½C-$pì]“Â[0ºÐ9ÒÁ½æÓ:-mMaKó®ó¯¹Ëô6&.òxW@dŠ,-úŽý‡¸únh iÞ/¼r9®»BLö[Få'IZ fúÝ:¢ôdol)¥¨ÞÃqZQ]RwâaX-(}ØÆ´*âx“¤Ö‰9§ìoÖyÅ‹'DÑšÓN>cÖ#·Í“”ßþ’:¡¹ÙHôûvG9ffN® 6àa0#Qmï{SÁo&…=¯(•ën!ÛªÁQ¼@¾Æ63£0eM)_[]‚íØ;ñÃU`ËÃÜZ¾Šb‰òúÒ!æ, øÇSóŽí@wñ\–ëfÞa<É@Ò8Ívưá#n¬$ ³ÑÖÂdM:ýù0+hý‰DÜ=Ñq'õ¤b …†M5U±ä÷gÃñÿ“Y€œNÕ ± ù¤Íw%²A z ýK–ñ}F-o‚°­¡·!œÜ­ ¤óð¸†,WTw‡dLWiçšy°›[&‘_^E Ì‚0Š´”»Ö+Þ~êx¹?ˆ3œ î#¿‰Ú“Hº¶eãþ /X%Ý:lÜü‘Êí@'ÑgÚ¤¸öçqWíãõé5æŠU39¯ Hoò _~Î?ÍÁEƒÜÔäp÷‹%™£]Ïû5½_¾ßñ5mÌI¶&4zé³óר¼J F33²†ï÷AÀEÍ:¶ŽWÿî Cƒ1Ë[ÃFŠÃ¬lNljŸ«:ñk‰ed`žK'‘ ™Ïä^)0™®îÅA\!¬dTẅ²p®DLS™÷•ÿ¡¶i»FΧÆAaxi.ïü®ÒÈqÝx¥þõÝp2•N¸Û.ìa6´¤“ljÿ-<Áïü?ÇS˜âuâ`ôÎÕ’‚,ÍQ˜fÆSá„êh¡ê[ÙÇ6ø)Í|@8·Ôš¡…líÛE9¥ÖŸUÿùÜÎ endstream endobj 86 0 obj << /Length1 2328 /Length2 19442 /Length3 0 /Length 20816 /Filter /FlateDecode >> stream xÚŒ·P\ݶ-Œ»»Ó8wwww—:@ãîN ‚»M°àÜ‚»» ·Ç'÷$çþÕ{EU³Ç”1e͹v7 …š&³¸•£PÆìÆÌÎÂ&TÖ`g°±q²°±q ÑÐhÜìÿŠ‘ht€.® G°À’.@s·W™”¹Û«²# àn`ç°ó°ó °±8ØØøÿÇÐÑE eî²(³Á@W$IG'o­Ûk˜ÿyÐ[2Øùùy™þvˆ;]@–æ`€²¹›-Ðá5¢¥¹=@ÓÑtóþ/ z![77'VVOOOsWG&€'ÈÍ tºx­ P1wþS  @Ëäú\ÓÑÚÍÓÜx؃,`×Ww°Ðð )¯Pu‚ÿ1VúÇ€ ðooì,ìÿ¡û×û/"øogsKKG's°7l°Ùª2J,n^nLs°Õ_†æö®Ž¯þææ {s‹Wƒ¿37Ȉ«Ì_ ü·™¡*+dÝåZ²%Q½õÁïÑô£Æän+ÒÂ^ÿø§#ñÚ>RDf-±=¿'g?`;èfÈo 4yÎî|hjØ·ž½²^µ}åË#s»ê{U<ŠÈåSÌ´ß—ÌÐä[dÏP¹1“"¼Á:÷BŸ¹ºžÆÊ!WøÈˆäü³È×`ƒ#önÖgõ‹‡k'!5¡)ôÖÈ$­¯ÄAŠþ¼oiÑJÿ‚W³Py.*Sê 3ËGfH#ÜØSã1²ØÁ¾“— £#îÇÞI¬)kÄ1u¡TÅ­j5Áv«á´’tXK¬¶]ëtY¿M%Y⟪}Ì êÛ5uù>Ô9¯ ÷3ßD¤¶Ü5owùë–ˆö‰’Øx²¿‘¶5Œ^YÈ$M…-w…êÔÊã`0-y$ó=š‡ ù†ü”¸'bßúÄÆfÀÛ9BrÊç÷3Ö¿¢þ\¥ccsÞÞË8ô%”GåÅâ[êùù'B[Ni³¬úüLé®wùkqtê‚_õ3¡å¬çx,ReÞäJ [Ü ?¨‹¸äe{vç+‡¢B¼ßÞñ²œêTh·ÆsªSìÇ0ÔJ„†÷ò_[l]þ,a‚{è¨sw^á%1»©Å–ÿ®C#(·ÓU5]V<ªøf{¶Ñ‚êDKƒ¡1]WKø~{´³øÑ“©\^І®hQ¹OñP(ÒoÑxAª¨‡°:H ïÝUcÇ×vÕ[z”,ŒÕXš¬½eh*Óö¡FŸÏDÄšZ·T>=óS£Ûß'·©}í+ŒJ¸z›‚ÜïÓ¡í?ÒRÌoe\® Ó¿~¶ŽnZÓö¯["©Éœé®ŽÀHPÁ·s²áˆŒË>•Ñe­)1â¼Ì%æ¼ÝòÉ»'k®t5úº†s%þYبS’z]J4JûâÄÞ#Orî”—l¾:xà3qF4ᨊf.)‡b~I‰¿Æ0'ó×vQ Å{ëp½Ë̈m¡Y:œÁ¯q)?5°Õ8¥ó)˜j0é07ž'ÄÑЫX`{¿J*ŒA(¸•CÐöøòÂÅóÔ QëLôLtÍÎÉÍ'^ư– £ÉÌÛxRÊp'ÅyþÔŒ¢ö«z vTÛKEFž4 hÊ&cg+óCHj=t8«k¼[ÈZ²=_Ë [¯8 B¨¯¯®Î"4½äM9ÂC6Ƀ5Lî¸äóRâbŸ%½v¿•ƒXBGäIonòwQtg?ä|ÈЖ„€eàÕɹU|œö¿ö& ›{°$£1Zw> 2jiÙãRåò 0Ì4½‘o)¨>«­zÄíß³Œ!b['ý|¡¬p§œ«Ïöe$Î×g iÎè¶å’ë<”AÉI(|”­5¥¯È²¢Hðcˆ¡‹ _vXÑ×_ÇÌ®^-|úSÝs( ñç@E?GedSì¹éT]Ìõg’í¨Þ;Ê/ì½£½/ Pýf.ÞTÌŸ‡“Hn]ÍÜcÒ‡P{×´:w§ßà3;Ù›òXUqÊŒNA‚¾«å#ˆÁêœx::‚ ùm£QÓh¨X•ª,ª9 ¦6>¾Ïsd¡Ç=á6¹ÂFÂb”2÷Š2·Zùi;t‚cíéím*»²—,¦*>¬R4”ϦÌ~7Ú|º3çRgǯ |æßrÖ)j*)$¸šØ¸ZÅf‚Ñ|>v!ÀWî˜#QÊñ!4ŽÅÊt ²€Ï‚Œ¼NFŸ<½±ô·d‘LV¹¥+GWq±HrMWšSdëo6σèÉÄQì±'OÙÍVøÜY.ÝO·)ï/EÏ™}†ê&i[«Öó¼ ÙÒ\C0ç ±tÙe¼ÆOgR×6Ï?Ô{éx_Õ/aNfSSù¤–8y\t¡f“F|L¿^è+eq‘àG nÒ—¬d¿ïu+·£º)僘°S‰œ‰Q¬†Ì›,ìü1“h,sO‡¼ð^å2ºRpc³ÈêùK÷à dBÆãú›¶h¡þâüäí>ì0ìrh×Îb~¡zÙ8TIi³pÃÛö¡^\õÄ1™"GµöÞ­IÌÐ@êòøvÊINζ5þyþcƒ®ü‘tfÛd¨Ç.Kºw*IEǃ®ÓWIäbpÖ¡(Y&¤º«á´\žXeö>È{Ô3ºgØ_=WÃûUù-^ w)U‹s±‡Gu{ÞÈ`¯²›y—¿W¯AŒJ2ROî&–yS¾ÒÂûùáÀDpmeZ¨lú)B“F«V¥E‘7® Q#}îØÐ¥(óqPÿªûDßèßV³@‚Rs³ ©vÿ iLR[ºàøòùýù´bhç,ºÜ{º¯õ"êbcèò‹n4…;/)Y†¥ ¼½´y¶càl”ÂC}º™eóî­žŸtz.3ëé¬`Sp2´‚R>2}ŠÒ×ý¼ïHõ*¤¾Š2õëËç&v™kÝàx'fJU…ÆË柴ó!›û|£°<¶Î”ÖWZö ¸±§Qb»8ˆ¿œº&ãt÷_^€ ֡ߤ· —Ý »^;fâXˆù~ôžCF ”$ñÅ·D`Ñ 4h8>#ÛcÃ#oX8…Û¸ª¥YQ3O]WÍdÒ* 9}ƒÁjB·ÇFñkȬã;¸gêMi`´ðñ.õ%ß4ý*áS9™ñ‹CÔc¦ êÇeÛÕ|d¤y!áì'¤”åHÏE x$„[Þ]D}1oM〟á¹PéwöŽs‡_ÉS²=(Øî£e’BPV×ïOˤ×Í £B¬oÕ¼¸‚äÂópý~Àë>Ö .Ë’Íá`ècSrJüâ^¼|ܻݔ3¢œþlwËž2–~bÉ­rË_î$ÂÁ«Ð*ñtYïÊ }Ý`Cÿ«Ì W ÍMİr‹o4QÖµ¯)X€\ƒšß˜‡6êÞÁ»’TOí1tø¶ûZ·4F©WC„TCÂÜþÛ‘W­iÞ¼~¶ÀWnå’*˜õ½Óeœ³hxìØÖ ôzâÀÒÖ·ŸÂ7úó)ü×Ì’N¤huI‚ËwæÔõš©áäÖKöÑGÜä?U´!β,ê“ü[ã~vIÁ0ýu ^ îF@íP}ÜvWeVB§Ä¤ŠÂš®á™˜†/Ûà$ÔäàõÇ ~0#«ž8)U”ˆ\;çö6t­W}lBI:°ÿ¦îô1‚èsAà4CgDCö]}ÑëAxMB:“æ+7…š·b?p¼>׆JÓ³É ޵à.«;CÅ– $ÙiÑ5Ÿç`æÅ;ƒv܃Ýì•$ÙõzÜ£D©HÎç{§Š‚Ewb&|Ø%5;I ÕØ{È€CPš£ÈœŸR”—†Ã’íéN×S#µ‡ÔwYœT¸y!uŸ€Ñ~ =Ë kæÑr)ÍÓU\î´ý¿õõî÷ü*…ÃÑLR|OÑO>þqG1)0£¿[:K¨Hs`Y$]ÕtLö),±8"oL¤ Ç~ ºœnÁ´E1TP²-×gÞ Ðtyö6ç(«éË–ÍN’ñÃ| 1†)›ÄׇÀ‹ ãJX]Ÿ¤'BºÍú(‚œÝÚ8$%÷6²cÛ×7Äk%i¥[dib®ª*Ü.µrɾW6¥ŠJh)£úÏ`=¹#ã“iÖ8Ð(Z°-o !¦)G›"ôÛ–p ôCðagË„mëÔ”sö]šWˆSx{·m üœfÄɱ¤(ô:‡M ±W~ž{·ÉjíϹž’yô½x`›R¶,³bŸÎZÙu~†\OWûÉÿñº¾±I¿·þƒ rÐÌ<ÍÛÑ ¹Ž³U¹„¡ÑXrÓ»†ÁƒÈ¯c·š<òѾ¯P!Q/—£/ÓIÚŠs§ …i<‘¶ž|¯îú)–XA˜aþ¥.ˆ']<Ð2:âÐÞQ²N™þ"΢±„jÙl~¬ïûvÙŒÓÏʃ´Ò¬…NÞ>ï)p£†b·î1ÿjZ­{øØ7©Nº*íLxÌÉüÀ9xÁöHÕÚ,»ñ4sÛéö¥‚ÏÝ{…Úå"eõ2ÙÉÚßÒ¹‡‘»Ë;€âiÕx6ûžø¶óM›©²Ã-a$ w‘סÞ»L_i T >$•Ñéxvž€Ãùâ~°ÑË,+µù³×'4'yµÂìÈ»8Ÿ‰—rZ‹‡¬ëc‚Ü¿u¯îô\´OžOaé»`’J]] Ä}X²"ƒ×(‚^$Š»a¢1—Ç3á0lµ˜—j±Ýç7œ)qAÐÜ'àWL ÃìÕR,3×£Þñ´JlP 5Ü‚òŠ!v-ô†‘§Oyi{‹Á­TR.ßiYïïgKÖIýÑGj [{¼;Þ³UÿcûÓ±³ýÞñO}Yìß.êíÄfî·bPD~0_ŽÉqçV¢ê2úM–xˆOYs¼'ÌÌÏó±ŠQ£ «Æ¢1̦:F¤s »=‰º`ÍɈQò}ö@JæaøXþo‡«÷‡Ä £wýû½Ð÷Ît`áÓwÁ‘®±ilà7h¾hUö¢e>—1ÉÃX1"Mû|'äNÌJ“´ƒ…ÐgŠf"³ºRšn³”‚ÓÕoC®å¢-ß[ûMŒß½IÀ{RÞ,U±°g\nëX Ëq¤Dü°X¢Øæ3yióÃfÔ|'6Þ½N&o2]¨[ïÞ{µ©üËÔý›6¨A›ë.Q=ãîx®R¹ŒÑ‚Ìù‹ “® g% ã׬4í“Ë”›¢„„ ^‘c†þO—éràø¨–Ò q^ÊC_© !V·'å¾_w®»ÅAvüòz¿¬ ˲&¡·^ÆŸ±‹õ¤KR0Y~lRtNôP¾QXÖäEë\Ò'«B 9€={»ŒJJ;µ(~ €Âøy/ê[s+Ö–ðUŠJþ.5ÇWM"-}ÌwTË•J©/\c%§û¢™ãt×Ç7=w2øV:²JsLŒûx®¸_dŸ?m˜°6•9×õÀ ]CÚ¾ïCÿrwg@öÅ'LªÌM …󈕑™{ ¼ &ò–AH×ÖlG¹-Jäe¾`è%`¸q¢#¥0ë—ÚÒ¢‡î?Y"é=ˆß¯5(>x€lMð•V˜¤æ/M9ݦx=M5öQ+¯MææÞhŸèéÆd&š”Y0±Óï‡@ʨ7UÎ}†çE½ïi".[sÐBЋª)–œó’\sD ü­æÉ2M“›ÂGxV‘á|Õ—Ó,RµànB/ãêf¸6†­³Ü®zã ûì;hnÇ Ãýü A &ÚR:lPY´QŠz—ü…ÜÌè¯ òNQ-±™3ü}•dxM½®U¶¡/ ­¶ºspÁí\ÖÍ2R¶qË, µZP &š°“Ìdá`Oÿ'&ä(•&iÜ IÈ_U7ÈúÈ4`õ>Ý3×çœmSFH n'ÏÏú›Üfqø2¦™^]B¡µsübèôê"ÃdÅеç0xä‘ÈÓÃöW®E†tL †Df‹ùßȳùãM×Qú.à"œqj/ùôÿrߑɲ†Yü~¥¶^:Ì Ňò¨]”uïÉPynƒý×yF`Ãê-UQsÕ n”-¼órQV›«#*s³X’"´,oÜ6e…ŸúD$Ô^ùý.ÀàÂÇÕ/<Ä¿°Wi¶N;ºH Ⱥ|Ö¡­¤[œó,nî\™£W˜ðãœa­UãBâ£B–ÑJ-YÉžåñAÐãºÜw·Ž·ì“ý™âû.ÏѸ•“•Ï„# ÝLŠä~ˆuáãÉ:kññYHi™êau†+kBÚ]z$0!KË¢–Œ×45ˆ'*­+šÜü·¡]µÊs({æz³jm´ÛVwL,Êtûà–鿾¡¼÷„ûr{À€ý>q;ÜG…Â¥¢Gß§H¨(‚ß%UPÜJ^’ØŒ5*؉ù-’ÇÇè»ýúÈSt–"Ñ›Ñ`EfÂùUÝ"Í]µ˜ÑJñrYºÐ^¼Þ•{üÚ‰©é3Ž… 95Þ.ü*²ýÝ!æ¯2CXÒÊç3%ÞmåRcAÿä RoÞÛ Øƒ¶5Ù$Û>9®, Zðµ*vòœ #…݃~;"ð»$Žjû‚}¾ûóh_ «™nŸà¿«×´©k9©©h–Dߨ:~zÒUå)g±ê߬ £ØŸO=7!ªÄßWD®\‘l¤q[™ oe…ÝÓdlÒíB5lÂΠ¡ØÉIPYL³!‘ÈÞ!K Æ–“ ¦Ã¨¤NÉ´ávþÚ±r¼½³í“Zð†”l”ãToí"í0 ÙâIÒ¢"6ôåB€rýžŸ/‡u®ÂܲD’½_\›­IÙ#¯ô `õ±Y‹§`åHLf,l“‚¡‚ϵ¡=ÐúI d+6ÛóöǾ¨vÞ½³|Ôy{€P ®tÓGžBÓ¡[îe!ûeâ">s™4©*çòIà^&òNx1¥iëžtÛ<"x¸4Ûò‰.ذ¿œ»¼@Zî,LP¢!½ÊÛÑ£š¯Ê=ñÚôâ뛓z]úCgu_Hˆ¾ä´è©É_+¬ubyÃ<”j‰0Þ@åÊ_N>±‰^SªƒIiÉs.Ó!NœÀà¦HßÖkß4EBA®ºü¶$´*¯7‹ÙY|uÚI¶§Ò?V±›*×ÙìÇéè†{ó†9sxMÙ"ßñéY}ýζ¶øÕÅ=¯Ó}4% ^ŠRÃ-PŸõi àI*~¾ø&C•z½ã‚h»‹@t¸•UxEG¬g|Õ.Av8‰ŒÕ›ýOåvN`vîàGëÔĪRLí°±oj\^Ô~Î.·øžJø;7¶IX¿nbå݇ý”£]Æó!È”äDSDhå…n†…èLc’U‰>+ñ®–I^¶½¤ h­=µÆ ;9³Š,¥’¦¢®q#R…§eZÏ›M7ïÂcìX¯Â>´ZàsÿD›Ýw#§ã9"¨Ÿc¢€éœaGž&Š‘_†Cê•WøÂ¨+$0ñ¸‚Û7Øl.~&ÍxŠæ ðoÈÁ:F’ïFŸ¶c× ÔÚ쓹q¸ºÓåZ@Ý®ó”ÑE%\‘ã–wYA!½¿òú5ºch,¢°eãpB'ùÁë¯ÃìZµ²Ï”@³èû°[þ9?•–-º€R-9Ã2{v=äBulH™Ñ¯ŸTýTŒf ?ÒCcŠßùN2NU8ŠuÅù{Uúˆ¤«-TTK(ö¸nàÊ‘}p5átA“v¥â '¼À3Éó.N8ó$.¬’\|Þu7º[P]¼j®Î)ÕêIú£5o¨†-¼ìxPa÷4Óî,S^j Y­äÖnŒM©šTTÈZ¸”n`œàG»Z'ÅC1¿PáÁ·:ŸÊ*ÓÇ{§ ²å{@-*ïҔߤ´¨=²kò½ïH­Êvò.˜q‚Íçú–¨Ø}‚(êŒá#‘HQzf!÷cƒ´3ýztOïVüä5E(hy¤£:ÝöÕ° &3†$ž ͽÿdm©$ØvEb©0X×h õáx]†Ô“:"ªÕ4õ\žú`ŒJu¬ÑŽ@éQrÎYnè¿™4-M­Èggüó’Ü@eœï¯c ™€´ã=»nÅL£ÀŒe¼J½{W5FÑU*×Éêe§~Y ;´|‹Fk'àc@*£ªs—‰ôãn8 ˆê.ÚiM§=KkmÉ!¶,íLŠá›sæõ÷I_ròÅ’!äV;ÔT±áÁ°Øà»ÎÑÝòA”¨óÑÊØE ’E^ )¢Ðî!å/n›Û&¼k¶ÃP©¸¥Ô¥YºXcéK×8 ÑQñ !º—9¿ÍT™8„€S?æ˜Êî_‰Íšõ&™Ñ‰ŒB¢Ð£°dnh”ê.‹ƒéØ#/T³Ù^O¢%$ô'¸>ÍŸ2±ƒ¨iee\>…¾PO Ÿ@E—Ř¿Qìé¶½d¬ºhw–/àç‡X‡3R< R`£­i\Ytst„Œu ùêe|GÍ8 ¾ÍW¦][’½B#¾à»óE×±¿*¶¾bpv`¦NghQb>a,÷P_iœ€ïV¸´ki Šã„k™òþJê®ãR'ûî§ÑØ0ã$ñÕÎÈ×kÍ’|ÿšZZ#Tÿnyà)À“VK|¹)+ Dâ_eLãA]{jpû>§)äð—ì‚ÓÃë—î7–©¨C»T}û™ð|ãñ‚l¢&z½üÊ}ç­ øìˆ”zû™}&²J}ϲ·A;Y d‹ŠPà1ù{Ø# Jv÷~¶wåóSÙW:×KÕ{xMŒ€Bm9|Uñùw¶BjÞR Á gˆ}Û ù1]¬_K5¬±ï%5úmdxþYfkç–¹Ñ/Jh„§ä³ ®ï¸ÍµÄ’òÂQ$ljtÙ‹o¿\…>&Rƒvž¸úÜÏñ3rý‹!ÍO/§W¢—ËÒ¤6VÕÅÉZ¾_Ljd2Æ`í²Y“£¸iÃaòì^d5šÐô˜Y²VcÖóÐÉ<}»æÿ0ĹÌqÇ—޵KëëêLxý-Y™ÌZA†ü„"E~²s*E,žÿÉXWÃ&“RŸ-’r„?nEÐ;LæP'—¥ÞÙ oŽ_.¢6+#H4¦ÿu«@gÆ-™äU²î^|ËR¦þsGýáÇÎrƒWK4?¹E‰Ôt4/íbÛ;<Í%K1ÖóEß÷eu/йûå2h Ǩ lÁI?Œ“…øŒ ”ª…É÷Ýß –p˜à`#û½as‰Å‰|\©–ó¶aÛçž­is¾%Ë*”«¿Ë³÷Œ?žnš»¾B8NzfCø™?ŽÚ$Xᤛú)â sÆT`´Í~´Ô×Ï«‚|aFÃyü³ º÷mº© sÑ¿ˆóCÄï•£mr­ÎàØ»ê’δ¾=’ 5%UÚ.¬±Ë!/ž›çY#¢äWPht&Åéµ`†2¼G¢Û’黚ô.•ô·-Wo2c|w ½ËÐݛ֖R%{ÔS7ºYQ ðúgçOÂHt<&Rá«_µÐ4c4«§èîý€•_ˆèEeåiªûLÒ*–«½PA¨«ÈO °¼Þ†ZšðJ[ÝÉ“Pk]`ê†ø,× µÒΖ—5•ܘï¶Jt¼”bô'†?ö×C#>‹²äÝn_p}¹05…>5´½…À1®Ü¨GÝÜìöøø5‹¿ªŒm¯^bYÎÿåÁ a‰9±Z*µ™í<‚FÅ@Cþy;Gþ!²òÄÆPæÃÀÄ ¡:Líÿ’…ÓºQuPÜ»­1hæfÛ§V íö^¼ð«KË¢Ä*­Çço\ùºÞúäö2‹@ƒÔï `²utáT÷¾é)‚6p?þïžµØH°»ú°„.ºÔ8OݸQüuB Ïgg‰#¿IrŠ©þWh<áÇ5ð šÊ °’eæÑ†Øê@£±Å¼\V2\-ŒÎ8+pñªpïN…ȱ首¤¿œ6g¬Lƒ-fîœhàüÅÂFï-|Ú©@?½ÑDZ¾™!Šz†5Q”—m¾±–O`”øÞ¦hX®¢-ø@‘Ú\LýÑ+Ied]Ý–H_çY×ÀL`¬ôÞ™Œ)s‘Ü%Tù]È釯ðÊ#U`E7œ~ýùñ/PÅÈu¡¬’ N|ÁÌJ¥  Þ6.ƱBAw#iY§ñÍzþÜT˜– ]YXìUË‘#¿Vy~÷x1FØZQÏã¢Qëƒ,¦‹ô€2zW]²¾ 0\(ÈÎãÇYo“D#=ãD»_h Ç-Ê_wž~æCKx,yNˆöŪ¯þ$2 ÙOÌz0šõ Ýš÷ŒèÞZ¸©Eoë¡HC’SÑ÷Ö-þvîíM³¨{ò÷"•»í7dñK\4Õ óJ²Îñi¯É²>â Ü%L5Ö xßDë R{㬅g;Tƾ%öåE=óè.=e]£Ä×oèÌH#Vüuw‰c€í€_ÖM•1—Åmâ´.•+eÐÙyŒ_]öëWvÒÑ™òëHgÝÛ†²™ý* Cê´bÆ7¢Ž òõŽ[†"ü9|íÛðÖö3Ж#ÙysKhNÍ9¿¯k-E2~øÑöînüvp¥AZ×7©Um(ö%Ì­ÂÍ ³eqƒXÝ‘:ý>2•8{„úÌ{†…ÔVÈN‡ÍP‡·I½ãrŸ H(Rò”­Š>W$us„{Å̈¬ÞÐl¥{¦ÿ@VP8øùåx’3C´ó vðËA ÔÀ‰žø9ØTëåãíŠÇËh ϵn·b‚´¶_ãq§âzê2²Œ lÕï‡Fy¯M¼ƒº¿ 1eòÒRz©~åè® PІ4Žn™­º‰–¸·™Wçy¢ÃŒbg¾¼‡FÌÏ·Þ@JòVÍ*°™yQ3û¹eê+`ÂE†#[«|‚Ãÿ 4-ëÅ5ÿÚ²TeN㘌LÅ³Ø üFQpÈö#üÎ'€0R:¾÷)Dä¸féõ·\ÏP>r]?¯D sô¡Žôýì…àCºŸjâD]G‹4~Ô8ïIt!FĦޥýS»& qÀÄ$+¢J›»'ÄùÊ,4¿t ¿5œæ!®{3õQbñ{tï´_…“Ÿ¬ý†ò§¦eËú°¾m'ˆ  ±ýd}V¨;†XÕÓ'b¯ŠÊ¼g>{f6”§è~yÒì²HôÙ÷à?‹9Øv'V¡%å@ìž2Ÿ§œ³EÜ´f›“ßPþñ¹ÔªbbÈ/_?“íâx/qiã³â ?‚Ì;µæ Ré’ºsEJŠ¡¶Ì¢ 7ŸËÎ7„ͱ¸?‹pLž# ¾2ȱ7ùÀt>Iá{¼¿.Ú bÏD˜ˆ€h9zï@‹_™Üܸ„3[RÔ[©¡¹Á!&LólûüaA½»c¿—‘nQ¡Æ§2þÖåWFVäAéÑ3,Ñç(AI´û=¬Á‹’%þ9÷¨HæËbSfKyÑÁÙÚõòÒI¤Öpˆû¸‘-£à‘_Á¾k¸ø5Ûü˜GÆ »ŠE YÒQ ÞOF„¬?ù©!å®ÞÕu¹…{bt˜Y×/½ßªjé´ýÙ³I-,÷E û :£+­]ì-Ïãˆx@û w0ƒ·ã#_ -`wÌþ(æÐäÐkAÚ:Ôá­±ˆ¨ŽS dÀ`-œ>Û¾mu*•ˆý@VÄ‘l¾u';rû íÓÞ†]èŽrå¼—ÆÉ°ÃWõ‘'¤çáB{|Žrÿ‹‡vjØE­:À§);Šn[ÈÎÙŠáo~Ý=Ã7WD‡%ùñk&w$Ü1ènV½ïÉ-/…¯drxmÉq(·¯ÌhÒ—àøÓ΢ëÁ%ÊZl6 &¬Ýow»¿â™íM0{vJj¨©pÓ:[8%^½qià\z—zSæ¿„^%·¨è?¢²ºˆû³n Ü½>.± ;×@t ­Ö\þ|y„k`/'¯Î0QõPƒƒŽñTÒóédzЌÅÛ‘àVz4#Q’˜s‘w° ­8/Îûð¶)Õ¼2óˆ:ð$dqîþÈi¹à¡Œ-õ>¡íG±tü­*tœ‘és‡[ö»§”LÿVõð<…ŽTN0›ƒš± ;â…Ëu.Š=²„Åó‘À¤/B‰™ßýO raû –…zjGÁqeÖÉ•†züu¯eÈdJw­0ÀõÅ…"e@\F4µ§¥ï#QʧtçMCjµNxAÉÍ>ÌC^WŒHü‹DL³zÍŠH’â¥ÊrT èÁ/¨‰æl¼¤¬–á-ÒlÚ64bËNŒ÷5è].áö°Ë‡Lûþß¿AšâúioŸ¼Ûv*ÎÑçqFJˆµ2” }™Â;<6µDäsà6L ¢ÀБ z æmv´zœˆUÛ¹€ŽŒRçþµ0v §ª…fJø¢!ÿ'ì ¥Œ‘ÂÑD]>/´3&‘š+¹½–ÍÕ¡â•J¢èti B-‘ o²ÃL_èRxõ×.ðÙ!Ÿ´H" Ìo…¿HÐ!îRPÑM„ JJ „/_ÔôX~ĪØrúx,:o˶Œ Æ‹úõ2àdqÜ”æôýš4!‰žìFŽÏß«¯J&ùŸûG9sE‘ÑAÊE‡ž¾Ù§‘mÌU1Ùa-wŸþ£z“½^Uî¢ ·¶åº‹+,,ñ` ü dœYB7ÑS|ÖN­ç®Lwˆ§cÓa¶÷¥5„Y½ÈÚÒÖR\ËÞ=MëÌĦS£–³Ÿ÷a¡áµ²Œ‡t¯/nwÛ˜¦Ø¥3÷æñذ.häo@ÕêS¯ŸJòé™CŸUpqÝCúêÑí~ü¸¶òÌue 6W…ù®Ð©©£O lÕˆò8³0LÅñ¹GôÓtîò'Ê}Î¥åíœãúERÙ0®èU‡_žp•$ô¨Ã—_'aRKcÜú;µŽ¡ÍáÛG”ß]ªajÍ«qßÓ²®YúµÀŸ“ô‰!%Kð诚×õ­/«¸45¾^›;ÊŽ|ûæ)%&ØK2Ô$9P¼µ²Úq³më%Æ@…Ö· ,98÷]¯»¡-mÏZ5šäræÌÒiýÛn@ûcŸ’§Ø‚I­¼¤uï¸õ³:ÈxFd4›Pw´R¤YUáú+'Rmì[Ä©ǹØP…Zçi‰!sN½û,Ÿµ÷|»á÷ÒšÙÙ |\áPäíżŸòV®yqµ“Õ¤GF“^ sžžï7ÏÞ ®°|z»„Ö¶$÷™h*!‹]1aC‹ˆìŽädÝü¬w™g³†1˜RiSz—Þ'—5m+õxSÌ:øþD„_ ôÔP=‡\»NVÜ¡¢XCº$kç9X[ÄíЪ¦M±ê´5göªÓ@iûšçè+qÆ%J›Ç’\ÑÂ`JªY2K±«8Ê<‹=ǃK™[D«LÞîsB %bÑÄRøÝÕ…Qø'íÅÓ_Âì06²~dç¶„ψ_8ØM3g‹¥×>öUév]"WÛ«²c˜,©¼ùêä+¥±÷ÎŽôøê5 M”ê[ÞF®V…µr#(kЇןžïiaðe¶9”Ìa¥=nSã´Š·pñÖiY¥#¾çæsñ/« eÖÝ6¨ó²—Ï–µ`!aÅNt‚‘MãØdÐrfãóKŜ˒çPT–ª–øGÐ6é•òÖ—Þ,;Ðn÷< F|ëÅrWþ®–s×3%©£]{‡WR'ò+ku›KO—V‹¬ìr3äý1Sü}ó;øÝ!±À¼ï È{ÑU¹µLò$ûÐn[×k¬Ìéóð@ U­­‘r¯CóÓ©·L Ù…U_ÏYÃüpúÇR˜hu42u^WAï2òzç²I¦Z(&Ï­7ák_ ¹ ‡ã;t²¤Œ¯:¼{¯:ÁSßÛi9ÓßB§3Ä€<(J "z3í¥W=ãJ㺚Рc–0ªÌ%jʱ±?¥vÒï½üBF<8I—X”K4|gæ‹I×",X$¹ÕTLäQ÷6ûà£2›ÝUL;¬ïë77r‹#´-=èC¬aúÀAæÈÛ)Ï(Ħ×í¦pauÌɬ]0;¸=í+à¹;¶àšæÁ­ôM¸>ßÁâͧ–._²)»·~ äÔçÆ1Gæ¨Ûz–7Ò©lW˜Êýˆó™ªdãÏLϧ%//Ó?"oZ¨°Gø¸½ß ëš_Kƒ#Ï$?RY&Ó0cÔhiuÊB] NÝŸ ríyƒoí½Ô+E8í§þ©:HÀ1W[Û› *o~Ä‹œµ?d훋éÐÁ'*ÛKXÒ±Ž{yKÜð^ÛÃ#¸o¬›e&ÃsvÄrV\-RËø®ã-’ɸA;ÛHƒòTþVUTá›#Ãt, ?ãí W’asŒs:69ß¿Ž‰”«“Å*1îϨ&N¤™†ÁPçSZ°/¬Ç”R²²á„€M¨i,Iú“Dýýz¤ºa–¨ˆ r_‚:m]æõ§½ªè9 å{t$ÎÝpϨ—ad $£'ã3èTÜ#ê‹I^$õÀOõÂsI OG!yjiÖJÓ±^ÄÏóë£Ù2Ü¢ !à9áSn%¯ol‘ÎýPo3®FË,ؤñm#ŠšbR?Á€Á¢h9„Ô†¿$ó»ªl>²ÉܛȗMM÷qiÃÑNËÉl‹Ó;)ƒ”KIOL"1KcÔžIúÄ™É6 µ¡rÉ Î¢Ž«ª7’×8"¦S‰Ô E8r8‘néPpc°%þ”|þÓÏÊ ÂQ5–1 qšË¡vbëjÑ ž£ÄƒÒ„ @&вŒ)±¬Tè ²"=Ñ7FÉ“öøM*/&gZØêz^‘¸0[ïBc9Ðók’¹f|^îÎ;¡9ÂXÓdöû0T¨|¹ƒ!™°­Ù÷~nK2»í*®chUÕ±„I¼M#…ò‹@ŠÒB}Bœ!4ößÚ¯G³óLEó@Ù¸žJŸn$`/Ь^ jìˆ6¢«Lf=ݸbÑ¢µëú ãZ—­þãòGm-X‘ƒR@|º¹U²þc&83ÉÓÔA…ºÄ¡!ïR¹îîãï h†ÿBV0$ŒÈ/ç¶Pó‚ŸÕÈIÿáCX˜ÕíúƒÛxn6;Ôo>ûÂú;¤8^Ö²poíÌmO3§ÔÑ"Y¢Ñ«f/ƒÈ nãÈœ¦.öÍ1Ýnœâz(‹vó~Àm—jmª€ðšâ!'d€¾¦©ÎE€Òµ0’/ò ¥´; #k÷¢ŠùS1 †èb"“¦›OÃX"ŒY-)ÆS˜Î\ºÐ¬Ò•tç7p|Ø—iŽsBBlq0¥ôf?uÐÑ]ˆ³@š¶Š¹¬°O$G 'A÷†8¾kR\`±ÎÇ 8C4áCËm§H‚Z*¾\øÙ"½›ÑÛ>b&;³+¾ÑÓÑ0³ÊkòYSBz³ « NèkÊYP”U¥¹BÐcù’U½éÕ ¤ðL¢¬ãO˜ô®ÊÏ<Ú¹5«ž–{Ôm”Qí¸:$b†Ï"¡Fd°Æ_j·Í–wë]æ'ffí™ÔTÝ (¯Ÿº¼%¸=—Ò®çIUãY@…‰óoVÛ`Ç,¾(òË Ð™å$K4Mº(ŠFi¼ôªUEG§¦oä#£¦ä*µjÙ÷ékrmª€ƒvzìÄÎ?ä%šwÁÜb©ÈÞ0Ò9ø†¶H¥Úx”¾ÞB's+*pÿQ4CÉËØµ£'~Û;ÇDŒ"˜N1°WÆ@§¹Ðe¹ï£BV÷ê¡ð<2k•kÅÔÒÛtØÒ%–¤þ:赋<}­„z[!’·Ëðu§íeoXc ©Ñ%Ø`žßjKÁÃ&)&JÂæ0N—‚£§ _Ìb,†F.“…϶bš£ù´°ö¼¥ˆ!Ñ‘áXøÎÕP¨ƒ[oþÖ³û  ü^X|7]ÄÃ7­ ¬Ÿ)—ÔT‰Ès1[LÏÏ‡à›øwûÎC21<ó7åúä~´·Äå—B¬«gfPPË•@Ü3$ŸbÚNœ…pZ¯‚c04 ©QªñKÒìaä*M¶²fÊÍJ}û1›Æ”n(‡Íˆ0õb ‰Ån´Ô [øG€vùö’–Úf¹˜³°œÚÀ"òÀo°hÕ0p‰÷½m&‚BWû¤p¸ˆëæVy3¾ieæÍw¸UÆÙkZÛÙ|U¡yGÇý ÎT•R™­’uuùÕù X½DK±É.ÞÐÅUR¿ÔÐN-g³yIr«ob×îú‚šÄ$× ]üa‚´£ ::Û2Ÿb›{C¨d…\¯Uã{ˆ»cï$ÐóÅÀ•ÖüÃ0‡è, ú½µÑ?Ë›1R•!§Vý ŒÅBmOá¿ÎÓß(Ûø³ãYw Uõ½÷xÑ¡´Z²…y' .éqœv¯JFäå´?•침¯Äu{ô]ûÅ8±Ý½¢T§’OЄô‹âMYõàºÑ¾W[kM2ž¢0t3äˆ2ú6a a†Ie=*à‰ ®í“²hèP‚œú<îw¤ûmÜæ‹‰ÀTÞ Oµï“ 5QVø€éTaÜܪwÚ»4Ýjx,RüÒÌtÛùÐU„ŸÁ£Èt/X[¥¹2¿ PÙ?´= yÆØëÆŠÎ¥5hª;pœn²ã%«?ÜukAIn;ì= NºUïOzd+²M}Ñ»V½)²o!F–ä˜l¹×ÜÓeŠø˜{’Y*–¥q‡ÉL¢c_¶œàÖrûaÌut‹›ú‡8Vºjš,ÚyrC Þd:P"9l6ÃÅϱÜiwU¹G Z˜é‡'Õ$l×ÏC‰Bñ‰kÏcb›À/w÷Ç•›nÁOµ šRÕ¶ ß.Mìè!¢\9ΙåñfcÍÖP„MWl$é.G?¯‹q°`ù±P#ýx Eí½Î&oÄXsE6z &±hŽØjÊ @c„Ž.ᘽã‘Jãõï¯t¡©–î]÷ÞS“§e¿&g‚æý‚©½T OòûNÏû㤟ù ’~®£B Ò˜4ûÄóÆrZ¶Pã]´ÝO±R–ØÈä!´›2bg€¹Mð7R^ˆÛN…ö€ç2yWµÓú_ç6Ý0MRÉuX·V¢±Aè“%ôíÔ Åƒ…¾êZ Z÷K¦Åï»ïûë¬ëUä—šÇF» h–*SžÝÃi6NˆäW%÷ô¼ë£¢1S¤]·ÌÝb®cn¯ÒMv¾ØbêöÉÿÒ/šé‰ËÅîÐ!DÚá8&½ËéξÈ1±ëN!‚æÎ‰ŒÉì nþú)TuN‘mõóg¡"æ’_±QD'v‚ûЧ¶ë¨$—Š Hެh­Ô 2'Û,l [µ¤ŽÙGÆ]ß–Ö…Û{€¨)_$|á>”Äb ˜““$«xà/<ÕišrÁѱ¹†î}ÑHØDÖIuGßiÝ#Úõg}.@Q·ËLˬ0Kõ íצ~óÀ’/t1Ý áðóMÄ>#}²n³9ªÒ²æ ¢z|ß~Ÿm-è«[C˜þ˜ zÆÂ!©]OHØc ̈/3ƒÚYæY»¤/¹Þ÷góbKè}5…\‰';­„²ÿ¥Zð‘™:UÑÕ0¢®,+÷׌€;À{…†—§È ¬«ÛÍÿEŸÂÛ£¡”Aç™þ¼\»c¶(ދꢜ«ûÒ ÜìÎLè9ñ²ØWÍÊÊ¢Gcˆ/aa2†ˆ9‹¿hžì>xÒ)HYÆM-¿Á¡:›æò”ÅgVÌì–å/ ëýËßÏÓÅ?:y&³d]väò¿%]iqö 3¤ü4ÃÏmyýiw½uk>âÏg``¾†§s7Öcu>—Î -ʵf§A^Bˆ;ܺæÚ©øY¬˜TÑ,¤u ³Ýɱ7Ýôw—rˆÙþŸƒæâ7b.ss ÇR³€"•ŒEtøNüÎQOcƒêÞùÙ|ÅI.à‰R“<Óðùõhè"¼²/JçÍkû¼·ÔEŸ×€K×ri|¿m\쪄3’/}J`¦•Q"™§EÜ.~t¶ÐAa-0噾8IPÎÆULElè¥b!äÊ–8£ï]>0¿þÏ|¹»Ü½o©ÇrðÇ<°»³·h¼ $Ã[;Üy‡‰’ݼ¾QÔÉ÷‚m%Æé¥¥ÔþΆœô¤ "?€mªóåñì. ep?_Åhûñ½qÑÑ~£|HR¼Ôä)Ëþ†:‡E’D©FýáÛÀó4”عzÅ¿ú] †XxîQfWBÀq l›‰v³R¬Óä±€¿ñ[aN¡  "»%ãí'íæbF€ádnpµzÚ¼ V™»³´Û¶¹Ö¾à- æ!r •½UéȈF‹ÐúÌŸ–a…}g0€]­ êñŸ¯9°ÍMo%ÚÅЧ圧FeŽÞ2rtß牿ªu“µž‘áÇ7–¼À‹]ëÒÖ%³•ÄOUûàÙÌQ®ˆ äNÁŒ"Ò¯P '±Mân!X<5wâgÙ¼j…7GU²nÃ>âÈ3o'Áe³»+3²£RÛ—ò@pßVÙ£#r9R9#g%WÃrÁ¼kZæHhüjîu= 2¦âG{p’ É+H&ëùó³érEÒÌrÿZñ¦WWçsM 6î8i€e¦G$O ,ì§sCn9 €ë\'v: Ÿƒì,Šý&š#tÊÏ[wô¤ËɲüæX¨ciydzßUòà´9ijŸÛ§„ƒMWQ+È)–j¸óÅ©‹Ž? )ðƒ! É{ºq¶åŠíÔ¾›ÎšGÕœ‹.y<þ*éÛ¹„iè)L~¥¥M{ƒ¨-¨5³×ôð{¹4wÈó‰sÄ To‚§¸EþJ5ç‘,ùÐëîГ˜mŒ"Ÿµ¾L§yá_æÊ…Ë}l¾ë­.B’ÅèÆ­ãY8 „Ûäìþ¯—“˜òoÑh dë,óÁ%èU|òÂá6qj5´P>S0ìyu{tS✈æSÉ+·£Œ¾¿Cmú§g×7¢Vµ X½w›s9YЇ— @¬\/¨Ï»É¾ ½z¥GšL—'QÉÌíäœgö|¶†&5$ê:@2½’p_Ïœ‹±È0è´ ¤J}GxÍDOg'iaíÑ/¥T¤‘~N*„$i£©<È—f8cqÓ GA£u;·\2 ÔCâïž^òê;oÍd’s3!P[_?;d_b,aÊY ¯!3lÛ¤îqÀ¦|ÁZäT¿"úEßÛÈätCmÓÇ;ä9nácJN‘;ÒZh@DÏ4¹¡qçþ 28gC A„ÄÒ(ìFýêÈy-1èì¯ðü|t\ýez0ÆSá[’ÍÞNý!½CyCäîûáf6íŽvW({ ÝÅ-!F”Ëön ·zJ—ºƒ¡ 5jÓ,®§º ºª :ºöÇᣴ z= ¨Û¼°›Ýá`ÉâOÂ/n*Ù·s¿-bm!Õxí*Öh+?›è¡èSu@ó£Ã&5¨ÎÁèꀵ âÀà{…°_*áp…ÖrVò1ã1¨ÃÿUò”HNnPd+ƒûU;Ê…ðÎ%‘Å'°Š¯ø€§Ý¨pš³,AÕat;ð1íæ’ˆ§pÜê}8ĉŽQU§:KÖi¦- ¿Ø!ÜCã`m&‘ÖÕxIÄ;F*æ© ˜ðÙ„=N.„!†o¤òònUÀû¡Tl@V:YÑuåÖÉ%öo6˜p®ÍÇ®9ç£ÌQ-Pú¦H©‚ƒ[¥Œ®¸æìÆè¢A ×âmŒê_õ-8fcµþàMÅ[ séÅy Ò­OE­ .YîçJ¶¡_rþÓÞwÆŸKøóÇP@1þ˜#Å|Á˜ì‘©7Ø"IÖ½'þ«½ÀœkâÝUE˰:ãñu³•àsÈ4P@Œxs>VÜ1.S5‘Øã¤¸æ)QîL0“Õ¹¶½÷!®>ß‚x€r¹œ‹·-ª/-ÿeCÑŽêívJŒºx÷C á¾ fB#á«ÓQýt«é/–pÁ^8µCc?¯K›þÓD0ïü6ø:ÁöwæMZPþZ7©c.ï*-#×0ë°"'F!òM\û¥ ²ÜÅK±ø ¨²+Œ‘è/‰³$ÿÜïá|¾òË_ÍS&$J!Ö@q•‘œjÄÁ«Fèßò n“‰œœ4®•‰ZÎK¶úOE`ñœ èÂúƒ!xçµn‘_æXœíÖ‹ïµã;«M¬Ãu)­­ˆ}Þjr{¯@¼/_»^¡ms—èÜcHom®30èxªJiÞðˆJPJGÊþÄT¹èää?í|öìl-(üÆôä„Rc²ò?Z¦ì±ö¬ ¤^ó¼†5ßX=m„}»Ö(ºæíy)\ª4“mŽ"¬­ª'jÊU4{þ'M‹Ãš/þJk«àPª3ì_¿t¯$ùÑ›2"T¤”¸À´°"ú Ø%4î@„µ±WŒ-9iÃÎù0=àÂ{íç½þ]HÌv‰ì?)<ÆÉøo¥NªØtjy¶9¨ 8õì\b¯tÏZ=ï°ÍÝ ãµ!ú’ž§OaæÍÑ.àFÄLøÞ”Υ˓öÊ)‘âV„et†üTžO„èæ–)ŒÂ±Cái§z‚sï©·‡ü È4¥5#½>HPz燇µééƒÞ"ïÿÝ8EÑzº4¡€ ‚öRãïnVÂïKkñdþ¦TB8FÜPªw݉-ûèÿA:ÅÛˆÍljPüÓùgiÄÄ'Hâ)›CÙ±B=}i vɤhP åH‘£òñàu•“ÿìâýÀº ‰½þø†0]K‡K ÐŒE²íâùø5$ƒ(ÁÏÓwo/¦~ˆtpcàl«ã÷Pa½ƒéî WÄÕTõàæ‹†D ŒÔJ@ƒæÞœ8 ¸&Íúnß[î{W§âûf¿F®Ó‡“ó±²Ò¬/¯Õ.ÌOIeèúùÓéf2rñFÏÇ«ÁzÃ#D Ü 7H’UZéûCŽiFî»—‡0â.90@m‚;$ª½…{žßBŒ(®1Ú9”ÚŒÎ÷˜•&"wùŠ¢TvW–ìr‡W-¯‡Ã!¡lcö¹‹”î›ÊÂî¦PF»§{ endstream endobj 88 0 obj << /Length1 1563 /Length2 8055 /Length3 0 /Length 9093 /Filter /FlateDecode >> stream xÚ·T”k6LwJ÷ tÒ!!ÝR2ÀC ÃPCwJw§HIw H#ˆ„tŠ HH|¨ç=ç=ïÿ¯õ}ëYkžgï}í¼¯}¯5ÌŒZºÜ²ÖΖà'ÎP7n> 8@^]‡ ðü8ÌÌz7Gð_jf0Üâ ÿ/€< r»×)€ÜîqêÎP€ª»#€OÀ',Î'"ø@±ÿáâÄ ÎPu†‚]q˜åa^pˆ­Û}šÿ|جØ|bb"\¿Ý²N`8Ä ¨ƒÜìÀN÷­@Ž]g+ØÍë_!Ø$ìÜÜ`â¼¼žžž< 'Wg¸­;Àâfл‚á`kÀ¯† 'ðŸÎxp˜zv×?z]g7O ¸W8B¬ÀP×{w¨5¸OÐUQhÂÀÐ?`µ?.À_³ðñðýî/ï_ ÐßÎ ++g'êÚl Ž`€æ57„µþ9º:ßûƒ<@Gå=àwå ÀYmè¾Á¿Úsµ‚C`n®<®Ç_-òþ s?eE¨µ¼³“êæŠó«>lu?v/Þ?'ëuö„úü%Ø@ Ö6¿š°v‡ñêC!.î`…¿ ÷*œt¶`7€€]`„•ï¯ðz^0ðo#ß/õ}~>0gÀæ¾ °Ä|ÿÂñqy€npw°ŸÏþ-áðñ¬!VnK°-ŠóOô{5Øæ|øp`¼çøëùûËìž^ÖÎPG¯à¿Ï—WAOKYOƒóOÇÛääœnA7¿@LT "øý;ŠòWÀ\U 6α?ÅÞOé?{üuþlí;àß±4œïI °ýÃqS Ðêþ‡ïÿ™é¿]þÿþ+Êÿãÿ[ÐwGÇßf¶ßöÿäqôú pÏYw·{þ«;ßoô¡†à?;«¶†¸;ý¯UÅ t¿²P[Ç¿Çq}A€­µ nVvÈòG¯ÿkÉ!P°–³+ä×­àæÿÇv¿YV÷7‡ë=#›À÷‹óP+gë_Æ/$ Áá /à=‘ø…„>|÷«h Füæ0€—êìvï¸oÏ`ã Çùu¢ÂB^Ù_ªß’ˆ€WýoIàÕú[»·þ–¼÷ëíô†ïž¼à¿ÅûjxÿÌêÀ}.ȉ¢^ÇÄ{ÊòÂþK¼Oÿ'Ú})nžÎÿe¾¯ÆýŸjîCyƒáìÿš•;~Cüfðýðþ#ÿ¾ŽÀ`Ø gaÖÙêq¨}}hçE­,'÷Ö{Éiæ-à vnŸx—ûf*{MNðü\6uä-Ñò¦"Û™Ì"ÃÏ^[#fD{²vÇOßëç‰:“[8óÈ'^îÉ6 ÐaÓrëÉlûÞ¸ø9 ¶!w«2¸¸‹h‘\xö+!*–ÆÂg·´·k„Ÿâ^WLqÇêǘ•Î0Zæ~¤|ˆáÆM‡ÅñàA8sv>ý âŽA5‘Ço?V ÄÇx?îò£÷Êk=~×*&*cJ:Ô³c“,>r;iªs>e%kð±ôä]ãN)|Ž;lÞ[:ðÝïæ,ÌâlT”¼¨¤*/bÖÚ•“œJ“0s–U×*ßEÚ,]¹4“ wšŽ" B:¸b[½Wù Þ;˜ldõF:vd© Ð>¡:äü‚Èâ-Û¡ëXŠUÓ!«•ÑÒ¦V1 Eº¶®ÀO¶9õžA»+zŒ#ˈa•™cUï©HÝMGÒ£S«lçÁîíqWk'*säT榦`ÉÚöÔ|\Nšä ¹tîçbm4èÔ±Rs² Úš´p‡ž›Õoíá²g×ìt xâ\D|Ý$­Ð¯¸“­©*Í!~‰­ŒwÙ‚±1îN®ôaC\aõAĆjdÜ-[xщaÕÛ“ñ7'‡fÅÜ@ ž []9B< Çã<͵ÃéÂ8!s±Æ>Ò[ñÒ§íè¾ßžà‡ÞùôE#+f¹Ö¨ò~ºt¢PHuÙÍÓ{iõÚ·¬F}»»aQ*¼‘ÇT^Æ#Zgn­h›E(äRwuó˰/ô|AºµÈ~ñCâ¯zV+@'Ö@»þ9Ÿ€ 'ŒüžcùiWáda¶Bƒþ¨ÁiÇH8—!´4bJÁv1þ'3캓”øaÖÝ•(ª}H³jô./κ™iÂ6%d0¶f]r~°^1“ÛM#—J²-y5ʾªŸ4ÿÜRa&Fž%ij Iå ‰y£ŠŽ¨Áï-Þ^ž8|æ§óeÂvhKÌ¿æÃ®Û®£þ™7c…k\ú§4‡ ÃÚ…oÂÇóI¶"ÅS¥ÞÁnôÉt¯ÃXJ¡32XÊQ«N¾þÖï$,CÀÎö2’„`Ö4îõìòzQ’ÔI7•;YÇX1Óã²-ƒ*¥r .måc^¤ýõÀ}iFÇW±ê ¯'ùmI4w–xHÃôúE’)¯š='’Ø¥ÛPKä±Ö Ò ,IEÌ?9d畟©>~m…£Ñ“Âq‚¿«DÛóêåú‚ovÒL}¤þË;«ñêµ¢‚‘2Ç™€dá)»,atlþ…µ¦ù ô Æëú§YŸ;µ|™Ù †Z œŽÚç*sé)Ý+.`Ú×G'¸(V¸¿1o4].=^Ä^å5fEDàp:õMˆ4꺔ï.CFDWæ‰ì« [m'$ò7À8ƒEÞ”+ìõÔ&'"ÕcÜÈ/¼^úűҬ±xz°ys|Sát~K›à1lþ {½!F¥/ˆ7·#Ìv9Ö}>·Å ïhnŽ1æ·ØÌí"&Ó>¹¾[Å–©ë¸}…YÐâí© O¶"[Ó"cûœ'á ÚYó8µBdH™7¹¸E0]gQ™²CèMÕt Æì–~Ù×ZßqŽå˜PT’×Ñ †-Xeˆ†.ÞF–*t’Ú­¦ß?œ˜Q¤ôº&j7°váîaµÏdÔ¡Ñ-îï -˜¥© µEéN=•léowâZ—`´.;Ž:cS·ñßà%ëoœœ¹÷ÊŸ}ÁL=ðLïŒUç4fˆÚ~ )ßy–N½ê§vωt”,®yÛÄ;fñC&äËtþtÜÙˆ`k\c¥*A¨Þ‹±a¦Êg µÊdز‰¶@ríª‰ÕÇé?=|%„1g”>˸ź…ÇHmŒÄÃT(ª˜kÙèN=RG·EüøÅ+ekž.V"3—c¥¥™%÷qf]­×9&ž>&;aM£Úû °láÀ¡‡×ÌV]n–×G(,¤3ÏmÒ˦Xµ/«Ê(à*Žæ-úº\<†‡n|[1¬èÚ¨1ãÔhõ¡â˜‡géR /âmäô÷)íî–6š´!DõÖÞX›74ƒ ;2ÜA¾¬ÖÆÅ{!õ&DØ%Ê“#ÆÉsnkïh\§·s£‰/- Î_â¶p¼àÅBó$“ÑSâÜ…áà ¶ã ú4eùÆã,Y ôÊ2©ZÚ£Ÿä™Æ{NÕôÁÍ’a–¦ýìŸ ¸^¾>‚þ˜¨E…R‡œÚ×òè}NÅE:‹ Üa©$ŽÝšÉ÷®ÈUrŽë›yhNQu¨Cô’ákÌh>@øÆS4gS7õm¤ât—+(HÃkY­q·ÏJyŽúté­ÀVññ÷ݺ JM» U١̬†N)óÒbùÓ ^4˜¬*Nn­ÓÕâÖÓƒ‹SÔ¦i¶A:ˆ‚>ưkkÆ.\ä”ì€È¬&ŽãŒ îÏbÛºÕ Ö$ó}ÔI–LµWÇCáæni‚~vBàÄUeHx¿r•J —f ¦0ëz ÕÆ±cQCx6Nè]¸†æWÊÅGö¨¦^–Áw[ £jS‹ñ/£5ì®2F³ï¹e™9žæÀòK2<¡ƒ(¤ îødµF¡çðå­Ý*ÛàÒ^zø—Ò`¢Ûñ-æäÀkë¯Ýi=ˆ‚Ù«½ŒÑö‰Â¢ëgÖ+l¡âyαÖ‘EE²êWZ–¡1áÜЗ‰»5nhIfšJ¢mYF¦ÁeéU„;i–BÖ$“šŠØB øuúzvWT+ŽÝb4ÏÙ‘/g¨Æ˜`òÙYƒ{tDœcl­êqØ;µ~¼HÒ„Ž¹YÉ[´,øÌŽë¯¬zýL–m€u7)’O5 —º†$eZr*­‹‹Û¹E›Ö\~ee÷\pîßÓg…5œMÖ³RæV«/„ݸ†oHI¨Ø_CÎQÁM††ªé|!(ñ+ˆ¨œÐ-Çö`h:bÚ%ÃЫøEAëNª½ÌDªr¶´oÞ ]èá>«"»(,rx´^í)Ý ëÛh¼Oî»ÙpkÊ%§[êa|Îèœî·†×û”\[ã%mr%OÉ|7ãœoN슖_"ôn;ƒû íuöõ«»ŸÇÐr±| ZÜ¥a¨5¥¬JXþü¡ˆOM®¶râÁ#ÕÏõÈMG='·}Ç­t0 Ù8€é½Q˜êâħ"Æj AÅ©§6Û*|e´Ò3ön}¬#¢â¼l1*yJ…ù‹˜H£MÂÑChTø!œ…õåðsÀE"oÞ>èddc@M‡X÷–wŸÊF´WƒÍpb°’F·‘L6*MCßÕÌò±m"2},·šø—˜¼d¯«Ç`$ ù4,BñÍ|ˆË¡”ïß-1 zRYQòƒ¤›­ˆ( f/Hñä—Ò‡2EDê¹-†˜ÐjªÔ=Ö0¿Ò}%÷mcqíyW-lÄØoûj=a’ìIü94Êj½—î<ãÌð£ôyØ~Š3?Á¦ÄJG6Jdí~/! }B=A¥Û§ë´Ê„ÉZAï«ñ,Ñ%ÞTŸ}Ëzp2ÄW“ç‹¢˜§¥.J»ë€¦wÂÆlÖp#cS¿íÊËÙkRá2¢õ¥qKL+xCÛ÷¥DCj>‚Ù‡kP£¢±c¾&äÁ0hbÐSº^Mynr Ùò I1 [!ÉCsÄø:"¨±ÿn1O1€¾¶wÑM”‚ÈO#ÿtV%Na44%)#ª»2«„¡›1(re=ð¡™róÒîžÄE=þa'ˆö«·p9pho€‘ÞæSÒÐzG´n‹!™Í,R5ÆÒó;ü ‚õþÒ&ÞôLC+œ ü-¾äy¡|¯DÑ^¼öY ƒöÍšÒÓ…Ò¶¾ïAÁ¹DæOü¨IãiÑlǵrc\ú§Q;õùÛ¥ä$a=ñ 50D==šç!Â4e}Vt>wjOK9ë»ý@Œ3§k€`Õ.B¸Ñ¨ÝémᨠEi?Ø:à5‰F颥4IÔÔq—R\Km)õOà–x#]ÕØk½«á²7ü”B®³Xí.Òè‚¿ßqaïäˆ%ϸ|D%O Ý£Ž…`ïY¸÷‹2Ö 1Q7X¡•]êëg^kŽ>ö÷[*#l%¾°– ¦Æ%K»Äg°mƒ‰Žì¨íìQrÏIÜðP›Ù[²Ÿ©L Ù]¢…LUXG)ý|´qy,ÂÃiõsóÙe_G~éÙkI-y¿ÐëåçüËC37g¤$,{ƒ(¸»ÁuJ"sIè%*i1]@m›^ÞöÄsìèŸ Tk‡Ùy`FÝO¾üqÉO><ŽM€’ ˆŸ)Ù'Dü`÷wHÍ[Pg•}Qº¤#%OÛ¾¦nîwen­&çÞÊæ™1<Àø¨¤ÊAx8óF7èKº#tî.hÄ>•ÑɈÙ#ÍøaSÓÿyå2„µöå[È,¼Pd=œ™¶ˆ=9.X"òâ@ô]ËAh`]Äp‘ƒÿGñÛ®\OØÃÊÇöǵ²hWUØï-tuL›Ÿ¡ÔñLyj¬SÜÈ×%:ly‘Tú¯º+?Úe%˜Ðix®ñªPÐãÚ>ÞIªÛPûÌ'ý|"@‡¢ë© …ù)Ô0¯öN½Î>ƒl^†–åÈ H+žÇñèåË ¯¡o¥£[Mèûj~/ãlÓ§cj„OJ.DD%TÓ@n¿YŒ¥s­oðΙà IS‹ÎJiçhÌ)C0C^¯ýÈI´M‡Iú„O?'ÎÎ(K±½kt7ìš.ñöÍÖkÜ4PQ߬±áX+~K†9fõ¥zÑ\"=GGh܃۳šcKp>>òò$/Ø è$BúsQ°ªœMXUîÎ+LˆÏgåG‚v¸laÈ4¶þ8¢o¸gãæ¾†u“Ê\°ùígS^Gm“ëå`èᪧç„jUÕ[Âf" -¼c|nY³s"xQ‡dœYI8ï($¾I¸Í%‰id-ôŽ­9ª(Ó¬¸æöIº‚ kÇ>¡Qœ¼äS}_QÎ;WÛ]®f’ÙÒëÊae{&3ïïä`ãQ&/º2:DŽ/¦3–‰7'D- -€ˆÀZ*ù›SƒµÕ*Dê_Âzð[È­e¾°ë˜õÞÙI/š8…Á¤í#ŠÓ\hžÛÒÎÞ ß³[–±T>¹kÈ)²î#7ÅQ VÅ0 Ï€³Œ:Nxü\/¼Æs³Ø–üÄø¢º€=Ÿ]2"û1~¸£GmŸR|©u*VÂ÷Š4}I!ÿ]©€=ˆe­ÇI=Š™m³`¬3ËM¶»÷ÃØw˜üë‚bµÒ%ªrmÀ³sâ³lÿËb§;áÇ!qUØZŸØI”j®7·´(™ ëm̘ã5Ý‚âÛ¶6)m:e0?>™ÍÛhbðk–‰|>ÑR¿y‡^~bHÊò¥ŒýÑåû¹ÀÚ¬˜ÙŸœ…L# üÛç™år¹Þh‡´fò»CfVœ;A“1í¡è!£—MÕ[ê4À¶Îð…s¦ã÷΃ K'q'Ní8å\%z&'Å ³ ÐCÖxÜâ›…–÷’œ<»nÏ›¦¸X_½Õb_<ùPšç˜&Þ4 ƒÍ1àÒêûÐqÇ4—MËEÑœòc©] 2‹p@šc¾.›QÖè…«ïv©Q§ûÚ™6¾òžøN©ë\µp[ÄЬ×à•?ÞV¿òÈï³õÿøãÀ½Â¤Îñ;›sçÂÆL-u¦£"á¾grKkïl(g`LìÔz±ÁÈ‘4^ÁÈ´(O ·Þ’_\…¿Åž›»Xƒè,!DÛdwÒ¡ºRMuÈ 1 ¼Ò§7ƒ²ß¢f¾ ¡±Ÿ¸Öã£<ÔJ.…×4/œšéùöOº3½× Õ£u¿HÖ&$£ž@iW¨C¦²/³oûc±À3±\;±ý/d‹gŸäÎ;4òZšžmîÔ{¨¬üØAiÁE-Ô~°úà$Y¡næëÉO‡ ×´";©æ,‹°Ä|Pl¹V-›¿=³Vuxëðˆ!N“’¡cªZФ4JfnÄ禣ËWçh+‰å,½ÑvîgH,]ô²ÈáLD1Á±3ÌWqbV¦Zx•Ø®â |ª¸¼9k ߨGéé%M"BòC£ÉOç|˜ü9¦•t±5¤Âà“rtfÒÙ"US,ŸÒbþeDô§g„»zõãS•#È® Ü}0ÝŒÊ^ù†úqœ`T11Ø ÃLgÚÇ[¾5¢]ÚK³]w–g›s]ï‘ŵÅÃy@ö CbŽ¿l¶Ô mˆyýÊ•Ž÷¤¤ qÔnû…­½ìJ2+"ÂRNËZ¢f³Ä|*Žkš‘°¯Ðãã–Ó<®*cb‡Du¯n=Êð[Iõ11?#:“%+Y~N뽇Ÿ<žc+ž%™ò¾Ÿ6ÖÐV ¡Û|û…ÁŽ’,¦Ø—áÁÑÓ/RBS/x„Øžn\‘MKqb†‡p vx}”)#[EÏû ÷ñ›É3†ÖΔ3ì×tÜ×Ä1©Q)‰Ç㉌%¥Ü¾åg:êpalk&bûØ•žÕ`êüöªØ6f žóïøn=É8”ÇÑy;çñP¾-;!Ô{r ¬“»øzéô™tU³åv!œÒ󭧦;‡ÆÐÂ*:7óΠx¦Wìµò[ÑZþ‘—ÄÇE￟ ø˜}Z¤›…Á9L!ÃBØhÚ?iÖ“ki¸VÈX¤±Z[ õ}&ÙÄw:Ư@;¦qbña˜;òpñãÚ:â­™}m"4ÉâÏH‰;¤ŸÆr ›hPÉE}èäõç[·h»ÝÒlæšTG¯U< ¶Ìjô}†ª-È0¼-/Af ž˜ÿFáüyëJ!ž‰3;©,‹T£ñIwç,NÙYý›ƹ:¶ul¼ý›>·¢\%í¬†>Âíg„t‘ 7­ÙNÁ»lÌä-¸eû]ô¼•±ú¯Z>ú@b!¼íha\›„WªY¯ ?MÆJ¥ã‘DݘF?ž‹Ëã¾N:éÞ?Ö z,«-ÊfXØCÿ³y23V‘Gg´ÃÛ3Š?L¨èM…OÊiWX›–\yVH·°#"Á/X<8¤[%Ο°G¦z{=»¨?hÙ³ËÐ<¼Ľ Šîâ*]ÞJ2›œ6Þ-Úk%Î\±½÷Q¶ÕAÊÛÄຜÕzÑîí¥U|ƪny—Ù¨$ÜAøƒ²È™ONÄR”Ä«:ó%0lOÒ¿)ÆYl·»3hrvà2b…ðk™™Ÿ­³q³º\ÏZÞÔ4…'R6qî8tÙÔŒI¸<Ì8µÀ-;U˜í£K!äÔäÔR™›—·‡z^¸5£áЗñë*OÉð—ãc6Þ³‹ˆ?ã(,jj¨äJc#SmßzÇ+=½VɹËñI)c\hQç¸ñ*^£›¥ ÐÛTNÂuê8ûI^qDø¼d™§ÕdˆfÂÓ:Â+i[ŸÝ¥n§Ù/fĘîïKªe,"FUfrt‡]¨ Ž*K•Ó•s=G\0Ä6öHËéDå,LÈlP‰¥‰½N¨êŠãÞ‹ ¦O½ðq–—¶Ü zybp/ŠužÜ°â͇6ãÜ[î~qó|CZ0«ûÎa{†%!š’ëá<—¯OfaÇSD¿l´Ÿ~ôÍ=H¹—¯Ì<9æ›F˜fä¿=DÇ/~–û²èC¸-Zëcj%ÏÛ­÷7¥ ³aŸöKe®¯ïÖç¥ÐÒô—Dåš÷¨¶8ÂSŸ{ãåaE­W“÷š¤žR*K%·ˆI¢¢¥<$Ð ¼X‹Íeõ­“×ýü´l*_Î5— 䱄գLÉ{WUõ¡iüÜiý°`\t{¼E³Ü¡§·é˜ßr.ÜÓÙó„æ6‹ ¡ai¨ý¸ñiø ß°.÷A!’ßú@MݳçähÕòM•¶[ÊR7mm{¨}Tx£`«zhùÓѵ Ã+¨.ÐN³Xg¼<‘³Ñßu\üÀ;¦h>0;)åK´˜„~}&;Í@#òÚÕ›cÞórŽ÷i>a–Õx¿9„[ÒFqôZǃ&4ƒeŽÿÜeÃ:ýNºÔ¥“4DŠ!g/*Täˆeu³ÿ¤cÖâë¼bõ‚©â cÏh)”¶t¶–†³E´çy̕×¾T²þô¡<1üöìVÓÒáBž¢C_x¾ÑÖp“mJ9ϼ2D5üw©˜ãe`) ­8Ku(w¼õQ;Y3 (—O^€¼;ovǤ‰ qª×Ï' nHÝ%‹ï|ƒ™òdm:( šsÛï^§ùëVô6ý/è'\ÊGž>Ǧ7¼>¨Ži#üJ6ònlë@/Öñ ¥7.I“‡Z½—’èþUO®\{ÝкûJÝ»‹GîîJéÃ×fª¸Ñö«d{ݧ’ãBm÷Ŷ–™…bf)s—à»É¢Â(úW’×õdD³zBLì½"AÐW#OÇßpðm¿޹âØ ò§ñ­Á±®íâÞ>Ò°ëW }=zÕ½¤eIlZÑ‹vÞ³/gÿxúÅGSb·)4óÈØfŸMù#kI…èwág¯Ô_(á°º‘ˆc)F­q% 4—B`%i§î€·µ“sõìhzhýk¿HO¿ÕSO:ôœyb‰Ë¦HÒÓ)¯‚ñ.gj‰ßš.W…ÃÓ¤GÀRÅÈäµ²žîî\lD®k:±hÉ„šªnÊ2 J _ ô#Aªˆ…HÀZV/hÝË´'eö¦®=XX]"yä Ú±Cë§®à軵¿<‘ˆ0¦ÿØo,ÛÙUàkâØN7!N÷1ƺ¡` õÙ´¿rd™„ZPòdpJåÑXа&aÏ1là«ZˆŽ?‹Œ~ê¾(JQ(+­žóryئ í–ÄÏã\±‘馱!iyYš%[Ã/¿;½±\6c© aûJ>Á‹‰1…ƒLåN •=÷nÔG,eàG"WÂ@Ó>¾¹ßÿÉTøû×­ù¸tüŒ6?Uåoò•3i7¸U9;"S`¡Œæn¨y”—JkóÏe‚Ì 3h¹Y ÍÀTý9%Êéó›Ð´¥Ì]mm’÷¯ E§Õí*jÄ'k›"áéÔËÁïmÊK? ‘k¼Õƒqc~gHMRzoŽ6R……¯É)‹ª-ºÐ类'+p?AÎ#xÆŠ[þÉ`צ£hì+n7¢FËžÂ䤨X£Mø&XlÈå2¨‰]1§Ä‡$Ë@¬„ã¡øJú„½œJCvÓw’Ë£§Ñ5ˆ±–f˜]ºÖˆ>ù²xTÈJxiºÂ!–æž‚«9šžC9Žß·¼JÏÔÊŸbvÛ³‹’]ˆ=ãj…ªÃõ@r…дh怤OzXïúÚ•*WXíÈ9iÅ7ü°„bÀ–qðjU‰‡®©™‡û¬fÖÓpNo‡÷(#Œ€·y“«T)ý=} HBÅ6j › ®ŸÙûÝþH'!è²ë^ÇÜ¥LñQ_%tæ—ÚUV­â7h‘¼_(R5}zË͇/¼>]~¾<­š=ˆŒŽzôÁØ´åtû@Ÿ=BraÍÁÙè£ä”5ý „¥éBoþa(˜+%Øvª_Ïà0ƒ”º©`FÌkVÝ+ûTüÌ%T”"šºžAäYÒsëe€ÖSÃx6ï ÷ÒÜGµÏ¶Åö`æa$ãÓQÈ$6“Wm~o<âJ<ÁŸñõ±9ýŸÆ=ä,ÈtOë­y&ˆ—R\?sþÓ½P*Fì IÏ| '6›ŒQÚÏq˜w9."´â@Ü9÷UÅ£q|ë¼½žFF™-¡¦ŠüÍü`Åv=–ŒNF¹qáb/Îvò\dÈÒªÁéS®oüÑ©«ˆœí¹:Q~`ÔµÎ×ÿ¦y¤ endstream endobj 90 0 obj << /Length1 1597 /Length2 9169 /Length3 0 /Length 10208 /Filter /FlateDecode >> stream xÚ¶PØ-Jp÷ Á îîîînéÆÝ!x‚w ÁÝÝÝ!wOxdfîÌÜûÕ{ÕUt¯-ëì½ÏÚ§ &WÕ`³€¼JCÀ.Ll̬ü %u6++3++;25µ&ÈÅø—™Zèä ‚€ùÿ á4sy±Iš¹¼Ä)AÀyW;€›Ÿ‡Ÿ•ÀÎÊÊ÷Ÿ@ˆ?@ÒÌ dPbÈCÀ@gdj ˆƒ§ÈÊÚåå˜ÿüКÓØøøxÿHˆÙ@æf`€’™‹5ÐþåDs3;€Ätñü/ ZAk~wwwf3{gfˆ“•0#Àäb P:Ü€€ß ”ÍìvÆŒL д9ÿi×€Xº¸›9/;9ìü’á ¶:^hÈ)T€à?ƒÿ `ü53Ûßteÿ&ÿH637‡Ø;˜=A`+€%ÈP‘Vdvñpa˜-~šÙ9C^òÍÜÌ@vfï^þ¨Ü -¦0{ið¯öœÍ@.ÎÌÎ »ß-²ü¦y™²ØBbo»8#ÿ®Oä4»'ËŸ7k †¸ƒ½ÿ– °…åï&,\X´À GW œä_!/&älV@+++èz˜[³ü¦×ôtþádûm~éÀ×Ûâ°|iè ²¾|!{;›¹.N®@_ï;þ!³±,@æ.€w@+ùö3ÐòOürùN €ë‹öج¿?ÿ2z‘—lçùOø÷Ë¢­(%-§ÊðgÇûÄÅ!o&;+€“ ÀÃÉðýoU3Ð_U°þ“*¶„øþ,öeJÿ)Øí¯û§ýk7èÿÍ¥ y-@ûÆ Y¹XÍ_þ°ý?+ý”ÿ?ÿfù¿iü ’vµ³ûÃMû‡ÿÿã6³Ùyþð¢YW—ý+A^¶ü¿¡:À?wV hrµÿ_¯œ‹Ùˈ­ìþ#ÈYä´P¹˜[ÿ)–?íZ¿—̪BœA¿_+ëÿø^6ËÜöååp~Qä.àËâü÷‘R`sˆÅï cçâ˜99™y"³¾‰‹ àÍö²Š@?4 `aC\^R/íù,!NÈ¿o”›À"õÛôâa°Èüx9,ÿ îýøx,fÿ ó¿Ñï>X,þ_Xÿ‚/´Vÿ‚œëA. è_ðåÛ Û 3ø_Àâð/øBåô/øR±Ë?ý%×ãø_4wurzyCþÐøËxÿƒÿx°€@ 9òâÄ\ Ħ:¤å®RŒÈiwLhšzW'…ŽÉ{Ñ©Õõ!‰îkFкÓXÒ`æÊ¶íµèÙOïÃoµaM jÍ>O&qê“»ÍÈ x}ã‡b5½$HÄLš¢{>?}´ma¾½j—§ÎqtåEWÍùsï‘ñ¨é-Y ÛUÛûÊ­€òT2ÅôA+Ú0°h†:÷]æ,¼  "=ö™ÆÌõÍ4vöø3™|²ïÑŽÏÞúìïg½VË4Ù;©õ H`®±G&ßz‹ï’ÇŸ÷..ŒÂldfÏû)Ÿit¼ ONk¼Ðím3¦Ð‰ yt³ùÖÚ:¼wà xæ%Ý"Q‹µ§ó^OÆ£S¨É^’8ˆÅl©Óîs7ëz,?Y”†z€6ÂÚ¶ö-òãk§d\dZ~mý¬’X_FW…‚ζ3«<©Þ§nÞ:q=,=ôƒuÕi‘$™¥¼L¸eÕTž6ŒÕôνdaÓ(Ä‹–fBìèöA‚wÑsÒšJ[ãÚŸ‹•d¡7)wæ'=õeZÍÏ£É5+u7“o}­lù2e±ñÐð⮽˲ˆy‡ß ß…ª¿?¾ÇýÔõv[göàš3pÿ†ÞcËzªe3¬ŽDÎý“ÚP¼`–$ïÜ™‡6þ¾[ZÿdÅO9Ræ§÷O‰Õp­j#%éîzƧõƒþ&¶èàsFÍšY²wýˆ¦kÌCš–ðDÜX´Ärê|P¢‚t%sOù¿Cˆ;4¢nj²­ÌÆ–ÔO(Ïìe2éü‰§7k0Þ”u™ˆA!àôz|•‘2KY]LÕž|OŠPuþ.coUõµ%£ïdÉCJ#&5ñªÃ7Ê*VÔò›2x=}ˬðQ¯+ƒREÝbÜ9F%·å[5£UÁ‚›Ýr·gõ´Uõè-Äy<ªÑ/ð"RÈë‹Y9Ìê¬ÝeœaÊÏÏ qÞ‘2·C‘÷Bn‹Lƒh|¸ØýOØ~¢Q昩F£FòoÖ †?¶Ö !q"çœ/¸ƒÎæIeÑŠ®ÓØñ”;ÃÌ®¥,,Oâ"óœ 2g%×q0Ç™¼=“Ôšp·í‰1ÈÜceÐ¥ü7Pù[÷3‘}Þðw¯¼¾–ö2‘sÏZ° }ÜÛð/¢LŽÑù*Ýj*W9~ÕKtÏ55æìN>ž(K€­Bϧ44E]•ë&Ž}]Ñ»)LgYô läk1!¾Tóô«œÍ‘8‡#k#íâJ,¦¢áûzç½ÿ—<ã‚WÍØÞ¼ÉfÔãe& •&‹bˆfpù’FÛÆzÂñ…mó>jÕø]äBLbúW]½¼NÉZ Ñ·²ø³ý[ƒFŽbM‰I°Ø TŸ$8ÒÏE}\dßý™"žp1µíÔÍÊâ±äp0T’‡ƒºe2ß7+#Özs‚Ž—ÿy°9©Ø½HGO³k­/x;àÄ…üÂgfÌz€žqò熮µ'W©¿9õg,ë´c¢5Fé°†ë•M×ðÆ¥6…n5µ$_šK]9­ÏP1~øÅhñsI_~öM5AšoVƉ”ÝÁ%+}³G:aa-ŽxµpL3ÑeKø[®ž!ýéeþà CŒ¤ï£‹å*IN¾vIÛ  Þª“pÍ-É–íúÄC`ïn(ºûvéóú‚u2X†%C5SKQj–Bd&†/W4gƒO“wlïàyæ»g˜r uÀüªS±L§«‚Ñš”°”âe®A“Óaõ^Ûê—™) z?ث׷-´Õ÷4/v€æ‰ÐH \Ö6–¶_‰Ê? ! |x¸ƒ.J³a¾9}Ü•,¤e-&XåÕ ˜ä0¿h~^å­®ÝE´¥èº³’žËi6ÇÅq÷jej|N2¤É§Û€Ò&€Roßâx̹֧ùá ûAm«÷ ôY@©&ÃùÝHjk'_Õ«FׄgM½'k¹ü Rû÷F«]‚¨œ¸Ø8å×%×1QB¿ò¿Ýd¹~ÓR‡\Θ!|_ˬоŸ}óÙ” ‡EØ«þÏbÖO›ïr„ðŒT ]È>çãävWóÒô{¨Ny>²Véö{j¡ÈË¥ø÷ ¬BRt%ôtªÉ‹ùVBvµôs«P—÷ýî-zñxñvj:3žô?t€t(vÐ#[º"ŒŸé¹¢ü£a+ÄOÂFÁúxÕ/µ)c*vÃßaHzVõÊT¹/v±R ¶,‹áˆ-@,ý'ªŸXŸ[0Kï¸Rr# •ÀȘK¡C–fsY„ IÔZZ$›5ß9*¨»×%iec¼kõ¨ßÅÐ}–HËnT: ÓUܦèþ’²š Ã" ¨GPrç2Ñ› r,Hl%»7‡à¯µ¿·yפ>Ù¥žé½´“ÏHs=ÜÆGïðvûº•Åž|÷”¯&÷í#à‰ªË¤€&ÕE9e€îl¦¯´Pþ4â+k± ™ú>¹RÎñ8?¹(tç3À $ß÷ÑIÓñÑ>~Ê]ŒÄô¨ I¢Nìu·%ù^ñúË:vbQX¢9lEy=ü ¢X­pÏl2²úë¼à4¿¾Ö˜P f¥Žª¦ëï|!Kèûppò²¸É¸“‚odT´8m,Ê[j,x%‰w U7A ¥[üɪõÉʹ<É·ÐìV¥%½åêÕ\UvŽŸÞ4‘õ\GŸ†ˆÌÎÌÏlB{C¦6I·~!ò[±{‹´ò~Âõ ÜÁD$«ÓÜM7€iÔÏ&´–Cö¹_°0|‡ŸdØè\Ë'õJX¼<óXC*Ø}=HhŽÊæyM넆ÕóWÀŽ$\w®ÝxÓ\#ÑZ¸WÑ‹¨™‡–J6˜Ñ\nu¢j …ã³^)gOÂKˆÔ}ÛPöC ¤•"‰ª³ìSŠÛÜ¿öiAáÑt²|§Sia¾]ôÜYt¼y„¦ÚÈœ84sûuUF"§Ï.?‘Gí£«’vØr„ê0)>&í|ÝÏ”\çòU–W¨[ÁjŠ—#pó’ßY"e†ªp+ñËиZˆÁpuÚJP¨ÉP™‡´€sm1Š:X¤C¹W—Œ”W³‘Šê,…EaÈ6qÌ«u§!s(Ýé1ë[¥ìÝ1ÆlŽ‹·ßú3ÎbZ×ÕA{„=jôï@0ŠXŒ˜õ_P1FmƒÅ”ºª{aŸÔl±Þ£úó)&>í‰}Ìn¾‘w»fµßåÞ(DèC•³ã |ñ/Ýúoš>¦÷_u ˜®ƒHÅ—ân §Û<‘Á¤š¤Å}ñë1TŽR¨}SðŒYtï̦i® ¢«yÛÀÃöQ¸QM ôƒÏ?¶(‘í×I¯W¬ãàÞ=¥¶Ûj2§ïxÉA=³}j66sòª/0EÿDú“;§”;Žx,qÚ³ÞgÒ•ØÇ@\#t«^÷Á¿%{³ú2ž-rX^ö®"xÚ7;Ü,#çüsOøØµ¬ ðJÆ <¬3§*·ªì¶žY`çâùJœŸ@ùUŒ¨­]2¸hÀKÁ7ü"wá’!Äãöë-¹ÉËÐ7k;&OÅ`§öBzhnö›]g½ H@ áþj¯ì˜¨a¼ÖFs:Öp†ì^É×}ëW„¹i~¯7¾¦^‚Fw=$MkÕÜ-‹>µJ—,7Þ—PÒÊ¥ñè:'%7}:§;Îo³|TaغE\bØDÔVƒù'€?²>OÛ/”×C›p„LGJ¤C÷Ü!ëÓ DŸl@ ÐÐãÎ÷ÈÚŒkè%Í¥­¾xȳ“#cèÒ¶åeâIkLìÌÐËì‡f¿1¨Oo¸3µß,v"2sHݹé/’B©U (ßÄ6åˆSéGÅúÀQ"+½ÃÑ;¹’&àe¾[~Ëf.J™ŽO¹"._uõ«okÑÿç|ÿœ /ø¡VÒ1qëþI)§dFíHþæXZ…±fútj·åÅpM꺨•†íD‘`•×n—(VRÍt31š•95ô$È#÷_¶í #\yA$]A=íA¶šN \q»˜}-KÙ#ûŒd¼ƒé3P„þ´Ã-g™ÎTÕ國WëlMü/´J¯#{öÁÍÃÇǾt­úþaÜÚâJt­ä†ïöF4ƒ¢)õ6<'ù th_HÜa½wêv”X ¼†½NÍ^r€EÔO')·ÅÝpÊZâ%ëóÜŒÍ;MLyÝú&¾ÔVù¿äNñðsÇ/ )ž¶ù–„KôAÇ~Y_ÉÕ^Ÿº8ò©6w¸ž£\˯zŽ|0¦M19y™u—L‹EFΠ1dÍæ‚yÕ^UðzªÂuŽ>œcP9ìÀ¡X7õ¹æ'Pž€n´fxÒâƒó0í”fÖÂŒec©¾Ùõ9JVn'¢ôeI àÓ7[¸¹Gó?HÜK’58(à'WÐ#jµš j•ÐÒÅ#*ǧ<ÐÖV¯¶RžÎª5мš7G±MùêÅ®ÈE‰J)™ÇBŽÍšò2ÌÉ‹^µÃæž±–ÌS'{ðÆáe¦:\>Å+Qÿ„ÑÇq$¸°OÔ©LÉ¥œ\ˆû¥ÿÞKW¬64{·Ï¨¾À×%ÜÒpqF‡9 xö®>Eý*¨nTdI.+zì,?Þ>*ÑsÓNÖËùyùW‚kî½ÔŒëµÜ$éÂÜÒk2…Ð_ȧ¡Çcñ¥(¡ÍxÃ!] .´ø+Å—å)¼‰Z=l¨ç´=vÏb-NÄU¯~ºc/ÿÿV&‘ÃV⽠ܳb K9}—¶~Þï©,“}{ -¹‰²ñÉ´J™l Š9æY¢#zåF?I8ÉXéj£G#K![ˆP¶tü¥pKyž¤K©GX'JÍÞ ³¥hZç28(O<šŽ=l£n:ClývpOIÚj$Im†¶W#½æ†Z嬣ÿ“óésd#x&Í|€9¾æîÜfú{tdSǺçæö£T+=ÞOY"éd\®3tæccÙ.×_Uimµ´äÇy(œ¼ð·Ø_æ{ñH’$¥a—ÇžéÖó¼*Y3U|=ö' KRa•-óD72‘hcZôišÃa®šö,zf¬LƒÐEïé2 ]_=M„íÝyÚúŸÞõ_¼ÍV(™9tÒ@æìù¨8Þx=°*d\¥Ê1êø5Pšhx)[Yèîޖħհ—Ì’ÿˆe½v!ňáºlrÎ;aDlI) ƒqŸP'qºƒ‚Jeñ†–(S òº+X&rÒDÚŠgǶ®!ÜQ¤ŠÐ¨ì ˆY q¬[ûFر‘¨„N§ôÄ~ [6ª»PŸ¸/ê1[ðÁ¼N¯vå»Å)øÁ™„`œ£ù&ûà`¾enD'ßwžIþ©×ÏçÕ.æ,ÂÑ!"û[K$Z’`´ÅÝEMbª¦'ÓúØÜÙÀEâÑöÌÈïÈx´ÈReñ5"ª»¥züÃ*O<Öð=Nv[ªÇr—f‘÷Œ.US>ÔÖŠÉ—œ‡HÏgHÄë¾’D^›ómôœÁ6«Ð>ëê–'X)+™I³SŠ ¶4"Z̤nÕ=qòEB|N“0 [µÝ×Û³õYHYCÙôw¹üEä¹RÊzt›¼¾w¾}¾)ByÆ}j®WÏåç¸nOïŽ =¾3’Í"MªÐò»Ïí‡G«1¬$-ÞÒœÌtéÿâÖI@¾ƒ4ç{Zî-™R‘ƃK/üM÷0›$ê#¢kÙæ[w¤s;Ã~3HK“/(9P̬C&D~ô ÙóYŒSî:íEŸÇFÉ¿Y¼Qj‹“s”)]É?нíÍ<—™ü PÃÞ–ÙÌÆÅ‰€-¹|4PëìËŸŒØsÇû›`Œ/êÇZÈü±oÒŸìjÚ‡ ý‚¢ö¬|Köõ …U¹YÕfœŠçE•CCÎ%MüL¿óÏ×?¨<³é³KßúÊ™‘DãÎF¯Jz³Á‚ #]ûªë¡·õ$‰¤†ØPçY,&|ù#ƒó7RÝEY—“9ŒÃpqóå÷yºáÂò ÚUÌóÍüpºƒWÝ9lÌç_§¶Ñ*-Fv†¬$gŸ, ï•ø^9 ·._ÛçªD†Ý;^ö·ß´ž}>„Žç«ÑZmE‘V/÷ëq&v¡ŠÞj;¡¹Îæl 媗²3I]Ÿ´±ÙqeünŒÍUx“¬ÄçØJ¶# FÔçÔä}Àäº]vÈ “8a!Ñ’]»›Õ€÷bNNNµqKª¤ñ[ì1šŽØÕ=n纑ð…E1Û+èyƱXÜ•HzÏeMŠø6P¥®t«-—1Ë–¡GNõ™Å aÄ ½ÆWg/WO•ã®"£5‡ ©ÖÍC%‡é2¡\ Ñzoa#œ:øfÅׂû>©Ö!&ˆ,pr®–zEÙ¶Cú^ùI,\\NÓ¬Ž,IÏßýÐ˞؈éó“¹Ðµ¶DX¿õ ×YqÕ ö/ÒhWRZ–+_î•qì¢Þœv0s&û²nÄ×Ü1ðÃ¥«°¢Âh (k¼…„Á?è:J~m¸]BÐHÙ ô\ ³µî®Z=¸¼â$!Qù¨(±<÷Á7d¾»Ôâ7µMúüͯ“Yüˆ™–Þ.×å¾ÇgÝ)År¢¹NÈŽYYÚ,]»D‹˜–i§ŒA´Y&îLU±pÛ5V{;S%Õ}^ð&e¨ÃõV¼Õ-Êu;”Fè®àFüE¬|K€‹RÕH‘äY¡JCU š×üÄ;{[òÛœÑãîAØ¡ïd4œ€Ô7ôr†‘I÷D„Œ¡]¡—“ ûÍX4VZ™lÀ×$kúå¿>¾^²±©}ÞÝF줅›Þe­(_S3¼G.o‘VVxRñÍ E»þöìÁT›Ù$/ó“L*UÅU°òyÞÁ¬¡b¬`!ýR’œ!|/gÆ]9܃oV8cá4÷êÕæ^Ö{Væ¥vƒòvW/„š“ÑgPU¿ ‘_-î)“½ÁêŸ/ÒZF7¶/¿¥WÃÕ“O ˆ.„£ŒYí"QŽÄKÒNHÚµZ7kÄ«9Ìl4•_ÍHoyÛuËÙÜ}L¤=Å °Ÿ^•+GT¢ ÙE'!Áº¸—2(Ñzö²öSëákžÇoâ4ÂÆ#ê¶…Æ]LLÉ&7_‰õaø†´ùqŠFa9õvœùà0?Q"„öZ24P*e”¿Ù΄~}…vjK¬0\ïãW¼¦T¥.†Rƒ±uÜ€àÚÍV9zöùki:ÌEÉ•4‘MYX?k>D 5üs¿g¢K wó2õ‰Œ4û½œ„þš3ÍÂ/Ñýjyw?0”Èt…¶, ðé<ÄòñÙƒ}-oï¡+u{6ýeÒYù¼l»Ht"BËe'²¬ M ÈS´˜§C©~º ^ùQ}õŸÔãÐÉãM/ŽöÌñ«=ëêX#À» h.£T娇¢Ö ¶Á†IЏJ0ÏP¼AHÿ>%88“c'tÎÂUV³_Œ6€P>¶ÍI]mã/½èî÷=É4j‹¢ݱùTÊØl†,tïU Z›îS`Õu(²_,–!ùVM‰ –™<8€Å@]å Þ(?ËÕ}×>WBúÙ*ÕªJ=#ØÅD¸ë¨ËcR³”øAƒ94R¨¾uêîõJó„•Brm´ûÝŸ±„èT= o†&”Bé`•€â§ PüùÎ+§‘7¯²t î»~x¢‘ÓèrÁ¢>ºÀÀÕ~Éù äÀŒÄ,OŸXÚ~þ±ëê@ȶ0ÉfâOs€uLÙHw¶Û{€äÄëŠ;”-ÈEÒ6·A¶ÃÓ h\¿úÄ õ)ò-pm Ù¶FÌ,ÿä^P“›Á¬×Kʾ͜£> stream xÚweTض&îîNáîîîîîîîîÜ îX˜œ=@.P‡+g7„ßGËÍ`û-úñX$ÿ >‹Ô?ˆ‡À"ý±Xdþ v‹ìÄ `Qüñ‚tê€Eãâ°hþA Z´þ Pí?ˆÀ¢óâ!³?TµùÊgnfaïî`æn󔔨ÜÍÌè´òø—˜ë?â¿ ûOPëÿ NP™ ÛÍñOÊßGÅbùäÕjéìà`æö/ Є€fù¹z‚ˆþ¨ ÐÁ8˜9þËT»Õ? daeëü—$±þdmýûýþ;-¨Ö?ms‚Ú³ñu±]ê,@2ÛAÐôþTÅ êËá7áþèA£øW‰ +†åO0P,'OGóß7ƒõ¿r€n;ç?U€B€^Å©A•»üQƒBº€ž%§ÿ:N¶ÿHÿûd@kÅâ:-ç?ÓçMÅÅÁóOÍ ¸z:{-Íþ•$ý× Ø@¥ÿqáú€^ÿž(ÓŸ¼ ;ŒÅÃÆ ø§ ÐJ²xx;ÿËÄJÏAÐ`½þACðþñ@Þ>ÿ‚ ð¾:¹úÝþŽý_ûnáé‰Ç_W3è2øü׃ ú-–-"ì>Dô<4‰z3íMr|æÖº{ó$åDHtßa†TƳ¯&ä,¾åÍ(T·n0€T‚zG(•ÈãmÏ'ÞË ‹‰!KpÊÜ"¨ÌôŽvú’õ3AJ^Öû# ßÙ ²Ú;=*a‰ (gì`âýƒCWB’ÚÒzx•ÃE:>œ_aç*²Ajü0ó_û$Yí¢³åûÛgiäõÛOï1ë{1L‡Ä‘¹‚ç£d<>ü4'Ô«æáï›ègÿeÓ« Úþ‰±<®ˆæàš±üëý²"dj¥NwÀs0½BRzñl‚ýã­\¢Š‘‹·ðÔ<}ÿ"R¶¼•wèI¹ìy’_!OõÉ×î9YÚ‹÷³ý¶³ßL)ö Þ+Ç âDËQFK,éÄMYÉFŠuuœâß½9¤ìIs§›´âÃë=/¤ñØDA Ñ”×®=@?2"B»AªHÌ™*˜”0LÓæŽ*l-bIIkðö°u™ù¤ïÐ,—.ð[ Ízéÿ¨Ûoðj™RšacH©Öõ;i &ñšâ0 «Çí¦JE3š^?ÀŸ/!ùu9'O¬ï'CAö=ŒiÛþ¬Évrv4<' Ø¥?öV#öÖ·J¸Ñ"«AdÿqÊò µÅ’–!åÚKìšnx¯éä«.aõ ëú]bβ·ëÆ 3NMÊÙðréFÈ‹â)œ:8d”6fæ/5# %v”"˜ü¬r(•¼|Ûâw5îãp´Q`ì;ÅH蔘QŒZÔõŒç¨í6|0î2Ÿæ•%î±½vz>‹ˆ»W…}ÿÜ@ß1ö„O)Y{c@ðÈÂÎÖ< Éàþf ðÊ8˜áöc _H‘­²lOŒÕÁëõú@Œ”09µPj×Þ—–çµÚ>DÊÖ~f6u~•¶Ò=Ã$ñ{n²ý¨€–™MhQûÒ—Îl›\‰˜£z±ßnwVYýv­ÜÛÕC”/ÒþZ3ÀW“àN‘í&ÄR nhÕëøÍ&ÅÍ`bÎrí»Ó3ê·Ìë-­š¬‰|Œôg‘¤„òªf.!BY+%pxîTºŒ0VGi!'wjW3wàÎaýÌ—ö[ê…°~Éì9ÇlAgâz7»âZ•ÕPÓYÈÐëž“®-åØP“¬½õ!M–UÅÔºŒÅr„µ9¬zr꿤Q¢˜T<_å°™A¹~è½^’(¯ãvÒ¤ô,ãWsट Âh C]ÛßѲaP™W¼L˜Hf6K{‰ªaÜæúŽšTÜ­fӌɑ±:›òïÃ^R·Áª£«ùJÔÉîygl³à×hY€õ Y¦hZ$X…%…D“¼÷c®-,‘•ƒ2žùÐgÒ]åÑFÀÙ,ÓËîNÚó¼®ø*ZÇ—v|ÂÉ|VY~hQ&6@É7ó^=Å+.eMªwÀnT#4¼ç}iGŠÍ· ñXÙ6«ë„I$~›ðã3ÄpŽ‹{¡SŽZ”4Íç;®nU l¼°÷$¿òc'ö±˜4ùóƒÕ/ëU^ÅàŒF’ ô_þ"ä ûrFÉJ¼ôÚð|¦,K;çX6÷ø l0·™Õï*ô¢lÆ13nfÀ@ܶùA³ŒùCg7?¶I¹Èa¢wÞ£lé‘”R>OBçu!Uëň¸Ã>sÖÀCgÔ5æÏ·^¯ìŸÚˆ~P˜?ë˜ý\´W‰éœ:ê@VüªŒh$•~\ö- ;Wê¹KSuܘ}‘>gúÔd­D¢Ç… »É¼lÊìo„’¦ÅËçEý‘¹‘ š×D ­c×I´™58fáÙÓI ‰,êêƒïŒË¦Ï€9S…¹ÑŠï€Ð}™‹ÑªyÒ’ä ºŸ’й¡#&'ŠiLsøª" «‡™D—Æü#ålcžMtnSä¹ëû$M=á©àáûcgŽH0ÿ\|Ì‹×-‚¢_[–·´gMC9p/4 %Óx øµb¯¬ÊC…5;#¯ ³ª‘µË)WcU®*ØÛà¬ÁÉÛÑ©â}C¥®Ç§êã>a·ÈW–Üò…ÖŲ–-¬´ ¹]ªíë¶ùÍøåƒ/©Lãe“ÓNôå$] “§oÈJ 5°÷šói1.I…’m}R©…Q¿4&â[=LÅìèY ­¾"sÿ(S`ÀºñÌÉå.Ô»|,µÕŽZŒ¦‹^2NR’fµÛ‘wD±T(’ ÃÇ1g\•X|¦4d ¯†ršŒLÄCa4ÂÓ Ç?L­A뇙fæh¥¸&\‡ÙB½ èº@7Ýh7%èžË±¼b1¸™ºÐŒ®@ |1L>}é}§‘þ¸õì†h*I®öV'肋Õë»4²óG¤%§n[`a•Å£«%¹iíÔ™éË!þ]# F˾¥w«^;ïòÈG½ä­­Çn6l6 uvä ˆË4¦8?·ÒÂv„X¦FÎÕŠïbGÌÿL>ðG3uâÝ¢²ô¹ e`„$‘9 Ûþˆ#»"ìS} …ø‰“¹-@Ÿ‹ÒÀÔ–ï…TÄqzÖ³@v¡?Cåñbœ.ñ4hš©àÁ1Ø1üãî1 Cª¬ çDm/ä—Œ6Kx„ã>Rf8oñ6Æ&†®4æµeý™]Òé7k„ïv¿Nq¾C—‡•!C^q«Þ­UÍ1¯Vg¿ 8)¨è,`€ç$-\.Ž[X3@g‹bÁ³»¯UuBe(Ýþ5»¤¦k¡ä˜U)’bMÈÎÃÁƒ Ã‘‘Íj½7vPyŠüpk9'$eR›#Λ>7ɪ? `s#Ô³ËXf¸VšÞ«.–A”lÇ×yp7ÿÎ̵.CÖ­7wÄM§Å´y?ÝÇ’Ù¡ß®L_ªr*ï ‰y+ýé3ƈš9Ôâë«ù]¥qW"ÒЇp³H…u†wü58Òǧ«D©à»|v¡¢ª ‚†ñæ¹tPÜmQ3éùÚ&…¾àn$ úhƒÀÛ7O9a˜ÎÉòN)Ëõ(0"z8 ÓÙ&£±¤‡o͈GBd«9Y%ó²_$»keI¢ÓNâ±2v#ª=¾°l¬ú¡Ÿ'ºËz‘Ã+"¹Óºèys…[,û›­Óï[öð\nr´0ÀáuÞØ*Ñv%£ƒÀ)|°J·" ¦ÃÌ«àFפrî]‰bøÃi"3Wi%éý›Ž0c^TóƒË`]ÖÝhTÎ_qÔH{͈_•§òŸŽý7çú?>fÃÎÒa”ª™K1Ê!A1Gq¸ä3rîˆhÖýŠjÿÊyòFø5a ÒM‹ø¶ÁMa 5jSœäó’6q†~!œf€òÀW:ÝY='4?ošÊ/,Ì;‰§M5£+‡0_ñ£ßl+Òÿ«GÊg“œŸ^¹=ÄtÞ´ÑŠD Üëpï(žÏÝæc‘±ÈÐ"j¹Õ]¹"ÿSª9†?Ž yS_¥¥=¸cS^¾ºCÄ!:çCŠÛNÔ°ùÓJU =°ms±z•ȦuG„ýD>6MFÇ•Û>’X܈ à?5–-½÷_¥)Ú<èêv@úùî>”VÖk@å}›œ8Kж~»†ÿ؈l%¤?҃艆xË1Z­S¨µpªûä£yBQ¨DhPAÔyé²>=ô fƒ«\êH«ˆ(&üÚj ´kÖë¬F?Âñ™ºd€E*{³'€‰ ænYYJ“›ú>t°ªñ•r.ƒœjŸ4Sõ2½Ž0{âEÿ <|IÔ¯ÔŲ¯Ëj¼$벚}T»w3ð\Åw)Qƒ?ØmÏ¢z³RDöí+š sŠ0& œã ƒßn'ËìJÏ.ål¯´ nJR¤í*½dµØÉ‹f9<Ö¼Åx7`ÅÎ!Ê1"1ü©/{1Tû‡ìBSä}ûÚ. æ„ Ñ¾Ûícbíº£4õšºÃùョíÊÔacGÞFoíwœÞy;ø^*z¨7Ф6•hÓÆ |þ3;÷Zçzú¤ââ%„žÅcóM-“!»åÖåÜv¥wö&'ŒgÊJ8Ó3¾ºÉk;¶Ïbáõ‡ƒ)×O…Û@¶…ÅÕ¯xrÁ>sL©ÊIÌ:'&!¥=?ÓE”§¯1ÉÂÈd(^³c‚š¯E¸ó­¯“Õ‡‘ŸXéû^õãg'¹OÚCåBK´É3k-ê:¦N:{ø+ž/¨qž·`ä';¤+Ë‚´›5RUVHß7m62ô€GåI_=7÷‚Ô“2;EÁ»ÔN/Ïœy¾;^÷ü€H\twÆ¥MÝè‡ ]¥ö+ýN¶¶SäoH¯{Éçz­Ê0Œí}Lá*öØ0ÉwÛ±ñ~‘ܨød@›EšøQ˜ËÌ^A²…—RŸ ¬ßí­¥¥ØÊuAå[ê!´/· –{_êéæò˜¿¡ëÏùÉT7 &ýf¯BÞC”Ë4B¥;/…ÄG‘k1ÏœšÔZ’æ¶D7WZ%µ>°Ñ#À®P!?Ô¶Çìwøhz&¹$e½*„Ô{¨ºS¨=Š5“«/Ÿ»Þéñˆ¾‡g3I.ÍlÌ©È|ÊÑ¢€Zš„Š9ðäëlIül*ê¡¿Uˆ×ѯ—p„ÿaÿ•'ó±l4¯ƒ£÷,r†…T<.ªCuwÀC $búsª‹;Wá4ñg ªøÇ±ˆá6õÊæÈ¸’åÓ#ë€&ÃÌßÅJ¯†µ-:XÍè lÛ• Ƈh ¨~2¾å%8h˜º‚#ao ìŽeü‹\èªCC× KÏßÛ Ò²–C±‰Û~ñŽ_³\| ù!®÷öôÞƒû+Ñ\õçIÃÂ\¶ Ý_ã@9a¶!ÆŸ;?ç•E^FÙžsµèÅ>ËS*+W†ôÞ ¼¨¯º|_i…1«iYp¼åa%PÆ'‡€AØ.ï1“RpÌ•Éí“ÒLøD=áF,zñž4ûØ£åø'¥nÚLÓ5—}‡`j2¥¯Á×o­8àîÈŸŠŸDä]e®Úæ| zåÍ^˜#dX—ïhsŽ^ä3*°_f²TÆyÏÔ;éo#&'Ô8^" $û“Ê€IØáRžØkN¶í}S¹ˆØ >Ø>”êVØ€B3Œ—ö&^vOHš¸ËŽr¾‚¨â e=5Kea®¶Üu¾7óXÄe;¸ tâHVâÅõøÐ÷îÔoN¸ÏÛŒ ]}\ígÊ]ÅòP³Kd5'iÇNM3³?¥öÀ±>ˆõžJS%“/;3ÓÖWÝSáVáeÍz¯”õæ"¶€Ž(_Z9Š¥#£ž Iq®ßš ·n=§êߟ8ÉB6øj!èêrëVýb$M;ö`®äÓNþ"KÕø àH)`c‹ŒqμPP"ïH³É™¤ÒìÄÉäî¸j¾‰~"9š,·òo‰ßã22 yó}Ì"ì4DÕ:¯{ÈÉáŽI³§}ÙÕ[Ž?.t¾¢ûgZ{óÔæ ùíMÉ8Ë…J7OÓO¥2#r.#,Žj¯ïÇ¢j9hfHyÏ';ãàÉ~Øk:ð[æ-dˌ̈́È"‰V¬ý eH–ÌãæiVeªûrç‘4ãÎë,{¶:ŸÅ:qÌ ?ùsß7U±pìL‘$hÈ„vž2Årvi´uÝèLËRì$JÞ=‡õg‹¸Yªž´°±:¾Â„€¸“SdÙËsã¹n)ŠSÐq¿©l}13@Š´òµ þ'ìæ‘HÝÔD³³N‘7„ëHö®t|I©'‡ßàë}þV®.„÷ø;2Äú 4r€Ý>V¥æÈ±@ ¤¶7bmR# ‡îgÃT]–о،ý•úh>^é¢À_ëÉk¥àâF‰ÆµÄ!é"7©%&÷ÆÞc„ì5m”k¾YÑÞ%b%±Ÿ$†•¶Îz‰TSGtî{±Ú¡†¯Èxx”P4’ ®gS5"ýuµø ÙΑêʾJ³Ìhi¦H„ÕˆN¤”~øq¹¾YŠ¡»±wy¡2Æ}˜“¦x@ÅÍN•©‹«ß=ÁÁ•Éñ#)m&;ú¦Ï·ÉÀEÜãP¥=Éýpƒ•KÉ~§ï`Ñ%F<²·÷vñuÏaA½ÎøÍÀ‚õ¬ÚIMþeiTŸÆpÁw‚ nk›6AhÖ†›†*@í_o÷[yÓËØ;tv(À—Bõ·0œž˜ú²x×2¡ðI–ˆÈ»o2³›q’~1}â<}¤EHÒbõõ0%ãž7÷åd{+NÞ›º¬/kÞÒŠ´L–jwìŒÉó;%–¬üxö’¢P5{ø{HÇš©7áÂ:„íYvãè~V«~S/ÏiÛ¯¿˜p¬(’Ü™l…¯‚UƒÞÙ1Ÿ–"k ˆ$\FçJÓ íõ|™£=õz¯ È—Úwü¡(K„ÏÖ”¿ãßä fÔ#ƒfrÅļÅ?QBö‚{eW†ÅÅðEÌïkù'øgTá…5äk]ÞÔXˆ ޵TÎ |kófˆäZÅKF1÷‘é_ÚðHOÕ÷u+WÓÊ?$÷ùGÍ´¾ÜK¯)¯4<»;r7¤çMhýº0:ílìIÈ{Çy⛾Âï8-@™ä Þ³ŽTæ<ýaò¤ G J]Ô¶G†E˳™ûÔz0bZGN-JÖöÕ´†ÚÏ3°¾Ûð5\nØÄW!Üñ1$gêÈÒn{{#tÛ‡2£Aßrçû5 G7´€bÐêJ–å­Ó@ZØU§Ý¢ÚøØœtÒšm =¹,ö˜‚Ø»°åUmÞ…qI0¬käJAäi-ú Ó-ZVë›äu&Š:¹§9y› |qÕs¤a×j¾`±m,¤rBð'¹›é³ãˆ.?g4 \Γ•SQóî*nÒA·|®Æ!µyf›€ÃZÜB|À–™e&ß.Öz¤,@òOÒµ\Ú.B=ЮÌå5ç‘z^øêͱ1“R¾%U^2$UÑGEÐ.Ðx)~70>æËS&¬ñ4èö¶çA @¯uéɶ"eî!(ž5²SûY¬ ëþFgZý®|ÈûzƒÜyçþm¥}‹×l(P‘ZMcê‰Ðï|;ðl~rŸéäÛ¡”ˆô%—ýäËÙš6Çx·‘ "ÙÛÉq†^ÑÄÐEìàûb™ Âj4ƒŒ¹KÄkÌ¥òÐ̧¦>Þ_#Ånr`ß“®7Œ® )73á‚„ß}ݼh¯áN'aN;zž=Eº»LH}¸Áõ‹ü¸r 5{¿“掋CcGlþE+Ƽ^0?¤ˆâ¡ˆ^Ã%7´´2ÑF‰¶ÂµÛyÇ‚›*n®`GPÞp ÷©óyÔžÛWËõèƒb#þãÕq¨›eR/ÿû£õ¸ú˜ýL©Kú ŠR7sAöËU›ˆ6æ7ÃFŽ·‚ášopéD:Bô¨©/º\AšŸ•ÑŸ:øåÍIì“ò:²v§R÷ÁÉ–"t¾>ÑŒÕm§Ž)bÅ–­Æ‘–Ú¢v†ï0]xejÅbÍç%®9¬ÿŠz‘”(cOŽòȆ¨«Þ? §ã' Ûå’T^ °Q Azn˜U7¡el§ÚnØIe%èÆàzòAVVW|§O§¦ü+]Ze»¥l`•˜i³T–Ç z+ν^ò*qj¼sÃ[ÝŽ5ü]Ù¯é¤>ú]÷KeUž'“ó>^î›óéP„IPÂfQyÛmàÙØ÷^“÷±Í([AÁ»•ϧý˯d£®œYT?0:vamâxý×}Ðúy^%ÂÐ㮂9°o¨Í¸üF*æø–¿…%«³HúûáÓøCOW d¡ž–ë¬XRÕ¯5 Ô½l==?,|¤#WN²UU¨ ¤ß2¢ƒgg0›bÌÑSpV¥û„ <3U1R×¼|~ÓÕWo&vÏ·µ¦“q ÷““ÔZ¬¹Å„/½÷æüÄ´BKžñÜ]j.±¦8çgTÈ _š„àa -‚úGYÛsó}íÛÝPóƒÆµWöØ‘·hgN°Œ<ê` ¬­Á_"ÐY0šë1,ºjJ·y$òZQÚÄä=aóyh¢S¥i·)sœ¼‹Îˆ±¸„~†„ÕËæF y=k‹qþŒ{úÉÜ@Þ^%1…Ç:Ú‹ùM¹MAÚ“€a€êé%Ó,¢ãÖ͘ô æ@¼ ¼’(ÇX||`ù2›:U†,Iýçï¾9¾ÒÙ…%ÐEJˆ\Â1G(ñC‘¦!ˆã(-w–„•Ió5B‚Sú¬DYê›æÇŒ£Ù˜y_¿>éø‚%á2eáÍÆ?ÁPel eÀ ËeÜmPò±Ü`¨¢qÌil@u<øøëY!XÌÅ\Ô"Ç•ì IR‡ržŠ¦9ÁóM.l®×‹‘»ìÛv¡ÀðƒsÏÙWw±œ'I·1ê;¸ËÛÓÒ{$WŸOè4®Ýâ ‚²z²‚‹$´²µÓ£=-ìºþ˜(q[$ÓÉN”À~¿„E–u&ÛpQ?o?X¾ÛiJGÇßlá…nÿ|™µ%ÒuŒ[-P%¶'Œ£»ÍlÙHE ØÁÀ§ˆwšÂn%¸Àƒ4GÐñý™J°×Öò ±¤ž6–±œ`>OÈqÅýf; ¾Ø·ùc}õÖKÍã•úãg\¨âŽHFXë'4„…~VïCóàˆN3•IŠ‚›!ÄÚ"Kˆ™é`4#‚ùÅ(R‰¾xü혴AÉŒž®«tʾgaTì2¡a‰bÙ1Y“ì¨ Ï ¡Î/ñyš¹!'YUï™eâ³~$ÕÜ€9+–´16­5–xùq¾dº¾~´ËòþæÚÂËÊÁ@Hœm#z¬ Z‚ å² F˜='ÂÖÒÍðóÎG<4bj¡¥z¿‡’=Ê«¸zΜÁžÁƒ­Áª^AjæÙUgEÍÂW±æƒJ^|éƒAï\§Œ}Ec*Yƒì|Œ?GÌÓöZx–#Mësƒ‘‡c6ö£=oE˜$'ÞJÕ®a:Ã0Ì€®¯[w‰[i°.i~²b&fIÃÈA™éšD;×_RQ£¡L„&zÁr=±ïwv,ÅzˆrÎÐÕ,Mwösr:³¥)M#9ËÚä\J”îaÁ9jŸyè¢cX¾!³–ò稈U ¨ª¾ö¬ç•MÕ > Þ꣮çh'¾:õ.>\",3±0g1dÇäÜá©kp= ÑøZÓË_›› Ù¶è¿2M j¯ÇeºOø½{VQ à^‘Áì­U)ʉz6²ê}Á/­ÇÐí4Íüúbñ]S,åPi’{‰øó*Ž© Òæh]ùˆŠýÝÚaÁòæ¥CLÎ¥€{Z¡•ìšÎu8àtŸÊõ îÀÂö§Æc; ø„ÂÉÜsçó´ëÊeâHM•}«±«>áqkÕ*2íˆÚÛ.Íܾ$'0™çë>Æ`v;)ôæzxÇŽŸºÓ¬* bÝl¸¿Žêa,mõ7áÐÇA<87íÝú%¥V\Sô¦bÏ£Ì|¾ê—Ù8á­ß}fÁÔ©]ˇ¯âлùÈšŽ©[ .qÝî‚ÖÍÆFaIàJåµßãz…!ÍLשáhï"fŽ•…ð?“™-‡É¬;--“²óP>¨Hv'…!¬`Ëž¢¤ ~GÌTÅ6Eò7†kÿh3Þ§>‹í´8{§TLÂÜ(Âëô Ë„`,U"Ä…yñRAÆ¿nÿŒ+¡‡•iÓ|ð8ín﹨<ÒñJyÄw“êó‚ŒD©­€“´ÊسlÛ ÔC£Ñ“†s½šZDP(÷B^÷…(>5ÕäÀNÀ¯pšÓ¬`õJ¥:æy[Ê×ûögÃk†M4m(ãË©:¦–s^œµÅ­&¢â-šçÒ'jƒ¬Ÿq£#R—pÅ%÷ðg²’Áv~ÿê6Äok|ME…Єãþ&å*Æ—8‡£ùoe/ÔñâÅDÄvL߸¤n…Ÿg˜1V¨Áðö}t?ù(¸æR¿ÀØ£È'J¬/©'Š“qD™DbËÞ÷ÇÌP/9ˆß4Ñè°ÎI1(iëëkv¸5ß>íJDìoƒge¥ü„9²‰ÑÂŒ²Ñ^ž„¶Ús.i ~­Ê…Yj¹a}|g8±Á̼‹½vŸ—1——öƒü‡Ç†$0Ø'²Ò4 åÿtõGú$)Ð>a…@˜£œÖÛ4—å}û<ÅC%k2’Yz­¾º9ÌÀ…uß0Óå"ÇüsIÞzçÓ¨1WÛù¯ƒ¿ÀÈÙîoOä˜ó<¥‘ôƒV–LöÌ—ýUƒÃrdæOPaö²B!¥:Ì\×ÎULuù ä™¾Z#€ÍÃKÞ¦ÙÐbY½³· Ý í[Héb¼ô›¨ lœ[ƒĚâ;UA\;@a û‹9êCÕ'mׄHÌ­òEº®±WÖxyïžÀ(-·ƒ¢îúxãæ--ÑxÈ£T~™³kTJ!šD‘‚-»È稆&¡±vñ͘­ÑçpêC†ŠœœãC­LŒ+]äÚrL‘j͵'m§PfÖ!%.]TIàH¢©÷¯-PQö¼¡_Ä2gúáXZ{ì«$º È¡[ä«ÓÐõ¢~ùά¹/×å mœWŠ4ˆ€¯7<{÷œ”ÚéÖ¶>mþ;õ (4ÃJäf>½¹¨¨ì:ÇE³ÂÅü¼âÑ’jG|t3®Ö¯Œv±U}M?†ÁŽú¹ýcFÏ/ó)ø®™V8‡“æ”\ôŒ\ˆWðs(4{‘6r‡’å8M°@ï“%n\Q¥¨Šù¥Žõ‹»u±q÷¤T¶}+6ŽöFê ŽaH¶xˈ¨Ñoì›Uf½u¬ƒÇÔ¡Dw5ÔuY;Y”&†ßQ4—°oW+Ç_5L¨Æ>;ûZðôˆMg‘éŽÚ‹%@Z=[8ödƒ11¼IÝùöfe åWëâ€KM”³ÃÏ Ë„¹X‚ï~HdË®;aJª¬ígÝ—Âw‹˜6—avä*vx‰A Ѩ¨ñfV?£RAHù—v˲ò¾j‘$Òà&.ÐeWŸ3ï>ÄUõa~¾¾;þÔ='×h¹\4zÑ1$ éù~ùÔ›p†´ˆ/lÙº‡‘?!8ló]9:+æ" ‡Žý¦‹_jèêÍnC¢Þ2b›ÇÕ ò–šÁÖ]% uñŠôÀTŸ¨s—q»Zè/[ÏFÔUËÞyédð†%Ì[®”èá@¢Í üþ½qqµiˆT «ÅÊÓœí@Rh=™v汄G®J|­6Úænéc0AS±âe™çfˆz\{ù»Ø¨*?OL–7%“úÔ;>§ð øo¦¦¥<&ÑÊŽ…Ø4=о,s£BwÖõÁ}°®øÐ»ÚøuNXdW‹è'²S÷²P•ˆÈǤµÃ•–ø.Rú­Žš'õ½P¯>²èÒ¤z›*ñ¥n¶Ê‡ˆâ¨ï½;ÃÄ”²¾ÅójÊÛ˜QÛuV·žCv}/çóC¸ú«»­Cí÷|k¡ðYÝ ^_ã9Ó™NnIn°œ†Ä€ â„Fœ}¶4Ô3Z|³¥±è×r§Äð…"¥œcrÁâLBpOV¶#Þ"D ÕiÙD%WZûØÁ^Þ€‚©ƒ¾Ä†7 ½1›ëý¼¿jã÷³­ëŠ÷upLø=ïÆ®Â_jÇ­ 7ܯØ<Ÿe®ø 5¥™SÀrC½hCN©gwhÛn}…‡sá¶ÜÆÙñTÎå-Ç=<–e·ÇÏk^8Ú™lh£§¤zŸæÃú‡‡+‰Uþ¢6ý ©è¶èdžïèÄ‘êlŽG<È }ÚO§ñÚæm¹æe*i–èE:ktS:}£¶×;Øeï‚k'F†ÄBïëƒüœË¯Q~=úh=›ön¼á™ô`¼ÇÄ,z7ö7±á‘眱oÌzꆋ+‡®.Qb¢¥4üo¶Œå@'ž"f…È×±\ù‰L6"Á8ØéÞ®Ï7õÚæ±ÖMÕªØÐ#Ú‰ê¸ç &"݇&á–l˜Ú{»®9wL>M=XXϼsûù¼úÉGZ™{öC®Sªk³ZVâ £¥É…F»ôEdac÷ô¹Æ‡Ù˜WkטÐU©„«ÕŸmt‹» 0úZøäŠLœp›ó¸º„¯i!ûª–§».BÙúÍ3ÔlÅ °5œðûÍÃñ5Q\“X§J¼Ôa¢™ëPFøƒXQ¼iò§_PÙêù: ’ÝZÈU'F`Î/÷à]ïa-‚²Q"èæ3¥PÀiS/oâû .œYËà_Ðy\×1S™V¬œ[BtŽÎÈhÙŸ#Î=òv¿gÞ‘ÝÈAŒŠô?Åg~å+—〒a4Ç‚ÛÛï,ôÇ|* AÌþÞœpk|¶Ž…÷²‘åKê­z,˜â³¾#ZÛK­¹aÌ@ažžl/ßCBÈ^Ï>ïv6S®zcª õ7«`Ñ/(”bï,ý*8Ô×Húòµ¯»ýÏ«à£Î}p^ù¨úŽúq”o)piü(r©>êt±¡šŽUR¡ø~‘Ü1;5§Zý¢Å®ºû.”Ýiìd‚“$ýö°é9W}€<ªõ¬AH¾œOœt9BQZm–X´7:\ÜÍ<Ë£oê#ZJvõ?ר9û°¹€˜7H”¿V‹}¦ÌÁæ= •Öƒ—Ôº¯á”y3Y³}kÕ†Ÿ]T'ÁY¨ï¨%D">ðš~I­1N“<&­Ô¥âU°³ù‘i_ÿv7ùsûXz×Ýܾ›Kƒ°šê"â|§…“²K@•›V^é¨Ýcý6ÓÔ€-÷ ƒ!¿™¯Óý>äU]mõÄB[p“r´&î³…ƒî‘¦ñ[Å›25yÑñ;ñ:n†Ñæ•–±èüL™+Íš7§f´lcLj( €kd™v³|-üÁÔLíÝ ì’c‚\67ªü‡¸Þ†*0¹ ÷j¶;”30ÐÓeßxí‘F|¦·{-ÎH?»æ¶Äx‚A¼ç˜Ç :–A{iU4.eꢻòp!” ²«g'sEÔ9NÇᬜó?¥ÂÈ+±˜Ikìo,( Z$,~¯ ùKÊ ¡—Q‡Ö‘}J(TNêk´MãXJ ðmô˜ VBâò É·Â1±¡h Á-Fv7‚ ÌVû¬æ _G»¢ü´;†xl"×yH•»Ì¥1AW2ÆÈ¡Jˆch§EŒŒ•q4”£ÈO8›ÌW¿³›“Ì%”Ê4IFQ˜{ýƒŸ:Twºà2PKñuįי®][{¨TÉÖÉ~/Ó×§ÌÌâ ¡úÜãGóû³Z|¾W­bj$[~†ˆšœJè´Rß:EY&?äg:o2so¬Mн³ÓUê lÚ/h—ÁÝ £G5`X^î61ïÖ p³a÷)¦'Fù×%e÷èK<â4•ój®\,I¼8^öÎ$<9‰†A1(à©ì=ðÙðú\ƇR4UÎÆ§×©Sæã TºÄlPK[ž êE)ÌpŠŒRÅ7©Ã'ÙÙTµ@‘jÔnˆ'¸úºd» öVÀÚy¥ÔÛ#h-LÛjÀêÍ|ôFwF£æ#u£6[mxõ9ÂþÒ¥‡¡Šw‰EÐ7?Sä×úAY]ºxϺ(¾0ĶÿI2E23< /îDzÐ …šš «²de ŒbÝï¾·C®.·SNýJ?Þ=S¾"p-$ÀÌßyT-c¥xp9c± *û`|Vâ_/hÖmq”ÖN½u¾H_‹lüFçºôןٽ“Wkä‘gÛKºŽÔÇOOÍÝòÙ»Y „tÌoW$ö9ôò¡HšŸ•O©OOÿà’;Aø‚‹š×9WHá &|HsáZ?’í 1ž‘ÿ}û«xÒ«]Œád­§üî÷µ,ÕÅP‹\ ý&VB¢É9”œùÏVêÕEo¥c¹Ÿ@lÊa7c)û ÛªÞ‚yEzb—ê/JEO¯œqÕ^g#ŸcKOvÆŒ#¤qÄ<ÄØí±µpgnݮܤ!îì0ÒDÁÛõæï«ù ÌËàNhLEÈ7Ö=¼VùšEùbM¤6`4ªšö±Š‡Ä—W)˜ù/ýʈ˰D»Å5]Ñy»\G+¶CrdŒÀ½£Ž>†[ˆr»ï£Ý¿yÓ!ŽÆ•G¯âñVšn¼ërQÒ$a´‰ÖÔ„xVj7÷ëmµÇk9¼%$.³8Üý¸àüâÁÁõ!ÿKšVi,‡Õ1 VÙ¾Àˆn…*ŸU°éáS̵ £Ýö•á 4¡zWEïõk)Ø·GQ’É%,ötEq©‰qm”_$7=sauJ”?½Þ­ì*–Q¡öMn„ŒÄEG7EL*‚Å$M€¨r&昈óøt¶-/?X÷“ÅÁ¿’N¯Â×Xm½»lÂéð‘æQEŒóMÄ•òñ53‹ûP‡ß$xŠQ=¸W×ìÖ~¢„¾-4nVÿÝ7ÈÈpU¶€y·ºÏ7 ì/CAZÊäJÛÌ”"Æ’ýçáûS×hêo?Õb[ ¶§ø´$«ç$"GÂ’%`–d ¬ðOÏ+uûÀøæé..ç‚Ï•s™¿4̾Á(Y­›]ŸRgK ×v¡»çv–ñ9iÄðcÉ„Á÷õ˜Y¦<Ǜ»Õ&Ç$ÝëAäWf’žÑVƒø¥iê´¨uZÒ(3¬ÀûãbÀ%ÆÔ§#ÁzëiW¢Vt_Êä¥ÕV"$ÕÓ" •×c$XBÿÀ\:ªs£š¤K¬­›/Ì<œv]®t½µuHI`vM»©ô%½R²~Nâ— K-ê,J,ÚFiR\°^Õ4=ÜöÔÖÆô|Ð÷jå":D¤Áyáò6¨ÛèÖEåÎq´z@ßo¹û¸’B(]°3¸8’É$-zA€qŸ÷ñžû˜ò|tûÁÒ„™4:wôÀ•£”[j¡ð˳›Ø,*Ú½8¬ŽAê§L–€…t£h·Prò׾˱&GX¢"z)¯ *zQê¤øeQ=#½00´Ê~¶¨PõÔû k±„“þ{¢…@&fršðÄ.0)&?zÌá½pæ9sñ€¾ž¸ µ}hªä¦B´qÁÃw°¾déÅŽôËq̽ ‰¿!Ô‰·¦1û8†T¿„Ö0Hkìí¹AG3'Ó*y,¾pýªxV endstream endobj 94 0 obj << /Length1 1561 /Length2 7711 /Length3 0 /Length 8730 /Filter /FlateDecode >> stream xÚ·TTï.ŒtIwRš¡$¥»{€†˜!†.éFéTJAZ¤‘î/úëÿ÷­uïšµfγ{ï÷Ùï:à­Ç-k·(Áan>8 ¯¡§Ç@ ˆ›…EŠpü%Çf1„xxBá0ñYÈ{@Àˆ;™qg¨‡ª^.ŸÀ',Î'"ü Ø_†pq@ì µ4xU8 â‰Í"wóó€:8"îòüõ°Ù²|bb"\¿ÝYWˆÔ 4ÀGˆë]F[°  ·…B~ÿ Á&éˆ@¸‰óòúøøð€]=yàÒì\€áèBôëó÷“ÅÃìà0¿Ì1¯¦–’þ#EÎ?[þ[)'÷¸…ùn~! &&ˆ‰Aÿ £ †þYÆ¿\U`öp@ìjïÆôWÅÞR€íÏý`þK~G\ÀöÏÍAB Û»/¾ÿg¶ÿvùÿ#ù¯(ÿWžÿoEJ^..¿õlüô`W¨‹ßŸwÄõBÜ-ün`ÿkjùcs5 vP/×ÿÕª ÀwË spù{PO%¨/ÄNаuüƒ/È ~mš ц{BÝ-7ô?º»õ²u¾»?<ïHù[¹Ûžÿ¦T„ÙÂí~­¿0öðûaƒî¸Ä/$ðÝí£Ä÷7^qçܵØÃ=°©Àûè—è7xõþA¯áßHLàÿƒÄ^ۿѯÊyíþïâ8ü ¼ÐÁ»¸Nÿ@>~€×í_Pàõø¼óõü¼óEü Š¼Þ¿á¦bëåáqw9üfîÝÈþ¿o"Äb‹=7 ·•ˆpª‹h»ª•¥öáÞA_^mM6é‹B°Î8ªcd=úè.gmWE1”¡=[51HÍqp5êkÞ•º”®œ@Rì[“;â.üvÚ塳ƒS9Œ‰dÄ®¦èÐâ[›¡š=H5š¾‰éøZ½Yü£Ýó«©Ø.à ”^0¤S#eóÚw‘ãM˜WLÌ ’ˆ<Ìž{髌ý@އ&]ʵ%P~ó[3KÊüðùó@N_†ÀI‘ZOpU1%‰¿*CÞÐÓ÷”¤)9ªMžH¬rBò©‡Ÿz †> Üà ²Ñé9ÓÉÍðF‰EÁxkkŒBµkؘv@¯Þœ€I%*Wb÷‘²á¹Åuµ¢–÷ϵ$Õ¥KöÌÒ=h×+.·! ŒKøtÙÏ¿„¦dŠü‚d¿ø5% •cCˆ±ì;~À$:ΠâUÊJáRFàê0«?A€ˆñzG㇯˜TèòÅéò#®/è˜K#Â2ΫÃçÞÈÛ}Õ`Ý3z¯./l7&gߺѹç‰Ó(‹ :5Ú3NÀ‚—ö4ýQ¥ÂÏiëžáÒ+ÐluˆìTúŠ} Q,Nàµñ%«mÜ}ñÐjíás,‡H²¥°9‹¥S4+î„ͽÅ6ÝêEÆ,`å¸-¤ïòÚŒ‘³£“}»¼¶Žåb`m%ÄŠ^Ôz0òâeÞìsªÏH Ñ5 ìÔ·bÌ_²×v c›B‹ gù0gï§Çº¶ÜmNØÕE˾]‚¶DÛ†?Å ¹Ȧ±³Xs†@$ø|ð1›¿ºìÚ§½kµ]TgSß×ÂC] ·¢.Ǵ݇´»9fњ˫¿pÒšûÙ˾9âè‡áÆ™Ûæ^ø™û­"o³Vòí댡íi§1¥HÙçœß܆ g9뻬ßéEJ*Øî™íìzßAŽ[ãæl÷ù27¿åUOÚggÆ´ªÓ8þ–šº—ì%Ö&TÚ€Ôþ²)ÆIµüÍ–óþKŽ»PqA=g—ÏyA!‚X¥×XÔ°°ÓÄŸaÔÞ”X· MDi2ñûý}dÎÛ^쀂»CÏXä鋨ú©¡·,Ynü:²Fjî"Â$oœòí)çer08j…ýŸtCÏ\³"¤1%R«£žoP«;©ì^XØWuY[–§‹ë”}¢ÎdÝ'>ÓÔ‹ N"GŽ«ÿhž÷ÈÄð9×Ù‹Qp83ícÐ"¶úèéÄ(9%Ñ¢Æf)ê Ú‡žƒÞ4uæ`dÜ‹#ªgëmù6 ”Fy†zËÇÞ§0ËkŠG<ƒ#ù=IîØ¥Ê}e-™®êöR„.º›Âíüûœ¥¤›ÛŽ¢=_ÆÊNÏC”ot§ö7»jBê]{®Zóî_K¶CÄ]«(£Ó1›_-€ÖÌ¿w=5ÒYýlg&tÈF‚d×ÔÆK çãÓ ÒŽ­QZ§ä$A‰ÍñŸo5¬úóÏñý…£Œ•zf‡­ZT‹C‚ºÄ·+‰¢MHЖo>­ü¬Œ²¿<çÒ+Oai@ií¼8{7¥ìú¬¦×”ZÛàVŠKÎ{!*ª¥õL\¦´c×Ü /Ó°)4ž×;zÈ”¬µèÐߒ攎-™jWúTl«ßCG±œ dòå>C™ôü¶¬¢îÍ«u|´÷n4‘K¯–‘œUwlÉ >>Ó#]+zF6:Jö²^6ͪŒ$›‡Á=í¥³8¿ö V§CÉÐu;õlkHKÍÇ<Ÿ}çR÷'y™'– ›PªÞ8cÙ4´Ïžyì”ζb4)eó¡iùjît©ÏÏÄ~ UcJËôN¦‡",Î_‹ðûfzÜ—YƒñK ±5m[½À²ðáQm,8óÄJHé|ðm‘ªq jÿ.UÒJdt* Í¡§Øµ$Z¨žYÒ£³Xè“ÖŽ¤xžg×Qó‘òÕ¹!U笮ÅÁfL«È²$W+°ýk’«óÜ'€¹cÂ+?zt“{z?/wÄy™ÀŸŽcv7§EœJ¾Û¦5+9¨Åž× «’ò“E» ï„¡íÝ@¤é ¾à‰[g‡~ v£[ª—>#)uïè‘÷»‡æòF$kÈÚ?¯¾O“ølîâ0Øâì[HÔÈ)yKñýÚÎZ†•Có$Å‹]wìõð÷Ô  E9väT¹Èåj¸/Cwx¿û2I'š4EÐq^˜³óãÛ™ÑvoujÝYÅÉíéåRØGSe õËBd*Ó aöBZâ^ÒO ñ’U<óß¶ˆ¼nt Â5¿â„—ÜDje¤júÕ|8̦02#Æ€V¡îí<ñ|tIü3-òiJ ©Ç`’œá$ÎÕÚCºä\”ÚPoøñ©h€Í«Ñ Ã=îá,ËË+ïÐB1Úä½BfѤ 3¿d!O=퇆»ý!E*f®º+[á™Ëvæt÷¾ìwË'¢~MŒIö¤6U0yyÿͤlíös_݇âƒÙøéûKM¢€GÏÚwÔ+öT+Í­÷+Zœ“;ìñ5svÐ3KÍ‹¾¤ W— |*ëÑïJ©ö Ÿ³¶[<§ôª @ªô¨1ʘ´äã”å`'àe_1ÂõOØÌªKŸnèøõ|㬱P5U,ï3l‡›ìGQõ$ñ!¡;wWãì_?¯O­>ó÷­?8%ró›Púlw+’™è0è8äͺ8¹©þêäEÓ1á÷Þ{\Âj}nÉ2“šÃâI¹DMr%¥IlV¿Ô /ãd¡VmÛ¤Û%ø°ØÑ¥Ö€*K— ‡&Q«ÈW™ä*œ–fÛ³¹ä'€Ü›ùƪòkÐ>Uƒ„ˆªv‘DÄù¥§Ð| ùEow[ÑÙ º\Må¤-NJж§õaçðÈl®íÊ)K~=¿IHÏ`oz×vÙ NïqÎÀ§MÝ‘a…bAø…øôÛ5c¼—¤!oí£M¶ÝF«‚$°­kúäDHáKøÔ¯X§q Lh"RÞj‘ÖViŽ¥ 9;…ߢ¶Zh]¡ð2XÂHª#.h¥8o¸Ú†ÈŸë<+R™ÏµÎqj$'+Öί÷'<­ù\‹LÒ\,¿uõøfë@º|A¿À¼˜/©Ç™¾Ùq5è‹Cžƒ1^hð>¨­4ÿÖ5~ßþ¶cÙ ñx«ñF\”[’|ìÙ”=¡HpØÝZa õ2ûò›Š!”ñÊ1K|:÷c—%§ˆæâó* n|è·0†OR“3 ÜþŠ‘@Õr¼†˜&Gùw÷HôÏp ¹áú2?æ¬%-[–Ñ;70Pßèfáû}Ú¿á‹v>Ä”ÔöÞ>oßd%ü¡Uþ#«yÏ%ó²ƒQfµU.Òº{ Ä˜áþ|6Å§Ú á–Ÿ™ujHoû%Þ ‘Gã1d`;eŠ­q¿Ú8C©Jç?¹œðÐ!|9}¿âª47IáXï¨þ>ÕpY~O–ƒ-Eq¯ÚÇ΂1%N u…àÈ÷9Ä×?‚¡ë %s½^¿äf`š“ž9 ÌŽ=U¬iqÊP[ù³_‡¢CÖ4Ô±­XŽŽJY¬Õœ~°›Ê Pa‰Þ¶–‹F6 Ý æˆŠí¶ó%,}›|{?~ƒLÌûë§ío‡ÌÚC¾7Ì}QÚ­ÏÌÐ3JTäv\[’\ò)wVågª[™¿¢áM_Mð~ɳ¶d$Æ5¥6g Uºe^åí%Ê¡JÊ‚gt×›‹ä ï™ëÚGýpõuf]åv] ÓO)¾ê`þÄ»×ðÕ°Eº"£=eF( í 0ÐÍL#²±µjtßPšî23¥3~j<üVsu5ñ¸Ñq¡.9ýÍÝí(°ôc= ÝËúw‰èfãâ²2*]p‹4ÕïÓ4lž"¾jh3þhfŸíξ%£DŒ_ ¹Ö_ô,êä Ÿ½OPÜLÀ 0„Ú£AT!è÷¥ðéãoÒ…èùÂPárT¬$ì[$z¨»£(|õäŒÞý¨²(x‹IÈÊt¬ ˆe€Ÿ Ët–à 0ÜÓý¼½“L™žR`véØkAaUu.+Ug¶àA%o< ýÈøh8a6$Ö oއA:åDÞ%W-]μMH‚YdÎtöÔdT_€g*YDb¹@€IpÿÆq¿Ð™7‰D ¡¼ª*ÌR¨¤'KÞ¸i·/ÝJ‡>Qªç¦ÚG ¥ Ôšµ^YfZ1ã´°AŸÚ—î<ÜŒJT¶©Ü¥‡6æ¨d}Ì*ÝúE,Ág–Rí© nQÊz+°ÞÑý…váhÂL¤WʪÌ>ú‘kß/*_­zâR=I„8š{¬K oˆËð”*íÓ}žÆk°çŸoоB2 ég ŒºàJI|>¾Q±7 1ûlÎGóà>t˜WÀSwŠȤÏ6mcþáô§lÝÞÃÔpD0öÃòo{|†Gï^,L¨Ìr¥‚J‡m¯xlJ¯óü÷}܈ÂZÑÀ;ßwp–Nä=Ž$Ó-RÄ6q´ƒ¶°Õ£ P¬·‚y}ŸòÓŽÝ8ð\û‚}y‰{ .-4F¿çúèÈr¬cªÚìG·`°§¥ëà†åä,]e´Š}”I}A‰ß #‚Ã"H}͸öº„P§lýQë+ñ§4$Øìm[ª|g¥úlH”:ôyý›xîó²¥\‰¾J7†×üY)‡g1Ò¤SRœW ¶A-ÿqä~„IÕLªò*EýjqsJ«WºZèk‰%Óé’t»H«Á¬~‹ó³™†°°R’3S«6 £Úãph¡Ñ0®Ìj3©ÉÆóAEi9…) ™Á]±ì0þ%u‡ú «$"âû«.Qlƒ¢”†‰ûÒôñê…‰®2&€ÒóW:7?¤S¢rÂö4i¥z` ò„ ¦´Ùa#é7ɲÕe¼-ÉV~¶W1zi”ᜟ9:ü¤ÐnÞ•gBu²(úX†/8Äñ»G•B¿ƒ ͹è²òó ºbï“çÔà²sÝÛìÞ|ŸðLk\¢¦„´›]I²Y§¹}‹˜ íÓ¹ËÞ{lì”j»›™nLÝ$§ž°ØcW"n7ä7žBý’Te©L ŽÑtV¨ kÔ(Ï´5¶¤t„èCí0¹k&|¼;¾É¬Gâ Q­9HvÄ|çZ0[âéžj•ÞͨÌqÈUáz– ÔÄËaÊ?¹¥—p2EZžÚ_gñ•¼PŸ%ñ¾ÅÔHOkH:ûœ«vë^Ù?†äªziµÛÝß3éÝ=Fýrâè|âR©ˆÌQÍõú狳îLTN<–”Xp~{õ9Ïqáí£®´­¼¡ Ad:*8Ç¢rӇΪµ…R;Ëtó'ŽŸA‚ªcpʼ=}4< “¶À_ upÐÜŒ~kÊ›ÂÊ'Íf1¦wªKˆÃ1fgÓí&†‡;+m©á†õ-}zíÃWXèKƒy¡t.vœüM³¨*ùèîwñ>Ô߸Ÿ7Kírøœ'†í<²ó‹^;ªýD’·cýí)rdz¾Tδ×Tö"Áº¬–>QËó±Ëó­‘¡äÑŠŸ«ø…I¼Ï^JëN¤^ NUÀãl‰®¾Fø\o+{à¨æF‡¡^÷®j͈ó¯å™åx „|t´FÖ?iCEý€DÞISÑ}ˆØQ¬W‘#«‘Ýõ [ì¥'CÃS¼…šùJ%l¥ƒ´ü­Ë›ÍÍÙïœ÷í-«ÂÝkèyw³yhš…ŸPÃ…¯‘ŽP·ýÍ|>î´!YdP2&½Uéü¨P™ê·ÁV sz卑|’Ì̘3ž_“eùy¶U¯ÉR^ÔÊØP%ïÁ)Ö&·ûÔ÷…•åÙ >pù³ir¾”M"WÕh ¦S$Ðë°¶ë …>î-¾qrPÝÞn½ÞÅ×)Œ’ŸtSÊÔU%Ô°MȲøsg„ §jÀv£rCxæëãë°«*tÑù~ÊM1Mk õ¸oL {Ì$˜år\<¨U¹Í‘ÉP«Ê”…(uÝ«¨¢Ë!Ko”ˆr±e yc³Âvj°w¯ð‹‰Ìû7"š“Áq ›„¨Gg¹Ú(În;›Ê~ÒË ÔzR ã+"_f÷<¹@ôj†Œ©¨,%•λQ7ä:ök9ŸÑ`¶BûáÍq,»Ø}zø²†)‰|æ½ÓgÓ` KU6í“gÄ^£¡,M¬Ç˜¶CÆjß“¦é¼6§0{GKEԾ<Š{•¢i9°Rd¡Ìü¢8j$p^•¬oÒ*i6¨|Â]þnÆ('çª"yÖ|dŠºÚõæz¤¾Û@)xöüu’¼³ý“âV\h\ yåE˜v>&²›ÈºÂgôz|Û:Ørð…ìÖ>Hê-wû`\dÙ²˜W|YÏaS:îÆuCÍ8ã§rçÓÆMF§öóq­­x׉t•ej 55˜~‚z®ñ¾ÚóýHÁç\9þ¨7³½ ïnw¡ìLK‚e¦·ÃÑQ‰Ì­“Öš¿]ÿ°WèÅŠœ<[û½t)è³¼0 ÈÉí$“½P‹‰•îЛý‰¯äœ¾“'üóšKÔë}ìX©öŽ·QQ®ž~Æ ¼æÝÛâœÎjKØåÌÒt™ð<¡0䨷 m‡¨Á9ê÷Lù-³0QŽ5­}Î~+^6*á…†B”¬(f›QW-oþ{ƒ^¿$ÃQk…—”Æ{è Å×^ÈD†§éð¨ç:‹š´µÅ“±WV öçn³œ¤¸¸KÙËæÅÅ‹õf0ÛìUëZE¾Õ•mÖÉeÒGfßý“ºÃ[0‡{ë6ȆãE¼ðàò@Q¾ýYË~6Ö0ùãžÿ“ïů#ú}/GÖB(ñÆÄÀ3áK‘©×O- ,}–Z_íóò ½yJ\rqε"J’{oÞçE—˜ò ¶oÓ‡J ˜,‰¡¥ãç$à¶ »JÔ¶%1ví²ë3Cû³ #" mVýæÄn4¡(‹¤KófA2jõ9QSSÉ"š=JŽ5ò8EÊ/woØÙ+\„2ôOË+§R½ãç¯ièžñBôa«ãvNŸ'\8»©_û <3IϸèäÝzuĨ.˜¶«n)Lht€(üíÜû¬cË6«ˆçØbŽå)6uð’"%ƒqŽÚöºŽE!Jn¹@@ím%Òîfy²SR©^÷‹å"…ãôåÄÅØñˆUQÁ¶Áþý÷e[º ©ÖXŠˆîaÕÃÛ›€L$i!˜?žä°,û'º<²<ƒÚy©ËI™ŠÜz¤™þS 62ÌÝG¼šq^þ±hä3ªÄ§.ÙIj‚“š¦½sŸóµÎïÝæSȬõ ¡N¢™«ÙÈd= ä¯õž+fWé\hÙÃ)+9r±ƒºd ÷7z0«ú«äã[ã¹z¤(Ž,¿¤fÆ3Ëàä¼ ŽÜt: Rr*æ´RS[)'0¡Ö~'ˆKá7Ø3€N!LƱ?»mªU‡0'‹A<"½èR6ï WÆv-,‘¡³0?‘5W9Q]jš±ÚÎ{èž"ÛBY]»=Ë;¢‚ÑêFfs¢ Uï¼y;pp~Jט3.­2†´N.“²Bv¿á™/Üôñ×þ8ûúO0ñÓÄnòð~ŠÏÎSé60ò|tðî$G_Z á§Î¢›p <ÿp»f¼eë‡-¸þ†WŠ@ñ þÕOš ÃÎ2¾±zW;üÁ´ù•}Í/aâíYÅ•Üë¾8×YïâÂJù/>þ É,Ûw³NŽ wû©ä¸pODRŒøÉ!a A‚ûÁÔxÒxϪªÂÑhºì"$ƒ—¤5_Q˜¼nÇ.I¿ý5¬F¿V@Jv¯ Šx»ÃXÔÕñÓÇ´tñ‘éÓÊ…¹ÜðÇ0«rlájl-|‹{ð>Ù ,ÝŠ˜ìòçž ­_$¬Õ9袜Ëö•Nj3÷8 Q˜Â`¢“ÔŠl5t™êÈG«®$ɶvAóŠOÇè·X«HÙðj9]Zö 1ÆfZ!JuàÁo¾Ÿs*°³ò²]õ ÍJeu]X“ñ——•—<ã0p®GÖlkÅ‘¬¿zbU;Iz:#è¡Hgs;—E¼Âã‘Nœy8Ôí(…¤{/ÑòHèUS~Ï;ÊwêÒRàŒêuÉhdzW(Ó>V”9®Ï¢ÈŒÚóbkñ%œ©2}¯±BS†8,T’pÞº3«÷™å:\ŸÎˆ9@ŒøCÂ!=î—…T¡vöƒ*7ÍúÉÞˆ«u)ùIÕ3s°ÞËh®°‹ª¨ †‘û’›žòø­6â<‰$ÆèT}¼Ð$„j"ºã¥•fxk…~tg*ÆŒïgeZî ”g4 f13°ßr6% |4àî80'.º(UeƒS¾ô—Êå4|Ú㞀öèG6å×lx»"£SX¾ÇÇ×’($•%'J!4ãï¤ö&CtÊBG–§\#ˆ ×üBdêÔr8§—»ŽÙg8K»:CqnE—ïÅr±¥ˆÎzöf†1¥?´¹0¨n“Ÿ_NøEZÇÐù §œN ht.‹Æ_SoµŠŸ2ՓƧíyª#x¬nZXÍ"ϻʥD‹½†ÔñT§Gf@Á… fËZêN&ÆÇ¾Í¦Ž3ÎöûãqøMK¥zj´y Ù¸‡Þ3lx/óî•Bºq§VöùáÁUiY‘ñ2)û¹> stream xÚwTÓýû6H(¡¤JÊè†Ò ÝŒIa,`ÄÛh‘IIi”.¥»¤KZ@:$á?}|~Ïÿù½ï9ï{vζû¾¯»>ŸëúÕÀXP ⇩£XA!  @dl," Å„€@QRNNÖö·Ÿ”Ó †Æ PH™ÿ…PAÃÀXœOŒÅA($@Ûà "‘‘”¢@ ôß@Z  öD@ !€6 Ãrª Ü|ÐG,®Ïß_<^€ˆ´´¤Àït€’+ €€‘ësÅu„€]Æ(†õùW 9G,ÖMFXØËËKìŠB¡îñ ¼XG€ C{ €_+ôÀ®°?« ‘rL˜¿Æ(8Ö Œ†p†ÄàR ¥€w0wÌâ(ü«‰ìwPä—·ƒ¿ŸÊ Ç­óGÀa¸R? ØÀ¢=`þ~ÿ;ðo‹TDE@°{˜IúOuœÿËÆÝ?á °âè'þzýç› ŽaPÒÅçøï+VÖ¹2Uãÿ³ò‚ÊÊ(o€Ÿ „(@PT\ -)—øÿ»Œñg à?©ZH8 ý×´¸cú{bÏ?àù£^À¿ké¡pÄ…xþá¹5PÁ½‰ü³ýwÊÿ俪ü?yþß©{¸¸üŽóüø?â`W„‹ÏޏXœ@(œÿ ½ûK¹ ááúßQ-,'%¤ƒËQGxà,Äñ/¾üå7ý¥4f€Â ~=[‚"@àÅpò‚8ãž)‡`8õü»¥‚‚þ’™¨¸ŒFƒ}H8.‰Š‹üDpz„¼Ó ,„Daq)Üzþ8 MúëN%E¿\¿-)1€°ñ?–@Øì·õ¯–4§¼ß´ÀÍó·ý[æ0˜7 B:9†‚Ȇ:U…ÖŸT(1z ®ôÏ-4FÄY´…‹c¹Æ³üu¯¦i|vW¶ƒ–Òõ<7˜( {ÈÈ·}ÒïmÝ”ô%Y3‹§Ö¶¤¼+˜ÝuzÐä»E18 H>X¢Ú‰7d¦°³"´âN¼?vþX²YlµìkÞÏF̪¥ôÀðꈒ5™£”Ѹq%Ê‚•cÛmaMù”m•âa¢e:ðóJâé±r}4ý©Ï’ÕÓÔîÙÙÎôö¶çbû9:-å¥a4ô´¾Ú¬= ô7ãÓµk0x\ÊâG*…qáEŸÆ£KÆÑ6F–|fÛå­F6¸=¯’oô()˜_ºÉîßa´¼QY– ±°Ïý$+ñâkÐÄœ°7uucN)uVu ÉÇŠŸRÐzwÏØ¢•dx*ÅýBÞƒ “íioÒ(¦ô&¼PiÇHÌ,(3§L0¡Ck…>ñôÎô~ýÃEñïJ\ÛáŒÑ ?—mÈK‡Gr_q¬RÉ×ç¼÷C~˺˜íILs¹Ý1zœ$¯Š†œÔÍm5' ú10EHŠ^½ßæ±tûú…šÞt|èwÖ¶*}yæRãÈÖ¢t6y.$æ]’(ú–üêè{¬ v‰‚Ù=£¼lúûYëu"õ£4øUÁH-žÏ½Bžµ•;Cñóõ”ÍžŒ“Bç?K¸Ä”³hRò]é¨,X¾÷iOT™¥¾ŽxdW—D Q»v3óy³:ˆ€åYd®I ùó6rs2äÎàEp›¿âóêOæ21Õcm&›§ï¼R·tØâ2¿yoN·NdsLÕ¦&(…á£gu ™X|TÙ|Ζx0÷²^!@Žu˜Ìé„çä{ÑW?íÇ\\Óëü´É1rÔ{-Ÿù"çÞ:àP'ßöÒ|Ý®£qÅðüóhhuéDÜ.ÓܸyŸ’ü§¦nˆwƒ^BÕíÃ!*˜²I/o/ž9ö“õÛ‚ñìŽßøSZ-·&"¯s$Ý8p$élߨ÷6;‚!c¤£zx§JFŽG€¤dø·˜v émÌgϺϙ Kw¹#ÂS¸öÉziƒ=`ûyÖùþ½àwBbHrK‹Jµ5þàûÌ{ÈVŠOk½\mFÎûwèJ„Ž.³uH7æ·r“„¯”%ûÒ’[n\òIÌ„9àõ¸.^v ÓU-[8 ¥ê†a…‹©__Mû˜¼Ð-7÷ÒØ•}ÍR9ÊÁe¹Ù°fETûÂ(ï0=𯋑¯p­{ƒœŒ‰Ó¸b·¥BJú*­Ó26$øÁ+­…*h•½qŽ6ó$¢{AâŒÐÕ]žX¥Þ ÔÍc{ÕNêøD…žæCÚ=7:Õ‘f¾<õ¥nVß—?= RRÝ\/xKµk&á–£¡í ãG«{¦coɘ¶¤â<ñÕ£>Œá«e9é_Ãg@Æc<}Õú÷³)«ii3·½eØ Ïx¥ åòˆŸ–—´åÎ Ác»Ã¨WèU§¹é/ÌÒ_êrþÒi‚ååõo,¢ÁZ¥¡e¡ €¯òjøV ‡Ï¸ˆïeºV¯ IøXXÔ‰“Ùüm)òó5uX®Gi‹C á²Ëš“Ó‡Ã«ÇÆ:fxÔ øäuñÎ×ÿüÎûÞîs§Ð{I\L—¦G˜TÙàû3?Õî,í5q”¹ÇOw‚ç²i,-”q ¶á@E¾ƒ @û±þωæ5µõ—í$‰,xRw7;¯µMÚ_%sQ=Åý¤w‡0RÀ\›í±3H/¸ò#Í 6@uçRÝý·J%<«d jlƒû‡Þï3³¹o)ƒ©ß°Ï}±¼Ó5Ó»òÁ抌eçjÞË¢ù ‘¼¼)Èof…²ÙgÓ_o\3ʉv<ÂÞJw…¡<è|¯Yq‡s8ô‚*b4·RÚÛ Ïè¥~¼¦ ä÷xR«KëµþaæhžÿÃ…ÌäÄCQ¦Ézò>‰ÚÖz»;ΣFßÞ/t)ö˰40É%¦¿Ý{¸îßÍR¿ò9‡¨¿ï0/½|LLÐÜmအÈ6,,ÀL>²Œ©ýL–u="lœöé-‚0›d¶0£Š—Ôómç³WäyG‹™J~$TŸÓž‡®Û*zƒGù·ÅðË¥3Ç·ç¾À}rÕr‚Wϯûæœñ¶¬žjz{e !S71Ç£¦â…¤}Ó·}•`eÝFH`q™¬?Pµ`¿HíÄTS;‚1“"Ö.²Ý)fûp̬gñÖ×ɱº˜AGÍkb l¡êilÌ™¹Ýv¤¦Øwlp­ÂÖè±Tåó8Êç"A:† Mß„Bçý­=»ƒZ…¹C_΂²¶Ò0¾¯’`FÅaG>rCë†ó±=ß|Ÿ\ëg—<ò3»Á˜gvÅ‘ùˆ`‘ÛŒáŒë9 "ö4J\¬F’RŸY‹ˆ–˜¶1“#˜Vƒê2;n£-îö ß-TˆSÙsâ^u9á+–¬}A­vAá!Åø.·b{‡8-áÏý›š(¹˜=•é_ª»Ö’Ô@臲)µboU\Ϻ‡è»U­³©Â bCŸû¢Ð{YIqq¤q:ý.²ÌY¡Aã¨û³R–á,%icÐé]^…ñGlæØqç<Ÿìm)Ýl™‰ëˆÆIƒh{læóÝxî“ëåÛœ~É#‘ ©¥§·;w¹××=–³bÎèÃW)u?4u˜}ó2(r§l¤rÚ«Cjx.‹Ã0oBÑÙ¼·›*7Á 7ˆž½!äȦÁzסRI;ZŠAÕÍlÕ·0m¬#Ègz)÷Ë-†¾¶@©«U0rߺ"vn<¸žo#3$ô|B.b‹Î’+g›/Y**oIг¬×jž}À¥³ºÁ•R~`ñnVÀxš‰e ñNÄóÙÏÞýU/;m‡¦£Bº+7$ÛDÖ?„·œ£ì8cäÄ͸úòdDC@/ϨVÎ])¼ Ü©äß3ÜŠã$E…òMÝÄèVÏ=tê› «×cHÚQD%™H“… |@ÒXîvx•HðyDˤP¹0í‹?Î̯Þ© OSé…E–¥Ú«9Z=—O§SS’2 ,k~¾:Uqx&ݘ2ÜÿȾïR§eEeUyb,F-VyÍÈM¸ÙõåHW\“ÜòàÌ7ö1¾`'ý!;7[ ©Où¤b˜\…îWP-òA³+ûC}»áÉ»ŽËpŸÞ±gÖ?KŠ ¹>v/¥°8Ñ…­JBí“òÔú<-bS帹¡^«3C¡óªtX£XeW®¨±,ãMýÒ¦=Óõ²¡<Ì4=ã霣Øà×c[ŠÁ¸¹ùç:%I~Å ŒLîI³e¹~äž“ÄÎç9äb€¡$ÊþÌ=O—Ï%:VúãtŒÈ¾V GI õ>©ñðG7štk”ù/<Ö94&z[®ÈtвŒÌÏš‘–Ûóªôq}å!S@°Ê1„fžeì!§î¿f±€þœëÖ‚@‡\Ï ‰ü™µïHt¢ÑbŽŠ¸cÒáûŽáañ±s¥ñM¹€ –åÄs‡{`"µ§sžþ§úšþµÒ9X2eåÛìú×@_B„µb#rîÂäîSÚx—cã¬]2?[7dc–Åî /Lû¼(â6‰œy,sióÒyRª'wäž:9C¤ÍååVnÓÖƒ$¤-0.)íJ˜ƒF1Çò/Ÿáïx5îmÏ2kŽŒLÖŽ4a\*©ÆÎ±Í^é¤S*ìœ$ßbÈ+½Øå<µÀ”†7š› ׆ªÆ·Ô£Ž«Ã”Ò­oÈ[u…PÌÉjìõÖˆ£Ž¾³òeÂkshý†ˆÞkîšÍ˜hGu1qfõèä¤ïn€úÒ9ŒöYÑå²¼ë¨'v‡©+d'W$ýv;™ÃõïøLÃ×hõ)]rú”rµ'¶UÇÊ´:ïŽñPŠŽŒÔm°©Üd¨,!›âë›YÇí¿³9ùîß–8ó)èÌ,A‘géCk˜•ÖPőƒ5ø¤¯ûm&’Š4ÕŠ%a-PÆ+¹ˆï«èFÎW¦T ©ë©u„·’¶-ó>ÌáM¹wÈÄ=Îy’ëÄB‘¶_™dÏB¼Ð·OæáÒöóOÁDŠÕ″]Ì £?LË^ç5¸3¨*Åp6è¦'¿nÃþúÏz‘¸eZ$g{‡Ž¦f4í—.O$• ¶SÜsKÜövÉÚði»µÞ=ÚM}uó¹wÏóÔ™U×ÍU¥™¨=Æxø%ãCù }Õð<4¸äÝè-{ñ#%åµ¢ÂÛ²xêá[ɹ*Û« ðö›I ~'“ô°ÔÃ7†&Y‹[laô3´=EîTu^­ yš—Î ¯ƒ6ÁT@¹$¢Ä5øavdÌ©>ÇÀŸI6cU$äí¾÷LUÊ„lrUß°Òš˜2µà{ý£çߦ6ó…$äãå3ÎoLFZ²ËO‰lsï¦Ó.wðF:³ÇûR%wìt+¯y]eöÑt´'×è#˜<ú:ðüÊÇ¥.Ñþƒþ«gû?i _­Ž´µ«‘ÇVI¼ñ^Ð0Ü^Ñ굺°AA,‚-¦gŽ«†óFÜ›¹§I%ÙݳgÖ˜—£êDì´#j½ †ü9"Çi$9»“ôž•vï»êˆlòŠš€×µ¨7᯾P7âooÕ˰ÅO±p{Z8±;{,d¶í9M1Lˆw_«î#¨õÓÍþØ3ˉ÷d/»Bå©¶G¢ÛN.Ý®}]¦¼8'ºŸ]U7[d ô¿Þ&J°¢i]ñ™l+ÓŠïRòŠÑ—º®iÎ~¡Ö¤µí<Ûv;9J½ ª'[#™òXàf¼g¶³~ÛœãLÃ\\ƒ±äâò»;%Á)+[m aâʕό ¹iØ]ûyðÂŽä©Ë™«ï’E¿OåÂnäÕàÈVpí’!Cªb¦§é@…ôEÙTD_ÉFÃDoþBSË#ñ¬;DQEÅΫÔ*´SôÉü¥5z«ò±• GåÕ—§>\Ý„VöµQE2çÞ\f,^ÄG?Þy ¸ \ZùwtHƒ¼6z€QáþªÒwÄÊýD)Ûw£ ÉÊêþªóÝ–2CO¹ºh–8Ð0²¡-ŠˆåÐÐU¿Dfïÿ„~y {à}ZuF›Öî'{Çtÿ:I@S9ve)ÍÞ.ñ±›•™3Àö`¿än¿R“uªDOCŽMœ×š¨eÎHÒñXg©ëÞ3ÿØGæ´mÐÚħv56ÿÕÁÑìJv° î—K`€«t™Ü̵^ξ†YýË“l'èÃ’Q“ÅUí“àéÑ®…k…·Ûú¨ÍœŽ;9v¾µ!QDµ˜×Žm[·ÅëëÚSFI8Éëî³ ßÑ©r½7¤X÷¶ Òv[µN¸;²*1èøR¼¶mfp #1ŠÏmž„ÿÙ¡ª¼F L³Àã‡Ïµù$=¸©…^‹›µëQ¿—Qøêøšÿ¡Ñ3õ£k>bŠ(lòTbw%̸õdo=f¾¶îù3Ç÷аwg OÕ26ßd·[OoZŒhìßI#g6™’ÑÇì"…ø³< yíigóü?PSÏSᕼ;²&‡YÞ½Ò 4?Ù¼ÐüaW;Öš ¥¥ÁO‚{nHª)²¯OnÛq¤}D¯ºö‹°ÏrE5hqP7ÂÆ[Vò—CZ‚èøbéßï–»ö™óG<dN¾Âȶ>79ˆnðQ#òújþV¬@?ÁƒŸ‹ô‡Pk6öáÇ%§šqW›I'ª´ì†ÁŸ=-åS+—h÷{o,²\_Xÿ¨ŸªXlñŒ¸äj‘‘…wñMlò-™b©€«]?X2âk›Ïúº6ݸÇÝnyI—ì5MsòŒm'¹(ϲÙODË„¤×=wSßÝ‘”¹ ×n¡~C¯Ì$›Ëw';K«µ°¤<|I䦓ÁFóp?@G°°ÿh"ÙÖ‡QµûNú=AÌ¡¢ë"9Íëú!wB\©£EÅ×û½@¥Ž„è2ñÚáWAû¹‚Š'[åTÜ«&Ü0³®ÔÁ†:Èêe…ÃÝ—<7—Ò$UoV °Ø>™'+î ò¡ÌE§µØõ/TuNc$¤»[ysÑÛQÃÚõoÁJÔW5ä_Æ­‚%ŠÜèðÑ_Ë‘;ÎR•qÎq:ë F†;Ä^R¡äž+½»Á‚îØ}[Ò¾¡¼ÐH^$¼Ð -Rý¾‘§ä@žõêæ¶S_ë²öä0¢ãnІú+–)&ŠÓ“PPCj÷:äž[ K¶$MÑ“=Ö¯E(ÉáØ}ÙØÍUb“•ÇŒ,%ñ ]ŽO¨÷ß…„-&+N3O ðæ ¶L•Iz¦øÀùPféÉhk•‘ûfšƒÎïù]@Ú»*›àʇ€èµ·‡2~=æ‘ò4Ù!ãiŠÊìy{³ìÕ•ˆ=ð‡J…x°‰ÓiØO:õVÁ«„‹©ÞQP> ŠI8þÃrPFc÷ûެ&‚:ä0rª>Fk Èøsaþ¬ó]‘%hWÆ ¨8†Ë̶V½Ò=ƒ†‰fòŸdíOtm“·Üxb(Ó}n§m*)k²yD ,×i¿TLŠ%Z3H/œg‰¸Â¸(µªT(]9])u¹þLÖAû‘.Ã{[cÏ÷'Ös…K$; dýQë5½KåÀå4镎8·¼Æ/ ‹yÖþ@SgùJ”bbÔBüh Ù‰ñµ!H(/ŸÓ ˜Rþ²½eÿŽNÎÉbíòO½ɺĵ›Lä6²„¼BíÛ¤\OS²’ã.–LKÕ…Î…3™Rl*Z·:ÍÆä,j f•YR&öWR“[É!à /SËZÆïˆ7I.hÙ³'È8ª^çÅ ëÅÍßÞ¯‰Wzs绽+u-—ô´`ýþøpAäûrýò¢SÖ3ïS¢<…¥<Í—âÇ/¤Ò«(©ƒ´ÆãE°cêÄß5ÃhNÌÇi=ZÕŸ\´uçB.á$ÁA…︀k%lu§úãz“¡Éæ/3ÙD›n:©”HÕ¼ëåÓußdê*æÎ½²z3mzkÈÄE·÷6]”©iN¬£ÐgWY2ÏiÊP“˜(Ö)tKÕ²ý¬ŽÆÜdáú[,ýM‰‹yq*ÕvÙîÏGÇŒVS¦ ØÃ¬ÀNfXO’t‚ìV'ƒ8éµâ×ñÂáí<ŠëâÎ…›Õ£î'Ö §>Ϲã8OÔ{î‚=>,!î·p@lOŽ®Ä?ÚûV«û(Ìã²5öZ endstream endobj 98 0 obj << /Length1 1466 /Length2 8300 /Length3 0 /Length 9285 /Filter /FlateDecode >> stream xÚtTÔÝö6!ÝÝ2tJwŠ´tƒRÃ0À3À R J‹„t‹tK§tH7(%ÝýGß÷þï{ï÷­õ}kÖúÍyö~ö>{Ÿóìà­÷DÎfV‚AOøyø$òúªü|>>A>>l}Âü/;6‹!ØA%þÁw6 ⨃ž»9øü"ü¢||>>ña® ;Ä Áxƒ‚áØ,ò0g/Wˆ­âaŸ-ì ¿¸¸(÷Ÿp€œØB@„ØéaGРAÀ¯ÿHÁ.e‡@8Kðòzxxðà<0W[n€aÐÃÁ®î`kÀï–š@'ðß­ñ`³ôí ð¿z0„Ð x08B@`(ü!Ä j v<ìÐSUh9ƒ¡‘Õÿ"pþ>?ÿÿ¦û;úw"ôO0‚99¡^¨-Àâh)©ó <Ü Ôú7è‡=ÄÝG ÕáOé@€’œøÐáßýÁA®gœqüÝ#ïï4Ǭµ–‡99¡8öïú ®`Ðù{ñþ}¹P˜Ôç_ȵ¶ù݆µ›3¯ââVUø›ó`Âþ·ÍŒóññ‰ ˆÀ.°'ÈŽ÷÷ú^Îà?Nþßæ‡ü|œaΛ‡6À~ðöè \ÝÀ~>ÿtü'ÂæçXC@€ØÅþwö3Øæ/üpÿ®OÀK¾ùñø~ÿþweö 0kÔÑëßô?WÌ+§£¯üBŽëï–ÿ×ùìÌàóDPðD@˜ÀÏ/ }Xøýgm äï:þ« µÄÿ*÷áœþU²ûß`ÿ{@8ÿ™Kö \0€ýßB7åæ=|øÿ¿åþ'äÿ¦òßYþŸBÿÜÿøÙÿ"ü~ ÄÑëoƃrÝS {˜èSÀ®Øâæôß^Uðaä ¶Š~Â/ÄÃ'ô—W‚x‚­µ!Ý_ªùËnð{Þ!P°6 ùýÂüSi öü#f/†x<ôè°¹bÿ¾XqQ/ð·éú]¯õ? €×ñßðA]¼Ð@¯ó? 0€þøÙíü‚An®®ÓûGYÝü ÿy*À`O0{f’ ±¯iº(“£ñxòcH@¯û(âÓh]‘Ê}C'H^êòX0;rZ®uâgäå2ñŽ@Á}­ƒ19Ÿƒù’or¤ùLUšÕ·ï±ôÕ\ÝMà§ZKË KA¨µ-ù~n¯ÇÉÓq n—ÃßS·”¥XëJÏ?Ûíc°ÕüâÁEŠŠÄ ÄE ù*—úµôY¹ÜøD³*3üèéÐnÒÖerW¿€ðj÷l72d%™f{ÏYí$u[æÃf»µšå`œe½]‘òú={ÐISÈ+v+ø€ž,“dšêúÈ‘ÊÑz”ª®mJÏ2jWªüò{ƃe,¹OžVl«æ’œ-  3 ú¹Þ‚ÂlEíÅÅÊ$ÒJX8ÓXJ£¿B*x>©ùª—÷ÆšëÃÒÆ“s¹ûSHj´õŽ}¦øGAXý‘Á®Ñîg_éÖtƒ‘Ò£0ì§-‚†å9M*8, ‡×w˜‚ sh}E†÷”Å!™dI×¼Ml¼õ½Ä±¼;Hå{T=ÖW°IþãîN£þH å7“Øíáéå@\wuFg ªÞUâ“‚|Ê,Ûš×~ˆ£Æ•§>T¬ …#&ã§i–áªØÁ¾sYp¢QˆÍømýmÿk³ûJ)”7”Þ7å¿ ÷)‰ŽiFI÷¡tå618Å~Ù.Qæ îЧ% >o*ûEÚý÷—d#žëµTuVºŸ2ÇWž@*™+´Þbg}¤ÿd8£#»ƒ´°‰)€tT\"(Rä–ƒ\Ð?déG\áæŸ]Ñ„´úøóZv¢øiËŽr¦A é +â£ñÞâ5ê€F<åÇ㸵;…¿Ö_eN0ªÑgÓÏ^}*JU“M5+9›7t2æv9QI%;•…¨Ñ I‰©ø^°3m}7v§æ4z ÚÑ~t7-Ų3¾3¤ÎåéÒ‹÷Œ £øøch${o¨tã´è¯$œÚç%ÈRt^Ó­|D7Çþ®n÷¹4ïZAîGHÅX#emÞà–Ó®¹ Ð==ø¥é%×XYÙØ”·!ŒÐñdI½›]ò×´ûÁ·o9ûZáóe®×Ñ.{‡³P\ÉÞÃ3ãꌂT ¤$\ÖeÁývÃÈ䟌\ÌìÂßñ}yâuÏ÷¢-§•_“yOÓjˆÃYkzD)]X09¥§jNXân?`zÇf?T’cÙyúÞ!#zŒ~ùxÌš7¥Ø,Ýö¸óU@ÿYOž”éu8ËRt؈=˜TØM•|‰ulÑ:[+ÇÆ¨¬ Ql–ti†Ö¼-(@Šbu´U˜ŽfˆR=ªç¨uZXZ·Éoy»e·l W–c¬\cÙ ˆéLbµÛk”º¯Ž6%.µcÊH`¢IÆÐŽÈDà>R—G~l›6Ñ «{+˜5ç§ò³l?JŒÉ¹}•¬\øÅ”×nêj6éY)΄œ¡°÷‹éb¾ü´Þ‰ƒ×Órf]8b¸bVZS˜mR sÀ™ÿ6Vh(¥ßÎR–FÇöcΡ¹œØ+ÎXÏ”‹¬ÀyÈÜSÔ”J¼êåeš (×BÊQ$ôñb|Ÿ¦#çqÂ{8šÉ æžLjø˜T#"",-«HèÊ$P{Š„ŠEÍul¶ÛÜõͼ$¬âíÒÎtgÛ¡´®>…˜ÿÀÐúJ)`îèBè5#Z ð†$Ý1yK½¤ýôÚóà;®‹ézXCäFQ>‡W,¹ æèö§û s[MGC‰Ãíœù+öÒ+úQ{fž÷—1$òs}2cÖ®ëD­&™Þí‚ñƒ ÔæŒôì× E^±…²E_æ®àÅHap…JD©ÐcaZ 5Ú‹‹‰PnV¾aî‡Ú¿ÅžNí¹~U¶;]E»ù†ÔëÇ´ÈPç½l?HcË[G¶œX™«SüÄÌŠY9­aǸbÀ—¦¸+tÜ—4ýá­ô°,\,¤†kÄÑõp].p( IÂo†ð«8¯ÆŒ™Ín#ºñŒ£ÍQö“+¥!ßi@‡ GŽÿˆ2L§; ŒWàN  G¶õñGcá6¯yÒ¸µá3\Ì—À>¢œçÞ•u*ñ|ïÜÒÖÉËGôjç`oyM,1Øl9„I¿mI˜–Ù|2‰wUþÊPï/ÿîÚa‡ JÛ¬VÛz•.Á¨†?0?}c&†“UòIw£FñDû¤êÐÈ®ªizð«·™!™êtf‹÷\åæOõ!_FyÅ2¿g?S»¾æn•ò• ²:»‡ éH¸õ¨}ðøz•Ÿðwo9›DÀÒ+ƒ$’€•Üx^Aô¦T&”b{_ÕðmÃÃ_Èý)¬û[I‚›bÚó¤¡ßdÑØqcÖ¥eZ¶F‘g¼35…oÞ`Sçàâs÷3 ð2î"ÛäɤgáÐeùfµ 6c_˜,‚Kï´O–Rí‚Ù¯¨óDžož¨V;q¯ðêóQµiI´® EÙ•µ ƒÉÜPôŽx£Æ ô¡^ÃïÖ•+¥È˜ í\wÏ6æQȾ\Q±«îÍÓªž:§Éæ“ØqÖ:¸ÐÊ:6‰hŽÎ,rʈ  Œ&•YD!ò¸ì ¥˜ -ômóÕw¦kÜn€¼Åe÷ͫƽnÊÙ%K2Êçw·OžL_ø‹~¦è2#<}5¸íú9ŸU'aŠïesʨœ†YºÍw㟲5žf#!õÉ? 2Wû¯²æY¾Õݲ¶êËÆP'òâùÕñTyÔ @€a¡‹*Ÿ‹ï¶Î™ä£žXÚJSS`”Ú,p`ëÇU(*‡\¿¦§¨º)’Ãd•hlqÆ…“ÛàâE1ïªðOF”M\;‚˜'3ö?«¯·v]~‹³“ر§ƒ`¥*üѾs å¹ØsÜýÒNàëèKDƒ[XÉ[|1ÿQ’-™]@ÛL kz>^>qíhÚ)3¸,‘°ò6•Í÷É8<È+”lR¼Ö¯O&ºV ¬œMÂÏÍË¢M¸èäËN€Ò7º–yÇÉ` ÀCG¾q®á@ð_Þnqíã|.YÿqôÍòsêí1/3þKÌ5$6pÖ[6¾ $Ó‚mb¯ Úw¯l[—º»7•¸œ‚¶]ã'É+ 9Ic57]Tuú ´I þ‚Ü®gBÈ?Eh;¦uÚ…ƒ×ïZ^~¶ÿV·x©©[è҈ɧF½¼ßóÖýËJ¬S?+YÞ'‚[›ÌmWç #vsw ?ñ`çtщyš‘êœw}Á§™u›Ë• ø9R [a²ÄC™Uà›U.•‚”ñ;‚Ó•¡óT÷‰ñ #ã$¡°#Jš® ÖF„™{³àQŸKf}û{°Ãò‹X«Ç—õN*öáü~.·ÅÚä¾ @±_¹}þoú*´W΄`—y;¯ Ñ®JKÿ "‹Â:NÎuO™ˆy}Ex\Ü·47(va ü²Þb§m”cëŒ.íômåê[ÄýmÿD¡U- žBžø-…_¿’åkÔÉ–Ï|ç Úuh–î|p«êÙç*/ˆžì€·° 8®RÏÚåè|‰¸ÇÓI{n(½’“,Cܳ îd‘7Õ¾0f¾kÑБÐnh5ÝkòÈ;kä=vj_'=t¿l¡žð4,÷¼È£Cs¬=ÄOiÞÚX³>æ[ÄžGdÏÏý!– F¨##`‡7köÐÊêq€YJŠ€Ëb± ‘NPta›%Ú#Flè&©:ÁŒ7"ŒÍ#j³ÄœÓˆ$+XQ›ú&Vsx±B‡ŸOà¸'@ÅQÅ &¹" æš® =o¶½ËNyƒs{²ÝÌPa[…ÈfÓ!ëRéÑŽ˜JUËzñýq~ÊŠ6Š’Á-Å„t˱jòÛûÃe—wäHKÆÏ¼/,ü 9H=5e•aFŒÎnÃ7€x§ ®+ÁÒšëÍMÉSù×ì8æiµxˆš•{]s¾¼°ÈA5ñ¾Ï÷Ûg•׌ߗòÏ÷l.–—¤}#c u¦°Q×$nãØ[°^Ftø(EÁÝÛ$‹s(ÖÆ±¥]ã= ¬”FŸ$8>{oaf€ô8£¦-Á{›>WŸ›Ù°pTœÈ~poîÅRõÉ»{BºûáÕæ¥Ú|DÈ÷~—ÒÝ™ä1eÐÐÙÊžON–o¾nÃ%Ê­:2!Î&E·©»¼œÝ&s7»p¦—¸ŒØŽœ˜l›€¿ÿ"¿¬¨7<¼í þ~މºà ’öî98®_ªX~·d¦H<ê$º"ÀŽ\&V™Q6OåeC`ÝÝŽ~»Ùr£æ´êBÅ ¿Ñ\íCªbøâ7[˔Ɖ9=)z&½ñš×÷ªZ>×X 5p¢ßˆ¼•ÁC.éCo›¾†ÔS½Ñ ¨Ò¯Úb6TÅõ2²Å›ÇŸC?ô‘Õx«W6ZÔZLñd–袘“&fú"¦¦wËÕõ4ñ„Û•¤9»˜¦ÄÁ¾}Óƒq¶å 蚥“:(u$§óÔ™iùh©qs¦r7-ÑhÖRO-(¾U-”`¯†Hjd, {#îP4œö«!Ýw_Ÿ¿™š.7Ûñ€8µmv¨÷çgž­€ò4jG3dbUT?Póá´_Ê-®·MxsHçUXT†1mÂãÌ,ˆqCW'…ßs‰+ŽŒ èwb Ôõþ”¯:ˆÖªVù¤tüïh ÉöRúµÔÁÓåJu¡nóÔæïùPó(±eRÁÐÖƒâ«gyR^µž;Ö?nôk_g²{ÞÂ]šöu[Ö+Ñl ô)ß×ß ŒÓ§š’·ÁZmSA‰ÍÒ²JkË )Ӣغw¹HæþËWw{M×`uÑ}’™Æ£gç9¤L³‘\‚˜ØÉæ •Ž_×r,[¿ê„o…@Dm²ÆŠA+eî°_ÉŽœãCÝQ;º°ÍðÇb—Q_nT !—Uí³‡K¡ãá"þJÀXý †,t¹6—ç}¾Ì®sCÏi¢›²3w©Š|7Ö»WÉN:TÉ ÇE‡ ü¿~>µhCÓÝgëµÏGþ&Ñå©™RF±¬f `ºÂÆŒFuCx°×ÜL’E_w‘TT­ änN­âË4vφ‘\p+-B½ÌlT,nÍ%5ñ½T bÑx˜9¿GÔ¡ïóö¶2 §@<Â=Óã©è|¶q½äOpå­|#Gš)?ãÖ6&K–¯%ˆ’8´ÅÅ笧ݫíèñ}ý°þ(^í½`Ô Ïî¶V(CÃ4V¹"N5µžK‹µoàôœgÞ²9šÉÔ´ò¯¾8é’š.¨ ;CÈ´ü…eFlŸšÌ ¯'pQ¶‹ß®ÖMÕÆñõUU>r{Šþ¥7ô¬Œß%Q®¯=nEa'¼~KHóY‘æQëš‚`ÄÛ̹¤¾7?ž17:‘G¶} vôËï¼ãüKÇÖÔ Rjâp]ÿwFϲObϯ¡fÝb\ªÂ&f*î$ó_% {>П/¿Õ¤¢l›G#®?:J ^à\@ï<•öy‘öË@äŒKepAú¶ìÎÚXéÞLäæWì/ j-àÖY-Sú"«Û¬ìLEk¹˜‡,SÿH—õÂõºÙ± ö±1 PÿΈHç<ç)A˜Áü‘RðÜÖL}—*yewâ€ÁȆʣ{¯ÖINs )P}åd­õöÅw“Qõ9­Ã¼œs¯ç%:q´­ÚȨHÌRÆ=MvlòXZËPá§îÑßW’ËA_¢†I´Æ¼ìç8$Ø’@B]ï$¡½)ƶ{&²_in_¿5Këùv\ÆJ6¨Bµ$V+T†»x²ªõ¼àà<ç¬òn#Ê5ib\5\"¬Gì±Cý€ìkJýäG{ÜW:y&Xªõ×[!•ϷО7³º6½°Â"ÿV¦¥×-9áï¢$êeºÈ+’¨&“›­Õ{r¬øºû[ˆ"?.Úu½˜:¨Ð &}žßáœP.ÂQz7Cµæ#)ÏvT;ˆ¸S§_‹dM&³®f):%C©Eñè*¯ÝÊ…+ŠBzºr¶’è|±Õ$“Ê1 G¥x2¨žï«®.ɲ¢{pñp4åN“'$¿œO÷Døá[ݯ â5gñ ̽{çà0')˜t9+L\ŒLå'Óíš>°Sv%v—öо‹©Û¤·¢­rämë2ÖEåñUµ± ñÉ´ÂUÌ|d&üÊâ+föø‹|7EÓ³ïȆ}ŒœšA¹/&j{ú’lã¿,rZVÉÞ̽ÇHËÕ‹Ç‘iL?:æPÿ®¨0KØ>?¶O­§7„£FhY…c™~ÄЗæ¹>¹„÷ŽvvµÒGžÕ Šeåó*µm”(òÏ>öcÍówÙ妗¬ÚN1iRÐ =©gìYvëFMv»Ú÷ÕŒncùR¢72yMO›3xÄ„.=¤:tH8O@z¨¾wÉA~¸H_Ü ,Þ € :;>S1±p`¨´K–HlïË;©$SÕT *4–dÑ´;ÅÝã³_£M(øtΖS½¢4EZO ’ÁWßVjuÎj*É,N¢@è·àq£k!5 ”oP†¿¼ “‰W{¡aG“è¤x®ìlœ>‘q¶–a!ÙH½îFGÁ‹°`mÁiª(5] JÊH“I½o¦L‰»³)ò ±2“ñµ¼¿¡ý8ЧßP>¯Q˜HóY÷É o’r~÷Fâ @˜b2§v~û•~>òlµšÌ^÷ÔÒjÕ™îþQ·}Dð¡ ÑÏV]ŠG×2'wŠøV¡6ø}¦>–Õú6dÈ] g¯Ø¥c„¦‡#‚Ÿ‘íÉVn÷Õ8ÈÈ® ûüç¹Ã%?ÒgãÇYèS(ØW¸_€ËIC¥2[hõ+Þ Ç´•½–VJàR}—#ÎJÙW{D=åÊJ^å1p§õ¼ûêÛiÑØ-9\E†Ÿ{¶Í1æX5{qÑí“fLZà“înõ½eEÿM0 –Ê|ì+1ãkü¼0²òZzpA£W5Ž§Ö Sú›XuH¸¼ý®C»†½U”(Öœ\]Øå ÔÖU½•þSÆëK{Cå'€5¸¬ÛpšþЉ¬aÒ> %%3}QáæËª[ÍÙ)èH›,Ž}³®*9õÚ-°oÒ¡5ìœV”s¤°Ð|—·ˆ¥L¨[}Lãh[ü…ѾzaÊ^F+]L¸qÖ’ ‹G¼è»k_0±:ú—iyYêG¥%‘äÊž{öVy‘x›+ëƒíÕ|ìR®MѪ£'u« ;ëô›Heâã¹çåâî[ݼ i1\mò–ŸK<#O),…]yÙÌ ðKô¢`ïñÓK¦¢£NN³E—O7tå¦<–¬Z]›‡ÙÁ$@L„'ó«$Q¿z:Þå~`%{Ó¶žA‡S)ÂíÞ´Âë\ñ ûùiLãga¢ÏæÖóÜHͶ£¡ˆö5u‰€TÊÇ’g{¶Á†EÙt”ìˆÛŽð ŠÔ©«õŸºhý§DR+›æÁô÷ÃÍ 4T ã -c´ÔY:Œ—t›OÝÂÊ}ê±ù3ý#‘f3,둲Tó?èø[±bê!InF ¤‹¥¢·ñ©Nröcf;Z9yÁ’êÃßtkçFª]>‰ÖøZyš îˆZðŒŸÈôç(6Þ.¬.ŠFÔ¥n47j)ëGŒ>F¼ËzÇl’IuæŸÑ~zÁ:%Ý{-.±be9JýÙ:…™žSlc¸±ò '/x4ò¦¢×ß1. 9RÝž8=x¾AŸe1ZݳÄ\Å7¿¹Y§·AÁ¡‹ÙLªÂIõMC;{¾ðíhIXZ]EqcvGùÂ"±ÅKûçÅÍ?Œ.’b¢4J—ÔûWÍ'YŽ`½Ÿ[[~"Ö´’žvíµÒeTçp8ßíäÙ¯¾N ã[}›ÅløëQ€ Ž\qgyùv©=&êF³Lcì}JHšØ™#k³¢ £ë!ß1†Ü OË@Ù=`trÚ¨Eœ3•Áœm€Ì_k÷Z]ûëµé®³‡žŽkˆC_¡î³äò½í.ö’PúÝ·hô‡Ët^Nª4Wù—OÅí&‚·hš«ïmž§–·ƒÎ¹”gp^‹<Ú}ô>†Mo&¢Ä~¾»~ÉÒèå2ŒëŽgz£t(Õx‚ñ ›Ê;TäÍZÑº× þ~\¿²xN]£6æ] J°ÑPZ¤vDÅ _Ýrxðyik:Ë Ò½A‡ù€¹MÑm™1¿‚îiW?ǯªiø HW™û - m´“_g/¬2K&«ªò[ì°Hò*š »<ûÎ1óTÇnˆ°²Àu«„^ÛïtY*ׇ‘“¡oílbèVá Ù"=¬E1Ÿ÷G|òÍm¤S:×铘XæLÇÊÃ"«­í‰F¾q¤èçœÃ^‡:>ǻٚÚâ×ò]!—tð4­²w¼KËHy÷¤Š%)Ñl9-¬ZÖh—ç¨Á«~C¢aEšuÁ‰®#"´;Ä+uüšÁ!ËX±JB“н/…¿êéÅaíD÷–{­‹Fõ?Ã!¦ endstream endobj 100 0 obj << /Length1 2480 /Length2 17745 /Length3 0 /Length 19204 /Filter /FlateDecode >> stream xÚŒ÷PÛëö ãw·Ðâîîîî'8‡bÅÝÝ¥¥¸»w§8ÅÝ­¥8Üì}öÙíùß̽“™$Ïòõ¼k½¿„’\EQÔd ”9¸2²2±ðÄ54XY,,ìL,,lˆ””Ö®vÀÿÊ)µ€Î.Ö ¾?,Ä&®`™„‰+ØPäs³°²X¹øX¹ùXXl,,¼ÿ59ó$LÜ­ÍŠL9БRäøÁÙÚÒÊœç¿_4f´V^^n†¿Ý¢ö@gk3€¢‰«ÐœÑÌÄ 2³º~øŸ4V®®Ž|ÌÌL&ö.L gK!Z€‡µ«@ ètvšþj dbü§5&DJ€†•µËê Wg ,°³6:¸€]ÜÌÎpv€º¬@Ùèðc…ÿ0þ!ÀÊÄúo¸¼ÿ dí𷳉™ÈÞÑÄჵƒ%ÀÂÚP–R`rõte˜8˜ÿehbçû›¸›XÛ™˜‚ þ.Ý %ª 0wøO.fÎÖŽ®.L.ÖvõÈüW0Í’æâ {{ ƒ« â_õIX;ÍÀ¼`þçpm@ÞÿEÖæµaîæÈ¬é`í䔕øÇ,Bü-³º8YXXxØÙ@'ÐÓÌŠù¯+Yÿƒ{ðõv9,Àm}­-€àDow ÀÕÙ èëý§â"++ÀÜÚÌ` ´´v@ü,ZüƒÏßÙÚ Ï?VË_¯¿€'Ìä`÷á·ùßG̬*'¯%¯DÿOËÿ*ÅÄ@žoF#;;€“ÀÅËðýß(*&ÖÿTñ‡§¬ƒÀûŸbÁ,ý·`÷&€æŸõ üo,%xnšßcþž…“Å üÆúÿyØÿvùÿ7ãEùóÿ[‘”›ÝßzšÿüÿèMì­í>ücž[7Wð(‚À›àðMµÿY\E ¹µ›ýÿÕʺš€wAÔÁÒî_"­]¤¬=æ*Ö®fVÏÆÄš홵Päbý×Í`deaù?:ðr™Ù‚oðHþ­‚wç3J:˜ÌÿZ26N.€‰³³ÉDð$±qr¼YÁÛhôü{ˆÌL W° Ü/ÀäŒø×‘rq˜Eÿýq˜Å~#n³øoÄ`–øxÌ’ÿ"n³ÔoÄ `–þØÌ2¿€Yî7çSøÀù#p>¥8ƒÊoŽ©ö±˜Õ#pßÜŸæoΧõóiÿ‹xÁÈä_ÄÊ65q1³Ÿ9ð·¸*Óß̂ٿˆ¬3Ùò¿Ž¿$ööÄŸ1³ùÌÕïèà#dþÏ|ýËó_z'7ðbüv7oñÛܼ…µû1þRƒÜœÿp›XþŽÖ[þõþi.ÔêwÙ`Ò¬>8Zþ°Ë¬ÿ€àJmþ€`òlÿ€`&~WÌnÙî¯!þ­ófÿ‚o+æß©8Á±ÀÃÿ¯€œÚÁÍÞô¯kÇò’À÷(3èwÑà˜ ?¼XYÁ:þVƒs8‚vv@‹ßôr°þ#uþÖ9ÀÝ9‚o'Ð'~Ö3;ýîé/ätù{sÿ-”ã/!ÈhnúÇy±‚¥PÍ îæ7œàª]€öÖÿ;7œÙÝÿàŸÄüDø·B0I.v&.Vý»ð]Ëìjå üc0À ¸z€þpÇpû‚Íý®Ìã}{{þÁá?üÁ\{ý.É èüŸTÿs]™¹9ƒÉvýû‰¾Ëþ‹ÿþzÍ—@füÁ6uÁw5¢DŒ{“‚³”{Úé´ŒÞËÎ_ÝPáSh«³7œ‰¦Œô¢¯îHÒ܈¬={Ÿ´6À‡µ%©¶?ú<%¨Íìµ#.MãNžˆÖ 3jˆìû<;ùhØB·BvÉQæ;¹ñ ª|ºóè—ö¬(û>º°§º_Í%ôTö1F3ú}@ñeiÎ<þ[8WF’7t˜—žhs7¿f1ó¦^Éäè}OcØ¿xëm²ÅÞÏ{­Uh°¹tPèá“@ß`ŽÏPy‹¦Êá-z—Eo.æ²Ð2AlŒùŒu‘Ÿñé+Èbâ±Ø9/óJSø¶×3èô!#dï©;ÒÕ9ž .âÓ[xxHIRn)ê7ÜC¸ w¦7WtƒWúཿµ s£{r#rV7¥ï5ªo±€¸³Ú,¶&ñæä‹­GüsŸ§Û§Ð&«”¢Ö»ÏfêÔqÖsßSýë`¹ä¹*"|aJ:Vaf7åHÂM-Ç{„jÞvS„÷=´ú#+Ršß™œ®ö_8Î ÆõÒyä½<<ˆ?Ø%OÉršb6“Ù˜%œéáT@¡fD2$qç.Œ”É×òݽ‘ûn^%2Ó.u 9¡vpÛcTVðhŽñÎ’¾îáD°ùPè$fN/'ÌäcKsš6q¤Ò v¤ §.óÊŽ€^Ý`áaaAØ@$.‘äÄý±IªüY¤^ŽÃùÛ_(Ñ»p©høV޶ÍáJú•Ù”¸bO#£×ÕR½Â–jò¥õñê³*-ݯhq_oʶõljû’– jÞù¥ëÍöè-}õ®Ž® « Ц’ÐO˜=‚È¢ÂlÜk›çËKÜ¢â{ïÛ™°ÑÕ7cr³`Ãdô<“¿2&CÖ¸æ°cx|7è72«ØR#?mŸm÷Ëp•J{Õ/jmÈ›´ùÓå³½T?áÚE9INCZÑÊ|Æ{¼”¼Ÿ,nèn\ nÑUÅGeÔH&þصøh™QzëPÚ\~ߺĻ\ì}›]ÉE·r²ŽÏœCíŽßãÅd;ж "Õ¸O¥ùÜŽª_c8XÌ e2ææ9.ÝôOQ‰ Ì|òÇc%èû\'e¨&œÊ˜“’sÝ[ä„ o˜Mþ EÇjéq{ÀÖ]ÀÁ\”Ÿ×ÂÞ%R¾ý¾†Û뻉×ñ +ñmD3ÓfÆå€(IÏ@]ê¶á²ÛcÎp)³‚6lÛ_çá̰ã=X‘cžîÆÙýMód ²#{>´ÔñÅŽï¢X,”®G%í_=–XXžRv9< X_‘)“ÒP{—ÆÍסz”¿¨ï«³¨y$^¯Æfˆ¶ëÙ¦&»÷}Io¥*ýÅæK@³1m gX†0A=içzEypH'˯Ô)ñ•¡¨ÊÞ3Ré}&[YÚÃwSüœkÙ…*ö¢sÃôùZ‹£^k£Ÿ³ÌpÉÂðÙ 5PóTÜ©kjvzŽ+ nÕÔ²ÊÄ¿ˆÃVs>ó¾û)z¶E/<$vBq°:D{,’XÇWL£M½Ïñ"6 ]†LÀèœ8®Qš2«kíƒ,Æ`›]r@…þq²\òm–ÛUû²îæC©ñ…ÆŒ¡1)DMJå,5œ}Æ ’<5šüö, µPF¶ä¦ŠŸâ¡w¤:»4›ª×û¼MaÆËyC\jÿï‡7¥p™œ¬Òû`ou‰ò®íMÊJ<Æ—•ª4'Š++ng*òÖÂíaËY~3õ ßNCïpéÕø– Q)Ñ m8§íDnðÑz°À£=Éøõ°°>šz¯×xÓÊ®YC#N¶ÜA&h·Ûô ãëDâuìm_¾1æÚ¯…€tÿ_‹kêRÇð TA˜r]ÖÖý_åùš]3%̧ʰˆ”ÆT§ÄÞÁ4øò|Lâ§Öò¼Ÿº˜×Ù˜˜%†ßVŠiWX»Üó!už–Dmâɵ`~Ùr ReéœZ“.{üóÁ+ÁÏ u¯ŽRzíHÁÔ®ÇKmËÁ+“w—¿x  õ}–d¢åù,šíjLŸ6 :^>N~SU‰âä…m¼Oîóò±Ò„®jÂü@)ž–ÉU–ØÊ)añ%œ”Ž:ßéÜ¿­Ö¿Zè X gHa€}l8n“­ßŸWÙµIŸÝ'æ’Ó™úG«ãàÒËãüFŠv:±“„ÂÀ׎XïÕ3ã:ì¤asd"ŸÅ`i¹W/ææìCêN=ŠàˆeˆŒ%ÅÉBž˜ÂÍØ¸A=ôñðXÈÂ7ÜÞÕ Žë}·Z´”X˜[‡¶£«ìAÁ§ Â'q_¡f½Wçáïvg¼M½W^ɲ¼…9éª-·Þ¡McSçs`á–ߪçvjœzˆO¶/Ùb…p·Î“Û°˜§…´©ä“‡6ÿcHˆ¡‚­­|£7<¯ÅKË'H»#Ÿrª"ÿoø¨ŠÃ&tŸç(~Et¹¿[m:åÖ<5;ú8Ñ×_AÝ …æÐ¢„61ÉyP¤½>Xþ_²üªµŠ\š®äGÏûº‚ÆÁõAf¦÷ec¥$¥·;òm¥×è6*H¹×(Ù§ÂLï…ØK¬p?H¤YÏ_”l­ó~SÄä3Ð3uÈT8þ@èí$N äë¼nwÈÅyö^Ä‘F‘¥Xƒ Ör ¯æ³Ô±\µð[L}Gƒ^¤ØQÇI«è¥žüÉîÄ’«PM(ÿ©ù$¯‚ƒõN…Pázÿ¨$¼'>Rù(þª›‡íWÊqäàŠ¥0><Ó^Ç)CóL±IÒ95H.}F º3ò옙ºÆÔŠÏ4ÐH•oªÏF±ÊUDß Z$øk¼µ Ž~ # ¼M{Ñ)¦JTëì—:A2(aSð?í‡à‚A¾¶¢å¡Ça3A·ú•šDŽ×ÆÞxéŠÞ¬(0­Ãéõ•uƒ‚‹§Ù÷1@[`ƒÕfÏz››ëà™¢“£YÓP8(UØcpŸ,ÐpS=µò­] ^ù’4J6Œ•Ð쨎M°0%uUDz®Ó"™?âF½û1* 7Áßî¯b€‡ùu¤ñªW ²ë%åé0¥Mš!ùí°pVNRÀ¯S±¼©Éá§EŸÕïÒS¹ëkïùÛd·àÌØÂ7ª=Ét&á°óYÉ…ù6q¶0ZS÷Ðq]ß‘ömâ S¶ÎܦXGªwõ½2ó€!¾€Ñ +Ú´‰SdhƇ7Áý§ÊÁ\î7^n…ñ"¦AQÖž fƒkÆÎß1©œ»ˆQPeOá0ãâVZ„0Þ °ª«›Ãþ„ÀßÓ¥81¦-ì­¼™éÇ_äƒÄ=ïJÁ0@ºSÃ4˜–’­Ò°õ¼Ì²±4Í•I2ÃDÇس}QžMÌ= •FYèèÔUöS÷c…á‘—'Ê·aâ„™sÖ6¨ª9´±õ¦`x½ÂU&IcUüyj¢Ì?í´`ÀsOý¡¥Y,¤àŒâï-hÑÝTAA º𥻠¢¼§‹BÅ|({p5wù„›%©äeÖÔžYüÈ)í7ñq©·%8f‹"™3/'Æ„ŒÜ10uñ¢îæÛ›2Ñm(ËâÀ§G|†*âtÛ”#Õ¸~¨L’ Çä)ÑÝjÆuhÁšžò~ªe @ë¸{x“ëúúÍWåé4ÙµçS±œg} Ïâð¬ñ÷-&¼÷Þ£Ænk¯ú8áDdÅ?)ZÙ{ÂãžB¸{ßÏ;;†*É‘5¿DM]g<çKUÚVÔ!ÕÃ^w*Ût¥}%¬ÚXÙ§o€×ÎO»”*Îk¥EÑ–Ý¥§þèÙ„/“»ÒÕºËâi8ífíy†3'§ÀŠ+Œ¥Ø0,Œõv Ë´x\µ•ø¢³Õ¬yz6Ϲák5’€¥_ÌEZ§nµü”`€úÞ•Á‰9¢Hx¡¿<缌ËfàãÍ*Îà1óõv[Ô¸­ñšÛ¾åîÇä炨…st_j»”éä=‘ûê.#eÙVn‚¬)fïxC¯ŒæÎøž(D_ÇÉ0¹å6f®î‚g»oÔsJw¨ó‰¼¼ ZOL¿ÌšÙª˜¾ñ €XBd)¨íí»+šð"Ú‘­$FÑj‰R+£˜eøBXrÊœ(Qxº@%™ÇÓSŸ1ô¤ˆà¡y›}Ê‘¶´ÒϽi]¦k¼ÑJ\2Ð¥qú©˜PHלã×FÔíµÚ&°þ!@s_|Z$4M÷s(Qž„AÛØ†½[Nè$×£¯ò$“†i£Æ|«_&†{¤Ö§†s‚|¸"µ£·q$¸…uÓÇ—[¨¨(¥ P¹´Xíª.œVm=šûàãi„‘ý°Inså¾Ïû£ÁNÚQ¡& ×Õ«•x¹|.x”ðî¤toÆáHÓ?-nÛð*ɾ‡M䌱š_Cc|Ÿy¿«@j:‡ÓÃPm©ì@̓3ò4\VYEŽG(9JÍOòŠ Û ÍýHMðÃDo`w@\2[ñ‹ûþmÁ¤©¿Æ7‘Ô·ªDÉŽ“6Y8IóV:¬·õüÔ7%Ó° †ENhS4?>>ôpJw#yÐâM& ‘ˆÈŒÌÓèíÊ5Þz“ZsÕ¹;k)Çýú2Þ.õ /°Ì*hÃ’9ó½ FiælpV“MøÚRü[5 û#¢¯®,¼¼~àý@8Cçì­hú…šÊ8¼Š­µÀ­¶ä^Ra<Êæ‰q¸ë¤rx¢Ê`¦ÝxÜ/ oº÷,H¤”Ãb+{ùJùÈu°,Éiޝg/ — É: µ(+ë÷É&Jp{B&˜Î‹Ió"÷æei=ÉîÕœØõPÇmÙœ@œ~ 5úf3Ak¨W—òï: <$/™sÓööQþ™ßù%+«Žû ²e|*Õ“zkjÚïn†»à»Š/ïÆHŠ÷jºÛÑÊìPoêˆî3v÷%×Áê\¨¸÷‘û—ÀÂóž.rvHÿ7bº–èé0p+pµ¾¸&é“ááyåSP8Ys–yEís/—:EFô®É¬l´¢ ¨Þ%w;fA‹5ù å%^*tªc¥iê‹j{ætdvJgxKq¦X6#a¥ØP_ÝŒŠ¡ñ‰Y6ðÙ¿uÙ÷ B3n|T½úYïfñsûâµ,‚̧ömá,'›²« ZÄÑØ“ÌÙ:úܦQÌ¡’içOÛí¥\T2ÓÉâ¼ öΰ>}ÜÎu˜?¤ï)ù®åœ_šÖiÊ-¥ {ûêýª=UŽà ýå·×çðz6utC$Æ’ÞÞµ$S` [4s“¦­dnøb´&êŒí‚ÃØŸ²©·é5B€>Ü7~yžw¼R‰ p£I€l7Äñ‹ôdë7Vˆ¼J®$‰!¼ínÖfû.»rþˆfz>M=ذâÃú3¤Ö‘‹ÀË ¤ooo!ë6;ù Ù}D¼¤¶t9~iÃ/©ËŒ¦ËmçÑú½bSf›êwa( ÷] ðãä©y„m´IVr~~›«½çãÏ?_%Ëu•¬EýÞ<òPþþ§‹/[4·ª(­¡Ü±+¼Îf,Ž5»[´&;”F–g‚©©ßÉC¢ÀÛc77©¨oH@^á9e®ƒGftj(c>²©¹«¯P ] %¤m8W<–Ѳ7Ò )¯ãŠÆ|¥‹²ñF…iÍWaפf¾roÉ#‘óˆ~µƒaZE†ÝNá6λ…»#Ê7« O°è ”‘t\+æ‚$¡¶.’QtÂÍM€ò(†~C›Íþô䨛öÒ­î1,Yx…ŠÞ’²½¯NVÈ6!«»`ŒˆÉj4GÏϹ_c. ÈÔÚmÝí(|*­oOYœ/¿"ªzBÌ8ƒvdTÃë3ܽ®²‚.áËWqÆ%CãÀRÓÛô6ár-êjÏKRä^º­ \„¡Èv¿(Å=qñŸŸ"ª’oX¾½uÎ$rÉšT¯Ú‡ìýöaùQîqÎP€œ±ˆ•¢†S!y]C–Qèw>Yö‚5Ìü]6¦ï9U†ltÈ»ZÀÔ€eìF“]»$}I%Ϊ”¶ƒy¨¢ï”š®[†© ts`¥{æ™°‘¥¢-§¨´†½K\’WôÍ"?ÚoãLºWhîi©ñd"œ!=¿"}ÇÒvÄJ’«Y:=oÉØ$\‰ÙØ®í`rûˆÍºäÁu †Y¿_dLJ_¼hÂÀÄ™kg^ç%X»…ªC<*B÷W„êi„®qɱœ‘Xõ&©UñœÓÕ29ÿÓõÔQ]—‚âmÅÐÅA–iWr‘¢KvßaF3ÔBä1oIrÍžØ3ã“ ÖéD"ŒqYNýPж©þ°’]ÐzßÿÝÀzAÃr8*FßhC¯ÑèÔ&”¸êóK2gau µšb8%<½$Ÿ{4bäèÛ`è–Ù²‹Ò[I&Ež¸üSºÈ±ÆõöÈ·µ“ƒÀ˜ë‹‹Ò·¦.›ÖNB ý„z£$}%Yìû½ÑÀéqš/µ–ƒK Ç"œ€ Å©Ú}ók^ãËjÅlu5ô¶Ÿ™M{Q ¢Rb#»¸x<¿2ú¨û[¸Ãõ¢Â¼‚]sa&‰³øÃÞØŠcí‘M¿¨|öÜrŠ>âáøž§¥?¾IÏôÉ(Äô¸„ÂõWy<ë1S“ïÈÂÐlÙÌSµ÷n¹€@–ûéíjËî¸×ÂÏ0¤ ˆ«ÔáéÏk¼ãÎpëøo³M]›2FÓ)>M—-h ´Sñ{¾Í }^ÛaΟùH¦R(–جMG¢'>2˜©œ{¬àpÂRä?o‡×8¹ÐÝ·§\Ë9™rËèËøfnw™±'‹¯EV¼*Λu¸5T42}Co ~¾ŠÀY9Fú ¡C:&×vGÜ'^ëÎ S ‰g¥Û:2Rj…^È=Ì:›·)GÚîõ'M-ܳZ æCeà«BƒÐgš:¤õ-BÎúq¨’JUº=[¨d1ñ33^O ã¬iÐÆÒò½øõ}™ÇB 03 ²vîUT~.?™GÏê“Bºb´yÍxìòÏXA˜}áM­>ÒAVç9ÅôÎI@ÏÑ­ã°Åqi½¤¦p¦ÏrÍ|Ûç¦ ¦Ý°§ŠRÐWCÙQàN¢­¬·üåߺø#a"¡é-SxwÇ« ]2ë™n­OqôW 7qõ ¡}V:4ry#uL6{«'v?‘€¾3à|·æ<"ŸàÄ!~Í0Ã¥m„/Ï0MÑ»W2i {†jœgfMlÇU`EûÝI½¶ËwöDß^ô€}?ƒ)%ÑçOò"ä3‹äKÊ—oýCw5½ËÄ(þ§á'}cõ K]ª ;Ñ Ú}Qecy°ñåؤU¨xD®1¨l}Põãq–Ž˜0TBi˜ž§ÚœØ¼”–%Lvòì2pΘ°q•½ÂX„m~Oç½*…fàöì©éóŠtèMS1í%î܇ ]Í££yLäáaçPï}èyT3\¿ – 1âR©ÈŠ* ß/‰6ðfŸrZ>'1œq4Ô®†£2T#|œa³ÊwA&_g|ˆ'æ•@UÚ?×=¬¢›bÇ1„’­öªåÎÛwË5ºÐâ"$&kiÓúùá[–áDu ‹hãtà;¢ôçoòŸg6šRã©Â>Ä¥ñÆTù’ß‹>"@bÓã‘‹l_ï^nm2Hv‚Ë|¬/üM’ÛŠ}/[ªæš"ÞN™ýSó‚ppœ¯&€¦ZzUŸZÅ•ÛϱO¼ATÓ´]¬DdùîïØR¾;{h¦éY"˳X÷ c­ŒFë@‡Ö«'ìÙ‡VùjW\—îDÜŒçtf7ž€yì0QèâicbúŸ‘¿‰‚2‡ W­‹©Í˜Êd§UØR-fl½Ñ:{K—… O ¯B~fÁ u²8ôˇʶšèEÝ/Dl cn¿³êÅûSdBìåK *hqâ‹Vx†¸//a¿du­iê6R®æ7Á„+@•ÜÄUdhsœShC·iò’€I¸)¯î.âÞ­óëÇѰ×A–ÒôÇ Wv!†Û1Œ'ôb«kqy„àØ-Ÿ¯%öÍ)áo¯ûMˆ—e~ ©™Ç»Ý&/LK…µ¬$XÕò*U^¼IL ]t$g¨t¢ñPâÝŸ>ãß›%{e§P¦È]xx–À~Ÿ'è÷0!†*ÊX³;Gf¦ö´Ÿ<òùEû>ί*ýˆ³eeø° Ó}>És[›¤ãN²ˆL·«ÀåAB”^®dQrpI6>tÛfªšsOu´r¥’®Ç(‹Íeg "‹¨¯ÁÎÞ»7f°`—ûÁݘº{•¯?gq›ôU†I¬ÇEÔi¦ Ó,k†VÓy‰óDÛ6Zj•“¶MSïõ·ëïµ¶Z|Ï€?|lÍTó.Rx¦—*Ÿèå’)YVéÞ—ÓQ»VÈ^–/E;¥¥ñÒØÍ2)ªÌ}‡¬a[mšuó@Ý+ÃH“ Z™³=æÍ P¶‡l»À}Ûòå™i~=“؃=÷UxæØ³71€N+K‰_ IaªÊrL­±¡Eò}׊<_Á)Ô¯ÊκýHmŠ8XOüãÇß ÊÚœ”NÕYGßí±S]G»“‘9cr0Œ£{é‡ôˆÖÃa\º9xº€d$_Äs:üéårüù8»u|6ºÄÚÃ$’Ø2ƒi-LT%&Wx˜E ;Ü3jp{Í~~ôâ‚OÍý}ï[rŽØsös•Y½Ÿi”¶þ… ’ÁŒ¾Lòq^)nÙE„7¬1y¤´ÌgÓsMš‘,ªóÅqBî>™¬ñ–±Ô?¿öYí(Û•P 5²Š{<¨¶®ç8*¸rÃè'dýè Cð[ó TIBÑ)?,Ý–ETt+óOQŸ}¢e;(?íUßm.»Eë¤:U{ƒžæ­‚[Z645MWã—ùƒ„usbšÿ¬a†°.Üã–*Ö*aîiž ~MO»5dë¢Aþªª}hc‚·šuê)¼/Æ.q ‚=,mep†³äeQ{ynU Z‹ÈEdôY/:©WÓðެmüz ÖAC»·ˈ ¬°8—ô”c*j¬¿Á2Æðw¸¸A}?gåÂfúöÌ ôŒÜex.ø‚´?ÌPË}ÉKšÑiw_Í'±•|ƒÕÂC¾ì-àpo&BÉ8é¯ÅO•Yˆ}yôQóýôžŒhn8ÓïJŸÏ÷”@WÖQªlöÉ­x¦Ç·¯Ó¨É~³Ôâ¹hÇÕÄ d’Tp¿U#­òLýkøHWá¾ïL@àÄò¶’–I‚{8Ÿn?ÄTéÖX?0„ñ‡n_­nª1x?·Îj‡éÕ•‰»9È–^á±¾*«ôH”Å1ÒÕÐm´£€€|í¥8¸áü¢v]î¯v‹Â!»ÁÍÖ¦¯zPœŽPú‹¯Æ{ÔëÜW ÂÀee²Aâó&&öxü¢\]œäÈa„!`‰ÜÌŽ:^º¾_òã–™ê‰+§[ë7âzŸ )júÏ1 ] ·-;Á–b>~•pÀ‡ïD[Þ2¹ªsÞ_Æ% †ND{VÜ0±Ud!u¢miSûwá…dd’„Ê}¸¿žOӛТèß ¯UÉÎõ£êØ îŸ`5ðØ²‹´â»ã±yjv¶Þ¥³½¿ÝÃz L¨¯(ôDÜ¢°N¶–(ã3‡¬6*†úªVØvêÜ~]ëd35`*«Tg×Lðû&Ë­rñWö€wËpdÁ‹zðÃ&eß¼´øg!\Õ#Î8Ê®<Ù$ß»¯úÒœ2¤ô«î.%¾a5=4H#WΟap:N;o>š¼ë ¥å…{kúqäЧ­Ð}(:¶BB¥p!µ ‡ˆšÍóÍáNžØ÷â¸ÞZ¶W¦VÏéorпÐLä‚; ijÜ~L-Ñ}ž:ª—Œ£¦á€ÐyÌ­°fÁÅ=—ýDm™Ð\è ‹òˆ¯´@F >+:5v²xæñLéèù1ªõAšø!#"øÓwêËýËÒ!Ýu ü(šñCš(j%ØñOÜFéŸ'Eç¼ï5ËA/3?Xïë·T•ûXµdÈš“¿Ò(ZgþØò¼6u”P< ÞbÖ­´Têªú,ÐÞ#OТ4ù=ºoL ©£°À­S“)›Ú—µ?[ÄïÞ/³¼í»VþúŒÝص«¦½*ˈ…×Ò–JWÌ•¡Ý¸Ðz³c=]“°ÁÖöEaŒÀìF?) ycV`ÖYãΚ±#ÌÔÔÈãf°õìð0•£ î†^|ÂÃaÔ7”¤2/õ™hÌDi¿•Úa@ÄÆd渨<ìX^¯äx·ÎâXrF©ÝeèòJ×û8†QEiº¿ ,!ê!?®‘ìˆáŒR"ùX±*95Ýhä7”zü´bŠ3¡Ý…¹édryc„ç`íãMãy‹âãM/£õeINX^ô6i¢b±öûJï ‚ YRwæ0Gq'ZúÛ‰/ÓgÞg4T&¾ÅXüëþJ-ïkû{â9(à·Lõ!Gåµë_>½1/Œï2såÈNFÜs·áÓž& ¶1Ð|¦Ÿ\‘È€uÑeõ6¥,j§Ï‚; ~’†MeŸ,—c>z6)‰¿5»¿˜éøxpÀ0•GøGÅAÛŒ)ñlÙºÂr*¾‡ñIm{3êæÙj9åò»,íÝd~›9Q_xþWŒ…ÅJåaDü¹’=á„x("øné%ù³Îac„¥A)úž[3ƒÐ ¶¨uP©ï@ü÷3ÁwÕsùš˜dEo¿ÐžS¤Uv<ÇÛà–sÜé,Œ™‹£žœy{k†Ð”˜s­EâÿTÿȶ Í,À­É­æÏY7ZéêsQj6€†Ó0I¤!dÇP7mÇLM]¸t·aëN5÷+«ÇšæR‰Ì—Ùœ‰¿à0yýÀñêEEÅR§DûúNWôÀ7PºìaãñD¤ˆ‡a)uòñ[ˆñ†@´|×w‡n²È<˜ÕÙQßôœÍxƒI“öÃ+]!ê¶ãÄ»L~õ¦"€#5öœ~&šê¯«Ý˜ÞÝhf®×ã\i¯]%î¦\ºåvô´Û"Ñ'Í›d'ѪB÷¿5•ÙÅÆ`yö(Ö’¶†µ÷¥y49—{³;2ítßï âbG¯ XL{I¡‡E@EX;Õ)½É­c·êÔSŽà"$PÂf×xöD¤Å_ htqXèçú´cino‰ˆ¤r*°Å)B“A‹¤þ¹)"‡#±Ìÿ‘²ÎµÍ5mo<:û FNߎu¾ó|Yz=xbœ tŠ‚o“÷[èÛÎÙ[ ¿‚¥ Y›]Ýñú¾ xûåM:X‚5œÔ›d´Õ×Ë¥ [Þxe Ùå#ê.Žå³IÞä¦Ííz¯-…@2áS#_sÒ½¦“*z¦Ú[éXpyÃy³4楄>½"¸#¼†Î4+ËþóÄü8ÒÎö5kÌð]®Ì| Í6]zQx9ÉO€§ø q›Ý–ñ t'«ü‡®“?k$£{ââÐŽÌ+´¼¼iÚ-ËóH#¬l¡^jÚ»8¨EÓb³x\OÓº˜bÆæOß!Ÿ:åø g—fýë‹ÕЂ·ÍoUaÃ*çÄi¶®+ûCyôk°‘›ÕÛ¤í¬jCÙÈb!Eží‡R†ƒñrpl+P~&¿ôc8q'4öNÆ«š´´~Õ;Z}sÕè(`wéJ’°c ¹¿`Ì@Ï7Q”‰0דª¯”„'¹ÄdV5pá¿ô¸ñÂËÝ;§ï½¡d—>s3´ÀW¢K”Ù“OÈcjô\S{>BnZ'4.—”‘,L’é˜éÒay–ªú=èè=?+&ûÞŽñ$âµ#Ñ h=Mð¸Ã}$aôîæÔóæVFêëûò©‹où 3w?»Òž½‘›xSàZÔª´~`T6§:˜µ)÷Ö©®Ö¬88pácÖkWZy/\j¹;¿Òì¼XRrãöúÙÅJWûÂnÚ¢+qè/¸x‘äÊÃtGéÝkÅË=õ¿Êw»r—ÂmÔ±<®Ö.Äý%ll&ºn ¸ï%Tß÷X>2:Ö"Ô’Ô±š^ ò[uÂJ?àë[ù;Œ;ãa<~·D¥Ti4¼·"J•G‚ní¤‹ÇóÑãÇycC.Žú}=oScì1@ο%’¥Y‰@×9÷ågC’¬õÇe݈hqeVÉù™ÕØxs˜±÷˼R°ëm±Ð„\ÑQùS„øûôXú?7p;‰ª´”QSó/ d ÉØ>ˆëø¹ÙâE„Ël¬“ïÅ^Í´t'Åæ®‚´*Mf!ùa E“ÇôöUU—pÚ“‹âDä3ß:@{Ù,V‚d3V¡Q³X½à§(5´¯ŸŒ!ùäHëžU_fôd{°·Á‰ižÄx!ا–QwÂ}¼HÚÌ2¤ŸïÓZÃn›ðJ*¦Jºe%à/OKs…Í’ï]<ðÍ‘L‡œ>¡Vv½›½!Ž‚]Àí-Væ{öæ­‹Qá¦Ïd:¸¾½È]ºâråQâ5$#ÉiÕߢ2 ‡ìð· ¬²6tâG{dæ³~”²` ‰"¿‘ ŒCøÈîÐ/a&‹N4¾h·¿¥{Tö‘!JX)CÕ'·ÎCp#ð‹â/EËâ]m6C%¿¯_Üt?Oô§ïˆÎÁò`$IX¡}$Wu9úúJÕôETu×Öq°ˆßB—¾ù;RùfKª%ÄjÕÀÎBXùaÄ3-!'jKÁ™¸¼µY£ÎÙ äÚ׈dÓAŒ)œÂ\i7Àš¾.ïEJÐ,h¨ûÁbZ>¾ÿ:hGF(økÄKzÞEÖºJ€­»{bŒ¦ÝŸ´ä^ås.ªçühk ¡½ ö—”Ñé¸ ü­ë±mü&Þí"+9Rö²ɪñU¼hVÁWóÜÞ*ÐΡ3a}Ï“ê粃á̃¦+pG†ûTÎ,S–G®¡ã–|¸~ÈߪáߦŸÖÛ'2h·Ê¬$gw^”-žüsÂÚëåè–æÙ¬€þâ|nµ‰ÀZ—™]3hY Ü4†ûׇZ$àýÝŽûò›3‚MMÊ‹éÙû¦ ØX¯Y’TŸ‰±\¤á cˆÅ/N)4â ¾ý–‰C8&W1€ì{¥ê§íÕEqÕ•Õ­ˆNº§ëO°|ï`»ñËàU6ë¶ßHûî¿ä½5úqýñ½£ÂkÆx^Céc˜ ýšM¯õ£6dÎ;Xžµ‹r›^ôçiß%-ƒh™¡^\ ø¿•¤©‰÷Ÿ 9ç¦|¹YÙçáûfMÖšs«ídKº¹†®§Ä*£È°‚ùn‰w"MY‹KÑ–'«ªb®?ʭɽCúmm{›g5£pœP¸Ù:pË`×å=õÆq¬N6¹w]T¿²ÄˆtçL6ï^æ Ú£põÞp¸T¶° ÓyŸ^ùÞØfß.s „J!ÎȾ«¨ÈzJ¥9àR$wkÐïÛ'~xJHÞ¶ø*«x“ÓZ!ÿΩ𩃞Jå5ÿVÞnÆ kQ²€hÌžñ3Ç}ê<{œ!ýñ}«w;”ˆ¨Ë/9¶ØÕº½OÊ:ò¹BMAd]ˇ¯¬}¬—BéS\~„Òè²Ju‹BS&ÜÔÏ—EOX­¾hÖaX­ˆCŸ“éå%GúËFãáòÔ›Ð>Å^é÷o„÷UŸ=:kÎÚ†r˜²3ëNŽmeu3jªGsð8ß„=¾Ï÷'ÔË ÔÑí±jÓr&GÜ•1Ð6Þ@Ш¥LbcZ³„(ðø‡~IGÓmÑþ¿VuWyJDCð²jˆØLRaÍ÷™ŸlI¤A,M["IK‡—Ec­VÉo·kˆB¯HÖH´K¨÷‘ôŠøWW™{³­ëÅOF8[eY Œ˜w~=4VÝJó¯Ÿî÷R—°k?ãf+ç°~/.ï\W ¡`Ë–Fùœ«AùERÛºEo-GqÐRo¦Ââ¼ò[Ä´Ó—}H_òSO҃ȔIè™V…œ^jïãø]¥ÑÂTÑ› Á\‹A‡UþóV¾®{±‰°k$2Ö›*/"­Ä¨%•âc%P]?ÎO~èvLGò†‡ìÌdœ²Qoy _ IBK i¢õИ¤$Éñs ‡ïôGÚOØÈÏ#Kjö›åDzq[µú(=K¿Å)³‡£ý‚*ûŒ-pÝÛ™¯â"?këŠÙƒ<OÅñ‰6¡S{®¦¼tŽÌXpœŠ:`F²XÕ–¬’¥ÈfþuMÎú/ækx«BFÇ1êÉL uñÁ"A_Oy¨ôA¹Æ¯}ƒú£•ḦÙõÛpîàÅ»Ð!Ë ® ø¨c•yr@’³­HK½¨#B)‹:ätuBÊR+ÔÜ ã“³óÀ ±\Yâ»6ûp²ø¬qþKšó­fúZæ†u Õa@þÄ¥K–Ä:/ïKݲē8½ïV)¤™`¼ÃCŽI†¬} üôÁ&™Üh!E4ÕŠàÝsÄ™ù;f`qÒóY¾v›•ã³f« 3a’ë_È·;­~f‡R€ºqSSôLüé˜)W„Û²… _`¢(Xë3º8Ñ"Nn¸±•·å(©åâ9ÒQjQKvnx´W,aŒ ¥/kÎb4ÏV4Œ¦@ßoÏs-Ïç]”ö³WMÊqœá—C?içH“—#(¾_ý%ª.RZ#ÄÂ`F~íìí#,O4$q+éRðcš*EI™h÷—iЪº´­óNÚý Öœk¢ìŽÜ•M`Ø—»>ûÇ^áÀÏ9áqõ#+ž½EßCãu­´žÄÞkTr™dÇëm÷åÊå?»sÕ¡Ösg/Y|"I~ -÷=WÿÞÃBˆÔqA4ŸÕ½¹Mû\ºóÑÞqp[Rýû Z}P÷ýÚ‘§Œ«i-õ¡C |¾–ZÐ0#€jÃÀßyguÙª&Ž{GÃFÃÑ!¨VüKb{íK§9í‹Ë]AóõæÛþê{…ƒÃÏ—¨„÷˜¸nd!á좣ãø0|mÃ:áqáuÃ(£ƒRaõ%½îH®rÊ7DLMùZYõ25)%éæhºÞ‘=Ä8ÜÐrÌß©%E¤øÛKëÆO6áo~Œþ˜`«Ëí9ÿJ6èé‘Ë×ä¾°gŽardC5Sä•yK:ÓîçFÚ‡U™tcÓQrƒmw;sž"Õc2îi-üή …Ÿ´h÷²;%·ðzƒ¼H#[g43½ alþ¹2Y¦ ×ÄßeJ†·Ä«GðrJ§íŠuáÓ êgr„™m}Û~5ÏÆvFÜõ`XË €ÿ·FˆÞ3S¡7]˜ Ç!tÒäÀœ^ŒIï²¹`ì‘zêDÄbŽ X+ãQâÔ»<ïÆ²Ù¸¸d;¸ìEgqXüo+VN‘X7Ô¢Oç=Ñ™B˜°êàÓd;mŽòKåœaoÐxóQP†”jñ“–ˆô±·ß`9%&z±9·:œÓ¸ùr€éEó*gਧb>ò C¿±Á,¡X$ÊDè“Wé´þ.¨ `‡Õ)/»‰b”çÀ˜»µKâŽÙûkÙoÅÖ«­Ç؇9Žù»[JÐQR¾1Áž”½a±Œv|œ•jl–4ŒàIû T*4{Êm{ #õºx”D„²þ "ü¶¾W×í,(îáÉüöXWËþ§s¶íØ~B]»DkVOðÖ$2–9pI*ì G,¦Æ¹E£¢‰õ0Ó€ó%žæ¶Ò1•eŠ^rŸˆiκðy¡/¦ëoÇ}3›äebZõã1¾Õ6D<è D#Û,©¯m¿¦Ü¨FȾW©¸Es;•éÚ†Ll fc±åyWr%Ö¸É=9T4ò‹3qðû" ·§4ùç#Ð]FÚF’ŠW±·¶6nßwC·ÃÍtÖxº((›©5³i¬ Bتҩùšm+ÛÌ ÎÛ­: Ý F. öœhªõàaY“Ÿ']p–W©xð)ç`ÁA˜'oÚK¹Ò OÁ¢r.¡;Ì÷@ΠZTˆ(Œ7)˜ñˉd‡j~?.Ex{!öq•JÜÆ9jøç^ÅåKŒ„„"Úî—¯[tòr’a|÷–œ»÷ŠY©%›\£T€ãºüR'~¢ù×™Qº(“²=êü Ú÷¡§¸NN®Êúé]59AÔKLãæ"Gðè .£’Eê@jÈÏ·Šá6ÅO“ëﳆ¸B&¼X'éŒ}Îô‹¤É²_«8dEO4FÇ)Öê57c™±Ê¢ŠMúçökî”;§Õ‹ Úr~ /›„:|Ü5 ›·Ô¤?.´xÕ¬]Ç<ÔÉ ß—ÖªêVa³»ÙÊð½ÒwªÝ9}Óz/©¹°I J2šö6ÕPõA7K8Ý’Ý€OZ³%Tàí•à‚ÿÄvqnÑçÕé×Añ}G© G½8ÁÅl$E¹ÎjÕ>Š×#ù91 %uÅÄT·VÝq·}RÙBãb&·=ïbºŠ¸/=@ØëFÅ~Xù¬˜ü¤Cá¥`0Zªøš/ÿyK¼k¥Å/)%þä^z“ãk±5Ëà¢Ë%\‹Ó)ftP`[G=Ò\\?¸dNOi>ñ–Õ;±`]ÕÀì87ß7/¹D¥#5Þ Í=´¼·K홣·ÿD5¡•ÀÎAȨT*Èû-â« ʦS„2´Ÿ‹¹ÑQÁKöàmœ¶&v&9¹WªT¸åyøˆ1Õjѽ)¹B£:ß/ŸõU,!ß‹T§àñó.R'†0| p ·âÒrþó/"‹BPóàèþ]È!É9Áp‰{“Š'ŽçQ­|EÈô¡ï3_ÕÍ_Øg"æ3­Ð°zßJ…UZ)}Jô¯3ãIÞ «–줊éÒmH}K­pé­5!‘À¶ü"Ê£“Ò—ù³µÓŠ~›±¹ÎïôM(Jž³ÆßÂq="–R½ÿqÞcO+¬~ÿZ]¶ºIùÔ6©BÝîšµzm>n™V·”Çx³1qo9iPñÆüf,C¥ò{ãþç]þ›±svwÒIŽô°ò\ÿ/y,vºçø¦–‚»‚½ä»¼ï"I +ÌZr‰ÉˆØt‡êcð³s{ñ–T]ämaFã¢4Õö²ª//˜²9ç[¸Þ›Å ÑhSPm±\ï`•¿ÙBÚetÓ§™ñÛaÏ[« 6Á¸ÕˆC0Å­ó¯`?g¼œ8u¿Ä—¦ È^§®¸Rš™ñŽté6~K»Á¸ŒË½úZî×6¼$õqdïÍíá•úºöæO-Y$8ÿ:7Ç‚Þîlný¤¾èâ¾Ë€›O:E(Á"¨¬#ö ‘ªà¿c±öD*£2€s¾ ùuÅbEú~NM±…‹“™K3]«Í‰¦WË≳Và=dw4ÔyOÕçoè¯ X_[ÑgÛW » ß²j×qŽ7a4Ÿ‘S”ßžŸUqÛŒô×LC8ä6/ò‹ÛÌ¡lž+ãýd€ ƒK"îÝ¡:î-ˆ@â@ä}7g§H”Ì–Ú¦»çÙŒG”ü^ïÌ#gHEñ ܳu „ðŸ1{áA7|“ãB¥¾Ù§±~81rj5‚Û¦ûê´ých” WôoCŒ½3¼õÃØ¨^1LÄlîÜ8ÏF ݵ¸îþ9IÏÃêG¶È(ú˜X¦,T÷*©§÷¡µT·Ù<"% ¼„±a׃{(ºì†9 Âz²e´åu['³ŽM@fTÏýG®²XåaåÿÝò«®Íê¨ÆdÕQ̪A$ˆBócžx]~ÔÈSóq‘$e•»n¬NM«‰©ÇxC]¯×ƒcBƒ=Ch).–¿G‘Á,W¿0§lR:æçUƒzÓ%$¤´Ó4êª3ª'¢‹·ZPZ6Ž=ÉX6ÔJ_¹ü_ÞA«1ß4I¿´:,[ÿ D¥ G 1–þ(“2'+o½âpÔ<¸tšXþ…MzÔs¹%¿M~—. C§ôyžhÎñŠLzì§‹¡ºåj ÔÀ‹Ê:ƒ÷z ÎõñxqÓtñ^£^§véœþƒ"ãê,[¢ú2¨yæË÷– CÜN¿‰J%zŸ˜«O‡üT‡3ÏsŸÍ”j‘¸B§à•˜H1ÉõRÓ7ãw0öZM:3ÚÜÈs¿æË•'sZÐÈnDÁ?Ù¬+%2B×Â< =]ˆ­B´š6oGºt"eðP4_s¸íÆùˆŽ·éML#ÀÖå8KÕüM‘m.s"ásÒO¥§÷;…w“6áB.÷Â>w—*‰EÛŒ·-¹fÙ@å¯8ž=åɬЅH²§Û™GçÈgö*Ç]¶ìAE6°~¤8zï¬xØÓê·£3p½«nµÆ{ ËW¹K ø%–ïîš à~Ñ“ÑÔT}ä›N—S$‡_³ßƒ<Ök î ðãû4òBSpôí«…1ƒQ£y1<ФĆ?ú/¯Ÿ]&£¿!—Yʯ„öþŠ,;óOQp?РºwkbÄž‚Î3™ÝÐëP˪/” kæ3¶¬—{'¼¼Äd+JÃvØPì±FîíâU±rß_÷ßg¼Ë2ƒç H.,1Wb­0szì0Ì ŠPá~÷°Ëƒê\+’}Ë0î}áæ­ÓÙi”3 îéÊò^êíÂÓ­Ýå¹ü Kj×oÞb*wvÿíjAŽ|u7­-ýÊ#…úŽýWG¸ Ä/‰™Ž n…͈OÛÛ”ƒšÜu«;Tl$!¤s$˜óó¯l5r2ö9¬4%"º8|»½ÓBÁÒê%o±…ï†jäKíÞrßÓ0O5 ÃÓ¾Õ*úiz¬»gÊ>œ“㼪w8Åû˰â2‘ÄUIþñtd7E1"ß´F÷ÖI—srŒæ–Íi*|¨t¥¹ÓÌÐÑAW”ÞÛŒ ÂHDËAÉ4÷Ó\VYËÁƒ_f.¶–û%y@\‰ ¤½Šâš\ íÏ#Ã* ;Ö+õöèöþ“Y2Œ Ý&K`L܈ïL‘ïøåºFkêPP;Éùéí€Ä'Ç4?~Ö$KR èÉ$‘ÄHÅð„Ù†9õóz—QJ®ôü𖀯×vоH;:8H?ð.|ÍB  K:ª2Blzûhwçü™¯ÆFEì{•üU;ÃB|¼[˜ºïú«AÁJ*;–òôeã¢Gè(]ÿOE ºö½KáMãR('çÆÇ#Ä$e¤Y‚ù†&í\yNê¨Üo4bY„Eq@Ý HÕZIwŽ2ßìMŠŒõ“ýõa*EÙü[T]IH}zJ¦a›GyµÆ6÷¢Ài©:cgÓAi“>ìÖ;Oðì†Û4«ñ!‹eŠRy'¼²[BsRTÌß§‰ã‹Âs ¦ÁæA]°ºàÍhÍÅ«áôy-‚¬ùLlj’Òóq˜€0b_3”DFìF.uËÄ`$°îá…²‚d~ˆÄú"ŽD´»ÝS5˾#Òð½aâó–¾¶j@˜¨Š_§òœl™\˜Ãã 6 *íÈTjçô—ˆãíx0ïÂ~Qæ¸ÒÅ;á,µWt"ðg‘¤ñ»× &Û^­„Ò:EË* µ×ôŒ&ãû­rÎHz5¼FD K>ÑH$îH‘Ú7õ¥ž`ÕZÔË6ÈËÓ&è»Ü²M’äó²ŠDOúÊk—5ÉÍ®¦xl6 ©:NR®i+Ãn˜Š°#…¶z:®šŸñ;ãCÐV½Sàï.÷*µp†“«ÐTŠG¹«¾jÔñÕ‡3pW‡ ZÊž4Ä”Uë\ú\a«t Jš"ÀžFVÌåÑŠNåHæœp½æùPª:ÀËT˜-ÞÛdƒ l²ûÀq¸žÛÙŠ[»‘­Oa²ÅÌÀý4 ¸JÐu…xàÙG¨¹P{z+§WSÊ¢OÔMçÌAš݉ìí±]„`t›W] ÓNq`fù]‘Öð/<^º&û›ßà©¶S_åñ{tÚédD†‹Ü?_êÔ#“cH¥íÅoÈšÊ:y§ˆ{-J0.©kcC\ÀPŽï´…ã,Ï´¾Æ‰³"éê5ÑÌô– Sí.ÿL?ôxZÍt>GVÞ–ºÅò’…¡ ÜžjŽgÒM|gôN¦îßÁÔ ÁíQÊ]'"ÊýËý« Lù&NvÞO2yñŽAÆí«Ù“ŸÊ½ØO4ß+Õí1£÷©×„ŸÎòZkë%Ý5K¯.'º…Àó¦õQ=[ecBÆ0Df,fA•“…5{ÐÓf.ºO‘Á= r˜¿`Übÿè¹þ˜˜é5¿@eÈ7Æ{õ¹gÈÇ}ØpNUóÚ;­D3[|j&M½½¸§'?Bæ …TB(sºgéšR2ØXf{ñ‰zÂg½¹}Õ4ù ¥C:e!tf\8[œuÅQo©[ÄçÉêtIÃWóBýÒ&j›e@ä—‡w#îh[}ºL%ƒ—ÍñåsÆ(–/Šqxa6Áߦ V»õ2³>ã¨2>Èwe`EtURK£«ÄÔR®ÖÏ Ÿ5Y«¬œ9nx2Õâe_5”ÞóJº_ƒ_¾¿ˆ›q~GéRÒôONj'Zæ Lº0eyý´îò€½'Þáì]r!v#{Æ`°ô 7xŒ­Ôu¢Z¹”~ Ä™qµà8œ6h§¦ã¥¦À°‹‡©[HW:†®ÒC²ŠÈño½§ ò*ÕzC×kÑ3 *,¿y4Ù¤úÇNA „ïjôIC«Ð}¤«‹¾Â!ã2^cöÆ¢¾ú0¦˜Ð†G^ESvªW'GŒÞ#ÁÝ{Ç_èµ€x óCJ Zj®]Žp‰˜Œ—¢eO°A¸#ÙÇÚ¢wB¨÷ 8~¯ öÑhD²cJ8· <Ý‚g¹rôx³Œ!# ™¾ t¾ZÉ0¸âЫ4´á‹œ™¤)}=9) =íð¿—(šð<¹Ô_kMQðGíÎÚcÃ<,å«ò˜‡û%)-x¶ eÅHðÈr/²€?éÒîlk #É»ð¼9¾v’ЮÛ0¥•š_Ï@«~)”ñ{%"z^Ô)kÃ¥„aŠ]¬ï¿àF„Hæ}ôpVÏ8\AÉ4„{` Њf­(n„*_æüUÁ:ôxJoØ%ák†'ZøÖ¦¾¸¦šr£SÊCkW)«3Ð Ó˜^³iFZÎ5¹#C;².4¼¡Ø¥+²ç°œjú¤¾=ûûº¦¼ÿá›Y:‰-f´—iÈaùèߪMÄÈ"<¿]ŽÚ^,++G³Qn›‡3¸ü—¢mäôT{õñ=ƒþÒE“óÏðXHÞ`óÝÿ»¼¤+T²Ï endstream endobj 104 0 obj << /Producer (pdfTeX-1.40.18) /Creator (TeX) /CreationDate (D:20200428101447+12'00') /ModDate (D:20200428101447+12'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj 12 0 obj << /Type /ObjStm /N 74 /First 586 /Length 2984 /Filter /FlateDecode >> stream xÚíZ[sÛ6~ׯÀc3;ˆ;°“éLlÇIÖqnv“îfü@K´ÌFW”Ò´¿~¿PEI‰e»Û‡íŒEƒÀÁ9ç;7$%˘`Á1a™”ž Ï”Ä]`Úh&3f3Æ0a˜ó‚IÃ|0 Ä!èŽ L(ð‘™bJà¿”Lj&´7ü7Á2¥ Ó˜;/Ø nó‚ LHs¾£ÄyÇ´$},ÓŽIåÓPC;É )à PƤuÐZ:ë '4²–Ïdpøï ’3 QÀ,T”ÐÃfP%hf¡Š•ŠaвJ2°P–æÑ=“J‡0‘ |;PA7#•„ȘÓP5ýŜg`¡ƒ=TÊ]FÁŽ€h‚´ÌgÌJ€tk•èx¨´`ÆèNg¸dlÉš@ż1LèAH.ó|B Œ$2¢±ªƒ{ã[Œ€ À ÌháL4™Æ<¸<3ŽŒˆ†% 84óDOfAûŽ vF@ÁEK”’¼n‰‚•'O:üü÷›‚ñ·ù èðÃÉxVŒgS±÷þ¾¨&ói¯¨o±ã´è—ùÁä+û”¡ÃÓ…#™×¢ëÃE\¦˜ÎDšþãQÀ1˜²'O?FühAÁjê&¢ÇÖM¸¢n‘UMiÑ´d„ºí-µ!‡¿NzgÅŒ}”£cÆÏ‹¯3v±Pa+Fá6@š»£<œù¬œŒòYÁ~8ú§Ìd–iéáB¸ì˜Nú;ÇÎËÙ#ïÙói~s]ö*öf>»™ÏE`ýy¯˜Ò¨êÚ®zTËšP×£u„dê?›_Îâ-uŠhLvøA^ÑüE1üRÌÊ^ÞáÏÆ½I¿¨dÔ€>ñ—‡‡DÜGBSçECÈ‚>±[ÎæËñÓqU®†Ê««¦"Ó~B òQ9žW,Xþë|2+†ÅÕŒê ïO€¾ªJ>˜æ_ ž÷泂÷Êio>º_ù¬ö >Ê{Óɘ_N Ð`JÞëÁ ¼_BDUV¼;žÌúÅŸB6ïÁƒÃa¾ì¼žùt>æóŸ &ãâ3ïåįºÉ{ÅÅf¬6BqkÐ5â–âïç7—¿½4÷å9¦ïšÒ¶CSêÿëÐTÛBSýšß M~lã2±»¨n/quŸàU¦¼J=ÄêÑÛ0Aöß]5÷šÛѼ¡ãÖ%®á¯Ê;‚ÐbDxhÛ—ìÆ:Ý´{ãÑmÏTœ)cœÂÇ!ÎR ~ifÍ[ÆZ§—¼‰Š^˜e™]Þ˜àׯ·VwÄF+So™RK"ÌšãqF죒çã½õÜ%US1à”'uSc´l`ëF‰s’¶ndE¯ É€NPxÇEÈÐyŠ6ŽSUš]·Á•Â(£À²4;Q¦k0qiôÔ$¾ŽÄg·´›=‰³Îl\ VméhájÒÔsS¬a©Ç9«XœÛäi4¤%9-ÁzEG¢Ø¾hWŽŠª7-of“i:w¤ÃÊÑ›÷ç¯ßýãðôàg‘a`˜*¦›'“Ç8?–T…¥7ŽtnyZÑóaZ´q†Èo^åàzF{jœŠ4öXÐàËY>,{OǃaÁÀþlVŒ>€F~®'¡D¥so~à}>à%Ÿ>J—˜çåöó×v@_œ¿=M€ä@Š z…PvzÊŸñçü%ÍÏxÎ/y €¼Ì!ñ1Ÿð>åŸñ9ÿ]ƒ®÷þîÙá»Ãúû]®ÔYíÊ,ûru+ä¶ \‰uàüˆGð¯ø)ÃßÂçü'þ¬MÑ› 'c\G£<š%2âWü %þ¾ü Çàh®ëßo®‹1¬ö ÿ\[n\Ž ˜o‚ë ¿¡g'ôÞ#µ¦‘ÕM1-'}þkz+’úÈÖU1*“ðªø®Uù•Wüº†f×Ó¢à³ß&ðÇòÿÿÁÿ(¦“5ר}\stþöÅùëèšA‰¢ƒ2xÿ0ž1ßðÌ)|‘×v_X‘1߀ë÷ûáÕ³ã—o#\·®J‘4 ··†kvÀ5ª 7kÂ¥ü;CÐåk¹÷ñá®g\Èöʸ'¯ÎO€óìÕùù®¤“”tÀkês° ¨B¬A¥Û%T)å:ÔÇáVIw¼”t/tï[ w™÷>§(¿œæ½ø’0µRbô–™ØŸ ‡ù”Bã×y>äÅ×Þ0Q^RFø€Þ‘ÓfR9½fLY9]ÓªŒo•›7Ãy•Ò³9¬““RrG"¶â2ìµ8¼~s|þüùël—·¬¨3P…üF`Òí-òÐùKC3,±°-‚/k÷ZN>žþTCÜQj°O¥†¾2þþí·!®Ù«l>}wþü?Oæüå.)³ØH}ŸÂù˜6%u~ùùEÉ1Œ•£âó5\{ÕÇwÿ:ùpBËÁSÑ0ê^Eã¶ õa£nü+.ׯ±D¬×¼ê•eú^`÷Ú ÆÕÚÚ½¥\¤5|U2h!ß³nК^TôYH»zÜwiÇîèVOüEó£öFzÍ÷8§î«gõÒxX·ÄõÓzg÷—ÞÞõ¶¤›¶tÚ¬„Ël%<ì/¼µïlÉvÈÅšl¹’íï`öõUKvh˦êÔ0º[Êöwpyk—³.;ˆ ›‡6÷â6ߨy´ÄoœRkâÍÊìfñí…´%|#Þܚυ_ wû o/q-áî›ÂéH·­ö—Ý^‘Z²7.¸çäœÞZ6Ö…ÓǸmŸ¯…»l@ß²§ —ؽŞÓ2³úœ&«¿Ÿ8)ûûoèÃmú'Ó'°*}+¨Ò«g¥¯ÚîÀ\§ï¶tbdÒ»n“¸›ô6ÛÊïq§˜HìDÍÎl™r˜c™œ :iîRÐü‹rÃÐ endstream endobj 105 0 obj << /Type /XRef /Index [0 106] /Size 106 /W [1 3 1] /Root 103 0 R /Info 104 0 R /ID [ ] /Length 292 /Filter /FlateDecode >> stream xÚÏI/ƒQàs>SÑÉ5ÓªÆN(]XˆDÔ®‹.YUb%K {;‰ÒÒà'Hê;ïæÉ9ï{so.´ÀO!(D^Šœ(‰Q'tnRv¸L-õ‡ð=[í¢Ktá¶÷†ûdÛ€ð‘«G¢Wô‰~á'’o¶ ‰ ‘ŽYa"[³:$‰|Îêˆ&*—VOŘ%.®lv,&Ä8Qý±YDLµW«³"&¢D½h³„˜qâîËûLãÑÓbF¸ÄCÆfI1'æÅ‚XKbY¬ˆU±&R"-Ö½[þì– âýÜÒ&Ѽ¶´EÆ–2d)ji›¬ß[Ê’Ÿ-K;d³ai—l}[Ú£ø°´/ÎD…NÕÛ2þZW(Å endstream endobj startxref 157254 %%EOF gridSVG/inst/js/0000755000176200001440000000000012616240500013144 5ustar liggesusersgridSVG/inst/js/utils.js0000654000176200001440000004447512171060447014667 0ustar liggesusers// Note that this code is documented using JSDoc and guided by the following URLs: // http://code.google.com/p/jsdoc-toolkit/wiki/TagReference // https://developers.google.com/closure/compiler/docs/js-for-compiler // NOTE: The following code assumes that a global object, "gridSVGCoords" // is available. In other words, to use this code, load this object first. /** * Returns a unit's x location relative to a viewport. * * @param {string} vpname The name of the viewport that the unit is drawn within * @param {number} x The size of the unit, based on 'from' * @param {string} from The input unit type * @param {string} to The output unit type (optional, defaults to "svg") * @returns {number} A unit in SVG pixels */ var viewportConvertX = function(vpname, x, from, to) { if (gridSVGCoords[vpname].angle != 0) throw new Error("Viewport angle non-zero; consider using viewportConvertPos()"); if (!to) to = "svg"; if (from === "svg") x -= gridSVGCoords[vpname].x; var width = convertx(vpname, x, from, to, true); if (to === "svg") width += gridSVGCoords[vpname].x; return roundNumber(width, 2); }; /** * Returns a unit's y location relative to a viewport. * * @param {string} vpname The name of the viewport that the unit is drawn within * @param {number} x The size of the unit, based on 'from' * @param {string} from The input unit type * @param {string} to The output unit type (optional, defaults to "svg") * @returns {number} A unit in SVG pixels */ var viewportConvertY = function(vpname, x, from, to) { if (gridSVGCoords[vpname].angle != 0) throw new Error("Viewport angle non-zero; consider using viewportConvertPos()"); if (!to) to = "svg"; if (from == "svg") x -= gridSVGCoords[vpname].y; var height = converty(vpname, x, from, to, true); if (to === "svg") height += gridSVGCoords[vpname].y; return roundNumber(height, 2); }; /** * Returns a unit's (x, y) location relative to a viewport. * * @param {string} vpname The name of the viewport that the unit is drawn within * @param {number} x The size of the x unit, based on 'from' * @param {number} y The size of the y unit, based on 'from' * @param {string} from The input unit type * @param {string} to The output unit type (optional, defaults to "svg") * @returns {Array} The converted location in SVG pixels */ var viewportConvertPos = function(vpname, x, y, from, to) { if (!to) to = "svg"; if (from == "svg") { x -= gridSVGCoords[vpname].x; y -= gridSVGCoords[vpname].y; } var width = convertx(vpname, x, from, to, true); var height = converty(vpname, y, from, to, true); if (gridSVGCoords[vpname].angle != 0) { var theta = -gridSVGCoords[vpname].angle/180*Math.PI; w = Math.cos(theta)*width + Math.sin(theta)*height; h = -Math.sin(theta)*width + Math.cos(theta)*height; width = w; height = h; } if (to === "svg") { width += gridSVGCoords[vpname].x; height += gridSVGCoords[vpname].y; } var result = {x: width, y: height}; return result; }; /* * Helper functions */ convertx = function(vpname, x, from, to, loc) { var i = toInches(from, x, gridSVGCoords[vpname].width, gridSVGCoords[vpname].xscale, gridSVGCoords[vpname].inch, loc); var u = toUnit(to, i, gridSVGCoords[vpname].width, gridSVGCoords[vpname].xscale, gridSVGCoords[vpname].inch, loc); return u; } converty = function(vpname, x, from, to, loc) { var i = toInches(from, x, gridSVGCoords[vpname].height, gridSVGCoords[vpname].yscale, gridSVGCoords[vpname].inch, loc); var u = toUnit(to, i, gridSVGCoords[vpname].height, gridSVGCoords[vpname].yscale, gridSVGCoords[vpname].inch, loc); return u; } /** * Converts from any unit to any other unit along the both dimensions, relative to a viewport. * * @param {string} vpname The name of the viewport that the unit is drawn within * @param {number} w The size of the horizontal unit, based on 'from' * @param {number} h The size of the vertical unit, based on 'from' * @param {string} from The input unit type * @param {string} to The output unit type * @returns {Array} A unit in SVG pixels */ var viewportConvertWidth = function(vpname, x, from, to) { return convertx(vpname, x, from, to, false); }; /** * Converts from any unit to any other unit along the vertical dimension, relative to a viewport. * * @param {string} vpname The name of the viewport that the unit is drawn within * @param {number} x The size of the unit, based on 'from' * @param {string} from The input unit type * @param {string} to The output unit type * @returns {number} A unit in SVG pixels */ var viewportConvertHeight = function(vpname, x, from, to) { return converty(vpname, x, from, to, false); }; /** * Converts from any unit to any other unit along the vertical dimension, relative to a viewport. * * @param {string} vpname The name of the viewport that the unit is drawn within * @param {number} x The size of the unit, based on 'from' * @param {string} from The input unit type * @param {string} to The output unit type * @returns {Array} The converted dimensions in SVG pixels */ viewportConvertDim = function(vpname, w, h, from, to) { var wi = toInches(from, w, gridSVGCoords[vpname].width, gridSVGCoords[vpname].xscale, gridSVGCoords[vpname].inch, false); var hi = toInches(from, h, gridSVGCoords[vpname].height, gridSVGCoords[vpname].yscale, gridSVGCoords[vpname].inch, false); if (gridSVGCoords[vpname].angle != 0) { var theta = -gridSVGCoords[vpname].angle/180*Math.PI; var w = Math.cos(theta)*wi + Math.sin(theta)*hi; var h = -Math.sin(theta)*wi + Math.cos(theta)*hi; wi = w; hi = h; } var wu = toUnit(to, wi, gridSVGCoords[vpname].width, gridSVGCoords[vpname].xscale, gridSVGCoords[vpname].inch, false); var hu = toUnit(to, hi, gridSVGCoords[vpname].height, gridSVGCoords[vpname].yscale, gridSVGCoords[vpname].inch, false); var result = {w: wu, h: hu}; return result; } /** * Converts from any unit to what R thought were inches. * * @param {string} from The input unit type * @param {number} unitValue The size of the unit, based on 'from' * @param {number} vpDimSize The size of the viewport that the unit belongs in, in SVG pixels * @param {Array.} nativeScale For the given dimension that we're converting along (x or y) * @param {number} dimInchSize The size of an inch along this dimension * @param {boolean} loc Is the conversion for a location (or a dimension)? * @returns {number} The input unit in inches */ var toInches = function(from, unitValue, vpDimSize, nativeScale, dimInchSize, loc) { var nativeToInches = function(nativeValue, nativeScale, vpDimSize, dimInchSize, loc) { var dist; if (loc) { dist = nativeValue - nativeScale[0]; } else { dist = nativeValue; } var nativeUnitSize = vpDimSize / Math.abs(nativeScale[1] - nativeScale[0]); return dist * nativeUnitSize / dimInchSize; }; var npcToInches = function(npcValue, vpDimSize, dimInchSize) { return (npcValue * vpDimSize) / dimInchSize; }; var result; switch (from) { case "native": result = nativeToInches(unitValue, nativeScale, vpDimSize, dimInchSize, loc); break; case "npc": result = npcToInches(unitValue, vpDimSize, dimInchSize); break; case "inches": result = unitValue; break; case "cm": result = unitValue / 2.54; break; case "mm": result = unitValue / 25.4; break; case "points": result = unitValue / 72.27; break; case "picas": result = (unitValue * 12) / 72.27; break; case "bigpts": result = unitValue / 72; break; case "dida": result = unitValue / 1157 * 1238 / 72.27; break; case "cicero": result = unitValue * 12 / 1157 * 1238 / 72.27; break; case "scaledpts": result = unitValue / 65536 / 72.27; break; case "svg": result = unitValue / dimInchSize; break; default: console.error('Unsupported "from" unit: [%s]', from); } return result; }; /** * Converts from what R thought were inches, to another unit. * * @param {string} to The desired output unit * @param {number} unitValue The source size in inches to be converted to another unit * @param {number} vpDimSize The size of the viewport that the unit belongs in, in SVG pixels * @param {Array.} nativeScale For the given dimension that we're converting along (x or y) * @param {number} dimInchSize The size of an inch along this dimension * @param {boolean} loc Is the conversion for a location (or a dimension)? * @returns {number} The input unit in 'to' units */ var toUnit = function(to, unitValue, vpDimSize, nativeScale, dimInchSize, loc) { var inchesToNative = function(inchesValue, nativeScale, vpDimSize, dimInchSize, loc) { var npc = (inchesValue * dimInchSize) / vpDimSize; var vpRange = nativeScale[1] - nativeScale[0]; if (loc) { return (npc * vpRange) + nativeScale[0]; } else { return (npc * vpRange); } }; var inchesToNpc = function(inchesValue, vpDimSize, dimInchSize) { return (inchesValue * dimInchSize) / vpDimSize; }; var result; switch (to) { case "native": result = inchesToNative(unitValue, nativeScale, vpDimSize, dimInchSize, loc); break; case "npc": result = inchesToNpc(unitValue, vpDimSize, dimInchSize); break; case "inches": result = unitValue; break; case "cm": result = unitValue * 2.54; break; case "mm": result = unitValue * 25.4; break; case "points": result = unitValue * 72.27; break; case "picas": result = (unitValue / 12) * 72.27; break; case "bigpts": result = unitValue * 72; break; case "dida": result = unitValue * 1157 / 1238 * 72.27; break; case "cicero": result = unitValue / 12 * 1157 / 1238 * 72.27; break; case "scaledpts": result = unitValue * 65536 * 72.27; break; case "svg": result = unitValue * dimInchSize; break; default: console.error('Unsupported "to" unit: [%s]', to); } return result; }; /** * Rounds a number to a specified amount of decimal places * * @param {number} number The input number to round * @param {number} digits The number of decimal places to round to * @returns {number} The rounded number */ var roundNumber = function(number, digits) { var multiple = Math.pow(10, digits); var rounded = Math.round(number * multiple) / multiple; return rounded; }; /** * Returns the name of the viewport path that a grob belongs to. * * Note that this is going to find the first matching viewport path from * the list of element IDs up the tree. It may end up incorrectly returning * a grob name instead of a viewport path in the case where a grob has the * same name as a viewport path. * * @param {string} grobName The name of a grob * @returns {string} The unique path of the viewport that the grob belongs to */ var grobViewport = function(grobName) { var grob = document.getElementById(grobName); if (grob) { var foundViewport = false; var viewportPath; var grobParent = grob.parentNode; while (! foundViewport) { var vpPath = grob.getAttribute("id"); var testVP = gridSVGCoords[vpPath]; // If we have found a match in our VP coordinate list we // have a candidate viewport path, but a grob might have // the same name as a viewport path... if (testVP) { viewportPath = vpPath; foundViewport = true; } else { grob = grobParent; grobParent = grob.parentNode; } } return viewportPath; } else { console.error("Unable to find grob [%s]", grobName); } }; /** * Removes any empty text nodes from an XML tree. * * Often when we create XML, we use indentation to make the structure of * the XML document more obvious to someone who reads it. * * This is a good idea in general, but it makes parsing the DOM a bit * more challenging. Consider the following example: * * : * : * : * * We would expect the node to have one child, when it in fact has * *three* child nodes. A text node, a rect node and a text node. This * goes against intuition so we would ideally like it so that only the * nodes that contain elements, such as the rect node, remain. This is * the purpose of this function. * * @param {Object} node An XML tree that we wish to prune */ var pruneTextNodes = function(node) { var blank = /^\s*$/; var child, next; switch (node.nodeType) { case 3: // Text node if (blank.test(node.nodeValue)) { node.parentNode.removeChild(node); } break; case 1: // Element node case 9: // Document node child = node.firstChild; while (child) { next = child.nextSibling; pruneTextNodes(child); child = next; } break; } }; /** * Removes the numeric suffix from a viewport path. * * This function is useful in the case where we have a viewport path * because these paths are required to be unique. The reason for this is * because a viewport path can be used more than once. * * @param {string} vppath The modified and unique viewport path produced by gridSVG * @returns {string} The canonical viewport path, as known to grid */ var baseViewportPath = function(vppath) { var splitPath = vppath.split("."); // If there was actually something to split, get rid of the last value if (splitPath.length > 1) { splitPath.pop(); } return splitPath.join("."); }; /** * Escapes the colons present in a viewport path for use in selectors. * * Because the colon is a special character in CSS selectors, escape the * viewport path using this function first to ensure that the selector * will work as expected. * * @param {string} vppath The viewport path to escape. * @returns {string} An escaped viewport path, safe for use as a selector */ var escapeViewportPath = function(vppath) { return vppath.replace(/:/g, "\\:"); } /** * Creates a URL for a GET/POST request. Automatically inserts separators * such as ?, & and =. * * @param {string} loc The location of the script to query. * @param {Object} params An object with keys representing GET/POST params, * and associated with their values. * @returns {string} The complete URL to request with. */ var queryBuilder = function(loc, params) { if (!params) return loc; var query = []; for (var k in params) query.push(encodeURIComponent(k) + "=" + encodeURIComponent(params[k])); var queryText = query.join("&"); // If params is an object of length 0 we end up with "" if (!queryText) return loc; return loc + "?" + queryText; } // NOTE: The following code assumes that a global object, "gridSVGMappings" // is available. In other words, to use this code, load this object first. /** * Returns the mapping from a known grob/viewport name to an SVG ID. * Assumes the variable 'gridSVGMappings' is in scope. * * @param {string} name The name of the object whose ID we are getting. * @param {string} type One of 'vp', 'grob' or 'ref'. Determines whether the name refers to a viewport or a grob or a reference to a defined object. * @param {string?} result One of 'id', 'selector' or 'xpath'. Determines the type of results we want back, i.e. SVG IDs, CSS selectors or XPath expressions. * @returns {Array} An array of values. * */ var getSVGMappings = function(name, type, result) { if (type !== "vp" && type !== "grob" && type !== "ref") { throw new Error("Invalid type specified. Must be one of 'vp', 'grob' or 'ref'."); } // Assume we want an ID by default, and not a selector/xpath if (! result) { result = "id"; } type = type + "s"; var obj = gridSVGMappings[type][name]; if (! obj) { throw new Error("Name not found in mapping table."); } if (result === "id") { // Force suffix to be an array of suffixes because RJSONIO reduces // vectors to scalars if length(vec) == 1 var suffix = obj.suffix; if (typeof suffix === "number") { suffix = [suffix]; } var ids = []; for (var i = 0; i < suffix.length; i++) { ids.push(gridSVGMappings.prefix + name + gridSVGMappings["id.sep"] + suffix[i]); } return ids; } if (result === "selector" || result === "xpath") { // Force results to be an array of results because RJSONIO reduces // vectors to scalars if length(vec) == 1 var vals = obj[result]; if (typeof vals === "string") { vals = [vals]; } return vals; } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/inst/svg/�����������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�12616254462�013343� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/inst/svg/genAttrTable.txt�������������������������������������������������������������������0000654�0001762�0000144�00000063315�12616254456�016474� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������accent-height font-face accumulate animate accumulate animateColor accumulate animateMotion accumulate animateTransform additive animate additive animateColor additive animateMotion additive animateTransform alphabetic font-face amplitude feFuncA amplitude feFuncB amplitude feFuncG amplitude feFuncR arabic-form glyph ascent font-face attributeName animate attributeName animateColor attributeName animateTransform attributeName set attributeType animate attributeType animateColor attributeType animateTransform attributeType set azimuth feDistantLight baseFrequency feTurbulence baseProfile svg bbox font-face begin animate begin animateColor begin animateMotion begin animateTransform begin set bias feConvolveMatrix by animate by animateColor by animateMotion by animateTransform calcMode animate calcMode animateColor calcMode animateMotion calcMode animateTransform cap-height font-face class a class altGlyph class circle class clipPath class defs class desc class ellipse class feBlend class feColorMatrix class feComponentTransfer class feComposite class feConvolveMatrix class feDiffuseLighting class feDisplacementMap class feFlood class feGaussianBlur class feImage class feMerge class feMorphology class feOffset class feSpecularLighting class feTile class feTurbulence class filter class font class foreignObject class g class glyph class glyphRef class image class line class linearGradient class marker class mask class missing-glyph class path class pattern class polygon class polyline class radialGradient class rect class stop class svg class switch class symbol class text class textPath class title class tref class tspan class use clipPathUnits clipPath contentScriptType svg contentStyleType svg cx circle cx ellipse cx radialGradient cy circle cy ellipse cy radialGradient d path d glyph d missing-glyph descent font-face diffuseConstant feDiffuseLighting divisor feConvolveMatrix dur animate dur animateColor dur animateMotion dur animateTransform dur set dx altGlyph dx feOffset dx glyphRef dx text dx tref dx tspan dy altGlyph dy feOffset dy glyphRef dy text dy tref dy tspan edgeMode feConvolveMatrix elevation feDistantLight end animate end animateColor end animateMotion end animateTransform end set exponent feFuncA exponent feFuncB exponent feFuncG exponent feFuncR externalResourcesRequired a externalResourcesRequired altGlyph externalResourcesRequired animate externalResourcesRequired animateColor externalResourcesRequired animateMotion externalResourcesRequired animateTransform externalResourcesRequired circle externalResourcesRequired clipPath externalResourcesRequired cursor externalResourcesRequired defs externalResourcesRequired ellipse externalResourcesRequired feImage externalResourcesRequired filter externalResourcesRequired font externalResourcesRequired foreignObject externalResourcesRequired g externalResourcesRequired image externalResourcesRequired line externalResourcesRequired linearGradient externalResourcesRequired marker externalResourcesRequired mask externalResourcesRequired mpath externalResourcesRequired path externalResourcesRequired pattern externalResourcesRequired polygon externalResourcesRequired polyline externalResourcesRequired radialGradient externalResourcesRequired rect externalResourcesRequired script externalResourcesRequired set externalResourcesRequired svg externalResourcesRequired switch externalResourcesRequired symbol externalResourcesRequired text externalResourcesRequired textPath externalResourcesRequired tref externalResourcesRequired tspan externalResourcesRequired use externalResourcesRequired view fill animate fill animateColor fill animateMotion fill animateTransform fill set filterRes filter filterUnits filter font-family font-face font-size font-face font-stretch font-face font-style font-face font-variant font-face font-weight font-face format altGlyph format glyphRef from animate from animateColor from animateMotion from animateTransform fx radialGradient fy radialGradient g1 hkern g1 vkern g2 hkern g2 vkern glyph-name glyph glyphRef altGlyph glyphRef glyphRef gradientTransform linearGradient gradientTransform radialGradient gradientUnits linearGradient gradientUnits radialGradient hanging font-face height filter height foreignObject height image height pattern height rect height svg height use height feBlend height feColorMatrix height feComponentTransfer height feComposite height feConvolveMatrix height feDiffuseLighting height feDisplacementMap height feFlood height feGaussianBlur height feImage height feMerge height feMorphology height feOffset height feSpecularLighting height feTile height feTurbulence height mask horiz-adv-x font horiz-adv-x glyph horiz-adv-x missing-glyph horiz-origin-x font horiz-origin-y font id a id altGlyph id altGlyphDef id altGlyphItem id animate id animateColor id animateMotion id animateTransform id circle id clipPath id color-profile id cursor id defs id desc id ellipse id feBlend id feColorMatrix id feComponentTransfer id feComposite id feConvolveMatrix id feDiffuseLighting id feDisplacementMap id feDistantLight id feFlood id feFuncA id feFuncB id feFuncG id feFuncR id feGaussianBlur id feImage id feMerge id feMergeNode id feMorphology id feOffset id fePointLight id feSpecularLighting id feSpotLight id feTile id feTurbulence id filter id font id font-face id font-face-format id font-face-name id font-face-src id font-face-uri id foreignObject id g id glyph id glyphRef id hkern id image id line id linearGradient id marker id mask id metadata id missing-glyph id mpath id path id pattern id polygon id polyline id radialGradient id rect id script id set id stop id style id svg id switch id symbol id text id textPath id title id tref id tspan id use id view id vkern ideographic font-face in feBlend in feColorMatrix in feComponentTransfer in feComposite in feConvolveMatrix in feDiffuseLighting in feDisplacementMap in feGaussianBlur in feMorphology in feOffset in feSpecularLighting in feTile in2 feBlend in2 feComposite in2 feDisplacementMap intercept feFuncA intercept feFuncB intercept feFuncG intercept feFuncR k hkern k vkern k1 feComposite k2 feComposite k3 feComposite k4 feComposite kernelMatrix feConvolveMatrix kernelUnitLength feConvolveMatrix kernelUnitLength feDiffuseLighting kernelUnitLength feSpecularLighting keyPoints animateMotion keySplines animate keySplines animateColor keySplines animateMotion keySplines animateTransform keyTimes animate keyTimes animateColor keyTimes animateMotion keyTimes animateTransform lang glyph lengthAdjust text lengthAdjust textPath lengthAdjust tref lengthAdjust tspan limitingConeAngle feSpotLight local color-profile markerHeight marker markerUnits marker markerWidth marker maskContentUnits mask maskUnits mask mathematical font-face max animate max animateColor max animateMotion max animateTransform max set media style method textPath min animate min animateColor min animateMotion min animateTransform min set mode feBlend name color-profile name font-face-name numOctaves feTurbulence offset stop offset feFuncA offset feFuncB offset feFuncG offset feFuncR onabort svg onactivate a onactivate altGlyph onactivate circle onactivate defs onactivate ellipse onactivate foreignObject onactivate g onactivate image onactivate line onactivate path onactivate polygon onactivate polyline onactivate rect onactivate svg onactivate switch onactivate symbol onactivate text onactivate textPath onactivate tref onactivate tspan onactivate use onbegin animate onbegin animateColor onbegin animateMotion onbegin animateTransform onbegin set onclick a onclick altGlyph onclick circle onclick defs onclick ellipse onclick foreignObject onclick g onclick image onclick line onclick path onclick polygon onclick polyline onclick rect onclick svg onclick switch onclick symbol onclick text onclick textPath onclick tref onclick tspan onclick use onend animate onend animateColor onend animateMotion onend animateTransform onend set onerror svg onfocusin a onfocusin altGlyph onfocusin circle onfocusin defs onfocusin ellipse onfocusin foreignObject onfocusin g onfocusin image onfocusin line onfocusin path onfocusin polygon onfocusin polyline onfocusin rect onfocusin svg onfocusin switch onfocusin symbol onfocusin text onfocusin textPath onfocusin tref onfocusin tspan onfocusin use onfocusout a onfocusout altGlyph onfocusout circle onfocusout defs onfocusout ellipse onfocusout foreignObject onfocusout g onfocusout image onfocusout line onfocusout path onfocusout polygon onfocusout polyline onfocusout rect onfocusout svg onfocusout switch onfocusout symbol onfocusout text onfocusout textPath onfocusout tref onfocusout tspan onfocusout use onload a onload altGlyph onload circle onload defs onload ellipse onload foreignObject onload g onload image onload line onload path onload polygon onload polyline onload rect onload svg onload switch onload symbol onload text onload textPath onload tref onload tspan onload use onload animate onload animateColor onload animateMotion onload animateTransform onload set onmousedown a onmousedown altGlyph onmousedown circle onmousedown defs onmousedown ellipse onmousedown foreignObject onmousedown g onmousedown image onmousedown line onmousedown path onmousedown polygon onmousedown polyline onmousedown rect onmousedown svg onmousedown switch onmousedown symbol onmousedown text onmousedown textPath onmousedown tref onmousedown tspan onmousedown use onmousemove a onmousemove altGlyph onmousemove circle onmousemove defs onmousemove ellipse onmousemove foreignObject onmousemove g onmousemove image onmousemove line onmousemove path onmousemove polygon onmousemove polyline onmousemove rect onmousemove svg onmousemove switch onmousemove symbol onmousemove text onmousemove textPath onmousemove tref onmousemove tspan onmousemove use onmouseout a onmouseout altGlyph onmouseout circle onmouseout defs onmouseout ellipse onmouseout foreignObject onmouseout g onmouseout image onmouseout line onmouseout path onmouseout polygon onmouseout polyline onmouseout rect onmouseout svg onmouseout switch onmouseout symbol onmouseout text onmouseout textPath onmouseout tref onmouseout tspan onmouseout use onmouseover a onmouseover altGlyph onmouseover circle onmouseover defs onmouseover ellipse onmouseover foreignObject onmouseover g onmouseover image onmouseover line onmouseover path onmouseover polygon onmouseover polyline onmouseover rect onmouseover svg onmouseover switch onmouseover symbol onmouseover text onmouseover textPath onmouseover tref onmouseover tspan onmouseover use onmouseup a onmouseup altGlyph onmouseup circle onmouseup defs onmouseup ellipse onmouseup foreignObject onmouseup g onmouseup image onmouseup line onmouseup path onmouseup polygon onmouseup polyline onmouseup rect onmouseup svg onmouseup switch onmouseup symbol onmouseup text onmouseup textPath onmouseup tref onmouseup tspan onmouseup use onrepeat animate onrepeat animateColor onrepeat animateMotion onrepeat animateTransform onrepeat set onresize svg onscroll svg onunload svg onzoom svg operator feComposite operator feMorphology order feConvolveMatrix orient marker orientation glyph origin animateMotion overline-position font-face overline-thickness font-face panose-1 font-face path animateMotion pathLength path patternContentUnits pattern patternTransform pattern patternUnits pattern points polygon points polyline pointsAtX feSpotLight pointsAtY feSpotLight pointsAtZ feSpotLight preserveAlpha feConvolveMatrix preserveAspectRatio feImage preserveAspectRatio image preserveAspectRatio marker preserveAspectRatio pattern preserveAspectRatio svg preserveAspectRatio symbol preserveAspectRatio view primitiveUnits filter r circle r radialGradient radius feMorphology refX marker refY marker rendering-intent color-profile repeatCount animate repeatCount animateColor repeatCount animateMotion repeatCount animateTransform repeatCount set repeatDur animate repeatDur animateColor repeatDur animateMotion repeatDur animateTransform repeatDur set requiredExtensions a requiredExtensions altGlyph requiredExtensions animate requiredExtensions animateColor requiredExtensions animateMotion requiredExtensions animateTransform requiredExtensions circle requiredExtensions clipPath requiredExtensions cursor requiredExtensions defs requiredExtensions ellipse requiredExtensions foreignObject requiredExtensions g requiredExtensions image requiredExtensions line requiredExtensions mask requiredExtensions path requiredExtensions pattern requiredExtensions polygon requiredExtensions polyline requiredExtensions rect requiredExtensions set requiredExtensions svg requiredExtensions switch requiredExtensions text requiredExtensions textPath requiredExtensions tref requiredExtensions tspan requiredExtensions use requiredFeatures a requiredFeatures altGlyph requiredFeatures animate requiredFeatures animateColor requiredFeatures animateMotion requiredFeatures animateTransform requiredFeatures circle requiredFeatures clipPath requiredFeatures cursor requiredFeatures defs requiredFeatures ellipse requiredFeatures foreignObject requiredFeatures g requiredFeatures image requiredFeatures line requiredFeatures mask requiredFeatures path requiredFeatures pattern requiredFeatures polygon requiredFeatures polyline requiredFeatures rect requiredFeatures set requiredFeatures svg requiredFeatures switch requiredFeatures text requiredFeatures textPath requiredFeatures tref requiredFeatures tspan requiredFeatures use restart animate restart animateColor restart animateMotion restart animateTransform restart set result feBlend result feColorMatrix result feComponentTransfer result feComposite result feConvolveMatrix result feDiffuseLighting result feDisplacementMap result feFlood result feGaussianBlur result feImage result feMerge result feMorphology result feOffset result feSpecularLighting result feTile result feTurbulence rotate altGlyph rotate animateMotion rotate text rotate tref rotate tspan rx ellipse rx rect ry ellipse ry rect scale feDisplacementMap seed feTurbulence slope font-face slope feFuncA slope feFuncB slope feFuncG slope feFuncR spacing textPath specularConstant feSpecularLighting specularExponent feSpecularLighting specularExponent feSpotLight spreadMethod linearGradient spreadMethod radialGradient startOffset textPath stdDeviation feGaussianBlur stemh font-face stemv font-face stitchTiles feTurbulence strikethrough-position font-face strikethrough-thickness font-face string font-face-format style a style altGlyph style circle style clipPath style defs style desc style ellipse style feBlend style feColorMatrix style feComponentTransfer style feComposite style feConvolveMatrix style feDiffuseLighting style feDisplacementMap style feFlood style feGaussianBlur style feImage style feMerge style feMorphology style feOffset style feSpecularLighting style feTile style feTurbulence style filter style font style foreignObject style g style glyph style glyphRef style image style line style linearGradient style marker style mask style missing-glyph style path style pattern style polygon style polyline style radialGradient style rect style stop style svg style switch style symbol style text style textPath style title style tref style tspan style use surfaceScale feDiffuseLighting surfaceScale feSpecularLighting systemLanguage a systemLanguage altGlyph systemLanguage animate systemLanguage animateColor systemLanguage animateMotion systemLanguage animateTransform systemLanguage circle systemLanguage clipPath systemLanguage cursor systemLanguage defs systemLanguage ellipse systemLanguage foreignObject systemLanguage g systemLanguage image systemLanguage line systemLanguage mask systemLanguage path systemLanguage pattern systemLanguage polygon systemLanguage polyline systemLanguage rect systemLanguage set systemLanguage svg systemLanguage switch systemLanguage text systemLanguage textPath systemLanguage tref systemLanguage tspan systemLanguage use tableValues feFuncA tableValues feFuncB tableValues feFuncG tableValues feFuncR target a targetX feConvolveMatrix targetY feConvolveMatrix textLength text textLength textPath textLength tref textLength tspan title style to set to animate to animateColor to animateMotion to animateTransform transform a transform circle transform clipPath transform defs transform ellipse transform foreignObject transform g transform image transform line transform path transform polygon transform polyline transform rect transform switch transform text transform use type animateTransform type feColorMatrix type feTurbulence type script type style type feFuncA type feFuncB type feFuncG type feFuncR u1 hkern u1 vkern u2 hkern u2 vkern underline-position font-face underline-thickness font-face unicode glyph unicode-range font-face units-per-em font-face v-alphabetic font-face v-hanging font-face v-ideographic font-face v-mathematical font-face values feColorMatrix values animate values animateColor values animateMotion values animateTransform version svg vert-adv-y font vert-adv-y glyph vert-adv-y missing-glyph vert-origin-x font vert-origin-x glyph vert-origin-x missing-glyph vert-origin-y font vert-origin-y glyph vert-origin-y missing-glyph viewBox marker viewBox pattern viewBox svg viewBox symbol viewBox view viewTarget view width filter width foreignObject width image width pattern width rect width svg width use width feBlend width feColorMatrix width feComponentTransfer width feComposite width feConvolveMatrix width feDiffuseLighting width feDisplacementMap width feFlood width feGaussianBlur width feImage width feMerge width feMorphology width feOffset width feSpecularLighting width feTile width feTurbulence width mask widths font-face x altGlyph x cursor x fePointLight x feSpotLight x filter x foreignObject x glyphRef x image x pattern x rect x svg x text x use x feBlend x feColorMatrix x feComponentTransfer x feComposite x feConvolveMatrix x feDiffuseLighting x feDisplacementMap x feFlood x feGaussianBlur x feImage x feMerge x feMorphology x feOffset x feSpecularLighting x feTile x feTurbulence x mask x tref x tspan x-height font-face x1 line x1 linearGradient x2 line x2 linearGradient xChannelSelector feDisplacementMap xlink:actuate a xlink:actuate altGlyph xlink:actuate animate xlink:actuate animateColor xlink:actuate animateMotion xlink:actuate animateTransform xlink:actuate color-profile xlink:actuate cursor xlink:actuate feImage xlink:actuate filter xlink:actuate font-face-uri xlink:actuate glyphRef xlink:actuate image xlink:actuate mpath xlink:actuate pattern xlink:actuate script xlink:actuate set xlink:actuate use xlink:arcrole a xlink:arcrole altGlyph xlink:arcrole animate xlink:arcrole animateColor xlink:arcrole animateMotion xlink:arcrole animateTransform xlink:arcrole color-profile xlink:arcrole cursor xlink:arcrole feImage xlink:arcrole filter xlink:arcrole font-face-uri xlink:arcrole glyphRef xlink:arcrole image xlink:arcrole linearGradient xlink:arcrole mpath xlink:arcrole pattern xlink:arcrole radialGradient xlink:arcrole script xlink:arcrole set xlink:arcrole textPath xlink:arcrole tref xlink:arcrole use xlink:href a xlink:href altGlyph xlink:href color-profile xlink:href cursor xlink:href feImage xlink:href filter xlink:href font-face-uri xlink:href glyphRef xlink:href image xlink:href linearGradient xlink:href mpath xlink:href pattern xlink:href radialGradient xlink:href script xlink:href textPath xlink:href use xlink:href animate xlink:href animateColor xlink:href animateMotion xlink:href animateTransform xlink:href set xlink:href tref xlink:role a xlink:role altGlyph xlink:role animate xlink:role animateColor xlink:role animateMotion xlink:role animateTransform xlink:role color-profile xlink:role cursor xlink:role feImage xlink:role filter xlink:role font-face-uri xlink:role glyphRef xlink:role image xlink:role linearGradient xlink:role mpath xlink:role pattern xlink:role radialGradient xlink:role script xlink:role set xlink:role textPath xlink:role tref xlink:role use xlink:show a xlink:show altGlyph xlink:show animate xlink:show animateColor xlink:show animateMotion xlink:show animateTransform xlink:show color-profile xlink:show cursor xlink:show feImage xlink:show filter xlink:show font-face-uri xlink:show glyphRef xlink:show image xlink:show mpath xlink:show pattern xlink:show script xlink:show set xlink:show use xlink:title a xlink:title altGlyph xlink:title animate xlink:title animateColor xlink:title animateMotion xlink:title animateTransform xlink:title color-profile xlink:title cursor xlink:title feImage xlink:title filter xlink:title font-face-uri xlink:title glyphRef xlink:title image xlink:title linearGradient xlink:title mpath xlink:title pattern xlink:title radialGradient xlink:title script xlink:title set xlink:title textPath xlink:title tref xlink:title use xlink:type a xlink:type altGlyph xlink:type animate xlink:type animateColor xlink:type animateMotion xlink:type animateTransform xlink:type color-profile xlink:type cursor xlink:type feImage xlink:type filter xlink:type font-face-uri xlink:type glyphRef xlink:type image xlink:type linearGradient xlink:type mpath xlink:type pattern xlink:type radialGradient xlink:type script xlink:type set xlink:type textPath xlink:type tref xlink:type use xml:base a xml:base altGlyph xml:base altGlyphDef xml:base altGlyphItem xml:base animate xml:base animateColor xml:base animateMotion xml:base animateTransform xml:base circle xml:base clipPath xml:base color-profile xml:base cursor xml:base defs xml:base desc xml:base ellipse xml:base feBlend xml:base feColorMatrix xml:base feComponentTransfer xml:base feComposite xml:base feConvolveMatrix xml:base feDiffuseLighting xml:base feDisplacementMap xml:base feDistantLight xml:base feFlood xml:base feFuncA xml:base feFuncB xml:base feFuncG xml:base feFuncR xml:base feGaussianBlur xml:base feImage xml:base feMerge xml:base feMergeNode xml:base feMorphology xml:base feOffset xml:base fePointLight xml:base feSpecularLighting xml:base feSpotLight xml:base feTile xml:base feTurbulence xml:base filter xml:base font xml:base font-face xml:base font-face-format xml:base font-face-name xml:base font-face-src xml:base font-face-uri xml:base foreignObject xml:base g xml:base glyph xml:base glyphRef xml:base hkern xml:base image xml:base line xml:base linearGradient xml:base marker xml:base mask xml:base metadata xml:base missing-glyph xml:base mpath xml:base path xml:base pattern xml:base polygon xml:base polyline xml:base radialGradient xml:base rect xml:base script xml:base set xml:base stop xml:base style xml:base svg xml:base switch xml:base symbol xml:base text xml:base textPath xml:base title xml:base tref xml:base tspan xml:base use xml:base view xml:base vkern xml:lang a xml:lang altGlyph xml:lang altGlyphDef xml:lang altGlyphItem xml:lang animate xml:lang animateColor xml:lang animateMotion xml:lang animateTransform xml:lang circle xml:lang clipPath xml:lang color-profile xml:lang cursor xml:lang defs xml:lang desc xml:lang ellipse xml:lang feBlend xml:lang feColorMatrix xml:lang feComponentTransfer xml:lang feComposite xml:lang feConvolveMatrix xml:lang feDiffuseLighting xml:lang feDisplacementMap xml:lang feDistantLight xml:lang feFlood xml:lang feFuncA xml:lang feFuncB xml:lang feFuncG xml:lang feFuncR xml:lang feGaussianBlur xml:lang feImage xml:lang feMerge xml:lang feMergeNode xml:lang feMorphology xml:lang feOffset xml:lang fePointLight xml:lang feSpecularLighting xml:lang feSpotLight xml:lang feTile xml:lang feTurbulence xml:lang filter xml:lang font xml:lang font-face xml:lang font-face-format xml:lang font-face-name xml:lang font-face-src xml:lang font-face-uri xml:lang foreignObject xml:lang g xml:lang glyph xml:lang glyphRef xml:lang hkern xml:lang image xml:lang line xml:lang linearGradient xml:lang marker xml:lang mask xml:lang metadata xml:lang missing-glyph xml:lang mpath xml:lang path xml:lang pattern xml:lang polygon xml:lang polyline xml:lang radialGradient xml:lang rect xml:lang script xml:lang set xml:lang stop xml:lang style xml:lang svg xml:lang switch xml:lang symbol xml:lang text xml:lang textPath xml:lang title xml:lang tref xml:lang tspan xml:lang use xml:lang view xml:lang vkern xml:space a xml:space altGlyph xml:space altGlyphDef xml:space altGlyphItem xml:space animate xml:space animateColor xml:space animateMotion xml:space animateTransform xml:space circle xml:space clipPath xml:space color-profile xml:space cursor xml:space defs xml:space desc xml:space ellipse xml:space feBlend xml:space feColorMatrix xml:space feComponentTransfer xml:space feComposite xml:space feConvolveMatrix xml:space feDiffuseLighting xml:space feDisplacementMap xml:space feDistantLight xml:space feFlood xml:space feFuncA xml:space feFuncB xml:space feFuncG xml:space feFuncR xml:space feGaussianBlur xml:space feImage xml:space feMerge xml:space feMergeNode xml:space feMorphology xml:space feOffset xml:space fePointLight xml:space feSpecularLighting xml:space feSpotLight xml:space feTile xml:space feTurbulence xml:space filter xml:space font xml:space font-face xml:space font-face-format xml:space font-face-name xml:space font-face-src xml:space font-face-uri xml:space foreignObject xml:space g xml:space glyph xml:space glyphRef xml:space hkern xml:space image xml:space line xml:space linearGradient xml:space marker xml:space mask xml:space metadata xml:space missing-glyph xml:space mpath xml:space path xml:space pattern xml:space polygon xml:space polyline xml:space radialGradient xml:space rect xml:space script xml:space set xml:space stop xml:space style xml:space svg xml:space switch xml:space symbol xml:space text xml:space textPath xml:space title xml:space tref xml:space tspan xml:space use xml:space view xml:space vkern y altGlyph y cursor y fePointLight y feSpotLight y filter y foreignObject y glyphRef y image y pattern y rect y svg y text y use y feBlend y feColorMatrix y feComponentTransfer y feComposite y feConvolveMatrix y feDiffuseLighting y feDisplacementMap y feFlood y feGaussianBlur y feImage y feMerge y feMorphology y feOffset y feSpecularLighting y feTile y feTurbulence y mask y tref y tspan y1 line y1 linearGradient y2 line y2 linearGradient yChannelSelector feDisplacementMap z fePointLight z feSpotLight zoomAndPan svg zoomAndPan view �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gridSVG/inst/svg/presAttrTable.txt������������������������������������������������������������������0000654�0001762�0000144�00000201750�12616254462�016666� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������alignment-baseline a baseline-shift a clip-path a clip-rule a clip a color-interpolation-filters a color-interpolation a color-profile a color-rendering a color a cursor a direction a display a dominant-baseline a enable-background a fill-opacity a fill-rule a fill a filter a flood-color a flood-opacity a font-family a font-size-adjust a font-size a font-stretch a font-style a font-variant a font-weight a glyph-orientation-horizontal a glyph-orientation-vertical a image-rendering a kerning a letter-spacing a lighting-color a marker-end a marker-mid a marker-start a mask a opacity a overflow a pointer-events a shape-rendering a stop-color a stop-opacity a stroke-dasharray a stroke-dashoffset a stroke-linecap a stroke-linejoin a stroke-miterlimit a stroke-opacity a stroke-width a stroke a text-anchor a text-decoration a text-rendering a unicode-bidi a visibility a word-spacingandwriting-mode a alignment-baseline altGlyph baseline-shift altGlyph clip-path altGlyph clip-rule altGlyph clip altGlyph color-interpolation-filters altGlyph color-interpolation altGlyph color-profile altGlyph color-rendering altGlyph color altGlyph cursor altGlyph direction altGlyph display altGlyph dominant-baseline altGlyph enable-background altGlyph fill-opacity altGlyph fill-rule altGlyph fill altGlyph filter altGlyph flood-color altGlyph flood-opacity altGlyph font-family altGlyph font-size-adjust altGlyph font-size altGlyph font-stretch altGlyph font-style altGlyph font-variant altGlyph font-weight altGlyph glyph-orientation-horizontal altGlyph glyph-orientation-vertical altGlyph image-rendering altGlyph kerning altGlyph letter-spacing altGlyph lighting-color altGlyph marker-end altGlyph marker-mid altGlyph marker-start altGlyph mask altGlyph opacity altGlyph overflow altGlyph pointer-events altGlyph shape-rendering altGlyph stop-color altGlyph stop-opacity altGlyph stroke-dasharray altGlyph stroke-dashoffset altGlyph stroke-linecap altGlyph stroke-linejoin altGlyph stroke-miterlimit altGlyph stroke-opacity altGlyph stroke-width altGlyph stroke altGlyph text-anchor altGlyph text-decoration altGlyph text-rendering altGlyph unicode-bidi altGlyph visibility altGlyph word-spacingandwriting-mode altGlyph alignment-baseline animate baseline-shift animate clip-path animate clip-rule animate clip animate color-interpolation-filters animate color-interpolation animate color-profile animate color-rendering animate color animate cursor animate direction animate display animate dominant-baseline animate enable-background animate fill-opacity animate fill-rule animate fill animate filter animate flood-color animate flood-opacity animate font-family animate font-size-adjust animate font-size animate font-stretch animate font-style animate font-variant animate font-weight animate glyph-orientation-horizontal animate glyph-orientation-vertical animate image-rendering animate kerning animate letter-spacing animate lighting-color animate marker-end animate marker-mid animate marker-start animate mask animate opacity animate overflow animate pointer-events animate shape-rendering animate stop-color animate stop-opacity animate stroke-dasharray animate stroke-dashoffset animate stroke-linecap animate stroke-linejoin animate stroke-miterlimit animate stroke-opacity animate stroke-width animate stroke animate text-anchor animate text-decoration animate text-rendering animate unicode-bidi animate visibility animate word-spacingandwriting-mode animate alignment-baseline animateColor baseline-shift animateColor clip-path animateColor clip-rule animateColor clip animateColor color-interpolation-filters animateColor color-interpolation animateColor color-profile animateColor color-rendering animateColor color animateColor cursor animateColor direction animateColor display animateColor dominant-baseline animateColor enable-background animateColor fill-opacity animateColor fill-rule animateColor fill animateColor filter animateColor flood-color animateColor flood-opacity animateColor font-family animateColor font-size-adjust animateColor font-size animateColor font-stretch animateColor font-style animateColor font-variant animateColor font-weight animateColor glyph-orientation-horizontal animateColor glyph-orientation-vertical animateColor image-rendering animateColor kerning animateColor letter-spacing animateColor lighting-color animateColor marker-end animateColor marker-mid animateColor marker-start animateColor mask animateColor opacity animateColor overflow animateColor pointer-events animateColor shape-rendering animateColor stop-color animateColor stop-opacity animateColor stroke-dasharray animateColor stroke-dashoffset animateColor stroke-linecap animateColor stroke-linejoin animateColor stroke-miterlimit animateColor stroke-opacity animateColor stroke-width animateColor stroke animateColor text-anchor animateColor text-decoration animateColor text-rendering animateColor unicode-bidi animateColor visibility animateColor word-spacingandwriting-mode animateColor alignment-baseline circle baseline-shift circle clip-path circle clip-rule circle clip circle color-interpolation-filters circle color-interpolation circle color-profile circle color-rendering circle color circle cursor circle direction circle display circle dominant-baseline circle enable-background circle fill-opacity circle fill-rule circle fill circle filter circle flood-color circle flood-opacity circle font-family circle font-size-adjust circle font-size circle font-stretch circle font-style circle font-variant circle font-weight circle glyph-orientation-horizontal circle glyph-orientation-vertical circle image-rendering circle kerning circle letter-spacing circle lighting-color circle marker-end circle marker-mid circle marker-start circle mask circle opacity circle overflow circle pointer-events circle shape-rendering circle stop-color circle stop-opacity circle stroke-dasharray circle stroke-dashoffset circle stroke-linecap circle stroke-linejoin circle stroke-miterlimit circle stroke-opacity circle stroke-width circle stroke circle text-anchor circle text-decoration circle text-rendering circle unicode-bidi circle visibility circle word-spacingandwriting-mode circle alignment-baseline clipPath baseline-shift clipPath clip-path clipPath clip-rule clipPath clip clipPath color-interpolation-filters clipPath color-interpolation clipPath color-profile clipPath color-rendering clipPath color clipPath cursor clipPath direction clipPath display clipPath dominant-baseline clipPath enable-background clipPath fill-opacity clipPath fill-rule clipPath fill clipPath filter clipPath flood-color clipPath flood-opacity clipPath font-family clipPath font-size-adjust clipPath font-size clipPath font-stretch clipPath font-style clipPath font-variant clipPath font-weight clipPath glyph-orientation-horizontal clipPath glyph-orientation-vertical clipPath image-rendering clipPath kerning clipPath letter-spacing clipPath lighting-color clipPath marker-end clipPath marker-mid clipPath marker-start clipPath mask clipPath opacity clipPath overflow clipPath pointer-events clipPath shape-rendering clipPath stop-color clipPath stop-opacity clipPath stroke-dasharray clipPath stroke-dashoffset clipPath stroke-linecap clipPath stroke-linejoin clipPath stroke-miterlimit clipPath stroke-opacity clipPath stroke-width clipPath stroke clipPath text-anchor clipPath text-decoration clipPath text-rendering clipPath unicode-bidi clipPath visibility clipPath word-spacingandwriting-mode clipPath alignment-baseline defs baseline-shift defs clip-path defs clip-rule defs clip defs color-interpolation-filters defs color-interpolation defs color-profile defs color-rendering defs color defs cursor defs direction defs display defs dominant-baseline defs enable-background defs fill-opacity defs fill-rule defs fill defs filter defs flood-color defs flood-opacity defs font-family defs font-size-adjust defs font-size defs font-stretch defs font-style defs font-variant defs font-weight defs glyph-orientation-horizontal defs glyph-orientation-vertical defs image-rendering defs kerning defs letter-spacing defs lighting-color defs marker-end defs marker-mid defs marker-start defs mask defs opacity defs overflow defs pointer-events defs shape-rendering defs stop-color defs stop-opacity defs stroke-dasharray defs stroke-dashoffset defs stroke-linecap defs stroke-linejoin defs stroke-miterlimit defs stroke-opacity defs stroke-width defs stroke defs text-anchor defs text-decoration defs text-rendering defs unicode-bidi defs visibility defs word-spacingandwriting-mode defs alignment-baseline ellipse baseline-shift ellipse clip-path ellipse clip-rule ellipse clip ellipse color-interpolation-filters ellipse color-interpolation ellipse color-profile ellipse color-rendering ellipse color ellipse cursor ellipse direction ellipse display ellipse dominant-baseline ellipse enable-background ellipse fill-opacity ellipse fill-rule ellipse fill ellipse filter ellipse flood-color ellipse flood-opacity ellipse font-family ellipse font-size-adjust ellipse font-size ellipse font-stretch ellipse font-style ellipse font-variant ellipse font-weight ellipse glyph-orientation-horizontal ellipse glyph-orientation-vertical ellipse image-rendering ellipse kerning ellipse letter-spacing ellipse lighting-color ellipse marker-end ellipse marker-mid ellipse marker-start ellipse mask ellipse opacity ellipse overflow ellipse pointer-events ellipse shape-rendering ellipse stop-color ellipse stop-opacity ellipse stroke-dasharray ellipse stroke-dashoffset ellipse stroke-linecap ellipse stroke-linejoin ellipse stroke-miterlimit ellipse stroke-opacity ellipse stroke-width ellipse stroke ellipse text-anchor ellipse text-decoration ellipse text-rendering ellipse unicode-bidi ellipse visibility ellipse word-spacingandwriting-mode ellipse alignment-baseline feBlend baseline-shift feBlend clip-path feBlend clip-rule feBlend clip feBlend color-interpolation-filters feBlend color-interpolation feBlend color-profile feBlend color-rendering feBlend color feBlend cursor feBlend direction feBlend display feBlend dominant-baseline feBlend enable-background feBlend fill-opacity feBlend fill-rule feBlend fill feBlend filter feBlend flood-color feBlend flood-opacity feBlend font-family feBlend font-size-adjust feBlend font-size feBlend font-stretch feBlend font-style feBlend font-variant feBlend font-weight feBlend glyph-orientation-horizontal feBlend glyph-orientation-vertical feBlend image-rendering feBlend kerning feBlend letter-spacing feBlend lighting-color feBlend marker-end feBlend marker-mid feBlend marker-start feBlend mask feBlend opacity feBlend overflow feBlend pointer-events feBlend shape-rendering feBlend stop-color feBlend stop-opacity feBlend stroke-dasharray feBlend stroke-dashoffset feBlend stroke-linecap feBlend stroke-linejoin feBlend stroke-miterlimit feBlend stroke-opacity feBlend stroke-width feBlend stroke feBlend text-anchor feBlend text-decoration feBlend text-rendering feBlend unicode-bidi feBlend visibility feBlend word-spacingandwriting-mode feBlend alignment-baseline feColorMatrix baseline-shift feColorMatrix clip-path feColorMatrix clip-rule feColorMatrix clip feColorMatrix color-interpolation-filters feColorMatrix color-interpolation feColorMatrix color-profile feColorMatrix color-rendering feColorMatrix color feColorMatrix cursor feColorMatrix direction feColorMatrix display feColorMatrix dominant-baseline feColorMatrix enable-background feColorMatrix fill-opacity feColorMatrix fill-rule feColorMatrix fill feColorMatrix filter feColorMatrix flood-color feColorMatrix flood-opacity feColorMatrix font-family feColorMatrix font-size-adjust feColorMatrix font-size feColorMatrix font-stretch feColorMatrix font-style feColorMatrix font-variant feColorMatrix font-weight feColorMatrix glyph-orientation-horizontal feColorMatrix glyph-orientation-vertical feColorMatrix image-rendering feColorMatrix kerning feColorMatrix letter-spacing feColorMatrix lighting-color feColorMatrix marker-end feColorMatrix marker-mid feColorMatrix marker-start feColorMatrix mask feColorMatrix opacity feColorMatrix overflow feColorMatrix pointer-events feColorMatrix shape-rendering feColorMatrix stop-color feColorMatrix stop-opacity feColorMatrix stroke-dasharray feColorMatrix stroke-dashoffset feColorMatrix stroke-linecap feColorMatrix stroke-linejoin feColorMatrix stroke-miterlimit feColorMatrix stroke-opacity feColorMatrix stroke-width feColorMatrix stroke feColorMatrix text-anchor feColorMatrix text-decoration feColorMatrix text-rendering feColorMatrix unicode-bidi feColorMatrix visibility feColorMatrix word-spacingandwriting-mode feColorMatrix alignment-baseline feComponentTransfer baseline-shift feComponentTransfer clip-path feComponentTransfer clip-rule feComponentTransfer clip feComponentTransfer color-interpolation-filters feComponentTransfer color-interpolation feComponentTransfer color-profile feComponentTransfer color-rendering feComponentTransfer color feComponentTransfer cursor feComponentTransfer direction feComponentTransfer display feComponentTransfer dominant-baseline feComponentTransfer enable-background feComponentTransfer fill-opacity feComponentTransfer fill-rule feComponentTransfer fill feComponentTransfer filter feComponentTransfer flood-color feComponentTransfer flood-opacity feComponentTransfer font-family feComponentTransfer font-size-adjust feComponentTransfer font-size feComponentTransfer font-stretch feComponentTransfer font-style feComponentTransfer font-variant feComponentTransfer font-weight feComponentTransfer glyph-orientation-horizontal feComponentTransfer glyph-orientation-vertical feComponentTransfer image-rendering feComponentTransfer kerning feComponentTransfer letter-spacing feComponentTransfer lighting-color feComponentTransfer marker-end feComponentTransfer marker-mid feComponentTransfer marker-start feComponentTransfer mask feComponentTransfer opacity feComponentTransfer overflow feComponentTransfer pointer-events feComponentTransfer shape-rendering feComponentTransfer stop-color feComponentTransfer stop-opacity feComponentTransfer stroke-dasharray feComponentTransfer stroke-dashoffset feComponentTransfer stroke-linecap feComponentTransfer stroke-linejoin feComponentTransfer stroke-miterlimit feComponentTransfer stroke-opacity feComponentTransfer stroke-width feComponentTransfer stroke feComponentTransfer text-anchor feComponentTransfer text-decoration feComponentTransfer text-rendering feComponentTransfer unicode-bidi feComponentTransfer visibility feComponentTransfer word-spacingandwriting-mode feComponentTransfer alignment-baseline feComposite baseline-shift feComposite clip-path feComposite clip-rule feComposite clip feComposite color-interpolation-filters feComposite color-interpolation feComposite color-profile feComposite color-rendering feComposite color feComposite cursor feComposite direction feComposite display feComposite dominant-baseline feComposite enable-background feComposite fill-opacity feComposite fill-rule feComposite fill feComposite filter feComposite flood-color feComposite flood-opacity feComposite font-family feComposite font-size-adjust feComposite font-size feComposite font-stretch feComposite font-style feComposite font-variant feComposite font-weight feComposite glyph-orientation-horizontal feComposite glyph-orientation-vertical feComposite image-rendering feComposite kerning feComposite letter-spacing feComposite lighting-color feComposite marker-end feComposite marker-mid feComposite marker-start feComposite mask feComposite opacity feComposite overflow feComposite pointer-events feComposite shape-rendering feComposite stop-color feComposite stop-opacity feComposite stroke-dasharray feComposite stroke-dashoffset feComposite stroke-linecap feComposite stroke-linejoin feComposite stroke-miterlimit feComposite stroke-opacity feComposite stroke-width feComposite stroke feComposite text-anchor feComposite text-decoration feComposite text-rendering feComposite unicode-bidi feComposite visibility feComposite word-spacingandwriting-mode feComposite alignment-baseline feConvolveMatrix baseline-shift feConvolveMatrix clip-path feConvolveMatrix clip-rule feConvolveMatrix clip feConvolveMatrix color-interpolation-filters feConvolveMatrix color-interpolation feConvolveMatrix color-profile feConvolveMatrix color-rendering feConvolveMatrix color feConvolveMatrix cursor feConvolveMatrix direction feConvolveMatrix display feConvolveMatrix dominant-baseline feConvolveMatrix enable-background feConvolveMatrix fill-opacity feConvolveMatrix fill-rule feConvolveMatrix fill feConvolveMatrix filter feConvolveMatrix flood-color feConvolveMatrix flood-opacity feConvolveMatrix font-family feConvolveMatrix font-size-adjust feConvolveMatrix font-size feConvolveMatrix font-stretch feConvolveMatrix font-style feConvolveMatrix font-variant feConvolveMatrix font-weight feConvolveMatrix glyph-orientation-horizontal feConvolveMatrix glyph-orientation-vertical feConvolveMatrix image-rendering feConvolveMatrix kerning feConvolveMatrix letter-spacing feConvolveMatrix lighting-color feConvolveMatrix marker-end feConvolveMatrix marker-mid feConvolveMatrix marker-start feConvolveMatrix mask feConvolveMatrix opacity feConvolveMatrix overflow feConvolveMatrix pointer-events feConvolveMatrix shape-rendering feConvolveMatrix stop-color feConvolveMatrix stop-opacity feConvolveMatrix stroke-dasharray feConvolveMatrix stroke-dashoffset feConvolveMatrix stroke-linecap feConvolveMatrix stroke-linejoin feConvolveMatrix stroke-miterlimit feConvolveMatrix stroke-opacity feConvolveMatrix stroke-width feConvolveMatrix stroke feConvolveMatrix text-anchor feConvolveMatrix text-decoration feConvolveMatrix text-rendering feConvolveMatrix unicode-bidi feConvolveMatrix visibility feConvolveMatrix word-spacingandwriting-mode feConvolveMatrix alignment-baseline feDiffuseLighting baseline-shift feDiffuseLighting clip-path feDiffuseLighting clip-rule feDiffuseLighting clip feDiffuseLighting color-interpolation-filters feDiffuseLighting color-interpolation feDiffuseLighting color-profile feDiffuseLighting color-rendering feDiffuseLighting color feDiffuseLighting cursor feDiffuseLighting direction feDiffuseLighting display feDiffuseLighting dominant-baseline feDiffuseLighting enable-background feDiffuseLighting fill-opacity feDiffuseLighting fill-rule feDiffuseLighting fill feDiffuseLighting filter feDiffuseLighting flood-color feDiffuseLighting flood-opacity feDiffuseLighting font-family feDiffuseLighting font-size-adjust feDiffuseLighting font-size feDiffuseLighting font-stretch feDiffuseLighting font-style feDiffuseLighting font-variant feDiffuseLighting font-weight feDiffuseLighting glyph-orientation-horizontal feDiffuseLighting glyph-orientation-vertical feDiffuseLighting image-rendering feDiffuseLighting kerning feDiffuseLighting letter-spacing feDiffuseLighting lighting-color feDiffuseLighting marker-end feDiffuseLighting marker-mid feDiffuseLighting marker-start feDiffuseLighting mask feDiffuseLighting opacity feDiffuseLighting overflow feDiffuseLighting pointer-events feDiffuseLighting shape-rendering feDiffuseLighting stop-color feDiffuseLighting stop-opacity feDiffuseLighting stroke-dasharray feDiffuseLighting stroke-dashoffset feDiffuseLighting stroke-linecap feDiffuseLighting stroke-linejoin feDiffuseLighting stroke-miterlimit feDiffuseLighting stroke-opacity feDiffuseLighting stroke-width feDiffuseLighting stroke feDiffuseLighting text-anchor feDiffuseLighting text-decoration feDiffuseLighting text-rendering feDiffuseLighting unicode-bidi feDiffuseLighting visibility feDiffuseLighting word-spacingandwriting-mode feDiffuseLighting alignment-baseline feDisplacementMap baseline-shift feDisplacementMap clip-path feDisplacementMap clip-rule feDisplacementMap clip feDisplacementMap color-interpolation-filters feDisplacementMap color-interpolation feDisplacementMap color-profile feDisplacementMap color-rendering feDisplacementMap color feDisplacementMap cursor feDisplacementMap direction feDisplacementMap display feDisplacementMap dominant-baseline feDisplacementMap enable-background feDisplacementMap fill-opacity feDisplacementMap fill-rule feDisplacementMap fill feDisplacementMap filter feDisplacementMap flood-color feDisplacementMap flood-opacity feDisplacementMap font-family feDisplacementMap font-size-adjust feDisplacementMap font-size feDisplacementMap font-stretch feDisplacementMap font-style feDisplacementMap font-variant feDisplacementMap font-weight feDisplacementMap glyph-orientation-horizontal feDisplacementMap glyph-orientation-vertical feDisplacementMap image-rendering feDisplacementMap kerning feDisplacementMap letter-spacing feDisplacementMap lighting-color feDisplacementMap marker-end feDisplacementMap marker-mid feDisplacementMap marker-start feDisplacementMap mask feDisplacementMap opacity feDisplacementMap overflow feDisplacementMap pointer-events feDisplacementMap shape-rendering feDisplacementMap stop-color feDisplacementMap stop-opacity feDisplacementMap stroke-dasharray feDisplacementMap stroke-dashoffset feDisplacementMap stroke-linecap feDisplacementMap stroke-linejoin feDisplacementMap stroke-miterlimit feDisplacementMap stroke-opacity feDisplacementMap stroke-width feDisplacementMap stroke feDisplacementMap text-anchor feDisplacementMap text-decoration feDisplacementMap text-rendering feDisplacementMap unicode-bidi feDisplacementMap visibility feDisplacementMap word-spacingandwriting-mode feDisplacementMap alignment-baseline feFlood baseline-shift feFlood clip-path feFlood clip-rule feFlood clip feFlood color-interpolation-filters feFlood color-interpolation feFlood color-profile feFlood color-rendering feFlood color feFlood cursor feFlood direction feFlood display feFlood dominant-baseline feFlood enable-background feFlood fill-opacity feFlood fill-rule feFlood fill feFlood filter feFlood flood-color feFlood flood-opacity feFlood font-family feFlood font-size-adjust feFlood font-size feFlood font-stretch feFlood font-style feFlood font-variant feFlood font-weight feFlood glyph-orientation-horizontal feFlood glyph-orientation-vertical feFlood image-rendering feFlood kerning feFlood letter-spacing feFlood lighting-color feFlood marker-end feFlood marker-mid feFlood marker-start feFlood mask feFlood opacity feFlood overflow feFlood pointer-events feFlood shape-rendering feFlood stop-color feFlood stop-opacity feFlood stroke-dasharray feFlood stroke-dashoffset feFlood stroke-linecap feFlood stroke-linejoin feFlood stroke-miterlimit feFlood stroke-opacity feFlood stroke-width feFlood stroke feFlood text-anchor feFlood text-decoration feFlood text-rendering feFlood unicode-bidi feFlood visibility feFlood word-spacingandwriting-mode feFlood alignment-baseline feGaussianBlur baseline-shift feGaussianBlur clip-path feGaussianBlur clip-rule feGaussianBlur clip feGaussianBlur color-interpolation-filters feGaussianBlur color-interpolation feGaussianBlur color-profile feGaussianBlur color-rendering feGaussianBlur color feGaussianBlur cursor feGaussianBlur direction feGaussianBlur display feGaussianBlur dominant-baseline feGaussianBlur enable-background feGaussianBlur fill-opacity feGaussianBlur fill-rule feGaussianBlur fill feGaussianBlur filter feGaussianBlur flood-color feGaussianBlur flood-opacity feGaussianBlur font-family feGaussianBlur font-size-adjust feGaussianBlur font-size feGaussianBlur font-stretch feGaussianBlur font-style feGaussianBlur font-variant feGaussianBlur font-weight feGaussianBlur glyph-orientation-horizontal feGaussianBlur glyph-orientation-vertical feGaussianBlur image-rendering feGaussianBlur kerning feGaussianBlur letter-spacing feGaussianBlur lighting-color feGaussianBlur marker-end feGaussianBlur marker-mid feGaussianBlur marker-start feGaussianBlur mask feGaussianBlur opacity feGaussianBlur overflow feGaussianBlur pointer-events feGaussianBlur shape-rendering feGaussianBlur stop-color feGaussianBlur stop-opacity feGaussianBlur stroke-dasharray feGaussianBlur stroke-dashoffset feGaussianBlur stroke-linecap feGaussianBlur stroke-linejoin feGaussianBlur stroke-miterlimit feGaussianBlur stroke-opacity feGaussianBlur stroke-width feGaussianBlur stroke feGaussianBlur text-anchor feGaussianBlur text-decoration feGaussianBlur text-rendering feGaussianBlur unicode-bidi feGaussianBlur visibility feGaussianBlur word-spacingandwriting-mode feGaussianBlur alignment-baseline feImage baseline-shift feImage clip-path feImage clip-rule feImage clip feImage color-interpolation-filters feImage color-interpolation feImage color-profile feImage color-rendering feImage color feImage cursor feImage direction feImage display feImage dominant-baseline feImage enable-background feImage fill-opacity feImage fill-rule feImage fill feImage filter feImage flood-color feImage flood-opacity feImage font-family feImage font-size-adjust feImage font-size feImage font-stretch feImage font-style feImage font-variant feImage font-weight feImage glyph-orientation-horizontal feImage glyph-orientation-vertical feImage image-rendering feImage kerning feImage letter-spacing feImage lighting-color feImage marker-end feImage marker-mid feImage marker-start feImage mask feImage opacity feImage overflow feImage pointer-events feImage shape-rendering feImage stop-color feImage stop-opacity feImage stroke-dasharray feImage stroke-dashoffset feImage stroke-linecap feImage stroke-linejoin feImage stroke-miterlimit feImage stroke-opacity feImage stroke-width feImage stroke feImage text-anchor feImage text-decoration feImage text-rendering feImage unicode-bidi feImage visibility feImage word-spacingandwriting-mode feImage alignment-baseline feMerge baseline-shift feMerge clip-path feMerge clip-rule feMerge clip feMerge color-interpolation-filters feMerge color-interpolation feMerge color-profile feMerge color-rendering feMerge color feMerge cursor feMerge direction feMerge display feMerge dominant-baseline feMerge enable-background feMerge fill-opacity feMerge fill-rule feMerge fill feMerge filter feMerge flood-color feMerge flood-opacity feMerge font-family feMerge font-size-adjust feMerge font-size feMerge font-stretch feMerge font-style feMerge font-variant feMerge font-weight feMerge glyph-orientation-horizontal feMerge glyph-orientation-vertical feMerge image-rendering feMerge kerning feMerge letter-spacing feMerge lighting-color feMerge marker-end feMerge marker-mid feMerge marker-start feMerge mask feMerge opacity feMerge overflow feMerge pointer-events feMerge shape-rendering feMerge stop-color feMerge stop-opacity feMerge stroke-dasharray feMerge stroke-dashoffset feMerge stroke-linecap feMerge stroke-linejoin feMerge stroke-miterlimit feMerge stroke-opacity feMerge stroke-width feMerge stroke feMerge text-anchor feMerge text-decoration feMerge text-rendering feMerge unicode-bidi feMerge visibility feMerge word-spacingandwriting-mode feMerge alignment-baseline feMorphology baseline-shift feMorphology clip-path feMorphology clip-rule feMorphology clip feMorphology color-interpolation-filters feMorphology color-interpolation feMorphology color-profile feMorphology color-rendering feMorphology color feMorphology cursor feMorphology direction feMorphology display feMorphology dominant-baseline feMorphology enable-background feMorphology fill-opacity feMorphology fill-rule feMorphology fill feMorphology filter feMorphology flood-color feMorphology flood-opacity feMorphology font-family feMorphology font-size-adjust feMorphology font-size feMorphology font-stretch feMorphology font-style feMorphology font-variant feMorphology font-weight feMorphology glyph-orientation-horizontal feMorphology glyph-orientation-vertical feMorphology image-rendering feMorphology kerning feMorphology letter-spacing feMorphology lighting-color feMorphology marker-end feMorphology marker-mid feMorphology marker-start feMorphology mask feMorphology opacity feMorphology overflow feMorphology pointer-events feMorphology shape-rendering feMorphology stop-color feMorphology stop-opacity feMorphology stroke-dasharray feMorphology stroke-dashoffset feMorphology stroke-linecap feMorphology stroke-linejoin feMorphology stroke-miterlimit feMorphology stroke-opacity feMorphology stroke-width feMorphology stroke feMorphology text-anchor feMorphology text-decoration feMorphology text-rendering feMorphology unicode-bidi feMorphology visibility feMorphology word-spacingandwriting-mode feMorphology alignment-baseline feOffset baseline-shift feOffset clip-path feOffset clip-rule feOffset clip feOffset color-interpolation-filters feOffset color-interpolation feOffset color-profile feOffset color-rendering feOffset color feOffset cursor feOffset direction feOffset display feOffset dominant-baseline feOffset enable-background feOffset fill-opacity feOffset fill-rule feOffset fill feOffset filter feOffset flood-color feOffset flood-opacity feOffset font-family feOffset font-size-adjust feOffset font-size feOffset font-stretch feOffset font-style feOffset font-variant feOffset font-weight feOffset glyph-orientation-horizontal feOffset glyph-orientation-vertical feOffset image-rendering feOffset kerning feOffset letter-spacing feOffset lighting-color feOffset marker-end feOffset marker-mid feOffset marker-start feOffset mask feOffset opacity feOffset overflow feOffset pointer-events feOffset shape-rendering feOffset stop-color feOffset stop-opacity feOffset stroke-dasharray feOffset stroke-dashoffset feOffset stroke-linecap feOffset stroke-linejoin feOffset stroke-miterlimit feOffset stroke-opacity feOffset stroke-width feOffset stroke feOffset text-anchor feOffset text-decoration feOffset text-rendering feOffset unicode-bidi feOffset visibility feOffset word-spacingandwriting-mode feOffset alignment-baseline feSpecularLighting baseline-shift feSpecularLighting clip-path feSpecularLighting clip-rule feSpecularLighting clip feSpecularLighting color-interpolation-filters feSpecularLighting color-interpolation feSpecularLighting color-profile feSpecularLighting color-rendering feSpecularLighting color feSpecularLighting cursor feSpecularLighting direction feSpecularLighting display feSpecularLighting dominant-baseline feSpecularLighting enable-background feSpecularLighting fill-opacity feSpecularLighting fill-rule feSpecularLighting fill feSpecularLighting filter feSpecularLighting flood-color feSpecularLighting flood-opacity feSpecularLighting font-family feSpecularLighting font-size-adjust feSpecularLighting font-size feSpecularLighting font-stretch feSpecularLighting font-style feSpecularLighting font-variant feSpecularLighting font-weight feSpecularLighting glyph-orientation-horizontal feSpecularLighting glyph-orientation-vertical feSpecularLighting image-rendering feSpecularLighting kerning feSpecularLighting letter-spacing feSpecularLighting lighting-color feSpecularLighting marker-end feSpecularLighting marker-mid feSpecularLighting marker-start feSpecularLighting mask feSpecularLighting opacity feSpecularLighting overflow feSpecularLighting pointer-events feSpecularLighting shape-rendering feSpecularLighting stop-color feSpecularLighting stop-opacity feSpecularLighting stroke-dasharray feSpecularLighting stroke-dashoffset feSpecularLighting stroke-linecap feSpecularLighting stroke-linejoin feSpecularLighting stroke-miterlimit feSpecularLighting stroke-opacity feSpecularLighting stroke-width feSpecularLighting stroke feSpecularLighting text-anchor feSpecularLighting text-decoration feSpecularLighting text-rendering feSpecularLighting unicode-bidi feSpecularLighting visibility feSpecularLighting word-spacingandwriting-mode feSpecularLighting alignment-baseline feTile baseline-shift feTile clip-path feTile clip-rule feTile clip feTile color-interpolation-filters feTile color-interpolation feTile color-profile feTile color-rendering feTile color feTile cursor feTile direction feTile display feTile dominant-baseline feTile enable-background feTile fill-opacity feTile fill-rule feTile fill feTile filter feTile flood-color feTile flood-opacity feTile font-family feTile font-size-adjust feTile font-size feTile font-stretch feTile font-style feTile font-variant feTile font-weight feTile glyph-orientation-horizontal feTile glyph-orientation-vertical feTile image-rendering feTile kerning feTile letter-spacing feTile lighting-color feTile marker-end feTile marker-mid feTile marker-start feTile mask feTile opacity feTile overflow feTile pointer-events feTile shape-rendering feTile stop-color feTile stop-opacity feTile stroke-dasharray feTile stroke-dashoffset feTile stroke-linecap feTile stroke-linejoin feTile stroke-miterlimit feTile stroke-opacity feTile stroke-width feTile stroke feTile text-anchor feTile text-decoration feTile text-rendering feTile unicode-bidi feTile visibility feTile word-spacingandwriting-mode feTile alignment-baseline feTurbulence baseline-shift feTurbulence clip-path feTurbulence clip-rule feTurbulence clip feTurbulence color-interpolation-filters feTurbulence color-interpolation feTurbulence color-profile feTurbulence color-rendering feTurbulence color feTurbulence cursor feTurbulence direction feTurbulence display feTurbulence dominant-baseline feTurbulence enable-background feTurbulence fill-opacity feTurbulence fill-rule feTurbulence fill feTurbulence filter feTurbulence flood-color feTurbulence flood-opacity feTurbulence font-family feTurbulence font-size-adjust feTurbulence font-size feTurbulence font-stretch feTurbulence font-style feTurbulence font-variant feTurbulence font-weight feTurbulence glyph-orientation-horizontal feTurbulence glyph-orientation-vertical feTurbulence image-rendering feTurbulence kerning feTurbulence letter-spacing feTurbulence lighting-color feTurbulence marker-end feTurbulence marker-mid feTurbulence marker-start feTurbulence mask feTurbulence opacity feTurbulence overflow feTurbulence pointer-events feTurbulence shape-rendering feTurbulence stop-color feTurbulence stop-opacity feTurbulence stroke-dasharray feTurbulence stroke-dashoffset feTurbulence stroke-linecap feTurbulence stroke-linejoin feTurbulence stroke-miterlimit feTurbulence stroke-opacity feTurbulence stroke-width feTurbulence stroke feTurbulence text-anchor feTurbulence text-decoration feTurbulence text-rendering feTurbulence unicode-bidi feTurbulence visibility feTurbulence word-spacingandwriting-mode feTurbulence alignment-baseline filter baseline-shift filter clip-path filter clip-rule filter clip filter color-interpolation-filters filter color-interpolation filter color-profile filter color-rendering filter color filter cursor filter direction filter display filter dominant-baseline filter enable-background filter fill-opacity filter fill-rule filter fill filter filter filter flood-color filter flood-opacity filter font-family filter font-size-adjust filter font-size filter font-stretch filter font-style filter font-variant filter font-weight filter glyph-orientation-horizontal filter glyph-orientation-vertical filter image-rendering filter kerning filter letter-spacing filter lighting-color filter marker-end filter marker-mid filter marker-start filter mask filter opacity filter overflow filter pointer-events filter shape-rendering filter stop-color filter stop-opacity filter stroke-dasharray filter stroke-dashoffset filter stroke-linecap filter stroke-linejoin filter stroke-miterlimit filter stroke-opacity filter stroke-width filter stroke filter text-anchor filter text-decoration filter text-rendering filter unicode-bidi filter visibility filter word-spacingandwriting-mode filter alignment-baseline font baseline-shift font clip-path font clip-rule font clip font color-interpolation-filters font color-interpolation font color-profile font color-rendering font color font cursor font direction font display font dominant-baseline font enable-background font fill-opacity font fill-rule font fill font filter font flood-color font flood-opacity font font-family font font-size-adjust font font-size font font-stretch font font-style font font-variant font font-weight font glyph-orientation-horizontal font glyph-orientation-vertical font image-rendering font kerning font letter-spacing font lighting-color font marker-end font marker-mid font marker-start font mask font opacity font overflow font pointer-events font shape-rendering font stop-color font stop-opacity font stroke-dasharray font stroke-dashoffset font stroke-linecap font stroke-linejoin font stroke-miterlimit font stroke-opacity font stroke-width font stroke font text-anchor font text-decoration font text-rendering font unicode-bidi font visibility font word-spacingandwriting-mode font alignment-baseline foreignObject baseline-shift foreignObject clip-path foreignObject clip-rule foreignObject clip foreignObject color-interpolation-filters foreignObject color-interpolation foreignObject color-profile foreignObject color-rendering foreignObject color foreignObject cursor foreignObject direction foreignObject display foreignObject dominant-baseline foreignObject enable-background foreignObject fill-opacity foreignObject fill-rule foreignObject fill foreignObject filter foreignObject flood-color foreignObject flood-opacity foreignObject font-family foreignObject font-size-adjust foreignObject font-size foreignObject font-stretch foreignObject font-style foreignObject font-variant foreignObject font-weight foreignObject glyph-orientation-horizontal foreignObject glyph-orientation-vertical foreignObject image-rendering foreignObject kerning foreignObject letter-spacing foreignObject lighting-color foreignObject marker-end foreignObject marker-mid foreignObject marker-start foreignObject mask foreignObject opacity foreignObject overflow foreignObject pointer-events foreignObject shape-rendering foreignObject stop-color foreignObject stop-opacity foreignObject stroke-dasharray foreignObject stroke-dashoffset foreignObject stroke-linecap foreignObject stroke-linejoin foreignObject stroke-miterlimit foreignObject stroke-opacity foreignObject stroke-width foreignObject stroke foreignObject text-anchor foreignObject text-decoration foreignObject text-rendering foreignObject unicode-bidi foreignObject visibility foreignObject word-spacingandwriting-mode foreignObject alignment-baseline g baseline-shift g clip-path g clip-rule g clip g color-interpolation-filters g color-interpolation g color-profile g color-rendering g color g cursor g direction g display g dominant-baseline g enable-background g fill-opacity g fill-rule g fill g filter g flood-color g flood-opacity g font-family g font-size-adjust g font-size g font-stretch g font-style g font-variant g font-weight g glyph-orientation-horizontal g glyph-orientation-vertical g image-rendering g kerning g letter-spacing g lighting-color g marker-end g marker-mid g marker-start g mask g opacity g overflow g pointer-events g shape-rendering g stop-color g stop-opacity g stroke-dasharray g stroke-dashoffset g stroke-linecap g stroke-linejoin g stroke-miterlimit g stroke-opacity g stroke-width g stroke g text-anchor g text-decoration g text-rendering g unicode-bidi g visibility g word-spacingandwriting-mode g alignment-baseline glyph baseline-shift glyph clip-path glyph clip-rule glyph clip glyph color-interpolation-filters glyph color-interpolation glyph color-profile glyph color-rendering glyph color glyph cursor glyph direction glyph display glyph dominant-baseline glyph enable-background glyph fill-opacity glyph fill-rule glyph fill glyph filter glyph flood-color glyph flood-opacity glyph font-family glyph font-size-adjust glyph font-size glyph font-stretch glyph font-style glyph font-variant glyph font-weight glyph glyph-orientation-horizontal glyph glyph-orientation-vertical glyph image-rendering glyph kerning glyph letter-spacing glyph lighting-color glyph marker-end glyph marker-mid glyph marker-start glyph mask glyph opacity glyph overflow glyph pointer-events glyph shape-rendering glyph stop-color glyph stop-opacity glyph stroke-dasharray glyph stroke-dashoffset glyph stroke-linecap glyph stroke-linejoin glyph stroke-miterlimit glyph stroke-opacity glyph stroke-width glyph stroke glyph text-anchor glyph text-decoration glyph text-rendering glyph unicode-bidi glyph visibility glyph word-spacingandwriting-mode glyph alignment-baseline glyphRef baseline-shift glyphRef clip-path glyphRef clip-rule glyphRef clip glyphRef color-interpolation-filters glyphRef color-interpolation glyphRef color-profile glyphRef color-rendering glyphRef color glyphRef cursor glyphRef direction glyphRef display glyphRef dominant-baseline glyphRef enable-background glyphRef fill-opacity glyphRef fill-rule glyphRef fill glyphRef filter glyphRef flood-color glyphRef flood-opacity glyphRef font-family glyphRef font-size-adjust glyphRef font-size glyphRef font-stretch glyphRef font-style glyphRef font-variant glyphRef font-weight glyphRef glyph-orientation-horizontal glyphRef glyph-orientation-vertical glyphRef image-rendering glyphRef kerning glyphRef letter-spacing glyphRef lighting-color glyphRef marker-end glyphRef marker-mid glyphRef marker-start glyphRef mask glyphRef opacity glyphRef overflow glyphRef pointer-events glyphRef shape-rendering glyphRef stop-color glyphRef stop-opacity glyphRef stroke-dasharray glyphRef stroke-dashoffset glyphRef stroke-linecap glyphRef stroke-linejoin glyphRef stroke-miterlimit glyphRef stroke-opacity glyphRef stroke-width glyphRef stroke glyphRef text-anchor glyphRef text-decoration glyphRef text-rendering glyphRef unicode-bidi glyphRef visibility glyphRef word-spacingandwriting-mode glyphRef alignment-baseline image baseline-shift image clip-path image clip-rule image clip image color-interpolation-filters image color-interpolation image color-profile image color-rendering image color image cursor image direction image display image dominant-baseline image enable-background image fill-opacity image fill-rule image fill image filter image flood-color image flood-opacity image font-family image font-size-adjust image font-size image font-stretch image font-style image font-variant image font-weight image glyph-orientation-horizontal image glyph-orientation-vertical image image-rendering image kerning image letter-spacing image lighting-color image marker-end image marker-mid image marker-start image mask image opacity image overflow image pointer-events image shape-rendering image stop-color image stop-opacity image stroke-dasharray image stroke-dashoffset image stroke-linecap image stroke-linejoin image stroke-miterlimit image stroke-opacity image stroke-width image stroke image text-anchor image text-decoration image text-rendering image unicode-bidi image visibility image word-spacingandwriting-mode image alignment-baseline line baseline-shift line clip-path line clip-rule line clip line color-interpolation-filters line color-interpolation line color-profile line color-rendering line color line cursor line direction line display line dominant-baseline line enable-background line fill-opacity line fill-rule line fill line filter line flood-color line flood-opacity line font-family line font-size-adjust line font-size line font-stretch line font-style line font-variant line font-weight line glyph-orientation-horizontal line glyph-orientation-vertical line image-rendering line kerning line letter-spacing line lighting-color line marker-end line marker-mid line marker-start line mask line opacity line overflow line pointer-events line shape-rendering line stop-color line stop-opacity line stroke-dasharray line stroke-dashoffset line stroke-linecap line stroke-linejoin line stroke-miterlimit line stroke-opacity line stroke-width line stroke line text-anchor line text-decoration line text-rendering line unicode-bidi line visibility line word-spacingandwriting-mode line alignment-baseline linearGradient baseline-shift linearGradient clip-path linearGradient clip-rule linearGradient clip linearGradient color-interpolation-filters linearGradient color-interpolation linearGradient color-profile linearGradient color-rendering linearGradient color linearGradient cursor linearGradient direction linearGradient display linearGradient dominant-baseline linearGradient enable-background linearGradient fill-opacity linearGradient fill-rule linearGradient fill linearGradient filter linearGradient flood-color linearGradient flood-opacity linearGradient font-family linearGradient font-size-adjust linearGradient font-size linearGradient font-stretch linearGradient font-style linearGradient font-variant linearGradient font-weight linearGradient glyph-orientation-horizontal linearGradient glyph-orientation-vertical linearGradient image-rendering linearGradient kerning linearGradient letter-spacing linearGradient lighting-color linearGradient marker-end linearGradient marker-mid linearGradient marker-start linearGradient mask linearGradient opacity linearGradient overflow linearGradient pointer-events linearGradient shape-rendering linearGradient stop-color linearGradient stop-opacity linearGradient stroke-dasharray linearGradient stroke-dashoffset linearGradient stroke-linecap linearGradient stroke-linejoin linearGradient stroke-miterlimit linearGradient stroke-opacity linearGradient stroke-width linearGradient stroke linearGradient text-anchor linearGradient text-decoration linearGradient text-rendering linearGradient unicode-bidi linearGradient visibility linearGradient word-spacingandwriting-mode linearGradient alignment-baseline marker baseline-shift marker clip-path marker clip-rule marker clip marker color-interpolation-filters marker color-interpolation marker color-profile marker color-rendering marker color marker cursor marker direction marker display marker dominant-baseline marker enable-background marker fill-opacity marker fill-rule marker fill marker filter marker flood-color marker flood-opacity marker font-family marker font-size-adjust marker font-size marker font-stretch marker font-style marker font-variant marker font-weight marker glyph-orientation-horizontal marker glyph-orientation-vertical marker image-rendering marker kerning marker letter-spacing marker lighting-color marker marker-end marker marker-mid marker marker-start marker mask marker opacity marker overflow marker pointer-events marker shape-rendering marker stop-color marker stop-opacity marker stroke-dasharray marker stroke-dashoffset marker stroke-linecap marker stroke-linejoin marker stroke-miterlimit marker stroke-opacity marker stroke-width marker stroke marker text-anchor marker text-decoration marker text-rendering marker unicode-bidi marker visibility marker word-spacingandwriting-mode marker alignment-baseline mask baseline-shift mask clip-path mask clip-rule mask clip mask color-interpolation-filters mask color-interpolation mask color-profile mask color-rendering mask color mask cursor mask direction mask display mask dominant-baseline mask enable-background mask fill-opacity mask fill-rule mask fill mask filter mask flood-color mask flood-opacity mask font-family mask font-size-adjust mask font-size mask font-stretch mask font-style mask font-variant mask font-weight mask glyph-orientation-horizontal mask glyph-orientation-vertical mask image-rendering mask kerning mask letter-spacing mask lighting-color mask marker-end mask marker-mid mask marker-start mask mask mask opacity mask overflow mask pointer-events mask shape-rendering mask stop-color mask stop-opacity mask stroke-dasharray mask stroke-dashoffset mask stroke-linecap mask stroke-linejoin mask stroke-miterlimit mask stroke-opacity mask stroke-width mask stroke mask text-anchor mask text-decoration mask text-rendering mask unicode-bidi mask visibility mask word-spacingandwriting-mode mask alignment-baseline missing-glyph baseline-shift missing-glyph clip-path missing-glyph clip-rule missing-glyph clip missing-glyph color-interpolation-filters missing-glyph color-interpolation missing-glyph color-profile missing-glyph color-rendering missing-glyph color missing-glyph cursor missing-glyph direction missing-glyph display missing-glyph dominant-baseline missing-glyph enable-background missing-glyph fill-opacity missing-glyph fill-rule missing-glyph fill missing-glyph filter missing-glyph flood-color missing-glyph flood-opacity missing-glyph font-family missing-glyph font-size-adjust missing-glyph font-size missing-glyph font-stretch missing-glyph font-style missing-glyph font-variant missing-glyph font-weight missing-glyph glyph-orientation-horizontal missing-glyph glyph-orientation-vertical missing-glyph image-rendering missing-glyph kerning missing-glyph letter-spacing missing-glyph lighting-color missing-glyph marker-end missing-glyph marker-mid missing-glyph marker-start missing-glyph mask missing-glyph opacity missing-glyph overflow missing-glyph pointer-events missing-glyph shape-rendering missing-glyph stop-color missing-glyph stop-opacity missing-glyph stroke-dasharray missing-glyph stroke-dashoffset missing-glyph stroke-linecap missing-glyph stroke-linejoin missing-glyph stroke-miterlimit missing-glyph stroke-opacity missing-glyph stroke-width missing-glyph stroke missing-glyph text-anchor missing-glyph text-decoration missing-glyph text-rendering missing-glyph unicode-bidi missing-glyph visibility missing-glyph word-spacingandwriting-mode missing-glyph alignment-baseline path baseline-shift path clip-path path clip-rule path clip path color-interpolation-filters path color-interpolation path color-profile path color-rendering path color path cursor path direction path display path dominant-baseline path enable-background path fill-opacity path fill-rule path fill path filter path flood-color path flood-opacity path font-family path font-size-adjust path font-size path font-stretch path font-style path font-variant path font-weight path glyph-orientation-horizontal path glyph-orientation-vertical path image-rendering path kerning path letter-spacing path lighting-color path marker-end path marker-mid path marker-start path mask path opacity path overflow path pointer-events path shape-rendering path stop-color path stop-opacity path stroke-dasharray path stroke-dashoffset path stroke-linecap path stroke-linejoin path stroke-miterlimit path stroke-opacity path stroke-width path stroke path text-anchor path text-decoration path text-rendering path unicode-bidi path visibility path word-spacingandwriting-mode path alignment-baseline pattern baseline-shift pattern clip-path pattern clip-rule pattern clip pattern color-interpolation-filters pattern color-interpolation pattern color-profile pattern color-rendering pattern color pattern cursor pattern direction pattern display pattern dominant-baseline pattern enable-background pattern fill-opacity pattern fill-rule pattern fill pattern filter pattern flood-color pattern flood-opacity pattern font-family pattern font-size-adjust pattern font-size pattern font-stretch pattern font-style pattern font-variant pattern font-weight pattern glyph-orientation-horizontal pattern glyph-orientation-vertical pattern image-rendering pattern kerning pattern letter-spacing pattern lighting-color pattern marker-end pattern marker-mid pattern marker-start pattern mask pattern opacity pattern overflow pattern pointer-events pattern shape-rendering pattern stop-color pattern stop-opacity pattern stroke-dasharray pattern stroke-dashoffset pattern stroke-linecap pattern stroke-linejoin pattern stroke-miterlimit pattern stroke-opacity pattern stroke-width pattern stroke pattern text-anchor pattern text-decoration pattern text-rendering pattern unicode-bidi pattern visibility pattern word-spacingandwriting-mode pattern alignment-baseline polygon baseline-shift polygon clip-path polygon clip-rule polygon clip polygon color-interpolation-filters polygon color-interpolation polygon color-profile polygon color-rendering polygon color polygon cursor polygon direction polygon display polygon dominant-baseline polygon enable-background polygon fill-opacity polygon fill-rule polygon fill polygon filter polygon flood-color polygon flood-opacity polygon font-family polygon font-size-adjust polygon font-size polygon font-stretch polygon font-style polygon font-variant polygon font-weight polygon glyph-orientation-horizontal polygon glyph-orientation-vertical polygon image-rendering polygon kerning polygon letter-spacing polygon lighting-color polygon marker-end polygon marker-mid polygon marker-start polygon mask polygon opacity polygon overflow polygon pointer-events polygon shape-rendering polygon stop-color polygon stop-opacity polygon stroke-dasharray polygon stroke-dashoffset polygon stroke-linecap polygon stroke-linejoin polygon stroke-miterlimit polygon stroke-opacity polygon stroke-width polygon stroke polygon text-anchor polygon text-decoration polygon text-rendering polygon unicode-bidi polygon visibility polygon word-spacingandwriting-mode polygon alignment-baseline polyline baseline-shift polyline clip-path polyline clip-rule polyline clip polyline color-interpolation-filters polyline color-interpolation polyline color-profile polyline color-rendering polyline color polyline cursor polyline direction polyline display polyline dominant-baseline polyline enable-background polyline fill-opacity polyline fill-rule polyline fill polyline filter polyline flood-color polyline flood-opacity polyline font-family polyline font-size-adjust polyline font-size polyline font-stretch polyline font-style polyline font-variant polyline font-weight polyline glyph-orientation-horizontal polyline glyph-orientation-vertical polyline image-rendering polyline kerning polyline letter-spacing polyline lighting-color polyline marker-end polyline marker-mid polyline marker-start polyline mask polyline opacity polyline overflow polyline pointer-events polyline shape-rendering polyline stop-color polyline stop-opacity polyline stroke-dasharray polyline stroke-dashoffset polyline stroke-linecap polyline stroke-linejoin polyline stroke-miterlimit polyline stroke-opacity polyline stroke-width polyline stroke polyline text-anchor polyline text-decoration polyline text-rendering polyline unicode-bidi polyline visibility polyline word-spacingandwriting-mode polyline alignment-baseline radialGradient baseline-shift radialGradient clip-path radialGradient clip-rule radialGradient clip radialGradient color-interpolation-filters radialGradient color-interpolation radialGradient color-profile radialGradient color-rendering radialGradient color radialGradient cursor radialGradient direction radialGradient display radialGradient dominant-baseline radialGradient enable-background radialGradient fill-opacity radialGradient fill-rule radialGradient fill radialGradient filter radialGradient flood-color radialGradient flood-opacity radialGradient font-family radialGradient font-size-adjust radialGradient font-size radialGradient font-stretch radialGradient font-style radialGradient font-variant radialGradient font-weight radialGradient glyph-orientation-horizontal radialGradient glyph-orientation-vertical radialGradient image-rendering radialGradient kerning radialGradient letter-spacing radialGradient lighting-color radialGradient marker-end radialGradient marker-mid radialGradient marker-start radialGradient mask radialGradient opacity radialGradient overflow radialGradient pointer-events radialGradient shape-rendering radialGradient stop-color radialGradient stop-opacity radialGradient stroke-dasharray radialGradient stroke-dashoffset radialGradient stroke-linecap radialGradient stroke-linejoin radialGradient stroke-miterlimit radialGradient stroke-opacity radialGradient stroke-width radialGradient stroke radialGradient text-anchor radialGradient text-decoration radialGradient text-rendering radialGradient unicode-bidi radialGradient visibility radialGradient word-spacingandwriting-mode radialGradient alignment-baseline rect baseline-shift rect clip-path rect clip-rule rect clip rect color-interpolation-filters rect color-interpolation rect color-profile rect color-rendering rect color rect cursor rect direction rect display rect dominant-baseline rect enable-background rect fill-opacity rect fill-rule rect fill rect filter rect flood-color rect flood-opacity rect font-family rect font-size-adjust rect font-size rect font-stretch rect font-style rect font-variant rect font-weight rect glyph-orientation-horizontal rect glyph-orientation-vertical rect image-rendering rect kerning rect letter-spacing rect lighting-color rect marker-end rect marker-mid rect marker-start rect mask rect opacity rect overflow rect pointer-events rect shape-rendering rect stop-color rect stop-opacity rect stroke-dasharray rect stroke-dashoffset rect stroke-linecap rect stroke-linejoin rect stroke-miterlimit rect stroke-opacity rect stroke-width rect stroke rect text-anchor rect text-decoration rect text-rendering rect unicode-bidi rect visibility rect word-spacingandwriting-mode rect alignment-baseline stop baseline-shift stop clip-path stop clip-rule stop clip stop color-interpolation-filters stop color-interpolation stop color-profile stop color-rendering stop color stop cursor stop direction stop display stop dominant-baseline stop enable-background stop fill-opacity stop fill-rule stop fill stop filter stop flood-color stop flood-opacity stop font-family stop font-size-adjust stop font-size stop font-stretch stop font-style stop font-variant stop font-weight stop glyph-orientation-horizontal stop glyph-orientation-vertical stop image-rendering stop kerning stop letter-spacing stop lighting-color stop marker-end stop marker-mid stop marker-start stop mask stop opacity stop overflow stop pointer-events stop shape-rendering stop stop-color stop stop-opacity stop stroke-dasharray stop stroke-dashoffset stop stroke-linecap stop stroke-linejoin stop stroke-miterlimit stop stroke-opacity stop stroke-width stop stroke stop text-anchor stop text-decoration stop text-rendering stop unicode-bidi stop visibility stop word-spacingandwriting-mode stop alignment-baseline svg baseline-shift svg clip-path svg clip-rule svg clip svg color-interpolation-filters svg color-interpolation svg color-profile svg color-rendering svg color svg cursor svg direction svg display svg dominant-baseline svg enable-background svg fill-opacity svg fill-rule svg fill svg filter svg flood-color svg flood-opacity svg font-family svg font-size-adjust svg font-size svg font-stretch svg font-style svg font-variant svg font-weight svg glyph-orientation-horizontal svg glyph-orientation-vertical svg image-rendering svg kerning svg letter-spacing svg lighting-color svg marker-end svg marker-mid svg marker-start svg mask svg opacity svg overflow svg pointer-events svg shape-rendering svg stop-color svg stop-opacity svg stroke-dasharray svg stroke-dashoffset svg stroke-linecap svg stroke-linejoin svg stroke-miterlimit svg stroke-opacity svg stroke-width svg stroke svg text-anchor svg text-decoration svg text-rendering svg unicode-bidi svg visibility svg word-spacingandwriting-mode svg alignment-baseline switch baseline-shift switch clip-path switch clip-rule switch clip switch color-interpolation-filters switch color-interpolation switch color-profile switch color-rendering switch color switch cursor switch direction switch display switch dominant-baseline switch enable-background switch fill-opacity switch fill-rule switch fill switch filter switch flood-color switch flood-opacity switch font-family switch font-size-adjust switch font-size switch font-stretch switch font-style switch font-variant switch font-weight switch glyph-orientation-horizontal switch glyph-orientation-vertical switch image-rendering switch kerning switch letter-spacing switch lighting-color switch marker-end switch marker-mid switch marker-start switch mask switch opacity switch overflow switch pointer-events switch shape-rendering switch stop-color switch stop-opacity switch stroke-dasharray switch stroke-dashoffset switch stroke-linecap switch stroke-linejoin switch stroke-miterlimit switch stroke-opacity switch stroke-width switch stroke switch text-anchor switch text-decoration switch text-rendering switch unicode-bidi switch visibility switch word-spacingandwriting-mode switch alignment-baseline symbol baseline-shift symbol clip-path symbol clip-rule symbol clip symbol color-interpolation-filters symbol color-interpolation symbol color-profile symbol color-rendering symbol color symbol cursor symbol direction symbol display symbol dominant-baseline symbol enable-background symbol fill-opacity symbol fill-rule symbol fill symbol filter symbol flood-color symbol flood-opacity symbol font-family symbol font-size-adjust symbol font-size symbol font-stretch symbol font-style symbol font-variant symbol font-weight symbol glyph-orientation-horizontal symbol glyph-orientation-vertical symbol image-rendering symbol kerning symbol letter-spacing symbol lighting-color symbol marker-end symbol marker-mid symbol marker-start symbol mask symbol opacity symbol overflow symbol pointer-events symbol shape-rendering symbol stop-color symbol stop-opacity symbol stroke-dasharray symbol stroke-dashoffset symbol stroke-linecap symbol stroke-linejoin symbol stroke-miterlimit symbol stroke-opacity symbol stroke-width symbol stroke symbol text-anchor symbol text-decoration symbol text-rendering symbol unicode-bidi symbol visibility symbol word-spacingandwriting-mode symbol alignment-baseline text baseline-shift text clip-path text clip-rule text clip text color-interpolation-filters text color-interpolation text color-profile text color-rendering text color text cursor text direction text display text dominant-baseline text enable-background text fill-opacity text fill-rule text fill text filter text flood-color text flood-opacity text font-family text font-size-adjust text font-size text font-stretch text font-style text font-variant text font-weight text glyph-orientation-horizontal text glyph-orientation-vertical text image-rendering text kerning text letter-spacing text lighting-color text marker-end text marker-mid text marker-start text mask text opacity text overflow text pointer-events text shape-rendering text stop-color text stop-opacity text stroke-dasharray text stroke-dashoffset text stroke-linecap text stroke-linejoin text stroke-miterlimit text stroke-opacity text stroke-width text stroke text text-anchor text text-decoration text text-rendering text unicode-bidi text visibility text word-spacingandwriting-mode text alignment-baseline textPath baseline-shift textPath clip-path textPath clip-rule textPath clip textPath color-interpolation-filters textPath color-interpolation textPath color-profile textPath color-rendering textPath color textPath cursor textPath direction textPath display textPath dominant-baseline textPath enable-background textPath fill-opacity textPath fill-rule textPath fill textPath filter textPath flood-color textPath flood-opacity textPath font-family textPath font-size-adjust textPath font-size textPath font-stretch textPath font-style textPath font-variant textPath font-weight textPath glyph-orientation-horizontal textPath glyph-orientation-vertical textPath image-rendering textPath kerning textPath letter-spacing textPath lighting-color textPath marker-end textPath marker-mid textPath marker-start textPath mask textPath opacity textPath overflow textPath pointer-events textPath shape-rendering textPath stop-color textPath stop-opacity textPath stroke-dasharray textPath stroke-dashoffset textPath stroke-linecap textPath stroke-linejoin textPath stroke-miterlimit textPath stroke-opacity textPath stroke-width textPath stroke textPath text-anchor textPath text-decoration textPath text-rendering textPath unicode-bidi textPath visibility textPath word-spacingandwriting-mode textPath alignment-baseline tref baseline-shift tref clip-path tref clip-rule tref clip tref color-interpolation-filters tref color-interpolation tref color-profile tref color-rendering tref color tref cursor tref direction tref display tref dominant-baseline tref enable-background tref fill-opacity tref fill-rule tref fill tref filter tref flood-color tref flood-opacity tref font-family tref font-size-adjust tref font-size tref font-stretch tref font-style tref font-variant tref font-weight tref glyph-orientation-horizontal tref glyph-orientation-vertical tref image-rendering tref kerning tref letter-spacing tref lighting-color tref marker-end tref marker-mid tref marker-start tref mask tref opacity tref overflow tref pointer-events tref shape-rendering tref stop-color tref stop-opacity tref stroke-dasharray tref stroke-dashoffset tref stroke-linecap tref stroke-linejoin tref stroke-miterlimit tref stroke-opacity tref stroke-width tref stroke tref text-anchor tref text-decoration tref text-rendering tref unicode-bidi tref visibility tref word-spacingandwriting-mode tref alignment-baseline tspananduse baseline-shift tspananduse clip-path tspananduse clip-rule tspananduse clip tspananduse color-interpolation-filters tspananduse color-interpolation tspananduse color-profile tspananduse color-rendering tspananduse color tspananduse cursor tspananduse direction tspananduse display tspananduse dominant-baseline tspananduse enable-background tspananduse fill-opacity tspananduse fill-rule tspananduse fill tspananduse filter tspananduse flood-color tspananduse flood-opacity tspananduse font-family tspananduse font-size-adjust tspananduse font-size tspananduse font-stretch tspananduse font-style tspananduse font-variant tspananduse font-weight tspananduse glyph-orientation-horizontal tspananduse glyph-orientation-vertical tspananduse image-rendering tspananduse kerning tspananduse letter-spacing tspananduse lighting-color tspananduse marker-end tspananduse marker-mid tspananduse marker-start tspananduse mask tspananduse opacity tspananduse overflow tspananduse pointer-events tspananduse shape-rendering tspananduse stop-color tspananduse stop-opacity tspananduse stroke-dasharray tspananduse stroke-dashoffset tspananduse stroke-linecap tspananduse stroke-linejoin tspananduse stroke-miterlimit tspananduse stroke-opacity tspananduse stroke-width tspananduse stroke tspananduse text-anchor tspananduse text-decoration tspananduse text-rendering tspananduse unicode-bidi tspananduse visibility tspananduse word-spacingandwriting-mode tspananduse ������������������������gridSVG/inst/NEWS.Rd��������������������������������������������������������������������������������0000654�0001762�0000144�00000066457�13651654477�013644� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{NEWS} \title{NEWS file for the gridSVG package} \encoding{UTF-8} \section{Changes in version 1.7-2}{ \itemize{ \item Simpler and better transformations for exported SVG elements. \item Better protection against \code{NA} values in labels in text grobs. Reported by Daniel Barnett. } } \section{Changes in version 1.7-1}{ \itemize{ \item Fix for evaluation of arguments passed to \code{pdf()} device within \code{gridsvg()}. Patch provided by Philipp Angerer. \item Avoid peeking at internal representation of \pkg{grid} units. } } \section{Changes in version 1.7-0}{ \itemize{ \item Update for addition of \code{pathId} argument in \code{grid.path}. } } \section{Changes in version 1.6-1}{ \itemize{ \item Additional fix for \code{pch=NA} } } \section{Changes in version 1.6-0}{ \itemize{ \item Generation of SVG from \code{grid.export()} is now much faster (when you are drawing many rectangles, points, circles, or lines). } } \section{Changes in version 1.5-1}{ \itemize{ \item Fix to ensure that \code{r} attribute in radial gradients is non-negative. \item Fix for strict attribute checking now includes presentation attributes. \item Fix for \pkg{gtable} support when grob in table cell has viewport with non-centering alignment (e.g., a \pkg{ggplot2} plot with more than one legend). Reported by Tauno Metsalu. \item Switched JSON library from \pkg{RJSONIO} to \pkg{jsonlite}. \pkg{gridSVG} no longer needs to compile C code as it can import a base64 encoding method from \pkg{jsonlite}. \item Bug fix to handle exporting par(lty="blank"), e.g., from boxplot() (converted with \pkg{gridGraphics}). Thanks to Volker Sorge. \item Bug fix to handle pch=NA. Thanks to Volker Sorge. } } \section{Changes in version 1.5-0}{ \itemize{ \item Added \code{strict} argument for \code{grid.export()} and \code{gridsvg()} to allow control over whether SVG attributes are checked for validity. \item Added \code{rootAttrs} argument for \code{grid.export()} and \code{gridsvg()} to allow control over attributes of top-level \code{} element. Suggestion and original patch from Thell Fowler. } } \section{Changes in version 1.4-4}{ \itemize{ \item Fixed bug where \code{gpar(col=c(foo="red"))} would not work (the name \code{foo} is now stripped). Reported by Simon Anders. \item Fixed bug in feColorMatrix(). The color matrix required transposing before export to SVG. \item Fixed bug in feComponentTransfer(). Was generating an feColorMatrix element \emph{and} was inlining transfer functions as attributes (rather than generating feFunc elements as children). \item Added support for NA values in locations and dimensions of graphical primitives. } } \section{Changes in version 1.4-3}{ \itemize{ \item Non-SVG style attributes are now \emph{removed} (with a warning) and this is done \emph{before} checking attributes for length equal to 1. This was in response to a problem reported by Wolfgang Huber. \item Fix evaluation of arguments when using the 'gridsvg' device. These were not being evaluated before being passed to 'grid.export'. Also reported by Wolfgang Huber. } } \section{Changes in version 1.4-2}{ \itemize{ \item Fixed export of clip grob (reported by Matthew Plourde). \item Fixed support for primitiveUnits="bbox" in filterEffect(). \item Fix memory initialisation problem in base64 C code. Reported in valgrind testing by Brian Ripley. } } \section{Changes in version 1.4-1}{ \itemize{ \item Fixed raster export so that original raster is never exported at a resolution LOWER than its native resolution. \item Added forceGrob() methods so that animations, garnishing, hyperlinks, etc are retained if a grob is forced. \item Fix for export of downViewport(path) when the depth of the resulting navigation is greater than depth(path). The visible manifestation of this bug was that elements were generated with an incorrect (too long/wrong depth) 'id' attribute. } } \section{Changes in version 1.4-0}{ \itemize{ \item Bumped R version requirement to R >= 3.1.0 because this version of gridSVG depends on some new exports from 'grid' \item Removed all nasty peeks into grid namespace (hence dependence on R 3.1.0). \item Tweaks to tests/ to make it easier to do QC checks. } } \section{Changes in version 1.3-0}{ \itemize{ \item Added support for rotated viewports (previously, rectangles, text, rasters, and clipping rects did not export properly, if drawn within a rotated viewport) Includes changes to rendering, animation, and coordinate system export and conversion. \item Fixed bug in viewportConvertWidth() and viewportConvertHeight() when converting from "native". \item Bug fix for positioning grobs with dimensions when a viewport's x-scale or y-scale is "flipped". (Simon) \item Reposition so that definitions are always available when used. Allows renderers like librsvg to render gridSVG images correctly. For consistency, pch definitions are also pushed into the same element. (Simon) \item Bug fix for 'lwd'. They are now defined as being 1/96 inches, which matches most graphics devices. (Simon) \item Only one 'gridsvg' device can now be open at once. This is because referenced content (like gradients, masks, etc) can have side effects across multiple 'gridsvg' devices. (Simon) \item New argument for 'grid.export()', 'progress'. When this argument is 'TRUE', messages will be printed to the console that show how far gridSVG is through processing an image. Additionally, progress bars are drawn to aid in estimation of progress. (Simon) \item New argument for 'grid.export()', 'compression'. This can take an integer value between 0 and 9 that describes the level of (gzip) compression applied to the exported image. (Simon) \item Added 'group', 'strict', 'grep', and 'global' arguments to grid.animate() (to bring it into line with grid.hyperlink() and grid.garnish(). \item Now Import rather than Depend on other packages. } } \section{Changes in version 1.2-0}{ \itemize{ \item The main change in this version involves taking advantage of changes in R version 3.0.0, which introduced a \code{grid.force()} function. This reduces the need for special methods in this package to draw custom grobs. \item Renamed 'gridToSVG' to 'grid.export'. 'gridToSVG' is now deprecated and will produce a warning but will still work. 'grid.export' should be used from now on. (Simon) \item Renamed 'grid.export' arguments for consistency. 'export.coords', 'export.mappings', and 'export.js' are now camelCased to 'exportCoords', 'exportMappings', 'exportJS' respectively. (Simon) \item Bumped R version dependency to R >= 3.0.0 because \code{gridToSVG()} now calls \code{grid.force()} before export \item Removed several \code{primToDev()} methods: \itemize{ \item \code{primToDev.xaxis()} \item \code{primToDev.yaxis()} \item \code{grobToDev.roundrect()} \item \code{grobToDev.frame()} \item \code{grobToDev.cellGrob()} } \item Bug fix for multi-line text when cex != 1 \item Initial implementation of pattern fills. Define pattern fills using 'pattern' and 'registerPatternFill' (and also 'registerPatternFillRef' to reuse an existing definition). These can then be applied to grobs using 'grid.patternFill' and 'patternFillGrob'. (Simon) \item Add a graphics device-like interface to gridSVG. Use 'gridsvg' to open a gridSVG device, and 'dev.off' to close it. (Simon) \item Added new 'gridSVG.newpage' function. It will clear all definitions of referenced content as well as calling 'grid.newpage'. (Simon) \item Now allowing for a prefix to be applied to all SVG ID attributes. Particularly useful when including multiple gridSVG images in the same document as it ensures uniqueness of IDs between documents. This can be used by specifying the 'prefix' argument to 'grid.export'. (Simon) \item New optional parameter to 'grid.export', 'addClasses'. If this argument is 'TRUE', then gridSVG will add an SVG class attribute to each grob or viewport it draws. The value of this attribute is what is produced by calling 'class' on the object. This is useful for allowing a convenient way of selecting more than one type of grob (e.g. the '.axis' CSS selector will select all axis grobs). (Simon) \item Added implementation of gradient fills for grobs. See 'linearGradient', 'radialGradient', and 'registerGradientFill' for defining gradients. Use 'grid.gradientFill' and 'gradientFillGrob' to apply gradient fills to grobs. (Simon) \item Bug fix for pointsGrobs. 'size' units were unnecessarily being manipulated. They should now be sized more accurately. (Simon & Paul) \item Added support for non-rectangular clipping paths. Use 'grid.clipPath' and 'clipPathGrob' for applying clipping paths to grobs. Use 'pushClipPath' for applying to the current viewport, which behaves similarly to 'grid.clip'. Uses an object produced by 'clipPath' as the definition for the clipping path and is registered by calling 'registerClipPath'. (Simon) \item Added support for opacity masks. Use 'grid.mask' and 'maskGrob' to apply opacity masks to grobs. Use 'pushMask' for applying to the current viewport, which behaves similarly to 'grid.clip'. Uses a grob as the definition for an opacity mask. Define the mask using 'mask' and 'registerMask'. (Simon) \item New function 'popContext', which stops the effect of 'pushMask' and 'pushClipPath'. (Simon) \item Bug fix for 'clipGrob's. Now unwinds only when a viewport is popped and just not any grouped content. (Simon) \item Added support for SVG filter effects. Create a filter effect by calling 'filterEffect' and adding as its children some of the various filter effect primitives by calling 'fe*' functions. Some of these filter effects are quite complicated so reading the function documentation and the SVG specification is required. Apply filter effects to grobs using 'grid.filter' and 'filterGrob'. (Simon) \item Bugfix for unit conversion functions. "svg" was not being handled correctly. (Simon) \item Bugfix for arrows. Definition now matches 'grid'. Now also handles the case when an arrow's line width is greater than its width/height (Firefox would not show the arrow prior to this fix). (Simon) \item Bugfix for polygons and xsplines. They should now handle the case where an 'id.length' is 0. (Simon) \item Plain SVG text can now be inserted into the image (in a similar manner to 'grid.element') using 'grid.textNode'. (Simon) \item Bugfix 'childrenOrder' is now respected for gTrees. \item Bugfix for colours. 0 is now valid (but transparent). (Simon) \item Fix for garnishing. They should now always be applied over the top of existing SVG attributes. (Simon) \item Bug fix for fill in arrow heads on xsplines (was being forced to transparent) \item Bug fix to trim identical values from start and end of xspline points (otherwise auto calculation of arrow orientation can get confused) } } \section{Changes in version 1.1-0}{ \itemize{ \item Added options for 'vpPath' and 'gPath' separators. This allows for easier manipulation in JavaScript as the separators no longer need to be the troublesome '::' (which require escaping with CSS selectors). (Simon) \item Exporting HTML files is now optional. (Simon) \item Always return a named list with the output of 'gridToSVG()'. This is invisibly returned when an SVG file is saved to disk. (Simon) \item Added 'usePaths' option for determining whether to use vpPaths and gPaths SVG IDs. (Simon) \item Added 'uniqueNames' option for generating unique names for SVG IDs from grob and viewport names. This further distances ourselves from the original grid names. (Simon) \item Added 'export.mappings' option for exporting name mapping information. This allows us to keep track of names and how they have been modified by gridSVG. (Simon) \item Added 'gridSVGMappings' function to import mapping information. (Simon) \item Added 'getSVGMappings' function to retrieve IDs generated for an image from a grob or a viewport name. Also exported are CSS selectors and XPath expressions. These can also be retrieved by 'getSVGMappings'. (Simon) \item Added new generic element interface, 'grid.element'. Allows any arbitrary SVG element (or tree of elements) to be inserted into the resulting SVG image. (Simon) \item When using the 'grep' argument for 'grid.hyperlink' and 'grid.garnish', we can now apply effects to multiple grobs where gPaths are regular expressions. (Simon) \item Added a new optional argument to 'gridToSVG', called 'annotate'. If 'TRUE', adds an SVG 'metadata' element below the root '' element that provides information on how 'gridToSVG' was called, along with metadata about gridSVG itself. Potentially useful for debugging. (Simon) \item Including support for 'clipGrob's. (Simon) \item Add support for 'gpar()'s 'lex' parameter. (Simon) } } \section{Changes in version 1.0-0}{ \itemize{ \item Initial implementation of viewport coordinate information exporting. (Simon) \item Added support for coordinate system importing and unit conversion. (Simon) \item Added support for exporting a JS file with utility functions present. Of note is that these include JS implementations of unit conversion routines. (Simon) \item Using viewport paths instead of viewport names for group elements. This causes us to refer to clipping paths and coordinate information based on the path. Viewport paths still have a numeric suffix. (Simon) \item Script MIME type updated to be more compatible with the SVG spec. (Simon) \item Added call to 'grid.refresh()' when running 'gridToSVG()' in order to avoid seeing a blank page. (Simon) \item Axis sub-grobs now adhere to the common gridSVG naming scheme. (Simon) \item All markup-based output is now written using the 'XML' package. (Simon) \item Added a new option to 'gridToSVG()', 'res'. This sets the device resolution so that we can reproduce plots regardless of the source device that 'gridToSVG()' grabs a grid scene from. (Simon) \item Added a new option to 'gridToSVG()', 'indent'. This either exports SVG with hierarchical indentation, or none at all. All output occurs in one line in the case that the 'indent' option is 'FALSE'. (Simon) \item Making the XML declaration optional. This means that inserting SVG straight into an HTML5 document is more easily done because the declaration is not necessary with inline SVG. (Simon) \item When the filename is set to 'NULL' or '""' return the SVG document as a list containing the root SVG node reference, coordinate data (list) and JS utility functions (character vector). (Simon) \item Use 'person()' in the DESCRIPTION file. (Simon) \item Reimplement 'pointsGrob's as SVG ''s, referenced by '' elements. Many more 'pch's are now animatable and drawable. Furthermore, the definitions of 'pch's now matches R's. (Simon) \item Added 'commentGrob' which writes comments when exported to SVG. (Simon) \item Use data URIs for 'rasterGrob's to embed images inline in SVG. Allows us to truly create standalone SVG files, rather than SVG with a lot of referenced PNGs. Lifted C code from the 'markdown' package (permissive licence) to do the job. Just keeping a very small subset of the C code ('markdown' does a lot of cool stuff that we don't need). (Simon) \item Bug-fix for 'gpar()'s, support 'font' as an alias for 'fontface'. In particular it affected some 'ggplot2' plots. (Simon) \item Adding in support for 'gtable' grobs as 'ggplot2' uses them. Requires borrowing code from 'gtable' to keep the package checker happy. (Simon) \item Small fix to avoid error from text justification outside the 0 to 1 range (by clamping justifications to the 0 to 1 range). \item Added 'viewBox' attribute to top-level element. \item Adding 'show' argument to 'grid.hyperlink()'. Allows links to opened in another window/tab rather than the current window/tab. (Simon). \item Added new functions to support global package options, plus created a global option to control the separator used when appending a number suffix to grob names for SVG element ids. \item Added 'grep' argument to grid.hyperlink() (suggestion by Oscar Perpignan Lamigueiro). } } \section{Changes in version 0.9-4}{ \itemize{ \item Added dependency on R >= 2.15.0 (plotmath location depends on 'grobAscent()') \item 'gridToSVG()' now copes with empty text, e.g., 'grid.text("")'. SVG elements are still produced (so that there is something in the SVG doc that corresponds to the original grid grob), but nothing should be drawn when the SVG doc is viewed. Reported by Gabriel Becker. \item 'gridToSVG()' no longer ignores 'hjust' and 'vjust' in 'grid.rect()'. Reported by Gabriel Becker. \item Conversion of points grobs for 'pch=15:20' now sets colours correctly (used to be wrong if points grob did not have explicit 'gpar(col)' setting). \item Improved animation of x/y/size for points grobs. Now works for pch=0,1,2, 5,6, 15--25 (i.e., does not work yet on symbols that are combinations of shapes) \item Fixed problem with raster aspect ratio. \item Fixed problem with animating raster grobs when width and/or height are not specified. \item Fixed bug in animating segments grobs (used to just not work). \item Added support for 'roundrect' grobs. \item Added support for 'move.to' and 'line.to' grobs. \item Rounding more SVG attributes to 2dp, only a few were missed earlier. (Simon) \item Points grobs for 'pch=15:20' now check whether there is an explicit 'gpar(col)'. If so, the fill is set to that, otherwise this is retrieved from the viewport. (Simon) } } \section{Changes in version 0.9-0}{ \itemize{ \item Added dependency on R >= 2.13.0 ('grid.grab(wrap=true)' only works with bug fix in r54813). \item Replaced partially matching arguments with full argument names. (Simon) \item Added plotmath support (outputs MathML). Note that positioning of MathML output is VERY unlikely to be accurate because there is not only the problem of font differences BUT ALSO the problem of a different math formula layout engine! \item Changed 'x11()' to 'dev.new()' in 'tests/*.R' code. \item Added animation support for polygon grobs and path grobs. \item Changed translation of rasterGrob grobs to SVG elements. They are now an '' wrapped in two ''s. The outer '' provides a translation; the inner '' provides a scaling; and the image is at (0, 0) and size (1, 1). This allows for ... \item Added animation support for 'rasterGrob' grobs. \item Added animation support for 'xsplineGrob' grobs. Note that closed xsplines are unlikely to animate smoothly (because the result is an animated '' with a variable number of operations). \item Added 'group' argument for 'grid.hyperlink()'. } } \section{Changes in version 0.8-0}{ \itemize{ \item Started rounding all numeric values to 2 dp (in SVG output). \item Added 'animValue' and 'animUnit' classes to somewhat formalise the specification of animation values for attributes. \item Removed the 'id' argument from 'grid.animate()'. \item Added 'begin' argument to 'grid.animate()'. \item Added 'animation' vignette, which describes how to specify animation values for 'grid.animate()'. \item Named top-level gTree 'gridSVG' (and therefore ''). \item Added 'inline' argument to 'grid.script()'. \item Added 'group' argument to 'grid.garnish()' so that attributes can be applied EITHER to the parent '' (the default) OR to the individual child elements. \item Changed conversion of graphical parameters. Instead of creating a single 'style' attribute in each element, now create individual SVG presentation attributes, like 'fill' and 'fill-opacity'. Also, ONLY record explicit 'gp' settings, rather than ALWAYS recording ALL current settings for ALL elements. \item Modified 'grid.garnish()' so that we can garnish the same grob multiple times (without overwriting previous garnish). \item Modified 'grid.animate()' so that we can animate the same grob multiple times (without overwriting previous animation). \item Added 'group' argument to 'grid.animate()' so that animation can apply EITHER to the individual child elements (the default) OR to the parent ''. \item Added vignette on extending the 'gridSVG' package. 'vignette("extensibility")' \item Added 'interpolate' argument to 'grid.animate()' (only currently supports 'linear' or 'discrete'). \item Implemented animation for segments grobs. \item Improved recording of viewports and vpPaths, when depth is greater than 1 (e.g., a vpStack). Now all viewports (not just the last one) are recorded as '' elements. } } \section{Changes in version 0.7-0}{ \itemize{ \item Added support for polyline grobs (Simon) \item Polygon grobs now respect the 'id' parameter (Simon) \item Semi-transparent colours can now be applied, making use of SVG's 'fill-opacity', 'stroke-opacity' and 'opacity' attributes. (Simon) \item xsplines can be drawn. Currently uses the '' or '' elements depending on whether the xspline is open or closed. (Simon) \item Lines, segments, polylines and xsplines now support the arrow parameter. (Simon) \item Grobs that produce multiple SVG elements now wrap the multiple elements in a '' with the original grob name on the '' and the multiple elements name-mangled with an integer suffix. (Simon) \item Multiline text support added. (Simon) \item Text with multiple labels no longer draw all labels at each location. (Simon) \item Line properties such as 'linejoin' and 'lineend' are now understood. (Simon) \item The 'gpar()' properties 'font'/'fontface' and 'fontfamily' are now supported. 'fontface' has a direct mapping to CSS, but 'fontfamily' is a little bit more messy. 'fontfamily' has to specify fallback fonts if none are present in the browser. The 'serif', 'sans' and 'mono' families are given a reasonable attempt. (Simon) \item Naming of grobs has been refactored into a function call 'subGrobName()'. To get the base name of the grob again, use 'baseGrobName()'. This allows an easier switch to a different naming scheme if necessary. (Simon) \item Initial support for 'frameGrob's (and 'cellGrob's). (Simon) \item Numerical justification of text is supported. Justification parameters are rounded so they belong to one of {0, 0.5, 1}. (Simon) \item 'gTree' support has been improved, all 'lattice' demos can now be drawn, along with some 'ggplot2' plots (assuming 'pch's are supported). (Simon) \item The HTML file that is produced now rounds the 'height' and 'width' attributes to the nearest integer to avoid scrollbars becoming visible. (Simon) \item Warnings are no longer produced regarding unclosed connections. (Simon) \item 'pch's 0:25 and 32:127 are supported. (Simon) \item Clipping to viewports is now possible. This occurs at the group level so that when a viewport is pushed to, its name is now suffixed with the number of the viewport that has been pushed to. (Simon) } } \section{Changes in version 0.6-0}{ \itemize{ \item Updated for the fact that the R graphics engine now supports complex paths. \itemize{ \item Removed 'grid.path()' and 'pathGrob' from this package (now in 'grid' package). \item Removed 'svgGrobify()' (the normal 'grobify()' in 'grImport' now handles complex paths). \item Tweaked passage of 'grid' pathgrob through generic device to SVG device. } } } \section{Changes in version 0.5-10}{ \itemize{ \item Conversion of 'gpar()' to SVG CSS now recognises 'fillrule' (so that pathgrobs [and polygons] can specify "nonzero" or "evenodd") \item 'svgGrobify()' passes 'object@rule' from PictureFill objects to 'gpar()' so that 'fill' and 'eofill' from imported images will be represented by appropriate paths in SVG. \item The current locale encoding (i.e., the encoding used to write the SVG file) is now recorded in the SVG file. } } \section{Changes in version 0.5-8}{ The following changes occurred between versions 0.5-3 and 0.5-8. \itemize{ \item Added 'redraw' argument to 'grid.garnish()' \item Improved sizing of text (especially when it is controlled via 'cex') \item Correction for rotated text (SVG measures angles clock-wise) \item Improved recording of SVG 'style' attribute so that it handles vectorized settings better. \item Improved recording of 'lty' setting in SVG output. \item Forced ALL gpar settings from grid to SVG output (i.e., no longer have to EXPLICITLY set gpars). \item Added checks for XML specials when producing SVG output. \item Improved sizing of text (and line widths) to be responsive to device resolution. \item Added 'grid.path()' and 'pathGrob()' which can be used to draw polygons with holes (when producing SVG output). \item Added 'svgGrobify()' which uses 'pathGrob()' when converting a Picture from 'grImport' to grobs. } } \section{Changes in version 0.4}{ \itemize{ \item Updated properly for R 2.0.0 Hyperlinks work the same as before, but Animation now works differently: you animate an entire grob rather than an individual unit. \item Integrated changes from Nathan Whitehouse and colleagues to support arbitrary SVG attributes and script chunks. \item SVG shape chunks now use grid grob names for the id attribute. If more than one chunk is produced then a 1:n suffix is attached. For example, 'grid.circle(r=1:4/8, name="circgrob")' produces four '' chunks with id's "circle1" to "circle4", but 'grid.rect(name="rectgrob")' produces a single '' chunk with id "rectgrob". \item Added NAMESPACE. } } \section{Changes in version 0.3}{ \itemize{ \item Minimal update to get version that runs with grid in R 1.9.* } } \section{Changes in version 0.2-1}{ The following changes occurred between version 0.2 and 0.2-1. \itemize{ \item Changed implementation of lpaste from recursive to loop (to avoid "evaluation nested too deeply" problems) \item Fixed up [cx|cy].time.unit for case where only one of x|y is a "time.unit". Used to not replicate the "normal" unit correctly. } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������