pax_global_header00006660000000000000000000000064131647422720014522gustar00rootroot0000000000000052 comment=318cadc639822deeb427381a927a9287dd2bd2ef d3-zoom-1.6.0/000077500000000000000000000000001316474227200130165ustar00rootroot00000000000000d3-zoom-1.6.0/.eslintrc000066400000000000000000000001771316474227200146470ustar00rootroot00000000000000parserOptions: sourceType: module env: browser: true extends: "eslint:recommended" rules: no-cond-assign: 0 d3-zoom-1.6.0/.gitignore000066400000000000000000000001001316474227200147750ustar00rootroot00000000000000*.sublime-workspace .DS_Store build/ node_modules npm-debug.log d3-zoom-1.6.0/.npmignore000066400000000000000000000000361316474227200150140ustar00rootroot00000000000000*.sublime-* build/*.zip test/ d3-zoom-1.6.0/LICENSE000066400000000000000000000027031316474227200140250ustar00rootroot00000000000000Copyright 2010-2016 Mike Bostock All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. d3-zoom-1.6.0/README.md000066400000000000000000001053311316474227200143000ustar00rootroot00000000000000# d3-zoom Panning and zooming are popular interaction techniques which let the user focus on a region of interest by restricting the view. It is easy to learn due to direct manipulation: click-and-drag to pan (translate), spin the wheel to zoom (scale), or use touch. Panning and zooming are widely used in web-based mapping, but can also be used with visualizations such as time-series and scatterplots. The zoom behavior implemented by d3-zoom is a convenient but flexible abstraction for enabling pan-and-zoom on [selections](https://github.com/d3/d3-selection). It handles a surprising variety of [input events](#api-reference ) and browser quirks. The zoom behavior is agnostic about the DOM, so you can use it with SVG, HTML or Canvas. [Canvas Zooming](https://bl.ocks.org/mbostock/d1f7b58631e71fbf9c568345ee04a60e)[SVG Zooming](https://bl.ocks.org/mbostock/4e3925cdc804db257a86fdef3a032a45) The zoom behavior is also designed to work with [d3-scale](https://github.com/d3/d3-scale) and [d3-axis](https://github.com/d3/d3-axis); see [*transform*.rescaleX](#transform_rescaleX) and [*transform*.rescaleY](#transform_rescaleY). You can also restrict zooming using [*zoom*.scaleExtent](#zoom_scaleExtent) and panning using [*zoom*.translateExtent](#zoom_translateExtent). [Axis Zooming](https://bl.ocks.org/mbostock/db6b4335bf1662b413e7968910104f0f) The zoom behavior can be combined with other behaviors, such as [d3-drag](https://github.com/d3/d3-drag) for dragging, and [d3-brush](https://github.com/d3/d3-brush) for focus + context. [Drag & Zoom II](https://bl.ocks.org/mbostock/3127661b6f13f9316be745e77fdfb084)[Brush & Zoom](https://bl.ocks.org/mbostock/34f08d5e11952a80609169b7917d4172) The zoom behavior can be controlled programmatically using [*zoom*.transform](#zoom_transform), allowing you to implement user interface controls which drive the display or to stage animated tours through your data. Smooth zoom transitions are based on [“Smooth and efficient zooming and panning”](http://www.win.tue.nl/~vanwijk/zoompan.pdf) by Jarke J. van Wijk and Wim A.A. Nuij. [Zoom Transitions](https://bl.ocks.org/mbostock/b783fbb2e673561d214e09c7fb5cedee) See also [d3-tile](https://github.com/d3/d3-tile) for examples panning and zooming maps. ## Installing If you use NPM, `npm install d3-zoom`. Otherwise, download the [latest release](https://github.com/d3/d3-zoom/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-zoom.v1.min.js) or as part of [D3 4.0](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: ```html ``` [Try d3-zoom in your browser.](https://tonicdev.com/npm/d3-zoom) ## API Reference This table describes how the zoom behavior interprets native events: | Event | Listening Element | Zoom Event | Default Prevented? | | ------------ | ----------------- | ----------- | ------------------ | | mousedown⁵ | selection | start | no¹ | | mousemove² | window¹ | zoom | yes | | mouseup² | window¹ | end | yes | | dragstart² | window | - | yes | | selectstart² | window | - | yes | | click³ | window | - | yes | | dblclick | selection | *multiple*⁶ | yes | | wheel⁸ | selection | zoom⁷ | yes | | touchstart | selection | *multiple*⁶ | no⁴ | | touchmove | selection | zoom | yes | | touchend | selection | end | no⁴ | | touchcancel | selection | end | no⁴ | The propagation of all consumed events is [immediately stopped](https://dom.spec.whatwg.org/#dom-event-stopimmediatepropagation). ¹ Necessary to capture events outside an iframe; see [d3-drag#9](https://github.com/d3/d3-drag/issues/9).
² Only applies during an active, mouse-based gesture; see [d3-drag#9](https://github.com/d3/d3-drag/issues/9).
³ Only applies immediately after some mouse-based gestures; see [*zoom*.clickDistance](#zoom_clickDistance).
⁴ Necessary to allow [click emulation](https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW7) on touch input; see [d3-drag#9](https://github.com/d3/d3-drag/issues/9).
⁵ Ignored if within 500ms of a touch gesture ending; assumes [click emulation](https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW7).
⁶ Double-click and double-tap initiate a transition that emits start, zoom and end events.
⁷ The first wheel event emits a start event; an end event is emitted when no wheel events are received for 150ms.
⁸ Ignored if already at the corresponding limit of the [scale extent](#zoom_scaleExtent). # d3.zoom() [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js "Source") Creates a new zoom behavior. The returned behavior, [*zoom*](#_drag), is both an object and a function, and is typically applied to selected elements via [*selection*.call](https://github.com/d3/d3-selection#selection_call). # zoom(selection) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L62 "Source") Applies this zoom behavior to the specified [*selection*](https://github.com/d3/d3-selection), binding the necessary event listeners to allow panning and zooming, and initializing the [zoom transform](#zoom-transforms) on each selected element to the identity transform if not already defined. This function is typically not invoked directly, and is instead invoked via [*selection*.call](https://github.com/d3/d3-selection#selection_call). For example, to instantiate a zoom behavior and apply it to a selection: ```js selection.call(d3.zoom().on("zoom", zoomed)); ``` Internally, the zoom behavior uses [*selection*.on](https://github.com/d3/d3-selection#selection_on) to bind the necessary event listeners for zooming. The listeners use the name `.zoom`, so you can subsequently unbind the zoom behavior as follows: ```js selection.on(".zoom", null); ``` To disable just wheel-driven zooming (say to not interfere with native scrolling), you can remove the zoom behavior’s wheel event listener after applying the zoom behavior to the selection: ```js selection .call(zoom) .on("wheel.zoom", null); ``` Alternatively, use [*zoom*.filter](#zoom_filter) for greater control over which events can initiate zoom gestures. Applying the zoom behavior also sets the [-webkit-tap-highlight-color](https://developer.apple.com/library/mac/documentation/AppleApplications/Reference/SafariWebContent/AdjustingtheTextSize/AdjustingtheTextSize.html#//apple_ref/doc/uid/TP40006510-SW5) style to transparent, disabling the tap highlight on iOS. If you want a different tap highlight color, remove or re-apply this style after applying the drag behavior. # zoom.transform(selection, transform) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L76 "Source") If *selection* is a selection, sets the [current zoom transform](#zoomTransform) of the selected elements to the specified *transform*, instantaneously emitting start, zoom and end [events](#zoom-events). If *selection* is a transition, defines a “zoom” tween to the specified *transform* using [d3.interpolateZoom](https://github.com/d3/d3-interpolate#interpolateZoom), emitting a start event when the transition starts, zoom events for each tick of the transition, and then an end event when the transition ends (or is interrupted). The *transform* may be specified either as a [zoom transform](#zoom-transforms) or as a function that returns a zoom transform. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. This function is typically not invoked directly, and is instead invoked via [*selection*.call](https://github.com/d3/d3-selection#selection_call) or [*transition*.call](https://github.com/d3/d3-transition#transition_call). For example, to reset the zoom transform to the [identity transform](#zoomIdentity) instantaneously: ```js selection.call(zoom.transform, d3.zoomIdentity); ``` To smoothly reset the zoom transform to the identity transform over 750 milliseconds: ```js selection.transition().duration(750).call(zoom.transform, d3.zoomIdentity); ``` This method requires that you specify the new zoom transform completely, and does not enforce the defined [scale extent](#zoom_scaleExtent) and [translate extent](#zoom_translateExtent), if any. To derive a new transform from the existing transform, and to enforce the scale and translate extents, see the convenience methods [*zoom*.translateBy](#zoom_translateBy), [*zoom*.scaleBy](#zoom_scaleBy) and [*zoom*.scaleTo](#zoom_scaleTo). # zoom.translateBy(selection, x, y) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L110 "Source") If *selection* is a selection, [translates](#transform_translate) the [current zoom transform](#zoomTransform) of the selected elements by *x* and *y*, such that the new *tx1* = *tx0* + *kx* and *ty1* = *ty0* + *ky*. If *selection* is a transition, defines a “zoom” tween translating the current transform. This method is a convenience method for [*zoom*.transform](#zoom_transform). The *x* and *y* translation amounts may be specified either as numbers or as functions that returns numbers. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. # zoom.translateTo(selection, x, y) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L119 "Source") If *selection* is a selection, [translates](#transform_translate) the [current zoom transform](#zoomTransform) of the selected elements such that the specified position ⟨*x*,*y*⟩ appears at the center of the [viewport extent](#zoom_extent). The new *tx* = *cx* - *kx* and *ty* = *cy* - *ky*, where ⟨*cx*,*cy*⟩ is the center. If *selection* is a transition, defines a “zoom” tween translating the current transform. This method is a convenience method for [*zoom*.transform](#zoom_transform). The *x* and *y* coordinates may be specified either as numbers or as functions that returns numbers. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. # zoom.scaleBy(selection, k) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L91 "Source") If *selection* is a selection, [scales](#transform_scale) the [current zoom transform](#zoomTransform) of the selected elements by *k*, such that the new *k₁* = *k₀k*. If *selection* is a transition, defines a “zoom” tween translating the current transform. This method is a convenience method for [*zoom*.transform](#zoom_transform). The *k* scale factor may be specified either as numbers or as functions that returns numbers. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. # zoom.scaleTo(selection, k) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L99 "Source") If *selection* is a selection, [scales](#transform_scale) the [current zoom transform](#zoomTransform) of the selected elements to *k*, such that the new *k₁* = *k*. If *selection* is a transition, defines a “zoom” tween translating the current transform. This method is a convenience method for [*zoom*.transform](#zoom_transform). The *k* scale factor may be specified either as numbers or as functions that returns numbers. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. # zoom.filter([filter]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L386 "Source") If *filter* is specified, sets the filter to the specified function and returns the zoom behavior. If *filter* is not specified, returns the current filter, which defaults to: ```js function filter() { return !d3.event.button; } ``` If the filter returns falsey, the initiating event is ignored and no zoom gestures are started. Thus, the filter determines which input events are ignored. The default filter ignores mousedown events on secondary buttons, since those buttons are typically intended for other purposes, such as the context menu. # zoom.touchable([touchable]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L390 "Source") If *touchable* is specified, sets the touch support detector to the specified function and returns the zoom behavior. If *touchable* is not specified, returns the current touch support detector, which defaults to: ```js function touchable() { return "ontouchstart" in this; } ``` Touch event listeners are only registered if the detector returns truthy for the corresponding element when the zoom behavior is [applied](#_zoom). The default detector works well for most browsers that are capable of touch input, but not all; Chrome’s mobile device emulator, for example, fails detection. # zoom.wheelDelta([delta]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L382 "Source") If *delta* is specified, sets the wheel delta function to the specified function and returns the zoom behavior. If *delta* is not specified, returns the current wheel delta function, which defaults to: ```js function wheelDelta() { return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1) / 500; } ``` The value *Δ* returned by the wheel delta function determines the amount of scaling applied in response to a [WheelEvent](https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent). The scale factor [*transform*.k](#zoomTransform) is multiplied by 2*Δ*; for example, a *Δ* of +1 doubles the scale factor, *Δ* of -1 halves the scale factor. # zoom.extent([extent]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L394 "Source") If *extent* is specified, sets the viewport extent to the specified array of points [[*x0*, *y0*], [*x1*, *y1*]], where [*x0*, *y0*] is the top-left corner of the viewport and [*x1*, *y1*] is the bottom-right corner of the viewport, and returns this zoom behavior. The *extent* may also be specified as a function which returns such an array; if a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. If *extent* is not specified, returns the current extent accessor, which defaults to [[0, 0], [*width*, *height*]] where *width* is the [client width](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientWidth) of the element and *height* is its [client height](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientHeight); for SVG elements, the nearest ancestor SVG element’s [width](https://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute) and [height](https://www.w3.org/TR/SVG/struct.html#SVGElementHeightAttribute) is used. In this case, the owner SVG element must have defined [width](https://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute) and [height](https://www.w3.org/TR/SVG/struct.html#SVGElementHeightAttribute) attributes rather than (for example) relying on CSS properties or the viewBox attribute; SVG provides no programmatic method for retrieving the [initial viewport size](https://www.w3.org/TR/SVG/coords.html#ViewportSpace). Alternatively, consider using [*element*.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). (In Firefox, [*element*.clientWidth](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientWidth) and [*element*.clientHeight](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientHeight) is zero for SVG elements!) The viewport extent affects several functions: the center of the viewport remains fixed during changes by [*zoom*.scaleBy](#zoom_scaleBy) and [*zoom*.scaleTo](#zoom_scaleTo); the viewport center and dimensions affect the path chosen by [d3.interpolateZoom](https://github.com/d3/d3-interpolate#interpolateZoom); and the viewport extent is needed to enforce the optional [translate extent](#zoom_translateExtent.) # zoom.scaleExtent([extent]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L398 "Source") If *extent* is specified, sets the scale extent to the specified array of numbers [*k0*, *k1*] where *k0* is the minimum allowed scale factor and *k1* is the maximum allowed scale factor, and returns this zoom behavior. If *extent* is not specified, returns the current scale extent, which defaults to [0, ∞]. The scale extent restricts zooming in and out. It is enforced on interaction and when using [*zoom*.scaleBy](#zoom_scaleBy), [*zoom*.scaleTo](#zoom_scaleTo) and [*zoom*.translateBy](#zoom_translateBy); however, it is not enforced when using [*zoom*.transform](#zoom_transform) to set the transform explicitly. If the user tries to zoom by wheeling when already at the corresponding limit of the scale extent, the wheel events will be ignored and not initiate a zoom gesture. This allows the user to scroll down past a zoomable area after zooming in, or to scroll up after zooming out. If you would prefer to always prevent scrolling on wheel input regardless of the scale extent, register a wheel event listener to prevent the browser default behavior: ```js selection .call(zoom) .on("wheel", function() { d3.event.preventDefault(); }); ``` # zoom.translateExtent([extent]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L402 "Source") If *extent* is specified, sets the translate extent to the specified array of points [[*x0*, *y0*], [*x1*, *y1*]], where [*x0*, *y0*] is the top-left corner of the world and [*x1*, *y1*] is the bottom-right corner of the world, and returns this zoom behavior. If *extent* is not specified, returns the current translate extent, which defaults to [[-∞, -∞], [+∞, +∞]]. The translate extent restricts panning, and may cause translation on zoom out. It is enforced on interaction and when using [*zoom*.scaleBy](#zoom_scaleBy), [*zoom*.scaleTo](#zoom_scaleTo) and [*zoom*.translateBy](#zoom_translateBy); however, it is not enforced when using [*zoom*.transform](#zoom_transform) to set the transform explicitly. # zoom.clickDistance([distance]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L419 "Source") If *distance* is specified, sets the maximum distance that the mouse can move between mousedown and mouseup that will trigger a subsequent click event. If at any point between mousedown and mouseup the mouse is greater than or equal to *distance* from its position on mousedown, the click event follwing mouseup will be suppressed. If *distance* is not specified, returns the current distance threshold, which defaults to zero. The distance threshold is measured in client coordinates ([*event*.clientX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientX) and [*event*.clientY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientY)). # zoom.duration([duration]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L406 "Source") If *duration* is specified, sets the duration for zoom transitions on double-click and double-tap to the specified number of milliseconds and returns the zoom behavior. If *duration* is not specified, returns the current duration, which defaults to 250 milliseconds. If the duration is not greater than zero, double-click and -tap trigger instantaneous changes to the zoom transform rather than initiating smooth transitions. To disable double-click and double-tap transitions, you can remove the zoom behavior’s dblclick event listener after applying the zoom behavior to the selection: ```js selection .call(zoom) .on("dblclick.zoom", null); ``` # zoom.interpolate([interpolate]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L410 "Source") If *interpolate* is specified, sets the interpolation factory for zoom transitions to the specified function. If *interpolate* is not specified, returns the current interpolation factory, which defaults to [d3.interpolateZoom](https://github.com/d3/d3-interpolate#interpolateZoom) to implement smooth zooming. To apply direct interpolation between two views, try [d3.interpolate](https://github.com/d3/d3-interpolate#interpolate) instead. # zoom.on(typenames[, listener]) [<>](https://github.com/d3/d3-zoom/blob/master/src/zoom.js#L414 "Source") If *listener* is specified, sets the event *listener* for the specified *typenames* and returns the zoom behavior. If an event listener was already registered for the same type and name, the existing listener is removed before the new listener is added. If *listener* is null, removes the current event listeners for the specified *typenames*, if any. If *listener* is not specified, returns the first currently-assigned listener matching the specified *typenames*, if any. When a specified event is dispatched, each *listener* will be invoked with the same context and arguments as [*selection*.on](https://github.com/d3/d3-selection#selection_on) listeners: the current datum `d` and index `i`, with the `this` context as the current DOM element. The *typenames* is a string containing one or more *typename* separated by whitespace. Each *typename* is a *type*, optionally followed by a period (`.`) and a *name*, such as `zoom.foo` and `zoom.bar`; the name allows multiple listeners to be registered for the same *type*. The *type* must be one of the following: * `start` - after zooming begins (such as on mousedown). * `zoom` - after a change to the zoom transform (such as on mousemove). * `end` - after zooming ends (such as on mouseup ). See [*dispatch*.on](https://github.com/d3/d3-dispatch#dispatch_on) for more. ### Zoom Events When a [zoom event listener](#zoom_on) is invoked, [d3.event](https://github.com/d3/d3-selection#event) is set to the current zoom event. The *event* object exposes several fields: * *event*.target - the associated [zoom behavior](#zoom). * *event*.type - the string “start”, “zoom” or “end”; see [*zoom*.on](#zoom_on). * *event*.transform - the current [zoom transform](#zoom-transforms). * *event*.sourceEvent - the underlying input event, such as mousemove or touchmove. ### Zoom Transforms The zoom behavior stores the zoom state on the element to which the zoom behavior was [applied](#_zoom), not on the zoom behavior itself. This is because the zoom behavior can be applied to many elements simultaneously, and each element can be zoomed independently. The zoom state can change either on user interaction or programmatically via [*zoom*.transform](#zoom_transform). To retrieve the zoom state, use *event*.transform on the current [zoom event](#zoom-events) within a zoom event listener (see [*zoom*.on](#zoom_on)), or use [d3.zoomTransform](#zoomTransform) for a given node. The latter is particularly useful for modifying the zoom state programmatically, say to implement buttons for zooming in and out. # d3.zoomTransform(node) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js "Source") Returns the current transform for the specified *node*. Note that *node* should typically be a DOM element, not a *selection*. (A selection may consist of multiple nodes, in different states, and this function only returns a single transform.) If you have a selection, call [*selection*.node](https://github.com/d3/d3-selection#selection_node) first: ```js var transform = d3.zoomTransform(selection.node()); ``` In the context of an [event listener](https://github.com/d3/d3-selection#selection_on), the *node* is typically the element that received the input event (which should be equal to [*event*.transform](#zoom-events)), *this*: ```js var transform = d3.zoomTransform(this); ``` Internally, an element’s transform is stored as *element*.\_\_zoom; however, you should use this method rather than accessing it directly. If the given *node* has no defined transform, returns the [identity transformation](#zoomIdentity). The returned transform represents a two-dimensional [transformation matrix](https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations) of the form: *k* 0 *tx*
0 *k* *ty*
0 0 1 (This matrix is capable of representing only scale and translation; a future release may also allow rotation, though this would probably not be a backwards-compatible change.) The position ⟨*x*,*y*⟩ is transformed to ⟨*xk* + *tx*,*yk* + *ty*⟩. The transform object exposes the following properties: * *transform*.x - the translation amount *tx* along the *x*-axis. * *transform*.y - the translation amount *ty* along the *y*-axis. * *transform*.k - the scale factor *k*. These properties should be considered read-only; instead of mutating a transform, use [*transform*.scale](#transform_scale) and [*transform*.translate](#transform_translate) to derive a new transform. Also see [*zoom*.scaleBy](#zoom_scaleBy), [*zoom*.scaleTo](#zoom_scaleTo) and [*zoom*.translateBy](#zoom_translateBy) for convenience methods on the zoom behavior. To create a transform with a given *k*, *tx*, and *ty*: ```js var t = d3.zoomIdentity.translate(x, y).scale(k); ``` To apply the transformation to a [Canvas 2D context](https://www.w3.org/TR/2dcontext/), use [*context*.translate](https://www.w3.org/TR/2dcontext/#dom-context-2d-translate) followed by [*context*.scale](https://www.w3.org/TR/2dcontext/#dom-context-2d-scale): ```js context.translate(transform.x, transform.y); context.scale(transform.k, transform.k); ``` Similarly, to apply the transformation to HTML elements via [CSS](https://www.w3.org/TR/css-transforms-1/): ```js div.style("transform", "translate(" + transform.x + "px," + transform.y + "px) scale(" + transform.k + ")"); div.style("transform-origin", "0 0"); ``` To apply the transformation to [SVG](https://www.w3.org/TR/SVG/coords.html#TransformAttribute): ```js g.attr("transform", "translate(" + transform.x + "," + transform.y + ") scale(" + transform.k + ")"); ``` Or more simply, taking advantage of [*transform*.toString](#transform_toString): ```js g.attr("transform", transform); ``` Note that the order of transformations matters! The translate must be applied before the scale. # transform.scale(k) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L9 "Source") Returns a transform whose scale *k₁* is equal to *k₀k*, where *k₀* is this transform’s scale. # transform.translate(x, y) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L12 "Source") Returns a transform whose translation *tx1* and *ty1* is equal to *tx0* + *x* and *ty0* + *y*, where *tx0* and *ty0* is this transform’s translation. # transform.apply(point) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L15 "Source") Returns the transformation of the specified *point* which is a two-element array of numbers [*x*, *y*]. The returned point is equal to [*xk* + *tx*, *yk* + *ty*]. # transform.applyX(x) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L18 "Source") Returns the transformation of the specified *x*-coordinate, *xk* + *tx*. # transform.applyY(y) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L21 "Source") Returns the transformation of the specified *y*-coordinate, *yk* + *ty*. # transform.invert(point) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L24 "Source") Returns the inverse transformation of the specified *point* which is a two-element array of numbers [*x*, *y*]. The returned point is equal to [(*x* - *tx*) / *k*, (*y* - *ty*) / *k*]. # transform.invertX(x) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L27 "Source") Returns the inverse transformation of the specified *x*-coordinate, (*x* - *tx*) / *k*. # transform.invertY(y) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L30 "Source") Returns the inverse transformation of the specified *y*-coordinate, (*y* - *ty*) / *k*. # transform.rescaleX(x) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L33 "Source") Returns a [copy](https://github.com/d3/d3-scale#continuous_copy) of the [continuous scale](https://github.com/d3/d3-scale#continuous-scales) *x* whose [domain](https://github.com/d3/d3-scale#continuous_domain) is transformed. This is implemented by first applying the [inverse *x*-transform](#transform_invertX) on the scale’s [range](https://github.com/d3/d3-scale#continuous_range), and then applying the [inverse scale](https://github.com/d3/d3-scale#continuous_invert) to compute the corresponding domain: ```js function rescaleX(x) { var range = x.range().map(transform.invertX, transform), domain = range.map(x.invert, x); return x.copy().domain(domain); } ``` The scale *x* must use [d3.interpolateNumber](https://github.com/d3/d3-interpolate#interpolateNumber); do not use [*continuous*.rangeRound](https://github.com/d3/d3-scale#continuous_rangeRound) as this reduces the accuracy of [*continuous*.invert](https://github.com/d3/d3-scale#continuous_invert) and can lead to an inaccurate rescaled domain. This method does not modify the input scale *x*; *x* thus represents the untransformed scale, while the returned scale represents its transformed view. # transform.rescaleY(y) [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L36 "Source") Returns a [copy](https://github.com/d3/d3-scale#continuous_copy) of the [continuous scale](https://github.com/d3/d3-scale#continuous-scales) *y* whose [domain](https://github.com/d3/d3-scale#continuous_domain) is transformed. This is implemented by first applying the [inverse *y*-transform](#transform_invertY) on the scale’s [range](https://github.com/d3/d3-scale#continuous_range), and then applying the [inverse scale](https://github.com/d3/d3-scale#continuous_invert) to compute the corresponding domain: ```js function rescaleY(y) { var range = y.range().map(transform.invertY, transform), domain = range.map(y.invert, y); return y.copy().domain(domain); } ``` The scale *y* must use [d3.interpolateNumber](https://github.com/d3/d3-interpolate#interpolateNumber); do not use [*continuous*.rangeRound](https://github.com/d3/d3-scale#continuous_rangeRound) as this reduces the accuracy of [*continuous*.invert](https://github.com/d3/d3-scale#continuous_invert) and can lead to an inaccurate rescaled domain. This method does not modify the input scale *y*; *y* thus represents the untransformed scale, while the returned scale represents its transformed view. # transform.toString() [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L39 "Source") Returns a string representing the [SVG transform](https://www.w3.org/TR/SVG/coords.html#TransformAttribute) corresponding to this transform. Implemented as: ```js function toString() { return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; } ``` # d3.zoomIdentity [<>](https://github.com/d3/d3-zoom/blob/master/src/transform.js#L44 "Source") The identity transform, where *k* = 1, *tx* = *ty* = 0. d3-zoom-1.6.0/d3-zoom.sublime-project000066400000000000000000000002711316474227200173340ustar00rootroot00000000000000{ "folders": [ { "path": ".", "file_exclude_patterns": [ "*.sublime-workspace" ], "folder_exclude_patterns": [ "build" ] } ] } d3-zoom-1.6.0/img/000077500000000000000000000000001316474227200135725ustar00rootroot00000000000000d3-zoom-1.6.0/img/axis.png000066400000000000000000004222651316474227200152570ustar00rootroot00000000000000PNG  IHDR}^ iCCPICC ProfileHT̤Z #k(ҫ@%@P+ ,E\"kAD(v .l ;wwo{\a lQ'#6. @zT3׿mt4S<7)r"7)4sl.]-(+Q.b4i>&2 (lw4: ʖ._-ʮ6:22N!o55l,a:{[9tРçC׬6miCfϝiSQ3a.;piQ3>fEΰhi }~~KIY>3epnJd pVZD/i^$,cFlo\)=J&yH(xa0=tt?i>+'Bl6f8:['T>pO+TBd3PA @bh*R~NCPtF7g)"sa&‘"g¹p .+p3|<ma"^H$#"d R#H҆t!7 ahDa8LVL)ӌ b0߰T:eac<2l>[m^`q8gspF\;7*xS >gGaGE& B10B N"XEl# 'H$C )JZO*!5.ޒd#9'#ɟ( e!ELFSQRT;5MF^>~XȰd2kedee^ee=d˞!R(g %ǖ[#W&wZܸD>C~  > \< hME6ҪhhÊ8ECEbb11%%[hJeJg$tn@g'h4g˜9s>()+')(7*(VaTiQyQ5Q S]z@K5E5g5Z 갺zJ~B}5^j55S5wkբijvkzPbx0%NƘXBG{BP'JgN#].S7Ywn^*zD}~^.1 Z * s Q܌2*n㌙i{M`;2)tiL`Vivǜbac^o>hA`bj;vfignYeJ*jUkku-ZV׶Il6u}w7؏:9$8;a*2C[Wk8~rwv:sg %ͫ7vp2\\JܴnnOuݹ#G=^yZz<.^vrr&+i%f%ge*UW X]Zcڼծ'O[ Emؖ.oeEw69o:g͖}[p Z~zGK~ܖg;p;;ntY[$_[4+xWn,sض^^^IIPI>};})M)(,k,W/Ra?w 5|n_EsAeaO~bTWZ]XFP# s;~d{=\/=h1c ~}"DIɆSʛhMP汖Ik\kmmMXRsFLYϑ坛<{~]Pǒc/ xe<_qrטZ_onצ7Z{{wp[[ݎ};ܻ{}?ău =*~7%ރO"< =/yOOGFY?;3;|/ѫS=;6Zzַ*okپ>ć*k?1?u}<2 KWm=̘EVANNM 8;@MOBK;QB=4Q)K`iCY6ӵ(~| ɉ_fО9ŧCPc[s W"LBOYiTXtXML:com.adobe.xmp 960 500 2#IDATxwŵ;aBIHBȒɘ` D `mq$66#Ƅl@ ( @+3==~lM9zf{(wp `|;pXkҙ1HA?neaa4l>+e\^i谾=2|Rh<0UzMÃ4?+ֵilfl7;?y CREv◖I`2'&Rf(v1b̅3gv|^~=؝C8CyJznٽ vrrD:D;r J yyg]>7A̦ AwyM5,_.7W^xtQKbVlKrpwY륙8uX:0 S$]~ʿo|dH}ܬaSҾJYߟYzR"gֿgf9 2..Zy!G(Z(pӯ9zxcoڳ"V8|$VoL:v/q %\eIc*#+1v5[x^QȔ1?aOT"C^P򊻦$_)izꑷ01$/bi)~#?j'rvP36<6w{]c1>ev0 ==küq0'E])7C9rqLy3y1nGay1Ë3y^T_uGz;-MH>Z%F qLD Ž9sU6tW?+4yEe-j+Dkʯw&Sps1x[%d*9*枱vu(:WfT"3G,sdHR?b@J2u&:ǐeb9h( QqJA Dp:iz"Q&ubH.f!*9u@}^l $p13x9ύ?LO.GP%hEarp7 i 4u!֙jVgĮs][|^+uo'quofquG ]H ڌ# "(V0*4#Z%HX}J5zˌb䕟q01 1TVIi"1jPL]!w(ur^-ʋԼ({/"iM񋓔5U3KcMCZ(`M>݁lK] 3b@(.<<;2}q9fTw Yĭ7H(Ygc2AYT䕤GU0A !.>q'qM\AV0>\VE# ڄ?} 3q{4T_r^KCuZgu~l2s3z_Q]{$Hz\PHj0OוIАDj4iFZUQd"3үQuoL^]%}}jGB(VQ JR$Sgc0θܑ4w'$rYxPϊ55zh/Iה$U)/n̘Kh12pihaYDB)!u_UG$ 3OC3cYSgÛS~TH1K|7:Kcu3Qg&kfh(Dwi(4jwPF:^YgV: |#$.kI:k3"2:(VdY180*r(;091h 2}y: z_@aLlIg{䕿ˍDԙQU+:p'!kWzZzJ1T^#h}ݰ¨,J;+b%4bb+rJ ^LǶ:o&u޼ٍv=L:&npZg7T Ek͚rcX=lfѿ4jWNk*YUEuN\g+zYkE:]RJ;NwSѝFE o.V\ 贼Ί tÊWw>ĘǠMNOޥ_~ ; `. ==,q5)ғf,J38x薊*emg }̎!.3:rlWͫutB? y1;+:[̶ȏT`zR=Q޴i8_Iz31KP`mmn}6uZ#:fR\#- VB%o|*wjӅC#ƣm].l؈b#оr>rYAXjq%:V<>΅Ntz Xۆw ˢb,DUDO "޻6†.]OCDus*:վN^ T,Pb2OkB:~ͬJ$P"dT(Xd"P@O[(Xmݚ.1#9>B^ΈlndBWab!Ȩn]vkdǓJV/nw׷uROOw-TXXc"j"kU.n+T[ٽs5nўS>Rr=1Z"BOT*ҶROS̳eͺ kj$++ sWDWվ-v]k6ԊɭI*U\q->u.tJŞBwX̶ykZ̬_Yk>X%ӽeMlVo\f+;?Gš*g w]qqb]مڸtV=3M+2 [F ]kldl+9kZG/cQӑ: F7ӅSYvxD6<Yqu~"ӲpߴomZkQd&(1=mKqI]pUk۸ofߎ7ݓ {ƘȞ9uXж_wNN=?՘y?ň1O_Egd~dKq^OQ|37_Emz5~S+VXOE5Gy5}M`t#~}^wQ }T 1 =cs8BG\2 f} o)Rs$޵SONS1?'^MkCh;7cKbX2R=sx[޷I#{!+ǗlŇdyaQ_`9t^qgfm+p҆o{c#w*49q3*_zGv?Ƈ6Oݲ^?kŶ{|kֱ ?<{p^,X338zQU^h_K{S3]25jփܖ_SZo[}gx^=au6kY^ye׿NGezz}=ƌ;o~~ߜS)挳Fax^~]F8Ϣ+X{??l; g[o{efHRf#vbp|c?>{#{ɝKF09p o<}w{Wʻ'WG2mhƬ8:#>[g~{͟|躥sG1cv|#0wWC2s{P)nw[=+?~w92 gNU^zK /!8Nog7[|75izM]ڧw洉ܧnYï8vp6ӟ`o皯=i{nKoeG|޷uaW;gߧ>{9n~vr'lξK* Oq`vK֜ol];qRާЃ윫{mi¼7MZ>=5넮\GU *-̓w^$^\F#/ Xǜ7 #nz6[Lۇeʰa߱٪mWW_?}£/ۆN|7uQ/ɾtۡ2Y莧ϝ=wHϓۦ4ؽ _8gֻۦpr/ݲ/Um}Kt]hڤŷtvneՂvZy>cDy|E[N=Sk™C-?oj??k?G}Μ0iG֣ݳ^{=ڟc(1{eawͲ0a;_9>+=9=\Y =c;]?D]9~,y퇞Ѳ4{kϡ(,7g2 7>wObbI\Æ &ΉXw97..Sv˺n\@ݨsSu.`v &s"~u~}\_b`6 ɹ갸g "2w-m-yխ1&=jat` 9t\S,n^3{ఆ^G_s:k'pN"opq5~[;5kyIwANy'zM8iT"E,pDC=;`(.3i-X> p8n+3géU,gBW1Q`rmx F<x QqƮ`e0L\JX6/>LCh[3+:gWtQi,Y_]kNl:&`b| 8w,:@.3æsn߿ 6,L`\|t`Y|z,6-(wO;f/S8;K zސvιk3| ݶOls; D9UM y8NuXh~zm>͋6O}7>)e/ܹcS(+=8fwJbp系ܹ u'I涮fbɖ~,dEB.AL0ZLuYW6w,^0crXveV|gvЭ꯻o|M~{9.۾F2Y>sG^t%,]&NA ٍaS6+׮~kIߙ{ŋFpZK#m*4N\&dwܸꫯ*M̿uLJluބ3vˮ_bE+vQyȌ7ɫzR/4n b5^`;|fqsۋk 9$_ =.]5'>Xp72{_9lv[(+wh$:l3Pֶz??ħ|&<`,;^ \|6,g{? WHpm,9S&aտNW-CK%ՅDA-y?oL{Te밑u,F6WweW:;2,yhYϸW/w KQxtoo8Caԙļz4 +:4zt`#-%UҺpXxy,0P=޾5nK(,Gp8fr`KIsMek|%.uaA7lD;^TJe^WsQK1\W97Q$4禬d{c:h\xuo|c 떠>[aDkwGOh!Fk Zk^q^-+W?}RԪyd߮vn{oҹ [Vٲ4;.G}Q}:669QN sQͅ?t-wtysorϖe׭nԓd Qﻩc>0j0^q2ѯo5Q-ߑ0rjWݾy.}]wI>qC:_>7psi>7m#¯~խ{˟zϺ/ o`}t_HnYDhPs9ÆԺI!4뾫;tS'Z;}?kD}2>dt˚~+O.tVDV\&~jA;Q071'Ca[[7~Ug3_i=_qs`!N7#U?J1nG!SYXgfQft q TE1u7pݏchP"Eh6tL l =3m?9|{ 1b,<KaiXQy31Ɏ:[z,#·c,lQyl;hqjգ0),;v`졸G8epŘ43; tV1Iǹs5%p/>w$~2n'Pz10{~:+z`666,;?ùg1c9N28cX{|Úgy?ř]6`>W~$gNMEi}kpcF>+;31';Ix_xj^j ΫWqWA{zZc9}wvsΧ8k~2XZYh^k(t>ZI>aub;mtpä%oeǎG\KVcX}?en q"kQ&N[s֏2 98~\w0A'ۮQoy>q: }|>?H,*wŝo `v6n c-\%_ڽQcJ@ϲp:<71b0cÇv#P*20tg."]: pqR h 1u3F Ρt̃~ 솦<JK$*Q  gk& ~; 9M-v2`f/\V`Nq媷7gF̲Vȳ}7 D|+&܈O}H/[6p +{ 52DQoZu\h}/aͼ8oc߆xn8ݫ濉}RMrOGR ~Lt Mw8D-w7JDXkdk%?nPak05=U \A~>hgl!3 -CDX6oҷ~OyTX=kvp"3`d!yu'B[p`ųo`[nFϽ9+TtinFN[q9:zLGuo蝹>Zp k1} /wgH+,pʣ1obv/]70iؐ so|nFked:OǛJ@Zg_f^țpɲsW n9 G^ L=yI5::Q>_w_}&8g=#?sWqP(l+bD|OL?KN_~jAǡ4)+ݕg]2,]{v']8<A Ib,>S <뾄+[>!h>q0|S*6'pbd [|3p >ӧELUZ.ݟG ]paz\N8u7ɺ}{O0g?09x0=^~ڮ͹_~٤O\07dҝ(J{٫w=.􋻶nǹ>|^g={Vvds?y.o~tE0Oˏ_z1nnhWC꤫On+&5kO7?㎟ف8o44uVbT21"xؑ?8['ܤ>xæ|0sO{sNiw!u͚*Z_F^?u2wFn_.g;<k6#CC܍$9wgz/~S_kǠ'Ov=2؆19_>/;yCC尡I: y5 ځu/UAt{rNCN8aC?[1y s^ww@͌NCNTWkChc,|iwfP*QqO+jZyvM>;94w]Ay4SpذXЎ,pȴ`d%\ ^]*JrT=æ ʣ)WE̊uu"8rZ.mTxWO=iGhξE<s+::yjrKS еT>6͝\]KVyBK;.XeMz|a#/:PQ.'+gV+}12*e9V~eĉb6wbQdB3.ن_6){;QoV]}C;5|s}&}OC?o߶DٖlܡņLx1Kޘ;}1"r}Z3sguy ݅?}yY6x߽[ ȴfeU^c)PM[՗X?m[ mP]ƉLq3ߙY"N6 {h&=ͦLu_zFrmP?3#NLM}uB95W2u֜|QnhQgǂvG^-"VOϨE^x۱Ն:kjG}p>ɨUshjihA3!zALW=U^x3ؑE7p#9ySm&3%M:Դ挈 ru̹ᮩ!ؔv#Ρk>+mj9woms矩MP B٦|{ckC LSg :3ReGT>'cLsS1շ63Vy,Ru^Ϡ$ה֙qZgqH0Lg1w yw :8* -䏡1H8 uv#2n ;x~/F:W少c: [/^0ք^%skL)w؀JTtu d <ٹѩB=լׂ~挈dmQJT+]m3үQ.rMF0\_UQGYO^L⯺w֓L^BR /_91M>s\ғW5P? H=a&wbΡC0*/5I!z,!A,0NZ' 'B= WVӟAv=4;[1GD:{1f' o?CD;,@S+QCCdoABTJsԚpdP|z,9?,`eѣ4,ҭ3zelds6 Hjp8R<@:$g',Fp3\u!~FZUV+FW_JF1V.#:tY9yL(yչL4k ]̤KLTjH ʽ}PK^]&ts>[عgNb|멳y9l_+V3O`X@q|LRA&z?^9c5NX^ ;7+YSgԙ] XK!Sg[3_`NKx4Qs2/d] 6VnJ>YK@Ӫ3ؒuΰLJ:)|1?J&x׭0fFCsxnʨvU7gagɎy-;ZȼZG$"|/P'`'yH+$ M 3kdMj34yťк;\FKf:o']xjOU[Y?l"esHuw:3{nqgtي3ctԙ)ٵ3RΰH@C `GC=2;J5Xg`GՙTJQn,ʩ7?2by/eK;nF~ո)#շڒ(ȫ>FZW3w`&_u9zmơ7F!~BuY&^ #LG@9V4.#C FL8(SDYpq*Sg'A(Xa$t "uF8u,tȌ3uw sQ) IQ5u&(=&?4" M*B:55ΎixCޕbQt댐jXp.tStNWyNW[+SFM O>;OQ]ի=[55"׫3z_ayҽ)}̰5ЯxgCOS0uXJ[@c9;T%:Ŧ@a3uf uvcSH3ԙ)a7/XSgSg8ZU M:3;J)Rg-5Pĥ,:Rg:c{֙µMN7)fɈRSiGΑ\̨ZݹhSiV>͝s{#s/24cbMY_xp@-Rgn,Pg[@.q)P"|U9(:^W(Xyl'nLh)}-uSf5Pi2RεW;cv;ʎ:"Lz_uh(^ȱh(h(ihB/뜺NWfW=:CkQ]F$ 4t骥F 7eB%B8lP Jޮɤ?4ԙ٣qPf* c^JekΔ&uvl3j@CC,jIC/ fvPفOԙ2Stqyenq㩴tZd>ZxujD f4hhE uPN::WgꜬHI #GrhMYE:]x˙W҆/wpCF! ޖ:Kv"ȫ:eg(}UG^A=.Q9ZkA^XHǭ.w8|B-fD ~n/c5u!u30 :+ZjݱQg&( qp厃ڞyY/Y陧p목5q7 yԙ%\ADPgģ̎R hhB/84= BuFj9:SBvN7=)TTMw2vҝHICLÉrz(\[az_9P :Ejmrݯξs$uvcRA0:s*Sgx KQȌȀwYޯns3O8PgZg\88,3cXκ~:;ΈGC:WzY$uPVΒ;uo3ҤU ~NQ^?NWC3B0;OS_J*0zNlRm B4uz_T=uNQK~턺hsguOMnՏ]-窱aڻIP%"p spaNZ,p[' }C MtΈv=_Q-\=uu@Q̬vE|bPG^Yg:Sttf(vѝSs(rg [EvW}ׯWKzԹj'OuHph3D!Sgat: [8s5":WQ36 ]:èβ@5=Qg44/ih^4%9(WA#l1>uHԵѩީZSWq:TT^oꚻ)ZPN7'ם=rOFVkz_VG9P+WS?J.wEׯQx/I:3SOA~b ZPgqM٠X* ά TrK7nٸk왧wp3QUPg㠥JP̪3:3;J5ΰUyYeaAC)=ꜰuvTIՆr'}n VJ.bgJ۔s-{L;}*G ;B2u#Ly uYa>ufٳ+xKQ{ǂDyo %Ri9(bGt7o]wDz쨁7|1ONy: h%4Qg |WG Yt:@{,@3>}_" MB ٩i뜬?t STs O_:]YU܌FnHC 3)Ozn'/̠VVPwܹZPz(u:u伜é3$\x詳_0u@1=' "bbϙ)mow._耩~\B@qߏګfU:K3&~{Hu` O\zDZ2>rӔS+ |joWCzJ>(w&\k%ݿRbr^IrzV)% V k|K=%cn\ vɜ.)j W^~6]qP֦0uKGju8bUPgMA,A~G:(;fZeCVQEαtT+nUn&oCǪU܌Si24Z9.S7KYʳ#b MJ܎er`p|NpGIc&,~SŽT)\!]ڻsibP2 D#WNZXCJXg4FS/1w`Fv ݯT#5+β~7ؽYC3 "!I2 Ct~2Sx9i&[kc(V8#wr=&7iLw+.V #<ɐ;r akQ9`XS 02/56KcM1'8!L% O!ucN<~7aߩҪX“'3V9.3wuqpQ_\l~_u,1J^o'sVǡƉB t qVf ԌvdG5]t.F 6ܪ,`,w" :XT)O[oJч] kוvۉlP`#EnREԱNB(#woiCΝ?OkzX2fx uZM`&tPgUԙ:n7GK r&N8t{CWBSԕ!|qL9!Sxz_Gg%TA=u~ ":J?(J$@aOUյU͚EX`p` >3f3:C ׎:+ 쀡ΈMEE5S|#/jUhV/7UI_e*&/T8bj|Z?qF"O!ZUQd3QgV,t<ƣ q: >6u֟-`DRZ,]&z]u\&-}?Rgl^SME\W":̽ O:q6k2ԙq8:+:c9 t968:SZ44" McDCapӡ ut uQduFu:Muu:*Ő)X먳⻬NR:Q՜:'X@u4" EGeuFuf69YtTNӜ$#Nj+!B](CJ۔:A:})>uW:%S_'{:K :ɺ!uN]wuEyXV-Rg=k߅COuVõQuUPgqw:0x4P+hGC 4h($/ eQ}+ԨsJutWBӥutcej;{~U]㙨 bpͥ\]ۀmU""E\jEMI*A+P8MT-׆M%C%mWll|C/{?ֳ<=oz~?Kwj L㹼kR}~|_à_' Sg!:DxC^,퟊ Vꗓ:$XW::ˆ7kXQ絳puF:H(HQRg/ΥQ}%QghRQ,d? eᡡeQ:ײ_g˦ZPz1K[CkeZJ^$Kۢ׶KJ 2[p "4}s:֞rggvR:5ug2VvOWF:+w2Ze33,O}p'Ql4:Fa{sŭž@~ uF U0࣡CVBCGC^g\:֙.NZuzz2Ψ@41ӝ6·aNX}.}_\;}(uu?uVu:7򕡴Iv~,AIػ 5r_BobsE:ɋ@)c^:95tj:o) u$L:3r:5L49Vfӓُ9uFWk23\tO(Oj]?2mZr.h-O\|(M%#V[ -7뚿[URɫ +z3tE}jthu)f "& .3rm+=*m_uN Fp7fk8k4sʃѠDF`7u:sqؤ ,uY: Eauu&=u ӝ ӌމh]Oy%'XO|_Uaꌜ:PJ(5Aym¸P>9NXMGC2|_|_Houk6):)e+|e7s>:Zٙ c$Q|6ul78x1\3FɌ2$ShDƘe gy3aON5YM0jse,4#/AyKQYuytەeOtkՕ#k5>tnKq ŖyE2,+$FfOs\DB OW 0EܳGyE_ݞ4epE9"םpqyZH)u:Q̌ ,ԙEoAguβAR ,|T5*ɾ& yԙ}4΍, j]:O_iys&<3|h=坫{\,W Z1مƧfҗ+tܚ}$t̞=ow Jɮ( 8RtN#~PVVP_&IY oܜ88JH@+9kPqDj=ٗ .xu^$GV#MC,x2y댁uyJa:Gc3{89BLZ䵊Öv>w.9*DZ3+R..JuSg.XB賳CYl&y3yՐRM,Uc:äKIBrk#;b:7kV@2%wu4\&(&”1u>Yr/PxLwv$> ͲPuy4}4ԙ@v&(?}<ӥ#=`0MχL-yQ=(Թ}Yӆ^Z\>Chog_U방3~k3Թdq:gSվyWixmrR w@gy{_`M:}J Gƌ88%7BCXЏ , ʓ9GQ:w7u^&ZEQn4{8Lw\.xw^1bj>tS@]KK`.+wKnWp |_jN+׋M:WwWvd~ ;@US#_^R'}&un'`XԹj:lWGCq e  :?Yu2IOW͇X2f[D׼+}ch: \ I}_}uNί_|\:;V?>Iy+Cf]wolxY{+ޤv#$\%Qn*7sQg[CKf:io"BCЙ QAJt(|1|Ǭ3Y̵Z5֋<ݨMO4'MYS3 k>fOWS"h/7&"M,{AꌪQZ B^6zﯹ2R0u6ꬶl*_y5[mhx7rE8hxC9plYmsOf3*捃.LuX@Eh]H MGi:_:nnHOytQOQM4&biO}e,!꼀*>cq]:Oqp+~Zi;5[XI@W߾<:sEnS8py{ k\pqEi P %YbzR5G댁uVR.-t՚NScӜf&.pifǽv_xމgZ vpP¤ eB/ ԙƨ6P|߻Ϋηvw[Ơí~9u2IZ.|0u:+j v*׿GΧ5fiq0ΘECخPHTFė;>yיaպC_ 8O4jik4,CKGCiIo?u9&*o/0vV?:] F<:ۆ7~MOM,dԙk,rEh 9euNȌz'Rԙ(.6;s/B, .4TauF:IXOwz+Z. D8<6Լ)g;G@yN1h+Bъoh7.%Q/}:1W%Y]Ϣߗ/RI ]4F;uvEHYЙV,¦[,v oHKQg_H-|@ԙmR>F8(Y`l&4TIOP6,PkXgutXK<]zO<ݹiD4EsWjs: $nnC{M#"mͥ1tA^EF["1[]sN-kv_7fM֤M~;uf?ufuFϢVEKYΒmf]uNIrm*ԹTfTN-S9i__vdnԙfR:c/-/9 ˲`=:ďћeq<:\4 ["띝4SDÖ6Vγr閶;:Zd%E+y[3*( ,f2Hԙ%峃d $ZIUWfl* s:;]OvPgd[y{$f VFM~eX$] QgDZP saX8Ʋ,H1A 7u~3_riӝ#Ӕћ=|hz2Ͷ'x<;_E &-M5峂>:y9[='y䯗O!3q_ξطC~fJ|eՏ[~|婭~9ue:ækg%Wfa:W^ 'uN{ Rg5c`βMChĄ+Xgխ3_Js<]!u)җ4ei"i^r{ȱV]M'bik$,yiǒ:/+Sg *>}uK=gn)gűb=cɐqu?uHl_ܛnC:gww+R6+K+@=d9#,h5*}E@+nݤE죡t ̲f|:c;=Mg[cnDӽ)g_GC]wԦ.ZL13Ft7K\W]N_')2z:o ꜶyB/_V?sկ:"e+&1Yhd+,Ϝ7\GKECh7"rT } Q׷΍6uq 5wOtCkh҆54KۢJw:/M}h7u""yCa&@/fOZ`+_:$w7J^\sᝮ0%LKf,e/:Sghh,cZ}rۮpgYDh!yY^g\:c:^g;72Z|_/fwJO$ԹGsW +lc)quV? nY+"/*RX;tIDB?ǧGÿ'{3r|t eY@ϲpPG댫\g\:SNOSƸՊkt1Nʼs\;I޽}qW/t:F`OJ_QYYɦPZn„V?(&u>akmGV?Z[&kWsbx&H`+r~d9_ۯ[cSďS㥟|۔q'dEyk1w9ζVQzf؋z*{/w 3&u|VZ?9~kr__uZOuZjH\|=P>}%=Ldd|^Dh>&}x&=tRe_Qm-&i4{MJyz;XwMβsdmsVg[Nq=;sJ8͠g9:Q8M :L_8TgQH Drlկ{G/4hxk {,3*W6LP3Ч[K}?Gק/L7E)?xΟ۾޿6RLkֿ6' 19W |ƫACߕ_>U,nߓe1qѿһk:CLCLOJx\X ̧#&wr\zJ6Ӛ'NN}#9%wrykN6QgJ IKSJq'ަN OӋr#V`z]x\pS⫝̸'_S8(5ƒu˯?~_)=~/bO5]gN3 uDC包f8wUM$(;V7$_硡t~c8c%=])C7xW,q^gy58z0ΣM8rk.֗WRQtS:oa>\3e9?5URAm̤OU߷$W#2EʤZ٩s~~m_nB}ۑ2i&!ϑ}U|-:ۇҤ+u6>DU)8.}ͿMGzU2ʾg 6ߛ?Yg)kWɯw#(i23%ϖjlY?lXU"8 > t_^p/QI롷~\݋A,?}$3XJyY,{~Oo9s^p$.}{Bދ~?x&}K^'J( u^v^ZwNb{%AJu_3'3;W]/~a:GwbBk;H[+l;|=ٲu ܽ='4QbL$3^{&rZ&z˟^r"(GޚyeDZټ+_5j#+)a`ҝ2{Ӛ>B{U?Кϯ8]͞W_z%4)sM~E\<૿B;grDV-@|eƫR~NSߏđhϮfH{L 7=mxKSZ_o~G+{~N[ cO>p'O轌/H  ޼S8Xh5 w8,Poߓ|uvVB)wz+!u}Lj%TdP},gfp]dbܧGg[fZfO%Z5)혶wWM4=SɕLJ`0~H 3_Yl*BWkCJhcՏ <12L8MըrEX)2L(HrEN"Kب['>S?O^c7l_O@?/vüqv]$G΋P5?3\HPg!#؏X3Xg>l4\hk5:$VE^;n%̓F;f.T@Yz.rgM %B}UBEݔAB0KS\JS`4:#`5FԹnH{z"x!RH;)Lw.m;i!d`-i!%`I6 -vԹ1;kyu.EE:CnX9K΋hSi}Ą,}$]03PL!d틫sE>$lL~II^+ݡI\%]$"gӤ Gwi_YHabG+R ؓoI h/k5{7c u bFs,caJBC;,*,֙pQemi] G:(w. o%.pKMԦ %t];:C\(OfIgy|sQV:u=jDz-O74#>х[ yPZ ]+x,+W{aΘ'Zif}S2V?X69Vbx2u<;K6볙&9iNsTY-Y~Nw'FhRQ,+0ireRR_:'0s&uYg]uNO̲Z2tstH]Yq^H&}hDoJ4`ۋͳG<"Թx Sb"k&զ_ˈ2L\: nK9a=~l]+ÙPg6;ƲrQިGH$#cAqdᣡGC4:?:c:o(|V=M7Dfo_,XIhvX)Ji2vk52QsF&>'r TnM%1\Q0uV*is5^Q3jiS! =}):WDV Sgd9 ,34\rP7uf:Թ% 6劰+rR׍\#D&\DOsڸDR8/:4 ENCgf,GҥAyRq)|uc<ōdJHhiUy:'R2 ʬ+3KԹWbxKRgs15Թe## unv)͚43βړ/A9fdߺΛICV%eǷ+ :3YMJ:G<~5]uv>tiNsYD(|Nz,Ŀ\4{Hת/L:i "dfљm} ԙqQ GkMMWImߪ6uF;WE]RFHuNrE ,ok FMyuN! ACѤ{^@1b6uukX~O7hnЂ#=݆ӌt7r;x9ߑwKPgn= e)okɫ#5%b;i:{r|5௳:sapYbV?ZKۭ~&u>^˰IRgSl\n1-7p+u9u4ecgQ䆮̲OX1 #^è%rs=bj4ei""p8ӍNisys,mm"짹 .z".|_4!d>:%sIM Ξ *y Ξ{J|vQ?!fg߾ⳃ s MvQgQ牭~1$]3um ok4kPHːO-j:noMLs_FoƲ,Hgq  :c`| wΓ|_r |_rWRs_*$.yySanx᜶390!%]l>,&]prWy:{3[ٙlS瓔f,WMk|_7grP~u?-:,Yӳ,BL׹Γ{i;dtՉTF<]Zyyw~M4vyEu2߷:Ye)EK5Ӻ^Iy,n>um>IO٩5;*~uN@ܛÐul3}99_:UꜥtRgЫ:?KPXGC;,,dhPg:%יxf>1Թ+RURr5$!{fO5a unWRg3_:gV?WV?wSgi}:˧ MfjYq*= c4ԛe1,&&l\:WȎ O7j.Ei$%rPE@ ]1]<;'4'nik̒!PuV|~x)Gg 8_'^ P紡WBu6a8kl+@џ+YK%J,qPΈPPwPP:GCOa댝: O)_9zSmiqy<}iuu0uүO$geic~|{t׭~Yʆ<@Ol -7HZZ1T44#YYYQ׷΍6u4eZ!'t)Ҕ1pњhm,{EMߗpK|!WߗuՏ\yLMWXoläV?LpR\H:7="E3|44T铃YQm롡tuW_g>dn ;3M9wNhw>&Lt邴ҔQMӔs9ФZ+ocmcq 2=78f^ 3]d!=Ί}Cat sA|A<ꌎV?o r2#Wcix+}k"SgvN죡4:]Pθu53)] ;=Mӌ).M/G>YO|_\:^/zuh-}f_Fl&|e["9'B|e᭶7 o3Z3(Rg3LX]697B“zPgҴMN1tguG<`9*}%uO`x1u:LOwJtA[qaxw Vʇ^@Eq޹]&9s}ߥGa Fg."U ur@ta0(F,v:w+S[zV?\Oɞ!Թ<gy WdmXb^DWXMGC<β8`;\gEF)j{͵ɇNiŽB};gϮ[IIyg,8{wX|e;$0ΧV6uv+#Տ­~AIQgg+|IOlq}oHIlޔtSNuMLi㉖/GDg" 8 %|_H, -7*e@(}!r}\_}?Z+ZDCyNS s%H$ םʪs̍, 9דR牭~|e8[:33+&],mx6I{Z*QT&ECiuf s#3L·3rquXtHOwt1-zz2f) Qcw^SgSDp|_ъ.ȫ>ty<n,Dl撔.1;%Wi흽~`Fkg;.&ϩ .H|e30կt1wPg1bO6+Vj,͚qlrunCiޖʛ=WN=:/wJ, k]g:VZռ u"ZyyWg_+DZ3n3Lĩ3Wrbxle6Pgt6hȫԙjH)V5q=:äKIPhV@2^u/u4|~rr0 o&oQ纥kx6@ɾh93|4Po9:wRktgCHOwJ6Ѩw^Q)g_(wB_u8I^I"XlM*Y+~FZW$| ?I(ΈzNE uv+կl5[YiQg;WmWvJ(\g7ʩԙ\<ڛ0%Ac Qh(y댁upti~N"#Iv uFEqV?\ϝQg귝M:[}:;[*!oH42zC4}4ԙЀUR!)qGg:ϣ<={=&zz2MqQ|z:8:|_|V:W:˔W}Kg|fMl0L"um;~8l }_+l}`RgT6pިi }4tތ)s,*C{יpQejMYqCȞnA{V]񨥍dT{{v>tS1DKr]AK`.+ߗ&})[+e.6w:"=lSgMlV??|_#Wđ'W&߲Y oTv1Wdu?( >:-˂X=Vl4Ut|hG2.ʇ3qw{;"7F(*J<{aQg+l0(~N#ՏV፜†[\"fڛ~i++1hx۹"~$7R2"mW4tZR&KteNO_~ֹx}tzd4jz%etO4Җ'jyz/;wLdr;8Faٝ72*a8noשdPV}yr_IBU\ݓaRYz:Wj$\t JCӨbJCi: -yZ֙mns{|;jik]wDG,jSOl eMLUPc;OU׳uqa9(|i6{[6|jRgxZ*\Lv~\:} JBvw r0J::Y댁u]:xq5=U[ kOȁ{8*:VQFzX<~<DhEߗ\$r^uN}>M1B-ߗ/;|ߜB}YsΎ5Ul_g^<3K}ٛÐ%]V?:+c:GZlOV?$]SgtRgΨ]gWY4> E"5,HOPDYw| vZpySҔ.<)0) =Kk%Gb?w-,6$I-)VHώm|Zd[*2_/{9Mgϟ~ kv_W yv3!D9 ;ufuN~un, 4Y:GZlkV?D[XiCgKe4nu>+|ZS8(W<-/WβH9Y'U]g3꼭3L1UtqP>h-mOMS䝣9tK/Ȧe=Rc W2>R ZQYd3Cu?o)3H}9}A^I}Tn<{j(=C9}%L|euWsľWΦml4ڌةs) eYlX觡pSg7z֙jiӝbj4eN3-'!i4hi ӵApkgHCu ެyW+z:ggW!q^>蟝g_HsJ0WVH/_WPgǸm<:s:\ߦ־NM :3&UAԹeMhgY4C2z,ss:t!$rxV-wۜrn|ZuKk)6[y,;u^1\T{K߷R*yW}_"j}в8Uydqu?uHj= ~VZ2{/Yّ<|eu#e:7Z*6u>ۯlHT,3ihgHCᢡf2b33@g3_riˇxӔ=)d\;̇λHaL1cP|N<]@uݏ$euҝ~8ϗlXAí~=.W꧵Tn8Rɐg:+\Pd/|3z,P%(GXRQu.`Q5xKtt9.-t1-:6#''fi[zCQt·R%l\]\a&@/fHLR>_w8uZpG~lP;hW[b- wSg9sy/44}4PP̣QX}Q9iʚy|u9tXO |W&`:ߵH%G;}uW@V?0sԙFZ4luNu7 HKbxQPrN034:eᡡ0Ge1ֹe:#wOqZqޣӝ\Ny}%k)^>zY:u-|'/|*IuR03x>9EЈnWfsKa,WE}-vȔJ?uFIbmh>o${}='񇿏2eP\CCiuf:CC6̐L{:=M]V+.'NOS#Ӕ\'y$\Ou \ *ΔJ`Pҝl\뽈0/b 9 ݭ~PZL{BlWv5Ey$W2ԙ {Hs<@'g{_ ௽ HICM7)R_o.~(WR]13_K޿~m__d_v =Lm#oNT~k՞ԉĵ&Z{_DZ'Zp/^Y?u[gd׉ހz+YoǬpͮyYgO^sd>};/ktl 3g4Q}N;utD=qu&ڹry?_Pݭ~hg>vlfڭ~-S*L5F$Wd6 |: y\dP'/\|GITǯ}-~ ?'/w}3D>T6dY;ؘˣʶGT>'sJv6GkXg'[_SC!{*~}Z)ʷ\QxZsk52QsLd}tM\+ȋE.Sul ꜾƤig;@x徝&6oxiPcvE=;f|n\+HԹ9z!wE5ƭ1{vNٓO(>S~|oz}A\ӜN~}mGrJr#\3lV Wo$)$S %-i_X Z\$6<6B V@:ۑH+Τ:gVWzpzfy_m9ryH2a# Kpύb;]$Kqmw*ŋշ_BSe!&K 4z\lT~z+&#ݏh`nE<ݐպH OCkVQǽ-W{DhD=v,e"{w[+Vr/֏ĄlcE6fF<Џ_,z_w&]8sMhCz7bSK#;m m]\Mg RPgs:K9j@ɯ=ޭg}.W WVZ2/2?[}C$'(~^)R ?~^싋_} XD zMIs/H\rdL+>0##>s%34e+7ԙ2\;> K+oJ_BJ/z,= 9xދO ="χ?_x6xK=Ÿ7ZŽ}uOly $}q|~IW ٹbw%bE;]^~i>v$]w3~tS"5&}"kW} -k,˷t/~?W~?]Zu<QYO_ѿ fEBŲ,Z |6A#zunfIh%!d+a6uq@ډڽW&bG2‘kVty<zF LdZ0{aƳ9e39ϫsJ&MWfǤ0I+9 Vr_~PZV?(n;&8lz0ɮ:ä'/%7JP9=f}1}%ίgg_~oV)K8OP |B<~ #M\mBoq=cZ |ǭVºZ |MtgB2sw7 i_2,| j/ ZfGn\>BTzu.glRE'@9\K)S_:Վr.댘ܲoM9|V?Ga~S5fSg o&?9tLZ*y^׹:")%΍jn%?ޜݏ׼z 2s{#>14܏FrYM‘|T~T as:ocY ׁ*b|">2'D k6W9iAe;(vʄPݬ]Yˣ̞ȣh9y{Nj~=%&ldṄU̇/." )?2 g>IlHwui҅+end"rWIU/DrEd&vNS)U劜sgd'lPB*V]vH=M G}YhZ #,j6AeY̠G:/ w!C,4wc.bkuVEbwJH\)~|Qt%axܔA[ȋDq$ HP8ꌜ:Gw?a\>%uXywJ\ӍN V]qDwJw})9yQJ}3wE[Թah<'ޑ\MgHgDrEt;1=9B!OeAѸӤ8::S:Ň3&YySҔuOǤ)cUzMzPs?uÁlON,|eň-3,+ )L|"+UΌ:g&۾kHP]H;:/u^W洟:!uʫuxAUab·VfP=1K̙0;& X d+Oʇ^.^&]4:EgL}_rd>|i.󪷿_0ݦ|e:mvHws/L3($ uB['iQ-ݢud2KX4eAzl u< uu>Ӆő.5O8҆{),s#—α̐_Q8`n<:ئyS,m(v)=;ǑyV~Fulz#j|^Sy- H/9kŧߗTW-٥ s*^&N.ڐgw0CE6YMu$z;sQg B٢|eu>mԂM+WvSD,&wSzuNIOw{*nοa̲hc0ܗlhdY6sæaObä01:=Ҕy҆{ig/gcX&BBI!RgGʞ!p_sIaE!劸Rg|aIBCT}p~qF[F,0DC|@>W1hn+Okͼpww:[ ~ Rg!;9e{ݞRA:eaRg7bu V?Ls<]LZ'zt1ӝj%<0{ᝈ*B *s;% i>ԹRr *$.C$:z &LR2dl+@jXo&;jc% 7/E2ӕ,yX:~lsMpeKP$l3CfSuFV-4e}ɞeO;_z'ni+Ί9ܯ}<%C/P$4uuNg'}v(n!Gi5E=~]w:-} T^raY Bs4)/uFIU6⥡Px3b333@'3tIS>?|=x>4e8䝏MTT5FB}{<wfa_' Sg!dC| ΍V?l +[~|5~nKYV?'Qx:y o>%W2 u>&7K{Pg_GȲ-b KE2Ȳ!ΑuFyTҔ%g.=mO!pO7:Qm|w>DS,m^ow3ΦK8P#}_Ls}_9Ynfs'èNMݙ“Z|eOh&uh@jSs7pK%&P*GΙ]Y~ :b99,4QgtPg><PY댌:LG)Nhw}=af>_cWzRg_Αkt:X09 =~,Ed__oϢ uF>InTL.rHOKu.0 6u檹)L콀@(qrdYtsZ1>t9*ySY y1=<]\ zu/(Y+Oqv>t~vpI@L^uf_Eўz3Dnsi$1 i0:}9堠X!Y2b1/fx 찯6mXRkx+ a?1y꼽;:L] _ bHP&*_gPgQg+A,rL{Jw"NpK,K{8;|;}c zgO˴~eaZ<^Owz2Vy<ݎy;6;D*}_x|_Ho'u.sԹAyg,L_vC&u>fĢ+Aif|ѩbǨs;"Oe+u+34=ԙ۹"1nݤuZKunʁ>:#m~~Ī4ݵwwD>k+YyمƧ-fyN[o4tٳ>Κ:{gX)َ=<紦{P:V?ʥi~ gVS:I~PՏZN"\!A>û:voR,Y} Թދ:JOv3"jp"u6ppte?"rBw!HYj'/uMhxI{NΕ:T ; ueYumҏ0l[t)Yf +bhz$͉,mm"Z3}nW]3+^-ͭR8y;sMl$:7}_rS=/%́>__"Osj|^ꜵV?\ϝLV?fY69[0Fc-RgLVE>w:'gK׫Th/v&(G33s:DAʌFf$?4Ҟ|h!`z>t`wV#%mQ8sLyէ |νs_}MvQhԹd]ʪwF:[byZ*KBjJub% ³SFwqDrM}YS\hf$tZ"4/ &A)^ֻ譄k"]5h "ydR|_\%lס:yN:/6A#_kĦ[ 5rEt_+#'Wڱ\"G^8b-JH}:g{szBJF ؠZb^nh3=VBń:>L \4Ut OwNʇy=6^ΧJ1}TQu Uy`;3_XJ>E OR2׈ncO0!RgrEt{g\g3"&u o)WO¤OO/F@O'(weefKm%(L~<{~I/vR[^HzS,moJhS.Χ%L:ijY^wɳjΨZ/mk%R̫βد_Ϻ$k oC__ <ӈ5sE\݆w#W o2;[s mPgSg83CrOV+.1NISFVUz縒||3MO>9yN'51VAle'Pgɨ2YͨVs"CZ?:YMhӡ̐`AmYuc ǽx>t4k^lӝgi|耥X |!m2i2DhƸڠUR&}I}:s.z}_v}Y}56/U8=q5{_gΜ"uuFz1/K3#Ϣh|Vʤ>nk%]SgtRgT4HcsB$^Hpom| "-|_Ud^sN]L5gqRFN٠ɾ +[,n;uŨsկE']3_YaRa_K%\\GՆLO "ugS:eYS2ɯΥ NBEW*E]~D93du.֓m:۸|h5d;liKS-^⭉[D֊fpI(%;}%3x#z%̣(y QgK kVf0ȫ쯫5+Ck]r>;+=MϩNIai[6uٷWPgwr65mAl޶MΖJs0u&XYMYԕE! A0LQ׮=IYPg%U}ԙ 3V+ž4e0.':̦)iwC89w+X;C&k`ZuV\Dg?Sىk#y=#6tao3U\Itunl+[mrK+_yuuT<-&uW2u{Sg0Dc&SgV i5]@Oɲue1tؑ<45tYtw{aiNpd2BghM$4|_7u|ߝ%/ H3=ȫke?sMݭWf. -c#ļ]ٹnd#ڦ{ӈhW] ΙW6uv+[\|eub-]uLT>*IhPgm/BFJr\Sg)MI{ ԙv.+LJE:>y~leNӽNOSڋ!I޹o"GD8;W?@I v yw ˸N9 ^_Q-kVh~|ՏEc}.Wis4/RYSg=5 3%W{u/uvNO^ Skl" Rڨ6)yG 3ŋdeAY36,3IQMtCVwW6]t,ځΈQmrN$K^38Buߗ|_dD>xG/ɾoW}aucL^tRfgOV?E9!n<%XlH1R0y% "u{Pkmkԙb}Y5\:MФα, jnC̲C9HsV<<]N'x<;GDSξ2NU=PKz }3cW(u>"}|~h+S:c:$4~}`l3 P_,QH^:<O%c:!=NquwAͪ&:w8u6,@洟:/I(jwOg)m.yc6њ8K8ӍN$fW S,w^sq9WEmR}_h/͘f_ރSujVxZ0o0}ka2u:cǴTs#oQgԹnkQgLQgTԹhSZ]EN8O>c|8|أ. un7EEM{9uƑiʘmz|K[u3Z߷E}qe/t:F`WؙPҩm›0/b 9 ݭ~PZV?ٙ!ڻ3[*οebwD(d0K9rvrNOdeT{lUJ- R1[Jw [/^6Q?<<^ #?TWdwL?P!E/{[ۙM;,Wr5:qwIh!|}?{쟈-kkNl:;J\k˜ĵZ+DH~s"-?i I&kd WҎ*4g<,r3sig[Nq=;H=>)ѱs -Qjϳp&ur6SYNwڄ,$3`?W$ꖯ, V?Ж[ F7\䅗-\dP'/\trs :d JFQmSm7u&үlԙ L o?71;F__;o=?O)^Cޟ_/+!~3ϸYF$x43!Ns_6aW3C>)핤|}sOůoVǤuYzeP}q;2X+}"뮵jM5JzDZNDg 8Z=UX&kLvVWB}Sr}ㄼzlOd5 ]_PlvgO:L+óyWh)Uoz^ϓxfovߜlfR:{lp6wFK5,쥼NzwLqpL5$#Th:Lf4UVy8&# w>0VZ6HĤ9 ߗ]WKw?Fag.h372 㯓_'NyƸL0r[Fr K;_٦ :G o-[*udή[Hl@lSg(Y ufu6LuI|+\Y8~?=ϻ2G;/Sy_%yKp~ {ܾw_A~ol\ڊI|7K]HՐ#U:oaGb;TQ`;AQFDcH)6tڶnTGd+HbZ9:@O#܎sB B%ZUD\sJIWꜯmr0͎<&NrV+\W(5u{zͣs+#+]owV_V볣 i^a>Z_YB)‚eדeWM}PxK?V+Jg`zwV~Yxek3_Zn+Q~Q;7G%K<߫)wTAgDuYҗp(@Qz22q6Ψ3e̲Cp1Smȷvj[y3J~7V3u'FYIxS-^}~n|3U/~?V?|;N|_W> e/}>Gڝ4׿]:I /;4i /,R 7WV$5zeu^7>?/װHr1QyΉ_9pD͵JAmM\Yk%򜾉kz'5D,C 2bO{WA+TZEh+װ>ur@/+<t5ix:_G1>4ី:{>8f#Pśt<;;̻JNvϻ\+!lh+IAKȣIewPByå:Cy@YQg4Mkȓ_~@ųYyV@~J BbZ2#?&2!|Uu>$W߲d:a@8! 9 &u&:wP2@qR;}q/u̢Όk+ FlC+3K7b|e:Q畧|e:[69 ,Pg& u. W/u6 #k&u^{0 uί[䤶:L%FtPg˨&'u&DilF7@KQ֖ Q΂yZS-}Z>4/)]WND'C/+{"fX:SI(1m}"#yW̾/zWٙ,`ݾuQPNatulx&u.rEqG o.W1\QԹwYz6:7>%F E6Do; Rf$\9Ӓ)pD39ũ3Xf`;b. u޹iFDtw/8WdP=%-wupS$ߗ/9|_GjJ:eʲwHMVՠ~ɭ~lI!RgRg;WnS璘htލM^=O1klXxicT#ތHzUԙ,`gT|xeY\gKmSg1:ɇ*I{u]֋eth\8rʊ:>@{@˚yem5{鯋W {˜*cxv=:{0颳/@MqYHCQg0裶uv,9-. #F5Z{uiuzGШsxr,[\J4k-m@Qٞ.KgzS,杣k"gA[7%jn>gy879sc3or$R璿Z՚?엿`E=>bf/?_\ŪٷD,|N|yԙ4W3*ûK(Sg-_CyN-Qg68NnCNѲ\tun(l;"!0`ʯ7 !Q?uunWrcP&ˢ٘Gj]wX Sgyl[e^Ynu.hM1> )ȕ+S>&:C|ߚԙ>Ha$oc.Iav4}::s|#E3;r|eujs&OV!,p}u慻3#9A3t9D4Hq 'uAS'*6&Qg\fwl\&e!4DɤP2Ӝ<]8V܂7q;jiCgCOLkIkV[x<կL- ?ge9sPgԹ*Mn(mFJ\6 A{aK).muc Stu:æΧx8MҔpmiĊ6^y(E\O p4J^Pt/upzb3C3a:ҝg[Z|Z\)~azJRI4bECW&mk,k8M=`L*v6uu2xHYL̄ *g"#N&X:O}=}_[6g|=#ՏWrpv__V?: azsZ*1:i>ꌊ:FuF:Ch:u8:sSŘ,, ԙ|9ŨTO/LOwҖ&mxۉhv>W#af>޹>dKwfy}Rg_Sg_?!}μlcX$ҴV\hHYޕ+2/ZVo^8iS5N8ԙ i5F%o:Gx'5;Ԍq}o3Μ.0ydV±ހSlӔ=6m<)v;ox;dio={[oS}_ }JxHDנPg_wmdjr?u̇V? |~ʣoʆ:CK,df3f:g=]!, F~}Vb*vW;uͣY2YLu%:됩3yߤSҔoӝ3Ӕ}'9N,m>a}U|[}"gZftzW$6FH&6uu+n4bsP5dxC6 5dxC`fKeq#dx[-Y˸Zf' ԙԻ4VZNFQ`9kOS:8ꪉ0J\&#HCӝܒQVPW=CWf4N]: :7KC:DGɻ8)Mt+Z[tc2;-m{{5bһ>PU-]J,}̊bom q 5]XB ǧ/4;tdz%bׯ朶ddӜ%Ckɻ$q:oWꇁV?En#Wկ:%0@_A\іJmPg#wR5sSgLΘB[SV+"nf޶;%MKvb>4ew>:W#-}< un|_?u)~7`uu:ktSVUin[{_9Kp~BK%y3q殛:I,  FB{XöԹ=HufL RgWRo"DDxu^&Z<]yl&OOt-NLSҾ}i"sLIaf˄F67[mM HO}gMICu q.wZp~p~Fi~Kv2CCJGLpn]^:礹w`g0k /uk u_qMmQ3p{O`SwjbB|=:LaP纉ӬVM'C{-ɇY`ɨ9K[΍#DCԙi;NT)&qIk:s~ķ9V?Zw o3_ٕ+" stQRg὚y慓Nu^%;:vNUc0.O ѩsm״0h.TIФbM!ꜿ uFM!U6N2>;zy;.A ;ΏN4f&ä^_^P6&mL}mꌦQO}=ƷW}_o; rk:X9 frĈ0$C"ٱ7d0hpH&7rEǀ7Eؠ]gD34hf8n::3|T 1*unMq )p@IΒy<ř.Nt4Kto?=љK{gs$~:/HAוVfUܥ߲?կ0b!SXjFl:Z(B.Cln ,[$ogX-l*&!5fAι YCkg:כDld:[*72uNEBumZjmYZO <ݎ*{+~ϚH+wnBBgW|wٲih6eG^o5({}mWXx><կIޱV?O0\`K& ;skN:|6K:WHOBqSܦ`xpZH.|ĥb_{\ƱLΈQg<{l-MzCT;qo\ɩs2ldgU^\f,ϓWF%C~GI\V?1Wdol@;sE-jeCe'Pƨ IfT 9/,,%"Sg( gQ-Pg2&ORzr&B:T~;d+VNNtƙ&{N4LZ6Oyثdeׄ :т}ɑ2Aߗϫ.31/Gtr}IMhYב]O: Wl %Rgo_t ƈnӨ3\3WfwZEuvzjwQgRΫKf:3G35꜎–qY)l.(~^}azeI۞Bx3A² #l7ajV+<ݞ4t-m$<{{ggusdQg6!&x0#½ZsI}Y>]WV/h+2_{934kv_wΎ2ku6ZL uQgonQgՏ5V?Zk~r9RI ./Rb}&Ek|:%7He'#N3ԙ3BayDl;(|$F3%Ш39syO@Iέ)>:K*qY޽YԹ15LYIFdrdfHgjV+̑@rpM0M!:l[΢GSQ},1Ur5fF5fĜ@æҔ92DO7>Qɞn}KSΧ}Y}Sս},[Ϧ_z:CMRcvb|*xq'-܅;}|<١,9MiL]oCkĢLjn(FlwZ0[0:Z*\)-~l16U`7E8uy0Zz>xg uFuV3\2u|9Ŗx!Pg<{ߏ|[i<~:=xѲ==j7V+dLt6љezO|_a| }*ǼJ`Q-FV5V?~V?#WWlfPgrT\[Lag'yMZF(Aa۞(1cԙ&xp)(e̘-u %B|WUo_H?O|׿ggӿW~ۃ>o{/~uI)]9slijn?Gme[nZ㙀?"!(%ᙇ'"^Lլ/M}Sw)J =s=ַ}M#SeӲ?߭^vɟv[EMwKUhVn~ɘ95Myl"vF&2jD7 =q6wk:@^3 _wo5sv?ٞ}>+sqd;)@\ݳo?.b~[SHcgPKN5C|>C$~ ޘ nOq\X3Yߩ3ܞgA{ٱ`]G !8-z}5anr;Oq|iO?IS?y)L2cIyw+{f/VܜMQ_3܌NHHۘ[4y[DKv@;Jyp>m:WʯXv~h?ʾ?DG M>S3RSjs mivU+wO_y;vGn@F{@Zo]=$' ooG%Pz}Ǒ7hg;bf>tynhm"X9s9o9L.Gm|7/ev!YqINnד_Ol^524 ԙtƕ4HVhDixirE~0s$[J^+WdRA35>wO}Y=S뙛^z ^OԿJ o36TN`L/.8.jݯR!{x]?=E%>m &g+ {G8m\Y}3O¤'3D‡iIw nҍ:{e^BJx<}j^jvYSSBz[^kܜS^}{ ?ߥ^Yk|ڞay'ߟCj&FFG@M/v{4w{0UBOO OAy;s6.s\}.L83${*ʰSc5>sYW3RJ䓿GC5?s-Kwl&3~] ϶]:_oOԮojGioy`vͻmM߁COs^|W퀗w}+O~<ob?YO|˟k-yVҕod9@ |U{G^ϳx/֗5p{gh&_&x^Go5;_c׿Eٕϻ\Kks/s?sӗ'ou~v8ΩP(F,@oz+C~<Or[jQg7}\& >)M"HS{7 n\cŧ|ZM{},ՔO~WAp'FzO~6S\[t:sVu,)[gp!'J^<(xSvN5M=t;ߵ>ipHxVBS.Z >o魄ګ[ :_e8j_3lo1ٷb53;ٳ\DafOyg>eXG))ٕ6&_YaH\$ _-_YaB_2[Hm<39_BI[V \կMaR\cmzCO^8q-Bs)hD*ӣI9jS"_Lv7#s9HB㣙΁>ͫIKގ9Ь_~-O}[yg|g᫿/>ﯾG=ȏLh%㶾XMݽh%<ټF+W]@ 3߷"`}_Pϊ+R 5R;5/qstj=Wj}_\bVw8O j&yvϩwΕ ta#ϑ|Z|e!k]up-lDBu֩sE49@%׹6k?7uSguSg￉]{|Ꜹk1_ɏTK?|c J鹏?Gc.!y0$: AH;zF:L҂<}fRnQg');@Rʄp,&ۜ]٠sZZ"<2&l48D,̇٠=|Hw*^Y.ܙ|sEOuG$抬LtAME+0ٯO +WU.QsE@mJv,"ŧLŴeFZE}L,e1D4:]wב߲d:4Ð:CusEcrEVi'Rgbw;+rԹqlL8&p"mIҹ+R皝v{PR&ϡy~)Թsy:: 6<8:$dĨ::l3RTnο<ݠy>\O7di ;޽j%핳0)jQn7qsiԳ|}g$t}7'=kA~~<7hxjX :ˆ7A:f-ӐQЬKlu>p.שs:~,1AuF7u:*yVz4ř^S;}Ɨd9Sg:6n|A|麟Ik#WnXٙL\* ` o;_Y΂Qb]<:ulr8w+ RɧΥΜ&-:۸@{Rg#C)ȶU`&u.^/Jž$F*V*Ha}yШ64pR3t'Xpn]ޅȮ_4?Z+T'x6lci⌔˧L,`IβN}&}yU];ocrzzr:u ;Wou1Ϧu+AQgg^x]Y2kԹ4k+z ?uz %F7ٸ8:J%S/ѨsN"so,u֬&:n{ZO>yӝ`iKu[DLw^7q@ uDpAy]\G<(%y%KHM)X98w`fV?+cS[9 }xGm :G["v:ǂ+RɜfX $(Pg#łgPMs:Gr<طnwPd3wuv0jLO3 SܾPnj>@EsftVni Ҕ"nWblKΗz磖vC/VZb--XȚ(A˧S;JGrs%#Z wg|_ g3;dF뚽+#̎Fyy̞n9fEg_:OlQg68uF!QgF6fmtTΠΙY[G.EX\qu{w(RFW2/;skG6$I##\r'V<.t;,m'3˽¸w9BgA[7%jn>gy879sc3orפQʱ5;wNQt]|_~;S3_\ŪٷD Mv+9<:F|eu^9 u+۹"O k'3Bjypq\-;UNwvdS;3n<)BJJ'uF:659V8˃1:cufb<ݐy\#NSF$]dǝL>bE̞>ꜻ-'uuVEיEz@ՏYb'ԹLuxP{_‘\9Bv:]Ť.ڕq"Qgh+9Ч){<ݥpH'yvzJ8Ҷsxs-=עΖܾoQgL"ݾoR]7'f!_%Adgye;h_ו<$Mj2'SgGKeFŜ 9csc&.Eq1NmJas$dvPg=ey|zIz>IaQK8mRgpԹ\ș911O7MKSEO7ni;_zzR##^ٹ=&6;~=p#Y휛g+"OΗU`p+I~4OΘFWblr٤b&-C&n" xSgm3sCu*[o{ f7#6Qg)7yꉞn<:4|裛7ф4ef"mF}d u^\kr 1efN}ֳu^[Τ'k1= Fl_;js犰}kR\V?gPgLirEjRgT4Ҕ6BMMJ6HO>$K{ޤ[}1m| y:fr1]dQEILqӔzuu;%_:iSg20g劘ʩ[|-;/0vE\g9$Ia(Q,1(uޯ*GvaPg):z rͧb}KR6yĨ&I i}Ϡluv'.'KSt]9:4KW1\勛:˄ruJ^ѻIY"Gŋf "N}IɫFG+LsPizʳw'}EQs5s[ EG_?u4|~݆n[ّR598OnhtQ̬MmvG:2]pЌ:tsSؚ.`unw/;;f\=77uDs!OP=)44o)4W޹"}ԙOQgݠuS猿rV2;+~,=F4໨3wI_Gw3"S:EsZ|eɈEW_:Hk:;}~49`Ǩ3q"C-Y7P1㡦3ydJь89#v-e'70C͈0rI~F@y}TTO@vCW7vO8 L4'rUW>"S&}ְ^BO}R&IC:_ Զ}ec.CmЙ~z~,:"q/ʌb+dÛwKfn,0J%6J`:K5'u.9ڢh3I)|GRYz]ԹԘq]58&>-lO7;ˇƙS,Đq\ce3uf@ZE͛ N:K@\m3emsݭ~$9 $f+Węi#R o;W}׏sV\:+O:n(M2 Z);k8#ōjd M^NW:GS3% d qm_wSH&7ؼs\u95HU#v3_<j+A&!Û oX8:D;W27ԹoN13Iu=E8@O{>L> TI[S\f:c:צL3c:̬P|g@O7y8to#l[<Ёrz3}_Pr$~:/HAוVfU| UߩNA9~afjĎu!7u^#YYys25)bx&VK+bd'WL߂2Թè6=ԹvGSgOvZmu.{3&Q^LF:̘?,u&:F~ RxfXN|hHyAxҦvr|hpt]Y1T:I}Qg4zgI^67z:V4uWCO<9 0bV&q6fxgB+cA %Z*\unN:ԙf P# 򋡹PgM{#9τ:Cr>IRIk|]33I_1 ˌ 56y::.YDӌMG,j'6.9Pt~ZE2yH|b9 ~EZ:<:g::&usEZj瘸oԾ\g^R24e'sXtr<e3w4&uVϰV$dba!Lgx n4:BsqWρd3ƪy]WV/h+2_ϻ]׻fguevyٕ3iYoP_:GZHk vTRZRizkZuVܱSu(=INX ߺjNn x4GP#1.v;s:se  1y 2rf2fo)Atx-M[蜨t'ZڇΩ=.˞kBə[`}_ |ڎMvU,9>f*y&uFk&yM :/˫g/uʌ̎k!{,N pޛk~w9f?/L':uu掅|A޺MΖJwPg5saQ):uLX+6$kcTAC)} ;;YH9gw3bA^}3O3:M~.  JfyC]|O7]ph2?Xښ 1#ԙ}1&u}ߔl79|߆.Nye|_u}u&EdXIf7MɈW٭~gSgG@L֎HΌ_p-,.u79,u.Z:KMA9IB⋆"̌P2c~s^}䧞馠2iv>t4Җ&-yIklt/}_k_Ou|uuu.纣V?5_nՏ4mk:+69~|9~uJ:Ԑd)"ĝMI.~s:G QSj:\v"6#ʽ6u 3c3;33X i:BޅjOE^\?z]%Σβk>~>tN3z|蒱M·ew/*ߗ뿸JяFhI+uޙĚ?0ǰHCw-4 V?`u`Kp`dx%u^Qc:GxG:tN 13sg =ԙKAU/SglZHM*3#J f ǩ3gl gH'>wϽw?o/%Ѓ?oԗ>@zUK?k dϰƴ?>{$ <[yꙤ@yڼ^3H+Dy]>E 53#kR>][rd%6ϡ\ڽhRɯ)~$oǜ]u.βo\3nH63s;9٦G?~bO^$ . YyCpb12*g`[ہ󉒰WΉ2W3GIUl y?FygRR\kO#ξ깸]g^WŻUc;}λvעyz9gݯ~ShwnQ\/mMcvz7;㙬^hc~cea fG3z=u=+e9>DZ>SOԙU Uwfgpff*1ϤszqeJS~qRZ(L90:͵+uN<_(Lgu_3b:~}ūLH~g2yK6):^ףrzeEsgg9JixwRnZ+ln )c {wZjVH&I•@y^Տ??k/|?{ KJ?S?/&`y K$1rsbcIt99;.̓MeosR| yM$✿D^w#| Rg>+z.δF~Թ07?5KXԙ'u 1GG:x'H +oX'#(u٤hZ~7^u~sPgxҬaP4: j< 6R9:I붡Ps,I#ؽ:>?\ǻ_(;M PNc̸e ɱTn]籠my[|?|?/|zr!Їoo|̃G~Jx'^UϤr>O9{o{.<'j4߫C5\Ox"HsC=^.-ǜay!{- 5gyMuU##VSl?}zlrx]m}צ xV^{⿳х;OjZ*;Ln~w|NGhh[*>>߾ʔg;Mv \&5Ļ> ?7hdOm'^Έ)\!Owh_C5׿)O Hx/^yɴM޽mׁN_=VmSqg7м?hf? =jLws2)w%b9jW>y_}j]zwG?/W%_uM"~ sW>  /|/|_/<w~W>1wSy;/|+Vէsa2\[0ͦJ [+zKW+\@xݗ=| ^Wx^t~o?w>g-?>W;xc}&+IVB{z/Qs fdEWGaX\mdq9{b`g׏Фu:|ʸj{yig*sZ={l\Ws|V?~ZGZ d$o 4:a\__ћlRٓN\rM-9\!OMWS9(lJ qxGQbKExnFaxGiS#`FҼV[[<#IMD#"i$= ̨6nh㜖+VhGﯽ|| _wVess!)~+~&^P<|_pIUD( )ue݀1\4\ٷ2T((Εlc\){7 o$:+ldϩW-̞}N|e2/93_9yV?Gf=79_\~YKNz^Y-Y[:/En<7uN N uN \9a\g}{MuNUE MPg=m>uN;;ӳؿXVJ|+Syl+` ҼZ+ܤ#OHc/_3<9AHZkn +#y )g" $QHI{QQ?{/^u5sZU NaltNل"}•pM%d>d̆|X=.Ze>&9[NṠTg>"ܧ3D"k+B|5IM~sE犤= _|_i*\R'y(R#Iv 'xo+$V> |v9dkvFPP"R>FxUMQJmRnf׬UVI1Va#ܳ"…@E=т*=c~~g.e?wۭ WZ U u:ouοՇ<:!y o./uƾf:WD9lN"wj=~NV?ZZGb_:vZn(uF2s :c:g? SgǸ\wPgOcԹ˧QgLB^PqԹԘqY58Ʃ3όŌc WZ <1rVB:pK[ewr9prCls)YF,*~ FgV?ވ=~~l o|X\ZxH~kG_ixTԫ$g;1s1>uofDߎ3ۉׂ:{z%~}q z>YmiT&T>z|:.>Ei4W3uyyT<֜掉R9gi+MI]=O!ΤΨHvu'=3u9ەM+s-O2b=~n#V`v;bxRg?`x3\-T:> ûHY+꬚,0N9KNΌ殈:=VIC9=:{56iRLaHBI3zG˩w,++V L\sE*:SsPi3L#W5;O Rg!]23CU0UyDl{5\C|RPbyDm]Qg̣9e1cԙ̈́δ 7{q՜.a ckNstYʲ;}ڋML/;AB}F@:&+RgPvmqn٤V?ٸZi0xX:[4^Û o6 ߛ+"4+nskכ:}hZLR6K:>>SljMq5Yβ)β3l '3>:ﶷ*Zس.(lMoItR[ُiL^{179+kWorWkvn㳧ϜSavPgg2UoI||u."̓ԙ4+7ݢ+Gy(Sg-_Y h)GA&2܃Zv,+)- !%G:,ΝF5_6;:@Aɠd߇Wh1BԙvI!yIɢ $P:5ή@iʹ!8X`br9ܘ&Ԧ=|~\:jboMuԙ4-EdYnΉͫ_eVHTffM7h:qo< қ=fiKY}]}ߥI:ߦz,|Ύ6c_G*>=/yZ|eV|V?F(_ex[yNK%68 elC6q)Ξu'6w߅E[f/muft^O9C'),j?uSPQgpc̸:X̽˭{KayLgC츞4P>4·L{iq|>|_:<6IoϗLWzjEQ~4OΘFW./| :,70|F:=NQgQ!=n{ 'W< 5 $_AdƓ33:JHgw);}=lih7t6]ItofyKy&u&5]H=>'_/K!+V?k a,_3y4W0QZ0'+3zm*9gJf:j0 LQg3$uI9T:m330ƌ_ 3* _:cu: +\S8iʒyL=i#6"y/|{gN|_7(uwvGeoJcǎ~ ɾVxH:N'`B_p=WDy :[dHgfDY.צs굹dd'GC9:jCu F3:S:+b:5fLS32)#|JHr4eys]{--Eʗ%-n]*s,w)/Eqg'1]D+=J`(ab2٭~0[ՈΦSZF Y"~>;Pg(A,C3"gĩ8H!@Ry:K>z*Tl꼿u_l;XO"$G͌aƈ1r -3W(u6x{j:{iʒy3qV>}}k?CҭR1{~20-،6_ƌX:-c4bixV?#W2[:y[* 殮2Bg$xu&.M@u^gQ⎓MS:i!`SCFu2k\\hWZ,:Q֥W2q|Y3){P>SM]>%Ҕ\h<^5y$(HoEwy/&Qg}}b,ucYדt%3o80QV?l˜@q uF:uKXsqꌹ9Kΰ]gx3d&uZ9ZDGj{ unfʨV3Ʃs{>L>O"MekcŌ3b_ aԹiy-:h)7汔ܖ6 gg+Be2/jJX/8>}=١ rs5D%TI&&,~Nٯ߼Vug߆unV?5B160uIJggpR~\ѵ^ܚ&uSl) GS/I uNQa0,ԹZs#fPg@|-f :#έap\Mtyiɇ6,m6#VtE^F[gH|~>m~LYF[5tt̾ʹS^1߳W$) ΝS:Lc\Z ~k:I~-Pg+b+9k:#L]7 Ri tS(\D3M(3ͧb}KV6:wm{ITl:a<Ē2I|o:5Mz{PI:3$$bRƾ:xpPgG&t(ǣxϤPrߏL̤ 3擳Ē!\?ä2cwIx`h)7Mc/[iɇp9}/[SLchf'w }3:{p=|e2GHOl9艭~X:}nV[*9h9;^|}Lū3F!b30:ä O*Ձ:4=׀@0c 1|y? ^ Ҕ%Cǜh>4ߗMpq:7:gHa6Χ<9QosBW>կ8V\;8oJRg_BAQ~^6^]~¶SܨlSg" tΐz%g٨(/0[nΪTKDꜯP_ 'Qg֛_\3+\ӔV|hhtyZ>tNB})THcU|IOLP_ uJGZŽ/l7Z aV?#WWΎ +dÛ7n66W0korR(dxNI6(Qq8u^׌\Q窫RcMzwϠLFuT>ޯBYdZzG-g4eD|nK;oP6{5D?VQuN§4*ԹXi#U9կ?WM+]V\:YKɠΫdS眇ꆿ+Of'gGP'A::ٶpGQ3{F{ 2uXL S̸IXa3>_aݚ!XΡ|&-a}P6&fyy}mꌪ'O}ļj']ٮA4y3_yqe>tF dPsE69\:71M掂&x:C>l!~ Sg=*unMq(Թ6 8u 3fPg9^ y>wyBFӔv`\)dߗ' RuUiy^4UZHiϩ9 Vl2Y[ hFusEV믿U+rE-z\^Q:[ r%0uьR6vGSg+X<̶=ԹΘD{6_<@kf̟SNJ 39Ϧ;&vw.Yqt CNdio|~\ɩs2ldW}:Eu 0 WΫ+WdՏ65:ww_MrLbr䊨-Ml d:k&%Ouβ[F  e;sW*TlQZ(y5LL ͵^qL1eLF$,t݃ -6/Gz4=mIog+3?߻#"[yA wU?CEifR4j=&ٚtYٜSoH؎ϾUH.|r阜[F^\9:sޞ2=&;0R^l朊"/ӢΰۼԮ۷3|S|Eo\O_6O :k~3JuY6yM{v6'^2amL`vUv29wK d=βE SE̩aR[T\FMb^}_>\]5ishqf+L> :':à{,dꌂ7+rPgk4+$k+ԙ[-n]Sgq7u>VH 8?4e<|訥])I,"ln cU1|_e.־/˧+2emE^YF[yfv_׃ϣή@NL~u[~kw_:+~@ՏV?#_Y;eklXԹ5PKrMoY No:B䄵mlUuuVkhGb4]16u\9k݄7: ; :ʌuj+W;1+,QP4c,2Lqt*y6. eQކW% urQgvͫf+5Թ unVkś9] uNB%@W3FxfsN@DiiK&3BhFL2J{9\Ab 1$"Zj4^ЃP;Mg4j3Q[քTsIMHiƴkbk⥙9\fP9]9XO!;~W&lʼ.Ί[DdGCfSy޷L-*4H7s<ȫm.3)$Iޗ yu#9ʯS!f f.Oi>mhuisAsl~:~W\6 ZBɩ0ILi%JI\`:d-:wOEEJc_13u)j:uvJԙWN3ԙ&uf:+fOVJ*꼥rS7>ԙF3רTb*L@ȭq:E O[! w[ӼM9C:FJNRg2i<}+ܤ2.]'soSgA7կu>,:ƶ~3y^&ʜ:“CŶPab"̚GPHSg!%ԩơjixbk&C9e>:kf\Yii}e_~.VAZci r+liNǞ>u>ԯA,&:[df!6u~}5uy_W×Ǩ; kA~Pw7uf:ۭ~6uF:SFVTn ir˟e7|H&/TJ~opV yۊEaRФ3puuvRcY[,ִ^꬝Ǔ6u6$Sy7Ey:3ckOlˌgƅ S&L:@rkp"`<4Юc:2믽_[{?a4]uWwVPg4Zx/Lx%qh|[;LZ*坍%Ox3%9J@{jASgDl۲b؝<،{<PgLPgMʆ:fGQaƸFlL@1Dd핻38 "uEĭOʅl۔wL&Y3o6cB}%/K73KaʯWs!aKaɃ̯y.N:댄:W+ꇽܯ,ӡ8+^ZW+xE\'q!ԙc_xVץp3+SgY'kaBä7J9ϾB[$O. zj$b lt oZHFˊ[#3T^$'칓5u^(rTKۅ6B$9J:w'rl|sjΦ-Df)dI3$uN/Bf:/cj'uucu[o=^""i^_~^zc?_?e;}???~OCӌ&y_ }orUu־ŷK՝\S~|vf_!uԢuWkhCՏկ~;"($i8mQj_ }߅)/Rg#Yu䎠kWqFɡdRg3%G3Y Rgr3+-,֣mw5Qg6s! ;8:#j $֚[˽T&Parn}˚x]?E|'ݵ|ퟸO_-O_/q7?;Oֿ53^yjo5lC1tdQ>ek0{pj?=rC6y6ۜsa~ܾ#Ϯq/:kSv*߻u#Z־rkCΜN5 ߴ1/dsU\ׅߛ^mmWuE"bퟴ%Qo[usxÅ"ԐOmk/{K=ڮZ-#>koc|3mmGzdgrX1kĹWL1%3<^l*zJz-\.GuQ{\sv4+jzCў\Bў^C Y޶}-4[AyZ.[Y_K'#AoQ˼ fhX!bX`K6am!we/sOwrEMh=YOj)5&\<Ь3͏/Y/ok}_~K_z_XӭH?eF}1!y_y5"ENN#ʯʯک#u$m)+cpPa@ ?G[]^j_:c+穳εTDQy ̥>8:cun˨$Vsΐ)ЊMäu:>f6\XVfq'qN3f̬& 1cVءά&b?;p_|W^_zg-_Ux}Ч>W[o}7+F^6/!niu~-[D_74wfnXv;j Dz4m#OpbyIH˷}(tRgq[iIK s]lYU? 7 ]C@zl0$3r@K_uY2w5xfYhӏ&{Y!CݡVGP]k8'Ca~aAI_0w]X]7' i-'f0;_-LF#[W坿+?k#3꼽7{a,Wγs쳂^[R*f澙zP{eyTuo7xQ~3my>` j֙:HOg>y P=:{lx=\OͬE0?_xϮ-̣>YO?+xg/~gc_9OϹ"y{/'<OyS?s᭿Տ?>>`?!mO\G>a`Ε\ 8~SȹoqUd'ڻLjrcx?}h,b+k7T>u}suc>k'L*4:07 }9XMZ9ku~eϹS߰R\e:q=2Yޅ{_It ;Wv?Ǿ}|i[j6$Z_9iP`?ƹ>n]ڗvyf>x+ΜQ{NUso~=ĭy|rO)nm.ABaBnj۟ қWנCp=NLW7[9AZkjF':2Ƹ]%lFag}ʭ_{'Ӷ40;*/x{A|ߛ=ɏxɷuo=ײL\ o,r[3RұW˄ wpKN0]{c\vfzX{oSc[Ɠ9a[i1mss&[T$s.Uaa(cCWkCՏÄVtXzM,T/2n`.z<8a(mDa-0!؞;Yť܌#F΁%x^ b_uR@nAm^T\GRGuben $vnylL0_##ܙUfH~zp>#8{o z4ҳ __<я/^~7~y/?sCN"!_϶ (a+?+Rv֮OMwk..2E[F*YUV[?_׹ x>u31:[;4+Yg3ȥDMD96 nlo8:wnoVLuN|ᔲ:;6.+l)Y>2u&ŃIRRI_+|u֍}Rg3)^΄u&̶]ԙ5W-O:hEֹ.N`ˌCԄ`cRܾqyTMR+(^[LWQ[?p?{CڿG<`۞@[y'i6 gZ\l{od-:[&ܵ7mڔ쮽k Y_B[Vþ%˯S6/9?}~;aC'\a:xu>XT0h烸k)~n m^몮5]"aBĪxE$1!_izETan"j5Xa o~rI2^ІaEiAN*Wk['ILؑ Ӱƪ!-%g7V8IIX[k ͪI$O~ŽD8y`6^in P?bud{~ (DdPNeř}8bj[sҙ+ByH5a}1ØpyrD8n{䃷L3}ntGPGy%ɠ u#y#XꌐΞ uU3@uѺ.ȯ+_ȝ>^8™ǴGQ l2Uj~e& EM~&3F1Ck~@t'V?\Ϙn39:c'un0u5xֹwשCϧ{c0qfQgLPg}|skp63ΊqfRgc:c[3cT:сǭ ՝٬;P%SVy_!y_' zXn֞oF_-ӏ&hqwNrX/KĆ~^vag_Z m@v@oh ﹖Jo0']lc; >&QV&ȰOPI$kIҗVD:[^ LfZW5\KTg@aRٙ%͜1QΘ21:$}{fraºؙB}Y'O7N^݁׹u~A\'w1*sa,KFj:  inV殐DlQ3衭~DyRV?2m=Տr!-RgÝ繛_l;9Ζ;9tٍ};uvW yp]Ŋ:c:wssw[Vl˝ {݊Ow%WdiMavq*s/LlBٸ%q*wg57K׈Z L= ])w@U޽Qe=fr+u>SJB-JK7l:C*NG*c,^lΖy꼵칓`?N.,) 6s uF,WRg[{"8lyEx+ `)uf-M3v-zE4u9)]K_f;6u^uV*ԹRA9gGckήD h2Sg9ScC ׍{`Pa:_:=)s u6r=o&yݜ3b0~D8ا0gb%Ĉizh}?BS; o4`5'EQu՞SՏZ4 WV?JZgBVtZF=b_: ʘ:c:zuVZO=7Sg4N3LEꌀ:kfSg@%?8:c:kq8cEfR]XL@LEfԹŒ deƺWҘلԸ li<Q穳a6VyߝW}S#>ID sѯ̖_ /ErLE:1uYr:˄k%cw<2RN_hb\ ;s¶u֙ͣ l;jRվRq:j:|Wɬ.u53Qx)3DKè͌ 2AlZ 1z+u.3c pWh%aPJ<06>tm גE^#,+Yy1\R:}=遖_o\˯ԹaҷFJ:Wҷ%'b2}xE*~fJy?u63ԙ6p Y39JxOx=z6Rg&u|MB}L#B4::Ykou>u6=\$՝: %eֶ@>uvG\cH&̘ kqk0c{0>-'Ʉfrk=;uF64ލ25Py\.P^9קu^ޗ y_.ׂ5EO<ڣE~_,k~v"KVV?0v{Տ.Ü:s@[N06Qg- tsb3D,]İ/D!9â/٥?ye6kp>ukNlpq;.9G(6Hz2.OSgn$u. 'ŏ8:7R-x;Ľ5R̊Ό[fRfMpʀQgYgwBn-`U芻T"Em? ھ\[Ua9>ym$Vޗ U%/+Y׌fk6ԏ$>s8ksѯ tD[n9(b|_y:+C9QKKX:/uO#rcFHkg7Qg툰9pDm< 0B1C!x[aGe:kQDuM}8`DߑPg_Ō1D3gYL/2}ԙkÌ;uf qZ@ F~hIs&=yEGE^ɠDGK")Zyچm$I9_g?/OuFCz1A2g~e0N32sԹWPgHi:yٙV.Mԩ/\3M>CAABꬓZMd-BiS0Ykz3,@FPgvs{ I9=7hcAoA6uA4Pv!f ;@bflM@ϭK^"|:f:KI.9xm"4&}:Ĉ7un5}=:RRg{]}~V?:կBiQ֣ν9s'NGuRND7Pԙ=) P̘F= rk:c'u&8&P:#d&1J1N붖+}%8ȼv_Kz{tji_AC'b~Ǟ &Zf"|uYzE+Rm[|Q;I;- uΒU!$kMMk5;+u8%fg]sB.QgΞf:2bLQgirvu1gu>대:O)nQg"ޮRg*PgI*;1\ԙ 333 <> rPgΔM@u6;MN0</> 1ay_XX49.C?ߑ+e_?M]#DK!A}QbJ^yI;ٚ)k?&f.By3+o!vިkV4\ugbF^:Wq?8&Tuˌa3c2q̭3@*N%F_>}O,b,unƅ6${Hv~}NB>8푒2ua|H\+϶~07LwFy/u.%uF^Ix[*lyEvTNQ簉<u^$y9: D5>EP3$u.8<Nz/#?e+8:xƌǩs )dƮsf:0cI f OX ;3c|*a}]#D:'FD~MsuVU"+h_Ng[ՏoT;~~VRU\+ym[d ɂ.j8'`6BԌНSg 3u %mg?Qx.Ie=3F:{N[Gx?u6)KmAMar?,ܕ nL._}oB[Bb25}#˨s|tzX=_'7g$bMBum= 7ՏnRs~7QJr\m uf:u}">u&M؊IׅC٧$5EԹw'. E( v:Oi:OIi>ufPlq>I03N3Sg 0UCs{qJ9FA81ufu.~$ΗO7 y=$;B(󾻨h b,[3|dm/[%h;簒DWLʋř,2&+]HӂV+ o+m "?58HHTz<2F_}r :/JΒ/"O׊3fxc:G$Sg}ln83&~5CI_PlVəq˘:%Gs;^ 3ƨ3g#7~y47$yRg5󾧽y_Xy2A[DԠ^*:CyB9/:n*uniV0X.$b1_"rNl\Hx~ThCC(QW"-%H@ lvss;y:#[:d-a:c:|Y'5N[O:~:c:#@ 2A[8:GIjz.ܰ=Iaꌀ:S:#Sg|qqzUzPZy]y_c#l73;ȯߪV%h!n[PM´OnJxVq꼌Pg+ B7$k-g-A+eWXugH^N^!ԹFP!ۮPgx3ꌃlzu}LMRgq%hsofGS LOQgq& dƇRgl$g?7@dֹ;ԝJņKy,KΒ/NY1;_̯[:̯LAUDu<>Տ ~8կ)%{R_+'[*3Nv󖬵:&MݓTnEy:njsE!:>iQV:V-ӭ~cԹW.&RgtBKEPe:/}p,Reu",ϐ%Ay,9J:ohy9:[&3*g"-)uqnu d|-vT>%},tuv !Kk3be'};M^FCm$uW^eSlvw˯0eH:&V?LQGV?\C_ů\:]~|:c-AOPg+EE:SuFJ:C5W :p@ Pg{:뤸6"ԙoSgD1B9'0NQΜMd S&8 3O' (Pg.qkAQg4Y}I^׎^n}wPgvSUf_;q_\刐unY7P[|8OcȨ3PQ,un"Y"c-]ۡKJ6,FKM @FD5 4tmq_"w';vh?y{[r: :uWs&<إ:Y7Y$kI@KQԙFN!u}(%.uv&uf:+fOVJ*,]ĶԙF3ר3eoC*L@ȭq:EvRf(ֽg_]'cn=͌ (Rg@aϨSgk?9ו|Dvu{u:ùkqݭ~'nHٿ0W+[]#5:-j+E6Ɂ3#d u^!%kl*%}GHl3b8GRg+'@rfL}7O <"Qg#@mfL!3Qg#}nSgVԙ}X,3'"}i.K_u:bA/u>$~~귓:GnWR羇VYrկR|#-uFJ_¢0ss֙}![O:lSg۝{&P㺨3;g&~Xn-;PgptgDu6-s;HPgv3uE' 㫾Ay_0 U׳6z:ŷoV?$PjDlWB_nC0Iӭ~^IxE: o o\ :1uIuVB: uC]i]V.ǝ쟇ulVcS8FUR\7Py: uE)@N9`1c*0:Mr3f 2suMQz{LSgSg,늶l`}_oO;Տ~~#-y7|?zy_ty_y{3UqZgYa5!F:-wH1hbW[zDV1q~;"($i8mQj_ %C"u{:dx[Sg"dRgQ()>B:=CFɡ1?|'Ĵ-OO:7vss}Q]΂kk\tWn#7F]Ԭ 7mͷ/Q.fۿeYvwͶyr[/"VjestWz]ʜW6/jɧX{`]eoojMWm=`X{x˓G\#{_frΜ+Mch~')u3a<\™:uFҟ'|D"v~.5sNcӬ1"W!g}3~ؿO$WԾ{o?ԾlYQlyٶrk;"j+}t:i|n V>U"|g3&PC|s 9|u{ `4_6RL@eadyB\{kX 9ReD݄lA^"6Թ=W1WF˔u[駾y.>H?ODKXN~W} _u:wdۯ9!ȫՏhˡ}o Z]^#3"q|: R8:HZToC'd!uA{tc_F%oRҢtuL! ?IBѹ;uV9 f[Mr{t0cgd"f̊Ό,s2!69{ O:f@K7JQyϾBu_m_ yɫ_NЛyï?~|-~;^3YDnh(fߡx]ۏk:Is[OȮ~T>l;[oW$ 2NdvW׻⎻tj]ٶJ}{Ϊ+G^C@3-<ٖaAI|ηl]L냱g\Y2w5쎗ulI/ItL?C={*ʷo `m!q>*^wsvަ$' Aԅ~}~.kGA^{ E+?kR꜁y@ywsy7Kl/mf澙z`&W!pvyl'WM{ݠ*/^?@탏vLz!ρiw>F M6o :[Gy?d~bfk/] alJx;y6H vnc&+u߹/{ 1{䟹)_o{?7x?z/wyQDo?K ?'>_)q{ G^?#uGjo6&bɹurPy;?9OԺuYח^Wm=k7hi1* Z)0-a/}棃cEC k?0Wt{. ?2`̆y_8.:ŭׅ5v:۟ қ|L/y kМ  %Omvy]~M{ş ֕Am llK?qIF}cynny_q1_<zϹ]o] ?][{ɫҭyCB˄;%}aLv a\v֦kosi|hNj2#I)?6A'= 0~nx|pͯ{ 2hWV?fmn0!0]q@MLZ*!\a2 %0mj۾ k E:_Socx+N~qiΛkFȰQs )b_)tS`1LtOHGML@?;:i<پۙ`FBG3zMDb{=8@2B÷y6Ya:63ԟ4FƳZ;֭B\}Ltۣ#[+?^+ǟ|?}w[MgTSHEgO\2dGg/^kH:kr]u"g]X?f]ԻP,]NX:S&bF.W.;m`+smV?r:Z"u:'pJY{FU H93)L 9"'疇?n{}ϼxȭղLts2B^߰Q4ՙ=uM7u>z6dv6 {z^-|X*j ZÆr>4w<+b\ Er%p" ے^8^~+UEkn"j5X ~~u,(mZKD^3-ɥO:ZO.#_{dbO.Hm9IIL.4F's|Y#"$ð[@)dBI ɟk&4~hP9nX vS N>rB{v GkOH6gE3< ~3g%n uw{W}zD~&@}Y| Ėeяzpmx#o[ozsoة sA^sEo,m~ UllDŽm$LH_9Qjv`wT- MyRgʳ~HZF#k-ui>:;۵3E8ΤmCZֹwԙUc{>s3?X Sgd:jIzwGr>nATȘ1 f -l,&- &(nY LT+- T2ZȰ8MQͤz0fk q޷nI}LfR ~b-|/S,!jCive oQy[~~]%5&1u6$\ѸVu4B~e2@"v)4H~D_tuFhvSՏrrkEjMAG;s u&:^:C~:C1HIEߢ$ҽnN)wɕ3YgZ@Sgdԙ=OlBiQgDY9T80ɌI1 !Υ9Y{ E̊:wvg#d}2tul uvlrͻ-^o'uaJ|z]>wbta9Xv3y6z}@mH|H"W՛. H0^=˼"lQg.yE$1$^M{vNvh\ފC׳h~Sgsyru^2u[POo3y9:l}L=yuST1,uF YL;!gRv?׺:H~n-7VQ)u^u6zܙg>䟜y@צy sCI8]s7PnѰF95@_$suxV?~y__) 7=GV ὾ώn3N֚:Fqu,:çhvSg$ԙFPg} IquAYc(2:b dRCn=͌sf+\a3cR5VLلJ-n}yl~6WErL:1u䫃s稳Lz,!&cw<בw_ uN)]:'lҝ \`%r_EYIZ9uD߰% AY{qab`gƃ٠2.lrK/ըuαEaLj7:>*yn2,+Yy1z3\!jfFU}Lϝ)9_ߜ%LV)= \HĢa@ "V?~l$g=^3,O)Q~;Y&kwiO٧A^Y}%md}bսvĄ^;3!#?i.9G(6H0[+ԙìMMuVӭ~($~孷J)i:,}U   ud̉yMBfqf\ @unY+SgVԙ{|1r(U lh>,2BFȫ6uN+Qhoy4{vEsu;WV?ru\+Q_B1MZݭ~}Թ TPgwE8:YkmJ"d6u֯ Ma2 :uTäv' 7hcA[!+u4Pvs[=|ԙ Ph:My:S6 q9fN0 3\R ="l0u"&3y@yA}gsGח?drzMzf V+~q:/C~\oCmꜷ%PF̯|~^2No|ᕖJ:#l3Y k:dm̶:'[ele @Ce/kFPgHΚkԙ~DG$||,uWjn=@Izs ģ5f0INf:SȌ]v"٢P󢨳̖=VVy2Kզ:4Av?%:_e:Ix~tD_:ߜV)rՏVn֯\iCկռ&Z*逖Jkx摵J֒HInxԙ!ꬽ+ڿRgR^a2unMԙ ŃcLunu&:cu6x-3cFag@Vv?2c6_ qC1 ̘w3cV?{ u.La;+kSئΔPgx#8k}tek0.vSg~m=iml5݀V:OiVV?cWe^CZwa'ua􅯹e:kA:u(D>I-Ꜹы<~&eŎ(/d1"C8\f:3G@l0cx΋íf3Ψ3M:Ξ` 1yQ0'} m2y_:G.g*!Ζ9 O۵2n3ؤWƵv[|DJ~{j s:u&Ψ`EEꌃ3*ԙ-Hs'qÄ:KO:x@5uf:c:33QgԹ<cuLJe,sL f0ʌJ1N8J:kKL:ui>]z}gW珤G~D~ 4v{N쿡q~p<&[xE(|WdGV?rs9t|W$L;-]9cU!$ks{vkNw&WqJɣ͈fYch3"J͈&u33PgMQa;J+#f\SgwX!"fwU2s;{BfHFW8Ha9{[ELƌEQ-&+)un2DtI8}Yg˰UW!8W窣QV?Au%ԹؾOPg߯V?;;L{[fއM xE~]^/\8{CnH^:dpԩ3ԙF3h6YV`Iɲb{پóuf:SJ ܢdIHIcԙ {3c[ kxJ)0c13n=Ì^0<0A1ct\wJH**ԙ'o(%] : ( ewFJHI6&}Y'&8E #pH' ζ/Mf9iۙM'ӭ~WDj<Gg[Ph ($i+RHxPgʩ3FŃyP.M\W$uAMש3v*uw9uF:[IqŃc :;Vl:sq:8GD&pȭk̘43N'p6jeqk,0czԨUdl9l4u^m HaQgV{AԹ}?I=QR3ڼ/vP?u]w#p-53 ;C}dk=u޲V: fZi$ˣy~_٥nY}IZr2 ~WmְeJH/kD:áC}aeꬷ55c3Rsj6#Vl_)uZو\{݊$vvST1auSgD9aƇRv,uF:|ufԙǚz볦άPg OPg9l`ptfDZBPgˆ!+TE^\x5: ~ءΖ[zήYYRgdgla[`S({l ~,~ կJ̱NQg3(˭~_9V uN|Ἣp''ԙALngHm0Ygl:C1Hɡ.,X`3M1H\`')nYEOaHIXvm:3ڳIezQflQ 3*uF6TFȭ ̘LfN@6H^\37}h$uV>F>lO{4.Nnl4ݤ]u2uD)u.[b2TNSgμ:~V?1@4yB!3[^]-Sj:WٶEIOT#lSyK͈s =񀱕:/}Y1c}QRȌ/+3י VZ 3:ÿ'fIߙ 1u:lΪk>4:ayq3+}(Jz>c┼Fyߍ7y_:ۄn~*unz_u7o4MԹp+SgAߘPBvgf~坭~u.iWO#~<귻[*Q8:c:[ BXhwQgT3{:+ws&8:#Ξ^RgԙrηSO*w^:#ֽŰ[dXOeƨRg*Pgdx|90cVx:S6s環U`*ܰQ` uNxfiPudNuK=1ȾW}y|Sԙ`ۦrZ:3SV%hV?ZpZ*pRU0@w&n+ɂ.j}&&ә6#"t'ԙ9<~6K@8͌2m)VPnA!3Rg㚩s}1,Â]Hn΋z}& uV^=ORgԹ>s{||J-jf?ajMA6b#4Bi*uv+m`u+G7ՏJԙT+VJ› XK%9.6Yk݄:Oi:Zif:`lŤ¡SgSޝT34U>u>u&r3+·ufۄ&'D93N&@5#aͫ1fL*'8(::P2J)ΖgôU4J$ãd(>KVbgcy_Ϧ'dAO8hPgюvfBlcկancV?Z*]yE~V0͒O##~;"!u6ޖWĠ΋r LT+(Fk!u[H=CYEg$Mr9u`iނOa5Zx7u^Ȍq$ucc:7f\aЧԟ*,3]J:8uNv:˞?c+8:&wQ~$u,FO>?-l}Oל L|=u&t٘٘Cbyʭ~3{MNQgy|l2:$VWgGZ^kh̼";١-0 uvڝPgҲRm۵3D*&OaR,Pgxw]lfRgObC4P6dFPgNό *@ 5Nf >f=af03΃̘{fL@6ffu  `͋{:;+ΔSgٰs>5F}3U_zl훯j ΦaO?= ~ uYg89Nx϶nS9v"ӭ~Wwn:l̵Tv»+9r'N_ V&8ۦo5Fc$Y w+ Mws͕%cC#}yO:x8lη:3A{z_ڏF"&:u~d:Qj[[JZIWd^0q8ԙ %_:*TNwkAy9:lw](~^ƽ)mB7c[ D`'uFY"ᦘgԹ#d| 9uSPȌwPg۵>q4u^MlIFנC 6q:ä ۉdMYQ~Euf:؟WAp-BlW>Sg9s6fe[ uOɦF`׏ȑC2={hL6[pD_:GV?\C_ů<@˭~Gsj:^R9LB_u<-"lQg3l/C:C5WJ3, d:DѲ/^:))uuQgPg݌R>ѮHE| (Pg&`|d0^T3Ʃ3 93fc'3$3N'T`:uБی:<[RgRԙPY6,Թ%#Y}wSUU_`&8A/I Mp:_ZN|p~V_ZTGYZrun3($ҦѶ:cIFK5$s.QQg$v0h13Qm i;MB<};EL{;o.ꌐswSgk?P<'3ԙL[Z3cu^ l†31iWٰHǠLB}G:47Η]: Pg*-־o:7W>+V:~3* cuNY'k>:d-IWs{}@%Ύ;yרs E)Qgvή_ܤSgTE |;d[P\L#ԙr>$oC*L@ȭ ̘LfN@6ՄeܺT1N[8"u}DQ.$klp:[agCQg\&)3pEk"1HiLՀ8L{.ڝolF'&P%΀!W+~^2LKJr>u֏d"T<  PZz+CyK[)G&k:M1d3I]fL1ƌ#f\bPy71Թ]f:M6ǥ}:sу1HREQg٭c:lك0:/uns:S EOy_6ٵ5[ԙD?M{>]ν9i^l6/LVԙ=Wq_xwH߬_y%[J-l_#=RPgY%, :>n𷲟:c:;1ls{nR|:;P,vuVluf@sČyKlGG0cx:>f3Bn>\KlIQgT3l47N$\Ω1@ڟM9_?ﻥ|s`PQR/-+LshO4@["'bV?5DLÄ|JeVX~- o':G[ sOm;h ȃs KT;ԹNlF~:c:kn6P^*J‘fc2u1:9"&έӷg8:ʌ0cΦe?ulB3;ԹH˘{Q羣*QQE1fOWgTlsdsgYd3~D2ZKuNZrP&S\mۙʰ[PhzEFZ:L҄t߀Wu'^AmW$ip3+SgY:hkuA :EM[xRȌq-9!1WtLu&΋íSgΨ3Y d;{Ǜ]LҾfsz8UQgԟԹgÐlë&/uVCRgy.Rqy?y_ދ^㞷Cח|c~m:ɤ2MV?bB}DYfqaԹB_CߘWV^4s/pm4>YQg#YuިI߲lNs:I5Ϩs/QO+OxC~y?[~[?'<'➯Tԙ? vs)Ϋ9G3ό+x4j3r.D_t]D:gX^mm߫43ԶnoU_*^I^{ߵm=`X{ v[9nk8+X 1;*οkDS(ޤ}RI޷_slombOywQقHuRoH䳽nyWK]\DFF+uu|7s/}w¯?ć~Kr/Cӭ-:SG%u1b =u?b:.= 0QgV?`WWiy,LQP][P.$duA{tc_F%oPg}!2)>O4JPgŌY1ccҵ2Ì2flAd(κufPg ϩO=:@i:f#u;6ڱ:CMPԹi1d-xݿӯA6rwWyW?ڟx_OwW=Ca|}o>O|QFOmݱyWƫQ7 >E4g${kk>LL8;ިw 2W'aIҗ&~oU.-x+Dmֽ<5B=C/u篽joMLwָUɊ{Z$gaaxƘkGA^{޹얞w=ÞI3$ј8I[E)C)AUX4BzѶDTPlcRw49ufu9}fṟ]o߬_/騳s}a_{+^4ɶ_Wbگ>+go՜=u{Nf\7;cxʚfحgΟW^b,i5:?)ᑊ)ɏ=^pGjYiC?i͟1~w;f'].?-y9Z8lDn_y/B|?+ndܜ+몬.|ݪ?-ɷ{>GV;?|GyC_{>oz7~_[:DVg#+ƻfI ş:U{ = ,^Ow|GPMĚ}]M|=VoPu皻Տ4}WG8L|ɯQHy n&=G~yPݖ:(%m{oMjzw$mqC<_e];}z+jC?FsN|9Iod6 .\ͷ_y[n VJ]nVptAO6NT R,O.eM7ڄgq^:oiunxX`_&+HAW12 wqh]vW ފwk1i {XYF藟w#Oo};^|7<0__ï΢/P49ilڝ/cK);ijlI6[-94\+ȯ<ꇴ϶Y/_yV?8$0a7aB~ݣȥJ8-3p^,jަFƾZv[q,k`QSVs' Ć ԍȑa`@d5>w1Bߊ}ފl,n w? azQr51Y}E笥T`O \"^{{s(?we4lYΟBF555YXӃ pӃt hXaC}e})p  ho%7D/~pЃ/O=[_w?Sx}ïRM+ム$Ɗ:_ni: o4ԹpCgF1nU+;ԙ nR~ئ 2Ǚ_&kt\ߤ_Vȯ<@|H g9jc8u&PΤx0)L/aeκϛ:CRsi+oO;öcf:wԙB% l⋄&ŌkN6&@MhdH1aL&^?#Dֹ_6s].p>s>P|ZӅ01D>o.X.W$KÆ7BׯE{E岱bbHQ7qbi js- V#CbcQ鈥UT:6L N::2\.#dQْOGww]+on-"16K*#["t%iRx+._x}mxF} a l rKOѰaF"~)uF|U~#~ZKeFGZ*!v{ !u ueiTARg~!J-ٻ+Թ7.|Pg~mȩ3,? B?IHmKn4-C\v (K [tk0%nmYۋv =T8[4xՊ&8vh9_@+k4M?BDL9u>>m+:;XNV?[D\~%V?DY5lq/Hx36-~(T"lJWEIyyK+꼱HC͈$KNC^͖6#Ԍh>P:ǽs-Qmzwp1Iu'g ]2HR¤20X:]yRaR0rؙ`>_N@<dt+Ji>5_m|sŞ|~2V9%_9S9*u΋:/HV4,}faQ!G޼*uVun{ ԙ3u6hΨ$bdDXR6iu(GmHN~\K%,Rkz!:s39ԙz!Lu2Lu u&:BoQgxٱb;(¶ lS"ˢ2yP|8-|MF꼶0[a|;SuHCJ٠u""{+r~j{lѸ:ږঙWD;Lss{wJFCNԹpeY|lμu[Pg ӝglNySqe~MڀRgM2cB'dvΨMHv,>a1BQ<7QRg(*ֳ! uh1D}fYrL̊:sNPg3Jq_Y:$b؄أ]G`K>@V?ZJSm~ӭ~Th ̷n3N֚ Pg2D4:mH3FPg} Iq:c'ꌌ:OflSg&p6ARgqJǙ1(PI*sȭq:ኘ1y^K%LrJ-nBnآ39MFFӰ5(IQgRV#ꜞaq:w|Dsy:4zNt:+>vJku.!ܣo olIMs~fIrs~HwZ3sh'MGXCxTs IT>Iw yZV*YC:/;yě4]8fLk'ie&m2V/2DZ_9Pg84]Qg9ӭ~($+~eX^:SɩR9FM̖%P,;QgX<8n3!έ7؉:c u.:uvPgDQ΂J3[ԭʌ>uO@ȭIS M*wql2"0NSgɌ+@Fs<7;JP07#y:˔q6V6ܚIi>;jqSv֙Pg62WbQg)Yr2Ity3x:2ȝN<헚ΘsVEY!xT&s\uHO0ム:G[$uaOPؘ:í\5w!B,&Xf]3'vM:3 3,uV#{ Jȩ3+ dh|4r(lPgVԙLLu:/:de/Yr8?Pl:+Sgm^wΎ_h+Q̯uru+W3XZ0F}_hK uvY'k]:uMdC3,@FPgݓ!uC9=1ڠ΂Ћ:uv(yϐBf4yȑ\άs†I(꬈8d3e8'9C2\&1Lۼέ~G_:0~S~eL6r_VJڹPgŃN,:d-de㑫V6Pg Qg]ݔ: Թ?j{Rgr33uYԙQL²!bƌ&~8uf1Ic>#n=͌-343̘Z'rrudD)0lt4H^-VA#DD:4C u6RugM¸LL}van6pKh;ZկW6t^ԙwnȯlXݨ iuރ u-€6lN9a꼸5ꬿx +_ZǛ#B9`n N9cUރ: T> Wd:/nٓ:1L0u%m"}ii 0N-Ƭ}&eî#ά&_:{{@gfYg\:K~D$5uNع`_/Pm~ʁWݳaկq~uμ"T؁:SuLg(uN̖WRgԹ82l4Qgl:)Pg(KuFF {<-ר3LUꌌ[1:c:#@A|Q3*u8uۨȑSd}Hs09=V|, î7.שAe_`NfS等XPn3<&k~&]UE ^.&[wf'u.cLKy&s8ԙCIcl'sXĝ<ڌzQlۦ:ôbORդ2(rST{8uF^fip1橳scfL1u]+VynFĥf>?$uK5Ã*NwFb3fX|u}&:CQgYggrh"ĀlJuIֹ5nnξ_G[6Rg:9.~{$A~^j_rW gn:ŃW-i:Oi:O meԙ,+G;qL[ymf,&p1ˌYD5tĉr8\K=Ψ 0`~jD͂urxԙyNذKR4M7hF_uÎtrtrV?+?VqlyEӭ~WZ:s0a1TEkn9Y {Н,hY[ݥl!1u~^ꬒcBru6#RreyQͅx$ZicjbZƇśmL1B {:w'=3Bf]|^3_VfБ(8ԙuuOY{0d3ّ:kYuvSA֙d3]&3]r"v_V?ʘi{ۨl ~A7MxEuFN1J-,mdZ֬l؉:I:u&NQObRgT[<8c&3oN1cnrLL@ag3t䵈813N> ̘(uq$#ΖHqg{OiJ>:ɨPg<_&בun -yKmgEOYAW= Lۜ:ʃ~pZhC~puFՏ+~pZN~eIԙkԹ;W;QghG1=ꌝD܂E;9iFuvꬷ2D{8tu] 63LM[HŒSgPgr<ǭ1ܙ@[ɚеR^3ņ:sṁ(we#*y0,c/΋|A4%GR?)'5@K|~8[hZN-W[BK0u.ƻQgX2ΎWꗵTR@dy:áQg ɒaRu!JQg m{İ_8ԙ34uަVRsPgƌeƘfČS3cXlON(u#c618$xSgԩ3"lsVVf>:GaTzq:gaX:D|6)LSԹ~l\x3NdMݹAC˧;n%'{U~HM[|~~vۡΌ+V?t3a\Kx'9-IJXz+rS/nN$m+ط)q^HؽD}DjXG$ Dm7ˌu^Kf+uf͌ΨSgy:Όc uu$BVW07E%{J'Rm|f2ۦ͕h%|OEshh DA%aPgF w҈ }[Phc,V*u~a+GԹWΉ/7T:C1Hqƾd*u&:c:C5\6*+69Y.)nfaSg Rg"K$-) 35 νSAfv fN8u0c:C{G3> 2Bn]`d2t qZnXeۨsֶ B}FN$sʳ- uN3 s6`Pv桽<#u;yJEdž A) ԹWyدz[*Y|'̄wFy+uvX;ͥBN{ԙ-H5LQe'\e:|4b:oxp%"& u.8<33Kog_ un"7ES~bp3v&`:8y& gN٥T`Sׇۚ |('/'\J$=ѶQgRggiRiOly3u|B2SgyV?[Z_6yܯu" S>L<>HԙG>NfʛMMD,<aȻ3S<,< ~X,z (u:uK:k?ޮRg3Pg3SgVGOM$uqLdIeVۘq9f8lM- reqkk@F3?a$R)sKar*%>SN$?Pu ꜞgRgv~ hu< 6MWLNjZJ^_y/Lxs9+: oXbTtx :/;y<&Պ.O dԹn 13jVX4&~Ŧi]:Om{JHW$Sn^pȌM7vL!383.Sg"dƜ3c[íZu~5ol#kSs$of2 v<,:/N3_h ufIU>^u=O3ɉG0RSgśuFp%lB*~ec k1Q2E~,xE6[';QW"-WD lvSgDY-rPg9 PgSgO:뤸a5+Gu X2qlBCqy6gHӤ23tDRلRRل uN&{ :af /+#J0Qs9ꜞg A|J{ Vw|PcAyKԙQL^ [V%m [ޣ~u^Fsz[7$Z*Ä7\6)d6؉:c:cmU[g?ǨsPgywe;Qgs+cSۯx2c.2cTsGa2c 39,VB;JHynT3,Jf3_ّ303|0٪ĥfc[V,b֑LH&{ E 6u^IΗN&O:w:9u< aԙ= &b<޷Տ ~ثկ T_+r-Wv';Թ%FCŶkIjwrBm7KJks'0)wUFuKPgÝRg![5 :Sg3)^b.uF6AW3V0!&`Ơ„*3+`̌?sό &C}[Eȩsh46Pgk[Ed7lXg2@|ˆ7SguW MOi3xOy-Qr:BTH)|%*L^0M7ٵ2Lup )S ^jԹqkF_4"G!ur3scvsw`SѮ&Xķqul'}gaQy&M0Sg3O' { (R," 8?଑5G2ƛtz8dP4l : LԜ&L^lí~5+yV [TPgΣ~:]Y9󊐓Nux\:3.Y+Wu euO2@-nw>. P $:o;MB\e3Bf̻Pgc;EWLwYuFȌug3R:'3D5~3l8 oj;~;O$8dy:/:ی\$1Av~{_d .Y~u^uޭ~[|2h˩MVįxE u}5\o<إ:Y7Y$k起Qg&u츓{:>^u6L;}RD٧Ίٓg :KZmAq3Pg3¤23&PaBn0cJq:ᵈsI0c[ flM[8"u}DYQ.$k?uf:7 cY"y07LluNs†Ǩ3LNJ/v+o5qDG[f2Bwl+Uֹ_V?:}Z*9Y'4^MIU{26z+CyM[ ]ŰDuH]3ٌ2bPv'2HflO0;B |EPgLT̘Bf:^f(*Qg#-{s6lHJkȑ\΅DCa&7Pigr:Ȥ;aV?կBHwl+WjdRPgY%, : ԡ؉:c:;1lSwΰxcŎ3l+0uV6:Ow03&&ķPKlGcN*w f3Bn>j-m Ai()Jcԙ ggd*RD4E E1IBʅ: ğ!sT&'٩N|9igvԹ1nC/Lx V%WJ_ "yEA :1uInXuCy:á.4WW렕q'2l\/Pg8ԙJIl̃uN[0c3:s:`JRy:SFQ,UqJ'q8dk=H3EdJ$7`hGsK$ͨsz;Qg<ډ:l^ț u}gܾ}gNo}ӟw;O?;Φ_yo$3_HxT~W V?`+rf'6/R+2G1H NFsC:W6{76َWۨ3Hv3mM:u9^@;׍|'~6xſȍ_{x׿+|ݱVM+yEkA!M o:W[_FH 7-|Oy:ZN&mw:u&u&:kfQ()Rg/Ǩ39ݕkL5wwTëlP牤2 Iei23&ԙ ql;`s8 u{ ^uБ<ˆ] :g]n?lξgõU`:n20lQUu~$q?ƿ4_~C^kGC?7쟿gBG6nw1-X[^u"pٶ4?Sh_D$/4?GyyalvxC:uqؐ'"Z ̳R Z}[zAQږ訳^QͶ^gbǿ/س]A˘Jk˶9j-sIc JNHQ5j}^5s\s;w#j\+7y&W.B-tLU!_[e`9meEY֭NZ_fYeFԜ2?+w ,~Z'@|O-ݚNЯE/֧nHoBK u~ b`NhW~4XO+g% ZL8VBݕzn@*n*$)wuzBW~sK%Wf!:gnäx5MW+O~7۟S{v_'~-Бf@.oiɀ'?^ w}/>$[_C9 +=-l> S֗=ׂnJ(CS{~yj nryٵﳼƭG^"y~_1xipIe}O={ _Wϴɟ~~͚L=EUK{py۝;ħ IENDB`d3-zoom-1.6.0/img/brush.png000066400000000000000000001131401316474227200154230ustar00rootroot00000000000000PNG  IHDR}^ iCCPicmHWXS[R -)wW#l$@(]Tp"+ ذ+`TTVł 7)k;79NfPaJ 1A̤& @( pg>&rJ_(sB6H4i!;|A!N7U/C AgHI&.boTK7(99<>5{3YCl"bӴd-fxL+cKsٟ'a?%7G4>LAp8gX01BOX <^fel`? b-xc $p /F-D,䆌Z0 v&14pqf\'z 0L1(F + f$k^ 3ゥXW>Ɓr8\~7F[-j9A1:cEcW aI=bFz_'冣 "8@At&d.i<%3|O@8+"2>@dH Bk➸;p.SqlUbџL $`C9p s-)pKIL^Lza@Yvi0 n Y;⾸ \X0 3sV>^\Q"m1w5w؏rv;]ڱN`X'vL;ቤVpˆqxc66M66X%[_\/a!wvc˟#ed2}ne֖L;{txÐ7]I\ˠ2㛎eѧ}clHoǀ_(¯B` Nx @H3`3A.< A)(kFPA h9pt~ w`ABC!x"H8$#HGDJEUQm>hNG3]B+:tڌB/7^:Lc`zaQX XVa6;_zA#N8l_ī?_!+F"X!$BaPAE8B8 ~;" wL"%$n!'$I$ɂA"HRf UR?YK#S|r ||<"$g$&%Ǒ#Zn\~2ńAdQS*)(g))o]W 'B5QQEUzIfL ihӴ tkBjf /}g(+V(R8$dRZTtTҰ2]V9J9WynUH****;TNf% sHOK/XO]KoDD?^DA!C]yMw\267zolbh̸III}Siiu3Yns<ӼjdbcIt[Y޲ZXY5YY3íK[_N22i8촹gbj[bf܎mWmwݞfhоס#1qc'g'>gCT[...+].\}]~tsr+t;{nM&s'C߃ݣדͳKϋUO6#Tf69 :L ^|+D;2:?L5,6*Qy -Xq?(BG=6.m qJ)OclcŜΌ.7nuܽxxQ|Gb´Ƅ{&%OKnM!$J0uiJݜn2}34g86Sq&kTBjbϬ(Vk8-$&m~l p==ץ?X1Y9U^egmz]=?{ɛדo_[V`H&%DӅ)2$+,.0+a֡ʳ;Y1Yq`/s-7gȂ .]ؿ(hQbſؔ+y$qIR>)触RRAe˶.Ǘw_y2N٥r++/lsϣWuvZ]Z {>b}憲 o7x¡b&&Ѧ͆l\YuڷzV͊[8[z۪|mmmo3AQ΄qq]_ 1 gwk^݄6Lӽo>}3D5כvr9##eH桖̖֞G;ێf[}^{1cS/=>z2N=qtg:v¹s?qBEG/\jtӱrj|۵gr^WO]vz7"o܌yִ[9ɹnݑ{=PzPPa?שX_Gx"|Sӊg=oc/_ gKӗs(io4Կux1=]e4>4|txSg#>>W~15|%9 `p Pw/ 38P @"#->zy~|Dno'E7‡7"2:e'${;X|\LX~zlRsj pHYs%%IR$bKGDIDATxwtTW{]3s=m1`tȘ&m  $! A1P9K(ǒJKoKeJJbaE,:WtB!BG@!BB! 4!B!hB!B(ЄB!P !B@# B!M!BB! 4!B!hB!B(ЄB!PB!B&B!M!BB! 4!B!hB!B(У=T*UEEE˩o@!ZjMcUj4̚5kȄ ğC BL'6;g|VVτP{+#111'N@!H*gBI4ZOP>B1|/`Ζ<8X`fy#?B@B!(uע:-bPЄM&B+m2ePj¬ShJ8Ԟu,l=ן 4B1 Y3tΩp ti*F.>(+Y7=OdvB@B!FRbE{ͩ:$M>"_mӥyϯhs[OWtYm]Ωin b )o]w.(Vy+UjLYkφնp%h-С:JSBwZ\]i~e`rp0%XݞA(F_r՞{,8QA!d|uթ^g';;tKdȔjI ?3P@g5.pA!d瞓+r"(vh_?&j_Ym-2J5*ݎO7_j{ !1U{~96RdEC`T'~瞳83+ ّɷ"JooǙzɟ8%q|BUsw.f5ɊʮO{nǞ֛PG@OnFtvTy}AtyBe·3s2̲Al"UkswYv2_ @@'m=ăpѱ$C gVhaYw_~2#P{OS|Uʧfi4{כE7#D!}vcҽlLwG|Il^uAUKDTӧ !Rg.q 9uhq:fݯ$s0 tP׺E +gW4v.fRzƤ1bn!N[} X}:蓔5[B1dZ'.dwyi4vc~1;+/@h/]Ѥ[IzlOu5ا#Yt}~'!2"e1*jWY? H,Ǝ"z]S toRY0l^ZmhJ>ns|2F tr=+^jŽ'].Fx+m5}3xӞ tzĝ_\iʭ{_Xp]]]Bkw߾2e[g@ʔ;ƘzS|تBp#JpmKݨOf'SuC9O⊫y??8Yn1#c@7W>h5靥ՋOv^il?)ޞhž^'MήPܶr͖Ê!hqXla$Z<őD!d8)T!_Eun;k5#jc/9=w]f.9Ӭ Br;C5XRyڱfVf7\hk?Z͎쾾o^dbR' a 70J(`"oiʯ.8`Nu|[O=H @׎Ŭ@R;҂|xv!e'~yR@S};ߥIn_>fӾcJj;UfMۮ|c*Mns!( 9K<9!Wڤ%X\0Yυ ow_5h3 @-N?}rO| ե/) ;zA+s ;1 B3=7YR=z5w@Jp~ZTosQjj4-mRz$ G[/[}sS{ߤR7;σW8!7b1:̀k7k ڥlF\ myĒZVUԎ]"+9!vG*c#xS5_Obv|8nX,SzN%k΄g[p4,E݃x 9yByZgEFH܃NtS(ŧ tVd>.vZݼgc<WBrCP5c ?=x3"O6BɩhZ~2؈n70QְٿDvzT4=#}j.fJ?5 $Irߝ8{6־A{%4g!~__EHdLhc_Og6'SE}$}J9 !d\F>xZhtQ>YMm//Ejֵr  EGjZ tnW~اo!d&q7 ff}ׄͫ;Λ|cs9 ڰk]}Yu͙0V#6[ϘaKհ\7qNg%A<-0&hNr>Bѳge\':GBOQk47혼1J Kj: {Ig?BB6}ķ+XLU5縄2Y9Ra,щmGT 03D4ZXmP {S!5 x>KZvc*ABxIzi#}sƾƌ[1R+{] s, ڠ["9wAcׇ.kBxJau˗F:WBsį@zumYߤAe#>riB6㶟ijfD^+O\XZ+$cOeמҞXe |Kk[[5gjysT aWRdcKAkvFr#"o~ẖʮ$Nutߝxlu \x4'gV|ؑlB!Ji*-IV\#}#<4*AD(Уʑŋ'=Z}2Q5g2BDdVE͙<W^x4 @ч8( !dD"rUbPcYm=>.$y~̲͗Yscq'H s j9( !dQQU_^ԍP読n GɲҚ^ڰl8c,w]1E(c!* !dxQk4y'>q{}TX7Z323c .{BzzxA}ݺ[lx\E{s,kثPyK!+ :6fە+;KxG BӞM%i^ %<z%!JӮPEhl'Lw_Fw'M6 Z]t(ٔA{Et/<ͭ*o2=:Os\B+5&oolj[q_E;9y0+v' ep[45ڪFg\\@fc[ B*qP}y)jB2yR)У"_r%!tG$w7ۚ'.CؾD|ֆs-(*Tz,|@֚3aI\LmeFlJqRy8lNY$KhCMr.es\BHw>u I1ag ܕH[/~;tK04 ih Ӂ)o]5v! !CJQk4#x_8}c~3L>)))Y rT6{As}X2T7IgJ x*WŹZXAԂww9P)У FiB,ƺꦿFS5g3Ya&JXsN)@kB+7k1cGVgz?Zxo?~X\;l%K7VwX.^h=u܄ p.q ,Tk74Xt5iOW5thBd4Zm^esh󊆶1Yr9ڼ{D.k}ͧ ؚ&ALgEO= L>BXOvhBVUYaي{Ty4Բҵ7l9vg]9S'͹sm*;G:o|N==Okz(mw.B]{4x $/'t!tCFdW4$4"U|}HT Y=d#}@wE{m+mv\4*y|׊VF<]=k¥4%N:Nq۵fkK ަlٲekWm۶fSS}ǞޏY=눯 !Ѻ=uQr_ ɕ7#>B`VgaƳk;ɼ=de.>XǴL2 hRz ~\iMr?>ʊ`ݛ&Y-˫-0D">}+NNNvSQJq{dYt) 5ٯ&>_Z4޺.U蓔ʩhkBN]Io諻7~+jEJ\tVqmQ[~ܼ‚ښ]fKf'|W}K[9we p z~/qI!Ah&~ѱ^n'3zi/ [ЃZeV|kas ^.b to9y>V+iA7/'7Iw?s9B+80;ls+9JW6ߕ>}Jtrངj}[ H֜ .n>}YtKVԩlnaf`G>u |eDmPN 3+co` zlDŽ6mrIֽx>/:>lߝ6Fc sM笋tKT:@?ݺe<01\4ZEߣ};yc//f5x770xs@SG!'v=SjMLͭgGwv2]-`(tWb _U 2Ꝯh9 R)Уԡ?qO[Dr5O^{,B 6[ bux|y)2Vw׿BύGpoC'yh v| /8hڻQz^t,;=0\@&+oo|N vNh h/>:߅Y"MN `MA`L|/!=>_cYZVPKdE-9M%vjh_JѴHjc˛" `fR9R)>8*u~eBQV]x4@|%.&TFN,x!"8Br&4Ain[PU) b 30irJ@S\Þšj+Nx}z_Eg>OFv}v@Iuе`_eC1p~h>c{]1rJqBtQ7_J*1(S?L^ntq6ENvc-EtOH<>xZ(4{7[$y|rխ:_8Oċn>,Zŧ>-lpBI(*Ua'2GUjVOQr_ ORss@|~T7{;Yt+\CZXMF>zVTH0VD@ϛ݂<4.fb[yytR߆uWz,0[q}6HWbRu_.U-;쵺=7.eu$+`~?LRQb%.-heܢ4īh\c&Ti='wuD>ɭ:4ߋ.9!PvDw ,J&2r;\?V1I2 \0 IfoTv76Qo{xy;^0oUS_JׄGռڡjqW/.F69Ԛ//E鞼u9OTV+S>kFܣǿ_rٮ30믛}[iUt>I@>|ߏ)78bh&Ж9ϛ^~^t4¹ÛMH].p7FԽrTJqZU&畧B]3dC_&=N6:x slLCRhh҆AŤRk 4 ڎ jVk4'}lXLNx/&w;WJHgcOHsўěA{ni߃ʷG[y3$,>B6=Ow^'z GڵA`D7Tsy| SRtsR:(0Ÿ =u-ugÆS^#'Q>eeI;qJj%k΄ɺUx!|@捈|gHXag2z‰8_ʔ_TvI `k;/='m͗[YEj)e|kb¼*蹜@|AA brˍͫ5{lXySJFvDF&ok1ҽSlsu{HNvEc:@x0-8Iʶ+1K\uN7BOײ`Pu|]O<(jY)0bvt-({n59MɛJAUs琀a0ǃ-֙8'>S/lb 3V3h4G|lG_6en]+%:hzַo,iWlu6;wuƮNF<<;]_F/q559%-=e w@OW4Xd7.Zh-R\)RZYf<"Ws'WcEtWoK'iC׳-4{1SGw5lӾڈ܉…ll7zybk|z<סk 4FcKI媽z0AU'3ԵlG3 $Gyo5SNL^)DW:u=<& k@M-FT>$ʦ~f)zĪ&);{KJTza},f^z!HTvn~34+Һ18gυ_ ͍˯)okiWxr?V,Ul3z:}oDqwH 3>I hF7~; ߩ]ꛬDOluKWnQ'br_B朶mcdjр ~RZ׺5xP/k[aw@c48EUkЍΩSFd:E-I_"eç1F#Y|)_X8뷅al^֦@c^lZw.[oĎ)#{ sFē7xf\E 9ӏQzv}1;\u7pO??Zn2!+#D<њνxiFn&WTUT}޷R1'{!х釼frSVaьBΫl>#ugτ-p2ek2ۯir6qPXYH1ѻakpIKw<#;ܞ7p(ET_Yt4@w'A+8@u7u{Bu;ͪT斝 ɩzC>oZhUq)qs2J4ʃ*\6ɬ_8OXs$(bsMmrӹ46֞ccmYthZO\(Op~Bx KC-$(YRn fBI:2`VHڔ42iu}xV,ɍ K̓w2e&LJGVm xs}"@s񻒝nkYA F).-tڱr.iS߬bad9I}fMXd&^jU7 Μ_C8- jF\F%iҗw(7lzhe7F70H+L^bm%_V$w><8cџp֕WKZ=]h:)1 'EJ7r躖 fqunhJs~ixyGi%io\ߣƛꖿ^{j9o1HV)dUeظU2ZlS)Qwt(ohqewUDO4MI/˫{M;]E3~ fqԚg5ۮL-0$~N^ϭnvF*SeuIJ(gM#~狕6;{K;g~E}ػ}/͚9ͥ$udӮg+ke׭Ek֬;w']7oOlw@c3NH(Eh[ጯMp{1fI\l_3 vLRPxpJ6_),л7Rcn;M]bS9mӗ/6w}'Ui7MZWӹ/#[maL& J@@9eoeeYi%LuY:]?Iqp>bKh-ǚwbb諻7~+jEJ\tfQ&ϳ_boa3[͖lN{Gf'/4sƓ1&OXo>땃S%4}Fw5i3 z~q1RqphwY;8|}}[?ҡU}ޤqMY7ĉɢk?psyw'Mgy|ɬQ/] Yy*dZז(fMnK`1o]Ѹh 4qxRZ+sԃ?AoC>i{gtW 40s4{oqߞZd0/F2;:xi)zqߠ@=gH1[7R9矩cs1U&q]b(0?τ 3]5ς c-1i8 wsڞ%mѝ7uM?Z 4qβ<j_{Sw kaN0)M(i% U wWnQ͆ܒ^tJ\Օ7$ =L)x!Mn\4nF"*~q5:k߉I,nF{> .FFTυ0 Yg24xL֜ԵXs[էCZG!U t1i@#٪ӡ?ka )ZX( B~+Ղ~y)HfqU6>f)<ﷲS/QFJZoLN\Kĉfٰ&_EuF*p1S5F*BN*-,iԳ) Bg7ʔVEVZTz)(dGU̓=C+fyrzWl\v>} 8u;?NQ^*al|gs[09)Ȝѡݎ~%f婐yG{yי3uPg4\%_y=͐MԋS`n̲7^sK@#y(x/&z vZ=g0+1TJq]QV}+-*Jc-WD?gupoEFg^8gzS;'Quvw!ThGwb7`n ߤҒZIrqݓO?䭛dpVyZ]) PQp}VR5=[BNǃfd O]ygѱO%C-mnIV^ ˝:އ)=;T4 xlg5,>=|$}X>og[n|^o_a{ ZW<@ 40zӠ}hNxy&vd) $.eiFnB~@: _F>V,;(GՏޒv+1>1BDY(5)XԵpoy@W$Ԯ s~֙=ޏ)31)=ؖl=n|[^tNWzvM MgT 40zg큒TT ǀu%|miӚ!*oCg 40 }/?cq`c_EVyM"S*q}W3VV.IECF~c*u/۩HCT='N~.U̓_YA0-Z{H[WB4{@G-%8tS7#%2ދ$83Ui{WA-kOMm mK`ido:meJLl^B5™ 9?lXzUv5Q 40}3+GpF_5zS%^olhUliy7DJϻCcJq-DFw™հWO̖/o]y*b`VjI}D,U4HdE5-ٕ9Ki{TZ+jx]G(h׮xTue$oş8:bB u7Ss U ̟݊z˒M [v*Rf(~/wk;'C(cMm//E"Nh`OU|s{jLNl_-M4nL1YQULE4苁YeL 邋U6'{@x!^"GrFicgQn),;dׯQ/ZR!ݻckq܍.jQ?yڵ׺n-ݎkf}fܱeÆ$2CHk0fqH[ݣMxQ-%uM#߉p`r/\oWWWi|ݷLهhдgX$Yyyj. wxEgV.GdqOܨG'-z:7wߙr`f}Й5s&_ @/|g-߹O7oG}4+'O~))ß17v WBsؐkT to?YѡS*;:N>uBwZx3 0"Zkm8nak7j.Nλkw0sߞ7nv~h-+\+>A~;jZoۤh_o[F 0ҳ8f9Tվ[ fܩl ]JHN_7tQcmre/+'={ZիAߠ@Y^^Vv^ ?SR6pHU_Z ]w;ܖL+sٰWavE£ߠ@A虇}";fn 4y,&slM@p鉠f]]h7-|.Ws*V~3tvlG0 ='C{X @S@@M 4@h 4(hP)@S@@hM 4h 4(h P)@S@@M P 4@UvZVQj V@ tQF6YvB6lvܗQX)>0#v-6wu-(0hYd5c~'->>w?[xzJS}eʤ>@t tQ{T\lL`fZW+n?)ޕhž^'MήPܶr͖ 4L@\4myns] '[]82iںZxKl(;?Q*>~֭[rΝSr6w 4mN 3&C|Dz+Vb~( ߟ{k: tѪĆ͛7/[lyWVX1o'6e;@gEz$S׮YM-}xWJV>S*;:N>uBwFJm/ޞ_6p`趚-q|x5׉vcoR'[D-Doݱu;*J&}FM](mQQo7m~?TP`S4ڞۦ~ 4L@7(hP)@h 4(hP)@S 4@(hP)@S@@h P)@S@@M(@S@@M P 4@@M 4@hM 4hC%iEjmGF]Y'WŻTҪz /•-~PQ=l%K7VwX.^h=u܄ 4L@kU _ݲJ/_e[/itX&|)/^;lˡZ 4L@k=4{_~;HZjg9S'͹sm*[[:o|N S-5 s-];k֝Uūf{) M$udӮg+ZjE͇wve׮]ml~?͝ q[n:~ms?Wީ晹>ʊ`ݛ&Y-˫iod˺-{e]s8ZZZ;o߾]ݲe?h]_QzxKrboa3[͖lN{Gf'/4sƓ`sH=o;(::3͟n9qGof@rG;iY6VK(@wȥM͝S쪎m+l9@杏[tuh`4XˉR3BnOZST+}_W;˦l6)?v' ~SLxG!ãCCC氯zyE贠+N[]\Y\Վ֮UMMͬY&Oy?˄W_m?߼_~_qHpHpH_?ѿs~?%ċC?0~O~__C~֤ɓ+++05:KSN>uBw#O>:ӊRyŹsgΝ0՟ϲ.]$~&&~H={擹ssr8$2gΜwnMm{3sg̽gC4A*R(MFQTTT)(J^zIBzR[;" ؎ѝ|$d]]kvD__/\&--][S# kkK/'!QVV*##S[ !k}ӥKb( X,Mͨ>1ǏommJp5JȗZ09tC\.Hs,?H$''}VabbB__?-- B"11BBmmmW\u28/_sͅ@33/n^+octŨ%0%))h0ĉ'!$[RPP%0Ј0`@oIddi8MT7`@qrr}62:::999@S;t鬬,{{)1omll $233ϝ;!199imm!ىJ_B$<<<?~ !! ___hq++hdGGoE044ozzzztttiiI!#'/k`.abbA @H| QHxP JE5|z?Z_Y_,.cy]zz榚hue7 c=%EE%1 s-MRJk6H*)z_t~;'R-O77Ql93/.t46v/`A,'qG>apy8VNK{2z愹8B.-e4-!ar[8Lh[X"HcoSTP@ c`-^WE)^@ݧِ[@e 4$tx`1YHlv؆{p@i pyiqyU(Zl3lvǜ`iR];{5PLvҎT8t/F DߔPR?цvoOrnjq@>#&ܘRJF'Uu,L49͡yt'; ;ڱ+ :gbTk3u^XfGIJ0EJ=_넦ƑA tBCCqbQ) ;(vAʸ)a5p9U$4R%>aR;x#\A^qSvM?u5QRS?y@JF9RܥEǐ8S{ZBb__4cHL޲߫ap‼|zjYx O ġf׵c{d0}v({H5TGc5o'ܬ͜*V;Rh5V%!("3WO>,!q#nei .1ЛeO N&fݔW6TO=cǬhޞ>>b 'h.Zp|z Z7))JIroJk:ogXDbvML]3(wr|,<ӨE cc}]^Ð@B)ٵ3*nv%L͝RCoi4qǺYGԔPCuίl(%_!a~+==>8<w*zhrsJMS_S^]-m-͜0Rn 7V.f'A2jխoCI[8&LF]tp)(''mmc{1qm$,sWVS%%:+L.ap 6049~S4wt~MutWX @/-Օfh:VG؛] -Fɹ;K<N_7:mflw}RxǹɱjJ :V*J$0XgE:akeaw]8`=gvLjp XZbֹ5IN#&ݵp:Z\y+-UЈ Q,Ϙ?4?UWU3VAHZ\/=xvQCBZuZVf +E :Z:^^YeqHy>޻Oj<>xf5a]39w1#2,1%OԮ4`W=;> v̎ͥ.G9_v2;q])Cr| U9{XW,uN_ 'ֺ2QYEw)$xPUԤgrWu=w[bq ciQIҴDu$zw ;|+$rKR^Ap E0hu'D?|@Ʃ!$odzvl /`"[(`ǽe1>0)KҬnBQ}^ `t-68`c:/ώٚ@/֤iJZ97uOp쥧5L0TIٔ$Y־>?w >ACcĹB䬡E<9.\ެW/ABΟH9Dx}0&֢ް)be4W&j&]>Rje 1zGFﰦqˌ: Uq^O N7:]`c<#4ZIx lJP7)ܐ ?XY^u67wp%ȹϭ̸֜PkW\+HQZ8P3¯q@o> e~4 tGCO3$mtl,󒲶'-𮔊QmC>9[HFe$y v`w5\5K)*gW3i4UEL7ֹD==v {2-!zGy)9Z蠤*I2ZX4}AFyfygH\n[{g[kȘ8ؔcR>#q]IlzbQ=q Feܘ0yC>tz8thIk@+y犤Ǘvq zA-V]L%߷'46i})nPD-mapћnsC9[மnx@fHHΊ۵cOZ}ly}+qPrzѺ8=;ġXAҰ[w:-jsS_coeQ Dk&Iɐv(G,-/&=)A=k:M$2>ZC8ɚfWzưeNM[@MOt e >|ŅVO s8g)zzfˋ 4: _:?75llⴡGמ#Nu5^Xt:sVdoyiiK𖖗}kM˟ېX̢@uf/ Q#N#sV s7K:{ۚO8Z 1鍭m=sD)KÃkoH07f1o R,- :; ֛1!Z5ㄺݗ`vC7 fOx˼iQ[ں%>ba07Z ۔@! ` 400@h ` ` 400@h LMM LCCH###<_ekW3Kk2[zo&xC`uQ[*X%b7UXǩfj߃ЇKw/>44auVO('Zb1x3{Wq 9ૂiџb>!$ދ_~QURUYG6nb#m\K b=v 5$SwMF;T@~S@~9F"#hK Y/ &+6l0Q-B%.DR[OF&Í oy--::\PTYRPRQK>SVXxq{K5p?܍q IO+y]R]X^ z:JПࣈzVx8j^VZeld5d"QBŨR2b555{;q3XeU Iy~.iVnGU]C:v#BootQGXF6aYٸGd#{50dqȎ`/ŷԦ{V$ܧ>8r ߢ7:'6`2‰ծ. prP]̨F=osPkH:iOQ7#:/t@-ͅk|'?16-c~/H(?JB{'< x42|YG]Ԣ@ ~;6gm5TdKkR *)R&,=/ 0jszIe="W7`7] lmϣaeRn9JvxЯֺ?ݮ[~mџkp+ 3ќecYMMpqB.6uiM0 pF|˹o7e{/BFdd_W~?Qg߉6 XNloO7Jz;݈]n?}Z_|nGYGio :yR\E8 d<*壳hRP]ZO*gWǼ&?˿-xl?8[ sP?=`6-@MG]^lΌ w+=DBZ.o2LWQGEM{醂q6mx?p̦ cޘR&*V#kS ++2P. L,@VAD,t$d.D UR]QK1KhUN(D?3|JmzQUBrɞnN) șl^YlR|O^\"L2}u˧FǣRjA%U7`W@mc )Zw5kד?R4F)85I47[j~  4Ύ*[nUhR|qe=72O/P2f+ɳ\_`j?_$֥a|?/i_>ݻ-l1԰n[VBi eWE^Q9i'Yxƽ?7a~?iwl&HE:E )'#c;|~M~"6،2x-ģhjS\ Jn)):ukaYIy 4Y0`mGT=Q_|~>_}%aEe9μV0"7, ۇnx[3=#>M,@zZlT (u2kOTo:_0|iT2$4$F\kk:QgƀUu4r Döb@_y%-\WߢSVROtkH: h^OAF}c& H(p'#xsV=} ד7PlA2֞Mw]p q~ܟe>OMGxsp_l0sz“F Or鮽r׃҂ QƜ''z %U7TH/&pWlJjAenY-zVM )`$& [Y]O.yQ'ʷH*<ˋ}M%VEwRL[nY *4að-qzţTB Ny |ԂJr VxEl'V. ?),z'Ln:)ͽ D= wN"Y-lj'U'l ^PSU7ȧfUT. &AŐᝤ o;>]N۾Y.v:J'~;9b,4l~/r@YO> :awRP7#zTD|yچ~LJ}& 47|uBnyy- od WM-bS *jink8M3eU ?K)\݆ _ֹj]C@ gME݉FY:5d7ށ| ?~}/\ܴ.[cHx1:0Tӻ1~`=`A_OGZ=wNGF3 />Ad=C/Ӌn<< ]GkDv9&(&Wxc1ȹ:xG,YZՀ<д73>͌^0\Vrk'h0}?WG<3UQbn9;$A? ++Qpõ_&_:RRY"$.k -~f }5' CjhMn(qb"WSc^վlq ,"OtnPRaDF)JX9e5\5vw T&4Cy^G1E`A *F+f-lG _IBn c󐙮6~DOG'墊o/ 3 $'Q^ݎr|*(~u!5{RJ 5>,9X5hן@ pl~?̲ܲZ!c3d) @ I)Ef^,/>Y  4@ xf @ @ @@  @  @  4@ @  @  @  @  4@  4h@  4@ @  @ WD;t= }@ o&dA! 4k(\&zEf"˘bX;րز) $BBBW dD~$=>>IhHHxXX+b $PHyHtuuKJJVTTyDMq̙ .y;rpp@a@ >>>l6ý=\()??H$''}VabbB__?-- B"11BBmmmW\uCkk+˗ܹkͅ233^ LRR!%0`'NCH n wK`---`@ޒH0`- 4h0`?l!$pn߾ NNN42Ц5}}}D"++~jjJE<sAHLNNZ[[CHtvv800Mch QHB;[YY@S$'';::~k/腅/:HLOO.--y;x2d7M\@ )LMM@OG+܁E4X^ tQJMSs_jՕQ:(, T/.̵4KK)]K iϫPy|щnnHѶ8?X_Ge>oBcϼTRZڽ t\PX$aC5[Xii]&P؜0ZȥVe6$LtYn `2]} Ki r U1a ̽(U<>!߫43r v⒘⛞N,& nېTw.(M|A//-.O`f,m_JK=?5rBwʚNڑ5nhJ5/d՚?|'@?|Gbc#];vDL w r }. h5IHSi3=kTW8R>(!>ŸNchh@98xY,C"*pGN#S7%̴n5砊Fr'LjoKSWVUWVu#Hc 7x.}&Jj'h>b><=A]W)b!':@j^S#ht:|oXKH쒒_Ofq [{U5 NW?O:>rAUu] = )8va ?xخ -/%ߩfJȫrf&]re'o"OJ^\[I*eǵSq잣InLE9h?W3<Է-.= #)*\fϒ1%MXvyVB<:"q7_dLpȦ$ش[U #Ɨ&g ML/ Iwif0$䏝zvwDRLΩ$뻄=401`/=Mح,a0Q39\g R+[;5z55[f֡HfpytYՂuLKڦFg3$\gU ID`JV✯,AU}n tgƅ^r]A⯏jġq~km w-s,koe;rO!I-mccў͘=iwTjUB2b.  'UL&wws-Uy t5_4^JQ9I#*Jf O ?dpޓnA 38RKijF%-PIRr5{F73C;Cr;ZG1$Ħ{J:d;.Ð0< ^_s1*Ƅduĥ?QC vPNJ0]\^y?̣?W$j&%nv'Lȵ,;ܾjԾf*y=Y^NKIuC$jHm ӎpK΁JwusE3CBZuVܮ{ҊcCo<[^E+lӃ 8ǩ9P1$5 |ƂEimQs;}+M͍˟$d$l^_6IJC?`iy19N !])~[|ct~GiYYii}ZS"wR;$b fQwhY 1oNu[u..̵r&J7@==M75+X^\moox|ffc =%q`{A4Ǣ9m%{KKC=\:<=[k^Ԭ؆Ģ`u*w0;~AHqz1EJ˼^:t}oIolm#Ja\^Z\}}CV6g͕biQ` f ժ1'Խ,$S-*op0@~[M#E,5 iJxܦ| h ` 400@h t WYqIENDB`d3-zoom-1.6.0/img/dots.png000066400000000000000000000775561316474227200152750ustar00rootroot00000000000000PNG  IHDR iCCPICC ProfileHT̤Z #k(ҫ@%@P+ ,E\"kAD(v .l ;wwo{\a lQ'#6. @zT3׿mt4S<7)r"7)4sl.]-(+Q.b4i>&2 (lw4: ʖ._-ʮ6:22N!o55l,a:{[9tРçC׬6miCfϝiSQ3a.;piQ3>fEΰhi }~~KIY>3epnJd pVZD/i^$,cFlo\)=J&yH(xa0=tt?i>+'Bl6f8:['T>pO+TBd3PA @bh*R~NCPtF7g)"sa&‘"g¹p .+p3|<ma"^H$#"d R#H҆t!7 ahDa8LVL)ӌ b0߰T:eac<2l>[m^`q8gspF\;7*xS >gGaGE& B10B N"XEl# 'H$C )JZO*!5.ޒd#9'#ɟ( e!ELFSQRT;5MF^>~XȰd2kedee^ee=d˞!R(g %ǖ[#W&wZܸD>C~  > \< hME6ҪhhÊ8ECEbb11%%[hJeJg$tn@g'h4g˜9s>()+')(7*(VaTiQyQ5Q S]z@K5E5g5Z 갺zJ~B}5^j55S5wkբijvkzPbx0%NƘXBG{BP'JgN#].S7Ywn^*zD}~^.1 Z * s Q܌2*n㌙i{M`;2)tiL`Vivǜbac^o>hA`bj;vfignYeJ*jUkku-ZV׶Il6u}w7؏:9$8;a*2C[Wk8~rwv:sg %ͫ7vp2\\JܴnnOuݹ#G=^yZz<.^vrr&+i%f%ge*UW X]Zcڼծ'O[ Emؖ.oeEw69o:g͖}[p Z~zGK~ܖg;p;;ntY[$_[4+xWn,sض^^^IIPI>};})M)(,k,W/Ra?w 5|n_EsAeaO~bTWZ]XFP# s;~d{=\/=h1c ~}"DIɆSʛhMP汖Ik\kmmMXRsFLYϑ坛<{~]Pǒc/ xe<_qrטZ_onצ7Z{{wp[[ݎ};ܻ{}?ău =*~7%ރO"< =/yOOGFY?;3;|/ѫS=;6Zzַ*okپ>ć*k?1?u}<2 KWm=̘EVANNM 8;@MOBK;QB=4Q)K`iCY6ӵ(~| ɉ_fО9ŧCPc[s W"LBOYiTXtXML:com.adobe.xmp 960 500 2rIDATx]ݡ8vt@:Ht@: p:p:p .%ݝȲ df|' ~G}e>kBPǟ(?[B'<B?|A ! U[W)ȴS Ʉ2!zgGiek![?͕ !۾c,D, A8rBaζlE&YlBu xß\P K[okl%\T6+Q-//GX!ڏ;e=o [\SԊeJ!e؆qx@R_v8׺g? Ǫ_~x})&)Ve>xdRKv~7G?E/XVzPKfYv2~~I=~P8DQNCg6`'G{̲S~ǜ8P7734~jE `9>?;SH"h2SݧB;8Au`P_e8d>!:"šͽ:J&[rq( vlBDT D 0uer.(jiج.RךyJeH w%;cZx:Ə9Te^?1A+a`KnB:7(A:C D–޽8~G"B?.k_gǪ'!2'ue2@&'ڳT°Ʀ7{Ēcyp9v}6%gq\gqrqaYDx8+%f4x]n Z+ǝY9i13ެd1p"k 4Yn}Uik;cWsk1Fpa8?QFodо^Ǒ"p3LdJ9SX/sSuq%jߨ4+ҟuh8 g9ei4^pq^mrZrkjnðWt`.E-˹b>U)R }*SuЇ7JwmcS[$LW۸ 4k_/ytз!2m[K&қa۶Fն= wڷPJ6sTq_Csy+*V)gb^s7DFJ` gd6y1"3}ig6ϫ5$|g-Ō#I iJ\~ujGKDXp5S4R#J=0'0ryתsیfWՁg'FH! &GTBdvNG'[ym\ w<2}Jv>0V[ c #45y`n34'd&OMuojVN?eN L]!hd +91 HaLa/|ʿb}0,b 2Ja?Vpv[k;-ytk"okbU nwb=VeɃMGݺS{뺶Wuyk&1 ē_,Tm8Cz]K0=?u﹞+5Zʼne[_jݾĝU男Z;!}z a#0d82fߪAi+ SY.M~5.-kd.Dk~oSCw}/ˑT(I4`"pR7wgN!uuxSǍ= e|vvS|A` ͽf}ua.Dg}9%f67tۗKI(6ӵظ ٜ0Z/ m|ϰ&BT۫ ](wug3L6^Lf[XPmjuzBP^ >|m_EG[ y?; lGJaJ+|2솷Kx;Ӄ +;ZXqƽ>8Mmر0z 8CuWw/1]~"s%'@k%3UU{Ч>㥼޹>cQww0tvv>1ȧ?V%#&.9%0Z Pkhaqmv36רw3)F"SЪm'QݴN$BIwJ!2wl.4! /=_ P!Dnj|nDbR*.ܫtͻo/$j *f:Ql+ntg@ ӥSWJK1)&<^r{.ʜG36 Cr9CZ '5 wVC7PY@szI!~W3gyD}ww3pD>C*ˤ1^ϫely hVͰWZIh]pr 2AR*E)߿2k=HdT{FС_̯,we'ĺpA?:i5!S97T=.%NHQP]lO)4 KNnQv8!] qeI*4G{2u,>&kBFJfʉ)؅X5)хGaSf{U 9\D ]`;]'|uI<ra`2AMr- qQ '9+9 s f8<4*ozSji/:!LXbX% 7ZU[-.ͭlH3rXdȴX-mjsgMa{ʼn6h N?buxMCmȜmQaзG3ɷX2"R웞jo!:-:"Zޟ~a6ub2, í(pz0s(M78,LY@3U#Nf⩧Q\X-Wf.NG˿4:` tV&u W2|he90-5}\*.ۻs*Z/pXiY CȞ(ÀKϳ"=nQw!J |[еO9iWMW8nuV!S E'A qW" w)ٖp{wb@k_ІO._|JǦyaeٽq.f)[s?F:CIsuޢ}aj'qA8PtW vL&P;6ndo,j QЌT>Ck4p@¤E&5L 4 j2T$Oa "6PH/n伡v9X'0gĦ,E@X-Yb[g,t΀w3Eu:g$XM RJϼ^0Yggs`TK*!6R&-y T{vd`c-𱹮5EϮرA%b?/YFܝ h]i%\-1|tؙš6 @nU^.ႁ4 +jx~_ 2hcH !rkf. ꂭ-ؽNpkV׼2Ɲ79~0ќM&53˧!LJJ}Pc\ֽ} $~酨0V"밧arK]>.0Jy!533%& 6'3N"+D 9V8k *ǃ}&L P2x۠fLvC*/}NCMrUx&c@>DMkLá̷ߏ1Bd|J9iq!۪MEK gZz'"ݾI2){փ9Nr*p^7::b )"DB/ 륡[P9w, ;'sQ;N/ D;>xOsHZ}%~SYf)bus :'p~WS{Y.ivn]d}C7[8ŭ5d3ٖ"6‘LJ*ZEwp%W_r%Mnq+jzn5;Owz8 4Vy0F8l[k6 O%~nā(euq*i Mvr`/(-G?Ufe8Mv͠2i%/F+uTzCεCiEv #?y4wUacKYF!46UD,KA !*x(UO `v c<79i_^7\eκ"jt5S6Nr`g?)"o 6ɇT6=c$sNz$7Sc91 GF-dw,qʫC@X4hȠX g֑)1}S)cjQ}_Oo3Scm.z=|v૝e0m܈`E&a,iq.տdeP~W3DOQV7h.hERHZdVX;WACN`MU`!Ղ*Au|Gm/Pspӊw:_;SCׅH*eJZ[ Ь]hVl.!epF b1c5Eپ};ΐK\KK65OwYK@`|`fﯠWoiYDn%jc'rNk^jM,uG>= uOweQ&L=s(~͹ 7͐scMd }PHM[Rdžd=U!7(3Q8 _<;jKSm=Ȼ(KbRN>1OU|oQaJ_2zj[3S p#x]57j 'rd5CAW@m);;~{M?8TQx=yS$mGKVOSRYXqfGTo?ipƚ} Mw~E4c;JuK9DVs`?PldSd'v`L6gVtN 1(@"luyAu檀ښTrƘ X^=IbG.Ee TߚqM&_5޲®8+_r}TD_)M4K•!%5SNWrB؜nNM2 7VđD-reN9+\U~ Cnr+O±U#JTmWxU, fҫ݀4,tХ)?FFƑRyJ:[p8w;4trV=Z _NM1"<6VͩʼnC)5WYfpɘM>zdNC8@YpJ`xLPV};WkL 쀖8q$v -M2׉+;{v¥{@pMWF[ǣhdL1R(ȇUi>\WMɺhvfWygP|GlwJ$ˢ;}4u2(sv*`.N{r_8+f:=)+I54!gx WgᚽSc.\ ~/ctmnD79ӳ*aoy-텐7Qjz,n4o!}vv'dv4-Z9k`⌯J SBP pP~WBa(lM>MR\7p̷9PIȋh_~qS?+uD+O`gB};{Bia#!(4"Er+ 2+,b'ӡ]1]V1&gVu+_Y:O6%]Y]vil 6}zJ3*ͫ`lT ͭ84w'c!{U hةS1d!*!:vͶꟓ9ᤒT _M9k$6%.Ϧv_K)ѱwM-ݧI%̓{K[j( dEcVYOJqliEΈw߬R+P`uIH?TIi!әj'_GS1gOqK _Ґ[\Y*>Ȱ*_ TBd |JpZ7*!3-fK,VH!!ҁ<`lOSx^j4l)2Hy* 27N_beE>,JfqW =:᫕Z6$UDxDӺQhxV"U?> &rdCgP0 PP*iK&_C:<SecHfBT|l6sE!sCk۾ϱ hvΔ^L[gXu)MnLr]׌1ZoDO`1[eB܃~9>Y|Zyi$%UF *[=rm/l\ow)<`풳A#m-Vj5T&53͌1K~cecյKAۍpFsT^Z]B >^C}a:WӦ/`>~@syZ}L:bXC5>3܏j]`JZ|>p"^fꬴOU#V0qxi_A7S FE<7]\?޷8ʀيW$,WFSnSY=kݯR5ȣaoz S({IZGlx lY8)bbVa5z,]ޏ[y TVT>^Sn4e7 ce u\T!^`h|p3嶁ㅯ^_+^Ֆ?`ҩ>#cҖh՟YOT\[VR.7rxk<2te!:^կxd P??] 6DǬ-Mx! C CGL6Ȧodͻ5=omp}yA?"\B|l3a@s5qsTv԰wn RmCQ"iC=:q3;%=@ ]h2htr&r~rCjVPzs"knlImA+(R5y`8@6M)a(P}d[Gz90LB4!}C\NяkzFzV[Y3]݅[\} 66lj_׋ r>kE|Wt^v5h{Z>.w}fO?o1~`nx40̜AgDͰvUxs1rRRo,N68~J"[\hF<*!֏X{.?DQmcrӯ`s5屮T>_1&5xs0ͧTJ/*=᧋Mwn2 +j9wϸOs1uA [enx%X:aTX9Yо= 5$2] YfP@`SY~Yf.\k@y@ ]C:4~+J]Z4vf xuTpZwWۃGu]J7:zá^Γ]=L}$uqwXY&Nϔ3;.3ضSfr-ʾ[Zz,ɝ:c!{; G|? kϼCx;3٩`Z湑kY}I%\1W;*>BVjrxӺ#ֈRWh~}(:DW?ՄeC '(Я\cr\4Rzy?)s2`apwr ÌWt .6]aa)8Va3v~n7|ڔ"6j)>Dld+Վ5ELYz ZgA6]Q+''of芇I4V-28"|3N;Ww@_ۧgibW¶V0㥼Lp*Yh;\FeR6?Ov~g_wu.x̩9T钑` sglӒ$o3g@MTv!<>)=AD˳t*KN;{λS)\U(Wl=+~Lr4;o2Cm/_;KRS%j*Nkϴ:e.ZV Uoe*Ho3e)o^+Ds)O9[9eZQ;mpk`fHz=<5+KB<>ў#~?h]"4f4E%Ox7\ ֜a}ubmWq#c\# X6 4ή7JT LQX|&>[^0Nwh)eN!I v qṶhgȕeSB %VJբ8+)-Yv ++MRns Les73xH_pz*,X<smIR_ DmVOݾN_c:JB(WL ୰*Dt$޴R g6 z}N+Љ7qɱwt$p35kr/ĥTO.fㆬm[jp%Ew,$)bU~p|'D_* ]no[h)PM"Ym"6z- xлxAvHb $U^)9:?Z\%tqdsx= ;\(\`a:~@x|1*RU>jju@}ʕkB߳W'11߽8'. m{ D% wsGkb hv%TvJZdDŽk-)&ɮ:a=7@n]NaC0OYY z]"8CU8vj!k壄8|Ѿͤ)=uߙ16Óp* V{A<8 ! zޡY7Gaw!JML|mQkXT@zT 6Pm>,Jh {Cm 6 <>0dXF'yŞQY*إ!~ s\ C66ܠ.t'C)*!#k}2im}iDJ6;~ٻ h "F:pT}[ kh6~3xաZV{I`?׽0Wo' k.T4Ub|ߒNf_J͗2GELxDUAZo7D =&&wO|H[K^h+xm0|e :u(2:߃hd! @g%kҟNRօ0A‘5I8[?_pi!oI O(WW 7%嚬TA-nj)HKh9£xϥ 'z {=t3겳1?< r]\5s -}D)PFthu(ʁ "3-vѦ֗kI `tu?ez#*+ yG'p 6XXP&RÚWdNEN(E}%"Wxec,vυ ;$лm{j­EGG0>V?gl%-BQə$ > k|}-7QO?DKr ~l͙7iu41WUzsܫ 93'axE}{M >D_qRAɞ!{r&2$-]1^A2l^{2BDG;c,kbڛؘhMF>- G_=%tDW; ޡgo:RbHfRu՚b=="Ƞ2p!&\Ec6,RK 7 1/Q3FH-^iHu3 lTe[3AE%VEMHvm>G OB\67mgjn [ BVW֌-g{ϦVC, j*ƿ9[cBa虎27g!r׵2,H\u# .SEDž6z~z)}¦RZG&D% 'Aۜ9q}ߖ=zn'-%;= !]&0#b8z*; Y¸ۏu_Vd\ c݃ /|=]k :MP[ad8aBו76zk/¦CQ| 2ÑSB=;O#.01")Ht{.?eLβfMS='6) !RE)HV}tM5TEkƧZs:/|ɀӉ:#3sݎA.Ƽy_fn%㜹q).KW'rg"N"xoh`U2KRLjlU)PYմ0ȉ/m9ZcUڢ͗#UEhտG70PgLPK!;9-Df:X 釵a%yXHnЂ;`,J|rւb1Ygp,3SĕòTatIF8(P͍C\cg)eRkM8VM# lʠ@焾˔>O8"'rF"`ڋthpN?# Mv -]&61eڳz7%x{dZ&p(Hƹqu4u{<9nꩭw0&54uVX]c`J`g:a! 9!(93ic:{ YB{pa:)s0靷gr!J/ՈHiVK7r;Qcͣk/pN6m|`8KS%b@q{s7[ƨK0} ܥeJ$DsuR2Mk(p|oCܺ`Z%ahp.BL5dE|:dwKf"-O">ݮ4*l?9;O%Ї:j1*""xqOe҅XOL*M\s/&z)+^* y:o"vVw5grX1sZ fpG)bMa24 V B]/y#| hNy,Mz}tBʡG]:ӆV#8MԤ$@H+2e=J-Wz3`נg-ҫr#<6L 3bFDŽϊZM0S-Q2 w בԷ &E  -m ]i `[,a:7~sς`p;f*q# {X7(BO9&L))31{4ΰ ]jvS较%Gg{DčY0jޚ%S\2,)=3dȮeog.&Fd'YGZKQ~8X?5,p\:u98Tc>ь8Vn܍K$*>}Ch`3ս~˼7޼$Z,J4>׬kՇ<Fws\k{X&/B[?Vrnʿ.7^0Wz"q|;8jek#{t1j]M)0c9X N૛[ȳj^tAv^SȞʁauaœSiOM+X:{bc4խ y\`=Cf< QK6aF )\._9 %vK)fqyY~:M':;l O~38L Jeݔ2 F;Bȗ}U[}5oowFL0ρ-C z*`_7 ֦ة"T PڼKt[l|\\1BWWn5톛d2jpzN[JZ14m̅[x-ڪ.3U:@5cz՘gDV3+8sP7?ze^j3Q=D /tcEG.7K!jec}pv/Բ ]J_hzml H^8W_luY8X,\Y2՝ Vժ*MWT3`k;~6RX7t1uo"=*6E|M)ojwI=1P5)kHLy쬋-b0M=;bwY/'܎Ֆ eX$kY:};1,6?O}EL|X *F_ ]@fO5.pN3DBq\0[VARC[#{qSh;ʬ̔=Msqmy[1OBj~Vݚ e\\E7T6xi'+&Lqp⳱Eevf9ᜋR{|^+\ З[!~m6\5Mb׬l_"Zn5im`0_n2a`ʬ杗uu"W|_]3ÍݖDWDgvXQOfز17^Ԧ"՜95^)7<5ugG-h+XztJ6'Odǐxc C-Dam2_1k3t5&ޓnj6gzbwD3Z= Xlc !ɒvzϴ,DmqMkut {`&UjvU<9>ͣ) 3χf\q`!P⣫+pmp+)'eOV6~7Sޑ u-G>)R*\XZ~:ՐȋN` 8:"7%x=@EDz@O `3t<* jWHT!,@gRA%z'rx&7[<+zG DkК.>qZdpAy~Y}qN)ժv W:sؐEj+ҰJ8 iWp`OzDeq! Xbe+k_}]Eu^}5m׹ݩGaŎ\kz%Ox G0*-?Z\䡮c$\E=i >;0K_hwj-k9xW?ymx%*\ND}` N&2:*ǟlg.[0P j,8bX=ґȧߵaɺֻ6#BYX|jɐd"K]if9 K)KH/c86j&?xTXGYQ 4ј<7B 62ew@hiԛVd>R-*U7yP=+WUG+ 1%lcòH2Gl4K KF|d*W{$d]KVOcl=SY'/}| \C@|/D}&2 fu֧RTSG^7\W{>:JuM}Й=챒0o+7WŖ[8W̎(2(N0s-YR-yU3'Iiĸqomzu=P>T (iն5(11Igt5{ Ģu*Q\꺇' ux f< ;}Jpn h"ELD/ dV+dbѣc3$cLZV RfX!%[;)*GnR/}~g"Pʵ#Ñq6φ="Š2߭i˕M9XJsnĖ`Փu͞Q'uO|5Aispp;,=WYJ ӹۙneM.߸a}<W+1KECch1-H0ndCgOi\ݏ2v] Ҧ'du2.F $R}hc)@Xܞvq ur|&yֶ ĵI&W]}QAZ!vfylw7pK>!dxomxv ]'ߧ<·:ڡO)RqqdPE>*ceԺ1AVIu `Tg*ʴL2[Rߚ5d'/WҤ)Ժ~9e7H[W>:$":^#{J@  Al| ny<%xCqkBMq6h[莡1 ~ ڽ> %O_IW~keriCT4©NJa_- 8'QsM$(kNӏJYk$Q<;XLWXW81=8 u_>1&#sf@0p#]1>b/_=4FwRII{dzȄC 4j~<'U`̈́ f0,P0^*]2Sf ЍڪE@労"5&\j^xD==W%^k•/k b[vɢx{ iaMީuѹ9~uWf :` mЁ6!֧ ZX4(HW ĔAāau0t9,=-WІLlrTf=amYN 1/1 5"ٚc䜔=cWX|*#w,E)E\i6;rNqv1ѡc|ؚP%T߼R!bmv]\{)x[dp.^UdJSb'A W9^ ;eeMn p̭ajbHv)QT[uY1c'nN>|K'7`D<]6 \Vv*C]URfb/uټJR/ 5`-M~^X*E寗{,7E _7,kRnzc)2axmDΥ1{IͲʹkPB"GpTh!,u~2v0*AIaq@":1*,U|7=cP` _y/NW[(}/S!Akr7n,%,uVD~0 7LjL;;5]CLB$0z'!>e⯫Y?!I^v/x%U#K>~ߩu~s||9sQ!:\U`1Ž=߈Fx+WfG{7V 1&5I@J؏Tt@Q 2I@!Dv^v@uK@倆-E z:zN]5br"Kħ-:ԔXyXޕ:/,@Y=w+o˘^s}x#WîȨ8֚|.䥾9m]p &qu3l#H j6k݆E#tc q6S&uKU1:4[b.D߿ ",Oj}- p1Z-0ci9 BlN`tIʓ0llnn,wٓ-46ك *3mVy2$r$܇c,n>{fJI]N: Bp?(:6Ҁ_.i&/ʄѕə95e ,*m )pʆx} 7Ż6ۚR؃uytb"vGL D:0_Dl!4Rw/D….Mq<٭ZhJ*#a}~;ި:~he3hiGތqL+6>j9D5BnTd$,,":&iҬɜІ q\x {xH)~ٲP2F"Fi|_>_1Υ!?`<k硁Y|=2LRYУ8'ȯXN> M,ZuZjt:9%s =+!8f&40{ =AB y/@lpb K0*j׏|kJYqlkR'Xs7+ۍ3\; oR5;+ɕ!Nvͨ8JjQ,,ޖCT?DxB3i'Z]#YiZyky%c~Kx(V1d!p$l}; *e;=mD!Y[1!ر}(n~(; D;p+05uX``nћ#LQl(.puF; ȳũ\#x|H롩ɤ|7W#n&2,!L`PgLV8e@Aa\f~ڍTc{!`b J2=*6MIk/`)cyC&_ `g,8@`i $X PXǮ|=7svlW7ǤQxÞ k@ ݊b _}X+"dKѦ7ƛwz;y4;;y0ݎvV}xy*^p!g{PㄽL3IB`\9skrs֩ե׏iBk\1[xqz =}RB)rnT wj\,Ø6EJ*ppˢTam{$Yqf2ҬZ7տ:,֨ŗt'}L-KlQ"Msk-\h< ejTi؛5IRIe ü/ sm[\v#'6fYpYؓ+;Y[bGCuʁ SM6{#:ߩ'ԡJ rp+_cьQ(b[EʢªaJ-/a;u1@(\Tr c󃹸3bU&b:dwnl9wX/&U㦺S m.sv.CÜOjWe"}R̵%Np揁P~Ma?`a6UI|/cr0:3g2pRXsRxv=Rح| R|]gq<5,?N6gVR|gHBY[t"﫺 F>ɜ:V>:$PKyc+QN;|Usn{8ź c477dإtͤfR+J:%K0B~8tvG /.3T kֹvH[ѫػҳ 98G੝p>yfUU#vs8ubI/\V(sIKVj` q<9 `mQ VLbe CbߦX(̴-q/~މq4}DDb5#ePǿ{|7n F@y4`2%I㍈x^XcVfcX3`WBvL#p“oәO@|BH  Ukaz2WQSB3/{_5kmk]N[xɪ.PZPLJpX +0%D%~*q?u4E}CKԾuJZiC钷 UUI3P :|:S$aD?Ú'xsLWwQ?wiym}:4%ء zd׼Y\wYf{'ZIP"?xp[ iMϙ!ٵ%q+Ӈ&:k<MoCsOsu; R$bP@^Om""Ja;~w]m'!G.3_u//#:h^E櫆B%wstnʝ[NК$qHBgrvC̅4LX<'ݧt\ursXn'{@DP=Vt3KpᆃZh@;'xvS4Vt2skzrBWxbPki@"oWV !?[eR?m~3?Ѹox(Sip}M?cO9u.q67nLb”7xrr|#ߜn Qj۠5iЀѕ{W_L{*r1z~M@( AmGzP|?q%VTKCdKuN`b.[rkC~},-!AX;{ѕܺdnFaՌ VZq$t3fWKarNIT&`(gp E2 l˾t}@⿾=ޒ$5[Z-ϫ~C 2]dRÞ{ŀ2r5yvɵ@zmȓCK@jP(Of.xc \!Z$W48 ˳@WFp}{C9AU e0 *ɗUIvlvus^hlcʚ֑fT{8S.1h~XKLB!B~$ `nef6|s`h\Y.LPߟ/ǧy+ŦaK4v/ip?zbOu4bm&.8':\ ~Z6 4yb=D$`@vBTJ+\+> ۃ6_ sz &U|,c$jgܒ`%\o *"05\&gT6-hbن|,9]*`bcICE0Y4y*,#J\Nll~[tq@:Hq6W?ٞb} E[aA݅*EuFĈ%D7Կ> 0pdpjvK ";G}]b/͸@<[ۨf 2h]%iHG?S2Ea5=&a6lb5tV S -K%ܹ؋avrnF;~7lLBT3'hg@.2ܶx{}T\hG9$3C{`knOM)?H ۢX?AɝB'noP,lb (p2DE`\DL?q8P#8z@30[ǶA@ BSОC ?Г<@'s tI CL  Q$p<+ j<=[o&2 (lw4: ʖ._-ʮ6:22N!o55l,a:{[9tРçC׬6miCfϝiSQ3a.;piQ3>fEΰhi }~~KIY>3epnJd pVZD/i^$,cFlo\)=J&yH(xa0=tt?i>+'Bl6f8:['T>pO+TBd3PA @bh*R~NCPtF7g)"sa&‘"g¹p .+p3|<ma"^H$#"d R#H҆t!7 ahDa8LVL)ӌ b0߰T:eac<2l>[m^`q8gspF\;7*xS >gGaGE& B10B N"XEl# 'H$C )JZO*!5.ޒd#9'#ɟ( e!ELFSQRT;5MF^>~XȰd2kedee^ee=d˞!R(g %ǖ[#W&wZܸD>C~  > \< hME6ҪhhÊ8ECEbb11%%[hJeJg$tn@g'h4g˜9s>()+')(7*(VaTiQyQ5Q S]z@K5E5g5Z 갺zJ~B}5^j55S5wkբijvkzPbx0%NƘXBG{BP'JgN#].S7Ywn^*zD}~^.1 Z * s Q܌2*n㌙i{M`;2)tiL`Vivǜbac^o>hA`bj;vfignYeJ*jUkku-ZV׶Il6u}w7؏:9$8;a*2C[Wk8~rwv:sg %ͫ7vp2\\JܴnnOuݹ#G=^yZz<.^vrr&+i%f%ge*UW X]Zcڼծ'O[ Emؖ.oeEw69o:g͖}[p Z~zGK~ܖg;p;;ntY[$_[4+xWn,sض^^^IIPI>};})M)(,k,W/Ra?w 5|n_EsAeaO~bTWZ]XFP# s;~d{=\/=h1c ~}"DIɆSʛhMP汖Ik\kmmMXRsFLYϑ坛<{~]Pǒc/ xe<_qrטZ_onצ7Z{{wp[[ݎ};ܻ{}?ău =*~7%ރO"< =/yOOGFY?;3;|/ѫS=;6Zzַ*okپ>ć*k?1?u}<2 KWm=̘EVANNM 8;@MOBK;QB=4Q)K`iCY6ӵ(~| ɉ_fО9ŧCPc[s W"LBOYiTXtXML:com.adobe.xmp 960 500 2PLTE ////0000????@@@@OOOOPPP____```oooopppp!}0IDATx}ۂv4&X.,:A\Z j ^cXs dEEwԧ .:Nx9 ]Z q)|xj׼"@]FQ@̬ }`sަoZ3܄ȢzhL{&3=ꑬ?b, v'S'ys&\lb&8!wǝ!_H~%#u]s/.22?6{ʸs.Eſ]BZ[8XJҩn˿ I$g,Jt֖DE!r,;vIeꁷ|>ރ`]&&SvckǽJ=$";4&B4#{hWju~MA`sEZ|[ &VDIcڞMshYՒ.W($"oެ~+ I  O^젷`# @vc;l$ƥt9;t۪j*iX D  @`CC[R~CbO@7l"f}ef:Ffa */ q ,=򪖡 L:< X"B7ͳKG'^y1H,{?GkIlvx>u-.E:6CuXcUy9Bc~ulBu89=ZMXlM0 "`9D_WgnTy<@p, LybX um =%pw…2=UuVx8Qn$47:b!'y O{G t #'y뭟|(=z AeH$e ]' |/"L|\]|Gܘ4Ac`hGFt^2X'x%eHD9R ~EB\ڜpXGSBN x箌)ULQynyB8xZsSӝMVowQqW5R-qOyMR$ӑÚ*d-^n^y眮Ϻ)u;@sZpj4ς_H5I1=-o:=YHC l$S-69|S )PW-A_unԎ̢e 0l ~(n[f!AB+us:^{h拚l%~1bSe= ZqNBMKdW}u#x-- 5"V8iim txWkQ/A7JK #g*k=,@oHm/?Ix?cp&l_yԎ`כndoaˇ}Zn'l mOnA`w5\:lw']\YkJyL^"qvlE yL\4 7Tl-_ B@: ̝W輁|$poˏR?t 48$pkApW_ˮM hѱ5c+&wψ2~fԕ0UFx72ha2A}a 284@x64V~DD 0pfxC*=ra?QSG\lk k6lօ?lL y>voomEݙlMF{>uu쳈()TՋ{ˍc Ƕ+{ T5<juo'/5*(2L`E`R%>2>M/b^͔arttv />( !' _!;::18F51v`.S8!+"A%sU57כٷ̾u`0Fd]FeJt}ӐO CgX0_.>t 5a +??UކRwRl5S~~wu:Ec>H rXkjϧ )k08 koxS/̅Fg@t$,=0 6 saTd&a'EX&q s1ԝܞ@;M5 ||}=d.jjw1SXFg{Յ;ƫ2xAXM*: MQOwY*  u__vcʻ;vsJ{ƹj;S㣾?`xcTFZ(E,4#s2 gA sLv=wԣ|ahw!@$ gM6 +'|ZJ"E61FݣNh ed, M(d+Xkgb+xQg*GX2VdUsq GUT(1J%~$p^8H@`IXf:A;DmYơ9wOk!GACӽFj|Pu ;CN\Sja\T늈 nY09G>cg;J{']7kn C_n1Ͽ:x9k ֳC!bxxe(("HhnD xuTCuXf妑lv@`Z))\#17&f Gnxhc^a~ӝ6`HsිFlީ᫇MDqT?abw*B/>  NNTW-4n9>:,*Zwj4V7`P^dn[3i{Q08ldosh.f7^4oOЇkh\q k uqN-EFE`/Z?w,#Dϰ@PoA`V=8j(7:R=Yi(z~iEVd;M7S?O*9I-%0st ~h:n lB|r/6Q"B lw!&Z:aJD m:_["7ޯUިoRg&`"N>Tv 6dz~}887xJok2d!gSOyEK )㐌HTٰ`dx8t/0zܯeyXiz#! J.g ;0ywA` \1"⥿sTc[ԭtu5Ձ?W xv~iۊcYD2[$[PSX7ܥLhEa/nBag'xO$cCW닜=@`QhtΖW^6<};rq`_w\m4liZS gH(m z =|$uzi:4MLz۳oD i,c0A` ons5~ujkY@;T>{G hU!<8M`ɯЦWVQbRs{-#sl.E -~jEUn!k)les'w H W–̻a,vn||_uD2AO!0A=.: .ÿA`qb߰08MM?^':o 8]$pSR="Q͜z\_{99B" zܭPeTIpacOC]׻8[Idl!sokx3f &8Ӎwߐ#/0a[JD!#" 566 Q ~/zUi# MM#l|^-1zOPd~wG~e6*txa.fjY[70 iC.e f{(ѿ!<#pz͖ڳ2$ŔH F` a.48aS+n7  h"dqf0 8|'dd`+0 z,Sw[Ѱ|!A"[{q?. J Mp9<jHθ:t B iA`:)_VAU8L$Ь $V8qZIX"爼Lb` ;#b1p1:CA?ޱ c!wjak} p_~z 0kx;=D1|>ݶ244weLah4Y@Q%_"J.2M!Q\۶@z.T^ [v ZKOWW%C0=$xe4i~ńWjmeⶲa3T!1`&]<}?~~ᠯvG& =h7%^9- ޵OCL-/xgMψ}v{Cí+C>|FNMh±tT!v-^ގn(u@0>Tyc:v 'ZnROTW㡑2Mc-=NM Lf^S*k?T_R")Q?5U&e(c07V ج̨?&k*;$+g`:UsfZd .V EDU#4Zp<| Z/ {Lje)PIe0, \ٳucLʇ9WI<krwKDD5Wׂ -kTF`NGq7{0X ͙̝+uyE]s17 @ ѩؕW8t 5@`>4*szy\A0lHM~pT'+W=˲s̊MgQa1փ/v,qbcOyzC%Bo3{W#) h)H.٥A =f[oXp\=Cp&5ؔc46\y5+dr.Wzze#Ɋ)9 츰ۢ@ XO୪wg>Ȟ>xLWx@({kooFzX/Zq50aa~4ڙ,FѠj?ܲc)~N%*/* U: {wZ m͢O1u7\ 1C(e(2y9΀gE՚JDsp.*+\  i&vV 9a}й-EWݯyzO 0 6'a9"&"6>W;Y/ۃADz12ȧlW%A":oHS9 Z2 2{RqQ|(cuhl2~e耆I4?nyaI Aow,;D޻EQa˒]χ_0?s}fZB;%_kNX^w_AZ_uXj-žn\kGplﱧ[,*Ef7yR~,3=K^?_>>M0L͖КEslg(@JF\h[)0k%CvȬ k (.Y."@i%@x1<=+ fGCFs>S5%N9`"荁ӝՙ0"Fb}Ww't*sC ;8W @;7yo8iVc)MɀY^k='p߇8:۾̾r?N4  %cߨS"b8<_g&ϻ*2k{21˒O(~>""1: KmUyAkPDq)bmh,,Ȇ)E?@X;VRlwOKIM<:; qK,*J/Tcq~5Sn$ach6Qzn#NM7{'@`aVK୭' ~zؤrR4ǘLSs )DzmyfFfMZ)A nTwuT MpQt?o 29MHJh/yHRP8m T|[#YƑۨ W|]ˤ&ʼnjΑtהk Ą`u7ŤTQBT4 6G2/ rEozOeZup&;:qwfҵk07I p4IOl1ؿu6@׏wxVi,>%Bg2 3Į ա|=ibW.&\Ub2 Ŀڥ`|% /xwGm>`(^tC}O\aمxo&P|H 3Պ ReIQ 1ײ@`1(VHK՝[apvJe5y ! A`腭lY{,VsAuX$awPE R@`?S'JBɬ2:}EA-ZB,Kcߠ7}a@0Xbq ܪ{^|V:Q;ӦiYx:=}tTZQB߻*=p6ua >H/Oho_=ۋ{U3:mR?-)%0g/c7 QVCr&ȵNj7^[AS)\6_\m,)ؑ`cB48Tj^̜nyIlEwJT !K雋ӽ)kE`zͺW3 n$DEym,0/rX"ͥ! ˿ /2 vc|9$_ؓ-!ҨB"AYox"~GѰhO{ "ӎv??gs\io*jcc^3Nw'GO ˲ d3/?7ܑ'ߦDh8yRxo_EDQyGfP6#Vw|imKZĿ&XYԜ!]p*M.`_8_bQ߿$ϱc p˘(.զYG}L{"sq_Z!}oOUD__N.-O_&kJqT뜬EKW^F2Ξ 0 .^\4Yԝ]<~7S,GQci9B,2уVC8qo[#5SVTZFKNR6Ti~5nm!p'_~ȦiʥT/q1Ǽx'5y1LҐ"_)wr2Sdg;,0B򬃹˜:UoTA`)RsDYֽk'D6(lPOF‰tT^sfF|ژ<{'ʸhߨꋈ()Ƨ^JbA%.4_ȋ !#WUM!(lk YKHuu}Sށ@%G_Fִ-ϯwȗM OdX{:ڲo?&(f/˜0 B읙)pnI G]^t@D [.C>c^9N.`B <0V\{5eq׻oBBT&Y0S僛UeHv%i X#oA.=z )dar3" n6Rɶ\ dm\۹ԣnM r߹>2teь!]oDՌ֕y[J2<4.k\͘y1Ur X1Q3oJHo<(2;DsG'l!u!eȽ#S E$ \?0b@p?͔=m$^87"CwϽ&29jjRZyC}*Lr颼x7Zʶtۮ5lNb3Wo\ە.D6_9ٻ[ 7o"f46,jr⟐]um7 /K$dX:nYq|QHs"k&s'ְ8сk.8>|JmvK\j?w&XDl;&e+-HL(Ͼ\"D{]~b_@622o{S.mvߟ[g,K>tfN=묉N(OI\_ 2zS0B ;SGlmbxa5MzWB'MK`aƶ\%aN&K1Y؈Bo53VySDz5d|iFU>G`Q9a:h3 mZաB;bО|Lao695/.Yi)1"beGQ^æOȘ< ?H3G=˲!Uآ7ũw\c oϦ$֦YM$\^ Pi: A.,I.ﱱI3y|yl} =E̎a/A. Nlv*2wm(J6|a/%_)CAD8Sm ״ZyeСG{Z=@5Je4<Z=n+:w^bZ$ eeKpT ?nu -Zpqv_`h<xTzU f"LRmMR(5wګn`"Ng&iu%;OʚFHL[DeXX c:3I@zr1F9bDFs& g&!#/[(3Inڵ<{S8CG]_MgFbڕt^]~9^xF0_ PjfL(~`Z`]".zzKy ([x#692 ]Xf^qndЅ_@73= jul;B>3\Nv&KkEh\@ x35$4g:ow!01KC:-.kOѺB^ & b{q2#,Ե ;6cY z>HPDD6z8ϘW~vӃ~ڪ- Eh՝h .cl79 uҙ3@S} 3@`Nt)+2 }mpĴGDǯ[xqeZXdU|`Z*d$4XHLM:曻[5fA`k0v-[k< )ToPJ@׫N"3l&˺5˼ȿA`TJS;K{]O*>ޡ$"J;j &t̢Z{(&I+|~s=ӽi<,&j LNlf5Oz¸fz K^c+=g,fecsJ2= 9vfGY-e ޓ$_uw80N†韅H>*^漖V4e#7r~x iaz2nEG:qg␒zm2 kp; p*1hђG"-mDNMxN_D픩!{]x=ٯmi>?RO<Ģ׍pr[ՎAU &g0'"9NT׿(s!ora8nDY|% (p[v] = "d3", p), {}), name: "d3" } }; d3-zoom-1.6.0/src/000077500000000000000000000000001316474227200136055ustar00rootroot00000000000000d3-zoom-1.6.0/src/constant.js000066400000000000000000000001101316474227200157640ustar00rootroot00000000000000export default function(x) { return function() { return x; }; } d3-zoom-1.6.0/src/event.js000066400000000000000000000002111316474227200152560ustar00rootroot00000000000000export default function ZoomEvent(target, type, transform) { this.target = target; this.type = type; this.transform = transform; } d3-zoom-1.6.0/src/noevent.js000066400000000000000000000003121316474227200156150ustar00rootroot00000000000000import {event} from "d3-selection"; export function nopropagation() { event.stopImmediatePropagation(); } export default function() { event.preventDefault(); event.stopImmediatePropagation(); } d3-zoom-1.6.0/src/transform.js000066400000000000000000000024701316474227200161610ustar00rootroot00000000000000export function Transform(k, x, y) { this.k = k; this.x = x; this.y = y; } Transform.prototype = { constructor: Transform, scale: function(k) { return k === 1 ? this : new Transform(this.k * k, this.x, this.y); }, translate: function(x, y) { return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); }, apply: function(point) { return [point[0] * this.k + this.x, point[1] * this.k + this.y]; }, applyX: function(x) { return x * this.k + this.x; }, applyY: function(y) { return y * this.k + this.y; }, invert: function(location) { return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; }, invertX: function(x) { return (x - this.x) / this.k; }, invertY: function(y) { return (y - this.y) / this.k; }, rescaleX: function(x) { return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); }, rescaleY: function(y) { return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); }, toString: function() { return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; } }; export var identity = new Transform(1, 0, 0); transform.prototype = Transform.prototype; export default function transform(node) { return node.__zoom || identity; } d3-zoom-1.6.0/src/zoom.js000066400000000000000000000323551316474227200151370ustar00rootroot00000000000000import {dispatch} from "d3-dispatch"; import {dragDisable, dragEnable} from "d3-drag"; import {interpolateZoom} from "d3-interpolate"; import {event, customEvent, select, mouse, touch} from "d3-selection"; import {interrupt} from "d3-transition"; import constant from "./constant"; import ZoomEvent from "./event"; import {Transform, identity} from "./transform"; import noevent, {nopropagation} from "./noevent"; // Ignore right-click, since that should open the context menu. function defaultFilter() { return !event.button; } function defaultExtent() { var e = this, w, h; if (e instanceof SVGElement) { e = e.ownerSVGElement || e; w = e.width.baseVal.value; h = e.height.baseVal.value; } else { w = e.clientWidth; h = e.clientHeight; } return [[0, 0], [w, h]]; } function defaultTransform() { return this.__zoom || identity; } function defaultWheelDelta() { return -event.deltaY * (event.deltaMode ? 120 : 1) / 500; } function defaultTouchable() { return "ontouchstart" in this; } export default function() { var filter = defaultFilter, extent = defaultExtent, wheelDelta = defaultWheelDelta, touchable = defaultTouchable, k0 = 0, k1 = Infinity, x0 = -k1, x1 = k1, y0 = x0, y1 = x1, duration = 250, interpolate = interpolateZoom, gestures = [], listeners = dispatch("start", "zoom", "end"), touchstarting, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0; function zoom(selection) { selection .property("__zoom", defaultTransform) .on("wheel.zoom", wheeled) .on("mousedown.zoom", mousedowned) .on("dblclick.zoom", dblclicked) .filter(touchable) .on("touchstart.zoom", touchstarted) .on("touchmove.zoom", touchmoved) .on("touchend.zoom touchcancel.zoom", touchended) .style("touch-action", "none") .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); } zoom.transform = function(collection, transform) { var selection = collection.selection ? collection.selection() : collection; selection.property("__zoom", defaultTransform); if (collection !== selection) { schedule(collection, transform); } else { selection.interrupt().each(function() { gesture(this, arguments) .start() .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) .end(); }); } }; zoom.scaleBy = function(selection, k) { zoom.scaleTo(selection, function() { var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; return k0 * k1; }); }; zoom.scaleTo = function(selection, k) { zoom.transform(selection, function() { var e = extent.apply(this, arguments), t0 = this.__zoom, p0 = centroid(e), p1 = t0.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k; return constrain(translate(scale(t0, k1), p0, p1), e); }); }; zoom.translateBy = function(selection, x, y) { zoom.transform(selection, function() { return constrain(this.__zoom.translate( typeof x === "function" ? x.apply(this, arguments) : x, typeof y === "function" ? y.apply(this, arguments) : y ), extent.apply(this, arguments)); }); }; zoom.translateTo = function(selection, x, y) { zoom.transform(selection, function() { var e = extent.apply(this, arguments), t = this.__zoom, p = centroid(e); return constrain(identity.translate(p[0], p[1]).scale(t.k).translate( typeof x === "function" ? -x.apply(this, arguments) : -x, typeof y === "function" ? -y.apply(this, arguments) : -y ), e); }); }; function scale(transform, k) { k = Math.max(k0, Math.min(k1, k)); return k === transform.k ? transform : new Transform(k, transform.x, transform.y); } function translate(transform, p0, p1) { var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); } function constrain(transform, extent) { var dx0 = transform.invertX(extent[0][0]) - x0, dx1 = transform.invertX(extent[1][0]) - x1, dy0 = transform.invertY(extent[0][1]) - y0, dy1 = transform.invertY(extent[1][1]) - y1; return transform.translate( dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) ); } function centroid(extent) { return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; } function schedule(transition, transform, center) { transition .on("start.zoom", function() { gesture(this, arguments).start(); }) .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); }) .tween("zoom", function() { var that = this, args = arguments, g = gesture(that, args), e = extent.apply(that, args), p = center || centroid(e), w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = that.__zoom, b = typeof transform === "function" ? transform.apply(that, args) : transform, i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); return function(t) { if (t === 1) t = b; // Avoid rounding error on end. else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } g.zoom(null, t); }; }); } function gesture(that, args) { for (var i = 0, n = gestures.length, g; i < n; ++i) { if ((g = gestures[i]).that === that) { return g; } } return new Gesture(that, args); } function Gesture(that, args) { this.that = that; this.args = args; this.index = -1; this.active = 0; this.extent = extent.apply(that, args); } Gesture.prototype = { start: function() { if (++this.active === 1) { this.index = gestures.push(this) - 1; this.emit("start"); } return this; }, zoom: function(key, transform) { if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); this.that.__zoom = transform; this.emit("zoom"); return this; }, end: function() { if (--this.active === 0) { gestures.splice(this.index, 1); this.index = -1; this.emit("end"); } return this; }, emit: function(type) { customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); } }; function wheeled() { if (!filter.apply(this, arguments)) return; var g = gesture(this, arguments), t = this.__zoom, k = Math.max(k0, Math.min(k1, t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = mouse(this); // If the mouse is in the same location as before, reuse it. // If there were recent wheel events, reset the wheel idle timeout. if (g.wheel) { if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { g.mouse[1] = t.invert(g.mouse[0] = p); } clearTimeout(g.wheel); } // If this wheel event won’t trigger a transform change, ignore it. else if (t.k === k) return; // Otherwise, capture the mouse point and location at the start. else { g.mouse = [p, t.invert(p)]; interrupt(this); g.start(); } noevent(); g.wheel = setTimeout(wheelidled, wheelDelay); g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent)); function wheelidled() { g.wheel = null; g.end(); } } function mousedowned() { if (touchending || !filter.apply(this, arguments)) return; var g = gesture(this, arguments), v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = mouse(this), x0 = event.clientX, y0 = event.clientY; dragDisable(event.view); nopropagation(); g.mouse = [p, this.__zoom.invert(p)]; interrupt(this); g.start(); function mousemoved() { noevent(); if (!g.moved) { var dx = event.clientX - x0, dy = event.clientY - y0; g.moved = dx * dx + dy * dy > clickDistance2; } g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent)); } function mouseupped() { v.on("mousemove.zoom mouseup.zoom", null); dragEnable(event.view, g.moved); noevent(); g.end(); } } function dblclicked() { if (!filter.apply(this, arguments)) return; var t0 = this.__zoom, p0 = mouse(this), p1 = t0.invert(p0), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments)); noevent(); if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0); else select(this).call(zoom.transform, t1); } function touchstarted() { if (!filter.apply(this, arguments)) return; var g = gesture(this, arguments), touches = event.changedTouches, started, n = touches.length, i, t, p; nopropagation(); for (i = 0; i < n; ++i) { t = touches[i], p = touch(this, touches, t.identifier); p = [p, this.__zoom.invert(p), t.identifier]; if (!g.touch0) g.touch0 = p, started = true; else if (!g.touch1) g.touch1 = p; } // If this is a dbltap, reroute to the (optional) dblclick.zoom handler. if (touchstarting) { touchstarting = clearTimeout(touchstarting); if (!g.touch1) { g.end(); p = select(this).on("dblclick.zoom"); if (p) p.apply(this, arguments); return; } } if (started) { touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); interrupt(this); g.start(); } } function touchmoved() { var g = gesture(this, arguments), touches = event.changedTouches, n = touches.length, i, t, p, l; noevent(); if (touchstarting) touchstarting = clearTimeout(touchstarting); for (i = 0; i < n; ++i) { t = touches[i], p = touch(this, touches, t.identifier); if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; } t = g.that.__zoom; if (g.touch1) { var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; t = scale(t, Math.sqrt(dp / dl)); p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; } else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; else return; g.zoom("touch", constrain(translate(t, p, l), g.extent)); } function touchended() { var g = gesture(this, arguments), touches = event.changedTouches, n = touches.length, i, t; nopropagation(); if (touchending) clearTimeout(touchending); touchending = setTimeout(function() { touchending = null; }, touchDelay); for (i = 0; i < n; ++i) { t = touches[i]; if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; } if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); else g.end(); } zoom.wheelDelta = function(_) { return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; }; zoom.filter = function(_) { return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; }; zoom.touchable = function(_) { return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; }; zoom.extent = function(_) { return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; }; zoom.scaleExtent = function(_) { return arguments.length ? (k0 = +_[0], k1 = +_[1], zoom) : [k0, k1]; }; zoom.translateExtent = function(_) { return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], zoom) : [[x0, y0], [x1, y1]]; }; zoom.duration = function(_) { return arguments.length ? (duration = +_, zoom) : duration; }; zoom.interpolate = function(_) { return arguments.length ? (interpolate = _, zoom) : interpolate; }; zoom.on = function() { var value = listeners.on.apply(listeners, arguments); return value === listeners ? zoom : value; }; zoom.clickDistance = function(_) { return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); }; return zoom; } d3-zoom-1.6.0/test/000077500000000000000000000000001316474227200137755ustar00rootroot00000000000000d3-zoom-1.6.0/test/transform-test.js000066400000000000000000000043341316474227200173270ustar00rootroot00000000000000var tape = require("tape"), d3 = require("../"), identity = d3.zoomIdentity; tape("d3.zoomIdentity transform contains k = 1, x = y = 0", function(test) { test.deepEqual(toObject(identity), {k: 1, x: 0, y: 0}); test.end(); }); tape("transform.scale(k) returns a new transform scaled with k", function(test) { var transform = identity.scale(2.5); test.deepEqual(toObject(transform.scale(2)), {k: 5, x: 0, y: 0}); test.end(); }); tape("transform.translate(x, y) returns a new transform translated with x and y", function(test) { var transform = identity.translate(2, 3); test.deepEqual(toObject(transform.translate(-4, 4)), {k: 1, x: -2, y: 7}); test.deepEqual(toObject(transform.scale(2).translate(-4, 4)), {k: 2, x: -6, y: 11}); test.end(); }); tape("transform.apply([x, y]) returns the transformation of the specified point", function(test) { test.deepEqual(identity.translate(2, 3).scale(2).apply([4, 5]), [10, 13]); test.end(); }); tape("transform.applyX(x) returns the transformation of the specified x-coordinate", function(test) { test.deepEqual(identity.translate(2, 0).scale(2).applyX(4), 10); test.end(); }); tape("transform.applyY(y) returns the transformation of the specified y-coordinate", function(test) { test.deepEqual(identity.translate(0, 3).scale(2).applyY(5), 13); test.end(); }); tape("transform.invert([x, y]) returns the inverse transformation of the specified point", function(test) { test.deepEqual(identity.translate(2, 3).scale(2).invert([4, 5]), [1, 1]); test.end(); }); tape("transform.invertX(x) returns the inverse transformation of the specified x-coordinate", function(test) { test.deepEqual(identity.translate(2, 0).scale(2).invertX(4), 1); test.end(); }); tape("transform.invertY(y) returns the inverse transformation of the specified y-coordinate", function(test) { test.deepEqual(identity.translate(0, 3).scale(2).invertY(5), 1); test.end(); }); // transform.rescaleX(x) // transform.rescaleY(y) tape("transform.toString() returns a string representing the SVG transform", function(test) { test.equal(d3.zoomIdentity.toString(), "translate(0,0) scale(1)"); test.end(); }); function toObject(transform) { return {k: transform.k, x: transform.x, y: transform.y}; }