From 2df6bca948b898b12db11df157e0229ca09b3dfb Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Wed, 8 Jul 2026 23:26:48 +0200 Subject: [PATCH 01/12] fix(gen): improve cast assert message for columns --- midas/generator/generator.py | 114 ++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 28 deletions(-) diff --git a/midas/generator/generator.py b/midas/generator/generator.py index 18885a4..08edda7 100644 --- a/midas/generator/generator.py +++ b/midas/generator/generator.py @@ -269,7 +269,9 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): alias: ast.expr = self._make_alias(expr.expr, expr2) type: Type = self._get_expr_type(expr) - asserts: list[ast.stmt] = self._make_cast_asserts(expr.location, alias, type) + asserts: list[ast.stmt] = self._make_cast_asserts( + expr.location, alias, type, context=[] + ) for assert_ in asserts: self._add_assert(assert_) @@ -526,7 +528,12 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): raise RuntimeError(f"Cannot get type judgement for {query}") def _make_cast_asserts( - self, src_location: Location, expr: ast.expr, type: Type + self, + src_location: Location, + expr: ast.expr, + type: Type, + *, + context: list[str], ) -> list[ast.stmt]: """Generate assertions for the given cast expression @@ -535,6 +542,7 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): the source file expr (ast.expr): the expression being cast type (Type): the target type + context (list[str]): the current context Returns: list[ast.stmt]: the generated assertion statements @@ -551,12 +559,16 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): args=[expr, ast.Name(id=name)], keywords=[], ), - self._make_cast_assert_message(src_location, expr, type), + self._make_cast_assert_message( + src_location, expr, type, context=context + ), ) ] case DerivedType(type=base): - return self._make_cast_asserts(src_location, expr, base) + return self._make_cast_asserts( + src_location, expr, base, context=context + ) case UnitType(): return [ @@ -568,19 +580,25 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): ast.Constant(value=None), ], ), - self._make_cast_assert_message(src_location, expr, type), + self._make_cast_assert_message( + src_location, expr, type, context=context + ), ), ] case AppliedType(body=body): - return self._make_cast_asserts(src_location, expr, body) + return self._make_cast_asserts( + src_location, expr, body, context=context + ) case ConstraintType(type=base, constraint=constraint): asserts: list[ast.stmt] = self._make_cast_asserts( - src_location, expr, base + src_location, expr, base, context=context ) asserts.append( - self._make_constraint_assert(src_location, expr, constraint) + self._make_constraint_assert( + src_location, expr, constraint, context=context + ) ) return asserts @@ -588,7 +606,9 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): # TODO: check with type from arguments / use call-site context if bound is None: return [] - return self._make_cast_asserts(src_location, expr, bound) + return self._make_cast_asserts( + src_location, expr, bound, context=context + ) case TupleType(items=items): asserts: list[ast.stmt] = [ @@ -598,13 +618,17 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): args=[expr, ast.Name(id="tuple")], keywords=[], ), - self._make_cast_assert_message(src_location, expr, type), + self._make_cast_assert_message( + src_location, expr, type, context=context + ), ), ] assert isinstance(expr, ast.Tuple) for item, item_type in zip(expr.elts, items): asserts.extend( - self._make_cast_asserts(src_location, item, item_type) + self._make_cast_asserts( + src_location, item, item_type, context=context + ) ) return asserts @@ -618,7 +642,11 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): keywords=[], ), self._make_cast_assert_message( - src_location, expr, type, ": Not a dataframe" + src_location, + expr, + type, + context=context, + extra=": Not a dataframe", ), ), ] @@ -634,7 +662,8 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): src_location, expr, type, - f": Missing column {column.name}", + context=context, + extra=f": Missing column '{column.name}'", ), ) ) @@ -645,6 +674,7 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): value=expr, slice=ast.Constant(value=column.name) ), column.type, + context=context + [f"in column '{column.name}'"], ) ) return asserts @@ -659,12 +689,19 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): keywords=[], ), self._make_cast_assert_message( - src_location, expr, type, ": Not a column" + src_location, + expr, + type, + context=context, + extra=": Not a column", ), ), ] inner_assert: Optional[ast.stmt] = self._make_column_inner_assert( - src_location, expr, type + src_location, + expr, + type, + context, ) if inner_assert is not None: asserts.append(inner_assert) @@ -689,7 +726,9 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): location: Location, expr: ast.expr, type: Type, - extra: Optional[str] = None, + *, + context: list[str], + extra: str = "", ) -> ast.expr: """Build an AST node for a cast assertion message @@ -703,12 +742,14 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): source file expr (ast.expr): the expression being cast type (Type): the target type - extra (Optional[str], optional): extra text to append at the end of - the message. Defaults to None. + context (list[str]): the current context + extra (str, optional): extra text to append at the end of + the message. Defaults to "". Returns: ast.expr: the generated message (as an f-string) """ + context_str: str = "".join(map(lambda c: f", {c}", context)) loc_str: str = f"{self.rel_src_path}:L{location.lineno}:{location.col_offset+1}" # f"file.py:L1:1: CastError: Cannot cast {type(expr).__name__} to Type" return ast.JoinedStr( @@ -725,12 +766,17 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): ), conversion=-1, ), - ast.Constant(f" to {type}{extra or ''}"), + ast.Constant(f" to {type}{context_str}{extra}"), ] ) def _make_constraint_assert( - self, src_location: Location, expr: ast.expr, constraint: m.Expr + self, + src_location: Location, + expr: ast.expr, + constraint: m.Expr, + *, + context: list[str], ) -> ast.stmt: """Build an assertion for the given constraint on the given expression @@ -739,6 +785,7 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): source file expr (ast.expr): the expression subject to `constraint` constraint (m.Expr): the constraint applied on `expr` + context (list[str]): the current context Returns: ast.stmt: the assert statement checking the constraint @@ -750,11 +797,13 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): args=[expr], keywords=[], ), - self._make_constraint_assert_message(src_location, constraint), + self._make_constraint_assert_message( + src_location, constraint, context=context + ), ) def _make_constraint_assert_message( - self, location: Location, constraint: m.Expr + self, location: Location, constraint: m.Expr, *, context: list[str] ) -> ast.expr: """Build an assert message for the given constraint @@ -762,16 +811,18 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): location (Location): the location of the cast expression in the source file constraint (m.Expr): the constraint + context (list[str]): the current context Returns: ast.expr: the assert message """ printer = MidasPrinter() constraint_str: str = printer.print(constraint) + context_str: str = "".join(map(lambda c: f", {c}", context)) loc_str: str = f"{self.rel_src_path}:L{location.lineno}:{location.col_offset+1}" # f"file.py:L1:1: ConstraintError: Value does not fit constraint 'v > 0'" return ast.Constant( - f"{loc_str}: ConstraintError: Value does not fit constraint '{constraint_str}'" + f"{loc_str}: ConstraintError: Value does not fit constraint '{constraint_str}'{context_str}" ) def _get_constraint(self, expr: m.Expr) -> ast.expr: @@ -880,7 +931,11 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): ) def _make_column_inner_assert( - self, src_location: Location, column: ast.expr, type: ColumnType + self, + src_location: Location, + column: ast.expr, + type: ColumnType, + context: list[str], ) -> Optional[ast.stmt]: """Build a for-loop checking the type of values inside a column @@ -889,18 +944,21 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): source file column (ast.expr): the column being cast type (ColumnType): the type of the column + context (list[str]): the current context Returns: Optional[ast.stmt]: a for-loop checking the values, or `None` if no assertions are necessary """ - # TODO: improve message, maybe chain contexts - col: ast.expr = ast.Name(id="col") - body: list[ast.stmt] = self._make_cast_asserts(src_location, col, type.type) + + value: ast.expr = ast.Name(id="value") + body: list[ast.stmt] = self._make_cast_asserts( + src_location, value, type.type, context=context + ) if len(body) == 0: return None return ast.For( - target=col, + target=value, iter=column, body=body, orelse=[], From 653612ee87c5679105fd41f425ed247d7f1451f2 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 00:02:25 +0200 Subject: [PATCH 02/12] feat(checker): add variance manager to improve recursive types --- midas/checker/midas.py | 8 ++-- midas/checker/variance.py | 79 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 9 deletions(-) diff --git a/midas/checker/midas.py b/midas/checker/midas.py index 02eb547..cfa881d 100644 --- a/midas/checker/midas.py +++ b/midas/checker/midas.py @@ -24,7 +24,7 @@ from midas.checker.types import ( TypeVar, UnknownType, ) -from midas.checker.variance import VarianceInferrer +from midas.checker.variance import VarianceManager from midas.lexer.midas import MidasLexer from midas.lexer.token import Token, TokenType from midas.parser.midas import MidasParser @@ -147,10 +147,8 @@ class MidasTyper(m.Stmt.Visitor[None], m.Expr.Visitor[Type], m.Type.Visitor[Type for stmt in stmts: stmt.accept(self) - for name, type in self.types._types.items(): - if isinstance(type, GenericType): - inferrer = VarianceInferrer(self.types) - self.types._types[name] = inferrer.infer(type) + manager: VarianceManager = VarianceManager(self.types) + manager.infer_all() def assert_bool(self, expr: m.Expr): """Check that the given expression is a subtype of `bool` or report an error diff --git a/midas/checker/variance.py b/midas/checker/variance.py index bcbdc2b..5a7bfc6 100644 --- a/midas/checker/variance.py +++ b/midas/checker/variance.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Literal, Optional, cast from midas.checker.registry import Member, TypesRegistry @@ -73,10 +75,14 @@ class Tracker: class VarianceInferrer: """Helper class to compute type parameter variance""" - def __init__(self, types: TypesRegistry) -> None: - self.types: TypesRegistry = types + def __init__(self, manager: VarianceManager) -> None: + self.manager: VarianceManager = manager self.tracker: Tracker = Tracker([]) + @property + def types(self) -> TypesRegistry: + return self.manager.types + def infer(self, type: GenericType) -> GenericType: """Infer the variance of a generic type's parameters @@ -150,11 +156,13 @@ class VarianceInferrer: # Get inferred variance of parameters and multiply with current # polarity to recurse through arguments case AppliedType(name=name, args=args): - # TODO: handle mutually recursive types - if name == base_name: + if self.manager.is_in_queue(name): return + generic: Type = self.types.get_type(name) assert isinstance(generic, GenericType) + generic = self.manager.infer(name, generic) + params: list[TypeVar] = generic.params polarities: dict[Variance, Polarity] = { Variance.INVARIANT: 0, @@ -179,3 +187,66 @@ class VarianceInferrer: case TypeVar(): if type in self.tracker: self.tracker.record(type, polarity) + + +class VarianceManager: + """Coordinator for VarianceInferrer to handle recursive types""" + + def __init__(self, types: TypesRegistry) -> None: + self.types: TypesRegistry = types + self._queue: list[str] = [] + self._inferred: set[str] = set() + + def infer_all(self): + """Infer variance on all generic types defined in the registry""" + + for name, type in self.types._types.items(): + if isinstance(type, GenericType): + self.infer(name, type) + + def infer(self, name: str, type: GenericType) -> GenericType: + """Infer variance of parameters of the given type + + Args: + name (str): the type's name + type (GenericType): the type + + Returns: + GenericType: a new generic type with its parameters updated with + their inferred variance + """ + if self.is_inferred(name): + return type + + self._queue.append(name) + + inferrer: VarianceInferrer = VarianceInferrer(self) + inferred: GenericType = inferrer.infer(type) + self.types._types[name] = inferred + + self._queue.pop() + self._inferred.add(name) + + return inferred + + def is_in_queue(self, name: str) -> bool: + """Whether the given type's variance is currently being inferred + + Args: + name (str): the type's name + + Returns: + bool: whether the type is in the queue + """ + return name in self._queue + + def is_inferred(self, name: str) -> bool: + """Whether the given type's variance has already been inferred + + Args: + name (str): the type's name + + Returns: + bool: whether the type has been processed + """ + return name in self._inferred From aaa6d945d107234283a144f2d752888ff02604fa Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 00:25:23 +0200 Subject: [PATCH 03/12] fix: tidy some TODOs --- midas/checker/frames/frame_manager.py | 2 +- midas/checker/python.py | 12 +++++------- midas/checker/registry.py | 1 - midas/generator/generator.py | 1 - midas/generator/stubs.py | 6 ++++-- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/midas/checker/frames/frame_manager.py b/midas/checker/frames/frame_manager.py index 74db171..72146b3 100644 --- a/midas/checker/frames/frame_manager.py +++ b/midas/checker/frames/frame_manager.py @@ -232,7 +232,7 @@ class FrameManager: if col.name == name: index = i replace = True - # TODO: check column type here to prevent changing it + # TODO: might want to check column type here to disallow changing it new_columns.append(col) new_col: DataFrameType.Column = DataFrameType.Column( diff --git a/midas/checker/python.py b/midas/checker/python.py index ef8e688..cb67492 100644 --- a/midas/checker/python.py +++ b/midas/checker/python.py @@ -454,7 +454,6 @@ class PythonTyper( self.env.define(stmt.name, function) def visit_type_assign(self, stmt: p.TypeAssign) -> None: - # TODO check not yet defined locally type: Type = self.resolve_type_expr(stmt.type) self.env.define(stmt.name, type) @@ -844,7 +843,7 @@ class PythonTyper( def visit_ternary_expr(self, expr: p.TernaryExpr) -> Type: test_type: Type = self.type_of(expr.test) - # TODO Allow subtypes or any type + # Strict: test must be a subtype of bool, or UnknownType if ( not self.is_subtype(test_type, self.types.get_type("bool")) and test_type != UnknownType() @@ -1154,8 +1153,9 @@ class PythonTyper( return False, None if key is None: - # TODO: check that value is always a dict - assert isinstance(value_val, dict) + # If literal value is not a dict, invalid Python -> abort + if not isinstance(value_val, dict): + return False, None pairs.extend(value_val.items()) else: pairs.append((key_val, value_val)) @@ -1281,9 +1281,7 @@ class PythonTyper( case BaseType(): # TODO: do we want to allow cast(float, int)? would require runtime conversion - if not self.types.is_subtype( - subject_type, target_type - ) or not self.types.is_subtype(target_type, subject_type): + if not self.types.are_equivalent(subject_type, target_type): self.reporter.error( expr.location, f"Value {lit_value!r} of type {subject_type} cannot be cast as {target_type}", diff --git a/midas/checker/registry.py b/midas/checker/registry.py index 0c97074..3ce265e 100644 --- a/midas/checker/registry.py +++ b/midas/checker/registry.py @@ -213,7 +213,6 @@ class TypesRegistry: return True case (ColumnType(type=inner1), ColumnType(type=inner2)): - # TODO: invariant, replace ColumnType with simple GenericType if not self.are_equivalent(inner1, inner2): return False return True diff --git a/midas/generator/generator.py b/midas/generator/generator.py index 08edda7..3cf2423 100644 --- a/midas/generator/generator.py +++ b/midas/generator/generator.py @@ -354,7 +354,6 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): ) def visit_type_assign(self, stmt: p.TypeAssign) -> ast.stmt: - # TODO: is that ok? return ast.Pass() def visit_assign_stmt(self, stmt: p.AssignStmt) -> ast.stmt: diff --git a/midas/generator/stubs.py b/midas/generator/stubs.py index b228916..1875f93 100644 --- a/midas/generator/stubs.py +++ b/midas/generator/stubs.py @@ -53,7 +53,7 @@ class StubsGenerator: self.import_pandas = False for name, type in self.types._types.items(): # Skip builtin types, not just based on name so the user can override - # TODO: check if added members on builtin type + # TODO: check if added members on builtin type, or prevent it match type: case BaseType(name=name_) if name == name_: continue @@ -105,7 +105,9 @@ class StubsGenerator: """ base_type: Type = type - # TODO: improve + # Generate simple assignment for type aliases + # A type alias will have a name that is different from the type represents + # or will neither be a `DeriveType` nor a `GenericType` match type: case DerivedType(name=name_) | GenericType(name=name_) if name_ == name: pass From 99350a9505f069591b86c75788cbaa7a6788ad56 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 12:32:27 +0200 Subject: [PATCH 04/12] docs: add description of function subtyping --- docs/function_subtyping.typ | 97 +++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 docs/function_subtyping.typ diff --git a/docs/function_subtyping.typ b/docs/function_subtyping.typ new file mode 100644 index 0000000..d6dc029 --- /dev/null +++ b/docs/function_subtyping.typ @@ -0,0 +1,97 @@ +#import "@preview/curryst:0.6.0": prooftree, rule, rule-set +#import "@preview/gentle-clues:1.3.1" as gc +#import "@preview/lovelace:0.3.1": pseudocode-list + +#set text(font: "Source Sans 3") +#show link: set text(fill: blue) +#set document( + title: [Function subtyping rule], +) + +#let req = math.op("req") + +#align(center, title()) + + +This document formalizes the logic used when checking whether a function is a subtype of another. + += Definitions + +A *Parameter specification* has a list of positional-only parameters $P$, mixed parameters $M$ and keyword-only parameters $K$: +$ S = (P, M, K) $ + +A *Parameter* has an index $i$, a name $n$ and a required flag $r$: +$ p = (i, n, r) $ + +A *Function* has a param spec $S$ and a return type $R$: +$ F = (S, R) $ + += Main rules + +We want to define a rule for checking structural subtyping of functions, i.e. to check when $F_1 <: F_2$ + +There are two conditions to check: +#align(center, prooftree( + rule( + $Gamma tack S_2 <: S_1$, + $Gamma tack R_1 <: R_2$, + $Gamma tack F_1 <: F_2$, + ), +)) + +The second condition is trivial to check. +The first condition is a bit more tricky. + +For a parameter specification $S_2$ to be a subtype of another $S_1$, the latter needs to be fully compatible with any usages of the former. What this means is that #link()[(1)] any argument that can be passed to $S_2$ must be accepted by $S_1$, and #link()[(2)] $S_1$ must not have additional required arguments that are not in $S_2$. However, $S_1$ can have additional optional parameters not present in $S_2$. + +After mapping parameters of $S_1$ and $S_2$, types must be checked such that if a parameter $p_i: T in S_1$ is mapped to a parameter $q_j: U in S_2$, $U <: T$. + += Detailed rules for *ParamSpec* subtyping + +#gc.info(title: [Notation])[ + In the following equations: + - the notation $S in.rev a^i: T$ will be used to denote that a parameter spec $S$ accepts an argument named $a$ at index $i$ of type $T$ + - the special name $alpha$ will be used to denote any argument without a specific name + - the special name $phi$ will be used to denote any parameter without a specific name + - $AA$ denotes the group of all arguments, i.e. $alpha in AA$ + - $PP$ denotes the group of all parameters, i.e. $p in PP$ + - $req(S, alpha)$ is a predicate checking whether $alpha$ is required in $S$ +] + +== Arguments of $S_2$ are compatible with $S_1$ + +Formally, the condition is: +$ + forall alpha in AA, S_2 in.rev alpha => S_1 in.rev alpha +$ + +Let $S_1 = (P_1, M_1, K_1)$ and $S_2 = (P_2, M_2, K_2)$. + +For each positional-only parameter $phi_i in P_2$, $phi_i in P_1 or phi_i in M_1$. A positional-only parameter of $S_2$ can either be positional-only or mixed in $S_1$. Additionally, $not req(S_2, phi_i) => not req(S_1, phi_i)$. If $phi_i$ is optional in $S_2$, it must also be optional in $S_1$ so that a call omitting it is valid. + +Similarly, for each keyword-only parameter $p in K_2$, $p in K_1 or p in M_1$. A keyword-only parameter of $S_2$ can either be keyword-only or mixed in $S_1$. Additionally, $not req(S_2, p) => not req(S_1, p)$. If $p$ is optional in $S_2$, it must also be optional in $S_1$ so that a call omitting it is valid. + +Finally, for mixed parameters, the rule is slightly more complex. Either there is a corresponding mixed parameter in $S_1$, or the parameter is covered by both a positional/mixed and a keyword/mixed parameter. In the second case, we must keep in mind that only one of the match will made at runtime, or maybe even none if the parameter is optional in $S_2$, meaning the parameters in $S_1$ _must_ be optional. + +We can thus split the rule in two. $forall p_i in M_2$: +$ + cases( + p_i in M_1 and not req(S_2, p_i) => not req(S_1, p_i), + "or", + underbrace((phi_i in P_1 or phi_i in M_1), "Positional") and + underbrace((p in K_1 or p in M_1), "Keyword") and + underbrace((not req(S_1, phi_i) and not req(S_1, p)), "Optional") + ) +$ + +== No additional required arguments in $S_1$ + +Formally, the condition is: +$ + forall alpha in AA, S_1 in.rev alpha and req(S_1, alpha) => S_2 in.rev alpha and req(S_2, alpha) +$ + +Each parameter in $S_1$ that is not matched by a parameter in $S_2$ must be optional: +$ + forall p_i in S_1, p_i in.not S_2 => not req(S_1, p_i) +$ From f314a95e87c9b41488f9a02b3ebeef155ef9d459 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 12:32:51 +0200 Subject: [PATCH 05/12] fix(checker): fix function subtyping logic --- midas/checker/registry.py | 186 +++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 73 deletions(-) diff --git a/midas/checker/registry.py b/midas/checker/registry.py index 3ce265e..d85456e 100644 --- a/midas/checker/registry.py +++ b/midas/checker/registry.py @@ -1,6 +1,6 @@ import logging from dataclasses import dataclass -from typing import Optional +from typing import Optional, TypeAlias from midas.ast.midas import MemberKind from midas.checker.builtins import BUILTIN_SUBTYPES @@ -24,6 +24,8 @@ from midas.checker.types import ( substitute_typevars, ) +Match: TypeAlias = tuple[Function.Parameter, Function.Parameter] + @dataclass class Member: @@ -259,7 +261,6 @@ class TypesRegistry: """ return self.is_subtype(type1, type2) and self.is_subtype(type2, type1) - # TODO: verify the logic in here def is_func_subtype(self, func1: Function, func2: Function) -> bool: """Check whether a function is a subtype of another @@ -270,14 +271,24 @@ class TypesRegistry: Returns: bool: whether `func1` is a subtype of `func2` """ + + # Let func1 = (S1, R1) where S1 = (P1, M1, K1) + # Let func2 = (S2, R2) where S2 = (P2, M2, K2) + # We want to check that func1 <: func2 + # i.e. R1 <: R2 and S2 <: S1 + + # R1 <: R2 if not self.is_subtype(func1.returns, func2.returns): return False + # Extract P1, M1, K1 pos1: list[Function.Parameter] = func1.params.pos mixed1: list[Function.Parameter] = func1.params.mixed kw1: dict[str, Function.Parameter] = { param.name: param for param in func1.params.kw } + + # Extract P2, M2, K2 pos2: list[Function.Parameter] = func2.params.pos mixed2: list[Function.Parameter] = func2.params.mixed kw2: dict[str, Function.Parameter] = { @@ -285,89 +296,118 @@ class TypesRegistry: } mixed_by_pos: dict[int, Function.Parameter] = { - param.pos: param for param in mixed2 + param.pos: param for param in mixed1 } mixed_by_name: dict[str, Function.Parameter] = { - param.name: param for param in mixed2 + param.name: param for param in mixed1 } - def is_arg_subtype(sub: Function.Parameter, sup: Function.Parameter) -> bool: - if not self.is_subtype(sub.type, sup.type): - return False - if not sup.required and sub.required: - return False - return True + matches: list[Match] = [] - for param1 in pos1: - param2: Function.Parameter - if param1.pos < len(pos2): - param2 = pos2[param1.pos] - elif param1.pos in mixed_by_pos: - param2 = mixed_by_pos[param1.pos] - elif not param1.required: - continue - else: - return False - if not is_arg_subtype(param2, param1): - return False - - for name, param1 in kw1.items(): - param2: Function.Parameter - if name in kw2: - param2 = kw2[name] - elif name in mixed_by_name: - param2 = mixed_by_name[name] - elif not param1.required: - continue - else: - return False - if not is_arg_subtype(param2, param1): - return False - - for param1 in mixed1: - pos_param2: Optional[Function.Parameter] = None - kw_param2: Optional[Function.Parameter] = None - if param1.name in kw2: - kw_param2 = kw2[param1.name] - elif param1.name in mixed_by_name: - kw_param2 = mixed_by_name[param1.name] - if param1.pos < len(pos2): - pos_param2 = pos2[param1.pos] - elif param1.pos in mixed_by_pos: - pos_param2 = mixed_by_pos[param1.pos] - - # No match in func2 and arg is required - if pos_param2 is None and kw_param2 is None and param1.required: - return False - - # Matching keyword argument - if kw_param2 is not None and not is_arg_subtype(kw_param2, param1): - return False - - # Matching positional argument - if pos_param2 is not None and not is_arg_subtype(pos_param2, param1): - return False - - mixed_positions: set[int] = {param.pos for param in mixed1} - mixed_names: set[str] = {param.name for param in mixed1} + # Each parameter at position i in P2 must be valid at position i in S1 + # either as a positional-only parameter in P1 + # or a mixed parameter in M1 for param2 in pos2: - if not param2.required: - continue - if param2.pos >= len(pos1) and param2.pos not in mixed_positions: + param1: Function.Parameter + + # In P1 + if param2.pos < len(pos1): + param1 = pos1[param2.pos] + + # In M1 + elif param2.pos in mixed_by_pos: + param1 = mixed_by_pos[param2.pos] + + else: return False + # not req(p2) => not req(p1) + if not param2.required and param1.required: + return False + matches.append((param1, param2)) + + # Each parameter named p in K2 must be valid with name p in S1 + # either as a keyword-only parameter in K1 + # or a mixed parameter in M1 for name, param2 in kw2.items(): - if not param2.required: - continue - if name not in kw1 and name not in mixed_names: + param1: Function.Parameter + + # In K1 + if name in kw1: + param1 = kw1[name] + + # in M1 + elif name in mixed_by_name: + param1 = mixed_by_name[name] + else: return False + # not req(p2) => not req(p1) + if not param2.required and param1.required: + return False + matches.append((param1, param2)) + + # Each parameter named p at position i in M2 must be valid with name p + # in S1 *and* at position i in S1 + # either as a single mixed parameter in M1 + # or split into a positional parameter in P1/M1 + # and a keyword parameter in K1/M1 for param2 in mixed2: - if param2.required: - continue - pos_match: bool = param2.pos < len(pos1) or param2.pos in mixed_positions - kw_match: bool = param2.name in kw1 or param2.name in mixed_names - if not pos_match or not kw_match: + pos_param1: Optional[Function.Parameter] = None + kw_param1: Optional[Function.Parameter] = None + + # By name in K1 + if param2.name in kw1: + kw_param1 = kw1[param2.name] + + # By name in M1 + elif param2.name in mixed_by_name: + kw_param1 = mixed_by_name[param2.name] + + # By pos in P1 + if param2.pos < len(pos1): + pos_param1 = pos1[param2.pos] + + # By pos in M1 + elif param2.pos in mixed_by_pos: + pos_param1 = mixed_by_pos[param2.pos] + + # Not fully covered + if pos_param1 is None or kw_param1 is None: + return False + + # Covered by unique mixed parameter in M1 + if pos_param1 == kw_param1: + param1: Function.Parameter = pos_param1 + # not req(p2) => not req(p1) + if not param2.required and param1.required: + return False + + matches.append((param1, param2)) + + else: + # not req(p1) + if pos_param1.required or kw_param1.required: + return False + + matches.append((pos_param1, param2)) + matches.append((kw_param1, param2)) + + def is_matched(param: Function.Parameter) -> bool: + for p1, _ in matches: + if p1 == param: + return True + return False + + all_params1: list[Function.Parameter] = pos1 + mixed1 + list(kw1.values()) + + for param1 in all_params1: + # No new required parameters + if not is_matched(param1) and param1.required: + return False + + for param1, param2 in matches: + if not self.is_subtype(param2.type, param1.type): return False return True From 4d343a61ff4b66cffe145e596b533a920f62b129 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 14:15:36 +0200 Subject: [PATCH 06/12] feat!: remove Python constraint type this feature was only partially implemented (parsing) and the syntax was not ideal so this commit removes it entirely --- gen/python.py | 5 -- midas/ast/printer/python_ast.py | 8 --- midas/ast/python.py | 12 ---- midas/checker/python.py | 4 -- midas/checker/types.py | 4 +- midas/cli/highlighter.py | 4 -- midas/cli/hl_python.css | 4 -- midas/parser/python.py | 25 -------- tests/cases/checker/01_simple_types.py | 2 +- .../cases/checker/01_simple_types.py.ref.json | 14 ---- tests/cases/python-parser/01_simple_types.py | 2 +- .../python-parser/01_simple_types.py.ref.json | 10 +-- tests/cases/python-parser/02_custom_types.py | 8 +-- .../python-parser/02_custom_types.py.ref.json | 55 ++-------------- tests/cases/python-parser/03_functions.py | 9 ++- .../python-parser/03_functions.py.ref.json | 64 +++---------------- tests/serializer/python.py | 8 --- 17 files changed, 29 insertions(+), 209 deletions(-) diff --git a/gen/python.py b/gen/python.py index 6a3b1eb..6ab9a6c 100644 --- a/gen/python.py +++ b/gen/python.py @@ -44,11 +44,6 @@ class BaseType: args: tuple[MidasType, ...] -class ConstraintType: - type: MidasType - constraint: ast.expr - - class FrameColumn: name: Optional[str] type: Optional[MidasType] diff --git a/midas/ast/printer/python_ast.py b/midas/ast/printer/python_ast.py index b51c8f9..d2214e0 100644 --- a/midas/ast/printer/python_ast.py +++ b/midas/ast/printer/python_ast.py @@ -18,14 +18,6 @@ class PythonAstPrinter( self._write_line(f"base: {node.base}") self._write_sequence("args", node.args, last=True) - def visit_constraint_type(self, node: p.ConstraintType) -> None: - self._write_line("ConstraintType") - with self._child_level(): - self._write_line("type") - with self._child_level(single=True): - node.type.accept(self) - self._write_line(f"constraint: {ast.unparse(node.constraint)}", last=True) - def visit_frame_column(self, node: p.FrameColumn) -> None: self._write_line("FrameColumn") with self._child_level(): diff --git a/midas/ast/python.py b/midas/ast/python.py index 9b48552..cd28193 100644 --- a/midas/ast/python.py +++ b/midas/ast/python.py @@ -52,9 +52,6 @@ class MidasType(ABC): @abstractmethod def visit_base_type(self, node: BaseType) -> T: ... - @abstractmethod - def visit_constraint_type(self, node: ConstraintType) -> T: ... - @abstractmethod def visit_frame_column(self, node: FrameColumn) -> T: ... @@ -71,15 +68,6 @@ class BaseType(MidasType): return visitor.visit_base_type(self) -@dataclass(frozen=True) -class ConstraintType(MidasType): - type: MidasType - constraint: ast.expr - - def accept(self, visitor: MidasType.Visitor[T]) -> T: - return visitor.visit_constraint_type(self) - - @dataclass(frozen=True) class FrameColumn(MidasType): name: Optional[str] diff --git a/midas/checker/python.py b/midas/checker/python.py index cb67492..0eb751f 100644 --- a/midas/checker/python.py +++ b/midas/checker/python.py @@ -985,10 +985,6 @@ class PythonTyper( return self.types.apply_generic(base, args) return base - def visit_constraint_type(self, node: p.ConstraintType) -> Type: - self.reporter.warning(node.location, "ConstraintType not yet supported") - return UnknownType() - def visit_frame_column(self, node: p.FrameColumn) -> ColumnType: return ColumnType( type=( diff --git a/midas/checker/types.py b/midas/checker/types.py index ae56374..2becf9b 100644 --- a/midas/checker/types.py +++ b/midas/checker/types.py @@ -437,8 +437,8 @@ def to_annotation(type: Type) -> str: case AppliedType(name=name, args=args): return f"{name}[{', '.join(map(to_annotation, args))}]" - case ConstraintType(): - return str(type) + case ConstraintType(type=base): + return to_annotation(base) case TupleType(items=items): return f"Tuple[{', '.join(map(to_annotation, items))}]" diff --git a/midas/cli/highlighter.py b/midas/cli/highlighter.py index 2db4637..4929b0c 100644 --- a/midas/cli/highlighter.py +++ b/midas/cli/highlighter.py @@ -138,10 +138,6 @@ class PythonHighlighter( self.wrap(arg, "arg") arg.accept(self) - def visit_constraint_type(self, node: p.ConstraintType) -> None: - self.wrap(node, "constraint-type") - node.type.accept(self) - def visit_frame_column(self, node: p.FrameColumn) -> None: self.wrap(node, "frame-column") if node.type is not None: diff --git a/midas/cli/hl_python.css b/midas/cli/hl_python.css index b0b29d0..4df89b5 100644 --- a/midas/cli/hl_python.css +++ b/midas/cli/hl_python.css @@ -7,10 +7,6 @@ span { --col: 103, 192, 224; } - &.constraint-type { - --col: 174, 200, 195; - } - &.frame-column { --col: 216, 231, 81; } diff --git a/midas/parser/python.py b/midas/parser/python.py index b18bb62..f2ba14a 100644 --- a/midas/parser/python.py +++ b/midas/parser/python.py @@ -9,7 +9,6 @@ from midas.ast.python import ( CallExpr, CastExpr, CompareExpr, - ConstraintType, DictExpr, Expr, ExpressionStmt, @@ -337,30 +336,6 @@ class PythonParser: args=(), ) - case ast.BinOp(left=left_expr, op=ast.Add(), right=right_expr): - left = self._parse_type(left_expr) - match left: - # If chained constraints, separate base type and rebuild constraint - case ConstraintType(type=left_type, constraint=left_constraint): - constraint = ast.BinOp( - left=left_constraint, - op=ast.Add(), - right=right_expr, - ) - ast.copy_location(constraint, type_expr) - return ConstraintType( - location=loc, - type=left_type, - constraint=constraint, - ) - - case _: - return ConstraintType( - location=loc, - type=left, - constraint=right_expr, - ) - case ast.Constant(value=None): return BaseType( location=loc, diff --git a/tests/cases/checker/01_simple_types.py b/tests/cases/checker/01_simple_types.py index 3566f9a..cc4fa9e 100644 --- a/tests/cases/checker/01_simple_types.py +++ b/tests/cases/checker/01_simple_types.py @@ -5,7 +5,7 @@ from __future__ import annotations df: Frame[ verified: bool, birth_year: int, - height: float + ( _ > 0 ) + ( _ < 250 ), + height: float, name: str, date: datetime, float, diff --git a/tests/cases/checker/01_simple_types.py.ref.json b/tests/cases/checker/01_simple_types.py.ref.json index 8767cf3..8d0dbb4 100644 --- a/tests/cases/checker/01_simple_types.py.ref.json +++ b/tests/cases/checker/01_simple_types.py.ref.json @@ -1,19 +1,5 @@ { "diagnostics": [ - { - "type": "Warning", - "location": { - "start": [ - 8, - 12 - ], - "end": [ - 8, - 43 - ] - }, - "message": "ConstraintType not yet supported" - }, { "type": "Warning", "location": { diff --git a/tests/cases/python-parser/01_simple_types.py b/tests/cases/python-parser/01_simple_types.py index 3566f9a..cc4fa9e 100644 --- a/tests/cases/python-parser/01_simple_types.py +++ b/tests/cases/python-parser/01_simple_types.py @@ -5,7 +5,7 @@ from __future__ import annotations df: Frame[ verified: bool, birth_year: int, - height: float + ( _ > 0 ) + ( _ < 250 ), + height: float, name: str, date: datetime, float, diff --git a/tests/cases/python-parser/01_simple_types.py.ref.json b/tests/cases/python-parser/01_simple_types.py.ref.json index 1dbaa9e..6e70f5a 100644 --- a/tests/cases/python-parser/01_simple_types.py.ref.json +++ b/tests/cases/python-parser/01_simple_types.py.ref.json @@ -40,13 +40,9 @@ "_type": "FrameColumn", "name": "height", "type": { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "float", - "args": [] - }, - "constraint": "(_ > 0) + (_ < 250)" + "_type": "BaseType", + "base": "float", + "args": [] } }, { diff --git a/tests/cases/python-parser/02_custom_types.py b/tests/cases/python-parser/02_custom_types.py index 1725bf4..b034594 100644 --- a/tests/cases/python-parser/02_custom_types.py +++ b/tests/cases/python-parser/02_custom_types.py @@ -16,10 +16,6 @@ lat2: Latitude = lat[1] lat_diff: Difference[Latitude] = lat2 - lat1 df2: Frame[ - age: int + (_ >= 0), - height: float + (_ >= 0), -] -df2_bis: Frame[ - age: int + Positive, - height: float + Positive, + age: int, + height: float, ] diff --git a/tests/cases/python-parser/02_custom_types.py.ref.json b/tests/cases/python-parser/02_custom_types.py.ref.json index e59716d..1744630 100644 --- a/tests/cases/python-parser/02_custom_types.py.ref.json +++ b/tests/cases/python-parser/02_custom_types.py.ref.json @@ -227,61 +227,18 @@ "_type": "FrameColumn", "name": "age", "type": { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "int", - "args": [] - }, - "constraint": "_ >= 0" + "_type": "BaseType", + "base": "int", + "args": [] } }, { "_type": "FrameColumn", "name": "height", "type": { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "float", - "args": [] - }, - "constraint": "_ >= 0" - } - } - ] - } - }, - { - "_type": "TypeAssign", - "name": "df2_bis", - "type": { - "_type": "FrameType", - "columns": [ - { - "_type": "FrameColumn", - "name": "age", - "type": { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "int", - "args": [] - }, - "constraint": "Positive" - } - }, - { - "_type": "FrameColumn", - "name": "height", - "type": { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "float", - "args": [] - }, - "constraint": "Positive" + "_type": "BaseType", + "base": "float", + "args": [] } } ] diff --git a/tests/cases/python-parser/03_functions.py b/tests/cases/python-parser/03_functions.py index 3b07899..cce027d 100644 --- a/tests/cases/python-parser/03_functions.py +++ b/tests/cases/python-parser/03_functions.py @@ -4,11 +4,10 @@ from __future__ import annotations def func( - col1: Column[float + (0 <= _ <= 1)], - col2: Column[float + (0 <= _ <= 1)], -) -> Column[float + (0 <= _ <= 2)]: - result: Column[float + (0 <= _ <= 2)] = col1 + col2 - return result + col1: Column[float], + col2: Column[float], +) -> Column[float]: + return col1 + col2 def func2(a: int, /, b: float, *, c: str): diff --git a/tests/cases/python-parser/03_functions.py.ref.json b/tests/cases/python-parser/03_functions.py.ref.json index a4aafdf..b935467 100644 --- a/tests/cases/python-parser/03_functions.py.ref.json +++ b/tests/cases/python-parser/03_functions.py.ref.json @@ -26,13 +26,9 @@ "base": "Column", "args": [ { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "float", - "args": [] - }, - "constraint": "0 <= _ <= 1" + "_type": "BaseType", + "base": "float", + "args": [] } ] }, @@ -45,13 +41,9 @@ "base": "Column", "args": [ { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "float", - "args": [] - }, - "constraint": "0 <= _ <= 1" + "_type": "BaseType", + "base": "float", + "args": [] } ] }, @@ -65,44 +57,15 @@ "base": "Column", "args": [ { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "float", - "args": [] - }, - "constraint": "0 <= _ <= 2" + "_type": "BaseType", + "base": "float", + "args": [] } ] }, "body": [ { - "_type": "TypeAssign", - "name": "result", - "type": { - "_type": "BaseType", - "base": "Column", - "args": [ - { - "_type": "ConstraintType", - "type": { - "_type": "BaseType", - "base": "float", - "args": [] - }, - "constraint": "0 <= _ <= 2" - } - ] - } - }, - { - "_type": "AssignStmt", - "targets": [ - { - "_type": "VariableExpr", - "name": "result" - } - ], + "_type": "ReturnStmt", "value": { "_type": "BinaryExpr", "left": { @@ -115,13 +78,6 @@ "name": "col2" } } - }, - { - "_type": "ReturnStmt", - "value": { - "_type": "VariableExpr", - "name": "result" - } } ] }, diff --git a/tests/serializer/python.py b/tests/serializer/python.py index 8bd73a7..89a097c 100644 --- a/tests/serializer/python.py +++ b/tests/serializer/python.py @@ -8,7 +8,6 @@ from midas.ast.python import ( CallExpr, CastExpr, CompareExpr, - ConstraintType, DictExpr, Expr, ExpressionStmt, @@ -106,13 +105,6 @@ class PythonAstJsonSerializer( "args": self._serialize_list(node.args), } - def visit_constraint_type(self, node: ConstraintType) -> dict: - return { - "_type": "ConstraintType", - "type": node.type.accept(self), - "constraint": ast.unparse(node.constraint), - } - def visit_frame_column(self, node: FrameColumn) -> dict: return { "_type": "FrameColumn", From 742693fa389fec3629d4c33f2e520870df964ffd Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 15:55:06 +0200 Subject: [PATCH 07/12] chore: add script to check docstrings --- scripts/docstring_checker.py | 174 +++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 scripts/docstring_checker.py diff --git a/scripts/docstring_checker.py b/scripts/docstring_checker.py new file mode 100644 index 0000000..b021cb3 --- /dev/null +++ b/scripts/docstring_checker.py @@ -0,0 +1,174 @@ +import ast +import re +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Optional + + +@dataclass +class ArgDoc: + name: str + type: str + optional: bool + + +@dataclass +class Param: + name: str + annotation: Optional[str] + optional: bool + + +class Checker(ast.NodeVisitor): + def _get_args(self, docstring: str) -> list[ArgDoc]: + args: list[ArgDoc] = [] + + in_args: bool = False + for line in docstring.splitlines(): + if not in_args: + if line == "Args:": + in_args = True + continue + + # End of args + if not line.startswith(" "): + break + + # Continuation line + if line.startswith(" "): + continue + + line = line.strip() + m = re.match(r"(?P\w+) \((?P.*?)(?P, optional)?\):", line) + if m is None: + continue + + args.append( + ArgDoc( + name=m.group("name"), + type=m.group("type"), + optional=m.group("opt") is not None, + ) + ) + + return args + + def log(self, node: ast.FunctionDef, msg: str): + loc: str = f"{node.name} L{node.lineno}:{node.col_offset+1}" + print(f" ({loc}) {msg}") + + def _is_ignored(self, node: ast.FunctionDef) -> bool: + name: str = node.name + if name.startswith("visit_") or name.startswith("_visit_"): + return True + if name.startswith("parse_") or name.startswith("_parse_"): + return True + if name.startswith("_print"): + return True + if name.startswith("_write"): + return True + if name.startswith("__") and name.endswith("__"): + return True + if name == "accept": + return True + node.decorator_list + match node: + case ast.FunctionDef( + decorator_list=[ + ast.Call( + func=ast.Name(id="method"), + ), + ], + ): + return True + return False + + def visit_FunctionDef(self, node: ast.FunctionDef) -> Any: + docstring: Optional[str] = ast.get_docstring(node) + func_name: str = node.name + if docstring is None: + if not self._is_ignored(node): + self.log(node, f"Missing docstring for function {func_name}") + return + + args_doc: list[ArgDoc] = self._get_args(docstring) + by_name: dict[str, ArgDoc] = {} + for doc in args_doc: + if doc.name in by_name: + self.log(node, f"Multiple documentation lines for argument {doc.name}") + by_name[doc.name] = doc + + all_params: list[Param] = [] + + pos_args: list[ast.arg] = node.args.posonlyargs + mixed_args: list[ast.arg] = node.args.args + kw_args: list[ast.arg] = node.args.kwonlyargs + + def add_param(arg: ast.arg, optional: bool): + all_params.append( + Param( + name=arg.arg, + annotation=( + ast.unparse(arg.annotation) + if arg.annotation is not None + else None + ), + optional=optional, + ) + ) + + n_pos: int = len(pos_args) + len(mixed_args) + for i, arg in enumerate(pos_args): + j: int = n_pos - i - 1 + optional: bool = j < len(node.args.defaults) + add_param(arg, optional) + + for i, arg in enumerate(mixed_args): + j: int = len(mixed_args) - i - 1 + optional: bool = j < len(node.args.defaults) + add_param(arg, optional) + + for arg, default in zip(kw_args, node.args.kw_defaults): + optional: bool = default is not None + add_param(arg, optional) + + for param in all_params: + doc: Optional[ArgDoc] = by_name.get(param.name, None) + if doc is None: + if param.name not in {"self", "cls"}: + self.log( + node, f"Missing documentation for parameter '{param.name}'" + ) + continue + + if doc.name != param.name: + self.log(node, f"Documentation mismatch for '{param.name}': wrong name") + + if doc.type != param.annotation: + self.log(node, f"Documentation mismatch for '{param.name}': wrong type") + + if doc.optional != param.optional: + self.log( + node, + f"Documentation mismatch for '{param.name}': wrong optionality", + ) + + +def check_file(path: Path): + source: str = path.read_text() + tree = ast.parse(source) + checker = Checker() + checker.visit(tree) + + +def main(): + folder: Path = (Path(__file__).parent.parent / "midas").resolve() + all_files = folder.rglob("*.py") + for f in all_files: + print(f.relative_to(folder)) + check_file(f) + print() + + +if __name__ == "__main__": + main() From 21b648e18f6d9d095206d2b4dd1a7eef760758ef Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 15:56:56 +0200 Subject: [PATCH 08/12] docs: fix some docstrings --- midas/checker/builtins.py | 6 +++++- midas/checker/dispatcher.py | 23 +++++++++++++--------- midas/checker/evaluator.py | 2 ++ midas/checker/frames/column_manager.py | 2 +- midas/checker/frames/column_methods.py | 10 ++++++---- midas/checker/python.py | 27 ++++++++++++++++++++++---- midas/checker/reporter.py | 5 +++++ 7 files changed, 56 insertions(+), 19 deletions(-) diff --git a/midas/checker/builtins.py b/midas/checker/builtins.py index 427d414..bfae66b 100644 --- a/midas/checker/builtins.py +++ b/midas/checker/builtins.py @@ -26,7 +26,11 @@ Circular dependencies and diamond inheritance MUST be avoided def define_builtins(reg: TypesRegistry): - """Define builtin types and operations""" + """Define builtin types and operations + + Args: + reg (TypesRegistry): the types registry + """ any = reg.define_type("Any", TopType()) unit = reg.define_type("None", UnitType()) object = reg.define_type("object", BaseType(name="object")) diff --git a/midas/checker/dispatcher.py b/midas/checker/dispatcher.py index 77e1f45..8320e8d 100644 --- a/midas/checker/dispatcher.py +++ b/midas/checker/dispatcher.py @@ -102,6 +102,11 @@ class CallDispatcher(Generic[E]): self.logger: logging.Logger = logging.getLogger("CallDispatcher") def set_reporter(self, reporter: FileReporter): + """Set the current reporter + + Args: + reporter (FileReporter): the new file reporter + """ self.reporter = reporter def get_result( @@ -123,8 +128,8 @@ class CallDispatcher(Generic[E]): Args: location (Location): the call location callee (Type): the called function - positional (list[TypedExpr]): the list of positional arguments - keywords (dict[str, TypedExpr]): the map of keyword arguments + positional (list[TypedExpr[E]]): the list of positional arguments + keywords (dict[str, TypedExpr[E]]): the map of keyword arguments report_errors (bool, optional): whether type errors should be reported as diagnostics. Defaults to True. Returns: @@ -250,7 +255,7 @@ class CallDispatcher(Generic[E]): """Check whether the passed argument types correspond to their matched parameter definitions Args: - arguments (list[MappedArgument]): the list of argument/parameter pairs + arguments (list[MappedArgument[E]]): the list of argument/parameter pairs report_errors (bool, optional): whether type errors should be reported as diagnostics. Defaults to True. Returns: @@ -286,8 +291,8 @@ class CallDispatcher(Generic[E]): Args: overloads (list[Type]): the list of possible overloads location (Location): the call location - positional (list[TypedExpr]): the list of positional arguments - keywords (dict[str, TypedExpr]): the map of keywords arguments + positional (list[TypedExpr[E]]): the list of positional arguments + keywords (dict[str, TypedExpr[E]]): the map of keywords arguments report_errors (bool, optional): whether type errors should be reported as diagnostics. Defaults to True. Returns: @@ -385,8 +390,8 @@ class CallDispatcher(Generic[E]): Args: function (Function): the function definition location (Location): the call location - positional (list[TypedExpr]): the list of positional arguments - keywords (dict[str, TypedExpr]): the map of keyword arguments + positional (list[TypedExpr[E]]): the list of positional arguments + keywords (dict[str, TypedExpr[E]]): the map of keyword arguments report_errors (bool, optional): whether type errors should be reported as diagnostics. Defaults to True. Returns: @@ -514,8 +519,8 @@ class CallDispatcher(Generic[E]): function / a subtype of another. Args: - mapped1 (list[MappedArgument]): the first argument mappings (subtype) - mapped2 (list[MappedArgument]): the second argument mappings (supertype) + mapped1 (list[MappedArgument[E]]): the first argument mappings (subtype) + mapped2 (list[MappedArgument[E]]): the second argument mappings (supertype) Returns: bool: `True` if `mapped1` is a subtype of `mapped2`, `False` otherwise diff --git a/midas/checker/evaluator.py b/midas/checker/evaluator.py index baefc0d..79dc9c1 100644 --- a/midas/checker/evaluator.py +++ b/midas/checker/evaluator.py @@ -190,6 +190,7 @@ class Evaluator(m.Expr.Visitor[Any]): """Evaluate a predicate function call Args: + location (Location): the location of the call expression predicate (Predicate): the predicate to evaluate args (list[Any]): a list of positional arguments kwargs (dict[str, Any]): a map of keyword arguments @@ -234,6 +235,7 @@ class Evaluator(m.Expr.Visitor[Any]): is set in the context using :func:`set_value` with the parameter's name Args: + location (Location): the location of the call expression function (Function): the called function args (list[Any]): a list of positional arguments kwargs (dict[str, Any]): a map of keyword arguments diff --git a/midas/checker/frames/column_manager.py b/midas/checker/frames/column_manager.py index 4fa9e81..16c8187 100644 --- a/midas/checker/frames/column_manager.py +++ b/midas/checker/frames/column_manager.py @@ -45,7 +45,7 @@ class ColumnManager: Args: reporter (FileReporter): the file reporter to use for diagnostics location (Location): the subscript's location - column (DataFrameType): the column type + column (ColumnType): the column type index (TypedExpr): the index Returns: diff --git a/midas/checker/frames/column_methods.py b/midas/checker/frames/column_methods.py index a7dae13..e957a55 100644 --- a/midas/checker/frames/column_methods.py +++ b/midas/checker/frames/column_methods.py @@ -353,10 +353,12 @@ class ColumnMethodRegistry(MethodRegistry[Call]): call (Call): the call object kwargs (list[Function.Parameter], optional): a list of extra keyword-only parameters. Defaults to []. - formula (Callable[[Type], Formula], optional): optional formula - builder function to compute the return type. If set, the function - should accept the inner column type and return a formula. - If `None`, the result is typed as `Column[Any]`. Defaults to None. + formula (Optional[Callable[[Type], Formula]], optional): + optional formula builder function to compute the return type.
+ If set, the function should accept the inner column type and + return a formula.
+ If `None`, the result is typed as `Column[Any]`. + Defaults to None. Returns: Type: the result type diff --git a/midas/checker/python.py b/midas/checker/python.py index 0eb751f..0192dfc 100644 --- a/midas/checker/python.py +++ b/midas/checker/python.py @@ -518,11 +518,12 @@ class PythonTyper( def _assign_attr( self, location: Location, object: p.Expr, name: str, value_type: Type ): - """Type check assignment to the given target + """Type check assignment to the given attribute target Args: location (Location): the location of the assignment - target (p.VariableExpr): the assignment's target + object (p.Expr): the target attribute's owner object + name (str): the target attribute's name value_type (Type): the value to be assigned """ object_type: Type = self.type_of(object) @@ -544,11 +545,15 @@ class PythonTyper( index: p.Expr, value_type: Type, ): - """Type check assignment to the given target + """Type check assignment to the given subscript target Args: location (Location): the location of the assignment - target (p.VariableExpr): the assignment's target + var (p.VariableExpr): the target subscript's owner. We only allow + a variable expression here because we might modify its type (for + example when assigning a column to a dataframe) and reference + types are not implemented + index (p.Expr): the target subscript's index expression value_type (Type): the value to be assigned """ var_type: Type = self.type_of(var) @@ -690,6 +695,20 @@ class PythonTyper( right: TypedExpr, method: str, ) -> Type: + """Compute the result type of a binary operation method call + + This method is called for dunder methods called by binary operators + + Args: + location (Location): the location of the operation + expr (p.Expr): the expression which triggered this resolution + left (TypedExpr): the left operand + right (TypedExpr): the right operand + method (str): the method name + + Returns: + Type: the result type + """ try: return self.call_method( location=location, diff --git a/midas/checker/reporter.py b/midas/checker/reporter.py index 8604dcd..ba97c07 100644 --- a/midas/checker/reporter.py +++ b/midas/checker/reporter.py @@ -70,6 +70,11 @@ class FileReporter: @contextmanager def with_context(self, ctx: str): + """Push given context for reports inside this manager and pop it on exit + + Args: + ctx (str): the context to temporarily push on the stack + """ self._context.append(ctx) try: yield From cd9b80d22b9f81b8f92d4861f1a8dd1114345265 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 15:59:29 +0200 Subject: [PATCH 09/12] docs: fix some typos in manual --- docs/manual.pdf | 1651 +++++++++++++++++++++++---------------------- docs/manual.typ | 4 +- docs/template.typ | 1 + 3 files changed, 847 insertions(+), 809 deletions(-) diff --git a/docs/manual.pdf b/docs/manual.pdf index be2d190..a996059 100644 --- a/docs/manual.pdf +++ b/docs/manual.pdf @@ -8324,13 +8324,13 @@ endobj <
> endobj 2775 0 obj -<> +<> endobj 2776 0 obj -<>/FontDescriptor 2777 0 R/DW 0/CIDToGIDMap/Identity/W[0 0 653 1 1 467 2 2 497 3 3 249 4 4 497 5 5 200 6 6 311 7 7 456 8 8 555 9 9 292 10 10 496 11 11 497 12 12 263 13 13 547 14 14 338 15 15 347 16 16 542 17 17 544 18 18 246 19 19 419 20 20 504 21 21 255 22 22 497 23 23 569 24 24 555 25 25 829 26 26 534 27 27 555 28 28 664 29 29 495 30 30 497 31 31 615 32 32 504 33 33 467 34 34 645 35 35 727 36 36 566 37 37 544 38 38 497 39 39 536 40 40 571 41 41 515 42 42 486 43 43 497 44 44 543 45 45 588 46 46 350 47 47 553 48 48 494 49 49 497 50 50 617 51 51 497 52 52 527 53 53 446 54 54 497 55 55 719 56 56 652 57 58 303 59 59 664 60 60 479 61 61 579 62 63 426 64 64 249 65 65 247 66 66 249 67 67 786 68 68 425 69 69 647 70 70 594 71 71 304 72 72 497 73 73 289 74 74 476 75 75 249 76 76 577 77 77 367 78 78 249]>> +<>/FontDescriptor 2777 0 R/DW 0/CIDToGIDMap/Identity/W[0 0 653 1 1 467 2 2 497 3 3 249 4 4 497 5 5 200 6 6 311 7 7 497 8 8 553 9 11 497 12 12 496 13 13 263 14 14 547 15 15 338 16 16 347 17 17 542 18 18 555 19 19 544 20 20 456 21 21 246 22 22 419 23 23 504 24 24 255 25 25 569 26 26 555 27 27 829 28 28 534 29 29 555 30 30 664 31 31 495 32 32 497 33 33 615 34 34 292 35 35 504 36 36 467 37 37 645 38 38 727 39 39 566 40 40 544 41 41 536 42 42 571 43 43 515 44 44 486 45 45 497 46 46 543 47 47 588 48 48 350 49 49 494 50 50 617 51 51 497 52 52 527 53 53 446 54 54 497 55 55 719 56 56 652 57 58 303 59 59 664 60 60 479 61 61 579 62 63 426 64 64 249 65 65 247 66 66 249 67 67 786 68 68 425 69 69 647 70 70 594 71 71 304 72 72 497 73 73 289 74 74 476 75 75 249 76 76 577 77 77 367 78 78 249]>> endobj 2777 0 obj -<> +<> endobj 2778 0 obj <> @@ -8737,39 +8737,46 @@ x endstream endobj 2900 0 obj -<> +<> stream -xmMO0Hp`$)U-zCKZ3|fC;5߬v]붞gflzV7c_N>sY_!alI7'(D~leI~hZGyޭc(nHff}[oy}]/#MrEGQ>= #7~ߒ:$"DWkrw7@WbS}r(Yf|YJʿOO;%֭,˲WUU-BaϮTT:QG([U&j USAͣna|Pj 5Z!ZGena*0`<4 Jg+(Y_ 9E|gщ\VP+$;JEr'J3_!q˨4 +|_ " +|)E NE ZWHvEOK>)LOĴaO >" >- +|4JTWJxO8L~tSሣ +|*qP&pQ]  +i|/+0Q 3ˆ0RA"o^sX^a#S%0]/skja5/Sk?q)zp endstream endobj 2901 0 obj -<> +<> stream -xz t[W%˒-K::$zYG۲-K~ʯXMvh!eh҆2󠙒3k -t[h:B[a(-moウ<: Ji-G0pu9g? @Cّcg_^l %@CKP^X+R<TPvѲK@:@F-=y03KsO8@͇X-K/]j>OX^][-X? y@@fJZ`UkxCPDHDq(f˙uBpX֘xw=gok9wȷfO|xL#yud*'VTUp8R!rO~~rJ}ldO (M-z?TmP0,rG v&k+:t`&>Տ\{GM'ͮBkN6 X9߫Wlj$ ,`5$jP85vOع.Pl.ֻ?&8?sov|\ HlINq]1rR_hm'- IckZխ+VkXM4E&|ʀI/I^WP~[#iz!ș"~w)z*Rpj[bvgFVM5On556>cƛzPJƋ%\BQ{kj(+7lL>RѪ%j/'I[0|"CMne>Im|G}C[h6[Gm7NTWDC&\e3IFO#"zq;>+x+#fZ暠oL[}cQ5v:cGG6 1W}_w{mDЁ ƀ4G:cƪFԤ ܂Q#h$C(4.' zR u:-eKme6>&.FE"V -m~6;XKJGb#ñVWr!gzJjt7i&㙶M`Zjd_zn f^jsL0gE܎qrf6f7=\$vxi.JM1֤ϰnlO6ԏxTb!䌎XJTUT"Dθbv|QNi}f2;کd]\BUp뗈pUݎ3 os&4&TјnTeSdZC=&X(˯cR\^*))jNY(C[,%+`670NC9:EQ_wku&OI1=o{G9P+]ZTKl'MA \"lB4yTj8~6~ c]L#(q3b/+ɵ\L"oL1"jb%WfpI׃峏1:i6z|w|^%`n\#[wS>M-E:Fhpn_g\fׁ?%x$mom{^Se km=dXݑNhhB'\mNcI}+xB-Nکq'(RY-E28i+JQW;z w)g5wڞ6m˃f䧉;|֨`J/IcMn==wNі=~͞5L7v:leꉿm񁱱oˉd]c::NMbw}_.ศ[?-6[o]M,'m^¹z5K(';j =cJm"3gff}Mj,% 7pDPpTI/GUT, -8xW]+_󉺺Oo CGC^SM:|1:dcNOO'M${"۾w@)N)oUi/,as`8" -CDԆ KVK>[Wkп[g u(B - yӳ8?ݤz X#Vo]E=}lgv;.9;?56~:.=`BP4C2SN{nf^]Y*+K?뙇ɤÑL:ɭR w: -rצljo=$nӳ,4; -9KTnr1{orkIMkCmUa6IWVUuk& 0>p5u3VRsR$+D>uh``dU,eHⶩucO'77{c'MίL^֞fqTJ$ș@ok3hkAQ0H5wdmCP;90HG1Ւ15o -+cr-lOg9 @סvZ^*̋ ]~;M~F;2ˆ79oE3;<d:-}N6XM|̮vݓ꾩7ݧ,-(zF9/,-)Jq7>p$xRe 2[gCCy'(4&=NzI |Gڣ%} M* d!ۻŖ/̿rܫ_YYyQʂR>#c^^YyeЫν*z>_W#.'gRc'c3 &@ҏ%y螚ph.j VFlmʟ#Иqsu&au&Ц9}}vy&s<=dh&dvi@ -_{#''evtH;s_O|<MuzFuf>B>oniHB`[fuJ{]{l_v -`Eڽ;aswV6^U:=_Eߪ,4XDoǭl@ߦ _/tʊtꙉ)V+8:[XK 'B55"OZ['u.@]$(ِ"t"Z ,Htg>Йȓ䶫ܮ:'ȧoy¦q^^W&)zf rm\efnM?@o8wC>o>>+)Hp[^"+:w*6*󹘢Щӽ…5w]bv⣤U&nfbGڰ>l yf}偐$G=책۟~ig'.}f89DE5*clrl9%,@^WN!nW dE#+K'ɐ?Jmw]]wW23l$w -,BήhW7ox|k,}~Rٮ^lxҹٜ cBio{QXSM ;6G>0eSŢ[,߬כooJVXVS5-/9ƭd4G$)bv.Wh+|8ծ"7G C=l4>#MF i pţoч K[ _ v?>ǣ[f^,\枒" eOsdȜ -/n=i)\ٻ~&1Cjrn8\H ->R =<*D4")-HQ3ԊA -]S0_CD)rui6kCVE$!7#H_֧1M_@V齆aQ)C~ir"MfQD"?"LZ4y -%*!M|H:0,>)' -1I^f}hzi_"f)!F/V\e|N>$@#+ǔ>E檹$w;K2lR?d_Y`(HS*ˣ}?,*^W+,<]waO*"^X4QO}GUZTi)=OTQSy5KCy7dR,('Ȕwj6ʷ)J6V|)ߖ_#}'rJ|Eԛo+M -:osV|OaX"CXƭN,` k8)׋>^2C=ܰXFcR{ -dUl{ku 8FЍ$6:$]s݊;vpif8øV$>KF&ЋLbB#Ǝ +:1atI#v]aI}ycqB~U=E,ds&9[q8?UiA,ԓˬ|oG`}V$r%6KV$cZq&ˌ9r8Cs)(7+ *A%?t}naHa1.@&000@? ~ EʑD=N܂//q -؇FBqJ C+L#2I k {>)8#${ d j +xz t\gy}w4fьFݹUi,G}_FeMlJ,Y,ˑ;NCMBE'u. S +SHRZJ$i%ؿ $D3d@~s﷼^ +'Οaf9/9@U@laanPS Pu@J/U=rlt_oxtyS8I(P幟{;N?{ Z;  TP?JPq1\Eijf,յqsO4?~k3gd>Ly dE'WVX,^.r|vZ +}lfO #(|-5z?Ԩh$&+urW8FN.**+>|GZpOc|Ӈg֣çAniBjj UvF6 ZF=4XZ!Evc|'NT/~gγDw~.4a+\1v2;ZDQ>rowspt uǰKᙏ>'[|(% +@V)oP +]e%{yNў;qt˝1,I0fW֮TstYyޏ ;+@V*+nG; 6ݝS@u +m~h6F>)wbw1M-r$+.!K.{gsiB|3=691>Pk Z]M~k/,!XV5U+ ϝtBnIws@<@%%6]/S]EWI%f[esi@`$oX÷RZKZ^_b.KdhtڬZ6} sw:RŅ2\ҫzlc%rǢ4СJ~'_XhjZP*5t>B7D[[t e*UBuqQ*y<Mڨ`}᱃&X)=DњUr }{c6 rl'Jþޔ/`n|x춇µ^q'8:5oz \e܃nW`{f#^sunn>f[}h!VG|VQCɰTEK)o +Ԯ9ٝ.|tʪs3Vcoy>Qor NZ"5C${]홭YBwb{0uwOݩsƛBƃA͜3Nu*E%u?uo&δ= +!/%yoMzEOZQ+EERR)O<4fyG"y ќN~Si]Ӄ#&i9"VGQmYmQg-aڃsD;{#2Uma*Xn0wڥ7BSsw|8ZI!v;wTa,zQ'讃Jg2yΒzm7$:*L*j+ӇFeNQ739ټ2` +kkMAw%'jFRq"YEgmtث(HJC|dR:% ϙ#B)&D̙L*Q&+\M6(u9w{QťsӁ/3cw${kJrV@s +L]QY6d"wZ[Ɔ^;c#z(^˯qIe6UȧbqWWW_;b8Jx&xh1Ǐo?;LKmg[>;! 5#F5|r|-#6磎&S)NKsD;mt#{'s+f@ KdNV @ + %gdNI}v_ϰ1ApEӡ͢qYgUcmR FKYʍO^#s|lJ.JX$Jd0 3:>?uy9XcvS2GL!.)rﭩ[faL2EQ +>&q7);n' -{yȢ)gBQ(&KZ #sV*n|({Y=sC<\Vh>?lĬViaX /Q3,G%t}O.<쳭ϲ87(`5 b tMwϑ;gf2W$kyffNկMOX2db /t;5_Ȝd{rpdrv'eCy8oh;DCL[j-qc3};)TV<\~~6)Ai +\쓱])oCcd[Lx%;}#Nd>cSj0Xb0X/J6HRՍ(孜\S4 18oVS[ڦip=m*>E6wL#Ą=RHbCv)Ё SZ'sϺ%Dc6 O'1$$s(\2NI6g31'i ]w֮Ikn"楙̻*,fq< +6g˒-wq=^r`OstqH9oU9 gК)뿃W'\ ʾ |%ZLZTGP= 0IЃnЉD1Q0Q ЏCG" €8P0`BPC0> +<> stream -x;G {} -v9| ?0#S8\~}\I˹Icu/^ܼ{/_y} ?1p6И`ߖë[ zsG0n?>">yjkQatGpF&SC2m DF3eGWip(",@rA`T -ECj:),XFAb5Z@Km FIt\S./ =;=#$cO03LQ5@dq{eE}Kq@bT_^1K3VT%TY/O0+:{FggH;xͬ0Z6:%fnheد*8<獄ulrb=y=]wab:1O4D'j\-OQU[c3i<7X5eOir'g!`!4x+R̥zgvݸ^ _RW&Я1l:<YhDNT۽Y7{8{' -I],9ƕutm}3ؾUO-Rޕodd9v38^<{"KI, +xnW } +v< _0#R)A+Gٝ$Cet/^ܼ{/_y} ?1p6И`ߖë[ zsG0n7goNNNNxϮ~kc|􍯝=wo_YK$̈́Y30%8+Y|8qwhK$xt{'hgx Y? cL-,n>SwTT܃p5Mkpc2qQzAX@X +| Q^Έ c +kT 832Ii{8& 5#);L DigYd0$JKLRP,,7"UefK JjB +`uيq$N^BXn(-8HZ4 jwf}ID%> 4v0E32u,ǝ>NG-aAS4SyaƨnZ֒SIrpSm>udt¬+]#GXl5hN1,/v[ڝ-Cs~No,'6;Sx*pwx64MOtqcDw.l[B8Љ^6LɚLĩg W;PRNU%- +wJ!!(Ɗ> +<> stream -x̽[Krw_eԴHd#lBDI ܙ `ˣ`{ceqzjqfzv/+|͌?o:_?O?O~/??o~:?IS?/Ow{{_N~|?_֟T>߾p۳#o_NbI;G̾I׿ۿ?7?_/g?H}~Ro2͢ҩ,NfMJgYs-'6Q)eSV#nu!=¯OގK#g:W4=eoZui3ʚKf-?bNCjfHk‚, &aҲdXkc-Jia}D#tHY֢c8?K™YeAlMܒu-Һk#dA\\5$YGב5ֲts:JzZzIČG/:ÚP9ZZ27IgKϑaA\X;B&mu֪,[3;Gv+YդÚYb=Tbّ۬Ӥ*V8顊ӒˊᄚWV !$* -;2z}JWV}xiG)ap9U4zKBޑ*랬U%^M:ԾsX0֪fAC(+ =0Hְic0Hx+M?ϑ>֤*Oz9m+YK:U~.35;josة.ۆwhľ%=xU7d?7Tw)xkxAM}d?TcdfXtсo)B929xŐ%1)gu!?p!Wjw-$zpdtmu- oG:k%u_D;$~42]Fo.էyS#.&QM/jc8PBdOʢ}yT LD9">$ȔVUVo(~V86(I[]H@D#OYL~CN2HH]c2iУIKڝUvp-9pv$bZD#vEX lKE^,#'i~D8RH CO =S*n_G/DF?$|x[7rr9v1煔[y!%qhÔ$? os^Jٕy)8!dž38|5B[̒7@j1_ri#ax@h/[EÇKU#GYfVEy$$IjR4|9 &! $h -䁌ҢI1.# A*0Mι$~I 2)vt!N gv0ԣ.%?K?JВ4INȇsDy"LhrP>]w Ƈ}7h񙽆.Cd)_Ws벚x)!V|jGذr א%_Hέh$SX=K IoC0=]bI>7}/i,~sp"SN\R%! ]֛|zy/A<-cۜW y/BHҦf'RBA.C{`'1P$[l%*/FGPyڛ*@ҙ?ά|LTMufufGBu'?dgo$GvbďEWn8W$auJ£wdG4o -M,|k[CwC\C">eJShޠyXbqtW&3wk?r±S(/4I&r)=7GӡeW -p-c ->M|hB% <§)xn0Աpd7EG?C÷L\_E_3wC5*9:: n(77oV֭n8 gc|QIy8<מ_k LsCNr[7A{ -CaQ=Xwۻ!u'nV8k@o8mfиAu'RauܺYW۸aXo۸`¡4t)}fYA۷u%}rXW 7QG+֢}`KבZ8bF[kn>]I)۵!XDWm@i z<5mH}}gcěџI(ycN64"u7h$2FFe$:zY-Z}%yK}!* -Ix\Xv[Җ> ő#h9NF·xkC(knPjo%b$|Sɉo6]Yqtg0_ˤbVyT֊'KzZLk#6ÚfEre 9<2ÉMH=4+HkJV) &:28`}7YSCzd֒Y4c8PYxxydYtbtֲLHκn it~$GbPɬV}uQieKԴXO,BNÇl(벉 hA#V%/h֩ٻ4|β.໬&8aQc(8 -N`,1>\"zYl4`լɒjxprXMp뺉=H;Pmɺn"¡Cg‘Wd~U6ѸGZT7Y71o$f?$qYA>H8AG=J@},ooC;v"/<>d| -wvj;_h??=8^i- X}M *OR(8=80p!b'W*N ->w,|Dkr -pl$=fSR;Bam He:,Eo0bࡷq%vB! י_N^ rjvСd AÐG'IGmIڋ!^遃OtYT$ҕHJ;IF&ՁK8=M$rIm: 2pn;2XgKmը |ն)xmvXg˫9+٫qWrތLGbW?j۷ynlݻr_?2Kjt'ϿP~JqMeOfJ^Tmh|fvH; RgƏ& $Hԕ8Dw><>z?"!~#(:9Q/@2+d?bkE5i^aP):_nermOH|4~139G6?6&rngtPdM@g>>h?X~׭<&Q( *C£YjH965dP8Q1m;RɛT v#a4uo&аHxVS7O p$‚ -pp%E MO@/Џ~ $> nR -p+AmeGrJ9M.:pp1mPA-uOѼy$ -:A.?8SsIsͨoQ2wHuWѾx/gȿ}<b'dEph"x3htsF9PEW "[1"o-<}B;̛ C_ d$]BO>|3[*-Hh"LCzE9ǥAGԕP |^Y3$ (?oF&\#uHDm[ p=_98W?q~͏X?E._ҭȆ }rRQpOЯyt^`#EC~M![-GJt-$>EoFAA΅;?2,&:PI~r /08|&GÉyE/F@di'Ct>e ['&v0(_$7 Y #$k[N⣜vQc:!̗8|79s یÏ#D|O#N⯌"a~Xk ?RY5q-864~D R992sSI|TT}Ct;$HKNC?%a^I l\Wrvd ˃Gۼ_7!<>C @?zUTۑ/q~OhWR(_)?;UHx4NS !{i᪫+OIKCUd;Ӽ%$Pvg -s??H(t(^Y]対Ah?\O[oxzK_A(g31+̯_ Z -p])̍ wK/I+e۳O /͛pIjs$Reyq- --i_m;BQspݥ}WocI -~]zT~D - <Eb}=Z -nG,3>48b h_mx@Ҿ؀(.z@lCO\; -jij YjBr& -|`iȺ :<ɚ7$CWC_8rj::܄M -^d4zB|7TeI({M)t?~h_LӾpIw- ]OE2vўRѼ|ƒ}.}A/?Kk$rH#%hZ5SOnp:oGEu%*$:.g<6 C㛋Bd8|W|/޷ܖÏ#=zh?︗DZ|X&%G\2LFbͿUʦyB7k?G"y|S#_1$pRuIy|CKfC=Oam| I= GVCu$~KA0ݟH尴[_AG W5-$<*&;7o]8Q]䂃ف;^%؊_1؝_9ؗC(ھEOk;)hT3d؛tEQ! WÇ4l#  -mІx[?u8C.^@ÅI`RWB#|ӍH|oxDvg?҈?HD✒&}/~C`4 ? prPk4x;%gK׃|{Q4~=8xs=,șMܣ >GC(ԣd>RjXm=ݖ5r+sIcC—5N$|K!dϡįYX¯H§XYfH[fGI T) &fЀIsZrkH6k-d%ё\ -/L X3#'+X3&ɚ(tN_K #Wemuނ~#(kd5bwKAZ+8 €#'Y MH-,${HS'x%iނ{isXWYh:@—eͽ4l-{tDkK1r̝5i|a ~Jt5}x& }7f$(j8x>BR - #*M@X5(suYkH5ȺuISQ};3ű_PGit:Nƚt)dW {~}'g%?%9>k`<=^y0SE X_ypxС@SfПD{x!%'ghH!d 2pPy2 iyyH'dI,<b(+ C!8$yX7 Vu<< -#zXwOBϛџHxBOGBO1*JϷT>Rz^7NW_=3~hsy.PEM}WtIuS?Рgw /k?\(@$>\LO(K㷜=paS]0I>蟍?dJ⯘zXPޚ2H`^×lEH-u=bqI@ -pdmn;eP$>h q>{£"qyDѻIX3 p⻈%h0&p>gKj -Жi[d9ePoMz G><4!RnWxM~I&/&vdQB⧄bak 5/$>҇榎Qv|E"& 7k^D&}ho꼈Է,^D t0^Dp Vozh*/"p=4M|LG"?T -t p-"\<^7_f~.i2XQelFv9Qӿ9ͭ-e{H0T89J_wF*Ҫ>}q!!r, .i7oپ'K -~L"F<GoR*pI;+ǵ8&}~V4 -")x4Bp(PB$B7C8Қw+bUBјO>'{R9nD9t$-ƞdW a/܃߰cUbN<ɣэZ4Fl_q=(mץ }P@bH[=*[GJv"TXu.ЪbCa͡] *mCcäI;z B 9{2,gݓO2Jm@˚^P n nluS6^HKtYz(S^8D$\U*+ToTތL!GW?OIzI-jR T?^5J{րdtNMZqOG{<|Yl]IxQ5dp#34Hidr-(T1#QukаOTvBw4,~$QA#k<2g- - X8^fiTq)FR#c.&9Q,ڔ-qM(xGN#-*2` ĵ7="25މ.G ͟B/1ouR2^ڊzSsM'h6ѧaF'5tD/k'|?ShúCk -QрCG r+wx"CK#D4|tG$5%Ԭg%!Naw,GBUz<\J -!kΡx4=nBSHp -m0=puhAތLG2W? 2_,y$ý4Jid>s޷z/=o^x;``9(Z_7?`KuUji/ӓxmf 6񊱾  g|I,$ -|b}^!7u(S!uMV!p#iAcaXx G"_VUQK#!RPYgzHOvA=~ڀR涰t` -=>&qH:)x(OQ(B௏-#? 7$(x(O%b$z9#ć֠_ef}n{"6u\qnu{͉Elo>`xmID mv򈕢64-\BgA ߲zg K◌ ?*fOc.?$x[;GCJ$~K!WAb_0ʩsȭd=]PD{I34>z-¸$|Kn=hr Sܜ溭bYttEcn]Z4&XҢ1W!uѢ1Pb}?OVw}s@mHl1ۧ?~9LX4>?[|/nTemZY|q %D,ȜO88h筟Dh;EBbnAçoĭYqMH'zq9ʭϡ}[p =\t[$)>uXӏZ $>yxfm͐4N[BQB:Ve.-X|ԑſ+o))R:·U-I|UfKG[vfYiCEo Oxq\Dg~EpiV-mgUpNۙo\ ji׭ ީ 21Y|;B5\mWā4B7hO -zhӃ8-Ӆ̠m[֌8I9`=\nSҞ¸=]OqsSi\frg=P|sۼ=YݩU2ʝ8,#_9xzOx?6w-,s_t\q{ ~aQs8,{pD _~iь_UPE )6~G[NGGC[(G:?#B5G+']/x6jO26?]RKq-OJ@^^ `pw6/ND$aR:}i߭ۑ\cZBv3\.ݻ}D%$~d+$~VCSѿ5?s^sy}A<Xڵ hIvy;z{Ӯ]-smz$m6={`WF]GAsDe!,뵦]B[lvBd-]X3Kt#?pwY֫+|ź|K9k95wV2`"—L"/TW"Ռv>rK(4G/Re3K#܂O7:ZH'SL iOɁHr$OR$lgߠ#u%~sajfM§͋eϲKyӓ-@ⷜ 8|^) r7EГBa];lf/kv59eF2$z w{nM{n`m qn͏=7︹5H|T/8 k! os$>:z%DSmkhx{jm S@[ZM!hs(|xzz7*osܘs%RXcK9x? 6qs؈sm~﹁6?87 $ݓmyfݓ 0w{vc*SZDzc;ou³y4Np!;qp ƬĽvbs'԰Gެ>O%7?>RMMǿ|YqHq|>s}?~ڟ$D/gDy^'F蹲)hjLQ+$o&K[n%H][[=RsSՊꉑ[=fՓ-[eb.H| . בN(&ɞ$Pz~HC[=qLo_R֠s --ДF9vw͏Cr~ivPOo g((F& +=_[FiAȁxFHTH(hWo{xޑjdIEāv/$vgs*׭'н>{/{ 5=7lm$^6J׃!U}bﮯ;zKՐ3M#*rY|sND£K7t{ h_oҾH*~vo$>B EjG'Ry96YDSI|h3??*2?enXi+ ٰ#!Rk^Vp ? (߷'rp(?Gyu4GNH$|Ȅ_m>.Ԍs84>$~]T$~vD+0^xJr2nwנKC.7{wm-T4)P_ڡC -@2ڻ+e5)PxPKtnpU͕|eE > N!on6 FĪ#@'oC D -ZKߎLGb?G8ř:Xj^7^ab \IyfyxhT9R8r9{I|ǴiBt&p2xsGJ Zk)$H!]·ch@\* -m?m%pv qCJ~%-6=H{@B?~b~ue?UD/t_GҒ h щZ^s2NdRǤj.ć(NNCF y RM Gq(+Wb:uH(P&%$~! -4ODy@V_R% Uo ڡշ:ß#zni;N{fds4y-2<dI/$R&빦&$~J!_Rhj>JgYfh*C;52قLOƕ~ -hN#;| $|bG@OeOy$Hu#o=E;3d0bAa.t0F$~塝*vf~*M:?Fx;3e#|slyy!ad#rL! Wg}B_ /!^}?XkQ4~I+ -DYo'aK>ÚԽ Ϳ}k6[۳G>A-WJ^Tz4εѯWƵ66~4Mq*moMn.,~^{p}k6=4mz+{#VpAecAZ^GV{Xӏֵ30~Y23fGk=T*Q◜<;F(2:֚ -_.hDH׺wIiZfRveF}Cw&y8kѵX:kˆ/ -kpLhk.aGf7o 1]fH>bm6VNgd¢hus!Hvf(ej()&%Nm7ivOIаSv_I 7\ ;̎a!5G=H~ݘK3OYe?I~_']Hgy,"zixhZK)M:|a%@DQWK4mBMϜKL!|saJ-osi-Gϡ/%qF! -8YWS4g )PuiGR"#)Л6bT)?rW@4/Y%Rߛy8|u v#_XҾp[|N·9+J+F(0fPjIԛA⯬2ᡘ"!gi?.O!-Hu@/h;Sh =U q0FR_{ 9H hmrx÷o:v/1>~CL"SN*q+r ,_&mIxP7&l|` _?`*F ˠ׼_n3a^XRv,Qހ^75yd esӀO5$> *|-H£:-$޳s-U7MT6Aa:mRxGN7h[[̕R^ -jC*'?jo#-k{Iǡ2в#m{[k*qxq|}GAq{ 嗵/\Ho /ouz_GQ|0YyJ}݃PQ3I‡L*2H[=҅9F -_BߢȞ'Y "ssItL⯄:m9 Fpn6=b8H0@B9>rD/ri/[qN⏄drw!n3H\hY$~%oAQ*olޞjHoQp'? -or#! kh%rHB}CGB|A<C/(Ւy[r>9)Q;{W_m]Q8#/3>mFh/Apr> xd [0k'-9ɑNB6&_%I|<]M6nWO, ?*ŽĿrP8|\B,x$Ji i‡QE>ZPUQ+)`sNǘ#xDF?qrx3FRv2Y-qxkDVUۋ<;EG$a-N4>B=x!GҜvi0#[B8|D4riH~hKFBT՛LEP^zEC9`$4W_UÈuHכ#[/=JF^U5>u(tկGnrcVª,GRFtsSd_V~Y)c{ONͮ7&RZڸ:o6^$| ҕ0͘btr0g=g8H׈/QH#CVG-eK\Hy_oYU7˼wuJ^89r -) IF㯋E"L7b@oAGZ_0¬}o2 GhƏMp"ioȎ"γ+xDCڝוFHΆtD/zVOdދ^9|V,aᏊ5&a{/ZN7)dq\ :Ǔ-1WD:eE`]e v+!W"F GV?a]N{5F$hfFv$~(uNs7|^pI{Nc}H[-Z 'QciF 5TCU?#덤ߢU# HxwI+{Wc5`4|:Ĺ)瘱e8-IV4KO$AEx+qi_=K6v m'tف\f!߆pۑp7}-b۴QHY_icS*"F⯊Y7Y v`Ϛ|ۆB!՚6ڲaEYڹ -LY{ _Uy!~,>:ж!l&?o6? 7ѨvcBb -UԝvBV^E:6N?)H$ѹg{Xfۚ0gKrDı`=\C 2CۚaEC#0ZP-Ӵ7LN*+^?+g%Nj@wNSԊwh_;x@'_~TKg5 G s/0)<2 vr<5إ;,He/HO'zKt8q՟`(t}>эqh_i4!GS)t s-[MAMn5~d"!p)67B/ep"D8t9F÷č P6{= p)(=!!_i=O1$9k3^*$zK4_)xgkÁPquLdqu~`l[@f]evNP6y.0z^@\v;>p5m]V*PHxx6xwXk,a=h{Gڪn& Hs0Ɇ3 REvnIBo&Ty}s_<_T/2o.}W=~gegeυm#rDT;[/MrN@0[[ S|Y9!c(?.x OA‡eނy$O}gQ? ^qoëD?»caWiyh[?L;+PpK—Tsy$ʏ $u/:÷òs}/dr7 ,; m,ʵ;&a7;iI< ;u:fH|t:ɯc6ʊH|@װsxgkhSX%8|v&$|v&)7k;C\(ʣVY7pٹC.sײsPAxN״3-Y'Nڱ3#HgBs#RJՍKgJ:on"dA;?]gΡֹ$|xTCuaPbvhF$&cGXِNϑ fIxV_ R5'G-@7gᑸUEJ3Nۑngz3$ܒ`~Y<&va}ampt/\8)Te%xfYS_}for"hVٷ6!NG5%~rԁǡ_ ;NISrʙAחBWC'? S{UV=|8#=2=5(8XGSNh)sS]C/D)x4TDOic%=47H8zP )'Qàw?IVcoHã!S#dHC$b͍1ij:2ufs+9Ѓ"~e(xx>KFk7|n'ߒQ( NßEP|F byJp(@z ~fZ|=rɓQ~A?/oIs|L/=̣" -/2$?=aG?/>}Og?gcM#Xy̞ 6"#u?*u|0^ZlPMm5;_r61۬G7DNh~T"GSO)A7G_2~9|lp#Sʐϑ!3;?G@Gכ![r:EKȍ#S7%&rH'G<[ߟX;'ڂqhN}r>8<{@6?9&WD^Ы3iom{tvPYjQ3ЩI|;>ryv,DM $u=\'N<*:$~S#V~%>Q< ^$$ٵvQM;ޢh5Xr(>}Oss8:Cr?sr⽴3-@>ڡDo(aioEt :SAIo.#CfT9+ykvh~UȅSo<{>q.ިq)ѧV =A p|ћ~D9R2(xTqbK$<od>( aKh&| 9xMbn|9b(G|pqd9[@"\ZShQ,);Fçj9TZt?P  4)xq/J8?>,t*R[8x_}wD)Y;jެ+~%㰎g.;HKGƒO$tP/B_ x"A՛*#"QlguZ%:JЯ+P#hqp(xpO`=QU <6g K#Yߍu8Carq+KiZ.4h-pv[.^/ -BN9pv;.6c\anœ£b2.9x#ߕBGhګdStu85CB\e>S \}GW?&ڴ">Y |->|S9{w/ڮRedQ0^[zi|5Eu\WY|SOn$~+{CCܜ6zeÑ_U<>4h4xK◄7K'jsA4vCx| &'.- =6?Xk~Z֦яAC*>z“uqQ"T(ͤۓzd _2pe'<"7@Q 똃OGK7#Z_&9f-v3kآgJ"SßsigŤ H%ÑJl݌ ->  -dqrzȝOtۑ3㴈dصEP 1 [L=IB'mr I 8@COCmpl@-20^֛z"=/ 3g>#iZ׭_=kŭTG*Q};su _[-TfMk395U0yVc_{)>/43ZѯW:ľf/H#IE) P%h =6-x~48YqMOvӥ-*)[=^rn?%,71"'x j=i]gXPs0fN8Κamΰ-5gx=Z>:qvZI:NdF1,~J mhX-i;Cکr5m{h~$G;2HA[24aJNpա]`8M{ qx'iF8jķ#>dkX{ gjhw-X|dk/*YڴG֡!qzoWϵMmM-KXUr6*i[ѵ m M}iѰpЎ7?h8.[Q8? ǃWwmgY,Y,z=[FF؀_{f~f0Ʋ(MI]6NoY/}ʋRRy P Z Z(-՗B Ry9P!Z//o h8Z-H %RyT_&-JKB}gi\Z0-՗L ERyٴT_8-ԗNKB}ijZ.QKRKB}gjrjCT_R-w/;VKRByjZb-Y ݬ R}TL~õT?lWC{`'$Wٯ]毳k}/ڵT_v-v-՗] ݮk۵T_v-_v-]K] ݮk۵T_v-wˮk۵T_v-wˮnR}ٵL۵T_v-՗] ݮk۵TٵP^v-_v-]KZZ(/ˮk] ݮk۵T_v-՗] ݮ}ٵL۵T_v-wˮnR}ٵT_v-ԗ]KeB}kkZ*Z*/ˮˮnR}ٵPZ/]KeR}ٵL۵T7ofWv1Byl~e[{uyLkc_׶Tٖ{$6#V?_WE_]ե=]:RKئk2n:}g)Akh|#yڇ&_]k -GLQCz:M_MH-v -LUmQk([ΑQeLJgPw9٧bC=,L0Sn?3;%m۴OP8&vEg- -~qhP߾T"!ss =OV~ 1gcZO -0{1ϐg?5w#L\c-΁Ƴwc;O 0?9O3J<Qg`#T[֫]Om{B}mmLPA[-wЖo 2 B}L~PA[-wЖo;h ";h2 B}mPA[-w;h7h e2}mPA[-wЖo EBumm@[(-ߠ-h7h emmP_-ߠ-wЖo;h7h 2 B}m@[$B}~jWǃ_S =v ėD2o^/$m}寚Gm7-5Y[hvmBlK pږ ;nKBRܷl-4`7nBrK p[jCЀ-ReXnB6wK p[j[-՗y KboT[h˷TѷP~۷o[8K p\j@ !pnB6K p\j;p.R}p¥ÅR}qT=\hT_".$.5M\hFqB6K p0.3Fƥj{1Goyq1[ܒ65^m߻q=]ַG[8PbOQO,OD\W}6]Gcv|M/7a{OkG+cf%9e/J{Vk 5{k=gOB.ԟK|d=_o=A0@[{ 0Ӿ8@}ZL8=(ږpG*s(%91j ol/2CUo+@&_pj6~ w(?Œaj=Nb`%;o)xJؚߝګ\~{~ǰp2kfcaimqF6)ڃ:B5Qvr/v[#u#v71TBvcU),(P^%#5;A3 LaLa-r[2 lb 0czy_-vrږے,'۟@fߝ!;._Q;ڰ;N^rsMAڍ=Wcb 5[{)kg߻n~" -%ByLT(/6ɻ -兦2yP]d*w1/0KeΥB2uRT&/*KJeBy9P~1H}+P^H* -E2yRT&/GQpT.; -%2yQ\T&/KEBQLT.ɻ -BqqL5T(0T. ; -嗄BrP3P~)LT(// -2yOS&)_)Swʋ>K>E>Z}.}[so\,`-lxZku/E;e[;N[T_)w :9bNRN#T_)wK8R}T_)wݔ 7nR}ѦPeS/ؔoה5RMT_)wҔ/ 43LfJf -eRyQP_)L;T_)wŔ 12LT/o/ΗR}PR/.KRn)_l)ZJZJeB}T~PR/;WJB}JR/ok) íPB +x̽]IrwO1ekc3#lB^օ$D) +qekޮ:ܹ=Y?q"NO?ο?ҟO秿ԟTiudr맿Oogw?~O/1~?9hݟOAͷ~?_۟X 8R< XR}u_p{{$4>dvLǟ_.o>q_?_w?/_~M#I_O>d&E_qc˥SYd|β[NmSʢn GM\IۥedR=Z-f;kGܳE+pBL93-:ؚ% b[9uGEXG?)e:9#kH #keuPzV^Ru5r6#%ceK%doΖ#c:xXvjM&jU%YgvVI ?52z6ĶYs#IUpC% 59@BhITCvd Kq7%-d5Ҏ>RnZrhe#U=Y>Kt h~Q)aU_+U +DQV$z$=XaagXaX,C%V~#}IUrWtI 9"}+35;jαcοZޡ}_%$?xSw@wd%DI~iA!1 ,̨b RSrer&!KbQS8D$~C8 9[4Ht/ZގJuB&KNnvqIieb \O#\M +_2pb> REzȩ@rD}H)Ϋ(P pmP:&?HVGR b[R4 d#4dҠI-;J%NZrbCH8۵F_@萃wXGNR90p%?*J;6{T\$_$~Hvorb )yBJ>) ~PYߕ+RqB -`g$!Lqj2F (% o*ebUGx$$^ҥ"FN@IH+J 4h>rLB*H.Eb\LiG$Թ`skI8M V!!dM&S$BJH@(9)ߦ1ԣ?O/.(%CKP.y!RT^0&AϖO5gnh9"(8|_ K S4>ņݕGxo/@+oGrn]#rFI\k8xwNVxq~6+O |$~ 6OcHrf+Jp޼#>{y "ri *m$~ (x?GJ6=8y%8xuSMߐ"bs8|Wi.|$~6288s oy8t\Hm^Hҡa/`[oh"+?Ktx[)w ˛Y6?j4 Pޱ9(ڱ>~6=*}MH]کNAۚ5pwj@:i̛ͯoozhک~ÛD4wjlwj@% YZ( ƛ#1S3fEj;FNy&PP6={@6=| Mg +Hi~cJGR1QUuYAS೿'-9?;Ƒoc 蕃G !MGel'Yo? rPזON8 +CͣG8r;8%[u+Nߘ/)_uRh်6<%5(WSźzФP"mfXTmG@5֝vpbInΡp70NofInTp-0"E]oent֕oo0p+ ]GYVPvo0g]In֕}MԣѾoRuΡ`0;lGoR +n}&Q7hCsu#OuغY*,zEhi e]6с5HxotҪD:#}#{/Ye|uDǜ=,‡KD/뙍F>ֹ}57YR /T뺉b]7ñ|-YMp4P8qHs=R82&Z7H +}fq48&X͛ı,$?K7I/*㧗z7>u)mAۆOF묎O?:S甐`繧1ϟ~ӏ2nF HmdmjHxWq|,|J"EiɅ; rTqRe[&"XS8cW'!57-57zpkKG?(kno,z㠆hE$/ 4 ]$Jubhmg 7C~Ph&k(p-= +>`Kj.zOF&!c#VY=hv +Yȭc/GFᛣhc#"&0Gg uPV9P 4cMp%m_qc͎*ЯY@$k@;uIϐ+ Sߑxh/,hq W>\Z^ b -IP ב@즦 9F]$iԫ˙NlP"I# m$RW-X͛I⯠4BE{?3HIt//*H/;:$нm\> yw7/֤}SվqA~A1yB_fƗOIgv:r# 1&h\E·X]wD +\܈9x\w7}A=oi ?b0&} +(8=gT2]O[MDCΫ#EK+ZH6 fHxɡN'tX 29>* +5%$tY(HCźY[> +>O$<vp_k'kLI"GEiWehljV," +Ar +~e0G&o63FY_Վu%r,,4*.wc+d eDL]Xuټq( +8lKeblk +q6,9p+HXκ^Y/E)~GC'N47Kl@Hź^8|Q CߍLGk< Kڊև@/[~T?~/oKHK)>R@ S* +))-+AL~d(|(2$~˸Ųȋ՜GȈBSr>:("p#Gfݕſ6EB?ON>X1%^\H|HE>Z,cnS4>ڨ $߆AV5?Gfn#r9cJ lon#w))|h$>|,iPK \'Kߎ$zYqx+=DݚLJxhVO5xӟ*s3%/*J +^֥+~ + 0Չ}&Dx/-\u|)iW¿`)xH'צߛ!VLbG2˟kJ%%۪%G)W_Φ~ЏO?U'?j5>~1gf Vk|EpA!K#KPnv{r%i,GjoҾZ$AӾF䗂52A9xRq +][-Rī5doW{B+7Y,#ŏS/DbOR ?CG%o|T72 }X=>ا.ڟcY/ğ~,$F ر+Oe +>:9EЖOh+븝q(݈ro.[ߒu^]e߲zߢ[?-@^$ sss82MHR$~6V) y0R~~Ő¡KA$c +7/q?LCՃf>$Ym-Y>~ 6"K2On]=1X{._mT+V~~oGwy? BfJ0H{`+ھ`wھ`_ھAh>$NÛJ\(>eQpТ=^\Ѕco߲G,Ç2|_iXo'ڰ)X0(HxCmPcx[?L}x+&IxJ_xn H7" +9IH$~s*q\ۤ)9[Z$'Ǘޫ𬧱+hKfGl-:@-&5Rzh.궬ϐ[K\q'[ +A{f~]΢DDzfV~ 'E>ڜJ5Bbm7;5NnO!현oG7i7 +\N{גS~XsoGYso!h.%=Tcy9Y0LDɤvzZZD*kC#1EY#o[ +>&'\Y_ .8ɚMGja%C8!+IS7<;N{ƺB-G.kwk #^\Җ,X͈cO ^.~V*묙MX7Y(0%GFXH78#diPºA۝Ӭ];EAحMϺџ@}cn?ROG?3DKrifد~}W"|z)$F,~!{]ipz:qъ;8RWA6 ,Y [BO%t3,B`}WCUAy񕃇s@،Oಾ]#T #Mv{@#[ +PDO#P!#,Y<(ЀD  + HkޭdrW E{Z>eXvHfCБ@{:,[qt +Lr|uDVm[;e*GOjђ6!~_.D>8A鋍cpd mn*hZú,CAJKTM1X NZq-P{? |Yl]IxQ5p#c4Hir-(T1$QukзOmBw@<~$QA#kr}N=/HM㷽yѢJwyziE}57x0処#:(|68WpaC&'_=B#ⷊC_XXAw"Gj +~߳mȞoUzHy(OWoqmIS+QrHAzJ-zHO۪,:jb3|r"ϯ+OO|Bq}?ՅR🵧w? #ŏSiO~|qG{FyEBښwEz^f; +щceCiٻ| MGw:[N#8qsh$>r +2H4 ?͎/Ahp8>RQN[E+:?.3 +?'q?פ}Ep+ Kιx 7h$>U$.7@5s0C܊wC[*g{$pk$L'ohGI$~;oZ XH-&> WXd4hQ%$~J$-s!Ïl9 +J5$[z kHuTN-+HDj%邜r%C˗+LՋ +1bӤTQSSh:'\OYieq-#s7?h[j~_ˈI| >f;5i#NOXr>n3pm§aM?*(u+ћ5C8nHxG[{PcQEo֑򞮼<< +I\{fxW$qQVE.soۙQ6zf I|T%FX|D?T8o5Qў[9mg5p5 =\.x[ 7Hdai' peNj8ߠ=](MxO +2"ny[3*,>\pA-XqJ{t=OqAO;i4@{>ᮞRN~a.xEqT`q`S1ʞP? 4_b?y aQ380{pH _~iь_UPE )6~G[NG(HC[G:?$ B:6G+']/x6jOR6?]RKq-OJ@^^ `pw7/ND($aZ:i߭ۑ\cZBv3\.ݻ}D5$~d+.$~VCSѿ5?sr}}E<oXڵ hIvy;z{Ӯ]-smz$m6={`WF]GAsDe!0]B[lvBd-]X3Kt#?wY֫+|ź|K9k95wX2"—L"/TW"ٌv>rK4G/Ru3K#܂O7:ZH'SL i/៉Ht}sd>e w]^aJ+uj5V]רjXǧiAq#[B I'hz>M§eϲPMyӓ -@ⷜ 8|e)W+7EtBa];lf/kv59gFV$z w{nM{n`m Pqn͏=77H|/ʉ8 k! os)$>z&ESmkhx{jm S@[\!hsr(|Tzzz!;*osTsZXcL9x?ܠ9qssm~﹁6?87 2ݓmyfݓ 0w{vc*SZDc;ou¼y4Np! +=qp ĽvbsG>O:˿>Ѓ=%ǿ|]qHq|ۨ +t/~R|QӟKu|Q6Bf-r~rH/Gto~ݺv$o|*zsFfh%j#n?,7}%=Cշ p$ZoD';/}myzWo~YR~*gQo}Ì=jH,B-"Qaw?OV 7T\]i_ot Pv@v{pZ#~,b$>4ɟB52 _~lȑ5Y/CnЄQ]qȗo9V]pȗ<~:%s~og$>dBQD6~jNBعX~T^WE._*Y{Xh;GWVOx&9q7޻kг!ύEVsPqT* ^ϡE F沚xD( MhFȁE{wE<*%:^O+qJ>9ws{ͣI[ׁ4L>IGxvA[@#_bhy~I ! iEA%?K\#I5H@G>7Cz֣ S\Z8?Rbo%>#U\dm1m~I|d ^ q Ѷ6?k3 +?fl*:8->׊ÿhۏ)gY  "H|\_I M;F㷘_YO{# aב-KL)Hx~*b$ 61Z!<3*ӐPD§lަ> +}Q'C?PO4~8tI%$>rm!_$~hB[łvEr-爞[N⇤Ӟ\isOmKⷌ"*O>! yԴz n'WY֩N(OSou}%*;ڱN;5, ⫴X3 GmS*?RHbEO̷:i:ŭN.XP ݭN6 byhg䡝iΟ%#Dޏ^_{21M7Y7(SHW$`X#\Fb$xT+_>'QIpa~i#9Gi?,mO lK oWT#M㣅-o+⣃͡lu6`J[h`{hߨ'&E[M5M'PY|Y:kzV=/W_s6L6iovGBf,|>EJT%'Ŏ:5{;뽎fhBK)#3?]{6fٟl]} &m }Κ}E@ǁP-Z iؑ>ٿ)jEwC;XۡM>znh^{2Yo@ϰ(m +܂`s"vm~j(IvFnMu=D6S=:d/!cw W4c?V\@~r{=8s# m㑏׺sO6ݺF:-c]MK÷rGFӺ_pHi-Go+| +~$ +$XiVo*}4_vX|?M٠n+3Vo1p~CtOFo9zmh(6o7*QerĠs#63fCj6ۓvK(_7$p2&tbK:Ɵ*h8osex_!qX)f8v1݉ Wcxj$>Agn?vB⯴e[ ~gz?__dx$Ço?J*?I_?~S?Ͻ5QTOi?:&F,|I$>ӐIM9c4~HN,> )h;Z"K¯AT?B%Gq?]L~$.5H f0iX,,BN 2('X/5 .yx\M?.M$~IWaB{Bp$JI?RCdѳdQPn8P(aV=}#S_P4W&s#E÷˹( gG Qv70Վdж6F^S:ȓoE&\Wdї?.#Y4 gwE;Tym<__t*S)=wWg?̋O6/ 9mI"?s#yozwǜ_(GQ|0Y?{0.P95n9%ׅʊ w!KxFL!ӓ)m[>{`S[>RqK⯜E%p%хshǑśdh"GV7" +$> !$|Ȥ"A_ܼ3.]ȏ#"85.$1-(8Y z"+";7;ټV$JӖO+bv i-AL!ar>,)jA$"6rپ$HAr+h|[<ͅEXvVmJ(A +^w~g*G?A__Z"wH}u|(]}ݟ0^\-鋍bz~>A??r*H;Nn4~"Wnn!'xiM/ +şsxؽH.~LY$>.brYzdw%tͲ2~H+9kQ>I⯔r(|$\dh QuF$~ L9x?~ON$!:c$Ui'C[GyWM$~-`Ux˳St`zDFhռŹE[=wBU4dÑxмGD)tOΩZI#у$iF 8%4WGD#ڱh$4Uy$<-^Dť^$:dC FBR~S|UM58ШW/q:>ՉңhUh(-IϪjHV}岪{d..狼^R#m#1wl|1JlMf-u>(<5$~Hi%q^zDߢK$pkf$#x])~c$JW~Ç;cޢ-$amÞ1 Ç?_+DmÏ#i7ŏYMH|T~".}pY"c%_;gIf83ލ)W)$|Hܛ$ ?.4߈ў.} $~IC#cO } $M?j6kߢU!=ދ<Ϯ iwj#^W!C:hM[=A{/5z}"a[]0ՆO?*6ćy(8^;oߔ4~QJq93hOZ_U$>j-mt!oGǃۯ_<5l'$\nmt9zN)Kc;I 7C]aaG{57'U@9E㏉5"KnGh6(3?ot-3exreG"z> F{Y߿Gկ'վ>%gߨڣ1ոaˮ㐤ӡM#>nj/1$oMⷢ{-_Wy",zƛ_SMNc9٬ -{+Y 6ŏnߎ)SlYۦm掲Fi>eE[a/C;n06O!B$[mu흵tQ]P"h'O S5U<ƿ)=Zm|6Xִזmh '"dΝma{P+Y Gvc߅ a7yiN! 6e5;Qc'w.2I|$smC" dM=hÚtք?_kx'&B$LX 77-Hgрo)}arRY*!8oA moQ!nH05ڍ9i]N7}?}_?@/jT*xS8$%#<GfpSn` ft U9)CoI.'Z sד'z2m+b:d$]ȃ*,Ծ2ߒ +IԤ +YSG& bs#"o&X 'BOm4|K^h*q 93 a`8A"6u9BD6FOq +XAEWW +je:g7 h82=u4=#PceMan2{uqX~كw$|:6xݲ 4l81+ʺ >9e63i =?O. dG2LnAj"8FRQk}ҁ>Uܺ?Wo>D/PSGIΕI(xx+$~J/ ?G4ww?$q%Gq]!8R[AO—irPJ'z㱾k9n4m& GZYx7t: +;-m뇁g*pI +k?Z!%_1=pRx]\8xwνؐ%݃C}f}g_$<;i##9;iygWUG ·3uF[(ڙwL~;mKYDD8o׼32pfaiC9TRڡK;_Ή=]B?;$~T~ <Ӓ27y /\qxJLå({&o_|( |.`n7GZ}QA١Z* |YeC;?G%b}(8x;#cB_ڜtuj랅GV=<;WUrg28: [AK7(D1/N4%KZuA"wGrL[H ~̓"57Xd>-`L֡pέSB8yJT,%o9 T|KFS;A|5~J &5Lw?QË'sG)( "%ԋWQFG`>%I>߿)~|J['y7US7yiK26ÛG aη I$%% ?ž-E;#WnZ(o.[,}s)3s2ZIGz!tq#CncE@ <2q>GKjšuڡ1Gku#{ }iBF[@_oKap$~>J#mIͿW9<*&Ln ` +!Wq#>Rm2O|_G-f-)+[~SN5"J*B T~Κ¼^zT:-<*¯UJOEη$~IxCMY!.$~I$Jcw`;Dmɼ 6'/- m=6?`k~Z֦єAC+>z•uqS"T(ͤZۓzd g2pe'<"7@Q 혃OGK7#Z_&9f-v7kآkK"UßsigŤo ¿%ÑJlݔ +.>  +dqszʝOۑ3㴈tصEP 1 _l=IB'mr I 8@COCml@-2߰^֛"?/ 3h>#iZׯ_=kŭTG.Y}?s})/[-fKGRO2ǟ~}P;uh=LD4jb^hlgĵ:otlU}0^8G,7R +J)zŏ#Im [4aiq-F2K[>URF{Z%,~JXo+cEO6{Vdϰ- a8;Zp5ڜa9[jZ==z|9u0 ~u69Ɍ6;c4Y'гŇ5Zv4T=kJۘN0AM2 vddh6'?78Ctp6@oNڡg^pՆoG9,|ְzІ.}[0f_U8i㏒C;CڡgV$>,gik9N:a9Z4>,gc6=ūlT,g#Xk9N:a9|*]K]Ke2cR}ٵPZ/]KeRmByٵT~۵PZ/]KeB}kZ/]KeB}kZv-՗]]KeR}ٵPZ/]K] eRmByٵTͮۮkZ/ʿٵPZ/]KeR}ٵPZ?]]KeB}kZv-՗]KeB}ٵT^v-woˮۮkZ*Z(v-՗] ݮk۵T_v-՗]]K}5[>Wή5F^5m1}ߚm>6f'f[?iKL>le}<\:s? Px2>sLss˷ /1IJ#ԯ}d3#%ӯ%iP~/`74y~_~-[@j|sjP5"ԟ~f qvL GhqW ++=QCH֜/[Hsa[smMA}7a[sqAP/)t=W=Rm:[D(_(CBYf͐K7olc1m<,JJYg0u /f*.Y3|QH6^aby1}{|8 v1CZxˡ3o m! 69{E/ƳOc+yZP#Lv%rw[zKc {v{m=Wn?d;Au‰ֳUc[:絴EoKφ~-=_*wKǃ_wzb][.-h;%t?bP1[-?-w̖;f2B}aP1[0[/̖;f2B}l0[$2}lcL`P1[-w;f2B}llcL1[(-w̖;f elcP1[0[/;ff 2B}ll0[&0[-ff e2B}aL`P1[/ɿl/_wǃp-s #W,:ﶇO^l}_l2ymG8i 8-5Q[jT[-՗k lK pph[j۶ЀR\8o 8-5[hnNBqK pN8sK pp[jKЀCRdB}n[--x ]NBܼG8{ 8-5[j˷ЀCR[f;-4oK p.wp\j\.K]…8KeBR\Å.4qN2ޙ_pMLK\ܔBx Kݖ]|}Cm/VI}Dgӌf>|B%ssv1a>{$[J%^Ƨ+ث-~͆N w{2B@fLGZ~ _/BG&?jK?º3Mʠ~L[) 71'(oTczJ٪sSO%Ԛafט~V50j~~I!k ͪ= 1&ԯ{gXtg +PLig=顾Yt˞]3B_+XP&?S?\ }Ok۳>YɞAZkckbެ撨[m҉P~bb~I-V9!v.0\ۖ<1;_alB:5?apbZUMYɶDݞa_&7{wd}ڻHZ!{]㦠-vZ=koɺߜ|8ݟT(/>KOeBy٩LT(/9 NrSP~P]h*w3o2 +2yyP]\*w- KJEJRT.'; +奤2y!P]F*%BuL}T(/ɻ +兣2y٨P]4*BuLYT(UT.DeNB-BuL=T(9T*BBe.ByAP~;LT(/; +e2y'PPP^))R?)uۧq{>rOaOS)՗y +<OOS*S()v +:NKT_)՗s +9RN#T_)wK8e8MxS)n +66MM\S*ƚRByT^)iJDS)՗g +3L0S)2eG2L;T_)wŔ 12LS*/;`J_ +ŗRRyP_v)t)w .R}PR/,e,˾Ͽmp1{3mf 2D endstream endobj 2919 0 obj -<> +<> stream -x͝[o$qFWPH{-@`z0~Ků~.ߥt|7rwf?~:}t?}wIw9}fg_~f5%3s/>~/}_8PP.j.(YsܗIumzwj}[O'k^;zF5Xj/y~]}tH3wsJ/?>>WrVtzIIv?^~H:*/ErQRHWQk+5U޲杚$j{yP"ý4 -?FMܸL ]49*-N4Chwhn,Uq+:XN%S" --Iܰ -:ƫIiuĴN]TS5i/Y᫔a2dD}j1ҳ)57$ѡ.UQӳ ]71OKKGUrFMudt?$Ujӿ:Z߯f6IV:sF ~[s?d -weP|ST{]Z\~S |\z15U_%žuH-4fdXbnؗMOc=KWvu`iR_%wHQE>FA|F 0QW.],c|k 7 Ʒ$`'*ihT Zpb2SW.+. -ǯ*,6%Pےz}9IZr+c 7Cj۶1|/R 7s}02Rn6X-Kة&Zl+9I-j@*`_ԑua0c˶.+6|P-ۊu1Oز,=qD;wjI 6e[CZ -fز-šHتز-’jū:uжz ~~][F< -l̰n#3Lm+4|;Ͽ{ (6" o]O Qjx -}+|4uݚ$z~(Rse[& ׶] Kf>h17iG𚣳"r|{Fm>Y+bjͥ: z1q[(|UIz oIeU5f0!=N 2W RVA2V_f]lFMq#ABF-%iF+ǞqcK=N-ZF[ˈ){ t}2-K-Լ">c&nsz5.[o*գVл$jEQ_#( ux6)6~!aRŞVemkK M]Vi%z/' $Sc%ډQ$CU K+݉G{J|Gܔ&|͒JJ JiqT!UKmrĩݰse7ɵD(RC=#2&E5B/?xT/TmN-^u$a Q !LG1/SԜ,[ƨQ= -vo2i_}CIkS2g\?zy4S[y\U^fI뙔h9ۣYev.}P9n^9+,G<ЛV`9 -oQb%7|ݯG4vZk` %Mƽ*on_@%z} J5= lm!f#GVCA=2%Qߤ`SI|3*:n+Er®Så&$H`!0&9mIh)v0.Kl{6S2x uzp-p ț7,=2*]S|K5 HU#d)@MLk|> {"fMCCgۖ>_ ;ㄎ϶Лo%a }U QGg_]WQu3Y#JOjG%~Zsޚ5u k`W [l 걁Ɇ.?lgW ;m ja{ _6u0~7@qznY _]70w@zW 7 ~u@S D7 ~5@ՁW ?0 .@ՇW#;q ~8fw@Վ~r a%¯7@ٕW[}9~50ՙgk{s ja{w_9 ρA֢W"vpЏ"_dqХӢ]"eL4F %mDz^=m=i>};]|K?ϞWpgJp_ޯ44.}{0˾Ⱦ,EOF+Vnŕln|1i -5zx|U)#j#n_fjJح{\u 2z Mlj⽋'CZ^ݽ5 >SU7=cNuas]zN0k5jrK1[QKFoMELKF]d0ڨ"IR.Nm4j-z̓SYB7Ic h9XͅZD 6t$B)^#ÃQw)6m0F"rKk-QEtGaRC7LѻeG_4:|^ݴS9#-Swwޠ;-&Y讒ʠdQ7k[c4eRh9Lݠqi{v:[Ͽ{I}{dz@8c9b=h9q?/bNV~l$k`{Dm}%z˻;.t$1~[s?> -WCAckAMcqFEEM0$-VQ3d5Iű*(ca/agbnؗG]c=KRiߢ|50H4)ǯZh+- ޒhR0fy+SW.1f5glzEU0%i;9UICԒ᝺rYq)V8~UqWlf='~{tQK$gjq9;p>bST\IYKi)0Rώ-ܢ7Kʲ텄aز$ml ~#d-QgZ$c˶+^0Ŗm'lVJA ~ܩ&u]0-")l+8DTa˶ -kܹز-’jC -ԅ7CKZEdK-#0lٶuƕ|l; ߎa}a?Jc@N۩p~4NUqT -᧨R?5 ~YJ!2(SQ -OR>'eKO -᧝/9)nRԤ~I!2%SKO))_NR?~7B)$GO)_2Rr2"')C"R!' )CR>% ~:H!/)R~G!2%EzO(_Q? ~iG!B)e9 -ѧr/(? GBnO(Q~r24hO(_Q?-~JF+I}3E7g_=稖%ح R_Z>voR- LIO]H lh-gil ƕxZT swJ|ن w\^-MRQg9EF:ᇨ(3|5i:]iXifAĭcuBxJ$p &Iة3|lkܯ3fU3[jwTC Cܳu2|O-!|:VCZ뎍1sR=~O?N4E$j ^}ZݱS[5(aع؛K< a ;E%ҶǝZd{w!_C }9R"e|/!_C2]D )@}J/ "=nBK /"_6D!!2%Dӈ/'"RD[!"2݋fDԈDO"_=g%Sm_5w0*=Joս>KrϿ]OK$O.Ǟ4"H,c"8ָ :QO4{秃^v1k\u%m6d(vW%s{yCPzn~?4B!!DԠI?f,tӕjP5z,jlsVA-gzU!~4mY_MOm%REL.:r~S9#%눔,x6A*E{y/f{}մVm!}LMb 3j!QaeYC7Vm5亩!~j۲ަ6k(9dCEA ]1Fo6L#h/FPSH~P5Ұ55؀#j&d1|WIؚm/#jh4M< ގQ(GAvPү[|fPp>+C?hm7B#G? ~!4>2e|O#_G2>Bi|dOG~4>Bi|dŸ}7>Bi|dѧ/#G?}!4>2i|O#_G? ~!4>Bi|dѧ/#?4>Bi|dOG> ~!ЗO#_G2>2e|OG~2>Bi|dOG~!w#/'?Hw/9mlcMGMᔏ ~ -{SO#_G?UdzdSOG4~ZG~92isS?29B)rdO#_GOG+!482%pO{#F?ݍ}27BOo#D?i!62)m'g#C_F? ~ !52k᧬F7_Dz(J}esZ/=[}-Z$I]yH@yPQNmOmq6N 58rRO6уiR8m5lrFTo8fӵjm &90UzcSo-L4 ^cvokX>ZzQ|~ʈBzmfT |lAM$ERR榛lnn7UڦJ]r SĎQetI躣C8I>4)D";nqcYJRlnZvG.;lJɹQSS#F+Qb]Fߺ|S)[kCo:Y4v0*[ޓ6^"ܥ.gljz+G*F*<"|Zƒ ᇌF5IplnŵQt3m1C -lj"7&FD&uLZM]GKL]T: lr"6=BְQb Pzb衍厛Ȥotr}I"6-G/g GIpҶmoJJJ}mlϻK=|G6^I~ߟQ~?qꆟ'Mңɧ~guCU9~u?`?*c5wid> ~J3|24q51㗴+ϷU?zn_MFxb|cQnR ECw{Vt{ԋa|Oa>]/2RitO3]u%oֺ=7{|yLʪ7o27}՗]O?w]yniWoF7o~77|Wʻw=7_~u)pYO_?|_Ͽ|8dCVcVJ0wxcz.GV7,;u1}PgA3ԇ޺({}b&>QsSf)wyQM&-\iڍQeN)Dic!,q ߫ߥk=ߊYSM+mS<Иwi=/ ~a_V+6=cE Ï*Cd"]r&SZ-I4 +xyJNbh53dߥpoEc&ejV [ԙ<9~SPlf)Ibܖ4z]T-0(G[!|Z[٘KJ-,"idJ,[bͩ{ءK-ۼ^ ߤ::Zc[x4l[ (زͽJdwZ5yC&OlmJX! [eV)1[[eZ5UiP' بgܹe6ӱe[fs=̰ı q-5|i?0ņ23dAHW ?e!BCZ; +1>T8* ~ީəU"/%(|5["lFcMJ37.6knʰ +bgc llY!aCn5/Uv`Kn]bRYBd zH5KFj5CRS^ e17H (Y2c.} SIs] ~3[|g%QETPÎä6Q? G9ge]\5c/?7QG: upt_V} ~o,ׂgQk&"0H-&UE7Q~]ݤGlߢ3-w?v/^)}DL΋ɗs%ɬV}??4gwX[3[j^}(^(V#9%wYyCSu?o/kM8xh^2. +U4ZndMztc߲P0謥!1w5{|*e" +LF|Ǧ&gMtF%SW?]jS3ͺ$Ϛ,`z\!,1.QOhS[|&)6)|HNn jO)2A} В1ߋTM;Cwi|,$@Ĵezl@.siߥM>|vcM̰#NH Q_wIOWZI٧KZY'jjZ{mCAk>um?hdžM6w0>mՆ670v@pw ?[n ag ]7 l?h@|oi&pnÁ>~6@݉V{q nag7?ǁ!90'rnˁ/៍9u0ݚWo9 w@՞t١w?{t nҁK?hӁ;};x0?^6&G4U͝uQ!"#:faQm*So.ERo!uPǍ}VGͩя.e -q2 kթ5NFaSgN䙄YjA4-s<y;Uc!X ^x/2!Qbw'>F ,+E2Kk6A j:gzd3CWG5 u%W5LT u%yW7R|RWGթ#s§AkvaWꈹB3z;:]ɸ9R(齽}aruJ#;l},dXg.!ZKWwY>b&|:WYSAsw~E#Ͳ==30|Eo ~+Ҧ6֤b6e;vt!}JX)~%#1 ?#=W"]r&Mβр୘̮+!^Q6G͟:sY=hbӣ=(V;vp0kRfMOi^ɌACܜ7mֆ}u*cdﹻ$0(GnWk` 73=eKJ-,Bg=p8KR + S80e"}{ ~zl3}-YgR,e[y4l2Me[F[W wZuR kز-^C&l˨l-2-Ə^NZ)Բ-;زhL|%&l{Iկ?gkaݜDo]`\ o+ԑV +ᗬRT ~J!2)KS +/R$(e[Q +ᗡoA)_~R~I!2&KMෙ/1)^RB%%Iි/#)BR2#)C_2R~")C_&RD ~yH!o )_R~)H!22- E~/(Qܣ ~G!2B%e; +їvo(HGrBr/(_Q~26l/(ߪQL~F;J}3Po^KR}9HrM2{úYuZ6titNB'zw{_ a'R=\YT5}D)GySt[Ix.wa=YzGwF9ҋg+bK)=Gh[B9ۦ yUSx둒A.ά3Zro]B3'STGtY!4o 4mr 60gEfbGTv,";th!ʝwmZZ bH + Gy "ql3CG(B|,C`bђ R"71x-GKD`t!jQ|3Ӱc[Fܥ=zyۃܲ&o[nH-ϝ;5?L,wN`!wx M^A.MO&Ґh7U^[ʋ пIѯϺF߮-oDp/~k?Ž֒$oG"? ~)Hdۏo;"? ~V#"ӌ^D~[""Ӊ/#"A Ddۇo"?e ~V!2mBd[o "?- ~K@d[o"C })?d}Hзo!?Ň ~y"zC42%h8>h>r?)k9Y JU1ѽ;+_ 3>~{/#_G~ >B%|dKїo#!>2-|#CG ~ !>2-|K/G~ +!>2%|K/#_G~ >B%|d[o#_G} !>2%|K_} !>2-|#D_G"|d[o#>B%|#CG ~ !>2-|#CG"|D¯O§=u7~yiW[4#/#?E~ysڞG z63E++Fzrއx|W=o'4`y>]e>/ԭin 5w0Xz6r_=E4 ^sq[vYBL<>F.TgKe! }53K>w"Meр{37w3x9ƤStlnIcs3BGS2RkgL"M +N{qxGd}511zRZ?e6ݜh9ύUXK-pZqOSS2K,1!s ѝлNlnFm I)#"rLx)xib3o>h"MkM,j>ߤyj!٩OM6 LFG޵̥ cf3siߊ̷`Z a=G΁G4]&69M[Ttd93>zZcMUI`U~LIxׂgvoW"v-!NvCV_64(SGiw?ikJ띖?hz^?^Ï~{GԳq{Be7q&Bu?S`z&rS5+WK9DF +H+ ߪL-k]^%zzSZԼgdf'w“b!?ܻ;R{weV9lf38zH=+>2#w90Ė Yv x=:|Y!l6bbe*2>QߪT;!~Y{gPgã)({w-h;0jܻV?o枙 m:Ȼ5S&:rìY(jMuطq]}bϯM| endstream endobj 2920 0 obj -<> +<> stream -x_mqOq)^ˌ 4 100L?pϷ7VVSuT]Zɝ;wf?_7?ݗo?E/˯KU_\?/_Ɨooe|?q|є?>e69iou5OM/0wo$1oOI=+sdWd_]_4>w~;%z^߾ݭA=<'4A|z?O?OWk}~a$z KetO_—̨`=٥c~tF>ؘEz>BHOj'%{L}ʰif=^kl\gK$z /GHb M,zR٬/UȗIVkҷJg)˚!>XrLfʹ&m\.>YvMդH JeMd w$dh( -5YCc!H2lwVpYҧ، &FoeHJEYc>$QC2Yc_)cL/Zoei-;Sbi2-k^:kRiweUhs Pַ$GXGcIb}LRC|O~,M-ÓЋu6Iu{{S@}!Wga#qz,Xjq$:k'ّB'U.q2h?@ƥr_~ڷ%yOG[]=OӅ/g[_SN,啒j [[HO#Sz5GXSJ‡\Dӝo 7?ed0o̒UqF$~,|9|]y]NoӅ0.՚fo5w6Q$|ˀΡ;V4?e9omۧkm{:m_-߳Ov\Ppe0Fⷌ將p;B§@qsHĄYc%ĵa[RE:^[v$݆p'\pOdrp_F;nKxD=᫔5>wpp -_CVR៕_7MbOx\V:҇s.ᔯ·dzJ+ym =;yO09gZյ#J [7>U'Q.Yٍa??P ;uPSe _ˑvL/ѷ,SPAFb"C%(}/gE9ڍy>|txe/"$ztٮ} -2&܃{ ލ~# ~@ $2ӎ# Q_~(OJx]T{xZ l\녺헾3_]ZקGulӥ@㏼\d{y ->M)o|#]w afð _sbeF{(o4>ʛYbSK⣾6'$tQ Xx>(4)㷨"[G߅3 _2j*9YwO2 $M>WjGs,;upbnzAz 懄]38qmOmkA~#x9TD@瀸3Xw_49%=c+D"(OɆɠ0Y05Sk -IG]9x"MyGiH~΃#ߚ[m|d ϡ,Gn>:垃568;Jr5DuhcA)jJDCoif-70.+$A]扃_CpCx,9%T>FXG)1w\W9?o;2o߈ -$M"/hd¡ET똏ȕ ՏC2]IH[ -9e2LiU[eСLݾe]8xnhQ/(Jc8NqƁz~4I,>TpYAW#6H)b[+! 0H|4FƒLO5ep*$[H踉>4%Ն9*:a$sѤHF|"ᗋIK* 5^YlpSV?%|"_2[6yVHE[q%[jl/&{f=E+d= @%S!yK9|IRHe.F#mC{ _Z_}+ża`&Th)~蠝MmLFK-1LG>z8k Bۃs@VhGm!?Gi;jtpݏfO' ,Zm#f5P eo .hYܒSHJ~%?ˎODb)B -L=,> -=lzٖoŚn2EV Ml[pѰ,i ?9R0)ߙMDMHH$7-݉XLLUH|DϠ}9u! -I/YH?5aSfVH#[jM9|'{iLX2t4kiNiX4C6klQ׌oBmzm8—CeNWG&&Yzt}H8xt sؠÜik˩ҦliZ.\4+woXMm MI(џFbr^Njd>[ bpiG1FoZkup>Ckg!cn?{c~^ec.7?W|3[*5 -l' _kp\/>%VzpNl)x1.,|^D9Yc_9Y} 5*V!ߥ~[!䄋_2Y:X,*T#&BE8* %sMҤKIqDN'#SL늸i2ԔDGqFCraRc Ś a2Y/+jSWƏ$|Ro/`Q‘rKORF¥T;F4rpQv<=$ .8l )npq)`C l8%RְE~(e2HU2ܾ*ixx-Q !8Jp!5E~(=2PĿ8_} ->M3):!r![৬F؝B/H"[C*!r%fQ -~k2J7dMMjIpSf(DEYn5,vs%@Y-%Yh43 -9 X'U~JG?GKreK7/=WܞI/GQe[ -XzK`!Qm;Y֭оSdZY-DX*$;5Sg9WQuƼxُ'/1ʾ>/1GbMŘ|QR_M2e|ߞܕ]4$/=8DQ&EU򧥎./'O+QWNIeRIj쏏n5_\\LB}]U@_9z7ΡEC/*%wyݱ& w38x0R;p9x)xapS(8t3B9o -}M=_Grr~z<.q -N|k,o|K <>huwduH8|:J=|v& -\V ]G%25oBQ5QCVŠm{1VH `†HKr-kwI]/Y"j>eh3wD=$@F -|~7աP~Gb*>ىMݷ07s_QhCmg9ulgS=DϦ^Nsχ<ͷݿ egq zUc´ICM8p}Sa%|e7(G{V–_*K }o@(́$~Vb5_}6uBO ^obO=7{=}~J5㻿˭4xaW!8a?cb?\'[7jRjom&-#u0vh*s~{klc}n}% d̺j˝oY;V?M| OO!U~LܯDYrPKONO4EZ69q\59}\F>WX/>-/͓;⯶zzp\>u\[%?l#|ېWzh{?莢Dߟ<86\fϡ$ >eZ礍Rgj!ufӆٳFYź?NCE:9  ]O*:Σ"7~{y)?_y?MMp?[J#"xmU.4II|4jZD!t~@ˡu?fH (t|(6d2:.Z}s!߾>~d?C_Bw@Lq?\MԄ OPq?]Z̐S|VsyIUf0"aOYf!!8JKkް*nd(rHu'qn{Ign?Tm񄶑{+h#Bg#EOpp0C!ׂƒ$~H8s:y21d~ M$0Ԡc-fXO7גMېgmHi1wK,iN4V6I) 9;o? -Rh>v t>r'm׹;S -.>@Y4C _ȸאLx$V֧xuH)A|ݟA}xZȽ㠭Ho;g"~y4^G}En__*<ʩ{/,42o#IG__-tDџs?f|a/LBSٿјRSE $>6x? Qg/|ib>q  phc RDHnǩ_b3hxuUH4 5 o&S' -kixW8U%s}XnxòI/X%pPBB ^&_.a?$DS96_^46h7S| =\Ҏ$6?L(yu.X,TY:M{֐^JbA{kI7km1X%#ZC-^K-i"iIz4^}%:`5.oNǣ;xI3?}}9mEɵ6{}r#ZwOu9z>S>NMzxo'(zy%j0ٍ;x[]i'.c=ޅv *h[B/imc[Qׁ3= -c|փF~0QS"NKNOiPqs<| &oˠhD#= E c!KO#lb'.pQ`y _ӪX|M~g\IV*ğ♋wCM 肌S,)˱"$$~Hoi'!>ZG+ ߲Fs0H$~Iђß*hIh ć~,_mYҊh 9*X_#r+@n!_b1YېB_>Q vjAl?]ђğb-&E5P}܏QC s#~%?$񧬹S 9v^Cˮ܎2 -˻_̒ Ѝik'(A.9AŸǿQt QBj%!G]AHxsx) -r  -r7+)LtWBnLאCpc ɳ]A]Gw - -r5h]C.GډkWxWAirKQBNir["Kb5hk] 9ʿ+5-v_B {Z# t@y]X(o~J:HymYob!BmQyxDvj=\~N{J2eeS3D.I˒!OnxK~o:utBꀏ79a+"S&使+ŐSr)mt%pΐ-q#x%{א~?lI%a ?ޏ֑ _ɚђyh|㘍Gc_3:/= }rwo2FG/K=i,_HO,?dN/]KP5>>\z?:&5"NJSɅ_2B6>- x -8X%h*TMb&m|P[!zODuAWHeKtnOLst/D}/".9`g[,Q`Ï:h_DEDh_DG9~jоfߦVևpYݴ-s'TJCh)jN"/"cDmi_D'E"os𾿈 ]yd׽;# pqчQ>зOףMC_.^|?W#]~r o ǐ a!_ֳItiS8)Q$z*YC u;8>I9dL cCv;GYr2[sfCw4cbSD(&.8.I~! ro!C 89% ][I% ^I} -Q-֗dep1̋4oP3)xU%IxI֊ҘUCcm-Q32Y'eL]X)b'$Q/VA ->UX[HSk5Ķ -԰f͛VAãQbdԼFvѦDB>]CVbLT0't,Yy 'F `|ݟ]5# ՒFeCcvnPrNvK:.hCe}Ok9/E eG:˰[Z lnVÇ-(TB$>1ڋ- ?r]8!h|/A[{ GokNӻ4mZSeLbS'H%/C ? -q8-$߲ٳuJ×X8T%Œ7miʌmqRsf̚6{ (Pgt?$~H! -!j8xk[Nh4hG-Ҡt ҭriX;FiGޭ$ZjhjIi5##Q>Rk^ǖk\)1>]aN:jn8Rj^ f?̎~u–a+Zļqަ۠z7^8o⛻LݥEO1C_R`VDm's]-P1ރ7E`kl"Dы;BOG["&|gq='kpzH7#xx~IU>h -* ?eք!4,F8դAn uƐ7䥖*n!:*?%ytK%NM;'5*KpxvY  H]VlY<(IQTlv IuWkB(O.&;畁bI8naJȋCĐp\"x6`]e8y \/1;%儤¿gxP-p_j90# Io?%#lH|*,Oĺ)|RY!+_ʚ2[c?;C4m6 ͳt쉖h4/Y: K;YD!nȨ~{:wa1~ε$F_k-#g‡c =<W2IxCme~!].ܞ%~dOHF9Phh0)bo8v^H2v8Mf.ؗH|&ZNOn'K!xSi-vha[Xǿ&U|]УQRtIuTqx}p#*^TO[)^C-$I*6oBpV÷˿2 )e0p%3ɀ <'YbSr -^<9O}ʄ]7 71 -MR9N -gh -(XK9]%6Y2tk%F$ןmAIYKqLw7'tš':8A+QfO/Y/ɚb&8U%x[Ţmb$)tpb|DSwG'߲ SaXK1bv( ->UlJp)*| 5Q -5Q2#h+ZXNkWmC? gMEq%e[ -} 5Y%!Ց_8lŻ'~ۿ:wu?t>ϗGupۀ}a«?=O~|Qx{~^~_ W? O*HS -_WA?WAUp*Hs -ԯWAUp*Hs -ܯ?U~$} -_WU~C -ܯ?*Hs - -Q -ԯ? *8~$_W? *8~$_Я?U~$_Я?*Hs -_WAUP*HF~(aj*Aj..樷xV8`\T}QyJ3?7ߞdXc]ԣG_YqãIA#9r!PbfM_Q>X:7A+D \8MḉCgC2i3A>ٓ-+i/WN[ܶ=6>}nvM!a-n3$SVƢM 2>}C^ _Rp(.6<,O/L`\[D7mDXfO RxsȪ+S|.O{(ZۑbAR/b:B8 H|tE,h8iK6v92<=ߡb޾!TPё:T\~.}P1‰GCvq>zOhe3J;?#_;o+~gO~g},?Y~gO~OŸ},O},O|,O},I?Ig_?'_?'_?g}$Ÿ|$|,?Y?Y{_? '_?~'Ͼ~'O~'Ͼ~g}ŸŚ_Gy|ŚC׏5+>~o՟ӜUHy{/뿦pg?+5RC⟔pJ Vj(GJ Rj8?+5$IpJ Vj8RCŸA!J pJ Vj8RCŸA!J Vj8RCŸ -RC⟔ԐgPjHRC⟔A!J Ԑ'PjHR?(5$I!J Ԑg?+5$YԐ'PjHR~(aZJMdH*dJMaNmѕÜW{*5>.iug2mDQLooz_t2I}א/H@} 琄='Gz.FOr5'e. JĎ3)!.r˵1H?-&mz uz!ğ2Nr< (nBRualQB?u-!!c^_Zp% ,Yho\eH] A};3H,B/YaBx]+\0Ց-vá*~%ep5%O gLO9|*m.˵QKyى\j$mUN:ώIKx**S?+Y6.\%ZܱUd5ﴎyzP01? WzA? -}c4s8~|~zw??\_ =K9{/g<pa]`ɀvu _xhD& :.`(h?d] ;.*#ەw(uw9BqgwmD_IH yZb KeΉ% 'YzH&NNѡhXXTځFkxt.Тs.48Xt7.];r\5219 y Q``]!V.*ZHxbSѧ_K@"ݒu)=/]%W@%]UZH7f]$Fh G )ОX%EAkCpLOVX(;7!5ͻ@?XL 8 +/R Q +a‹2{w#] NXLXH;!vLގX;-u)p1Ȃ+F`Bj%{0Ȅټ9TXs{#"YYZ ^6,}9x|є8Uq󑫥/h'It>:bw㥿!YEGk~p|ɫc!kO --:~&*F::~rf72v^Y]q4c=Ć; ҽYpdE-4~}5O—0o?%O*_ہ$A{=ePe;tmcǻ *i?Ž<~"E9Y7 :!UѬ,;u@&ͥF,)cן&uX]@iPF{(!(I'2h2h'xeo9Rxk -IwNvҞTixKt"tD!h -zP*OwU\Cx?{t'H +x_,I>bwKhl.Aм3`5l'WeVUfe:wPzvee|~!JKא?˗Ow2Ͽq|є01_=5xoڏM?O\~yxrzw=7ݿq{?_~??0nKȯ{o#kdW㤺d_]W==_G_iמֳxy{Y_~OWl}0 Hv,|鬻&̋/QzK` J$} 1d}TY%N«K,a1I$z.d-ظf-)3TIb+Y_XbÍ`ӥY_)/ rS-CkohfS5kC|jf ͚sMZ\:|욢Iߑ&-: UHhP;6$jBfe".ӇfOAZ#L'ޢXߑH*'c +?'KX͚Cr4g _c|Z?qpo8>sa2FC% O{}Sq(1 +B<1jƧ]r$ ? <>K%G@# 1aA" DH]y+s!@2&J + V#!F?dQ;x׆2omXS,KY|{4HM'x)ou^`0&|$~*?x(oy؎wvށ+ )U7L]>i' +w_LڑtÝr> 3|DR葲wßn;'*Ts0L~5N? i Aе_3D"mڗ)}tz/?>WsHMΡ{|ҝL|dLJTh:/PSBO3笨oSQ2{„x9MS.=e ;g\&;/cw?W ;uPSe _ˑL/,oSPAǶb"CJt~aqߖWeюe on“5[z|(o>r;o~6޳+NjNw9'()0[[y{威uxY{XuSNSJH0CCҷr֎^9gA:߿ݹGLtO7vCVHκ9$=*X\$2H}<cTj{Hw==ѯ֩u}oe]l}=?&=t5N?+S[I~wT}#`JX$:j-5gD-Yڥ?9x׊66+%ͳX%k k%=G;*VfhM*%6$>ʢaB/9iOUPG^Or<~*|I|T^L%i֮ u2Kt6ytظ}_,SǍD槡ϼwO0){w~e#|yƸΒ qF= sQ`=\sBE?%'d7M:*TOYxQ$4²"Y]~1 +~ˆ :~vPa<^9<{X(5ֽ֧,Wo ՛۬P 9tB(~ YioJaJxT!c1a2 +^MD* +$(2 +[Cfֳ%VN{[b"wK ,(4d +^*s3Rac>2/1?:$n@}t%c"9l"Mo)3З0}fWIlA0u[9xlC>Z‡ѯG]o_{T ;4J us>!//'bU<_6Y;ٽ#2PCGe$DT\ De䍎3_RmsF>wcN~4L I|l'R~X+N$>*ĤЃQ&/F ?a!S'UI%5igq̚1\g]vsj2k{TB [>' [QY)I?\Fm$>*D60~j[p5oRfIwډAtoͤM8t4cK=h;kՋvD9sWQCq=>\<G}>i g'>^v *P--|hh>P4 8tHrpA@D +r&﬛oDw SZLn~ʪmۣKx`7zӳؼu(6]QW[ҵ'R-!8t7{wÈu>eL$SȨȤ | K(TYϔJ{cƑsgqK\:,KPTp$~JdwzE!Q?͟hQ ظ ҅2<!/i.?` ؏MLԱH[?5M[pM欱Ao:+rwSM2V g\-]%iVt44tA;4)ϱ_crn_;ĥDdo>[$0\QW7YkЇ>62fwQZ_Ϛ}]! Y^vJ||ÕsN"avz%YknSb ?Gs8r'O%5eScQb1Ck'ba|HNx:H%#E_.΢jE;b bd64KLMIthDJ8)a!&5"|([ (^z +p(WI‡, +* $(^ENk`X1m-FɊֶQis~Oc KFQeiOsU? G}^/z?ENZge8Vw { +szMY!XAaE÷8Zy/Q4 a0?dK|/ȞbllZ8|3iOI*Z%F/!iS6:" DO\S GƂo%(@!Y1[?eٴK" :e x:>9TY/J>6rR JQpmKPao~ILWnO"dñB4_9Ti +>hOZDHY"(?Ԓ4E +[ ? qTֶp|РE toDU֦+$ s Yó5 +I>)#u)J.<&@#G]>v"ia=;glȽwOY!(:2m`/ƞ-d4rStXD/{lA—%xUI|āC0rKTE7GeR8x$" +&|SM2!M i?e5z@v92%&V ɕ/pRSEohл9%kmZP[2C(2mtCaDC/ɜJ͚`>; @QHr=:rSz$G|8ڝn>ZuU+^|$DSN~W=B|(,-R(ǽ`[  bڶne0ʊOlY&UT9%ř?2F̯#Me?I)ɠu?dJ4Fk2J ѥ8+ueʼ}zyw +Ο^㶃nu3[;q:e(Z~Y襎uN3~ߏg5TH酸v=߃}S_/nJīH;gF9Js%^$.;dSB@ +xGT.J=Jw,Pd +xwrG(M2ɂZD5xw >jf9x>m +Ex}a o8 *]IxT W͚Ex'#PY*%PѯNqty_Ѓߒq i>yNutk>8Gn~G;_8eO}y^W]gEmS T'ƒ' dOYX +^ǡ*ķ,$=~eE߱Xyդ)xTjm`["3Y&դYC%Q8.P9dU >T h~ %lD[0&|Dp+߲vl~ܵ495  +~)RS֎P08kO^ZqKr tqχ_!.}$!ޫӝR#Q|cz|yڠK⧗{Ճ[V /̹yȋ>(֬xƏSQ9z<83?m=O8a>{l+؋!EpNw&_2R9L16߇XWKƬ;5o+.i5}%GdI/RǤJ9- dy^qh,4tLMΉ,at_!qv5hg]!ggTAaSPÅrB=:; jgRgK*DQ~tvo]7|QM7Ku@džˬq+H2|]y8787J_Ó'u죬,|B# @iJgQr3be'L ,o[Ç˷XyjB+ɮIMQI/5mx,DGFǦΔwGm݇7'bR|unlIT4ᠭ h>,,x8ߨʻh)#Рğ(u='mtyW 66E5h/o:3PO= ڽ׿RqLg@o)μzF#b"A~ϛ_~uI*K~,}_.[g7_}7{bOkw2Z4dLQh's-:Ww=c=΂ǟ2qn/YN㇊wW)ss0?O.\4~X7J&^%=%X!g !Y9GG8 ?e)mA+\4|K W | y)vwj8 H%k8R8|qǟYNִ[jE佻U4>`͞<~+*4K:P7G+*^XQ_7P9|j]<~i,Nyݓ) ՓhմSWC+~#+M 0 vo?/+q7 +0O);_ߌ {1p7FЁPw!5a"S.S/O3$_&=&^Eձ}(H&%Sbu,~H;S$w,o|e=C v^ҙA[5ʒ$wo/^ox8i/.p(w\Th:K +UͪPDz5.+J_[5Y)D{3ވqLrf[@ß&j<$~cI/sh"c$c"Et;y$AëKBix3:i/WX Iû 9/D̂t#6N~uÇ6 89r I|$~ VUkD5tS7./4)H #S0B4(| v}!qo b|FT~s4bqs~ZU`t#ev񃧈o,_F~|NjS`g{ 8kcZB 4?*XCII{}(Xޞ-3j/7ӵi|Y'>r> 4~HTL1e w.tb AQgK**YkʘhSR6%+D>toL;.VQǛƢ-neF[ +EН6}ZeE4zDmqEg+,>y_AOtWKіZGF;rf +Cػ-zwAZԠ=\Vn.Ԫ:6ѻ#Q3(Sk( [Ǜ)>o.iG] +[Q|VAu:,~KLS~,A[&]kH/ J1=ݵʛmSyR>#䁢tp^QEi"3*J?t4d}$)9fo;}iRÇھ8x݊zlmx~wcvl-"ޙ +fd;n?;LC]卐5Ix]֓Ɵh+g7:|S}gzЎ5xr. $> u%;mͺg_^k2xh߾փ~ƀQ;S$ꢬA]SoWO8=~,D;h|u2+m9N!CXA‡XS:9XIF (|d^sB*_tӆ5qbĉ_UprJ%xbPq$>Z'= i?$~r8Dx [ra]3fJ÷8rq59 B_Ra +Z}&8C"a6WF[{քb,>ZN +֗ȭp +-sHXLdr6DŽOZw`$^Iivh:9Ti_vcЂX~sH_ )IDki)kC]в+2#"n어$<*2D'TdډP4JiP;ֿKQX#q}_<P5Yb?]AX}hھyYTC9|(p/0!c=x)i0&+X4~N`~*:6!A/$a% _C*iR#qk-?M+6yf)BE䗌JgR(!髼_؂r(݊B37`%[F]%ik? +6s1v!rBvimDŦBzB/ts3ڷvrh§tӈ7!CrA' CJ~DlYoqQHo/#*65lg yOdX>PvܟD wڇ%fZtΊ%[Z]襾hgFdd%g8hçN|!a`wPڇqlZv0JO.Լ/ 4$~vCKjJ[R,y}Z#okH^23J^u4bHo>6G+`M?͂SO5<;ku(cO9!è>70}g;=x= a4i),>HTJa<%K!߉3&*b!3lK,ힵ e_ǦM/(I+kmf  ҐY|vBJ?ey.u"&[:!qɐk(*g(*hD⣬"r#x)i|ԕZw]9ɮ+<~ mz\mr~$> +~C4U^G +E⣬!rJ;=ԕ߅%.F/h7wm"QVi/CY4@⣬\ KQv"}(,>sZ0졮nPrx|ԕSZ0졮֭H#ca9PWrM=֕EÞ)oǿVHy}Zy3?Pl4ۗ?x(ővߐ翻]zmOlW"έ?~㇮"]֪[}F^&OC.x/G%ڧ۽.E{_6y 6K.??A/BmjI9dL cCv;GYrb ^sCw6cbkD(&.8,/J~! o!C 8B:<":C'k8dC%'$VY BN#}PO6MּIUzM$zwrMxiJTQ!X>% ]I% I}U-֗d=p1 ϋ4oPC3斞)xUIx4I֊UCcm-Q?32Y'e$L^X)g'%QUA +>UX[ISk5Ķ԰f͛VAɣQcdFhvѦD>]CVbTL9't,Yy '팟GV e޾/H 9(id\QmQ?yxݯ=U|4 Mv$OFwTpO8] ^ηI@ߔ\&v>4oGB$񡺌o.wc$^q(1SyFxA[Ձ-_ C*?Es!A/ٸ,DB9b/ڶ%ڶECLOYsat N⇴3:Dm3Ae9ikOjдjM1WOHG vҿP z$*4"(ifϖdb* _b8|h2޴m2na2;>C1k.hNCѭ-c 23+6ӫk.m7;!Ly>24~KCbm;$yHyCѢ->[A' ЎDt_GyH}[JMtI>9QHko&ƑPg4EwgNͧ [ٯާylbYyjq}WDu8w)) +K'b)zÈN2'\,5u |S'">[f_M\wȕ/eO掍1R˝!hc y.‡K:oDZj4~D,p,~ 7DT\A;@԰?] +Z}Z#/Vy1CCȱcrC+$<졦2 +Z>en ?QGP$~L~TXeC im*;ۊC/dQځewNs&3K$>:-J%F\֐Zى)ٴ]Ֆ:iᰭut,Ď_I3*n_;~({Ra%9?]JpT5^߷ܑ)oM_TP W,J?7BS&!Ld#G$K_,zJU`CNѻ'ɡO0S#!^"AC^?^I Mcc)&kRƒb(psM')su[b4k)n7&6D)8D&hL|k)F .E C]>I&s&JqSfmEkKi mȢᬉ($lK&kD-:r MҾxWB2a_sn^Qhs#PcfM_Q>X:7A+Ģ׍X.̦Sď!ҳ!UKƊMtIsɖ洗`T-n[FؾhWVv)+cѦr鋆ox!/F@WT\EMICInN[Oڧuxf^.-"XN6"\h'F{9dPە)>';H +NMNڗ br!X~$>"VNXڴV~Em{v`1o,@up;X\~.}`ax}#Gۿ#/xP7>p'W? rgW?g]$\tgW?r~gO~gO~gO~gO~O],O\,?Y?I?9'W?'O~'Ϯ~g]$\$?I?It'W?v'W?r'W?v'W?Ϯ~,|:{?/.Yԏ5+>G%ߘ}ZM귋ϞߑVzռ}Vsj8VCŸI!OZ j8'?k53?i5VC⟵pOZ j8'?k5Y!Z Րgj8'?k5Y!OZ Րg?k5Y!Z L!OZ jHV?i5$Y!OZ ՐgjHV?i5$YՐgjHV៵pOZ jHVC?i5$Y8u0krj2$}~>&01εü7Gj5?ɓsC_ɶUGy#O)!70d@-Z RɅ! _2,N" 2{NB_]=Ɵ5%QkN[]wi SfC^Qk5$~H[L4'5(>rB +=?e 8xXX۪]k!*v-9heTIxZ8]ONŒ\S!Pekx)ǿ2f{ܾ e{U>l&x>dz¥ A=l:5>8]Oԓv@dz6qK8]!O, YOr~"KY98=p[r|UiGW{W_W__1ыak~3~Ͽ4N{*v=_,E/FG{-~tiD|u_l/2M\!bCN: ,..+@4 'v TT\ed.8R.F"G5N,č`,2zPϺ@K.$~9Rc]Ė`K@I):z KrʺtY;o o.QqZ}Cܠz.CGBkGҫFB5&]\2~_W4^ +| t9KBE P,~J6ڶKVrwIHR_.0gkA +( Z Ǭ pH}!a0a] R2`Mdh&郶"$ŎQkg.0f7;XwiuH@^XT`]$5&]:7k;zXbp{[xZ3w^Z#{q 2dimqY)Yz;x|є8Ops9 Z_B>kNZXb5Y_wtd˽c!kϛ-:J/P {|_8 +ɮyӱp锱v7[O(`]F~yGg^)*yVepK}Ft!Ҍ4+xˑW[SHMsҦO7|J<_$ ,=ߕD ErT9W~ 9̞•;< endstream endobj 2921 0 obj -<> +<> stream -x\oܸ~_!75j-)$8KOÛ7߽W+UZW^]MgW=~>JU=n*UTuuiWJ+c^>wfO?iMWF/w߿pqݹWj|:Ki% n+բ.a8]gw>U(r=D0KeIF/F}ûO_RjZ[wUM坫-J][Kh}0-?-j3~H%6Ť&*Ң_dT{ߖq wi 6]EO~j-x}/SŮL@q縮}t[X|~cFk Pn*AO$xj0ۍha KN`#p?Zn>hZ8+"uGh` K|k AyG츮*oܸO&j4zu(؋uw7F-G 0NY +ۭc!:Hx 2K=91UZgßtؖ%ixi{]޷a lDu[RR-f(5)v+3|0+d9\BA%,v,12@acP3 1* -% ,N kזlI4PƜj - w*%G qͰ9nI$ 7iZ+MQ!ޝ KY*BBwAZFw@VQ!ihxo X8+<:Dc K Z؞t bԌ7!/Pc/0Þ ^6Ml1Fdd }~ cO*%'N:"X\y&8l ]{|X* hr@u6]y`-'5IX9)5O -tiHNbfGHw0S#3B;Eb*<1HpH=AQ =JBixW>ޘ^)mΟ#l3*< ;TVhx e?V1{טb6p`#q੄_#3 -!+G8W 7B`VL*м.jxt}_7T ,_XJ2y -%ZRRȰ@,?\K(UKfhUt@\P-f6# & 0B̏Xt@~IwrLȇIDt -mjחgS8V:L2G>uAid"̡j DL eB+k -C Z OTH2 -6 -[Cr2O5qȤ}2gek2(4<;#F$J$a5A UDKB]>Stj蚜X[նgߧG6AjIyI=ӌz_n?Jgj[*xB ?WSY$9Ƒ#0l6Bdq@ _ +sZ.4OO`XHA<:!"2.H8~9`Lr~g6Հ9tg h$fg;5Zሎ7Z;8xD8m w@< >\6)]rk4 yKsF64neV430^,3QrǞV +'`3ZЭQk +LlB2MK8u F X!i-@Bj̗TX0\_;6s歩Bh:AjjhtNJ.i@BIz@/x݉c^@lDyH~lUwqLD^.  AfiWsɣ2#[_Fg`;~gNdniMX&k`d'fYIO!KꮡG};LKk F)T~s5b]ԁ,Zl0fEf 2<ޜ`NUM8~ 4<'7; ecd#F>? E=DNpG g`9;=szV^":=<4MUB([ll흣EsRΤX* x8*0H83 ДA Ip6VAn徎r[$ߤ=.Ѵv~V1A=n׳ # ڧQD02Ece@ h;uJP+bU[3oMBIF5v9&j w;1!|QbD 2lq2X]L=ki!.+ +XYn`b*SBYͨ$25.;Sg ';Y9BkLLxlߧYid=ZT&"JufЄ:vmjgrifIA,^>(j3o'A#;R%:2hcώ {r(f/u1ftf+Tk*x};83HH.*`S)og!;蕁 +i,\&yݳm SʞZsή sѬj/iIH]@|<'vp,goVOVbݙDhm")~y#H*/oFub N\͘52bdmr,$ ;#%DzxgڜN=f~ ɬT5e`˜,-sW(PwSfykwxOh[OkGR {1LdY|#=_x?%tPwuM _-,9 +X|{ty>3$n'P8bkˌZB,X--3F}WJ|jOpx|> +<> stream -x][~_A%kK{z؇(҉bF1M6\z3փ*Uů/>}ŋ/l}?\]W~z{]ݛ?tum~w?|~y#gHޥ*>G͇/OWS]\kDXU+?? %JS?5i,V׿}8d>蹝z82ġ_'~̽V9m=Lc${#A{?%tԪxQFx|{ (Sן}˫W߿7/k;f2ɥ w , ꎰ(0cMq1tJN/I۳spxWrOlRt4 -ٮqJo-S1ͷ\~ơmU n';ܜ͊LI76{=La=jxRq);]oܖx'|ke6K7wu\aKCatJ09F=8daa԰tjQ w>!yvQ T‚H򶣔x u 5s=T:w;IW\LaKv#}fRfMqPcs}kR'(iavK=qutvuuxAʏ0tcLeiaTbsӛw{W_~^=\~SDHtޏ]cDfarH П:X jKjcxh - n >jL?`- Kt6^e7I 16Y%#\Cc=ď 3zOYwZuXA7݂b@R.+=W^ [%A`yQPDQK$%f0EK#sB]Dx"mƆ'M}b4v7n>l}tW~/~pGYgl>#E5P.fӰFPUfi3`' ,9D#eRtĀcHckgȑS s$nԛs8iqHUŷs\+͇۬y#Ts*}ۋ͛ /͖nC$TR.50h#c`Xč!x6ӠBaɮVyMD34yJ^gԷ^)+隤Cj?k(,/]KK8׎I I`&ў=l8qHl90Iaf5*$ɠ-YB-fS|q_M^hS6I3￱ qh%I)d]͉6(RavU (f&%L'flx]hTl-xs:)bR/l?MQMLKGctzKZn*OA\!e>'`'MXҟz#11e,~'aM{FfcݺD;7.;r,3 Ք -̞b(%DSv$OH8Qr!c61Ɣ 1|d+j?<1S rKR\H̥VL.g@Md9Sv4ؐp  MEhl}ʾhPNP2 LצAƑuڣ6*=c7`GK*aLiN|јoa/?yW#$u;BFbDQɥw,$E7F@BPe~} l" F -e"F< -RR0R!1h0سS Y5n6!eS$Xt[Ɨ[lli2Ys@&F%CL(9Y%Z9FSu`dek݃tJ>j'ɞ UxoZa_%@h*SKr5P9ˡ -f9˃fb2APդCH֦eJV*\)L|I.% -e 08->z8 w %үSl:e0U_PNS,shez#R+hݱwcRW R>)C -`hC">,sr+‚͒`6V烶$ػ ? dz^@_^~._-ӒNXa - FXl>h?w|߫CߣmNQ+'KSBbI32$C!;fy% Jpʠb9*0SChNo#x i7 !o!oIIGm!Ds\@ m!OK# :v_YP62 'Sh1~rx1~4ĸd8ցÕ8C%ZzUoģcEWxEWxEWxEWxEkEF3G#Ʋg xt➑@‡s8k1;׽npV#v"Ͽ߷z#;ħR!^ꞁ~8훔1m_pi{x'ZjO֞ nL:Jxc:\G>y =h-~՞}tP![$,'eӮNi_kX803{{ 5jhS#ۺ^ǂƥI0ٗc=6>Q{p۹߮z,<>Y____f_+@~>@3㺀{TvNj焳o"O t)9po/|pj|OmyHjvY '(q}V*sY8FoGF&#P*Ҟ@ilwJe?%ȨAy=\ -01PM!a,Nl:Mި'<1HU hùf+ލyИr/I%mz+\Mh :(ǑPA#A? -0섟mphP- bBƢ޲2?w+Gz&PGϧkjoIv_BÐΗd|uZD ISz Rah[:g:%:ؼю+K_K_K_K_K;`{J?J~ J?o]ˇ@{ߗ>N7X Bݡ:[sA/g :X +x]ݏ7r߿>/~[gpiN$[^#>(vYAa{X*U_՗obw՗/v߽_׫g?~^⿾wo>ёCsr!@bf$'ۋWӻv~Ϟ#osd?^y+fc ~3*Xt˿^? c5s&@]Q8ks8{e{[(6P6LA얽N=)=\2xٲWT6F}RO'W>o*ȜC1o69X&JB+c$ \h2Aijc=*^i#/#kgLalqnTL./O6-KarB:`Z~MqH$=z^͂ف5deaI1CC./u 5s3Jt̻ѽfaM!'N L}f/gRhw6wT{oU6pYL<L#{2^nLJR׻i3==L833ENw$̌^řg/GW'W:v dAg%KҞ@Gf+wS4bpa{||ľ\z;ޑ,ďБm}BU%rwW{䛯K{(E)l]+2LzB ʙJ Ҁ|WuAԟw ;+C$$}8A阮w(߭J(C;kEm;>&̠YVQz|b%|l0 roM뎒Vbrx [@U_1p>Kߛ0Յ)ѝJ:ظzw?߮&$)=};u:нq*<8t7N%ABЩdHO] C%J*QsD]Dx"Ɗ'M}bW5vwn>~v^Ug9)MOd()yElNRJ6yf,yz2AGr:GDZr{4Kh^F׈T]|woϵRJڽ-Ͽ1?5bSK]>mBiջ%Rl+GsCSw )։p40~FM34%P~Xg@+ӢvE *2üuzD T +""Z~q ̉Ėc GNyW h +KYԼ/h}n!e$$!jj1}Mդi6WngӜ9G V}н9цv%C4 U +D *뉶+(7}[81ޝw + +OtHk\%#x?ctNmM5MiJ8|`4G`'z?8ȋQ[@yO8Pw("Fo]{"Ar 6q!*筌!ê!j2"r:( BQA|0e8O('`&g Z#gKNsv48E@2fɥ9%). DV.g@Md9Sv. G^ 1ZGrV&elc֢A!ű435^UG6eGMmTZ6ڏU¨RhXJ>߹(]#Td*يE`%!H.%v.& 0Y +!%v1Bܗ8Zw-b[gD_P `pQU(crQI/ "C&+[1zϐ]fc<-c6U7GbeQ4l_U{659BL2 %C(9Y%X9SuT0Sծ ]؅[Cl {,D"f%D9!wWԪ 6xP6oeHnjDJTg){@eV୤ TnCbz`%0H t!Qp!VБJhSA0֚FP|8]Diq^7R@5yАYy] ,',DM$h/c:z&T$l\HI|QDPUBhIBSDBBHY+Yɗ`N(YB)Xј{!ݭkȬԼpce.E-$!RǢ՘K ފ(}&uy1ڍHZh1X[і^tE֢J`#+)Mb+jaAB֠Q9[@zd;`& 4i䡸L {Xȶqd[Cۢ+ٶ%~~ZvA.h>Fo.֎LlBJXk?48?:.4O֐Dq4տ] T|bADADADADA"?}my\Ϝ4\bv7Rs=}JpNgq}䇡im׽y+;,^.^4g?>YLmJrO|0S1mGv>J{?Qj(?xH "P򉇭ŕC mLji%3& o ݘt*LSQ˲q b%]/t%tIAG8?j8t6OR'mNR,yX[6I EOXi=I)5$_I̍K2zzK>4>W?ʮKb76hupz%0v| zW  ]?]W]Cϛ~ztջwo> +<> stream -x]_$mOQgȍӈ8;H8q ^w쬽7FoTUZY;#vĢHJEw߿~ux/^}<o_w/o^W߿ϾW/2Р=|F*8G2Ȋ;pa_k= /_g>9}~3d4㧶э|ߏ-~ԢU//^mRlaK^i@=Ȫ5ڭ~N7?]PbLF^_hȊ|#cW <ײer~n?WA)E BVy+F&g%H~L;qK2La<| kw1?⿟,e)3dܐ/\C55_GÊ[fO*K6%W]<恦y̦>isJy܍>Md02}i[=GKDAf^'rVsg}8=łn>Fm7G o .:b2/R' ٖȽȠ󂪋VAWJ?ي|fTϏSKWTx;a6_P'جMR`:#ᯯ^~?_%l7 ,{7/ /Sazdqvq!ٱV~ -EK`chiNϹ/E)bә13^tEnx} ;OX#i%T$Ԛ潫T8'=5f\]trTO{sz\TWqpW_ZE!¡_ ïVsop7eeAbb@Ju4>}~H,^)R g[-oUzЇAO=^둺/2xRf"UD'ÛT~G#<썢$R@2+M ,su@3"TtW0#1eH "vp.лn)P@.߽{y*7􂯬"cb[׭߽x}U ޛ>BQi]%땧{%?$zEAH> S?7J!Hͩ-Fȣ͍ tkGNaΉl:/GhmOQcfتKC)ցiHNkg+q*XH:7I O{VZhG"-Ƕ& ?@T8q9R"U6U?+a@j3Tup>nyO@\~Њ}bs{"|C#wмA^fvI0ŀVi#ւPT4+]N`̏ต|A+|Ԣ-zIb "*hN7}w?~sʒ&kLћ`)ȞKJdS4EEHp7G8N8$ mƌFfƣjH9p78RM܆Z -ʢ0'RCrdQf>Dm a0XTpPQipV11VOzH;L`dFc(hD,#͠Lxg+]^.(&(%Vna/nL\ ^` V7: KWRZf(r`o-!(EUT -#Xӳe {<"l}x0#D9r fcz -̒ҒV'Yb ʃ։2YYݱ`A2l1v!VSo6Tz -:bK=Z;/%q@)bf)!fء RAZ 7ޏ,P7"PgB2`Fr:hRCy;8HcpQTl1eFް~8,g@&X!e']YIJ Iy `T:P!"Di tyjG9v1 D$Liu.+)xLh3  "01*OZ<ίbCYibuz0$^9t}E(jK'L&:pJ!)2+XHNVxY+b[耽|B|cqhaՌ {ݣ(2q'{cPrŸ0V8ڧ:d:FYe ?FLZm2k&@*!-<>7.R۾RuGԈ6V OY:v8> gP^^p">\FmuP=ӫCqy_bVMҡױ&irE>s+o2\aAmQuRHdtOwA#ET8>c;btyKtu֕QhcV(\cG!#`)|Yvu)I,tq=ُhP'^a7bMfM6jmQվ4.8NCwgnJWr%J|=h1ޱgkUՓkoAoZQ.#ަz*+.PxUV|o7;}6Uv-WYUv?'VV+ *WY˽UEVVٝt*k^]K=Z[e묲$kN$蒉i;3$o;oINYa}ltgPMJtX\:cG. NN+60-B=iiQB#kqg{1If\hq4%Ba[sIpe6Z %(1O7Aj+JsGjIP}n|CpOBBn_𝓎=N:(\cBYaR߮3pD ?70S0޾d綨B;()9_d"d ? \p!Ar}1`{rw`Vz?"׾#-&yvmq3B/vuзAo|1G'/~LJb"*D ̸l}ΆM[_1d58+]c'mNNI*)Gm'ke,)r`!ye 8TSS6^(: 8WoL>U庩Wr^E߼Wtc"G^TAU UϺzw ձA`i5\C:Qd(:EVy/ -0'(T*Vy/字P ፊ")F%Ze(B"߃(q!}"d;1Ȕe!< )Iađh簛AH" -V!OgLj%cLm@7 B"; !)^ CJlDD0^^9NƨFppIz(f&d StتKd m3vS+ AiJDgQ'M1)96ޘdH -v;6#`LLߍ r$'qDښZY9@(|X~/ $@7.GPӔ/1AYv` ;F3f** Gţ<{2CzB΃J{J16EG8*Q1kI/̩6IL%0[VE-84lz&q#7j/ k'N !la+ⳃD |#Z:#0rٜ0`Whwnk4#n6({9x"UVԶGGIgʢ%i,XӓiaPA@Y\ȭn.-ccXe{BV8CBCt`Kd"]^$FZޖ1]:ئM@qIc* <<IQ u![aTIKUZBN4$QA&!ƒc)AtaΦad6_076ZIKR2X3R"LRZ `TA -MD` %x dmrW+$yEӺEM`]T蒴 o>n Nk6ڝ;GF./97j}{bu\GϩON+sv&pf| ê4â$jS*B.h1K:4֕*k),BG :ӉIҏ#6ǜPD͖e쭅'9yɯkx8?Y) EG2+5c2[Ey^dS60퐹w YƐxBɴz^oz|$+ B DzyW'y5Þu}(9NGw~90,%7qvRqZP<gh9̓Ts8'̵QRS {cF%jqVn $(T+6ƧT^cҝ95R"k$q~0^cҽi,U0^s+Z#13'{EcόSeN+F`3}N'\0%r5먬uֿ[En'Kcu4fL=Z:K.U=Tгy~~~~~~~~~o>wIc9|_twQ")±6kGN[ޟN%w}DŸf-ٽs7x@9a Qjq]8ʖZӬi;W(/.Lsbi{bpH9~(P'ܗ zx} AjcKD0:%fiaUowy5^5stxD9+hZ^i QDΠM;CѴ3TW=jѴ,Vpeq%( ->ٹ8jhV +.<@iPCWt*2r3T{C3fX~X\ ]qT=o6Dh=u*Z*>)2W3{Od=^sQ:+J1{EDfz gH˼-ťX̂͑s/D[GG -CW3ҧ8y\{lօ'2޹83loRv嶊xvI]Ri"ޣ*EM{K]vY@Pcwuz u%cK#S (AQsɠaO# Ž(Jjj"^ϦvnU6;w)n̈́vPi8}i -&ҮO 8aem=Qa.H<y7YDG.cuX+cx#ürέTܝc -.mST"Exe#ϭ(7PHcmsSk 蚂HvDhz@i10S)S`#\qH)k1M?6UV'ĔɩRyz0 h0:m"P[smQ''jdO;[\"\8ܜnnC7I6PĦDy7LAR= C W55L`m;EXRi)FFjDc!S+2Y~Pc,"PlBS1l%v`Nu;(IƂq TMN"`ߋ&L՜~YLA"0u'G(8cQM4^M !:%H[!bNˈ(^`vjv;ߚ'G0Z{nG?vE8LD҉ʰ$氼$ꔩ=KOna6= F|x9%d)T _鴝˵G(ze,MEL)Uj!B.Zsmk3XIƿ\FqFhL:rsB4s -+zf6=fӸ=E?anjT*σR$IBvbjϺt95X}@sN赝z{z|ԪQ>gI},4JmʊEJv̍4\ -~V b -H;(U^ghshI)C1O[5ʋҹxKg R|V=\I'}OVUZ5r'; -U<)wפlPQQ>"|MVr8b*JoG*GB8WVIy]v^;%g; 1%ĆV]Jv[ wYbߌ$,4j|32/"a~Qx25jx3{:$ؼ7_DHuϥ 5  6^u"1 Owz:ƈ#EA/n6+Qg'p\Opyd})d ?{>]R\g#ji.nE[\$mU7ߏw$ZgШt]mw @ghT.J -E}DwEI]|nlͫ?}KV #zEF"[ZNmYF|G +x]ݓ_ѱ}S~URe;I%{ O,W+)7ucw6wfzG$҃fn ~~w~>{?>__ilO>Ox1t/_A+,Fٯٓcv+i'_i}KhjnhivLlTi{җff``{Ct&!jYfG.i9v/>*>K#Ƴ'6QU2>M~b+2׸s3YgB]Ž!>ɶt? Q7| )_dmE1J2}(Ȱ,ghd[7qֹk)z +Z桞O,oV? _5"]tc@ZkzL?Ff˕4%k;5EYTLhaf_0X[dy>?~=)VFvzdc_e6ۚ:2|fJu{X12!^*Vl^ "re@Ԕ27 o>jo,*b)VLkx7BŦH.;㏧PfE"2<eQolQwBW"h-Vc9yMȶc&v%vQSf]8]q9eZ[ \ 4먌؇󂚕m$~vg_W3Dz#ʙhjxG +#QO;<;g'JQc:x=ezi1C?m5k͛@~8CJV<]w[>J؝I4uW&Td\ew[' 3Ue7$iwP'=*sL=*]OAgo4v5UmU +s_w_ZE!y_ oV u/p;eeAbb@Ju4>}~H,30he6R^KӞmA[@r[!/P]YWp xy25Ó/G>IqVE /kSQ")`7Hˬt45vlƛ3 c̈́ +PLP X\*B +P\o9PTÓϓW{e*W/(\YED[O{B7}(*-΃Һ +I+O1w$J,;I􊂐C$9"aNlBT4S[(GmW!4~"o-tP_NbpXƼ=6Ӭr<0yUvuN x ލ줉!y)Ŭs˴! `Xiv.BJy,XYo̠CD-W#E.RR¢gmmM~f]ΗM&` ZR,MK䑛/ye~K^? F*mZ0*r)# O2hZŒ]<)B $d ~7O,ല)}fx9X";ypJ(T MQAr;k$g3pe,ifS0$"3Hہ1hRN|<iVi+xm +ʢ('RCrdQ3~0c? Vi:\b}48ؘ'UCT&H022"Eďf&QzX@h+Uc7ÀDt$WW!Xr%3--#}[AI9A[K~kq5|,1„a3 9wɱX|&Q^#1<fIiIr]'Yb ʃI2YY˯c m1v!fm6To)}ΓnBɀDP$BEn+u"1{(hipfa%v%6Co(TlpVlB/ iY"L0Q1GTq\ +@oD@.c'j<+< +Ddk=S]x})uȑb'g 6RHoK ƬHƊB*A|ѡRz鋢ڊC4,b巈f)~BKT6 xei>; a(֤^)ٶ5hڣFXWK#4hx(}Rۦ,i\&V⣵oJ%Zv;6l:yc(]GET1e\Yb̲z삄Gef}Нer#Y֟>JͲ =a7^YNe-f}R=ZͲ-<)7fY+YVY,{Ed]g}'Ew: wu'AMͣ2vzINYa}l"uT@9wqLobiQNc|w{Y*I,m9}zkkWEHs:"- _Ʊ ;&)DZy Z\G1b;Z{MûO= ы g ݾ;'#=N:$\cB89Cޮ3p@ ܏x{ g)KCH gAo_vh +cB;()9߄d!$ ??ACO$ ]gu=ދp=/%uKH]{b\Ћ]z.mS["_Lɓ/ǴR +83n(/!/}7 C{屓rg$$hM~xF螤}uufӜ zj1JjXg= 0"IQdRHPRY@EimG;c8C VpQ `0_ydqp %1I>)KY +G(h™RԔHRTP)XȒ ZoRt@ާx`rS"=BAC@ఏqܦU2;ԓ9c ++;~źc`X24tEv:z 6X4j7*4Uy-اVVPؠS6#X-#^ "2;&Tl/@%P0N pv JhOH!J\HߥNB 2%_H)(/hNQ1r]y6 H)<, Q+J@@lR+l1[S,&3dxd ) Srr⥍QPLL. l(T9f۩wS+AiHDgQ( 1҅lSs6-1$Hw6&`LLߍ R''PQDad&ރ蠃5Fp! #bw>Fƿ861?@, gp Kz#?(DhGi{cPŽ匑ʂQ ^ +!ҞRkL5q?MA8}JTeu;psj#݇MZ-g-KB7=ߑd0|DK͏q>{J-~DA9hl`gXwth"E6d1Wzma=Sb%6*aPcxcNOLu=h9$gp!R42smc~~`90!(HX"GY4БYX]&g\-aa8&tNMߛd2N0$H33zLF+0B¨X4hHڏMssb[K92:m"9*UZ|iR8ofY 02IMHJc:@Ϙ[ȸ?c3%jHZ3QMH4DDS(+N^H㈯4f*h"u& 5%imMI=XfE`gi'6׻۵w,\^r突ևޛ9>'_щ%{OgẞòRj!? כY_O;n8e.ykg)/BG ?)/~Y.EhcZuU+e1N^='+zq~4|2h3mUݺ%E|g+'gԠ1ɗ;Ov4kY]0:*g ^쇥Bqfќ98#@31q%NmNWGALJn YPT+1}̧PNfҝ;5+k2x'3^żZ9߬eHN^SޙYsT\#q(޽"ډ%fʾj +]6EWiN#o\o.u8kýv_^#Orlru cӽ.ޙϱ qZ{*v~oS a 4njGu^Ne/Ӝ(> ٹrVry[Nc7K ^]ctg`G)AnNv{… #[%m=?5sp"n{ +^ό̈́T.S5<+obyt*23T;L3rfX|~T\.]IWTg=6D:r_mJu*Zx3)2)#;O=sI:Q*I [%Daz+ go!-BťX +!cDc)/+Ďyz cU)?M=eӸ=xJ(R$$^vadj5϶t#x\Ǯd=ݫdc'ަV19UN^mW fEsVBmQV,r4hVDfndxRY0U=Wa-ͭFMRe@wn 4 +2$HFubQ YXF^:%MX9uwX +z M={*;1yM[,nͷ#:Lh(|j>fB9F1^Ux"~#V\v;&U<J^)N ʹÌ^;ߨZYݘ;vUγ:n/J6hTԽ;+E.ƺOz]wr"%fFn]m=m؍y[ֆ"p6rp#3YQ!dDD)Z"QsT5t\,/!K 9Q?Y -j,ۻύ|ݢQ)xzd/X?{~?^/"[7o(=W*X;aDr> +<> stream -x]ݓ$5re>Ϙ lsFa2{GJ%UJ5;wGT*?$'o|pGW>;/\=}ӟۿߞ?WO?=Ǜg?O_;Ts -;ȳ6Au;|i^{"?+O_~JwoQn(OeK/+^l.ˋϟ^|U6Lڨo]JYJ޿UnRN>Hbx+ryVi}/ -b3=]R_}ϮG]Cj :ؠ;g Ѯ;dFY78Ć!mPKLRANG\-'okSv?. jHC[ ->MCԣ"fg-_$ߡ3q3ITh/qO3^QtOJ7ylʡde[/Ѫ%Luo .iy'l>O;G}xHœ8={2{Q.|IBOd\Q bhOkJֆ4Z%$\J꒦cT:ӟ9ͱwkOVڿ0?)g\egEK)M~ɽ'@ei#奝[9trK9sLuxs7j}XCV1um<4eIHy#Z*C{N2+g.G>Gȡ^u >k &pw?S vl]&{?['GG SoΠNzl>xZr}ZuIQG.5iNHdQfXsO_HՄB/2>˅ףE]>O&X$4h+pGW+R[ql{5jWO#To1Qrê~5u/C CHo#7,nq3`$ &-ǽXlcR?/~dJ;A#:k?Nw$$e Nuם6FYݩN;6(orU0ZAwH+Edd07\s*ެ -)7\wx2W^#pd^ |zBsա3Dם!lQ'5A_$6^׹9gy /u\{+g"*r/njǨ?n_fE53d,|tŋS-Fipn3"y(`8 FoKZWIJÑ N="!hq#b@;a8-q|XYABu.Б.:!= CGHg s:eP4 ;57.2 -97dV9u)B m2^ -{z_ؐ" );X۽S޳`%^wڂ Tv T @@x<ɏZ0/\ j|$Uy%Fyr *`ɦ0Y~\߭'i9512'eD`١)jZXL7~JvN.(L|UaY1%>?=};|S4βlIG)uA0;ZDM) -h3uT&"EC+ -E]C-t1C ` ҷ3*iJ:~k 61)w΃CL*dQ MTu.s| @t2ם~Tbs 1\EnC9: hHOs@P- ])v]chh4Xb1鱤\|r([},SoJȵڀV:=J齱̉P!"4hT:5iy Z$b@)%oSlf(_wZgʃaX} ŀTv(*0Aű{ZZ"He$6=? )12hh3HWyiqݝĦ型 4Ʃ$Ɂ8UƬlO5T٦3HOT /SH -,i6gr ,2)ٮ2XPުKvL5wR%ҁw/'<ٔGM7 ~!|m+uqHq{-{>M˕]ה#p] ׵QDm u:6B7Qq&M벨qC9,αכ+k Փ{Ad9ҽ!w2]Qpzމ,oS'vIvRZxBxbDV'>t9{ܠv hy=t;knz=[hy#E]qZn1[LGk9v+td3v?3N%8IaL0@~0Ժ$ F{Ж&Y{uՍӉ㽴wc*UvMbU+g7#|FHrZwOqVCڏNdE|~c8+-U Yl}Y@ɵmzTK?J}VvWǰdnR9 h+RwO%J6t -:SK7J3^mS]qVd~T}c L蓈:BLt:xqj5c8~p?)njxs[mBZwP?8?laOeþ.{WCMg?4xl !Ic={j !vZ@(A$znT *}wi [N&:[89LY._Oa čBi>_>!#r`^^~h\)Y3|rQ.ESOB)l=AZ޷tiMrOouelWO8(o[K=3'ӿk4Q;5MQmNv<+[FZ$|m旭۷U+(ʉb"[ʛKc Unz2 krNRy -Ii`3=)$$[mYO bTr3Q RXr'3pWĬX*"6wR2Rn^ R9߫P]%bZz/̮N]Hyx "vɮ@&2mtPe}t~ NL6?p˪m!v+e3@46'hr)[j=lwʡt -5O9l$QlFmZ9̔CƙڡgmęD6]??cQl pR;!VѤvj {1uhΡkf']=oyƿ -5ﺍ+gr\>BoS\kW΁帶qr"k'3pW\+6UI"`ӊk|ܷ۠]ҍU9rU 3YEU UzU⫙+I;KtvzD0? S_2>Z,Ж//3`zJޯ⩁Z9ia?3'|wʞ0h4BWN0ᚙ9|I?Ő>oan 3x84H+^0"Zԩ{xs:>g {9!b:Y -ٻ@4#Y~0\˞@aj ?6ucK://5nΝln)?[NqYVfx.FAK&go[g2f_ -Nѐ5db*ޟ'ߴK=YK%@n>J *8E!68dsUK-q -ӱVoVx$ALs -Tr PE݉3XU`X7fEUb@L%er&dh^`QH*S/u USRgNUM4a,L "Hc8d}7 Ʃ`],1%|;Kc Nŭj"XM̰\rMPW<:gL ~Lg\"koW%/fp$p(#A +^6|C=B0;Z -e5 W-b -&e[pڋhA -YZ J:gD48'0>`I )#D#e&p^VV B袂 6X)+D.08SB%xJFÈGw$cQ&oP: K dTu^Z"Z0R&Zp'K %=ƣH @0AbZNFl9iIQx+J-U c|FY,> -8sG\NIr\M@ 9%xo2:T&TxOfm(Kq+wqnbE;rNET5"~p^ibGBM,|DڈD(#'4"@^0TdE~x6b3() cYqWR6iU]k;3 AE ɕ:@ \C9qD;vp'rQoO?Xvq("ߤ]U d_3Yʝ_ PfN,SH9-ښ˂'Pw' f y+)my+ɡKZ7xA]"X,Şsb[G%p2);J;_0ToQ܁ tV#k=K$+ ZV.V† DJEgd]7{O|Q CVB5Fd/@ўDZ=,rs%aOhAzz/VKɨwb*۠([0neئH[ң:\ 4RNQM#'Q$8a, FKbeD7S,16xw-j)xk57"ʑw+*Ԉ)zƲ~M0U)l;9+D=$G@H݋3CeGcIB/їY]zD%+wb2=r(~<%cti%3~l9! -48vY1L*W[7̱Dedmx\osS}/__=}ßxq/śOϾճ_>g?vܩNuqt> +IvW;~TŧO;=}su:uyO_~7J_oSO?|Sqi>_%5/Z].>zab)ֆ}C2r~z* e 36Rt-{i^ +=v7 =z}i?~ԞjM&h:4[o1wI9`9T-!7h;_#S55*] +Tߓ9`fv֥! iGA3i.ͨ@{swfJ̬/ylZ4^ʰxnɦMR&9ѸF﷔G3=`{"k27^yf՞1pΝEr{viq{R2O߳읙e 76etҴ3'kքo*`xܧ[dohK]Ky/e>zned;r qa-s'ƾa"_zQVz]LCט)՗&7*sOXSu=qPd]ʻX>A TbͮK/d;1כVS.StXkͲCޛyp+ S Þ ksB /{׽.l9̘( lͧ-)t׋}ӛЯ2c:t,7=)ZhJfrU<Ɓl t\y֗ &C1Be*o3|EF _Mr[`O.Oj3TE3٪gdWte'Fi,aa ᰜ{G3۞F`"3<`a"E'Rt߭LOmR"j 5:) uiH=<X~:D+{1%ijg01gǺ',lT[8gasNI~?6Q[Rf});}tcX&;t +YL:c5YuǤ*R?TXTe4c#1JIyXO]l -57VMެ&w(7tjd+Wt/~<':۽Vj\Gӆ,5q6T:+B*iMgEnROj2R"^H{$θ0&,ڛҴR9)Uw{j>F i*eQ^3:ZbjZXQ޴HH9XސU6GĒ1$:$%Ñ yDB8Ñhb7޽et +18y,HCцL7ptIa:=?:d W Ͷs'ɼ%OakǦf?.9\l;P[bƥӺR܋0(l= +`A3^ABֹe: A{=+ҴŸ7q%Ug</g].F^O0*,&hZ1'΢Czv{ͫn;۬c!t/;!NHYe;"P0Hbl+ l)hv,!rW)z_}CY) udž([ *k䈽˿ubK? +(21t>œ6vXQbr&'Ѧm$tg4 'q (#7]@\s :6`c('BnC9.E;C:@O9/k:c`tq;MiEClEky8oƒ!ɡ(x X:?%L~2{SYgÓCSfwmN\A^ 7 d\ HĒRK.P錡m.`ƒ' I9\䭃d+N0aSFJRER9b3A*kt18zN=.09;e9KZS d;fEA LB4I B{0,\{K+YEAd9|@1cڞ}vpT삧(H\"JB\$A[_;v-䡆's)7{ÓGsv>^^}o~ZTbB =cɰH"/3h\Ѝ +ia备[MrYYTY{dI80c#rb!ʾV9LVEN[~ʲf]iT`JvVbrznU)[+ٹAm߽]V*0)Y'Eɔg"5;\\l.7S5juetljɺ\eu͉>ץuumQ[LuO= yT\ļ{벨q+dX=,N-\W{0$>T{X4tݻgݻ#wY>8ˎC +^Aψ>OlxڊG/gǞ8'6-O|Nq44=9[hIG n[ѪlGO{Wvդu[񸛑+w1ӡ҈N CKaM d%Q^'X8͍u[5[ּ{e,O^{.׹{NqVg<$qK>|c8+-U 9lFWqJȵmzTq~T%W]!+rܾ[GwF.=)rTbH=_gjk۠6֩q)dBk҂FET!DC'+*TkM5~~ЭCMooMkMHѷ6y޵$>~5~82>2Z㇚O6~hnBlz0Bjk1Q4:MӠ4)8Gu1l98lڙlº +'nJ TiKޔkBhl88K mT$celk=yfi%be46*{nѫ ?¹^I/ؓsVƞS}{e8Vl_ѐaߘ݃&6&Ol^ݭT+ nJSYq#)?`d%@x^F$< YF(uʮud]̺ߊB#W$OxȕQK@<T-PD/wp\Ʋзm W79XNr5bY^>r`Y^~h\o:>96EݪG(ʉD".A2$dD;1kd(\; Uf TVڻdJozj+'JG7 >>bfwAI<"f$bn#۞W-MBV-ëA*1sF!{JewVV>DFm/N56p Eh[&2cMT238>:F?LL-Ŷ4 TDȡslp,YDoP]T @.NKi*EJ(4HMC;u/I4{T99} jaZ`}qp1ȃFԋ6Kó1jepNecLjs T eݐ6 ;锷 Pc 1hnQ7 O%$@EcE2]dМg%42 S;@&?RF=S٧9 D+.I*L( 8=X7@酜٘ 1sJeL!qZ:^? +.LbwO[!펲vhP3 L]x0+!uq HOkb~g]Ppf+!c|2S: Չ+7`#5:6*6.F4IQxA d@&?OU>@V`=BLe ?: += ;3D ꞐRMw}C3(Y#$}UOߖlѦ_`_lI{{.ĒbRTS"5Sup|M +T%)C9fdѓj#^xx#X~ UlsLe~tL0WH*G|"GGLOL=`)XB)9XQ(Z7+ zW*`& +4 Ig-]g' S_O[J*W0ٴL;~Y W Jf? *"őGf.r]^.lJp~vuR0'.O]&`J ]2\Yu}BŽO}] ZY%rfIWQ8\i_34Z&-RSWU:H'rm*$X-u`ev5~կqԍBbbXI²ZTѻBTrKYMHoN!stVyM*=MhEUL. R7M"ITBdRlEqBr1N\XyR;I$"LԌH^*#$RɕT2O:qOJ\<O*vJ>^ZkJF[s^t 7S˱ur˕Kr'l?Wn@Y,pK.;RH/KڬgK4:γ˓f wwwwwwwwwgweI3 ` BFY騥' RA*KY3'_*Zx{v!DujjIlyelQ;tŤ;rŗI'v߽W}W_3/^}ٷ߿zvWI`Ixi^7 ;zy,E?C\s endstream endobj 2925 0 obj -<> +<> stream -x]ݓ߿_Mc rrSR=~XMW^]+tl6gzF_=hgM@7ۇO>f}sՏ]??~|~o|?Q\0u眝$6&+o7;hLLn4QޠD8?6L鄘MQsn3NW*esۑz̐]أۘ_?O`X}vwYGz;0h'rI4(6M]DVv*ulhxOݑƬ?ٜř:@Ҽ2PEj7( -׍?d3K#&~f?D ܙѴ!{u_(eT/iXDzLhN%|+)MlX TJL6g?>|hoSnѕáB^$c~i< -?eA+Eh^d -qV1[ #XrOzԋDrg߽϶>}|ŗ_*\`) \G,EEKn5?n593 ^En|ё`ͼ/.:**|C0,0Y5MsqR&: I©$Q&z6V˜cr֝T2]C5[g} 2P$,7ѣWbAE(@XU[3vڃ+>Qͱ)Wz}26H;:Լ_Yv-5 Cpp漏L5_( - nM{2MW LE\Ŕ2kgjMgx{䈕]uvrW幥s5rUZkl"jpIG:D^4Q~g -\<6wD/Īv\>h ^q)ՁJ߂XE(XH&w{a2{/,x)Yc7.&sݹU,dܖ67xT wm)\$B7X۶h#pu],?b{I6%>O<*z1f5@Fx49)9!V= Cՠv d& -^]WG\܃P8HLvTk*Fؒ"?ef+sIέ ?.C uȬLV p"/נ@PJZi:Ƚ-Ơ( ƨy-geW_;}q*z- 'Go|۩rHa%tCU:5]$7&Kve495V3|6u`i}bå@݆&>*G <]% pz;GYS]N.bRv, `̙RX7go㧿oK -"Jf\˽ P@u[h@a-X.!R4m?$W~ -`'ATf?No\ uZhwe:J`2z d$ȶ=ZJҍ@KA53 lTjNp Ե@y8@K5ā5} ʱ\P. -<z(W@=i~LZdu -p5WMG[= ?*KV<#Gςx|ǏsP -\Ƨҁ HIBzA$GRi8 !@H/c ]A H=Vo^CH}~bP>ii`F)0o•L@Jo/O񥜍r[Z;i`l'&?7I$Yt \QiQ\Ye~.܏#$#n# PkxPDJy:ـPKl;hO i(`uڷC$>"'%[tg'-Veks=?z$؉J*ʈX3]4]uW ZԁV(J T9Z> p~c@d]$U`:V窀bv tI [s /Tەcu^H0*eleЎNM'cc]3K>kE,bY ˼{i\1<`$Y*xi R"7SLT:IrQ 4,g^&l>*T>GuH/P6s9 ˆ= -uՈRK y0d @Χ -C5_y~^%ǸE>x$!Q~Űim -\ hi;9ym>H(+-V\4)) SnV*RMSBxs~& -&vf&c(9ZxV` h-Ϋ)[:$'uZԯO+|΂2a3ZI XʤqChðBhAiIntvk?Υ-X-$$kV鲸Rf=cr90R5Pޑ%垡WtO3%{*r}Jڨy PdA9UI?58bG˷tiT ne7F -qco -%tӿj $ckV$|Qt IގծPm@Ob1oθ"oDssj> V=YuGSꅏ.(_^rd1ӕ1gXU -!!PT:ЌޠT#ҳGS5oU"Y># -8')P jq^LmFgµ-u}تRrjI(~s&@Tc {%Bum3 -m -v]Ŕ2[(4=μ>xW(A,Vn`n5#qgw:|!e)R.ӛ4{&Y]F7>þTB>m&ɗTvSP%&C~ib(AJr%CsI# y.*$$$$;ڂ삈zȗzȗzA6;,nOgmZ ȸ3O^)+;Bx* >xC;BC#Ýbyr4[|=Š[jw/D[ɘX-hp9m 0sQ?=69jnB}luVB&LBZ Q3!*-d :!J75fr)|.(W2Gnn4ZZ6 mI6B"kWIcPFWndyy^{& -%K#3[y9 $}f\kdۥ¢T((rPyɐI󳇇^/$WwQѯo --FK԰bKx$عM:;ψv}X7 +x]ݓ7n߿s<3rb$sWRU,?椳S-+>n6LϬ>?=F5(M&fUɆ_~3Pz)Q*:˯]?O~jD45pynbC 5Iwgx++{6Ҩz:~1{hD{Y|N곿܆3*#.8F!y;Mr"olu4tژݧ_/`qC{5G񗢢dV0HuZq/,ߧN֣ MGʬ8ڲcg:nvx;L&kWC)`z@?âƩ畳93!Z@2ڭΌ_zA|f֕8:~6lFz$n7yҷ(ZYN^ΎjM}'΋ :|5io'SnѕġBI+S2j@J?c84X Nvz|ίӾo}?˯RsYݹY0d;tɯGm*b/ XvI̙K$gAKEۿM1.KlC0>BY5QqԠR1υw4ԵB@dZς8 +. 8~a=TN2P9NmmFX46v c̭ŽG:xMݲ;%H",xNSX<" Yć0:cY[\g i'zC{ ϲp+aɸXMp c;eh/bOn=p- z.>q0W<އ".FjNѳk"\s\.R -L{£|^{3e#k5*f~ vX j]pmg T?8dU/a‘{mȬDR#:ʳ^n=8/3#̬Aap$0VTYQ{ϲϕ +rqhMQ̭&0Iہ|ڀKQ\oh6~f5=|-yZ'AN4Hoaf"{ucm{\HpB+Y/Pi&496Ԏ>>i;F.(8%ȃZ#Zpv~77_5۟l OcThLc  5 9li<* 5ڵ|4t@Gl%DF:X"+q +ۣГI4$HTFZ涱8S%̮ *i 㔊4[Y]jB +-#s>(ַNyފS!(61< xammמu<O” #7 wI 9  `l{#>]OF:Po/&D{1v|Oo7ao*j@Kkir1&/+W)h:!8#,W=;kv%^}/=S;2n/efL@3Jr!pV"ב)6 mHV􋲢#f|BKM}8J[ dOdУ uۄj,`@"'+l,_L0ҶF0-z 5Z؇8ᑽAŀž ATeJXB)tG. +#`65t%Y$#LžY ˳QѤ3hTybSE ԙJ%Oc@y!ŕZ%+\gf?O/ X~z/SS_ܨ4(ihF~%ԏp#e|)[\J}Z4,ƀ a}O#OS&c’?/?kTgTVNF}s! +HxASMT_?m ٧6odOI,(N$Ké'(C,K]gZ.*,\-٦pDq|u-_y^cnC[F{cYjZ5;V2'Tu06ښgm'VQ̰L]9B_O{T2`V9>A_7YىM(wI=,!w/-\FCF@3)HcI"j~ K=̀0U/KP l5Af6EVf,,ٽVJU.=`ظ-g:P!2k6e9%]l._qlM9Μn$;c0{3mrnq♦eGWfAIOÂt +4Kj IG[0Qb#ƖCfI $3Id^>OGkoI-3MҕHK $K@IH]_ғ [gaNKs4=ȒCD>M*S<=ߊ<=X(i9$Yϩ$+X-MYdթ9Ug b(3ԜyTIQs69PnqjyRH8XI3+^gv ^K>6kY +_ +QQX%Ź˼ZPC@1eUx1̈́Lg0BDV0 ;@f|yTis&@T%aBurȺP%\cW1e +-3*$lX"ӈFK;}ֿB1 BF= $==IwhR7Eili3L[:11j6ۂ1M@Lr硔JE1HIxhO GJE2d<@scȌ lܴh \]乐 t5G +}-C +q+ +G +w%V[aCg+j*Ic8FWw y'Yr`cT颒' Q\%e1|l٘{ ~p +(XUʦihI_/%vիW_^g-n7oEno endstream endobj 2926 0 obj -<> +<> stream -x]Y~(+bi)d尃d:6C~#@U(Q]YNVD2qۻ~^}^?߮_߿W/s|w7~wOhc@ykQ7."4;hv?4}y_Ck@i=S/Ru *" 476 X@ +T67#.yGطm D 806F!<Iݑrt>R!iw -}e4;4G:>GPq'8ig)-(2`G -]ЊDzBGҮ1D -ě+6 %@HO(=N9mV9MN'QKHxkc$ݣo۵)2j rڂvZRۣ݀o}}zZY~Bs9(u(ݯx. @+ܠaw]%|^y'b7|ّm@Q>9@9;hx/F̌YDP@zEBF1Yy$RAgEHQV/cDe2 eSo)6?ղl[WW<O^1X(p~Fʂ: "@bhY&tkrf( a [| &4*NwS"TMhteJ;/SѬՐQ>˽ϷMN9LX - -g󭕜VdMUu} 5ٯ4=k-m_Y b%I]ۿj0l`r_g8N*LU֬P-*kηU6{d[6(d'fٲ*0պX)QtG]]V!Ѧ.] 4AP4ə֓XL'GFR`pmOX,>iwo(xn-2Ф`FRH]ewLETnۑ)7) -e+Yr\?-µ9Y;82?{c'?iFٯC1_@=+r.N&#r -i7 FZ{F.#>PhH] ~}ww6oƂ2hLc7#NCk4rTFBX0kS68kL舛]Vw6(?ГH` D$?TFe⚛ƢBL5 -n*iE㔊ViZԠ,2 -)(NJ;F]co㕷*k1Eͮ ʳ$B FhZL\o$&!$D'G)Q#"FogCs7Ф{ME1ۄޠmVZ;?D -ؕG87 BKkʁ$e%hLATӑ9(*uڕz[ :2JefLH3@zV4lCJ ʉ[MT"eZsahLav͊{>(v}k'߄qq;) Ab>-':zPGmI* Hd%h``KU6RoDlѓNqq}H7:V(qPgRPBܠ8 ;R閩mcnV,l$}.F؋xor^~0FLOd;]h&%d'dF - -`BN} -C28 l# 8+hJxIBsIh_MY!\}W{giR,moЙo_.1)(NDxRdy95E#ӕ~".fk9J -zZ$#-ve -p3cցI)?hTE}$1Q3Z * mO[NB 5Vٮ}pS:8zMD _{o'uYs83]'cЎRmʉlȷ ZxweƓv%VlBW+ TS3}'w`@Yb wa;Zi?ATO @12 jt{m;(^A'uq:QjH!h ' AXZI0}  -Ǭ#$v#}ES#٤k\#Rv#1Rz~bdf%.3Pγ촯 -oJh)F!L - z<_4_~oH/;ňsl ĉSHZHKYD}3Fyq~d0X|(X#T ⣑9i';<, -:Z.853"nbCJ; &1 Zc1{IڍXH,ȏ<6V֬2v,~@;H eՅBjGb[֢htK4bp%$}c 1UkmuofKc 6D D&)6glG]|LI,;Ƙ}2N%$odT6kOHb_S@ڊ'TPF4sOC'j"FR+[U:4K1Ŏw boġuRƻ4&3v ɓqҢqHb+\7!/ՊFYbN3twŊ`CYPP֖ʳeRiKaͷf Z|HoHg4x^Y_VeiK9J'm͛^PRQn˅UHpUQP2H\ fX%k҂ٍ@=o@PFeދ<=;ӛ@(*e%]$U[R%IF4_m XYS5;SX\vyVBU1Ix7햾o7xѻR1lkZxD'0<.6f6cG׭2!+d<7stfXNd٣/Bub-Cg=<|kS+צyGEAJ[Z.j/B*5× -_G 7hy rbG'M~ ĸ ^~Ϗ{vt0@Xgv_Ǽfjh񍹓WKT6 `5rS8sX Zxu,Ga&Erqъ|Fm$HL!c #Akxʵ<r/fp_2@%b Xm2+0ssujyã<{ z* z=:CJHk-u@":|Ցt,ZG2t/U/U/UOA:R%R%R%'\W֔ ?׊:h hH$2q ЁÃ ʻ+ -0VFJke.JD)O-J ' >U|/ \ V u"-$6G]$Scm }8:W-X;P8ڂ[>X[Xz9Uk+ -l[)`VmIr *-5 M&-P[Mӕ۶1۶RF9Ӷv"6ӧ}[JڶZTJ2#]0 a0!=_nx>ov*Kv}1@bWrcGVk$&[Aic3-|$eT@їv_c]c]c]ctW]·%|"b%~־[E,ұe,w%DpuH.o 8"rxIބKwN+{aIl| Ч5\iVZ {EX(ㄤH[qD;>ژUFLrQg=O0t9ޡ]k]xqÔ7T.JWrg7TTI6FB`*'gw^Ooױ TF!PF(W4T##Kp|sz,QcQ}VJzO#*_W3۫fRi nS^=./U:~4- 4-g'ȣN8ftܭ}Kg᱄@zZ~SSkv䪭Ji4dᕸ.rZɽ:EE2`I 'na,-DǾP@fA: ]iVKBX ԕDu.;'#+}tq/_A* -P N>xz& ik @т@"g JE괫$Gjjzc~.y&O(20q6H8${K߉^[M3")<>di?KZ^\L{WJrM ͩ\!▃/}BFRh -s]i~ofzWΓwtAgEz3P;&}BABVXdf^ 96%M<0$J8}DZV Ze$IBI*R<*($CtAiOS^"-ëDjWQ 40s*^er KgëXXƫ "(>?`2`e@X V -XrRֹ>}5MUiiT5U Bv -QF:-Fn<}A7_h\ b}.E*% ]W## vbְ]@<#3R*]r/GҶx7#+6HrΙ_gfɜ\XZn. - RpcZ vk\/ o0J[%.(g<,Iĉ<̣8Pm9*ԝ؝|K\;t^TPw>*FAڡ`w#Xܝtb-wN 4Cܝf{]pw݉[_pwwyVV|`IDߊ8 ys/T!t{cc(ο#=b.2_;:{>(Ƿ'_i?5i' -, AaV<ٜs0eݐP"b {d8zf#%SBrsYXs\[rJBdX}jSYW:9هCl3/{O C%j 7(i -J`N]eĩÊlpð>8H{U,,)n/q}vwbɛ7vǗw͛Wo;ݟ_|틻|F17kxb5q;<64 +x][q~篘D'q[#R%rJʃrMZJR6}\}`pvwviCw߽~q_}>O/W^}߽}qogɟl)6Lp 9/O=oy54}  /7DqZEO 7'_<_yֆ}߾M+2>{o?yeo&rn b8D|erdzؓ{R_a?f0 rC퇟ArC8߼,uМԌ/M)(7//{U?g꛸d#wCpdof0eƸpAdlt 6S +uzFגٿ\zg>v|Sg/nرݟ݀m?ij07X4Dhd,8i +sEvuOߐ #A(ch 2RЗ;JG)d%CV;OOÿCsxug'n< 'x׼eѐx2#ּl0Cc D΅w%6]&SIIz-b x!/YlMs5!WxedcShP'VQ/4Ƌ[r߀ۓo>m1Ї5GOFc4',^7gٟ7G~VIY6?V= [1qJ kVs]((n#j#W&*jw~d+4[X`wNUbA`\\g@"=Άϖ 4 bxY>Yr!q[&,U tůa9ZCd') +ZO]Tp9{Vy^r${ovM,EVrj%/.OX {*-gO +b 8E*lsAw rqySaLސ dIEtVZΫ,Y*[6G2rZecrnߕY%\lً ~#FrF`%7Qr :r@#}@W>r/m$uv'OVv}'cF|4bkL*}4GѱFBQBz6{0 oРjZc;JrR0{8=Vj.uy;Fo}ܱ5=CCq:҂B]7,dNMdK.q0Blu'n4#XB4"H] ~s޽mS;4E@kg8yX : 8#ccXq& `߈7.zgmD͡agj8R5," +jE d؆;#Ihh(kRkpII QPs):#Dri4UgX#>D0~h\c Nb"qsٓޚmM4$4M`HUشh6IthXLx . B vni%^z3]19L k:3QZ({.th-ZM0D/NdMIbVM {[|A'F ;-e HGLD.hں$%2. őhjG١6ѫJk[ܗfC&ͤ~,olGÛb i5ћL:z]&`D"#A37LCIz`$ǃ!1p|x2 A5d5. !ATHڮ 11b81j"B.Z?<Y1>i2 +b>x@O7,Yf3x&Dސa48d"tĀuQv̓~:] 2>F#Dؾ뇇IvNHU&Z2tN;6F WL0(Vڽ0h/`߱ж+ĉLLia.q;٧U3^V(k;N=e!kSl:Jf+4y%2 Q_V53だ0s%CCMv Ok2$&Fv_W sP__=~ŗ_|?o5]u t!G:[: a3 JY%0d JʾU9bA<y:0vT~&5\vNm#7aIi Ih.E#s& }Avcj)&RD{-G~cGYZ00aDxA׮vƶn1El}gwжRnIjUl)p"RllZ6vu@o^1yW~h, ơH]#[M}=պwM b_dP&Iʥ;/x<ֺ@jN7y2GCHcE]u(٘: + $9b@@te*ޗdH@rY:wI$9&Ys8ƸiJ9a:՞醸;ljB O +Ub:i9Ω0α8Ω]2x-hwY*VnV7a,ѽ +):Kpm5[+qPkx uA Ḷ8:SMc2؋16eYժQ)XiTХvt I(W7{.bj`Qy&>B;h^P~Elo ;/Z`P1`5uK 6vL6g2ų_j#q.KuWv7/Wooli+գ/vNXx^kv~,=Ӕ?Kag0-Fwic$si9?8쿜4]E 18[f[Iz-=9GpF8.uFS!M{\Nicz9M񕃚XP9Y4厊 7ls{B@tj.[8dM-Fdf5h쾾T'FQd _{g6߷m +$ :7=2AIR1'S68%Sjk]W~徟1~_?껕 +}Zs*6N| +[Vl2Q}Y Vtg2}b7`jpJ`G[P%֞γ%帒iOc-f1`'M>SCR3iB%rf,Z01fa=ԾNs9+v4/P,dZZui($όYS0PګkSGroX!N-٢5B V2dR$t*sӛpR8}0e3d'(d*C ma[^h>,QN*g~tLD3Kv +qltCXZ:^r|Ux)DVlX/Dgfkx>=?R2\{ +|sm~pCQV\Jgu%q^y/քh^cgHG}]Z{r+cr2F43%ˁlgމ櫘}yڕy  "ғHD(!CֆP,#*_9qoվroE7rFqf$KూLQ= XXNCF[wVit)jquN ^> +.Hnm& u9eqbo !m4u;,;q]Z*T.h9]~k/b݆Cf +^`Xl aO׍[)G|NWRvRvLDlTg;2R(Re'$:#jRk>k>k>gnkwG~G~G eG$$8FmvI g]92L3w)`<~S8Lƹ2b|X.G/O)VDxr2!u5͌J˱NQSG x{$"&ij}L./b z8;BQ4Q,AOBV2dUoN^b@q@/g 2U* +jJK KHű 7j27zIXs?\$ˑQ!qp4@_E&9y#R8\t8{0bvqqimShǎ!@hu +HN|C +g!(/{|Ok[t'F**7ј.BnP9׶N=_26Nq=ӗEuFQ]ĴI,`IQk-=> +Ow{Qi55559HwڽBWh"bݺۂ"Ih->~p+ }Ĭ8u_d9(-gg + S9E#Z1 +ɐ8qc>xqܧCb)3K@b9]>0>]eS0pκ N{D1N=7N]aXGL/GWFT`t&ZXGr~bմ֌FhvYm ʘDP:C{;~K > *on0e9[r֞gxHNy+cN+-rȨJ簒NB4IJ)R6*(q{ 7rȋչN"' $@G”XZ̪QFiFҕ$*Dzz&#'Y 5I6J3>(m0ԑIU%0ŽTR0$^焑$;0dW(aHj +\V0a7>{{BԞ :N yjv4R!e;y: h+C +U>}~K@Cz-mʈ5% +W.$FҎ.@;ⴾI!hZCnvpǭbvav^x#vq=9ôPSO}3+&]][dd`"R eBȡAt'Se9d7J3n&#dA1>8.q`v&h]XA&?NmTS!w%S] +̮˙C-˲S~1~̨<^ ?в+Pr~_` ⼻''K@,L{DpV r9XjX)}qMUW}470OQ{y:]&(PHs8!}-5*JM>7F80\spW8pM˙`,83 38c\y4s fB0=,[c;hͼW4)pμ™?8R ܸahBBF `2e33ʆ >?je=(N#-N9BBj߼xǏ_Y(=B+y>k[ll#`ڹcSϵ]-}CM Zi2fgU 'Ys<; -G"%0p +:^60 0CY~7{mUzu-hv΀ԱS0~bŁj྿ ,jl! =̭_m!ʌdqz {}>fp\.Dө3Yj\On$ K{Fz+ɩnLH&Cv+ Mc3H崖QZFMIdAآch/^Ʉ9Y +FauI %IsbKfHdAs-sW}Ė#U: C-י-Qr[UX+ܖ.l5gTU|'h:g7[B,p ؝,uDf3WآZ2 +<k$/>Ўą1;&V!;PdCeN ZYZu3!b_H@`ITa8_YNp2RɜE +8{olAZ<&󮒪agku^# +X*ALpJqgB :noܮ +oF y,1 pf~=O”x BZT;%G0&F=9v ] zJл3+AC \!mmbҕzCkIZ(zM Nߛ&c^YVR$v\Vn~Q|Tg_J:0kA:ť;eq_}>7/5߿z~߽}qo vk!̲5$Z9u8mR endstream endobj 2927 0 obj -<> +<> stream -x][\~_A9ZD rER\rJSFm)RjfdͿsṱ/[VM7 ~@ؗOo޾^o?|\߼˫w{⧗}򏯮{J_uwכ>]`ȠA IldrfAAs5"s{V\~D Z[}Ys_E?Y=I_x_A~՟/{>(8A}Xwq!6#q60x/8mV{HԭOc(Ʌ{]Zߌ7SLe̬ dCae}) /|vǏ/|,H`aG*ˉFJBC]QfI1I -å5bM -Ubo -1{9ĭԒx̄s@ /Ǩ}P#r)7fJBNL3oԢrD?Ϛ/`=plZǾB3t-67.C@u #s)cn(AJ)ںFW~c=&sVw֙:֙!\~f}wְ>=xW&w\p>H@f -֌ek7݂F\NBabs:ʘÈ@ѫ=]DN"3D @7iU`z;Cg/:}%̌ ,-Lh*)=$.kkuk]΁^O=`<{a#͋g3|i,08O`Asc18y rH}G>SPXkl^mGZvY˘uwU 7'Wh/^`kbmN$HDoA_ahɹ6Z9xˀ)d4$LYacHjc̚br6Z:縥d#k>2J_-OV>\U߿5 .9ޑbNܽxs0jFqIbugƑxrXq#D -@-m`-{X> -pF(yq+Ac ]% -,pHl PwyPNHǑ0 C@N!Mlek58`"YqE1K yd6C+KGzjcuX_.zfՂ>r[-bdU9(ɫkrcHMlI!xښ9 -FIѯuvulGoض]×YWʇ!W{OmѼA2Ը|}}l#ocoSd{or"#Fu[A `:h}9ND׷_]o6ߙWOHޛǛI!x2dILHH 8$xo\"lֆWgPO6v`9M(Zߐ3hKe27&rz@ﴅަqNs95A &%%=m'1bx@1 D&TY)eOW;Y]dg"Cdd*Mbے$'gě( A)ZQWXvNCvv"f:ޘ1d(`16$Ijmv3}Q^{A9MRk+h -M*b]J Ө$ Nz}F9-Mάt4O# -sH9-(֕$Tkm:b붣c 8C̿Z553ZoFr(]{8, U$i]1ҩmF&ZQEpH&pL -[:ؖz8ph]Fm X)7"[BRtz&DC30ĆG/2vv^TPt)C +)>apTx$곭)3;\wZs=K6$f{<#R d#duFX'7~DAt}t9SD1zk-U}pns,PN3hBЉM 4528cK: TO,V㊩GsU:SWmPyKj;Zm)t_$ m0u]Ԇɺl|Cnio}+lK6۲JNOǵ{K[ ˀ*Ǟ{!X&67vB+RX.9ܵ%WDR"`R̒v 7>L2=Gml- P$@kM\@\,~˃R 6<{N 5L{'O7Wwϟ#>+N:f -VBiueVKmhΓ'{ݞOzr ϔ sQ~P/>~ിסUHˠsXHyLbsԾ,]mSjmsV܇Xdl‰Z4(y~Z '>B,0-`bSAރ'/G%NUByj{{hml/O+6QXy촟puiYoO's9DxRlݨ0syEگQ.!=ڙ<8uC? wyb -~]kP3Epi^}'-yNw`#/\:>ʾmat%hKLn԰de1-ztQQ?̋8H@wwsE a"G Q`_ʲxIJR Ak^#,hO\R3`[B̽m>]lyrSsn;; }b~>yMհT:1xF5mi LeZp/*QX/\6*QZ/vwsdꢪM+=I[ -"x -v֣Ĝۚ´fy~[IRTAR -kGG/_UT5s3J^A!G &KV7 -PH>=K\eb!Hr{g[U^&:{B UKF~E Jn&لw%-V1vqR\HW$ -ܮ5m_GFiXJY&"뀅!ՆvԬ#}dc"Uv,1k6vKS(-K{F{.yڵ=LhKgcjXDѿ$p+B }i9KzuP0GڮM2Wy&~"ck X840rH K3-HyYs3m eN\}O3ĭ y#a&ȷz_=7$Y !SLD%TLߏ)EG^p.tM\i1.M}kpN_m~ŞtO6W}}f?hJw6o ۻwwcىZh |WuP[ -S!O?j +x]ݓ߿%Iu.WdN.j}q忿BO7Yivf0$#$sono_O/^՛ۿ}x'|gW?2hKk" +^  2{v@ήq2}XfL8zZQeܔ)AC82ݼ}ЊV(, _fWEC8ъ\_,4Ri?Q[FvhbFv!0 oytt8}8IR +)l>סi;gۮPe kYi?Dll3Kz8\S?=ٖ7s3xt0d{@άY6J&J\NB-=Vc݂eeaDն~"U[ +duV4( siȆwmT "(R]{=@UrݵvQ]nz+r-ͥ/O4lt>wSTWho*\M]/&щkjbHARZfk4G>8֗~i|N0"2LW ["T+He\C`;WMВ6<dm p,fCv|^JQ|…ݻΘgtAe" % r;lY P鲹~".õ7hhbEmcaF,gwĆ~_,ULgDW=vH-Ud/qq&?|C~-^kqg9bq"G&on(K/YXU$[Q +#V]S`lE0ۂCy8Nj|?m+xK٘<{n#giX` +̓qZa8ocp 10{S(i#&)H,# z]'mv{}yOŢe,触{ŝ{4;t~0B-p1Ip$$`Id 0P\Oo-`xoe +Rұ)փ $mc-́1[缸L۔g}1LQPZN6W^ZT汹ND9qr۫4&:d=# $q:*6#Ѯdkc8\9 cA(1`eo#}Hwp5 #,Q(M\"ll30).[PX}pHl7]u iL%(3QDHhSu_LM#:,^ `0^Vf",sU,o?ZS)c}'ֻS]BJҚU zC\w$ɽqz"5΂N1vozB3} MlO/T-cejg͟Sp|XQrN͇4c]d N +T"HmA/Չ*nĝtA zuB<) zsdwnonn_y4oo 7AEy0C5$+d'_bXT=۰g5 ֻZE6KMHN-鲒f2:s$nYeseԦfݲEYt6uJ@2w)~5.P(w +-B{KOine`ϘNwS!v`l?'s+Y)уcr`ud +ebE6R2\aف.Vrx7S,ǵ?8>望azo+NLxX$6'I#&X+Ge =)O-gSikXe< %=xrrh9Ӈ"ȇ |ގꆇ)k}m6x6S7Xelq uwi-깜\:Sd_fy>$4B%|M#⃺(ty.qq}Epn9]-8Ǔ +b3%)Kr':hPw옃P[ae.ՂCx-g׉ʊ@E ՉڊӽS%3*{O̬!DRttT)u9ؓ[Q>3ijȹMڒ2ڙ3 6skTV)'N^P?[,*kF%z#C;9iq|Ӌ)>9BX0+3[/A;h~# >Zu"tPLtAnk(\`LƠ}&5SL(+3VvuXk- +]I_Vr }]O+K{jQ3s_tE,^ӓI.zw6kIO+{jQ53ұrjXD%fߎb B|wJ+5GtجUsJXNT3̨?YNJiy;ZR%=ts!gb7}E3#4R/291sl-8ҒKw$*W%/(<}W+0xYp|VoW +ً"55=pb{aCWZek lk26Slmh.mo"[ +Yʧי,igIҢ*ZkFg@R]PL2ZPD!Ѻ>@dN#ؒOVkLQK[?} \BJyDE 21)J %ډ} %KO5 } +%kckSms#`,53ROeg̏ZQ)$J@+Y8rLz8\QწҚbȲbp'!vQ׸zreXdsަCTgg`z>zȴ߯:fߟ_+_9¿VϩiP0l/ LVyH15Qy%U2fa!)pniIppW,z=fi1.M}ԇ{@LvK=iCt|_|z}^n5ׯ w^?N%(z`I[`㾪 ª\ kN? endstream endobj 2928 0 obj -<> +<> stream -x=]䶍+ɹR.yv%SU`ajf+$Rjnf|E?l?zÛ}{O_?7{sJs﮷?_YJOPy 9d^mesw[ի^xuGi/}i>_ݧKhB_/ l//_]5_mXn'ԻuiݭGMwZo?.GJ"G!Bmt[SG0}v%`OT4M&( / v7$W/ӫ_JI?Y@퉕wMf!^z1Vr)^p 1蛟W&|h~=` E_kK폌~Bv4:>M?$QRZ^^l>a}[ѧn->KR5/èB @vDf$nχד-LzD =®fNf5IsSfŌaLO.0z`/v'y#t3VZUf^v7˕*F#ѝa4&A>Y^^ -tj5N/AûFK`pA&w*uѬE1~:}0~ʇٓbq}orjҫiVNժx鴿+r3-:pO} ܿ?$gT>}C9!:ÙRgءEy˔f|ZFC\Dt$ptX w-`alk1qqֆ4G֪;Mt[]gr^?H\ Z?U'qB :: 9c -a"{-۝|V0h唀MAlM'C {ʾQaN\ѝ;xM|Co;9sIFա !!{^4sNAن?>'ׇf>9py>(`ѧ~w]=F̻ jY~Nޟ͗)c\࡬dzMP'R#\ݯۊn9K!2wV|JBNiu"IiuڱҊ-e"El$' K.6Ct0GƇ4\tH iGMli`(tv_]e/~VZ:ns 7)o}Ĩ1X'`96:RQ2@Cc!LZyrfX$&C8Ao_}7Eh\p_wK%Sv/lo塋g'd(R8'Ϗ%S)084Sa~<=$J3wT*ZQT$Gp{!@ 'Lɧ7Ni054푇nov! >ԠM JvJ1D d".蝐"j ^>;H {|<"yUZDk4Ra <*-+?o7gA7\$Grc|rZo뜺m:ST>Z_o#biـmvcݿIEE'\MM;lPݏӼ㷡)j?E9h`G1{9,B`}\a*#%GHd hЈd'ΕYiGaEOrɌf7 o7wjOQNE*}n(xTr4蕃=蝵GFrj1$G2h[{(!87G(4Ԃ,##dP`Ls(:`r94CmK,ee>Dm;Q4z-!j"*gŘ-!ڨ8@#DFTA(MQ$w6d@%5 $( -4w:LE:ި Ie!+GSfO:t =Q2b&NdPd@gB`[^IܖY2*{l2rr4QDQ,PD;ށQp'C -g',EDl",Z7CkvpB4mm.ʦ֬͆ ϛAw4^ZGi^؀`c@fDf$ 7:xQ֤Q9.̤mr7Br gx B;'AQjp:H -kAt;8818p $h4 lA ,#ӣY4ɍdt{D-!:P"B Lmwɍ豋A9uF$O (sh{ ^!P ɇL &sg/-0en47:C=8jl}?e3'X_DR҅H-k3X:vHf+,ӲVlG)Kocs}%bMj1Z,X2: IV?bFi/}{%z?c F`2&0X#ytvqE.yd ʙn:x3dO켟PrqUO=-;'Ozh5|ffc%俐9UfS3*g=t]o8&.T(C$h3W6ESJ"' DZ*< 61,f J)_NQ?b*[[5(QU5-P$36%񶺲I9$B5$&lROzKb +I)SI9~7_o^_}WZ?kXrExx~=}{ȟGYxɊto&h6:wk>c$2yxE8w=+ Y# >M6) CNƪUtvx)A`Gw^ɔҰi(iY}vlkq^;*$I4p?*S@yf O^4X)?OIۯŞC2q‚b΋L*G= Gnɟ%f Bl8g7зA2N]!&g#yt}{~ܱ5 pE̟j~H$:%%J -a!(6ME4 $hV}N$ud? nlP2TzX^YO&*tsdSBjm4 P2y-363(۹OY#Xɱ:{Q|GQ\g)Wt} ^Ry ->Iz$N}|i=JJњ2j89S=gLz>?;#CS_Е$`V^ult{‚* IV?Z@n!xCȾ&*F . JfsJvSt X[Ɯ$Z]tVTf܃$:'[P_'rAF~:q5C -y򦓦9{_B6箆b -OKb sޣ!fqj#b ] 6jX7FEB\].|60 \,Y'Xel~k^l+ '۠.< eqNQ4T&mЪ6c$O'ڇeԦXqーgLt[(,8ɲV;5qnF>yfuE/|?EdxN)wNV/I8yV/Y߼0% -qMCܔ`yRofI sd, k 3iH"g$XԛYRoDHdSzBRh`J&0O4Vg2!shg2!Qɸ_W{$<2(r{Qג{өb]K-|t9J0pA R:TBHB3yv!DǎèIgM*GLYWh捦[.nd1B: iBez aRr-Y:X1<`@"l}vmkpp0N1e9r `Sj-5D~ʱ_cER%OJv|}>}fIy}<6^&1!0N$$$$-.JV㩭S[@=#,=1 %y '1E >D{,uY~(MJE=8bL;[FJ Q&CB FeURΉ%kץL*B?,w2 e2~M׹`LЃu܅.Xh(6g=& Mb! - {2NC&EϠ*ocWžm`聁1]) ekLeX)YRBǘc)ˤSWRߘdXh'J5z&%m$peQ h2pM`M.9(ԜZ+4*8{o_h$c,V/KR UՌKB4 =g 4]84 K Z|VBE`i|gE5ڌt> L~g.RcY8kn1DDr# -^9&cw?D B_Ir1bxʭ eG8o9ʨKd2ö!zhi3Dݯ)ɄϷow^z+ <_{}sK?]o|wW vi5v}  +x=]oFDݍo7宏Ze& v7,f{lrxHvj(Qr%bww?}wwכ^}?}wחwտջx{}>{ӋlLcOs(Xlys14ln/{0va/[02?e-sj).Cࣸ+{xǓ؃9>,1K/M%o>H^@A*䒰z ۗ_?z^}߿h̎4<1AʖTn$ݿ?\\@1%=ؽ mَ*8;a< Bq :9R//2|/$uPඋ q؉P+ag}ıVe8 1cj:O.::,%+}2lʀ*37Ř~qc6Z<)z ӝcnepB~щ\t^ݸnLݑ6( >HDx]Dh|Մ`lxS͢qˢ9tM'ZEzq3^1̟L]`2#s #6R~Y8^~cd.iҮW4(zhEgǛh?NhKKqу ~©iڕͯ%Bv |;Qe`ɯE"Z~|dGWI@`9=2l[p4T@rkS ;Mhvf^]9%6T H`@DkGJ{A]Y;'6 ~a堻{'\`^+7Bk=3ZI-PqAA*Zz~T4OI,Ng68'¨̹ޠ;5h>>d <}6g$Ndj.2bo{A*v1CՀUIcba:PWaE͘]\]u#ݯ߮׻#a@Dl4|h5yӈE ܘK`4b07]4&Mxb;DpL>AkG&MM7jdS'I417ɮKMxύGh͛)Vi0$ЦD`".)$Az46 h ^ (9ѭemEm2&-,SdyqV2Ոũ">d'm7Fvʔ|Z #{r"mhτXo+.e!h d穴A䄊dRwJ5x}50"qgÉFA(gKg,RQh: +! 2H]$A 1 ROԀ+'3MnF8qq~R׫'D %Χu&Da9‘Tty%BikWCHR㜛2@v5 (P-aI6ۉ+H]l^+RϞ5yi^r +6X3U*Z|\ +yĠcSJD +|MNn<T{+ B@#UJL⴯X*G _Q:̜TH9kN[+4%cb!?[jș'uA  7`]6>]>-I X-X-X-X-trrrJJбgBZFQT Zb4 dCU>ԎWG>J s +}+W3JS&^!^6z[H:u)U4Sx윇XˆK# a!\ř\31t}*ȴCbWhF[+stAdt5#k6pdmcT}t.R'VIWNZAS9A\Ñ@ U&YKun8Dŧ-Se4TAR*r =E1*q%nJM<7ARw92HJK`:(@5o}Jy &@4I96w* ˖)xapP<.d}.d}q'`*X<$ӷ 0jyD/Zj:UZpPfʁ|w{0)C%rO*t,_'™swL4S +ӣ~Ϋ_tZ/IJB7W<BZ{nMQqXgf6>៭eǔȏi1`ZoHO,A(gCu +4V (cێǶm;~yX辘WBw7s'LB5sq([I4u+e)㈅6Yl5+Bǚ,rvJ.$z` ,[3+X"}^Ԟ}^;>XWE&pbuM@[ǯR,4IzNĞ k҆vc ͐>FAba]ǩ>zdjv drjTn=6Н&۠Ku/;eMRtC mO\遅5Iя E/tI>B=V{`}M὎?u.Ie-:g 'Rk䟮%_j_\3ڂ:Xtlf n2p5oN)E愭B_Qi{ϫF5dY{ٯ +l`G+efAS&,!m{mc_S&,u;.h8U>+y-}Եy(xO\م.%ϳrjiWa֡Vx#+j ۨ).Z"t h lfKdlSPS{P2eafIIشF5ʙv63cgs>o{滫gӜ޾{n?~mattn1ߺ#iC]⤞.h) '[ endstream endobj 2929 0 obj -<> +<> stream -x]_s7קl.^"%Zljvsʖ]uqɕ$'Rw&ٜc; M _]n?懗{O]^(ϫwTF>pΏ2"_8*؜og_>?{(m0Q/*Tv)շGu =գL]H]`}ϭۛ:OjJ}֜#gm% shF0C^(w9˯\l2:yJ6QkYh؂Wh0WiZyEau,KFU>޹٠Hg' 4k+4688>a#+B/n]r`ETnhz9lIf&w95kؼ'bPۙ_cܞq 5"zEG1[O/Pd gD̃6d 06B(=tHlQaBj9( >lͣӻm>fr5Tko 9gpS!i+CtH~dޱ7Mp9 /{Tg/ӧ_>}cY\`)ĩHg_W[JYP ~J̠W*JɱlPl_>^5R ffw%kF+w|y Fw[?=.q vg[8Z#S\q;aWWvy ޹~lFb`+BiFZQmR*0V!22="Z:5I$':0-j+-ӛԠ3So~ShRo>rI<᭯?/QY<{_ 7_7sjn6Z;jTsݰ`F5l 5lP ۛ ] ߖTpJX4D\v mruR@UI*zӨkooU9{ύCNpL0o]ʗEF恴i֠hlBJP!)?llqR -hTP&9ѓ6)=:iWO+HHvv}Fۋzj˵%ݪڣ6W[ Sί܂%t5kO[yE+ 2(@* *2q"cJQ0mh֖=xvfVdm[5$ߜ6,yAapݺOiwޓWJvB@윮F`me`#if pmT|mP]Lh؁r*z7_G -yp D;+F=V74\֡~GP`OYike* 2:!^'D Y,ӺXo{5%ț( 1ko7/n/?楱 - *4@GMc mX` ac -I0(װ5qf#2Y jm%r 6=IFK`YvjucPQP봄qJE L9H(\`iAװk4:%ʮ!(6ր& -!y"f Ϟ" lƋd1ܖH4$[gMBN΁1zAxݐط ;]OJwL'Ƌf ;ވGّ=ItB}8PNȀVb{gd)fAFn1ATiALɣֱ+Lm(~+EH:鞁fz!p"V"Uk0+,],bh 4)eVk[ܕf|BKM[PЎR{bր &pP 6-Mz-r ^sB)Cjo۪pfnPnG@EIzTU!jPhDQ Y492ђd/{OP.ngŒ7v:΂Mj$Đ 'DT 2#P|bgPn$Iv!_9Fkl߿\D Ρw";qV 3OozwZ%o!>vvv TZ[ ނֺu)XєAkc m:Lv&+4EAflě#8rqqJha"qp:u%{[2M~HO4xehYpۇY4 <_q3`&+E,Pв{%µL`v\G| :7,v}3nX#x]}L$J) -b~j|qj'X9"KrnS1'=3`ھ2&e1fT^FzM{ʂtM`;q DY`P,i-{ځԣJ~*)Y%U/G?(=~hcY|GE 'e臞za$`-8g(HJ"-6~ !u|~ȵm@?ѱd&)u yCV;~ _A?,|BPLNUA+TP(nu}tTs+z3w`;VW -cU}=39@f9kv[A[MErtyŖBohی/:e?\jVp -vMme붶NF"-2ey#)+X^JQ_Κg,p,IrI7sG{κ3Y:2'q=R%Y4?ط'C!o3< ɡdsyiv]2++Fvp=S޽)GLP)վ { ?8vX`dW&#h&K Vz|_LSWn$#g[ -<:H )_zO i=I -A%'")=ɑH窆 -RGr$GD!9޴ g=KR6m#CY595u$Ce4-8G: 3 -Dz{j@ ԯ@i/)sJi+ -u4@ڲ.X^ɏH➽(=i -N2Jhw$ItޡtS2FDTÁTL׊B뚫OpoerVXURTVGʡG|+ٰZF) -_c.J-Fx0T֬ȘON] ]E#I҉i wZR|'=+`=w|B' {z+N]O]O]/*_Xԕўo&j ʄ .[ލc-i%$_߾Q^l 9c5Q鲿sbt.O:^wɴᯇJ:}+KlwzJ\$^=fQXP; ΢9\ZV:6\q{[jH{NdpyO"=1!J+HH=#i_\*5mD:iY?R$H=#s }{qt[g-':ߊ ?"M%U.#M%Q~,\vDWhR]~,\iDH6$޿-;jua!]CUYZU:2zB!VU|(qp} 7K IWѾ(pxv%uK13^:RT #o3ϛƎ\vc!#G@ 7p "@-RH$D*8!>CBr1BnہOn>Ȃ}[7 "IMt ^{j{4~g!g#Q_Cb;N/S.#g{{ֶ*p_$b ="!YbCǾ 2t&CIQ8k}D8O 0[ JGW^1E> 1u˚4nF=;, '4H2ӕ;!OGJ@GN_|7~xLƫV̐Pjƍ^~_|w׫{q>}Y?~m!Bj=PpP“;Z!Ar +x]s7_їxw"֕ZljvsʖUuq䉵$'ʤBO7|уf3M œ'~|{ϯ.O/.Wxsw~//VRX9Z ju{RJUξTuyq*{V^.oRҦyͫk^U?ѯO*E`S>;iô {6MTÀFJs/]DJ80 lg^۹5 bs}i>=Ǧf6j9O:J CJ +>>wO/|uwOuFOP9Y h肢lDsg{ +Nq9M/^V <{t}d#r2:iSnZ4 Z>Lտi\yEauKes?@ra1ڂh+nj|3jE709F)}߷:y&ro5bhb\]Ow(rK-4[LQF~2U⏩EA}0'=3_ Rw1X,)X@ihvjqV] Ul +W @ahDXhP;fd'S64hQ0^As^ qMp9 =^v4iW~gϔzٝ,h/G=6`R(.tvUSlGIُTKV]ѓBl7;_dtZuye!f-j~uW~6/U`P1 +.8n+c hk:c+`8hYMGA14U+ؐjVk+akԑ iITZz4hH%˲Sn*4Հ2,%ܤ%$T͠S*Z`)5EB!pK˜ʸ}[2){Vv A94Qɓ΀V*yĕ'da#T^$&6FҪ":kMBt4 (ƹ + *騨k9I Z?xS$(x*f]}֛i$S2Hģz4su(mq4vP%5KjhF[ +jT0SEj煺2)fl7 ȰJ+.Ҍ&i`V&g1l6lx&r~̌ )IhҢ3dXCa,1cJ^$-[n3_ o3nalsr uXT$cJ*% N..ڌuXuadEE1u E;~lXdxBcDUt<3Z&uD|A9d& ^bo<2 N0} !.S8%Q\`_ۇހQEkOb=!F t 'u#2 +1iZY=dzoątZ{v%ӖA.|P"U\) })&&ns] ̠ޟ8,' JЦ#|3G7x]gwcհBB9Kܗ`v)86ĆqC-X J 9тƿ&X=A˅n@.(]{,7|-ȱy@g7m4x[ +yK #{h|3=;mH/AfL#w\?Nl84oFc0.7|4gLo1Ln$S=\0;U]zӅEQL\cEs'miv1sȘWēdnm"CțЀbNy{x(fB%S)TH.N{KH.A臅tçۇ ,9;Pra6X2s4 Yמ,^1/F<6X<ݒ#`օ."s9 ޻\J̥1GMr#Ch13= K +Ck(J 4؎Yp2;_2#taLvKѯo>W"S4Zuul|al9qz:QA^^m`{5OW?p{⳷oׯ7j]&uB j۱>fp"je9k, endstream endobj 2930 0 obj -<> +<> stream -x\[d7~_pۈTvٰ -. ڑx`ymvIPl2:= au?~|fۿu{m_}noO7>zW_;r}HNRfNnwv8t^\;tw}]kD}FMso16ـ~W_wx}sEoן]}r}rR2xҹz ۙ5FkWt> J2;=IfϞ߻s`?.[3!?kk†-STꆩmA/{|D%w(.IxET6[B%|ъVW!npll$[S]{{ 7rQc|ZZ e!9b%Hk+x3Lyzo9S@*;π{)ԯ]2$bW0Hx2q/锇R9췽`(#d],?na|X]Fo(N\VPd -tfJՋlg7=Niöu@}Nk0ֻ EqN?nE|T#yf3#5ԫ\!48llPZֹjCa(yevq-^7K[6"%pl.J$8gΠ/դȶ}76~lZt  -3^*_<4èk;/4ҌLpjA9xI_iqE!#C g<#4ϗ)V#S17VċW3p^AsZ"fKYTW0?`]>@dt#zB1>iƙ!'CIB!Bl:ZôXEݴ3L盵Pic+'`zZ|?nC.nLJpfG~c-d.s$%n+40xH%0+~sυHϖܣZuyڲT -VК(%z""sαƶZ728{ 3Ia!ųin"0BͿ|'ܫt}Otn*0zuԋ81T#ihX0Gju]oOT,zb]U=-_^^}@j(PeJ)i\K֋ -Pb'\`R.XЌ1]O kt wɀ+~ZzAi]}qseC'o퉣w_\QX^]}qqڒǰ4$O(0 !G ꇉ4}c|ݎB\3o5AFL~4-䁑P_1\wP1㹓}Nfެ]VB2#@zY }̳"Ӏ9BH X3^ˣO-2% -35`Ef5pIᑩYe!_RIePL\%/o Xc3SƋ rʹ #oY. b hf|U'@_MFNFP[+jT7$^ fO l}AJ}׶ՙוyЌU.}X~}Rb!Y5[dEYY2 -1k )LvN"H*Eё9:|S8fJZǶiGY]$ L [q\R)}IIHT4{AO;I2 Rj2Er.ZmԬn2HIKV lldWlhoGY+{ պGĘlo_b' "z -lڵ4D}tAݻd))Ĥ=+ WԒL"d+X=_}A%9%oh4$v㦐h8h*lզh%Id"19]}aaM&+DVVmyzZ @_E$撖A J:*3*hcoKl0beʘͥU3nz ԚC17SoAeVzt[P{i21iGArQ 1hRd;ހH}A,"\ZP !B$sȀ `( c):2** بH1% hm=h3)xRy:KEܘJ K7/9 f$0Ddf[+v֏9Ș|EդNM1Sƥ%bP=}0fh*级k6gPʖ)ud@b54 }%U!JelUw$YڮÂ]R[&LUӲ沃*-x ~-Cꉩɏ7᠗%v+\e-! 'sAZ-zQm@Ojp@4u(3` 0t9{U RH2eH+ .*VיLH拂fi^Xj_b-/ -/+UOx.5Ca욞fۆ̗OkۿL=:#PEcPpܩf$B.hDOwr3Qixwf߇~駈GKc6 -r4"X)}oN|S!+r0`YoR?zcL0A+ -b38j|(ίH{m LOt-O{etf>NC-ɶM…sòKpٵᘷęW3$S/> M+H'{p k[㿿/^㻫P]zlq2 prBFjl"z83:-d]ޞh3/ -j?,:8R>!Wtt&r-DAx}8}lRJoI|7an ͎N_+ +x\[sc~ׯ:dd[]YoJjTL$f;Eil>W(Rу<__8=쿹_l~z_.pǷ..~7/sС"; ܢ~}xu]=\ޢ#rW}[\[D{+7Wmbo]?vAM,C/W_^|~urbOԉE Џ7`ou7S !i=b4drNV?6f3ІeՇzJ cJ~Զ`חo*id &9EF@?i,E+vy2_UðIZj #z +\!眵jtHefdZĈ/w}7+` )5CfC`%(D9 ayQw}< o)>GtCiYnjk K^yllۤ 9Y@l6PZq2{  sv Қеf\hyY8L9ACϨn@~?7z#=2E/.: ΛL:4\э7}'##;Q#}x3^G EœNӴR!r 9@\aíD2,|?!Wڭj"v pM˞=iZ~(I(fP<9zBr, Z7p<4 ib ?CO{繿+`(]CȞHcpo^yJѡs>08t;CX/PbzRz[%f`V8 ۓM=eW SahjGxS{SB!A(E r/Y/*@u0KIܹcA3J\_P.=-XYCYC$S}Ȧ +.:Ҷ#iun]ec{ş.OMn~'#zFH$WcۧYKq>Α kop4p3Ѱ ʤG/qqAiB$@9,$/$!0K>sxRƛeݴϐm3_ySr~~ZicEr*H0'Y`d&%I9l|FlxwWySS;Z9XNss 83n 4P(f*:%/niۦ۞+ۧ8 %Z ,|oS-ѼAӑ: + > Y)ۖ=mW0Rfߵhuf}]4` tk=q=i-zp_~[,pɚUܝ 2ǀ"xʬAټ@DHy5|&eq['$XxLډ3%- cgffkQcVv; %/S`î졠dT%z_R3D2Rf)cPS;@RL!L.`j;-5ۺ |UCCb%Uy)&ZۑV^c(je1&.IB*n['fo.;L1%łRg*Z)_l뱧T@S6KC(zoG:n +vVmV"DzSdO.Lji}G!SKZ5+M펽`i[ʔ17ڒV͸-V[Pkﯟ|ەtR&.[⤷kîY< +XaGۖ*QwDJ jq%:<7d |$1"D9#2(X !%Stdس0c"Ŕ$3,''vf̤J. -snJ/9K,N.ɶgbS+r8 +[ILxOPK ivԕC'agEVgNYᱧ p ,-q&HAlbbf6ymspJ;gKY?j_[]QV^L8BT9"}N9{{='@+> +<> stream -x]ݓ߿r&au]l_9eUC݉djwJ_Mv=h&? n?ynGOݷ7iwj_n7={_ -)xI֢.(PNBv7_)^ݾQx=?^o>l6z߽C)ehmNrhP2D*vVvR>7(fTHAm6ĞfcRYNT25i/{䟿>Oh7 -tOw_~Ǐ>~VȅN{J8c9gyoKj;ZI곴+O2}Qrܠ{ZBU}?L:Ă,"PJ<տ'fv.GicL$Xn7*3kϳ7FMSV_/itEh@N?L $=?^O -P2+fq혡ѐZ||m4(HG|U?3BQr䓝z¢֞cd%st ͹Wu#7Y#k6A;߈, Jz^9ܟP2Ne="%Θ=yT #uZoQj匒414)K#1I@'`gaݛC9TwbUYY_ۥؘ#8{> ((تi6OU=mk& 68jS)@|3Y"?577Va2ƄNrQX@Z%qV.,6T],`{mH)"R/#e [թdʚN؛K3ES5D3ѻ5) }ujAo(G <R9Ls;9J!X6=C|y/Auz5Q^yWC#SebX^{Z?˗xΏ+! -lƯNNY ASy[>˷U[̥]8ȃ0lyѽ&k\ -TS%jB5T.r56ւZ}qFg5pl+O6T,"?#Ly>:n1JRV2_ A#>?ŗBR<mr$(0j!6F I6HoTAtRKAkjC]tlv ߝjZ|Y&Mp/d[{E88-Q[ Y#@Pn'R e(lZUA&*5x %`IHv SԿrdHR|{7dv  RNBo&;)|{4,nh"IS'i*CR d It'YVP5L_۬7\ @oML`|,5!9eȨ6uK(58ő:(A*ON)AI reDyM\gdRX+:E=9J~b'PB 9jXBFg׫OtZ|ueEg+wΣx_gYH= -CYWH]ǖ5)λ: HZLjo IN CE] n]^r𡬮~'rgT!y Ⱦcor'vP{dM%U~JW\1fC)=)D祩s1RO?V* $*;XXqzoD=9v#>Q&œ{ htQI]D]VQ>djfXKI!:a7O_=n -MzIf҉l{hC-oG5[s!H찏#D ,pbxI=Hz :x<"#PA6cww&$4Ž]c<5K;,(3^xTރr d 厯̷ -qB"6x=@"T`- -1$9ǒX4ccIoe aCա)vcYoRnW@PJF q8 },34iQ%1 %:3Vz,90_C1 7 - iJwDz( E׃@D2ǽ8+֬Ki16ԙrztOa(݈^:I*~l+8{Ud=hOL:URWgvB;$ǞſLjal%~:7ײgz@#} 28W`ڥ;;mTR{ZH~"-Xo#ٴmMk͌Y 5Մ`LXOnh5!<4a\`1F'=(KkG jGȘe"hۥOT-k@Nr( ʬXgT-EhLZy0û|8$ !.geDXn$kd[MSTUT7j(njȌDs쑈w<GAYoUDŽJ',[>e:ڃM n6rZhA+r);(ʗ2S.VOkd'IG;\NR9w|:4DtF"^ Kye<d2LDރV[](/}mnˉ% p3&Yod]Өa+JtN_q9cݥIuk{LZO0PAjbO/-7u/Lhy:{e~M!0$+4/s}pÙ3zǧ;4p11Q-qmRT7J e8FA)KD?&PZ}&nbh_#s!TϖށR6f>vi 0ޮi-ne~,3ѪfxljNKtBVtf؅@A])vB3#t?Po}EB},o;M`sqI#Nn0$ߘ sFPzGIi4fFj_Tֻ DC9"2Ixľ .4h+D4oVGU&med} P)R@'>dkXIS= -I񬔮FԿ~AJaY+ G\(Pw1Yner%wx,c]$n9y#֯hi*0Lw1ITZ$;9nnT|t4'Aq*l=–AYs1߃K.eI7{qx妍udCrl Rk/lUAF/mr<5pd/-H˧5\\s&(1 $jPbO46Pw}fz-/꫍;'usk95[%ŧh^ Ґ]CLB'-',"֊CSFYot >oP84XEa-/^Jrv 80ce!4 TY)UqH"w]^W8C)[{aJle։PTe䘊4sPMFď.»b!j_o tѾ@7]qru|/Ϛ-,z ȥ OqdvylrZZ^5(Zaҫx`Jz\G<5{PdIuYHTJ -`ѵ5MXg9xRp;р5p9WH:>˿ާl$]׻T6~`@@E~D8)8O7#w˒#~fG+2MqoPgfy٨r.2 { r>}f3Hi]ƙ6֝{WL~xsy]w1EBj.5FWh2 ݿ'Vg&MǨzk0N]'ݖ^qRvKfp<k)X~~沾af-o -ղgfmy1үMG|]Vg="ؖEq˛Utd> [9 22]H4r!:F7%]ekaݐDq}^G+YYZ -b -"v箺dZc}w%1\7De/aNwư1Zb~}GϏOP&[W&*t#zԧSzZ2Oݷ7?mnG?{fmo{汰oGq ^Ӗp*ZiǼ?'Ii +x]ݓ߿ta ;qN{HfWK+t7n3X%  HOf{GOo߾__~zu__뛿~w7㏟}B +)p 6b{{bճBH(^/nKIfIO7O6qVf(_z%7_է/v_۱RszVx >eRnH] +PkϺ0tkb>`68 iʌg/)x݆0}L,_}sG_>O\:pڣ&眭s)7gGӀ }[K4He1ћF{! wT?mHFj${@DFQ`ߝQ74XIgؕ5óҟڔjFE2ad.B앑A>̰e-b&뚌C`qh<3';lt_m(xϲ7lH"qS#K-lh]TCUZCE,PXn|r.^8Z&$-g0Nr Y囜K4IhsLj݋O?LʧZJUaT͋^W_W{] +)?^}$޺j"csl)_-Ev<,b AK:3zIp+Qe``a]f7Brkj?lѹN*C Mt'㍥ΤdUem6匞*X|yUt]\CAg:{XAeœNF37w'sLef!grݪ.Qfc*fzIFfʓghNQCfwݼͦn>_^ $Ny ݺFFhGuJ:мAMYGJgqtv?=$0h=]pIvg%AS6\ɬy+34/\;-hhDUa'4sN\F?: += { 䑆#uZ@sYzTihk?Ĉ.ZZЊОmD%.-dd0cczUJ ΞJסe qj0wCa'oFF@.Y5B{)Pҳm 8 CiGX2o/Wz*+vaQ,m@fNxH*+9@i&c(w|e ' *#9ϣ4[d 6CeIDcKh4XǞ)XǒfCSrƲ6CߌݮbÛA)kvAncq],34iQ%1 %:3wBkvcyP +y=֯n,;pl HJ4ahw˲( EMD2=f@$a, rH#XܩKJvӲAx&KbU4,a +(^QYzYa<Oqp3t,@ ӷz,q!2@*/VxC"3I+8GԶcv/gҖd7c)~7V7rrւh~H͏⓷W.Y,*8ĸ=[57D߱FQ#jui~ySaT#-N)79DFDdً +mg/JkD-/,ST2qz06Iڱ$9,eIwxune"F.t/epTAjVn*iCI.n7DV=57V'dYZZ8UdFenZkfJ9VDNd6;~VFa@q}mm'cݓY۴v]V;B-Ac6%~¦hX+ IE댪#V@.kw9Q}(J3y0y|X*ٶ$L7୦)wG1!!th=*ŻNgOI=ytBO Yk,-||y_z{mwUn6=PNuqg mm$҃&lGmγ}&.rʎ2˧LZ?ߠR>Sq ۅdٗ⸳rFJYSАeIM@^+M?Y5n$=׶zh +גhu_{@r Onx(ͽhjd8] ԨѲ b$A:/8fj21Ju9` +)4 @|ĴHyLI=9%1֠;o~Cn$>h4 gk`[ R#hfCyF ?&2:ty_f;?+͖x$9¥Vĉ~}(f!BNڎsfӯ,\yxm4 ?4 +gj铫}-Gati>$sY);iD|y2ƛd@5K}7o-$˛: _(A'&K+pG]~%'Ӿs~/u9o:G֑}{7rR yL&-k\Ѵ25I=Ѝ18M'<'.Mk0@.p?tϤ8Vd>7PίΒ,RT欿`yjm[/FDYgh߲YϤ]m<8$:c}> +<> stream -x=i+D'Un6eUHF7O??w߽oGp`8cP JW;1~ѓZ ӯ/?x& L/~+A[h˧~R}هWOO}^:gBLq\BđYJܟ afm;{*JL_EPz%78j I5ɥg r/y/>?V}M?"&P?> ΍k9b >MS 7m ~?m%I/q6]?{/>GO+q[+-5L59—L[.4ʚ{O!펒X֗,v 4'_o9)q9kWi.Jְ`:]hA4rDjz{f޻Gtӕxrj~oeoeŮ::?je,Tm<=E\糉lɶUqfw}'PliܼZfi.`j"U -:/ӰqHmj9f@GLE)z|s}w$A p3(MQ 3h|{W6->hmFJ#Y ݣoϣ˓7UZ?n `ʆu[eѷ>n8)A()zK#JuJ%1Kh^*$=ZEz6K8p҄?ۤ n-CAHye(@ ~qyF (u㺣qA@wX)QsLFR1C$!$LY)QwΑ5#̸ 3XfШ,o"KGdY*ޙ㋻`5Nizc Mː"w;6Ho Ւ "]w#^+/$ -z%J*40Ң$H 8 -GcPBj!%Av<~~wd#AzsëA{&@ 4n0@ybj)q)=8Bjp]lRrʋ0M[ND  -8(^i%'-b@n`Efzh54!&7`h4Y0VnИؾmcmA89( \Ϋj[ z38 H2#$/qJ A*Fcj2ݦT# -eg߳Xi&8獯~tMX`J-dÛSۀ8t_Za+J*[-cӛB%6o #Gӂ{,63%eXSL BHx[e͠8c{Fu*,h^S#!-Xm00BRT(41€$̏NV 8 z4x|jLː`t}[s.NԼ$w>ڊfȌ kZ#J3 #hR`{#+>"2vD[lu ml2˿}?TokKLۋQl3C#)l9af#or[vY3=W |~1E66ꫢ\`5,Y6u"M'_n%u&WWFZP |㺯MWfd=~?/i[.=ja ԦQ>%]ֶIoʂ7z>oߚt6'Rqeq~$ @u\JJ㝳i!+B?^D)]CzX HutMԱYU97WӴL^zg~0؈O)(M~=$MyHÝ:I@aAΠO\j0ȲU޿j/tSIR eYXN_w[tTpHxxHKRT>{A!] brIZ@$7nf($ -e~9UxcPmcɍ2~# b==Hq- ŞNi#HaFSc?s(b#B7P˼!RH x-.̕ G!PA[4x  Ae3tᕾޔPŊo 4%ȦwSØbqګƎ /I鉙?R7:̴2(=]ǩq1Tj\Rq "pjLF .M*~1 =G,+b29ϊA=j+]EM14kDR'GGtfjEQP&<^-8 Bζ[T5$͟Ҷ5u+.BO@@Ә-KNR5 -`Q ΟI 0uBH09H)$Ip %YXY$w4JÛ -fMB +%a~۫ƚV ٯ}GںoBzHpRU޷|hx}U==(+ʮCg^fehq\+PAS_Y&aTz8ۊbF.ѩm+9-7oj qXGqG|5BK͆r`WOH5\ hh/|+g^!eRp&Ckr̠U\C1MjwQjb8opJ5TΘeBê*9ѱu V48𒵧Xy܉R@,F S(.+)CJ,h)4_Ub۠{i]cS:Xg^8$(Ѳ/ Ս:Xw/'&`t/x?}Q%Yp_/ gJnT|`O$ -epfp&ٗ萿+F>_`}p~) ~8Vw6fS]e*d˵p*kehY5V@-JSϫQѻlʳ6|W]y<[>g)ж5v<D˯XY)ڷD/%~q%lcr:Lzn܋'Bv҂J@^c>>n褞ڌQΤ֘"XFTi,&(1g'+N!U8Iwxa,nּЮYRY(Sʑ(#~=Di#2W4YtH朽89jFSŤO(Lkv:m THI쯧>6}lBk/WS7ud{o(+ve2Ϙؔ%osds3+Q@O*ҿheCa;Vyh }8D7:qhC!YXS O\ZsV*EaR =gIn'Ƌy`#RƒN);F뼭Yhp8Iߦap2l*zR -JS1U[:Rg 3/_9&z2۝xM -JtP9oUWU7:OWAo.Jմ Fy^ -rtyKp0br%C~ZpVyftvJgJٿQ9q1N[ymԉ_ *xW=/:i1nƱۖzavIPC $0ИZFt,@\cIY/QW~>~w˽R[;i m~3XI|w欳eg?U*~'n 4TW-@3dE奚c 'f?9fGqL2^z4*R6V;};p&8vfkL *̽&H,veWERd X-_@ z@Ɓe2uE L R$R;@2]2r(*N=p6k LuEKdPBRzdԀ2f.[9f'3D( ZzT[+ q{E鰉ۂRGz ԋc<_9Kgq]8^Fe - R,)I;S 5,jAFх b:J9G/s-OR; ccwgENw'PeM2V"G $`F@UAD} 1$5h j 8"NrC;hɭ{VN*f+VеGg(b5HcO9GD֮h[D$!1:1[ӕb:|%*J9ZU>E\9%VOz{>)esQ -^e /G)xY4 Sr'JuGFaM8-fTog=# [ּO^}k^ٙ%z8z. -xۤN պZ)c%1A.U-"˗ 4iGn7˫i^MvꅎFyzDUP z=XFάoFxb}n[Μ#icW\{$4u`;NG7-{mVV|M7 rTuv)No?]<g-{q]oVP1OTֳC^'JFY9=)qLor~1dRL` yH y-uLw{h89_J=2w!yP#wښ=$Bir%Pě둡j/ X#F0Wz+X!ͣ?4(~JeOECNٓKhߺQ/6._w/+ar|g\ǟHm;O3XWke=}/_^?y}wW_⎣>}1BϿwosB-<#ˍhH6 -0Νͫ +x}k$yv^ mk!zW{vh"3Y==/L2ʪn4tAAOw7}~}_^~ˇW_gp`8cP J1~/1xF Ë7]~'G;AzIO;4O7 +fj?'Hp)n~ˁv s{8$&'j a^¿eI JޑOgCP8XO4NeE?gO/٭1#b$_~}vAtֺ`4헳Rq"l +Lql8οPSUƛm?;7c(Z/fUpus* 46/W|EkflBwhfLHvK$-r2v 4򶛵Mk1ȇ9@7~%Xp~2 Z&u~޿\o=hFްa&2Mlc5埬,UgSroXM|T-oª\)]ԓv=zTzd[>^,<ժtiF/NzX#&Q乙mi=tg J{s3n +ݐ*5ř'j:k )AW/sPD34 0jr@xtogZ/]F* +Rt!wE*/ /1<~7#yerGk%L'aK֣W`}tJà@xYAM7%A^2ar(`@&B-шCq#<2aqxgɛ*-ᅷJeṷ́rqOޜcftJJz҈RnmAd8fI ‹@]'koQy37/O%8iğmREqlRu]_9i/Я^qD Y8;_xœ4'sI 2g9ҦDIO8GR׼06`ArNHſ \@ +nP,Igxg/bӃ8 4!K :20}/CJTϊt^J 1SVKB{#S&tz`~i_'Q.V2T4΀uޕ@'AǞ^OQ= @U 1x=KfA}zL7!Ak+@ +eƪR@69 8n@޸թ4(⛱2:9!T"{n!( H8aàAwΧֈɴ ipFw1G!iN:AND Ly7S^8k̨V880&5H V'9#"SPNVk ?8 x 8&IڦRCjk <[I1~vjX&*ތ{ޜ0=yL{1|%Ζ_HoV̂E3WZJc|ÆMX2r0FqϱܾMFsc_ËF>?<݋W+!> +u-(2v/FWJ;~K6Sd{]۩6uΩc79Ĺ.-{ta3{l{[\fBW!_\˦޳aGkB>!YJ߸'\!+3 r9{=ٵZ«7};v F +px^]ϯ+ /FGRp0[Ox +0t9g?NSw}09(uJ +B<|{}lFÖ-aGi@ c HlUƚbpLsSOc^Efj~y(>+($3LLG[y3-\ +9T^6s/̥¯t s:SgmfӌVFB-m H^[veշhqW\kBKNR@Z,xc$JˇgpcG']AN^sCE|G҃F6\-OGǎ Asn?QYa6=:VJۯ/GJrlXݷ yHoȅ?_˥FZ)skZ.%0iqC^`2 +<_/8);̷J0)xhtucdh/>>tO + t}fT9PofS$wtEhVRVvSzK΃ +>;gv HRTxA!= {]bIZ@$ה\_$e碬ֳ +^ +yex=ؕq.D*t7KCiͤa8s7X;g,>5߬j7 Sm6ԸY-KoR/69-=^Y]T&Ui21BQIp1r%5HU(*BQ3(fH(aCEUGƐM9&pL25HK᤹)BQ7@9j%u %(o??#`e4j)( sRgkxr#uFk[0R'U)%"_<UwRۚ NۖsnDCJ eI7BUI'৺ 's*Z*o +}yzl0( #, 3d>9 8CroB6b H!J 1nzp:莛D +fhPaӘ @bZBzACtң< C<c\%I2`Pq3$&c$Z0@ҼNq5, zW@GIW_=AP )7x"場A`qw%PrYZ_ASG Z#93yR KSw,exo:#I^ũG9PF9=0I(Þ7 !,MAr@.k@~p>)tNA +62"ɘCqgB0_ FL lqGua/o8豀jP^c0X* 0C%*V x#ߕ_-E6ɛl-shdHb5vPgxIJOL uehEuT!WS%V#U80J8umRYhІ`lq?fY&/`̉cضRp8Y%P P$GL)GD)e}rtDg/o'Qe3Ղ^1/>JQ%PAPSiz/I,mK:M(aKA]#]\,[$$=yᢸD$U ~/PKXGڽ,ہBg P eqJBPA4Qn$Z `,[?}}X +&py-i[2--'ĸ6<g-ҵ'gW7m3\7X5wу:D +xo  tpƁOTI,C8" |a)u8 [Cy <*Sǵ 4LhFw.yڶri)[vuwW#\IP.d{l8)z,sV xA_ o+İL +N"phm @  x}kh6SIJ P] 5c\I LHldX5X%U6^*guW^<K4o;@ +%h'ͩ#e0H +DujAf/w|AeȈ&RQ2DdHD)I_͆[VԺ% C5hi+<{j')"J[D&cD~5[#b#%j\Z#80fzAbEt= *پRQB-F& Q ޵D8n oz.b pJzԳGF ԗPWˍ:d u[*VR"(!J"֭$nxIixW`"ua%y9F&ٿғ|w$ =tW҆q-!,7;r*=A.1x&e+d+] 9r)0+`' bԳ{U!CܺHrm%)}mKh-M۟$Yp'DEYF2O|Ϣ+9>\q]qz4**TxH ^s: U\ΐPYFTtXLq,*]?TJgAKѯ85Gu,5' 9?:'‘'9ݕ@}(!ĺ{c9H4|ē3( +WLgz9٧=s8UrϠ¿,3[%w~ QP/h/0#3ϾEC Mw4$;gNap NVU}ܜ +UN$].DWY +.CZp8U1zj58V~^>TP X nmC>TTgK98zp{c/SN%rPNU{(͍BޏY2Gjx&ة"d'q ++95s EgD''nqP$/"R¶17h'-,N!ɥ?Iw8Ķko"YdV4O}=埶UF%*y,q8X/U<:wWW9)j.Fnד_QlۂmJHiDt%bili2cåyWZy=3}ixt+Mkw榚\mʢW}nOQշNwZI U!c:yY ^F<{k PYW)h2ֆ6!YdSP\h[3^*E%b6r@,x5;_l! 62(n4J>*eZI.<]2Xlۊ= sD?ǝG7&nl|7NT^lE`zbig>uZd;//I-o.wWsz%ǯNa5@Xf#;`5-$ Q]`"-žbseyv-п4_V(8>+T>RbRHMŚҽNCM=qlb+ulV5b*/>;eg#.\a`k!]PUC^HhW-SVݡsrD)ܥWդ>cU[in;M:e6u^3ؖQlMUw^ +l2w+z7*='((gMp0@֘p)?9V{MXt!ʚ (%[v5(XdXYs!C  +'> +HD(E9ddV:T7zr$PYs! ;Ƞȹ% Ě e]N(INXgP=9J2Ɖ[+MqMܣmTV^ XW@w\WQrHtB ,`=R#i3sv# Bj8>+tʦ4 r$DfTvkC@Er"SC@Y L{ȑ X3|͐3pw{<E̓ܐAs-yAS-Xc58IC:Iq!Nmv0ƴq:qS ^ӻ ^ڌ!roYñ Y љ(vr\8CցK1}'Hm;oӦ8sa؁xj NrcTc(Fcj2ݦ ա gVњquq fXiib[Ypʰ:|!p$C2SnjR/8SeA9;$:#0F9Oi.vKeW] Mۉ рx'j^`ȻqeY3hĕeP+Z#J3 s4$n'H#"SPN l'̐$ϖXrXbfJINP>/^J.ϜރDn/U' I=|蔲wҹ*TBtFw +^0'T-\ɆpѣL@&PH}7e,]-ktN5[L=n\WvwIEZuϏiR8Jc-\?[oD/Wi\kg) +Pi5=B5ըVO7BYOu*aUW{T#R[/޴X3{^^w7M)؏ M˞x9)}nUG=?x=M<?v]] i~bO8'&C7/caZ gG1ԽN=6dOs{SӘj6ɤԙVatXua[& )*y>TY2g$[ad9SFCV8] 9Fq[E/'ا ]|_ګ:Uub Hp'fyJr" &YI9J X[Ej<$=w +ZjbM^֪Kk4X|Ӿo_+d"cxhG|rTo"hڭ!V.?Ʌpcbl4;mۨ +|ϯ >Z%2_uVf9DtJݛI8Nͱ>:;2#l-&?h2E:OEydħ!TDpjl["%V֚RFv_&Baa^2 jt0\ M/ѧ6" pWb: }4 U%잵YZ7)_G#Ύ#'%X x1װ/@i:{o`dߩKS?1If毻E¬B]kIM#v''7:u-M J{<ϏS .hIc5xKWRCw6;[HnO=7ӲRٳip;zmB* ny䛰ۧhX!9G)flӮ^~?~WRջwߏU{/~xwߘmpq <_$+|E)&>'@ endstream endobj 2933 0 obj -<> +<> stream -x}%7+pohzr bm˅ ;b?`>l`t&~*=JUy #<ʮ*RR*_|?}_oϿ{=ןz?z޿O<'WhЃ^ -Α|dAoz8u_O>b|ዯo?Rk}fN?M-3 4ȷO}S~ūߴb16\;/:㸴#16[⹖N?Qb*Iwx"FÃy9R I.2z>kȴx~_GIg:nٯ>{>o~W\A[cX ۦ $72"i("n!xo?-i/ n.n'!?GKA849sŃ)3竭:9+W=gOc-:ge[,TŹy: Gc= Gd]v4|hr\\Ʊ<wd+ɫs2=(/j{X>Iǎ^FCj)hȯe $Ïٸ=q{2\Ç,]1a #"ƞ?>ZqOKLoʨ ;GxiTʑT~y9ah P׏à׏nޫ󑮯2xR2L:[`Tϊ|88i( -LTaJGi(]$vЀ2" -*}62[;^s< -`\:+4 ë?߯]veeSOK*uzW__Wle(S}Fi`#Nk"yĨnHљDB"wLjm:I(9s?ڨ -0'm4 !r4_CݾȚzLؙQ^4۴阘I+A|8y_sO."Mpg&+>C @+m,vM^ A؁=JĮio|&1Xw=Qs \(Św~ (ZjeE+NBJmiq! -u~,/W9F{ܔTH/xf]?i8͟ӆ ?! J0Xhh%h|PIql *fpDT&*z_INYrQ2ZVQØ@)~q:/B).?묊YD21  7W: S+SQ2QL\*;ƹuSl_<2,rZĹ4$*1@cj'nS;*2C`"f +x}%7+Qf% .6 0s0nb7~ңTuN8ӭR*%Wׇ'OOꏿëի?~wӟo zKV928Ao=|sx/=|[= _Kϗ~Ɵ:=gSKO` >2~z/^۠ ځ}5M?1 mz6/ޤҿ!JK mI4r~Nj!LZ2x7[yQmhg]Ϗ(~<[DӒb@:%/@uzrq*hrESf4/bdSdqHo8=97ʶȂ5 +S[9Sbv `~el.qsϷ?Pe܂"2`LZof^S~A_oK[R܄M&;LXI$wVΨ}'.ft~Y WڛsCPa{7(o#dyQ W:e5>n_B ‘YwW'3*9㜿|olłi~21x =V"ϒ ɜvCj~U.>*+Z?w[ /._aƲ<wD2ɫ` Ft>zQf^,|x9>_UBf3 EŞ|g;+HgOY=-q{Z\Ӣ^tpش({G|j ch.vif!2v[E6ZOz:]Q%/gg{sG;,""'3}hq_hO~x ?O_-^~ Ŧ񷏞鞡/^Vw֎ƹ&w\1;W8R:dlvcYĵXաfa gW᧩~yI"pf)ting X,50\w<֢uI_3@CJ~U4D` 7A z8ƲڙAƊFd Elo*YH t*DT꼊N 0}MGuaA7pxH<)I&Ayo -0*ugE>Rʂ^&c*0Xf`Yul;h@CZo>L_`FoX/9 + th0.cXЄş_]zee~sxOK*uzo/+6Fem2)>ԴR05v NBJK DY;A:~>7 IX&W(Ӈfv/8Nͱyr@ʤNĔ0R8bUg3fA* jqa (ͧFf -+iQf <@me3`@+2*!TWSbFyipPdNE%SX3Tj"߮i4lxicrMƵ]@]U~#,=O8m&qBIگ܅*@{ӦII8z`@!vKA9ldLtBm[v*ul^K7` -a |Ggu5f~~i7٠1j)y׎_  jZlWl5'DBC~s6 e]/3,^pt$r¿+,3 -iIPn=:.8visT8q+8 cWx(ܺRM9儨ȌX, 4G}ުC a۳*3OF +q0)fQڱ'Yuh'G{t,A+ ""4`SZ`*8U̔^t% ٩uam$5[=:9a4GMN?O߼O=gk҄׉a-~^Dۑʐ ɩv GYT}sgi1)k6:&v3|gm#ՉDeiM:f>*2C3^l1 +<9~ c{amWqLͮ GxqK5EjD{c*' Ʊ6i{MXiY: 4e{q8hkR&uj *x:1UaPˌ &Gi> N420Sh_!dO"0#fj_(S^K7ZViB<5ΣhOD~' w-,X٘ŠbgVkv McaK3-6'"45r)`yj7ơl{66ZNN~ݝ}`.T۟6MJ.Ɨ+ +!<_ +a#eer(h+S!c X)Un`+8t=:;;1Ok)%g,\6j)i׎_  jZlWl5'DBC/~w6 e]/3,^pt$r¿+,3 +iIPn=:.8visT8q+8 cWx(ܺRM9儨ȌX, 4G}ުC a۳*3OF m~90*9*0nͫ儩]'T]鈛Gq`sSSs0 !pdGN9fZtZ`f0 -Mh)Cw=}:1o~ :VFA[SS7lou|dL~;nx{ko#ջj)XX`Mqbx[.Zz Z/?X`q/7j:#X`鈪Qض&|ԂRM U -PeT@@SXc 5'7 v^y֎\@Zik]5TTH6gX[dVh_:WElgacwt6 4 mb㴹ω-N{Vwctuu|a+s15UT{FD[K:Q>HowiKEt `OoXv$K{hb'Ny,FVE@AxZIӪRb3㨁ݴO[v- >>(4##,p7W5ck;4B:0I1#l"J5d`w{Feś? 4baX Ffld֮Bylxl :oIB sxJspvjw" +/I\^/_oJ({"C=;B}go>jۡCH]uNykⅧb FE&=xۜbLWTрczt֏cvKY.;T4+)d_0eV<`K V~jXY )֚|\p -l 4wڷwf«͎{4l|AY -w2P)Ln`>̠xc$ 2th.uu{QYfUE;eٵ IA49<&668)W8 #i!7;dgؗi&0{iTWj3Q8; ǙZA -Yi\itYlVy^*p+tjh#nmDobrnۑ?nmXv8}ZkAtg:ZDuDFOa4a4]AL7lf4Ok_|9tÿOߑ]p;=F806(7}qO@Y3oy7vht'UGvc5dСŻz/p?iEktڀ.\H-u -6SD3nW?VǢABc~ -+7uq_<,8&[4O}]N&N |V2 jNIXڗU>nZi|ܿԾ6e?U,ATmĈQJu -ogؙnEyZ~FoWj_sԾ:#Ců_3_ŵf*ZckE˪_-"c/ݮG7z dTn k߉wHs+ A0P|2G(ӮXr=<r9Ef֋3W+'KC:|y7T<ϋkw3S"1v7G={.ܾR{&㕏]ҫXev̹/ڥD{/;gtǜ&5Ƿ6g^۳S-knowV]xq=ϜB[6&\7Ў 9şWRj$"S6+0^<+1F+A-|; -gTv70JsN;,{s\p\Vb?E摯ovrK_Z[}Ai9ٸBO5[?{:x%^|ClZtџ燅@:v&|"2?bs]àvZ3[L6\AFbi-WK75GPv&vRVp w1eqqdeo]%w4ӎN3'͟dk𤀽c=+7Y?/a+bz6Yغۜbg[O)[[_*\k2-أdgoп\0zg]CY ~s[;_Ҿ4)hWB_8_yǞ9Zo;{։pN8Z8 :{렓[Q\#SzhCem$Wb@tս bC&P˰ןەH<)ʎvSBsK&-zI4rtxͺtS=2bT+Z73QJdfPcbciFMDOVHY)eԏA՘ -: bD1's[(23\:6KO` JB1Kx DInfUt - H$z};4)%12#SG#SDV{P^N01-zI݉%GΎkB#]Et G]қԅNy-=Iv*n([9ԝE&T{ I_.a+pP͍GˉDbVHSyuꇫ8WeSܤYxjDA7QJf*P@ZJWQ1)Utj[s[uAV8(Tš+6Ju9v*AJFFF3)RW^2*T|yhYv;,5}Q"S@*IAkwjd簙 k8":dIqGn\ &ͪ@v-&_3g`S픧"Cvh) O+~E&Yh{H$; 3pP*j鷫XoSCK2-;R9Wb 9MpS -=ΠTӀ5_(3:ͨ2O{4C"D`wtI%5,4|jJTb Mm0wP<4xKSn!7q0EsqT҉)-RIi/=v(G -U|~H "kqTPI[, BjJp8X'Jgd#ۘ -R-;]*^$~o۶NXW̓8he)Tur?`6:Ũ0Ri9:J4bmԞubHOﺞvѮ -)iUktB((0f&\~i4ƴ$ zb"Z:?hg!<ژZ{[v||逨TSb5$ɌI68Q/bj uFy -Du>8豁R (YB̛O -nBEeʩ U=7|9zfI`NANe-]wp`C1N`_OM;wMTFks N|t+/jؽSkq -lՃsֺӵ_O( 299Bftz!; |:&o7}i! :9<> H VJ.D2:hSosD`<:nD*.Mdʏ͎{`⻸/jW"xp5 PiGd!3Dc> Y"N#pwBP!~xFT ->xGvho,'VK/d[ƄΊksByGjbRfvO05I\ 5/v]Yun Ӝ ^Ob[%,:{1̷v^'dW{>'_8y{!+Wo Y;zI`) _bdP-ml5Oy]qNyfн -'Ɖte쩃h>v0zbܱUF DM/l\?'LfN" n'y(R̐kwu6+͚U3S,eVghpg$ѫ@F:~Ş]HczQ馹3_Si/>(qFUٴyryVaW"F6 bYp'L*4#;DC‘#R- a\*AI|WCZ=6{\y*mf,iG,l3 AC%;bg(py\ˎ1~ǯ~7~|wϰoz?Z -zzo)ǍOƵ %ܜ6s& Uzs +Mh)Cw=}:1~ݟ>C7 8XOrٷͮmNuF_n^MFĺ::릨v6RFy,HM6g!)`U:q?⠕pc|mOVm9ajxxKmk·y@-(P +ѐX0w@5jl. +9 +9e5۟P\#yrq`j.*M +dUCEdsơ{NfP(Cq]Φ}61f1o|Ggq Jh}Nx }?Y^u=yf~nLs^*;E֒bƛ9]w~5łq@>{:Ҟڳ؉SowA,-Ќ)miJ)[qxn'-C;KZWXzKwXPT3ё{VbY+ÚɎwG~QAp +ޘI6a2= XMڟI0,?q#362|QkW!S6<շ[X$[ !9< 8;; Yݗ$q/ׅ%N M@=ۡoŽS⾳}m} pzǡqO.:x5S1݄e"iocs,z;(ZT}s&7rzfx<΀1t :4Xs:= ㈎ʚ+'x9Ha_1fR5\DN h&'gjIU~*fq!Ixr4gX{lr­pҩe{[i7mG]S`ٱFo86aTLwLAq^]Ila44FFٕ9?}tfcLP}rx_O_RO[]V +yw +J) 0K_bsy.rNR1gRgͿMN}lwNs+9ZÅeT9YZCn^%j(\ʀ 'CFf1ziN2 +g'6/~́ɨ| +);t FenQ.LInU@/Sd*6IGǝa*AcR>J IBca# l!Sc2L b}pV".D!;PytNQD6 tzymC! јuAaRVb0~Hl +{^;cLw>͎{`⻞t@:%9p0Z$j@)ju]SmQ@10az3q[TۼQ"ȷJ7핉,eDo=lLL+:,&;ߧ-Q|\&3{j:gL2Gr661 3вQ4>fuX ( +BGZ/p`,TС\YJ?t5rcMY@eyOm12_19O5OO.OyyBv"ZwA YA*#b#vl`!dX}$~%Gq=2dw=LӉ9<* T}xͬrG&[uR- ]Y T=CqH@&Մ n9񃚑U[ٔ 36Dd#^' ıNƭl4j$f .Xc y,kv}ڤN'1{BtQָe >EC1%"$QDc 1x +PPd @5)sYPHGƘޠ b7H9mH#MJOdzeQD@r))F!tXySr +(1kH<9"6"uP'I`1*B1[mLIئ8LJz̖%QPh$rB[B@ I(RGai#՛q TFmcҖ-#!-V27J #خRZ^Ab=L{a}F1ITz3#>F ҥ xn)"4!dz@0d1%X;#r8^qddA +攱T u c `O 0.3il_ +HG瑶2=w@{a݊&J{FBVxLTO)6`qHW-1j䁌.F̢#J@rE!I aF/y88m)l*\qQSirHwʘՒI쀴.T0\hDB(,n:6H@4e(+ @&XjQ & $ˌD7MWդHk f +\ARg f(h˫8%L5b\0[K5n+(WGk;5e +T7_MחH `AZ>ˈr`TEX $84 Cci$%o0o=wP@;8[V +NPFWwW$ T< Wiьvn)aM?ܣW\%w|{ۙs8uzy|=^dMX_y=:Lvvl\)D 䛽B~aD+s0ֽS%B^֛ڰtfT랄kyEX/Ikԃ}:5;fR5m"t l2,S !-=!Vsd[ə*&մM.aP&(1b`=dcq<@3(vf[Q^e}S`ևYNP1CŬY茊YqX1ZYQ'q p&ٿXxV"gxzspwPB0Y(M`/\5yeF$rmgڗR"vݧKK.JL_}aUDz9Y"=2ّ*+_i]c\Lh{IZ6*zylo ;!b!cz>ʷ|u7;$嚩'YE Š1ϊUhV +H?g({cQKmޞ+ϓޱ˯agl}W>^}f;yh_[+ϯiV+Ep{Iw,HA`Y}k7;2Znvrg[R; ҼƓ[xK˞ڟ+1썴 EmN'zZ"0,n>OLJPs )FݭjCJj9_as$/dgbNiq)8յ/َ2ҕ:z_ZAr>Lt%}j3+G|t }P|6e~:q4FR𽵴-g_Z72]UZ8FڙI1b*?)#- tz%~ͱ}v~TӦ_2o{K˩6Oի4%Z|Ϲ1?Llbݵ;˹ +>Ј {ni\h +hg!"X_~ho,ܩ[k{=zr_g7OQZ-+Q#eLgD(g.?<1uS"n(.4bR$8fiZ,ٱw &g+xrsޞ=gOr9ɹ۵k +AObuŽ➡3n NZbn?Wm(yqLzp_@9'C?r-Nodurj.:O{m^NwٵiDlgDHto3H|UF+M.?kps VH{oBuet}Ad(rD[ H[j\6Q1[- +C'nUD*]@I*Rr5{͒FF +;4HW豎 j' (a{S +53]<%#9XZ4g#~0D1)n~u(lWw ̄I0d5q5wʨYVnXx"JMTF!lfhgsǣnhp_vU=HAsՇ}'KMwn3]ɼrExԀDv]@58Z߿;%=;WG5RcY,;h :`Ĵ]sI"5-Hw̝(^>lW"YԆ!QRj`'7;XL; Wl"eB:L)Ta#9Y BPҠԱ Xz*K$P*rÎ՗xt$ +Ot{5߮N#Po@{LGHI)LG1"xޛN]$ Ln =<e|>Ҟ#)a+pPGˉb3VHSyuꇫ8WeASYxJDAJ7QJf*P@ZJWQS2)Utj[s[vA⺺8(Tšr+36ʌu9v*3AjʌFFF3)2W^=T|yhYv;,5}Q"S@*IAkwj3簙''l(@ }_Ζ0zc?ٵjJH|ϜU=;S +@N ţUst_)g;!4L,f)Cr߮bM.INFH21xG6M*8SeP|@Q6\4@<#XC95rcI$԰R>)QH4MJmn@,M䨝mQ;8H'JUgf$0R2ڡ )!-AQAm'm4 1 +e4HJQϞs(: +uckC.R@0viR({mۂ;a]M7֖hPzpz2J=*i҈#R{vP׉U"=zڱFN +/|WmyHЙ +#ØRjsM0E}0ӞVȾ3/Sы`k5fw՞|VOhc +kmbOBR)Ր$3&Dˆ%U+E`blJ1f +1o>1* +60#N 1r +&q9uB9Ustu{;(߽ý Dv;]mP5r; 6QEݯw-;9\SaNv%;B* Wv!Xe~=\v;w8wptt3/hs(>ykVK +( 1]&|J5OcGv< @6 P㾊+9| +N-l_P3X㸊 `e`}G╅va2BPy:e`j Dp.)eqG ؂ S:NA ΍yvQi 7 r' ^)D[FVY!NQZXf"lr[ډ.&q23IS1 +l;6NZ^yOOdv> +-=R^wS!TQs:b= +SDR|>~ķفK>4VFAPvb +YQA#ӂCU Qqj=TZAQ--OJL#FWO&'A- 23O.8A8a-|j -TQG좏mi<6E8~3 D>C +i(@ +I|7 Z\B05qZ#j퐚ߍO Meh|ЪDCz8f#0~҃Gx`R re\:ue1P|ܬyXθё}~L-j6#N?.X.WXw;w;wv;uw;&xy - + ͏b@\KigX_&9RGciwǶ2"Ӭ@` *t'-{5q΁pOTtK׍~d@(sX$ :lڳāए@Hp50]}h--qH+bA.'ʓ>q!^L-&n vر QR@k%FT1HV I `ӂ05yu/"Yw" #9n8m +d4+WZ&EyzY`6i^:;xUmIv)HTŻ-r(c_ۗ4J:z̑OR- 3 r\VAI|[vXQR#:(İWo7/WeP;r(dAm X/O%3Zv\~e] ?yzz}WO~z>'XO_}{uYX [BKiO -f04A endstream endobj 2934 0 obj -<> +<> stream -x]ݏ߿;saiY\b6=Dy؝hmvWjKn~5gzv` 9fXU*~j|~|߶~7?շ_{'/>{y#CgϐVk8’Tlwq{8{xq8|p.oBtCIr?&} M+f/V]ˋoA @Je5Ca$2+לlb>7?L81:{Ou_6s̔N1jFjx5eHB[1=^+Dd-GQ-</!kfj¯DTI2zK }2 }Rp1𙔬j& 떉KD-}W@[)\O-owvz^  CPBibwq(!ơL@)SBwW2%QqDU]T) 3m7*nn8ӧ0dgoq}4:ؼ/ CF -'uȀ)xj T^SoIKi þ[w_{ZcQֈP7܅pBF/CvT7||-z2ر'%fN9͍ 9(C0ߙ>.'!xO4T"ZpYc5h2۸R 8a>̽q8.ΞqKNqm<ܳݻaf2g-cyv0[| S!乁L@T̂*P%v,I\-t5f* -?%˓.2qd;?S<4:<8g{Lpj gҎ2oCY$Eb@`."k"vhjYւE\r@ғ1;z e(a0 ,ucdC,VN[<98-Iui˅Dz k4S> I1>M@UJFF'Mq'8oV1`cր^,2$9cIWƲ!k-_;v>&+ujhJὡ:(J=T ʳ~ٷ쳷Ԗ29%Wy6sZGXLr:ߤVrHq).A%巷g?g>wR'8FH,46Fsd㰛j=̠o>G0b6z }|;=W#^~J}%ͤĤ?dU3ab9k qQLkX9h@5"98-VQ]a$'PoR_p3 4^1ޕ=fkŇ^UO<c=Nw!8ƹ`R|m.>PYXq|9.@2w+ -ilpٺ[-i%,SK1lN+ԠUc9ΰAE(l. x#5@g39/!Z= -[dܔk"[~f_?x B6 o8wqU闓+o\<$@e9 U eP:"5{z]zSp;wv -~` 1mGKCe=Iz(Np`ʊj}r;3 jBzv) ;VŨ2Bu#2x @dnV#T1Go$Etu1x@SĀGTH9TITS߸QZͣ7;}Ӱe9$=!s4;i@2qb]X-rcSlx|V*6;:,р3S 5k'/⵴,@@b -UmDvA7"D/z|[c.@CaӽQ ~\UmiHkv)Ķ4SIx;TWQV)g[miPIZCWKi^078QZ.!nVsb-M+YBxzi(Ω ͻ͇蒐O J?,U44p,G3rW'ӟ|JlH}~rξ?@p7bvFwT! Zo3QJiSSA?F[9F0-? 8j#XC eS$H9 b<˟_Ct-Pc/o ۷\XXˤ8ұϬ t zbQ +x]ݏ߿[s>ղX4#l㒳Z<&ZʖHCv9=3egibUco~><}zWz۫7WpO>y28{pZd bۻ-g۷gW77!o9?r§&|'~F>oBO}w Ay=_t7Ąk'->Üx ˢ<ٜd^ar@r죍V)RI漦XCq)3f|<<DݨEŏO^~1ޑuM`4#%bL` fH&_DU OqR"IG!4gKT<nĨ ͧ&ʮDɣ8H08NDL!r6d-)IYb9-cT1^dpILjx^M)X;dI*'ߑhC;,Ԡ{f4ULb6XU`n&io^KQo.X!/6Zps)7OL{OxR8vF)H4Q-δVB-sQ92 IDAO, M7!y 1O=[ ki _1#$c7&sڊrIi[ʛ뮷Qj/m~}gv^K7g[~a&FLrVnElʾ*77rp(LuLpPt[^pV-b7 ̍qI׆_]\r1m]q[%v3= B8F 45b +8Kw;XB+:;"":i3y]/.SJݚ2>BJE4<%Fg{Fhtjoa;&ɴ5dv j*zEuNufdL1ʄlJN}w_ojCjXEH +m7ppZ2jG׉'1Nw Ns0Mr}+`LUUW>/gE-9+)iv!]7Fgd2)r۳`u3%d\IAD$B^a JwHlz7=T9N|c]LN+-?bprE#S8y}`Jw&]4xG(Xqߍ^3}x\k-]Pu1瞶)Ӟ"uΓ4!C}}3xl9y=*tyOk X,ӥ\DcboynEn{arsƈ,$-UT4ᰠyY:gfGs[]]:hoz?Roy4i bbq|{'Xxߡ8+@ɬ!lv3s} Hez2#K U+]9)˷#pô2υ3.|d>h`x*Gώ:{#q\J+Zf:ZZ!4t$3kU=+I^`} g>|}{O/82:74qBO6C,4$$aX$5ƗzCGeN?88hb/I8cR!aqvˤ3$bVMU#;+%pgpSsS6;&O<'Co=-Ŏ?1@qJ(M.<8t3(TeJ[w:5t*M*dBoܨdt &BƺmJX{m80TZ_Z2?;0RsiJtaZc%haQS$ɁqF(JK(G#!98揙Ml:h-XҞ;fTydx1uChD mkU6)G֭q S (,jV<# +DiN} jڳJai!\::aAcqӌ[a0냖f`3 s[X\(OF/(6r$CjvR6tAXCr)(8AY%*q`g0Hdqeʭ,Y6+waOqɕO'p$H[:p뇇Wo參af2g-cyv0[| S!乁L@T̂*P%,I֏\- 5f* +CRB3$ܐQ +8_Va)}I +3Y=OU'FFlq@J@P9v<$> q0 +y{ H}F/@@.%{y%@#ĤeU RLN5ļ7tĝBuzԵhTōK\혱鰦yΐ.^Ѷ|K;卍@,I_t:}sbծxy7ـ_hoؤ޿ JiBZ-v|5]i* a^J?v\j'5ءsRz.ٞQ[^:e˱5~23a{zMӾVq7?β{o"paܢНOXv58H9ñ+u'Rna~ nU$v~7i@qO{[3Z++(#F:,IS uk/;䵴,&Ձ&d; +'Um'7ODն.Fz[c.U +:Lbr}V!%+:ڐ".ًwQ1v6sU϶ڠ RRP ں q7 lmZr#7j=VxcliF$$ D5k3K&9 (;+7\dة?+%bI/&}w3ᘛ n'(`P-6@F@Co'`̀@w~f5Oxw?r?a~\PpԹ6:  Sr CAT7p^JҿxaKV22)6D80ܘ?}L endstream endobj 2935 0 obj -<> +<> stream -x]ݓq[D}ݍ*HZrY)+TD=פ(VO5 󅝝٥{=F t<}n쳛ݏݼ?w~xs+/?<x~'E -OIy#mڽ١P{zvP>޼AEnto?y/9S/Z|ң?T)[xS4^woW_^}WmclZuX 9%\NkOzs%=Y=cumu͠.M _oa7/~{쳛T PGcXyk{A5Ww:Կn*tl4jJuka(yn-#58T?GuԶy.=9Ltk2|gZg\Ϧ?zP)&URPSZJ=xHT'KzWyeeDK]^ X` 7 +GK#pnRY-bف ֜$%>9^u;& 6cMڳNtdI%P#[ZD2~uه-~"xKo# )˔&svu>gb3v礜DY! bfJVO=aoGVf省 ldP"9+rQ[h[`6-T\LP}ƅf]@J"b`jVʉ'3ʁ7A ̆Dh?iDΎ!߰"x:`†eq@FZA\pAv -w5Xs)=Ҥ[5XEƊgEF^`Dk,@CLoI8CgRuW$휈Un@FRƅL{yׂ !)1"6]$EdAfQfA*$&IK/ ,ԬAtZTHbLi~"(cIL)JlU1UHíijMRjng)OاvI.+uq(zɂ)-d}*Jʤe@$nе^VOթMB$ӷHMت +ٴ"&u2jp'FQZj|wI@Q1@*ՉOIFd4F12  DHF (eD7VWWN*XvVҖ`E!KuN SJT.K2V>X0"Ti5#)i1jO?ҫoKlѦ7-D4*7Ez:i#W^vW+Ĥ6ɪ!l g$ !VN/RȢpE4QҚ A -U@Fw#&kIF# -lƤ=/ғcB"CXϔҎRl6I`"ribi#=`N]TdpMɴVrTimAor҃|S3KhL+.cVQijKNiMuP.qOPg/VRXMb$ HI 9Б֕J&T+!/ f(b!iK-s/1Z!8kXcTO@@2$J*i{IsJ0 PAb x#%0Q:ub@eĒ -ֲ,t3mrF|= ?i _W`5g!3:&P||H 4|S8Y\JߪpGmB?oz :9&BNYSCUKͺ{#գ("xO;:xFM3o}/d!4L*jHVC̣[ Pdg!b[ 1m5MacuhBdkG -lQ,DHC:y`ʋ`[LZIvJ{x 2t,'dA&͍T>xKNb?Mi*0s4Â(Y:Wk KQ,n;S G+.d8l?20䁬xl$-ʺ.K(ʺ.K(:(kjueme+Ų7xum({ޛ`>G0u4|j*` -^qBk ޺Eͻw2_[w([]ĿFuJJ҇ =8I*Tm8ڏlbz}+FZhMCAAm=3zB̶px ;WWR7c[$0 rX.p9agMGdd'roFu3?A ,Zڥ1# ߒA ^ utpRYj|8q29nͯfkΗSPI[ZV&G&£5ȤK7)Jp<`5 G0o`J˂uڄF,t*-L,>X[,ɡ -@Ek=/M~~G tnԣA O!ݎg"魚6X~Zs_{6P;?h¡l?;!Lun$eےBvG^o'gI]GŃZ_ tX™,_Zi%VfsfNJ Yf\v5'u0.K3e}$A/ k)ˠI9BZȒsB;hSGX5CcuRՖQV28F`9&jhJв$R#:jꈭB2RZPPQ?TBN˲XdNr\VJz`aJTM8M]rap96h>eZb<5ޤ ZLh/hSeP'r&VZKn@(Sx$Z+ֺ.h Zֺ.h Z:;ZkruAkmFkZkz\MOgk95$XϐZn1,hs N{+ /zb>/%KDr>"v5'|&ur -|{JksP5tRƹxGijTWVsSon'HI;MnĢ-.* k .XNtnއ)|KgUyp[x8CmUguekZ%S ;4"wMiFuC#R7J oo'TG]0էB+naBEYޤ!ESmTo@GC)@5fkњҜ/dڛw'4|ǝЋ9A!'jt= `!ែ]аv<{5($D)Vq< r+͒B1ք[گ -)\j;S{eiǼ1rUiao-| +hGY-#sSWzG,kʮvK=Y6cZQ5h5$d! Xבr^K{u%d Grϵߌ4Fx:㥥r[}VI-&5 ޛS_5+qd`ؽ&uj8KAr[!i' -& `{h86@~N"fjk% -8‰q\}D56 Q}5LjA~ks>sz62j:],Ma ɍu 'gd=o˕r{rxƁ .{8{6qv 6V}2N~]tL3ڗrA <| -t0Q;i" F߃w ,xrxpF<ܕq_x|_x|<97ÃluLJ+`!Vl^<.KGDA` oRty!6~cdr*L`å/䡁k3D"vᩝB%\m(\ROUB"!? i*ĀrqHH9%$d]w'%uIH єx#_#/[W`M`>{tydέ„%m!^Bݥ۞mg;;sУ/Н=?/X3dZvEfJ -,?m 3g/sw9at }n?{~w7/~yXȗ_?Vq?凇!`e?2N=S^v7xF?T +x]ݓqbLѶ. h|TTERrY \,G:U>՘/vvgb34 4Ѝp7/w|r}}uo^o?/{Z˿pw~/~ +'TyGJ{sjsϻgVn"ooA旛_^ڏ&[fAMlt^닯@֊}HoS'l@;J w&يY @ZNżU"1O34Iڮ/_'\}PDM+/{\rU~?ҾT[he,"_ 2޽p?]~<t'uk>:({9̋%u_]b٘;Y3:?zwUmߑ"Q h\!׆6G`LUj 'j=0Lm>,4_hT$ +w$"c:eN/nxTBղى@ޑ2ao2&2W2*:pΙUOCcN!o37zI1|b(lNfz/.x iDE-J?Wb0*TV0:[aeŀXc*NAzR.{!&jwO'0,&79Q N G \7@ڌ06D%EYeeC754U +Y^mhzծ#"h( '/nj]MEuh}>橋/n7#Nͺ%kfOa)T81Ii:pnF.{~SƥϋZ\KUm +0HAR-Wf<OLL)VgtMol!gS-Muzۀ5Vy- J**oc 1Qr24i9i݂mVSօx}WZ +VV*ҨPU$&MK/*JjVk4C 6)U/\)OEu,)ER隭n3Lp5,)CJ$V:e^.iקM!4EY0e/RE):]Cٴ Be]$ NMb1}!ā +b6hҷVAu;6:X0&gu0K=ZP $R>!&8( xAQQ+c$oDٔWjWN+;U ZRDeA,X{ufRʤTw)-.D[n `UjVSiܱjӏ[H-JzS M}Sg;rekw}E*mj!V!w:I8B+J)dU8aU&MfKPs2ZѪ:IӘ4ܣVzqLIdZҢ(u DS65hwQT<զ G;{U.#$Z{QAdfl1i𺭹t ""uEbd[K%4sXs*ԧchW+x5_qBLʘT%j*!ޯ fĨb!mhK-s/1BpXcL@@2J[MsJ0 PAb x##0MIRRPfC ШPC:DII-Av#I֤Mj^ {fj=٨̭+Qqtj4t:z9 Q1.p.u7@)-sOw~|#>OKE]_.Oj^:́L4U1~[@mSȖFڰy`3^$yjybG[_3KjocP[jɺۻ\Jkԕ A0pA`kɶsku?r냳Y(tANjZ WKT]#pAƫψp;߁KH‘ +bn(-F8ab.09B¸ˏ.M+&q͐WQ7G#TA.oK#E/;t?#E*_CMfjQ\_ LRܧ@B~Qs|kFXkmQ-@ ەl_I:q7Nذ.ٍ'ؐ  0 ;1Y)?/Mdf$PzT423ɐ8c +n720Xdjh!W# +;DImƇ ݐ-wgw͝8v5`K٣=aIP}BG>S̱983CQ.`Ӹ>oăB +MZ@|Yݒ8;!%Vu %3XI֙*vuj6ܿ*0:R{=xYe++Zh!`z&OFzXz"Ipi9⫧fᶺ22JJ2*>$6Dm} F7D +rWOp_=B_HFj95VSa]D/W `_:^V[7,0h[ƒG [X؏s3T=1m4$L-t=$l,3$07Y鉞Azb 38<# 8Cΐ3$ ;Cΐ3$ ;C6;:C6C\ uAfѧӏ V$@8Ê6|H \o𒺭=F3!b?u}p:' ZU@=[w; +MnKxR&|ij͉HG䶐pVn3B7n(Ȫ /wj,ǚS]-aP ,3[ͩfR3x׉n.QAWd04,p=;GL'!@r' Gv]]?r"1`h&O=W)#9/{sQO\ٿ(Hfuz)@6;}a>۳&Cyt?t`1w~dXXsz Mx~bdBIng<wS 9Y] .@N(UZ +\JɹMG +HܨEg$9?m^5-8p^;#9K2%HX8Z]ip!TҬ4`Js[x43~*)tv֬K%3ICflի@K9m˷Vo>B#՟wtPQ=F|{TWpO5Y֘]osmkс^le`ny30&x둑 $dR!+"Yדrx`GсC%d Hzm1⌈ F2Y:b&s(BpI]=`4`EhebX`:r8A{.kے63gyp0A[ Veofn݊ +;™^ ~ݵl\0N&QjΙ(-Bm#(4qlu<5tYvDA>i; r3^ $^txfz\=vGo4uB)i:BV\"o>aG-3>Qׅ 4i+gAb>COA&&?"5䞘ao"RAΈb23A>c3A>c Nd")7\)kJD1G 1{bS(8lRLGBn%ZbꐌgqX=9FZ~D33DQE;Es[ZF{#~{9@38ct@Ȃq^4NbZL{'VF;4q$F$bhKRY9F^RW 60?xtyebi˞yXg5tʱ}*V9 /kQʾ|-oX}m ~">tloz˫{|wu//MAt$xsyJ1 endstream endobj 2936 0 obj -<> +<> stream -x]Y$5~_@-:w0am0lXkP(.YP0% rw7O^ͳ<_<}W7߿Ͼ~gw>?}tCC 6ؼGGΑi|d 67;lv?6i7`CDo^wFD[*^w%Tlz_W?ذS_"v b/ľ'fR/ݤ'+tMH]$36Yg]#(4 L??{O??58S=1@hT^PCڏ{m>y9lk -( UNY))` \*Fg^zgd ;{H׸!*v[t7cVc99z6a2yÿ<ǫ+Co Z!"lGݘFt 6/c 462XtXkD1؁>+]'F`P @uۢEX4R{lvWI뚗%@>Rl/ P`2 eDm, `t%QIcFA84v@j](gŻLەLgmѻLDзQPzVvW^f%UJ.=RF(ڡJW^}s8A,疥tK1sX*#@&@X_)[ev!^?RD86v:ygϒagt9Lc~S%0AE^"#hAM$ HL%kf4V#tIJ@Dw߻Xp+A6 CxB{IU4X Q(}U_ XUƪ콀3e6bD.@CLoI9CgR%j($NΩU%-kħ_[ w\I 4&V;xBY@Ј&z M DĤv釪bmVu:TJ^Zۏ15$D2Bhnj!iB6UHiMاqCYZu$?V"xLSG):K`)hY:lzו"iH gu& q`]4ΦXZD Jzhnkߋ.'Pv Vh% 1HFIAuHA;Ɉ\YM_Il!vXVgR\Si_^1ejam+mVe[{` XA`TԖ.K2Ql>X0*T5%`5 I0yoKlѦ_Zhhm$i#z/ۆ015MBllSgIA8 S*!YVDh]:ui*)I=s'cJ"CϞlu% 6֩`\yӓuB DrIֶ<mY,&Q };@]bDLcmtkm;#F.zKN )rئ%4.qɦcYRYy$ ]9ȍH;U)Tb991XHG?)Tcv){ ƀAp6X1B/$ R%Ul2H:.R4wE1ƘjQݣ%u:20~I]~:OttjѺQMmOYA 'IM`-筰ud@5̍ OFwmyuhPiotV:F>fɂz7,hxƞf,w`7+ -{]O,jz,K :li{ٸGFuW8yS/)}4Q6{ޞzvݿǟ|?H5,)FCk~ɃzWs)Ys-~bj>+ oFzswJ%y|/VУmNxeïKtݣ+St6+七诙N8ɣ -(axkB3fpSl`sYJw{tL/lf랷AYl0]څzfɛ ]DZ9PVOL`%JfL(C8k}ڝ*l -*Y$;@_Z^w fHA)\P(@N,CTJ6:JiR' }(tJˡtL[ǃ>PH[pGt΅d~g­^vv(Q|OB|dIM >s7٭'ε'M+7&'Xح:YpÁ'Rn=.6Tbo)4,?>D8m\ |8_ |8_ q^ .gƅ gCmU>lRh@@Nӯdd$/kCM5ij6"|k}t*Iv֜89e%"w*aqNOXf! B?FXɂ|Rn„gv 0{Nlq&97v уhz?U RnY?*T` 6 |IK -vyٜ-4edÛ6cq1zw<"pTeT >? LVQic)PE+zƬf*&c0 z&rR>\{翛a e_6%Ů}tutz[?{VL+&c 8ɬkIO{fO2EۇǞfF#Mt}~OMPr1㠧025bqE+EK"'V -T{duO:l9x϶*94じy^/My ;G4{7orٓU9Q5%eM,cdJFf*2!V:_ɭ]d7㒛u˹2O -*UOҕicY}e%N͹Msń5yh/'vhoS%s&F{[Iޢ'մh*i[Ŵ=)JR&MD/M!NzJHM=<:%ڄ>Ιlsg?~rh~ozK]C:?_:|hU,-#q\hw͉B2'Z{Az}^ٜSZ=P聘F -RL-z}nd)M!C w -9̙L+3j=)F -R˩SE}t$" M MhITIj}_8WDa_Y4%I!/mszNp@9}7ӊ^"Dw#SzsKF%{d^2z/]. _Z* ['gJҞMtPI7xv6jI{ ĝI>g C_rkW[ "޺C5]eQ~3A뛲 %t D߃e:oxz@j몖ͰJ?K}j|z9F׌ajK@x"x>,vFWSǮÁT/T*kBqnUV=mβ" -"ut}@C?JXCnd8U -P0a #GXMKt-&tQ/ڸ$\ . K%`pI0$T_[~ [:Mv=!Vw??}/n>|uW7^>yvݳ^-.c(IǓ`7ɗX;gX +x]YE~_#4,,~9a&c$}BXk@46;~#+lh҃ë2ï<ۻ^=}o_~7}w|˷>w{sG铫*#xw-1 F +;I=&뼧bvg̺k+{WOk^Pyi$GuMpg )V^Ǘ(0e2T01#43; 4wk]8w9#m3Qou^mee\ݮ6RuHߦ ^xШoY (Vuߺi~ 8ףX2G5K}b±U8F,!U=Bqj^>wBC^?RAlru8K2%vpش g,eL}N}Ś`7k,g j,DM*KA: r$Ʉ ^Q<V'Djz6#{Bov:rg?i=&gbwgݟSr?U.bYVoZya#jgځ[V&)ZS$bd4éuvz:B@#:cANvyݪ 10JAu*偫E0S4;S9 ;QDh?މu*fG_<:`ʆjSWq@2B1*AYB6JGw:h< YHf3}GCod$0 +Q4*Ѐ *A "AbjYc41 KQ$B\yż^խU26PQA@tʽ$=x`;u ֦=CJjoG*{/h[ebhSWQ 6[RFӶs*jo@MIzwӯf ;[ .dz`~, hF=*DMb҆ZC5PE6UC?Kj(ǘښDsAXu2`!:cAijM7ngcUi\ڷ6LC-Ri(Eٷqɽ,mKcVdu8`V7m*Z/&;riU@tVaEMA@(j?B-`XK 1HFIA HA;Ɉ\:XM_Il!6XVgRT1efam-mT?{T~ Ԓԗ>K2Q-֪ +Ufe1Zېl Sm&JO;ru2]_}[F JIBtwl8B?+g{J-d58jM(cfK%s ]6Qu6e1)ܣuqLId3Qr`=U VEPz뜞"G=h0@A*2еtijQło$A4OL +^75NR`@bdSierh)!_0>t uT֤^'I;d!4J%B~]l9':'F S-fr5` (Q*gC`;k>FM!5R ʦ70 P'Ů!MMSYs̎jSã6%u:20k ~IC~:OttjӺAMmKYA$#h$IM`m`䵰ud@u̕ wY^^&Ϟhq1u6;|dA G\Ч>j#Ua/t#E_~ Ɯޫ/n<2"Ȩ$klz +~Wa=O? ~X]Zt[ kr?_5,WߟsPBwLܞa6C5]Ύiu=|EӝXBrXB\_>p!G[gfB7;| u{J{.F 4^1c 9Gjjpf {`حFǷ}|Ǣ^zzxPS2pPGфV-4n<{pF0Ba_490H1/u[0f񝝴N^vZM{E[Oh2Be,H"aΩ*uY`I"xB=(>I4~_ QOE|ǟ[zI}ԩPOTHlt{TsSٔv>8%ix ~3+>&n)hW?^nl},(z5S9gV΃vefb[9fLG vGhṇ'ߗsS^2yB6Z bzz}Bt& swS`zQZ oGqbji+(#z!(dMli9f0ޞaqN2RL䵌"_|A>_|A>;y6@WC +gc A]5pa$)큜+_@3p`֒L% @:-tkQ}p0IܤRp Xͮ sg3K8;O0>7v/\o,Qul-ްroW Msa1ęP\p(kjٮ(:$bϸQlzqJj;`,e|QP-ͦ +h:>ӧ ; =@CA]@N]fWq2SSg u+yEJ+\OO8P|ZPLP(>s'K˟M +&(k_ᦥ׾X'fkW\pC]nQve!\trV2زB;)\{W(^+ʭWYҥRl}ڇbk&rRyrGziy-SAh[br}`/_Kуafg1>\ݽojeƦ:cx&6}{2jkgs@W[>2_PV% G}^>#+^iyuOͪ{bW2wZfjkFgg4E)iuutJGk{jVu{)tds+dž꜏diˈ'"#-+ z`@O@OjLA kw$;B oQ.nW8rzPWѲba"D$e..—ZKVR+| +_j/^+<{]J׿%J׮Ϯr@A}hjbP(vpv6J ̝{)>7uJ c~[U;*ډo1ܲjg٬ Dϱ?Bt&"W;3rx {tA'8@ mm\:*U=?=4OxQW;/[ [ +|pltItH[w?`xK8֕<"8X2V*o %$N7IJЬdž͂ 8G+a M1+yia1a zQMXX̓ +M8Xbjh<[SZD C2?f$d,-q ѭt6k%C)xf񺥢uuAWg,/=bv}?Ra鷝0|v}pzaѲޚepWnWX_&3^ \2МĀ%CֵL: O}'lwڲGGӉPћh0:ő&g'um,*zspؘB`ۉ:9ja12#=ڷ'/:*fwƬ/#E@Cۉ DKH؂W;bkh4 #dv"c׮ƈ`hƆ{jkN2R̹>\qmk'tiks\;Y>v`l|iMy`.;_;|`[7T}QbİJ QQ[#/?htb QxSǃUOk]6lջD&L&p+)2-+`h]ؑ=ɮk*}=mܶ< c1_N L4'Ĭ@ȀXM{ +} +K¥BRpPT(\*. + +{PM.% +KK3[>FaE'S`@?%"҉gBꓣԸ)$i.o!_{o'S #+}rgOcG㺀#qG?Ƹ3<>,5Rúwp}`<7,>{7_^믯N>{zOd)I}2o endstream endobj 2937 0 obj -<> +<> stream -x]ݓ7n߿>4 ߉UJ%Uj,Z.ߧf{z8=ӽ4KA77Ov~}\?߿7߾~!o{g*T92GX}wEQq{w TDśYyG/c%2WmɴE+ۘG]S"_mF/o^W_b6%b[!6BZbFe.yFe?nCh 'glθۤߌH(5 ]ŗOsO's`#ֈ?v&uv= -Ɩ ahd=+0\ V;w5$mUFd*@t8>hADxAsOq}&X;RZp?̤۷bmn}$2?Q0ci'gWSX>SQkF|iږ.`to ?x~q/D+U98Yos6Fo?SW^s;'Z&Jyޓ]kje:Rb͛ĚSg=Jq@Ax5N8)$[ǵO'G -q=Gޣ;i( #UGю1ϥ)m8tl(L}:FݐOwOAb 8CZue8M73i!$ f43ϛiW3 4B4DY)T BNKBueBekV]`{R!:wtD=r_KHk/Wۓ{{mQyOXTUؾV:FW?(O\ :ޕS|<"X@H[e.ʲ %b,_P:61`־}YK  z_pIۂL훕i}ӻ۫[j1mKCQ2,]zsZo q熣4؟x 1Yi'֛iwpOS h'z/FH)h;qpn<vjc/Y3 3&ot;Hj4idEY$jV{9.E2!h:OG@J U%7 h3y~"xKm@T'WӶk{m~b~3nO "(9h?E.b`ڈoGHnQ\=:MF=F+i"AԖ mA CB̏&]{T~tDґbı&@խrUF% ;&PٰB5hG;mۑh6nO^YQذؐ2b1FdZA!,!FnUPQgNO9b$n^!A$-+fdeQdnرؘ`{4D1\NMtu2cާM@"a)׵:蘹UDMì*bԒضq M[B+:mB|B~bBA0AD^"#hA:J@112, 5B$+d8.%n!!xQIuR -5xdNנhJwٽ>XP3G[ [7G˖NY⬄spF) 9c6ӳLɍ5?dŢ`ozv{%ί;;:]NV=˒mͲNO[T2Fwr6CW(n/PLۀּHXU*G<9]qDYiO 8vD.n儛ta˰!39V2WZԕO+zTcG뜛E͇mYZN[\M -4:w5+ O#hT3~ Uz"SoİКFUZ|]m>m>?՟<޼vA{deUcނ~EQm*UT=Gω (X5S9Scz{s(=Yu=muG#vf-Y!ucS-hVlɁP%0#,.Y0U WIt}Q;Q P I{ri}wيs;16ʟ);ooAk}jalJ'gκVZY5g;tBj!o(c8E7R|4%y}P4lYGacgcgZLTzW1aX9*o%Icpɕυ -SLukϿѬQxQKߵr;Lί`̣ձ62~ennٟdf$׏a~JjL,P -&ж\?7f"ȮqBJH{Z^SscH7217z%@M؆Tfgbai}s~93YZ+ބI&x0&Y&β[ٟ/Qh;7_|b6i%r[b>hKv4 30x퇽ueqvSp#b#@GUqW:ZP 6`+z59dhq='L$th @F9Я!Ʊ?`$0I/qUóDKCW9eLG:0A (eyΈǡ@xz5j~?:+/KC;_칢 - CC@êx -* y) 3NFӻ_e#䅌# 3@azhqQ僞|/cBp<r ~rlJ`Nr8q bA PfI%2( `PepO_AAj(pA<oI -r`tHРZ`zb/\IA944A b  `b tvow`V2ۅ˻,C;-\'>>Y}CCdx@>]ΘH'"O_'yrA\'yrA\'<|]''+ȓȓ8#(::VfW+ĉR9:\wr2N]0ʽhQROۼ>D6Hu?‰'jwJľi N: qgE1GuiS~*0֞ |<'JVSԲS g*Y yE03"G㵮! -jlYS.[4+,FB]˘\9Ch*Ա_oZ ?9N]O?GB.ad.jF.a.\".KN/~ٌ\%KJC>S)v7۷w\?N+{}Zo{F 8M>Sot;z +x=ْ731/pYcqH`Uhl`^̬L֑ն^&'!Y/J6zÏfxTpDt>j{#[sZ/ݰ^9b +t믯6mUяFlj]`gq;;ךI5Ek-'F<(miHbw$ hٔ: kMT' p*v ЩeXH1XmoÆwwW}uV6ub.FFt]B9Jtf8ę`l"7 C0iJ !xl ]~ؠ|/P Trb8rp=Yj]w3X>NtAV'"Ij%gb,qzU=G1y8D*G|Q5 ADE8+m %=qw{NXr0*(RgÊ!盿rBr_::Z߉vVAJKz.Px`c~4bB^=OJL,9lBJᘨkCE@v Hb;mho-erseLy5BN !k1#tMSL@5)d]a#yHe["d̈>B@QE@ +v:7Xsd)?tn-+ଖFQ`M>w`[7%I=)fڈ6 ZAI沶fw7o C"Y.iPI&ҤdAb|&Tr8U$>UCz~\ʺZO)c^-( Qqq Dsu$}n2O&*"/);}6 JQ`]sJ)BD˶i;X g8uP+XE^>{ N}A*MYhu#*BIq@$ یZnGRƢh; +I H/YtXտP@姭ZUBm^G[|T> +x*7VN%JK< K6e2M ŃS*ל鮏l:]%0@:Ee$LbҗtH6MyMzΠjƶ2XZpNHJj]&=RP@B\h9m^fH:yauOL9&66*Pkp(~]l`&&% )sJ6{ګ/I&kaMCF!Rʮ7Z\T=P@ +/鮜vEm1=עG-ZEԂ20ҊQ@RݨP ND%x-0*jtU%ٵ֢FP{=pIN͕K槣Mݻɡ-jm(:"KjN9=tc}øp)v?>>SYFuk0srViP6_9tK=!<έfn 陾Njhو}8vٯrZSECSᆿ4m0&Zcb.9$kt,d{BxɫQQӅnMԎGUU"֡vb6:O&D +ھFukW(N[z̑W*{<:2mrDuLԘ[TA>wdN>,^X~x!?l\Ym%P}Y̲}هFFkFceG+hTc gcL nKR&afُA%S|҄}~?+`F.Zׂ\`=чMjhe0 +t|H*Mラɪ5]$;~7*ZrYNwNV?WBbN&QD=)݁~t3*+!(K߉nSt.ŰXT8t[9n{L4W):cG؋&1YߜFW8<#o5V;U0O(et&Mp/^odw䤘 qIqp~9ݹi>Iȑ[܀"Fc\FyN=wCv,o *n_џtmMvMRhwV6A#LܗCݮ$X3$`%(Р|N㦊|.!z]! >j7 WI 7ސ!? Lnly1h:o +~U8>$w<eՎã:Ǟ̟͐j:kOEYv`H5gnyqzmٽ$"߈c+E]R7D;=L7EQ3 +PGl!DA/AN\t۫ DzXo4@8PuȜr4 0Εp$# XyρH%h{pj Gj k\޽ Qum\RZ(eJKJ9RZR+7r~HiEJ /*w#Y/,tK:%rIg\Y.,2|]YV$]GHgI3a=dS0uL{fql4sC9Lf9e#2Ezҟ ) ʓ؟$zb9p!7ZVQOht$FgnމbȂZ9T b!jf&JF|PyPB[d 3GхݵݓwN}s29*1\NIP8>?&ʱyJ8JTI"cH.H1#*)9'Ȕs|p8sE+)^~PrmmCi9BM3O_{{=GB1l{ןg?o޿zj/nW"F\tziwF;!%vt||` endstream endobj 2938 0 obj -<> +<> stream -xkܶ -&޶$G릵xڤ$8Ϊs缙&ID=x+އW$@ow?vlv/wg?o//v{.߿ݏ7ן}g?)RP'sdt0UuPUo7٣sv -:o=GOsԺ|B4'|~"?|l˳/ϾNJsk9s!6BL3#XiF=7nCx/D;*Ym8kW jQM3c+9?lMS鳝&єo7\ _<}}\DgVn3ev4顂u%O~M[չ$$V톚׉+'6d0ZR"MbhgwIJ<݁C[DbqCbw.IfN!v٨cgɋxvx:agsl|ӑ&;u/\V{B}/puh{::nH1$t =N0nI;^zV74~4ޔ>C;?v z48d91}hj^ʁxe: \pֽ-:(ifo!8ai|.fqXɐGQ6lv\3/\a (ˊ[ !GSRW%&d˂>1~`W<$ihz{Q)f\+RY -1sEqz_R~9Vq*QۭOS۟DWly~?.~yWi`ӗ?SóTV=U 9JY&RYBe[c1p!Dk1FrM?,mT-}+FJa;¥=owTٳg?)O`Z!hN] ۄN@>R5 -U&kT `tFi8--%Uf}gvуFsz5U~n][7)Rp**שp%+:"2&^i54hHb> 47!F,E -=D놤:I{;%i/~=u{ IY4Spe⯑igemc? ٴ -Ĕha@N!hmX9|XcMpaTAIygB:?y'̩/b*WzZ fr+eLd$B+2iBRz== rt㓱E B2HBlp^3ݷ;>:P(x^ M*IDtƠ3d&!4t+QE^Ms.m4d V<,#RZb5jU p<01\[PNy 05 )`Q0:NEyI;$!`uaVdWc"}QQ [ &YD4H^u0TwtQeͰ-TI홠4nmϖ܃]y7g-g3'B C㓴X8Ԭr.@8,gr#Mb!Iz TGy1: p" YJ-'Tf&״89^a hO؆N{tM_.4ZZD֟nyr' d Lꂄx!բ p7A8α8׸KngHۯiel4١aB `ebO14鲶&Xg'XT!X%P%]ǘXS2E9Y[nP#]tyZ utc!oFr1]'eb;ǫӇm\ -yOD.흮{bZ1]>˞Kx#N(2R{$5ކ.bFzXKqIupJa(%8Ev?tFenQ4;-[PV#Eq=fߢ4mɲR0ǎq.¬=1l^CP N 0jgZ lќ1~:&wRT}2SgD,FBv,#4GeQN_C@I:hd$C*PUOPTp;łNCQ.Slj1}~'sBda/Ox!~V XYzWEk4fU%6oo.~ᾭ:^|öNј",jM.nn&i0]CZz`:֪ҍnvOnnv{S Zc:M賻vI'b#p +x\Y ~_S3QHUVn[k;,+O컹3IهIhv>z>xph=~zwg?}W/OO7?|s_<9EB>)#|Ԡ +UFzSݜ<>S^^"Rg]_8{ڦO>}t'ֿac>_& +W}2팛Ͼ:Ĵ &{H3 hFt=a9@~m&MhZel^wSExJj)$ϏqhCFSֻP#ۡ_'_u^cwHJDp28CߐG:lpnDcmSvw*..Ѷ׈4Hf*0k$pi)a9B~6RR-5^;5[-t6i_ܾ,!({ElLP䝀S^> JZzZ m!jmɭDehebɢLa鴔!Yz;;F -R!)ggɊ :3bCz]gdB`ow}`W8(x^cRrrz^.J*׵\n[;axz;E5<3`\Biw_kWwIY ]Ɇ"k$rF`2V {]ՠi̽]/ +h^~CgG>F9n_Q՛W*A A]+YҀeTv^YIiъ R+hcU6d!HimA;f (Ot}GjH$ ?^YNLZ+UHb6yubr/ Ai$kLUsʴtaTiPәw Q3W*0LYL\1?#5[#QAC^ C4%$b(2;.U_ n^E9^#LZz Λ2ŬZAt D򨉪6 3Syܚ5Lp!vNwɤLKP2NW#X@x*L1r`)/tS4DL{ 0X,‘3B[)JD9QpDui͔{tzGwzdo#a>6Z~4.#[xtV7Kuo}|^w/}z{%:h^r> +<> endobj 2945 0 obj -<> +<> stream -Midas User ManualLouis HerederoTypst 0.15.0en2026-07-08T15:38:47+00:002026-07-08T15:38:47+00:0022application/pdfh+JiW2W+zqMlA7uUDSyUtQ==C5XNKfzFe+iq8z5RRGEMCQ==proof1.7 +Midas User ManualLouis HerederoTypst 0.15.0en22application/pdffbHtrK8kyAiDTTjHTSme9Q==C5XNKfzFe+iq8z5RRGEMCQ==proof1.7 endstream endobj 2946 0 obj @@ -12521,178 +12558,178 @@ xref 0000304106 00000 n 0000304322 00000 n 0000304470 00000 n -0000305429 00000 n -0000305647 00000 n -0000305790 00000 n -0000306008 00000 n -0000306252 00000 n -0000306400 00000 n -0000306623 00000 n -0000306880 00000 n -0000307029 00000 n -0000307319 00000 n -0000307539 00000 n -0000307686 00000 n -0000308044 00000 n -0000308263 00000 n -0000308414 00000 n -0000308640 00000 n -0000308901 00000 n -0000309039 00000 n -0000309195 00000 n -0000309323 00000 n -0000309477 00000 n -0000309621 00000 n -0000309771 00000 n -0000309898 00000 n -0000310048 00000 n -0000310129 00000 n -0000310287 00000 n -0000310434 00000 n -0000310592 00000 n -0000310713 00000 n -0000310834 00000 n -0000310957 00000 n -0000311080 00000 n -0000311200 00000 n -0000311320 00000 n -0000311428 00000 n -0000311549 00000 n -0000311670 00000 n -0000311794 00000 n -0000311918 00000 n -0000312042 00000 n -0000312166 00000 n -0000312290 00000 n -0000312414 00000 n -0000312537 00000 n -0000312660 00000 n -0000312784 00000 n -0000312908 00000 n -0000313031 00000 n -0000313154 00000 n -0000313278 00000 n -0000313402 00000 n -0000313526 00000 n -0000313650 00000 n -0000313773 00000 n -0000313896 00000 n -0000314020 00000 n -0000314144 00000 n -0000314267 00000 n -0000314390 00000 n -0000314514 00000 n -0000314638 00000 n -0000314761 00000 n -0000314884 00000 n -0000315008 00000 n -0000315132 00000 n -0000315256 00000 n -0000315380 00000 n -0000315503 00000 n -0000315626 00000 n -0000315748 00000 n -0000315870 00000 n -0000315993 00000 n -0000316116 00000 n -0000316240 00000 n -0000316364 00000 n -0000316487 00000 n -0000316610 00000 n -0000316731 00000 n -0000316852 00000 n -0000316974 00000 n -0000317096 00000 n -0000317218 00000 n -0000317340 00000 n -0000317462 00000 n -0000317584 00000 n -0000317706 00000 n -0000317828 00000 n -0000317950 00000 n -0000318072 00000 n -0000318194 00000 n -0000318316 00000 n -0000318438 00000 n -0000318560 00000 n -0000318682 00000 n -0000318804 00000 n -0000318926 00000 n -0000319048 00000 n -0000319179 00000 n -0000319758 00000 n -0000320049 00000 n -0000320611 00000 n -0000320744 00000 n -0000320901 00000 n -0000321085 00000 n -0000321269 00000 n -0000321462 00000 n -0000321637 00000 n -0000321794 00000 n -0000321927 00000 n -0000322102 00000 n -0000322286 00000 n -0000322452 00000 n -0000322627 00000 n -0000322784 00000 n -0000322959 00000 n -0000323092 00000 n -0000323225 00000 n -0000323358 00000 n -0000323491 00000 n -0000323574 00000 n -0000324264 00000 n -0000329246 00000 n -0000329329 00000 n -0000330106 00000 n -0000336082 00000 n -0000336165 00000 n -0000336970 00000 n -0000350231 00000 n -0000350313 00000 n -0000350860 00000 n -0000357333 00000 n -0000357413 00000 n -0000357888 00000 n -0000359746 00000 n -0000359827 00000 n -0000360336 00000 n -0000362604 00000 n -0000362686 00000 n -0000363244 00000 n -0000370494 00000 n -0000371517 00000 n +0000305410 00000 n +0000305628 00000 n +0000305771 00000 n +0000305989 00000 n +0000306233 00000 n +0000306381 00000 n +0000306604 00000 n +0000306861 00000 n +0000307010 00000 n +0000307300 00000 n +0000307520 00000 n +0000307667 00000 n +0000308025 00000 n +0000308244 00000 n +0000308395 00000 n +0000308621 00000 n +0000308882 00000 n +0000309020 00000 n +0000309176 00000 n +0000309304 00000 n +0000309458 00000 n +0000309602 00000 n +0000309752 00000 n +0000309879 00000 n +0000310029 00000 n +0000310110 00000 n +0000310268 00000 n +0000310415 00000 n +0000310573 00000 n +0000310694 00000 n +0000310815 00000 n +0000310938 00000 n +0000311061 00000 n +0000311181 00000 n +0000311301 00000 n +0000311409 00000 n +0000311530 00000 n +0000311651 00000 n +0000311775 00000 n +0000311899 00000 n +0000312023 00000 n +0000312147 00000 n +0000312271 00000 n +0000312395 00000 n +0000312518 00000 n +0000312641 00000 n +0000312765 00000 n +0000312889 00000 n +0000313012 00000 n +0000313135 00000 n +0000313259 00000 n +0000313383 00000 n +0000313507 00000 n +0000313631 00000 n +0000313754 00000 n +0000313877 00000 n +0000314001 00000 n +0000314125 00000 n +0000314248 00000 n +0000314371 00000 n +0000314495 00000 n +0000314619 00000 n +0000314742 00000 n +0000314865 00000 n +0000314989 00000 n +0000315113 00000 n +0000315237 00000 n +0000315361 00000 n +0000315484 00000 n +0000315607 00000 n +0000315729 00000 n +0000315851 00000 n +0000315974 00000 n +0000316097 00000 n +0000316221 00000 n +0000316345 00000 n +0000316468 00000 n +0000316591 00000 n +0000316712 00000 n +0000316833 00000 n +0000316955 00000 n +0000317077 00000 n +0000317199 00000 n +0000317321 00000 n +0000317443 00000 n +0000317565 00000 n +0000317687 00000 n +0000317809 00000 n +0000317931 00000 n +0000318053 00000 n +0000318175 00000 n +0000318297 00000 n +0000318419 00000 n +0000318541 00000 n +0000318663 00000 n +0000318785 00000 n +0000318907 00000 n +0000319029 00000 n +0000319160 00000 n +0000319739 00000 n +0000320030 00000 n +0000320592 00000 n +0000320725 00000 n +0000320882 00000 n +0000321066 00000 n +0000321250 00000 n +0000321443 00000 n +0000321618 00000 n +0000321775 00000 n +0000321908 00000 n +0000322083 00000 n +0000322267 00000 n +0000322433 00000 n +0000322608 00000 n +0000322765 00000 n +0000322940 00000 n +0000323073 00000 n +0000323206 00000 n +0000323339 00000 n +0000323472 00000 n +0000323555 00000 n +0000324245 00000 n +0000329227 00000 n +0000329310 00000 n +0000330095 00000 n +0000336067 00000 n +0000336150 00000 n +0000336955 00000 n +0000350216 00000 n +0000350298 00000 n +0000350845 00000 n +0000357318 00000 n +0000357398 00000 n +0000357873 00000 n +0000359731 00000 n +0000359812 00000 n +0000360321 00000 n +0000362589 00000 n +0000362671 00000 n +0000363229 00000 n +0000370479 00000 n +0000371499 00000 n 0000395757 00000 n -0000403187 00000 n -0000420655 00000 n -0000423304 00000 n -0000427422 00000 n -0000435781 00000 n -0000443032 00000 n -0000449077 00000 n -0000456983 00000 n -0000461695 00000 n -0000467045 00000 n -0000472373 00000 n -0000476010 00000 n -0000482368 00000 n -0000490788 00000 n -0000502527 00000 n -0000507186 00000 n -0000513172 00000 n -0000519137 00000 n -0000524333 00000 n -0000527834 00000 n -0000528178 00000 n -0000528586 00000 n -0000528837 00000 n -0000529168 00000 n -0000529390 00000 n -0000529542 00000 n -0000530788 00000 n +0000403191 00000 n +0000420647 00000 n +0000423295 00000 n +0000427414 00000 n +0000435799 00000 n +0000443065 00000 n +0000449095 00000 n +0000457022 00000 n +0000461730 00000 n +0000467090 00000 n +0000472428 00000 n +0000476095 00000 n +0000482464 00000 n +0000490894 00000 n +0000502649 00000 n +0000507326 00000 n +0000513323 00000 n +0000519284 00000 n +0000524506 00000 n +0000528016 00000 n +0000528360 00000 n +0000528768 00000 n +0000529019 00000 n +0000529350 00000 n +0000529572 00000 n +0000529665 00000 n +0000530795 00000 n trailer -<> +<> startxref -531564 +531571 %%EOF \ No newline at end of file diff --git a/docs/manual.typ b/docs/manual.typ index eb47cc9..6fe8be4 100644 --- a/docs/manual.typ +++ b/docs/manual.typ @@ -624,7 +624,7 @@ For example: == Control flow -Some control flow features are supported. For the limited code of this project, not all constructs are supported. The following are those currently handled and typ checked by Midas. +Some control flow features are supported. For the limited code of this project, not all constructs are supported. The following are those currently handled and type checked by Midas. === `if` / `elif` / `else` @@ -757,7 +757,7 @@ If the value passed to `cast` or `unsafe_cast` is a literal (e.g. an integer, a Vanilla Python already lets you use type hints to specify the type of variables and function parameters. -Midas use them to type check your code. Additionally, it allows you to use a special syntax to define a `Frame` types directly in these annotations. +Midas use them to type check your code. Additionally, it allows you to use a special syntax to define a `Frame` type directly in these annotations. Because these annotations are not interpretable by Python, your integrated type checker might complain loudly about them being invalid. A workaround is to silence it by adding a type comment at the end of the line, as shown in @silence-errors. diff --git a/docs/template.typ b/docs/template.typ index 407c246..0275937 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -61,6 +61,7 @@ set document( title: title, author: author, + date: none, ) set text( font: "Source Sans 3", From c3b243288d4b38170ee3c740c496dc71c642592f Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 15:59:55 +0200 Subject: [PATCH 10/12] fix(checker): remove redundant instance check --- midas/checker/python.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/midas/checker/python.py b/midas/checker/python.py index 0192dfc..15f4b62 100644 --- a/midas/checker/python.py +++ b/midas/checker/python.py @@ -486,11 +486,10 @@ class PythonTyper( self._assign_sub(location, var, index, value_type) case _: - if not isinstance(target, p.VariableExpr): - self.logger.warning(f"Unsupported assignment to {target}") - self.reporter.warning( - target.location, f"Unsupported assignment to {target}" - ) + self.logger.warning(f"Unsupported assignment to {target}") + self.reporter.warning( + target.location, f"Unsupported assignment to {target}" + ) def _assign_var(self, location: Location, target: p.VariableExpr, value_type: Type): """Type check assignment to the given target From 60ff52922685469ef4712f8121f1c356271e48c7 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 16:33:37 +0200 Subject: [PATCH 11/12] chore: add midas snippets --- vscode-ext/package.json | 10 +++++++- vscode-ext/snippets.json | 50 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 vscode-ext/snippets.json diff --git a/vscode-ext/package.json b/vscode-ext/package.json index ab4f957..db77fa2 100644 --- a/vscode-ext/package.json +++ b/vscode-ext/package.json @@ -4,7 +4,9 @@ "engines": { "vscode": "*" }, - "categories": ["Programming Languages"], + "categories": [ + "Programming Languages" + ], "contributes": { "languages": [ { @@ -24,6 +26,12 @@ "scopeName": "source.midas", "path": "./syntaxes/midas.tmLanguage.json" } + ], + "snippets": [ + { + "language": "midas", + "path": "./snippets.json" + } ] } } \ No newline at end of file diff --git a/vscode-ext/snippets.json b/vscode-ext/snippets.json new file mode 100644 index 0000000..54a0e73 --- /dev/null +++ b/vscode-ext/snippets.json @@ -0,0 +1,50 @@ +{ + "Type alias": { + "prefix": "alias", + "body": "alias ${1:name} = $0", + "description": "Declare a type alias" + }, + "Derived type": { + "prefix": "type", + "body": "type ${1:name} = $0", + "description": "Declare a derived type" + }, + "Predicate": { + "prefix": "predicate", + "body": "predicate ${1:signature} = $0", + "description": "Declare a predicate" + }, + "Extend": { + "prefix": "extend", + "body": [ + "extend ${1:type} {", + "\t$0", + "}" + ], + "description": "Extend a type to add members" + }, + "Property": { + "prefix": "prop", + "body": "prop ${1:name}: $0", + "description": "Declare a property" + }, + "Method": { + "prefix": "def", + "body": "def ${1:name}: $0", + "description": "Declare a method" + }, + "Function type": { + "prefix": "fn", + "body": "fn(${1:parameters}) -> ${2:returns}", + "description": "A function type" + }, + "Frame type": { + "prefix": "frame", + "body": [ + "Frame[", + "\t$0", + "]" + ], + "description": "A frame type" + } +} \ No newline at end of file From 54b2058b86836ace058cf60ffc20891d362a5862 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 9 Jul 2026 16:49:53 +0200 Subject: [PATCH 12/12] chore: fix name and complete language configuration --- vscode-ext/language-configuration.json | 83 +++++++++++++++++++++++++ vscode-ext/language-configurations.json | 16 ----- 2 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 vscode-ext/language-configuration.json delete mode 100644 vscode-ext/language-configurations.json diff --git a/vscode-ext/language-configuration.json b/vscode-ext/language-configuration.json new file mode 100644 index 0000000..756d556 --- /dev/null +++ b/vscode-ext/language-configuration.json @@ -0,0 +1,83 @@ +{ + "comments": { + "lineComment": { + "comment": "//", + }, + "blockComment": [ + "/*", + "*/" + ] + }, + "brackets": [ + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ] + ], + "autoClosingPairs": [ + { + "open": "{", + "close": "}" + }, + { + "open": "[", + "close": "]" + }, + { + "open": "(", + "close": ")" + }, + { + "open": "'", + "close": "'", + "notIn": [ + "string", + "comment" + ] + }, + { + "open": "\"", + "close": "\"", + "notIn": [ + "string" + ] + }, + { + "open": "/**", + "close": " */", + "notIn": [ + "string" + ] + } + ], + "surroundingPairs": [ + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ], + [ + "'", + "'" + ], + [ + "\"", + "\"" + ] + ] +} \ No newline at end of file diff --git a/vscode-ext/language-configurations.json b/vscode-ext/language-configurations.json deleted file mode 100644 index 6695a6f..0000000 --- a/vscode-ext/language-configurations.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "brackets": [ - ["{", "}"], - ["[", "]"] - ], - "autoClosingPairs": [ - { "open": "{", "close": "}" }, - { "open": "[", "close": "]" }, - { "open": "(", "close": ")" } - ], - "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"] - ] -} \ No newline at end of file