python-keyczar-0.6~b.061709.orig/0000755000000000000000000000000011567545051015121 5ustar rootrootpython-keyczar-0.6~b.061709.orig/src/0000755000000000000000000000000011567545051015710 5ustar rootrootpython-keyczar-0.6~b.061709.orig/src/keyczar/0000755000000000000000000000000011567545051017360 5ustar rootrootpython-keyczar-0.6~b.061709.orig/src/keyczar/errors.py0000644000000000000000000000426011046627164021246 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Contains hierarchy of all possible exceptions thrown by Keyczar. @author: arkajit.dey@gmail.com (Arkajit Dey) """ class KeyczarError(Exception): """Indicates exceptions raised by a Keyczar class.""" class BadVersionError(KeyczarError): """Indicates a bad version number was received.""" def __init__(self, version): KeyczarError.__init__(self, "Received a bad version number: " + str(version)) class Base64DecodingError(KeyczarError): """Indicates an error while performing Base 64 decoding.""" class InvalidSignatureError(KeyczarError): """Indicates an invalid ciphertext signature.""" def __init__(self): KeyczarError.__init__(self, "Invalid ciphertext signature") class KeyNotFoundError(KeyczarError): """Indicates a key with a certain hash id was not found.""" def __init__(self, hash): KeyczarError.__init__(self, "Key with hash identifier %s not found." % hash) class ShortCiphertextError(KeyczarError): """Indicates a ciphertext too short to be valid.""" def __init__(self, length): KeyczarError.__init__(self, "Input of length %s is too short to be valid ciphertext." % length) class ShortSignatureError(KeyczarError): """Indicates a signature too short to be valid.""" def __init__(self, length): KeyczarError.__init__(self, "Input of length %s is too short to be valid signature." % length) class NoPrimaryKeyError(KeyNotFoundError): """Indicates missing primary key.""" def __init__(self): KeyczarError.__init__(self, "No primary key found")python-keyczar-0.6~b.061709.orig/src/keyczar/keyczart.py0000644000000000000000000002371611053353132021562 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Keyczart(ool) is a utility for creating and managing Keyczar keysets. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import os import sys import errors import keyczar import keydata import keyinfo import readers import util KEYSETS = [('aes', keyinfo.DECRYPT_AND_ENCRYPT, None, None), ('aes-crypted', keyinfo.DECRYPT_AND_ENCRYPT, None, 'aes'), ('hmac', keyinfo.SIGN_AND_VERIFY, None, None), ('rsa', keyinfo.DECRYPT_AND_ENCRYPT, 'rsa', None), ('rsa-sign', keyinfo.SIGN_AND_VERIFY, 'rsa', None), ('dsa', keyinfo.SIGN_AND_VERIFY, 'dsa', None)] mock = None # mock reader used for testing purposes, disabled when set to None class _Name(object): def __init__(self, name): self.name = name def __str__(self): return self.name class Command(_Name): """Enum representing keyczart commands.""" CREATE = Command("create") ADDKEY = Command("addkey") PUBKEY = Command("pubkey") PROMOTE = Command("promote") DEMOTE = Command("demote") REVOKE = Command("revoke") GENKEY = Command("genkey") commands = {"create": CREATE, "addkey": ADDKEY, "pubkey": PUBKEY, "promote": PROMOTE, "demote": DEMOTE, "revoke": REVOKE, "genkey": GENKEY} def GetCommand(cmd): try: return commands[cmd] except KeyError: raise errors.KeyczarError("Illegal command") class Flag(_Name): """Enum representing keyczart flags.""" LOCATION = Flag("location") NAME = Flag("name") SIZE = Flag("size") STATUS = Flag("status") PURPOSE = Flag("purpose") DESTINATION = Flag("destination") VERSION = Flag("version") ASYMMETRIC = Flag("asymmetric") CRYPTER = Flag("crypter") flags = {"location": LOCATION, "name": NAME, "size": SIZE, "status": STATUS, "purpose": PURPOSE, "destination": DESTINATION, "version": VERSION, "asymmetric": ASYMMETRIC, "crypter": CRYPTER} def GetFlag(flag): try: return flags[flag] except KeyError: raise errors.KeyczarError("Unknown flag") def Create(loc, name, purpose, asymmetric=None): if mock is None and loc is None: # not testing raise errors.KeyczarError("Location missing") kmd = None if purpose == keyinfo.SIGN_AND_VERIFY: if asymmetric is None: kmd = keydata.KeyMetadata(name, purpose, keyinfo.HMAC_SHA1) elif asymmetric.lower() == "rsa": kmd = keydata.KeyMetadata(name, purpose, keyinfo.RSA_PRIV) else: # default to DSA kmd = keydata.KeyMetadata(name, purpose, keyinfo.DSA_PRIV) elif purpose == keyinfo.DECRYPT_AND_ENCRYPT: if asymmetric is None: kmd = keydata.KeyMetadata(name, purpose, keyinfo.AES) else: # default to RSA kmd = keydata.KeyMetadata(name, purpose, keyinfo.RSA_PRIV) else: raise errors.KeyczarError("Missing or unsupported purpose") if mock is not None: # just testing, update mock object mock.kmd = kmd else: fname = os.path.join(loc, "meta") if os.path.exists(fname): raise errors.KeyczarError("File already exists") util.WriteFile(str(kmd), fname) def AddKey(loc, status, crypter=None, size=None): czar = CreateGenericKeyczar(loc, crypter) if size == -1: size = None czar.AddVersion(status, size) UpdateGenericKeyczar(czar, loc, crypter) def PubKey(loc, dest): if mock is None and dest is None: # not required when testing raise errors.KeyczarError("Must define destination") czar = CreateGenericKeyczar(loc) czar.PublicKeyExport(dest, mock) # supply mock for testing if enabled def Promote(loc, num): czar = CreateGenericKeyczar(loc) if num < 0: raise errors.KeyczarError("Missing version") czar.Promote(num) UpdateGenericKeyczar(czar, loc) def Demote(loc, num): czar = CreateGenericKeyczar(loc) if num < 0: raise errors.KeyczarError("Missing version") czar.Demote(num) UpdateGenericKeyczar(czar, loc) def Revoke(loc, num): czar = CreateGenericKeyczar(loc) if num < 0: raise errors.KeyczarError("Missing version") czar.Revoke(num) UpdateGenericKeyczar(czar, loc) if mock is not None: # testing, update mock mock.RemoveKey(num) else: os.remove(os.path.join(loc, str(num))) # remove key file def GenKeySet(loc): print "Generating private key sets..." for (name, purpose, asymmetric, crypter) in KEYSETS: print "." dir = os.path.join(loc, name) if crypter: crypter = keyczar.Crypter.Read(os.path.join(loc, crypter)) Clean(dir) Create(dir, "Test", purpose, asymmetric) AddKey(dir, keyinfo.PRIMARY, crypter) UseKey(purpose, dir, os.path.join(dir, "1.out"), crypter) AddKey(dir, keyinfo.PRIMARY, crypter) UseKey(purpose, dir, os.path.join(dir, "2.out"), crypter) print "Exporting public key sets..." for name in ('dsa', 'rsa-sign'): print "." dir = os.path.join(loc, name) dest = os.path.join(loc, name + '.public') PubKey(dir, dest) print "Done!" def Clean(directory): for file in os.listdir(directory): path = os.path.join(directory, file) if not os.path.isdir(path): os.remove(path) def UseKey(purpose, loc, dest, crypter=None, msg="This is some test data"): reader = readers.FileReader(loc) answer = "" if crypter: reader = readers.EncryptedReader(reader, crypter) if purpose == keyinfo.DECRYPT_AND_ENCRYPT: answer = keyczar.Crypter(reader).Encrypt(msg) elif purpose == keyinfo.SIGN_AND_VERIFY: answer = keyczar.Signer(reader).Sign(msg) util.WriteFile(answer, dest) def Usage(): print '''Usage: "Keyczart command flags" Commands: create addkey pubkey promote demote revoke Flags: location name size status purpose destination version asymmetric crypter Command Usage: create --location=/path/to/keys --purpose=(crypt|sign) [--name="A name"] [--asymmetric=(dsa|rsa)] Creates a new, empty key set in the given location. This key set must have a purpose of either "crypt" or "sign" and may optionally be given a name. The optional asymmetric flag will generate a public key set of the given algorithm. The "dsa" asymmetric value is valid only for sets with "sign" purpose. with the given purpose. addkey --location=/path/to/keys [--status=(active|primary)] [--size=size] [--crypter=crypterLocation] Adds a new key to an existing key set. Optionally specify a purpose, which is active by default. Optionally specify a key size in bits. Also optionally specify the location of a set of crypting keys, which will be used to encrypt this key set. pubkey --location=/path/to/keys --destination=/destination Extracts public keys from a given key set and writes them to the destination. The "pubkey" command Only works for key sets that were created with the "--asymmetric" flag. promote --location=/path/to/keys --version=versionNumber Promotes the status of the given key version in the given location. Active keys are promoted to primary (which demotes any existing primary key to active). Keys scheduled for revocation are promoted to be active. demote --location=/path/to/keys --version=versionNumber Demotes the status of the given key version in the given location. Primary keys are demoted to active. Active keys are scheduled for revocation. revoke --location=/path/to/keys --version=versionNumber Revokes the key of the given version number. This key must have been scheduled for revocation by the promote command. WARNING: The key will be destroyed. Optional flags are in [brackets]. The notation (a|b|c) means "a", "b", and "c" are the valid choices''' def CreateGenericKeyczar(loc, crypter=None): if mock is not None: return keyczar.GenericKeyczar(mock) if loc is None: raise errors.KeyczarError("Need location") else: reader = readers.FileReader(loc) if crypter: reader = readers.EncryptedReader(reader, crypter) return keyczar.GenericKeyczar(reader) def UpdateGenericKeyczar(czar, loc, encrypter=None): if mock is not None: # update key data mock.kmd = czar.metadata for v in czar.versions: mock.SetKey(v.version_number, czar.GetKey(v)) else: czar.Write(loc, encrypter) def main(argv): if len(argv) == 0: Usage() else: cmd = GetCommand(argv[0]) flags = {} for arg in argv: if arg.startswith("--"): arg = arg[2:] # trim leading dashes try: [flag, val] = arg.split("=") flags[GetFlag(flag)] = val except ValueError: print "Flags incorrectly formatted" Usage() try: version = int(flags.get(VERSION, -1)) size = int(flags.get(SIZE, -1)) # -1 if non-existent except ValueError: print "Size and version flags require an integer" Usage() loc = flags.get(LOCATION) # all commands need location if cmd == CREATE: purpose = {'crypt': keyinfo.DECRYPT_AND_ENCRYPT, 'sign': keyinfo.SIGN_AND_VERIFY}.get(flags.get(PURPOSE)) Create(loc, flags.get(NAME, 'Test'), purpose, flags.get(ASYMMETRIC)) elif cmd == ADDKEY: status = keyinfo.GetStatus(flags.get(STATUS, 'ACTIVE').upper()) if CRYPTER in flags: crypter = keyczar.Encrypter.Read(flags[CRYPTER]) else: crypter = None AddKey(loc, status, crypter, size) elif cmd == PUBKEY: PubKey(loc, flags.get(DESTINATION)) elif cmd == PROMOTE: Promote(loc, version) elif cmd == DEMOTE: Demote(loc, version) elif cmd == REVOKE: Revoke(loc, version) elif cmd == GENKEY: GenKeySet(loc) else: Usage() if __name__ == '__main__': sys.exit(main(sys.argv[1:])) # sys.argv[0] is name of programpython-keyczar-0.6~b.061709.orig/src/keyczar/util.py0000644000000000000000000002740711446512614020714 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Utility functions for keyczar package. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import base64 import math import os try: # Import hashlib if Python >= 2.5 from hashlib import sha1 except ImportError: from sha import sha as sha1 from pyasn1.codec.der import decoder from pyasn1.codec.der import encoder from pyasn1.type import univ import errors HLEN = sha1().digest_size # length of the hash output #RSAPrivateKey ::= SEQUENCE { # version Version, # modulus INTEGER, -- n # publicExponent INTEGER, -- e # privateExponent INTEGER, -- d # prime1 INTEGER, -- p # prime2 INTEGER, -- q # exponent1 INTEGER, -- d mod (p-1) # exponent2 INTEGER, -- d mod (q-1) # coefficient INTEGER -- (inverse of q) mod p } # #Version ::= INTEGER RSA_OID = univ.ObjectIdentifier('1.2.840.113549.1.1.1') RSA_PARAMS = ['n', 'e', 'd', 'p', 'q', 'dp', 'dq', 'invq'] DSA_OID = univ.ObjectIdentifier('1.2.840.10040.4.1') DSA_PARAMS = ['p', 'q', 'g'] # only algorithm params, not public/private keys SHA1RSA_OID = univ.ObjectIdentifier('1.2.840.113549.1.1.5') SHA1_OID = univ.ObjectIdentifier('1.3.14.3.2.26') def ASN1Sequence(*vals): seq = univ.Sequence() for i in range(len(vals)): seq.setComponentByPosition(i, vals[i]) return seq def ParseASN1Sequence(seq): return [seq.getComponentByPosition(i) for i in range(len(seq))] #PrivateKeyInfo ::= SEQUENCE { # version Version, # # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, # privateKey PrivateKey, # attributes [0] IMPLICIT Attributes OPTIONAL } # #Version ::= INTEGER # #PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier # #PrivateKey ::= OCTET STRING # #Attributes ::= SET OF Attribute def ParsePkcs8(pkcs8): seq = ParseASN1Sequence(decoder.decode(Decode(pkcs8))[0]) if len(seq) != 3: # need three fields in PrivateKeyInfo raise errors.KeyczarError("Illegal PKCS8 String.") version = int(seq[0]) if version != 0: raise errors.KeyczarError("Unrecognized PKCS8 Version") [oid, alg_params] = ParseASN1Sequence(seq[1]) key = decoder.decode(seq[2])[0] # Component 2 is an OCTET STRING which is further decoded params = {} if oid == RSA_OID: key = ParseASN1Sequence(key) version = int(key[0]) if version != 0: raise errors.KeyczarError("Unrecognized RSA Private Key Version") for i in range(len(RSA_PARAMS)): params[RSA_PARAMS[i]] = long(key[i+1]) elif oid == DSA_OID: alg_params = ParseASN1Sequence(alg_params) for i in range(len(DSA_PARAMS)): params[DSA_PARAMS[i]] = long(alg_params[i]) params['x'] = long(key) else: raise errors.KeyczarError("Unrecognized AlgorithmIdentifier: not RSA/DSA") return params def ExportRsaPkcs8(params): oid = ASN1Sequence(RSA_OID, univ.Null()) key = univ.Sequence().setComponentByPosition(0, univ.Integer(0)) # version for i in range(len(RSA_PARAMS)): key.setComponentByPosition(i+1, univ.Integer(params[RSA_PARAMS[i]])) octkey = encoder.encode(key) seq = ASN1Sequence(univ.Integer(0), oid, univ.OctetString(octkey)) return Encode(encoder.encode(seq)) def ExportDsaPkcs8(params): alg_params = univ.Sequence() for i in range(len(DSA_PARAMS)): alg_params.setComponentByPosition(i, univ.Integer(params[DSA_PARAMS[i]])) oid = ASN1Sequence(DSA_OID, alg_params) octkey = encoder.encode(univ.Integer(params['x'])) seq = ASN1Sequence(univ.Integer(0), oid, univ.OctetString(octkey)) return Encode(encoder.encode(seq)) #NOTE: not full X.509 certificate, just public key info #SubjectPublicKeyInfo ::= SEQUENCE { # algorithm AlgorithmIdentifier, # subjectPublicKey BIT STRING } def ParseX509(x509): seq = ParseASN1Sequence(decoder.decode(Decode(x509))[0]) if len(seq) != 2: # need two fields in SubjectPublicKeyInfo raise errors.KeyczarError("Illegal X.509 String.") [oid, alg_params] = ParseASN1Sequence(seq[0]) pubkey = decoder.decode(univ.OctetString(BinToBytes(seq[1]. prettyPrint()[1:-2])))[0] # Component 1 should be a BIT STRING, get raw bits by discarding extra chars, # then convert to OCTET STRING which can be ASN.1 decoded params = {} if oid == RSA_OID: [params['n'], params['e']] = [long(x) for x in ParseASN1Sequence(pubkey)] elif oid == DSA_OID: vals = [long(x) for x in ParseASN1Sequence(alg_params)] for i in range(len(DSA_PARAMS)): params[DSA_PARAMS[i]] = vals[i] params['y'] = long(pubkey) else: raise errors.KeyczarError("Unrecognized AlgorithmIdentifier: not RSA/DSA") return params def ExportRsaX509(params): oid = ASN1Sequence(RSA_OID, univ.Null()) key = ASN1Sequence(univ.Integer(params['n']), univ.Integer(params['e'])) binkey = BytesToBin(encoder.encode(key)) pubkey = univ.BitString("'%s'B" % binkey) # needs to be a BIT STRING seq = ASN1Sequence(oid, pubkey) return Encode(encoder.encode(seq)) def ExportDsaX509(params): alg_params = ASN1Sequence(univ.Integer(params['p']), univ.Integer(params['q']), univ.Integer(params['g'])) oid = ASN1Sequence(DSA_OID, alg_params) binkey = BytesToBin(encoder.encode(univ.Integer(params['y']))) pubkey = univ.BitString("'%s'B" % binkey) # needs to be a BIT STRING seq = ASN1Sequence(oid, pubkey) return Encode(encoder.encode(seq)) def MakeDsaSig(r, s): """ Given the raw parameters of a DSA signature, return a Base64 signature. @param r: parameter r of DSA signature @type r: long int @param s: parameter s of DSA signature @type s: long int @return: raw byte string formatted as an ASN.1 sequence of r and s @rtype: string """ seq = ASN1Sequence(univ.Integer(r), univ.Integer(s)) return encoder.encode(seq) def ParseDsaSig(sig): """ Given a raw byte string, return tuple of DSA signature parameters. @param sig: byte string of ASN.1 representation @type sig: string @return: parameters r, s as a tuple @rtype: tuple @raise KeyczarErrror: if the DSA signature format is invalid """ seq = decoder.decode(sig)[0] if len(seq) != 2: raise errors.KeyczarError("Illegal DSA signature.") r = long(seq.getComponentByPosition(0)) s = long(seq.getComponentByPosition(1)) return (r, s) def MakeEmsaMessage(msg, modulus_size): """Algorithm EMSA_PKCS1-v1_5 from PKCS 1 version 2""" magic_sha1_header = [0x30, 0x21, 0x30, 0x9, 0x6, 0x5, 0x2b, 0xe, 0x3, 0x2, 0x1a, 0x5, 0x0, 0x4, 0x14] encoded = "".join([chr(c) for c in magic_sha1_header]) + Hash(msg) pad_string = chr(0xFF) * (modulus_size / 8 - len(encoded) - 3) return chr(1) + pad_string + chr(0) + encoded def BinToBytes(bits): """Convert bit string to byte string.""" bits = _PadByte(bits) octets = [bits[8*i:8*(i+1)] for i in range(len(bits)/8)] bytes = [chr(int(x, 2)) for x in octets] return "".join(bytes) def BytesToBin(bytes): """Convert byte string to bit string.""" return "".join([_PadByte(IntToBin(ord(byte))) for byte in bytes]) def _PadByte(bits): """Pad a string of bits with zeros to make its length a multiple of 8.""" r = len(bits) % 8 return ((8-r) % 8)*'0' + bits def IntToBin(n): if n == 0 or n == 1: return str(n) elif n % 2 == 0: return IntToBin(n/2) + "0" else: return IntToBin(n/2) + "1" def BigIntToBytes(n): """Return a big-endian byte string representation of an arbitrary length n.""" chars = [] while (n > 0): chars.append(chr(n % 256)) n = n >> 8 chars.reverse() return "".join(chars) def IntToBytes(n): """Return byte string of 4 big-endian ordered bytes representing n.""" bytes = [m % 256 for m in [n >> 24, n >> 16, n >> 8, n]] return "".join([chr(b) for b in bytes]) # byte array to byte string def BytesToLong(bytes): l = len(bytes) return long(sum([ord(bytes[i]) * 256**(l - 1 - i) for i in range(l)])) def Xor(a, b): """Return a ^ b as a byte string where a and b are byte strings.""" # pad shorter byte string with zeros to make length equal m = max(len(a), len(b)) if m > len(a): a = PadBytes(a, m - len(a)) elif m > len(b): b = PadBytes(b, m - len(b)) x = [ord(c) for c in a] y = [ord(c) for c in b] z = [chr(x[i] ^ y[i]) for i in range(m)] return "".join(z) def PadBytes(bytes, n): """Prepend a byte string with n zero bytes.""" return n * '\x00' + bytes def TrimBytes(bytes): """Trim leading zero bytes.""" trimmed = bytes.lstrip(chr(0)) if trimmed == "": # was a string of all zero bytes return chr(0) else: return trimmed def RandBytes(n): """Return n random bytes.""" # This function requires at least Python 2.4. return os.urandom(n) def Hash(*inputs): """Return a SHA-1 hash over a variable number of inputs.""" md = sha1() for i in inputs: md.update(i) return md.digest() def PrefixHash(*inputs): """Return a SHA-1 hash over a variable number of inputs.""" md = sha1() for i in inputs: md.update(IntToBytes(len(i))) md.update(i) return md.digest() def Encode(s): """ Return Base64 encoding of s. Suppress padding characters (=). Uses URL-safe alphabet: - replaces +, _ replaces /. Will convert s of type unicode to string type first. @param s: string to encode as Base64 @type s: string @return: Base64 representation of s. @rtype: string """ return base64.urlsafe_b64encode(str(s)).replace("=", "") def Decode(s): """ Return decoded version of given Base64 string. Ignore whitespace. Uses URL-safe alphabet: - replaces +, _ replaces /. Will convert s of type unicode to string type first. @param s: Base64 string to decode @type s: string @return: original string that was encoded as Base64 @rtype: string @raise Base64DecodingError: If length of string (ignoring whitespace) is one more than a multiple of four. """ s = str(s.replace(" ", "")) # kill whitespace, make string (not unicode) d = len(s) % 4 if d == 1: raise errors.Base64DecodingError() elif d == 2: s += "==" elif d == 3: s += "=" return base64.urlsafe_b64decode(s) def WriteFile(data, loc): """ Writes data to file at given location. @param data: contents to be written to file @type data: string @param loc: name of file to write to @type loc: string @raise KeyczarError: if unable to write to file because of IOError """ try: f = open(loc, "w") f.write(data) f.close() except IOError: raise errors.KeyczarError("Unable to write to file %s." % loc) def ReadFile(loc): """ Read data from file at given location. @param loc: name of file to read from @type loc: string @return: contents of the file @rtype: string @raise KeyczarError: if unable to read from file because of IOError """ try: return open(loc).read() except IOError: raise errors.KeyczarError("Unable to read file %s." % loc) def MGF(seed, mlen): """ Mask Generation Function (MGF1) with SHA-1 as hash. @param seed: used to generate mask, a byte string @type seed: string @param mlen: desired length of mask @type mlen: integer @return: mask, byte string of length mlen @rtype: string @raise KeyczarError: if mask length too long, > 2^32 * hash_length """ if mlen > 2**32 * HLEN: raise errors.KeyczarError("MGF1 mask length too long.") output = "" for i in range(int(math.ceil(mlen / float(HLEN)))): output += Hash(seed, IntToBytes(i)) return output[:mlen] python-keyczar-0.6~b.061709.orig/src/keyczar/__init__.py0000644000000000000000000000147411046627164021475 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Keyczar Cryptography Toolkit Collection of tools for managing and using cryptographic keys. Goal is to make it easier for developers to use application-layer cryptography. @author: arkajit.dey@gmail.com (Arkajit Dey) """python-keyczar-0.6~b.061709.orig/src/keyczar/keyczar.py0000644000000000000000000004252111446721511021377 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Collection of all Keyczar classes used to perform cryptographic functions: encrypt, decrypt, sign and verify. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import os import errors import keydata import keyinfo import keys import readers import util VERSION = 0 VERSION_BYTE = '\x00' KEY_HASH_SIZE = 4 HEADER_SIZE = 1 + KEY_HASH_SIZE class Keyczar(object): """Abstract Keyczar base class.""" def __init__(self, reader): self.metadata = keydata.KeyMetadata.Read(reader.GetMetadata()) self._keys = {} # maps both KeyVersions and hash ids to keys self.primary_version = None # default if no primary key self.default_size = self.metadata.type.default_size if not self.IsAcceptablePurpose(self.metadata.purpose): raise errors.KeyczarError("Unacceptable purpose: %s" % self.metadata.purpose) if self.metadata.encrypted and not isinstance(reader, readers.EncryptedReader): raise errors.KeyczarError("Need encrypted reader.") for version in self.metadata.versions: if version.status == keyinfo.PRIMARY: if self.primary_version is not None: raise errors.KeyczarError( "Key sets may only have a single primary version") self.primary_version = version key = keys.ReadKey(self.metadata.type, reader.GetKey(version.version_number)) self._keys[version] = key self._keys[key.hash] = key versions = property(lambda self: [k for k in self._keys.keys() if isinstance(k, keydata.KeyVersion)], doc="""List of versions in key set.""") primary_key = property(lambda self: self.GetKey(self.primary_version), doc="""The primary key for this key set.""") def __str__(self): return str(self.metadata) def _ParseHeader(self, header): """ Parse the header and verify version, format info. Return key if exists. @param header: the bytes of the header of Keyczar output @type header: string @return: the key identified by the hash in the header @rtype: L{keys.Key} @raise BadVersionError: if header specifies an illegal version @raise KeyNotFoundError: if key specified in header doesn't exist """ version = ord(header[0]) if version != VERSION: raise errors.BadVersionError(version) hash = util.Encode(header[1:]) return self.GetKey(hash) @staticmethod def Read(location): """ Return a Keyczar object created from FileReader at given location. @param location: pathname of the directory storing the key files @type location: string @return: a Keyczar to manage the keys stored at the given location @rtype: L{Keyczar} """ return Keyczar(readers.FileReader(location)) def IsAcceptablePurpose(self, purpose): """Indicates whether purpose is valid. Abstract method.""" def GetKey(self, id): """ Returns the key associated with the given id, a hash or a version. @param id: Either the hash identifier of the key or its version. @type id: string or L{keydata.KeyVersion} @return: key associated with this id or None if id doesn't exist. @rtype: L{keys.Key} @raise KeyNotFoundError: if key with given id doesn't exist """ try: return self._keys[id] except KeyError: raise errors.KeyNotFoundError(id) def _AddKey(self, version, key): self._keys[version] = self._keys[key.hash] = key self.metadata.AddVersion(version) class GenericKeyczar(Keyczar): """To be used by Keyczart.""" @staticmethod def Read(location): """Return a GenericKeyczar created from FileReader at given location.""" return GenericKeyczar(readers.FileReader(location)) def IsAcceptablePurpose(self, purpose): """All purposes ok for Keyczart.""" return True def AddVersion(self, status, size=None): """ Adds a new key version with given status to key set. Generates a new key of same type (repeated until hash identifier is unique) for this version. Uses supplied key size (if provided) in lieu of the default key size. If this is an unacceptable key size, raises an error. Uses next available version number. @param status: the status of the new key to be added @type status: L{keyinfo.KeyStatus} @param size: size of key in bits, uses default size if not provided. @type size: integer @raise KeyczarError: if either key type or key size is unsupported. """ if size is None: size = self.default_size if not self.metadata.type.IsValidSize(size): raise errors.KeyczarError("Unsupported key size %d bits." % size) max_version_number = 0 for version in self.versions: if max_version_number < version.version_number: max_version_number = version.version_number # Make the new version number the max of the existing versions plus one version = keydata.KeyVersion(max_version_number + 1, status, False) if status == keyinfo.PRIMARY: if self.primary_version is not None: self.primary_version.status = keyinfo.ACTIVE self.primary_version = version if size < self.default_size: print("WARNING: %d-bit key size is less than recommended default key" "size of %d bits for %s keys." % (size, self.default_size, str(self.metadata.type))) # Make sure no keys collide on their identifiers while True: key = keys.GenKey(self.metadata.type, size) if self._keys.get(key.hash) is None: break self._AddKey(version, key) def Promote(self, version_number): """ Promotes the status of key with given version number. Promoting ACTIVE key automatically demotes current PRIMARY key to ACTIVE. @param version_number: the version number to promote @type version_number: integer @raise KeyczarError: if invalid version number or trying to promote a primary key """ version = self.metadata.GetVersion(version_number) if version.status == keyinfo.PRIMARY: raise errors.KeyczarError("Can't promote a primary key.") elif version.status == keyinfo.ACTIVE: version.status = keyinfo.PRIMARY if self.primary_version is not None: self.primary_version.status = keyinfo.ACTIVE # only one primary key self.primary_version = version elif version.status == keyinfo.INACTIVE: version.status = keyinfo.ACTIVE def Demote(self, version_number): """ Demotes the status of key with given version number. Demoting PRIMARY key results in a key set with no primary version. @param version_number: the version number to demote @type version_number: integer @raise KeyczarError: if invalid version number or trying to demote an inactive key, use L{Revoke} instead. """ version = self.metadata.GetVersion(version_number) if version.status == keyinfo.PRIMARY: version.status = keyinfo.ACTIVE self.primary_version = None # no more primary keys in the set elif version.status == keyinfo.ACTIVE: version.status = keyinfo.INACTIVE elif version.status == keyinfo.INACTIVE: raise errors.KeyczarError("Can't demote an inactive key, only revoke.") def Revoke(self, version_number): """ Revokes the key with given version number if scheduled to be revoked. @param version_number: integer version number to revoke @type version_number: integer @raise KeyczarError: if invalid version number or key is not inactive. """ version = self.metadata.GetVersion(version_number) if version.status == keyinfo.INACTIVE: self.metadata.RemoveVersion(version_number) else: raise errors.KeyczarError("Can't revoke key if not inactive.") def PublicKeyExport(self, dest, mock=None): """Export the public keys corresponding to our key set to destination.""" kmd = self.metadata pubkmd = None if kmd.type == keyinfo.DSA_PRIV and kmd.purpose == keyinfo.SIGN_AND_VERIFY: pubkmd = keydata.KeyMetadata(kmd.name, keyinfo.VERIFY, keyinfo.DSA_PUB) elif kmd.type == keyinfo.RSA_PRIV: if kmd.purpose == keyinfo.DECRYPT_AND_ENCRYPT: pubkmd = keydata.KeyMetadata(kmd.name, keyinfo.ENCRYPT, keyinfo.RSA_PUB) elif kmd.purpose == keyinfo.SIGN_AND_VERIFY: pubkmd = keydata.KeyMetadata(kmd.name, keyinfo.VERIFY, keyinfo.RSA_PUB) if pubkmd is None: raise errors.KeyczarError("Cannot export public key") for v in self.versions: pubkmd.AddVersion(v) pubkey = self.GetKey(v).public_key if mock: # only for testing mock.SetPubKey(v.version_number, pubkey) else: util.WriteFile(str(pubkey), os.path.join(dest, str(v.version_number))) if mock: # only for testing mock.pubkmd = pubkmd else: util.WriteFile(str(pubkmd), os.path.join(dest, "meta")) def Write(self, loc, encrypter=None): if encrypter: self.metadata.encrypted = True util.WriteFile(str(self.metadata), os.path.join(loc, "meta")) # just plain for v in self.versions: key = str(self.GetKey(v)) if self.metadata.encrypted: key = encrypter.Encrypt(key) # encrypt key info before outputting util.WriteFile(key, os.path.join(loc, str(v.version_number))) class Encrypter(Keyczar): """Capable of encrypting only.""" @staticmethod def Read(location): """ Return an Encrypter object created from FileReader at given location. @param location: pathname of the directory storing the key files @type location: string @return: an Encrypter to manage the keys stored at the given location and perform encryption functions. @rtype: L{Encrypter} """ return Encrypter(readers.FileReader(location)) def IsAcceptablePurpose(self, purpose): """Only valid if purpose includes encrypting.""" return purpose == keyinfo.ENCRYPT or purpose == keyinfo.DECRYPT_AND_ENCRYPT def Encrypt(self, data): """ Encrypt the data and return the ciphertext. @param data: message to encrypt @type data: string @return: ciphertext encoded as a Base64 string @rtype: string @raise NoPrimaryKeyError: if no primary key can be found to encrypt """ encrypting_key = self.primary_key if encrypting_key is None: raise errors.NoPrimaryKeyError() return util.Encode(encrypting_key.Encrypt(data)) class Verifier(Keyczar): """Capable of verifying only.""" @staticmethod def Read(location): """ Return a Verifier object created from FileReader at given location. @param location: pathname of the directory storing the key files @type location: string @return: a Verifier to manage the keys stored at the given location and perform verify functions. @rtype: L{Verifier} """ return Verifier(readers.FileReader(location)) def IsAcceptablePurpose(self, purpose): """Only valid if purpose includes verifying.""" return purpose == keyinfo.VERIFY or purpose == keyinfo.SIGN_AND_VERIFY def Verify(self, data, sig): """ Verifies whether the signature corresponds to the given data. @param data: message that has been signed with sig @type data: string @param sig: Base64 string formatted as Header|Signature @type sig: string @return: True if sig corresponds to data, False otherwise. @rtype: boolean """ sig_bytes = util.Decode(sig) if len(sig_bytes) < HEADER_SIZE: raise errors.ShortSignatureError(len(sig_bytes)) key = self._ParseHeader(sig_bytes[:HEADER_SIZE]) return key.Verify(data + VERSION_BYTE, sig_bytes[HEADER_SIZE:]) class UnversionedVerifier(Keyczar): """Capable of verifying unversioned, standard signatures only.""" @staticmethod def Read(location): """ Return a UnversionedVerifier object created from FileReader at given location. @param location: pathname of the directory storing the key files @type location: string @return: a Verifier to manage the keys stored at the given location and perform verify functions. @rtype: L{Verifier} """ return UnversionedVerifier(readers.FileReader(location)) def IsAcceptablePurpose(self, purpose): """Only valid if purpose includes verifying.""" return purpose == keyinfo.VERIFY or purpose == keyinfo.SIGN_AND_VERIFY def Verify(self, data, sig): """ Verifies whether the signature corresponds to the given data. This is a stanard signature (i.e. HMAC-SHA1, RSA-SHA1, DSA-SHA1) that contains no version information, so this will try to verify with each key in a keyset. @param data: message that has been signed with sig @type data: string @param sig: Base64 string formatted as Header|Signature @type sig: string @return: True if sig corresponds to data, False otherwise. @rtype: boolean """ sig_bytes = util.Decode(sig) for version in self.versions: key = self._keys[version] # Try to verify with each key result = key.Verify(data, sig_bytes) if result: return True # None of the keys verified the signature return False class Crypter(Encrypter): """Capable of encrypting and decrypting.""" @staticmethod def Read(location): """ Return a Crypter object created from FileReader at given location. @param location: pathname of the directory storing the key files @type location: string @return: a Crypter to manage the keys stored at the given location and perform encryption and decryption functions. @rtype: L{Crypter} """ return Crypter(readers.FileReader(location)) def IsAcceptablePurpose(self, purpose): """Only valid if purpose includes decrypting""" return purpose == keyinfo.DECRYPT_AND_ENCRYPT def Decrypt(self, ciphertext): """ Decrypts the given ciphertext and returns the plaintext. @param ciphertext: Base64 encoded string ciphertext to be decrypted. @type ciphertext: string @return: plaintext message @rtype: string @raise ShortCiphertextError: if length is too short to have Header, IV, Sig @raise BadVersionError: if header specifies an illegal version @raise BadFormatError: if header specifies an illegal format @raise KeyNotFoundError: if key specified in header doesn't exist @raise InvalidSignatureError: if the signature can't be verified """ data_bytes = util.Decode(ciphertext) if len(data_bytes) < HEADER_SIZE: raise errors.ShortCiphertextError(len(data_bytes)) key = self._ParseHeader(data_bytes[:HEADER_SIZE]) return key.Decrypt(data_bytes) class Signer(Verifier): """Capable of both signing and verifying.""" @staticmethod def Read(location): """ Return a Signer object created from FileReader at given location. @param location: pathname of the directory storing the key files @type location: string @return: a Signer to manage the keys stored at the given location and perform sign and verify functions. @rtype: L{Signer} """ return Signer(readers.FileReader(location)) def IsAcceptablePurpose(self, purpose): """Only valid if purpose includes signing.""" return purpose == keyinfo.SIGN_AND_VERIFY def Sign(self, data): """ Sign given data and return corresponding signature. For message M, outputs the signature as Header|Sig(Header.M). @param data: message to be signed @type data: string @return: signature on the data encoded as a Base64 string @rtype: string """ signing_key = self.primary_key if signing_key is None: raise errors.NoPrimaryKeyError() header = signing_key.Header() return util.Encode(header + signing_key.Sign(data + VERSION_BYTE)) class UnversionedSigner(UnversionedVerifier): """Capable of both signing and verifying. This outputs standard signatures (i.e. HMAC-SHA1, DSA-SHA1, RSA-SHA1) that contain no key versioning. """ @staticmethod def Read(location): """ Return an UnversionedSigner object created from FileReader at given location. @param location: pathname of the directory storing the key files @type location: string @return: a Signer to manage the keys stored at the given location and perform sign and verify functions. @rtype: L{Signer} """ return UnversionedSigner(readers.FileReader(location)) def IsAcceptablePurpose(self, purpose): """Only valid if purpose includes signing.""" return purpose == keyinfo.SIGN_AND_VERIFY def Sign(self, data): """ Sign given data and return corresponding signature. This signature contains no header or version information. For message M, outputs the signature as Sig(M). @param data: message to be signed @type data: string @return: signature on the data encoded as a Base64 string @rtype: string """ signing_key = self.primary_key if signing_key is None: raise errors.NoPrimaryKeyError() return util.Encode(signing_key.Sign(data)) python-keyczar-0.6~b.061709.orig/src/keyczar/readers.py0000644000000000000000000000732211053353132021346 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ A Reader supports reading metadata and key info for key sets. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import os import errors import keydata import keys import util class Reader(object): """Interface providing supported methods (no implementation).""" def GetMetadata(self): """ Return the KeyMetadata for the key set being read. @return: JSON string representation of KeyMetadata object @rtype: string @raise KeyczarError: if unable to read metadata (e.g. IOError) """ def GetKey(self, version_number): """ Return the key corresponding to the given version. @param version_number: the version number of the desired key @type version_number: integer @return: JSON string representation of a Key object @rtype: string @raise KeyczarError: if unable to read key info (e.g. IOError) """ class FileReader(Reader): """Reader that reads key data from files.""" def __init__(self, location): self._location = location def GetMetadata(self): return util.ReadFile(os.path.join(self._location, "meta")) def GetKey(self, version_number): return util.ReadFile(os.path.join(self._location, str(version_number))) class EncryptedReader(Reader): """Reader that reads encrypted key data from files.""" def __init__(self, reader, crypter): self._reader = reader self._crypter = crypter def GetMetadata(self): return self._reader.GetMetadata() def GetKey(self, version_number): return self._crypter.Decrypt(self._reader.GetKey(version_number)) class MockReader(Reader): """Mock reader used for testing Keyczart.""" def __init__(self, name, purpose, type, encrypted=False): self.kmd = keydata.KeyMetadata(name, purpose, type, encrypted) self.pubkmd = None self.keys = {} self.pubkeys = {} @property def numkeys(self): return len(self.keys) def GetMetadata(self): return str(self.kmd) def GetKey(self, version_number): try: return str(self.keys[version_number]) except KeyError: raise errors.KeyczarError("Unrecognized Version Number") def GetStatus(self, version_number): return self.kmd.GetVersion(version_number).status def SetKey(self, version_number, key): self.keys[version_number] = key def SetPubKey(self, version_number, key): self.pubkeys[version_number] = key def AddKey(self, version_number, status, size=None): """Utility method for testing.""" key = keys.GenKey(self.kmd.type, size) self.keys[version_number] = key return self.kmd.AddVersion(keydata.KeyVersion(version_number, status, False)) def RemoveKey(self, version_number): """Mocks out deleting revoked key files.""" self.keys.pop(version_number) def ExistsVersion(self, version_number): return version_number in self.keys def HasPubKey(self, version_number): priv = self.keys[version_number] pub = self.pubkeys[version_number] return priv.public_key == pub def GetKeySize(self, version_number): return self.keys[version_number].size python-keyczar-0.6~b.061709.orig/src/keyczar/keydata.py0000644000000000000000000001105511216303316021341 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Encodes the two classes storing data about keys: - KeyMetadata: stores metadata - KeyVersion: stores key strings and types @author: arkajit.dey@gmail.com (Arkajit Dey) """ try: import simplejson as json except ImportError: import json import errors import keyinfo class KeyMetadata(object): """Encodes metadata for a keyset with a name, purpose, type, and versions.""" def __init__(self, name, purpose, type, encrypted=False): self.name = name self.purpose = purpose self.type = type self.encrypted = encrypted self.__versions = {} # dictionary from version nums to KeyVersions versions = property(lambda self: self.__versions.values()) def __str__(self): return json.dumps({"name": self.name, "purpose": str(self.purpose), "type": str(self.type), "encrypted": self.encrypted, "versions": [json.loads(str(v)) for v in self.versions]}) def AddVersion(self, version): """ Adds given version and returns True if successful. @param version: version to add @type version: L{KeyVersion} @return: True if version was successfully added (i.e. no previous version had the same version number), False otherwise. @rtype: boolean """ num = version.version_number if num not in self.__versions: self.__versions[num] = version return True return False def RemoveVersion(self, version_number): """ Removes version with given version number and returns it if it exists. @param version_number: version number to remove @type version_number: integer @return: the removed version if it exists @rtype: L{KeyVersion} @raise KeyczarError: if the version number is non-existent """ try: self.__versions.pop(version_number) except KeyError: raise errors.KeyczarError("No such version number: %d" % version_number) def GetVersion(self, version_number): """ Return the version corresponding to the given version number. @param version_number: integer version number of desired version @type version_number: integer @return: the corresponding version if it exists @rtype: L{KeyVersion} @raise KeyczarError: if the version number is non-existent. """ try: return self.__versions[version_number] except KeyError: raise errors.KeyczarError("No such version number: %d" % version_number) @staticmethod def Read(json_string): """ Return KeyMetadata object constructed from JSON string representation. @param json_string: a JSON representation of a KeyMetadata object @type json_string: string @return: the constructed KeyMetadata object @rtype: L{KeyMetadata} """ meta = json.loads(json_string) kmd = KeyMetadata(meta['name'], keyinfo.GetPurpose(meta['purpose']), keyinfo.GetType(meta['type']), meta['encrypted']) for version in meta['versions']: kmd.AddVersion(KeyVersion.Read(version)) return kmd class KeyVersion(object): def __init__(self, v, s, export): self.version_number = v self.__status = s self.exportable = export def __SetStatus(self, new_status): if new_status: self.__status = new_status status = property(lambda self: self.__status, __SetStatus) def __str__(self): return json.dumps({"versionNumber": self.version_number, "status": str(self.status), "exportable": self.exportable}) @staticmethod def Read(version): """ Return KeyVersion object constructed from dictionary derived from JSON. @param version: a dictionary obtained from a JSON string representation @type version: dictionary @return: constructed KeyVersion object @rtype: L{KeyVersion} """ return KeyVersion(version['versionNumber'], keyinfo.GetStatus(version['status']), version['exportable']) python-keyczar-0.6~b.061709.orig/src/keyczar/keys.py0000644000000000000000000006306711446721511020712 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Represents cryptographic keys in Keyczar. Identifies a key by its hash and type. Includes several subclasses of base class Key. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import hmac import math import random try: # Import hashlib if Python >= 2.5 from hashlib import sha1 except ImportError: import sha as sha1 from Crypto.Cipher import AES from Crypto.PublicKey import DSA from Crypto.PublicKey import RSA try: import simplejson as json except ImportError: import json import errors import keyczar import keyinfo import util #TODO: Note that simplejson deals in Unicode strings. So perhaps we should #modify all Read() methods to wrap data obtained from simplejson with str(). #Currently, only problem arose with base64 conversions -- this was dealt with #directly in the encode/decode methods. Luckily 'hello' == u'hello'. def GenKey(type, size=None): """ Generates a key of the given type and length. @param type: the type of key to generate @type type: L{keyinfo.KeyType} @param size: the length in bits of the key to be generated @type size: integer @return: the generated key of the given type and size @raise KeyczarError: if type is a public key or unsupported or if key size is unsupported. """ if size is None: size = type.default_size if not type.IsValidSize(size): raise errors.KeyczarError("Unsupported key size %d bits." % size) try: return {keyinfo.AES: AesKey.Generate, keyinfo.HMAC_SHA1: HmacKey.Generate, keyinfo.DSA_PRIV: DsaPrivateKey.Generate, keyinfo.RSA_PRIV: RsaPrivateKey.Generate}[type](size) except KeyError: if type == keyinfo.DSA_PUB or type == keyinfo.RSA_PUB: msg = "Public keys of type %s must be exported from private keys." else: msg = "Unsupported key type: %s" raise errors.KeyczarError(msg % type) def ReadKey(type, key): """ Reads a key of the given type from a JSON string representation. @param type: the type of key to read @type type: L{keyinfo.KeyType} @param key: the JSON string representation of the key @type key: string @return: the key object read from the JSON string @raise KeyczarError: if type is unsupported """ try: return {keyinfo.AES: AesKey.Read, keyinfo.HMAC_SHA1: HmacKey.Read, keyinfo.DSA_PRIV: DsaPrivateKey.Read, keyinfo.RSA_PRIV: RsaPrivateKey.Read, keyinfo.DSA_PUB: DsaPublicKey.Read, keyinfo.RSA_PUB: RsaPublicKey.Read}[type](key) except KeyError: raise errors.KeyczarError("Unsupported key type: %s" % type) class Key(object): """Parent class for Keyczar Keys.""" def __init__(self, type): self.type = type self.__size = self.type.default_size # initially default def __eq__(self, other): return (self.type == other.type and self.size == other.size and self.key_string == other.key_string) def __SetSize(self, new_size): if self.type.IsValidSize(new_size): self.__size = new_size def _GetKeyString(self): """Return the key as a string. Abstract method.""" def __GetKeyString(self): """Indirect getter for the key string.""" return self._GetKeyString() def _Hash(self): """Compute and return the hash id of this key. Can override default hash.""" fullhash = util.Hash(util.IntToBytes(len(self.key_bytes)), self.key_bytes) return util.Encode(fullhash[:keyczar.KEY_HASH_SIZE]) def __Hash(self): """Indirect getter for hash.""" return self._Hash() hash = property(__Hash, doc="""The hash id of the key.""") size = property(lambda self: self.__size, __SetSize, doc="""The size of the key in bits.""") key_string = property(__GetKeyString, doc="""The key as a Base64 string.""") key_bytes = property(lambda self: util.Decode(self.key_string), doc="""The key as bytes.""") def Header(self): """Return the 5-byte header string including version byte, 4-byte hash.""" return chr(keyczar.VERSION) + util.Decode(self.hash) class SymmetricKey(Key): """Parent class for symmetric keys such as AES, HMAC-SHA1""" def __init__(self, type, key_string): Key.__init__(self, type) self.__key_string = key_string def _GetKeyString(self): """Return the key as a string.""" return self.__key_string class AsymmetricKey(Key): """Parent class for asymmetric keys.""" def __init__(self, type, params): Key.__init__(self, type) self._params = params class AesKey(SymmetricKey): """Represents AES symmetric private keys.""" def __init__(self, key_string, hmac_key, size=keyinfo.AES.default_size, mode=keyinfo.CBC): SymmetricKey.__init__(self, keyinfo.AES, key_string) self.hmac_key = hmac_key self.block_size = 16 # pycrypto AES's block size is fixed to 16 bytes self.size = size self.mode = mode def __str__(self): return json.dumps({"mode": str(self.mode), "size": self.size, "aesKeyString": self.key_string, "hmacKey": json.loads(str(self.hmac_key))}) def _Hash(self): fullhash = util.Hash(util.IntToBytes(len(self.key_bytes)), self.key_bytes, self.hmac_key.key_bytes) return util.Encode(fullhash[:keyczar.KEY_HASH_SIZE]) @staticmethod def Generate(size=keyinfo.AES.default_size): """ Return a newly generated AES key. @param size: length of key in bits to generate @type size: integer @return: an AES key @rtype: L{AesKey} """ key_bytes = util.RandBytes(size / 8) key_string = util.Encode(key_bytes) hmac_key = HmacKey.Generate() # use default HMAC-SHA1 key size return AesKey(key_string, hmac_key, size) @staticmethod def Read(key): """ Reads an AES key from a JSON string representation of it. @param key: a JSON representation of an AES key @type key: string @return: an AES key @rtype: L{AesKey} """ aes = json.loads(key) hmac = aes['hmacKey'] return AesKey(aes['aesKeyString'], HmacKey(hmac['hmacKeyString'], hmac['size']), aes['size'], keyinfo.GetMode(aes['mode'])) def __Pad(self, data): """ Returns the data padded using PKCS5. For a block size B and data with N bytes in the last block, PKCS5 pads the data with B-N bytes of the value B-N. @param data: data to be padded @type data: string @return: PKCS5 padded string @rtype: string """ pad = self.block_size - len(data) % self.block_size return data + pad * chr(pad) def __UnPad(self, padded): """ Returns the unpadded version of a data padded using PKCS5. @param padded: string padded with PKCS5 @type padded: string @return: original, unpadded string @rtype: string """ pad = ord(padded[-1]) return padded[:-pad] def Encrypt(self, data): """ Return ciphertext byte string containing Header|IV|Ciph|Sig. @param data: plaintext to be encrypted. @type data: string @return: raw byte string ciphertext formatted to have Header|IV|Ciph|Sig. @rtype: string """ data = self.__Pad(data) iv_bytes = util.RandBytes(self.block_size) ciph_bytes = AES.new(self.key_bytes, AES.MODE_CBC, iv_bytes).encrypt(data) msg_bytes = self.Header() + iv_bytes + ciph_bytes sig_bytes = self.hmac_key.Sign(msg_bytes) # Sign bytes return msg_bytes + sig_bytes def Decrypt(self, input_bytes): """ Decrypts the given ciphertext. @param input_bytes: raw byte string formatted as Header|IV|Ciph|Sig where Sig is the signature over the entire payload (Header|IV|Ciph). @type input_bytes: string @return: plaintext message @rtype: string @raise ShortCiphertextError: if the ciphertext is too short to have IV & Sig @raise InvalidSignatureError: if the signature doesn't correspond to payload """ data_bytes = input_bytes[keyczar.HEADER_SIZE:] # remove header if len(data_bytes) < self.block_size + util.HLEN: # IV + sig raise errors.ShortCiphertextError(len(data_bytes)) iv_bytes = data_bytes[:self.block_size] # first block of bytes is the IV ciph_bytes = data_bytes[self.block_size:-util.HLEN] sig_bytes = data_bytes[-util.HLEN:] # last 20 bytes are sig if not self.hmac_key.Verify(input_bytes[:-util.HLEN], sig_bytes): raise errors.InvalidSignatureError() plain = AES.new(self.key_bytes, AES.MODE_CBC, iv_bytes).decrypt(ciph_bytes) return self.__UnPad(plain) class HmacKey(SymmetricKey): """Represents HMAC-SHA1 symmetric private keys.""" def __init__(self, key_string, size=keyinfo.HMAC_SHA1.default_size): SymmetricKey.__init__(self, keyinfo.HMAC_SHA1, key_string) self.size = size def __str__(self): return json.dumps({"size": self.size, "hmacKeyString": self.key_string}) def _Hash(self): fullhash = util.Hash(self.key_bytes) return util.Encode(fullhash[:keyczar.KEY_HASH_SIZE]) @staticmethod def Generate(size=keyinfo.HMAC_SHA1.default_size): """ Return a newly generated HMAC-SHA1 key. @param size: length of key in bits to generate @type size: integer @return: an HMAC-SHA1 key @rtype: L{HmacKey} """ key_bytes = util.RandBytes(size / 8) key_string = util.Encode(key_bytes) return HmacKey(key_string, size) @staticmethod def Read(key): """ Reads an HMAC-SHA1 key from a JSON string representation of it. @param key: a JSON representation of an HMAC-SHA1 key @type key: string @return: an HMAC-SHA1 key @rtype: L{HmacKey} """ mac = json.loads(key) return HmacKey(mac['hmacKeyString'], mac['size']) def Sign(self, msg): """ Return raw byte string of signature on the message. @param msg: message to be signed @type msg: string @return: raw byte string signature @rtype: string """ return hmac.new(self.key_bytes, msg, sha1).digest() def Verify(self, msg, sig_bytes): """ Return True if the signature corresponds to the message. @param msg: message that has been signed @type msg: string @param sig_bytes: raw byte string of the signature @type sig_bytes: string @return: True if signature is valid for message. False otherwise. @rtype: boolean """ correctMac = self.Sign(msg) if len(sig_bytes) != len(correctMac): return False result = 0 for x, y in zip(correctMac, sig_bytes): result |= ord(x) ^ ord(y) return result == 0 class PrivateKey(AsymmetricKey): """Represents private keys in Keyczar for asymmetric key pairs.""" def __init__(self, type, params, pub): AsymmetricKey.__init__(self, type, params) self.public_key = pub def _Hash(self): return self.public_key.hash class PublicKey(AsymmetricKey): """Represents public keys in Keyczar for asymmetric key pairs.""" def __init__(self, type, params): AsymmetricKey.__init__(self, type, params) class DsaPrivateKey(PrivateKey): """Represents DSA private keys in an asymmetric DSA key pair.""" def __init__(self, params, pub, key, size=keyinfo.DSA_PRIV.default_size): PrivateKey.__init__(self, keyinfo.DSA_PRIV, params, pub) #PrivateKey.__init__(self, keyinfo.DSA_PRIV, params, pub) self.key = key self.public_key = pub self.params = params self.size = size def __str__(self): return json.dumps({"publicKey": json.loads(str(self.public_key)), "x": util.Encode(self.params['x']), "size": self.size}) @staticmethod def Generate(size=keyinfo.DSA_PRIV.default_size): """ Return a newly generated DSA private key. @param size: length of key in bits to generate @type size: integer @return: a DSA private key @rtype: L{DsaPrivateKey} """ key = DSA.generate(size, util.RandBytes) params = { 'x': util.PadBytes(util.BigIntToBytes(key.x), 1) } pubkey = key.publickey() pub_params = { 'g': util.PadBytes(util.BigIntToBytes(pubkey.g), 1), 'p': util.PadBytes(util.BigIntToBytes(pubkey.p), 1), 'q': util.PadBytes(util.BigIntToBytes(pubkey.q), 1), 'y': util.PadBytes(util.BigIntToBytes(pubkey.y), 1) } pub = DsaPublicKey(pub_params, pubkey, size) return DsaPrivateKey(params, pub, key, size) @staticmethod def Read(key): """ Reads a DSA private key from a JSON string representation of it. @param key: a JSON representation of a DSA private key @type key: string @return: an DSA private key @rtype: L{DsaPrivateKey} """ dsa = json.loads(key) pub = DsaPublicKey.Read(json.dumps(dsa['publicKey'])) params = { 'x' : util.Decode(dsa['x']) } key = DSA.construct((util.BytesToLong(pub._params['y']), util.BytesToLong(pub._params['g']), util.BytesToLong(pub._params['p']), util.BytesToLong(pub._params['q']), util.BytesToLong(params['x']))) return DsaPrivateKey(params, pub, key, dsa['size']) def Sign(self, msg): """ Return raw byte string of signature on the message. @param msg: message to be signed @type msg: string @return: byte string formatted as an ASN.1 sequnce of r and s @rtype: string """ # Need to chose a random k per-message, SystemRandom() is available # since Python 2.4. k = random.SystemRandom().randint(2, self.key.q-1) (r, s) = self.key.sign(util.Hash(msg), k) return util.MakeDsaSig(r, s) def Verify(self, msg, sig): """@see: L{DsaPublicKey.Verify}""" return self.public_key.Verify(msg, sig) class RsaPrivateKey(PrivateKey): """Represents RSA private keys in an asymmetric RSA key pair.""" def __init__(self, params, pub, key, size=keyinfo.RSA_PRIV.default_size): PrivateKey.__init__(self, keyinfo.RSA_PRIV, params, pub) self.key = key # instance of PyCrypto RSA key self.public_key = pub # instance of Keyczar RsaPublicKey self.params = params self.size = size # em - encoded message def __Decode(self, encoded_message, label=""): # See PKCS#1 v2.1: ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf if len(label) >= 2**61: # 2^61 = the input limit for SHA-1 raise errors.KeyczarError("OAEP Decoding Error - label is too large %d" % len(label)) if len(encoded_message) < 2 * util.HLEN + 2: raise errors.KeyczarError("OAEP Decoding Error - encoded_message is too small: %d" % len(encoded_message)) # Step 3b EM = Y || maskedSeed || maskedDB k = int(math.floor(math.log(self.key.n, 256)) + 1) # num bytes in n diff_len = k - len(encoded_message) # PyCrypto strips out leading zero bytes. # In OAEP, the first byte is expected to be a zero, so we can ignore it if diff_len > 1: # If more bytes were chopped by PyCrypto, add zero bytes back on encoded_message = '\x00' * (diff_len - 1) + encoded_message masked_seed = encoded_message[:util.HLEN] masked_datablock = encoded_message[util.HLEN:] # Step 3c,d seed_mask = util.MGF(masked_datablock, util.HLEN) seed = util.Xor(masked_seed, seed_mask) # Step 3e datablock_mask = util.MGF(seed, len(masked_datablock)) # encoded_message already stripped of 0 # Step 3f datablock = util.Xor(masked_datablock, datablock_mask) label_hash = datablock[:util.HLEN] expected_label_hash = util.Hash(label) # Debugging if label_hash != expected_label_hash: raise errors.KeyczarError("OAEP Decoding Error - hash is invalid") delimited_message = datablock[util.HLEN:].lstrip('\x00') if delimited_message[0] != '\x01': raise errors.KeyczarError("OAEP Decoding Error - expected a 1 value") return delimited_message[1:] # The message def __str__(self): return json.dumps({ "publicKey": json.loads(str(self.public_key)), "privateExponent" : util.Encode(self.params['privateExponent']), "primeP" : util.Encode(self.params['primeP']), "primeQ" : util.Encode(self.params['primeQ']), "primeExponentP" : util.Encode(self.params['primeExponentP']), "primeExponentQ" : util.Encode(self.params['primeExponentQ']), "crtCoefficient" : util.Encode(self.params['crtCoefficient']), "size": self.size}) @staticmethod def Generate(size=keyinfo.RSA_PRIV.default_size): """ Return a newly generated RSA private key. @param size: length of key in bits to generate @type size: integer @return: a RSA private key @rtype: L{RsaPrivateKey} """ key = RSA.generate(size, util.RandBytes) #NOTE: PyCrypto stores p < q, u = p^{-1} mod q #But OpenSSL and PKCS8 stores q < p, invq = q^{-1} mod p #So we have to reverse the p and q values params = { 'privateExponent': util.PadBytes(util.BigIntToBytes(key.d), 1), 'primeP': util.PadBytes(util.BigIntToBytes(key.q), 1), 'primeQ': util.PadBytes(util.BigIntToBytes(key.p), 1), 'primeExponentP': util.PadBytes(util.BigIntToBytes(key.d % (key.q - 1)), 1), 'primeExponentQ': util.PadBytes(util.BigIntToBytes(key.d % (key.p - 1)), 1), 'crtCoefficient': util.PadBytes(util.BigIntToBytes(key.u), 1)} pubkey = key.publickey() pub_params = { 'modulus': util.PadBytes(util.BigIntToBytes(key.n), 1), 'publicExponent': util.PadBytes(util.BigIntToBytes(key.e), 1)} pub = RsaPublicKey(pub_params, pubkey, size) return RsaPrivateKey(params, pub, key, size) @staticmethod def Read(key): """ Reads a RSA private key from a JSON string representation of it. @param key: a JSON representation of a RSA private key @type key: string @return: a RSA private key @rtype: L{RsaPrivateKey} """ rsa = json.loads(key) pub = RsaPublicKey.Read(json.dumps(rsa['publicKey'])) params = {'privateExponent': util.Decode(rsa['privateExponent']), 'primeP': util.Decode(rsa['primeP']), 'primeQ': util.Decode(rsa['primeQ']), 'primeExponentP': util.Decode(rsa['primeExponentP']), 'primeExponentQ': util.Decode(rsa['primeExponentQ']), 'crtCoefficient': util.Decode(rsa['crtCoefficient']) } key = RSA.construct((util.BytesToLong(pub.params['modulus']), util.BytesToLong(pub.params['publicExponent']), util.BytesToLong(params['privateExponent']), util.BytesToLong(params['primeQ']), util.BytesToLong(params['primeP']), util.BytesToLong(params['crtCoefficient']))) return RsaPrivateKey(params, pub, key, rsa['size']) def Encrypt(self, data): """@see: L{RsaPublicKey.Encrypt}""" return self.public_key.Encrypt(data) def Decrypt(self, input_bytes): """ Decrypts the given ciphertext. @param input_bytes: raw byte string formatted as Header|Ciphertext. @type input_bytes: string @return: plaintext message @rtype: string """ ciph_bytes = input_bytes[keyczar.HEADER_SIZE:] decrypted = self.key.decrypt(ciph_bytes) return self.__Decode(decrypted) def Sign(self, msg): """ Return raw byte string of signature on the SHA-1 hash of the message. @param msg: message to be signed @type msg: string @return: string representation of long int signature over message @rtype: string """ emsa_encoded = util.MakeEmsaMessage(msg, self.size) return util.BigIntToBytes(self.key.sign(emsa_encoded, None)[0]) def Verify(self, msg, sig): """@see: L{RsaPublicKey.Verify}""" return self.public_key.Verify(msg, sig) class DsaPublicKey(PublicKey): """Represents DSA public keys in an asymmetric DSA key pair.""" def __init__(self, params, key, size=keyinfo.DSA_PUB.default_size): PublicKey.__init__(self, keyinfo.DSA_PUB, params) self.key = key self.params = params self.size = size def __str__(self): return json.dumps({"p": util.Encode(self.params['p']), "q": util.Encode(self.params['q']), "g": util.Encode(self.params['g']), "y": util.Encode(self.params['y']), "size": self.size}) def _Hash(self): fullhash = util.PrefixHash(util.TrimBytes(self._params['p']), util.TrimBytes(self._params['q']), util.TrimBytes(self._params['g']), util.TrimBytes(self._params['y'])) return util.Encode(fullhash[:keyczar.KEY_HASH_SIZE]) @staticmethod def Read(key): """ Reads a DSA public key from a JSON string representation of it. @param key: a JSON representation of a DSA public key @type key: string @return: a DSA public key @rtype: L{DsaPublicKey} """ dsa = json.loads(key) params = {'y' : util.Decode(dsa['y']), 'p' : util.Decode(dsa['p']), 'g' : util.Decode(dsa['g']), 'q' : util.Decode(dsa['q'])} pubkey = DSA.construct((util.BytesToLong(params['y']), util.BytesToLong(params['g']), util.BytesToLong(params['p']), util.BytesToLong(params['q']))) return DsaPublicKey(params, pubkey, dsa['size']) def Verify(self, msg, sig): """ Return True if the signature corresponds to the message. @param msg: message that has been signed @type msg: string @param sig: raw byte string of the signature formatted as an ASN.1 sequence of r and s @type sig: string @return: True if signature is valid for message. False otherwise. @rtype: boolean """ try: (r, s) = util.ParseDsaSig(sig) return self.key.verify(util.Hash(msg), (r, s)) except errors.KeyczarError: # if signature is not in correct format return False class RsaPublicKey(PublicKey): """Represents RSA public keys in an asymmetric RSA key pair.""" def __init__(self, params, key, size=keyinfo.RSA_PUB.default_size): PublicKey.__init__(self, keyinfo.RSA_PUB, params) self.key = key self.params = params self.size = size def __Encode(self, msg, label=""): if len(label) >= 2**61: # the input limit for SHA-1 raise errors.KeyczarError("OAEP parameter string too long.") k = int(math.floor(math.log(self.key.n, 256)) + 1) # num bytes in n if len(msg) > k - 2 * util.HLEN - 2: raise errors.KeyczarError("Message too long to OAEP encode.") label_hash = util.Hash(label) pad_octets = (k - len(msg) - 2 * util.HLEN - 2) # Number of zeros to pad if pad_octets < 0: raise errors.KeyczarError("Message is too long: %d" % len(msg)) datablock = label_hash + ('\x00' * pad_octets) + '\x01' + msg seed = util.RandBytes(util.HLEN) # Steps 2e, f datablock_mask = util.MGF(seed, k - util.HLEN - 1) masked_datablock = util.Xor(datablock, datablock_mask) # Steps 2g, h seed_mask = util.MGF(masked_datablock, util.HLEN) masked_seed = util.Xor(seed, seed_mask) # Step 2i: Construct the encoded message return '\x00' + masked_seed + masked_datablock def __str__(self): return json.dumps({"modulus": util.Encode(self.params['modulus']), "publicExponent": util.Encode(self.params['publicExponent']), "size": self.size}) def _Hash(self): fullhash = util.PrefixHash(util.TrimBytes(self._params['modulus']), util.TrimBytes(self._params['publicExponent'])) return util.Encode(fullhash[:keyczar.KEY_HASH_SIZE]) @staticmethod def Read(key): """ Reads a RSA public key from a JSON string representation of it. @param key: a JSON representation of a RSA public key @type key: string @return: a RSA public key @rtype: L{RsaPublicKey} """ rsa = json.loads(key) params = {'modulus' : util.Decode(rsa['modulus']), 'publicExponent' : util.Decode(rsa['publicExponent'])} pubkey = RSA.construct((util.BytesToLong(params['modulus']), util.BytesToLong(params['publicExponent']))) return RsaPublicKey(params, pubkey, rsa['size']) def Encrypt(self, data): """ Return a raw byte string of the ciphertext in the form Header|Ciph. @param data: message to be encrypted @type data: string @return: ciphertext formatted as Header|Ciph @rtype: string """ data = self.__Encode(data) ciph_bytes = self.key.encrypt(data, None)[0] # PyCrypto returns 1-tuple return self.Header() + ciph_bytes def Verify(self, msg, sig): """ Return True if the signature corresponds to the message. @param msg: message that has been signed @type msg: string @param sig: string representation of long int signature @type sig: string @return: True if signature is valid for the message hash. False otherwise. @rtype: boolean """ try: return self.key.verify(util.MakeEmsaMessage(msg, self.size), (util.BytesToLong(sig),)) except ValueError: # if sig is not a long, it's invalid return False python-keyczar-0.6~b.061709.orig/src/keyczar/keyinfo.py0000644000000000000000000001006711446644413021400 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Defines several 'enums' encoding information about keys, such as type, status, purpose, and the cipher mode. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import errors class _NameId(object): def __init__(self, name, id): self.name = name self.id = id def __str__(self): return self.name class KeyType(_NameId): """ Encodes different key types and their properties: - AES - HMAC-SHA1 - DSA Private - DSA Public - RSA Private - RSA Public """ sizes = property(lambda self: self.__sizes, doc="""List of valid key sizes for this key type.""") # clients can't modify sizes def __init__(self, name, id, sizes, output_size): _NameId.__init__(self, name, id) self.__sizes = sizes self.output_size = output_size self.default_size = self.__sizes[0] def IsValidSize(self, size): return size in self.__sizes AES = KeyType("AES", 0, [128, 192, 256], 0) HMAC_SHA1 = KeyType("HMAC_SHA1", 1, [256], 20) DSA_PRIV = KeyType("DSA_PRIV", 2, [1024], 48) DSA_PUB = KeyType("DSA_PUB", 3, [1024], 48) RSA_PRIV = KeyType("RSA_PRIV", 4, [2048, 4096, 1024, 768, 512], 256) RSA_PUB = KeyType("RSA_PUB", 4, [2048, 4096, 1024, 768, 512], 256) types = {"AES": AES, "HMAC_SHA1": HMAC_SHA1, "DSA_PRIV": DSA_PRIV, "DSA_PUB": DSA_PUB, "RSA_PRIV": RSA_PRIV, "RSA_PUB": RSA_PUB} def GetType(name): try: return types[name] except KeyError: raise errors.KeyczarError("Invalid Key Type") class KeyStatus(_NameId): """ Encodes the different possible statuses of a key: - Primary: can be used to encrypt and sign new data - Active: can be used to decrypt or verify data signed previously - Inactive: can do the same functions as an active key, but about to be revoked """ PRIMARY = KeyStatus("PRIMARY", 0) ACTIVE = KeyStatus("ACTIVE", 1) INACTIVE = KeyStatus("INACTIVE", 2) statuses = {"PRIMARY": PRIMARY, "ACTIVE": ACTIVE, "INACTIVE": INACTIVE} def GetStatus(value): try: return statuses[value] except KeyError: raise errors.KeyczarError("Invalid Key Status") class KeyPurpose(_NameId): """ Encodes the different possible purposes for which a key can be used: - Decrypt and Encrypt - Encrypt (only) - Sign and Verify - Verify (only) """ DECRYPT_AND_ENCRYPT = KeyPurpose("DECRYPT_AND_ENCRYPT", 0) ENCRYPT = KeyPurpose("ENCRYPT", 1) SIGN_AND_VERIFY = KeyPurpose("SIGN_AND_VERIFY", 2) VERIFY = KeyPurpose("VERIFY", 3) purposes = {"DECRYPT_AND_ENCRYPT": DECRYPT_AND_ENCRYPT, "ENCRYPT": ENCRYPT, "SIGN_AND_VERIFY": SIGN_AND_VERIFY, "VERIFY": VERIFY} def GetPurpose(name): try: return purposes[name] except KeyError: raise errors.KeyczarError("Invalid Key Purpose") class CipherMode(_NameId): """ Encodes the different possible modes for a cipher: - Cipher Block Chaining (CBC) - Counter (CTR) - Electronic Code Book (ECB) - Cipher Block Chaining without IV (DET-CBC) """ def __init__(self, name, id, use_iv, OutputSizeFn): _NameId.__init__(self, name, id) self.use_iv = use_iv self.GetOutputSize = OutputSizeFn CBC = CipherMode("CBC", 0, True, lambda b, i: (i/b + 2) * b) CTR = CipherMode("CTR", 1, True, lambda b, i: i + b / 2) ECB = CipherMode("ECB", 2, False, lambda b, i: b) DET_CBC = CipherMode("DET_CBC", 3, False, lambda b, i: (i / b + 1) * b) modes = {"CBC": CBC, "CTR": CTR, "ECB": ECB, "DET_CBC": DET_CBC} def GetMode(name): try: return modes[name] except KeyError: raise errors.KeyczarError("Invalid Cipher Mode") python-keyczar-0.6~b.061709.orig/PKG-INFO0000644000000000000000000000040111216306477016207 0ustar rootrootMetadata-Version: 1.0 Name: python-keyczar Version: 0.6b Summary: Toolkit for safe and simple cryptography Home-page: http://www.keyczar.org/ Author: Arkajit Dey Author-email: arkajit.dey@gmail.com License: Apache 2.0 Description: UNKNOWN Platform: UNKNOWN python-keyczar-0.6~b.061709.orig/testdata/0000755000000000000000000000000011567545051016732 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/rsa-sign/0000755000000000000000000000000011567545051020455 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/rsa-sign/20000644000000000000000000000332511111062316020523 0ustar rootroot{"primeExponentP": "ALC7GVBqQFifGjASDBlLbTKJnilWVb09A4140Ce48zmzE7Gv_awlv0XYPTW6kvjvedO_5esBvzbYiDSpBCqUdr-CB43U7KVzuJUDyWYMNrN5O9UtotcHxTqb_0rKykY1obRgTFgkcBeO_yexp4XfdUjFPVmmyW8AVICqlFI8bMWF", "primeExponentQ": "AFkU3b_waD2w-B7Lrm_fYgCHe1tpqlIUxLEJq1_foiph72yNQdnXa2JX0B3m0n-45RmswHj3z3UR8UoU1VQklck0nwqdWoP5b7lIkQX4TMzf6VTVyNYZziriEDxKNKyjohzvqNybqTNTgYk0dxh3AZKJSgJ022WIK3wUz_mKeLZp", "crtCoefficient": "ABhDN0QhY3eqWI3TACq8mwG3xnqepuiWp9nXku65qnVVvd0oQeEowID_ucLiNKw2BxnUtyVN38hA7S8FSUOIiqdvrC1bCgRuAabGz447GAqiHWuUZjOF9sbF2fhn7fnvPkuiYGdllwILfK93TKOit4PK9SrgUTspAHLjiRx0wB4b", "privateExponent": "ADLuC4m7dEabMXeZS-KQcWXbWrSZIBls6Y9Bd-2eiW2HYJn_leDwvUG3r7MZJJ9d0pUuz6fVUvOv3XCIgeELtFf2jbLSMnvr9p9JLUfNYjlq6jIo7wlLPBAppJMSyWlN_Y2ZG-G9pcUfCyH6ISVM3gfVNFtlZSPvemjgokFuTsdsCOECYp50hOzsMkvXimhF81vx_LhV0OP9crQBosPI0KODyZkdJCc0KBAYvh3VHjUdgm5l4Ru6xiI0_ug1ufVwGta1a4fQpJEcK_NgYy8gzpJXl2En4acggKhQZwieG9VL8dMCKzQDT_6bjATz_EKm6PkeI13ELh4W8Qm1vtaNc5E", "publicKey": {"publicExponent": "AAEAAQ", "modulus": "ALbaQMoMXpvjDgkSBy2yIuy9uptjGwvvUyql-v6apZmiPDYxTsvINskQ4IpZBcHSiE1vDm0RHuVPJBqsa7qEhXNnm2F3s65pqri5vv85VPFKWf7A73RZfoTcwNECcnCUMWp7YPKyxnR4KfmfY15Mu1GVMYOoKL7LqoNBFrhmUwxcBGJWF9nvX1RD6jHXKw-I0E8xDR_n9NYI0HaMPyI67jLuYNj5V1Ql1FIPnivMszO0AczY7vQ39eyz2fTbULrHtyoQAw8EgVA34pem7sjL0I-bcexCtAiZtY6PCRCBx6PKMBE0izrFjohLcFhLwA9eb2wBLd1G3qAd6YdGIZhaUPc", "size": 2048}, "primeQ": "AMbqD9jEtQ8Hx1Z4qGgXLs2dip9z70ksG1WESUfqYu28gUlTY4x1NChKRAyNBqI61JpL5yOSc4-ZV2pPBOAlNXLS-kEJe3eeEC1tqN5lTsXUDws1jVpVeyXN9grNVO2HYH3BojhQ2q1WBuoN_kN-gkFNguKGsFD5ZbjLKSM1CK19", "primeP": "AOtUKHbGl2pyrFOo44DrDTDAVCcDQFFSYhGab7-iRCbFveJpwCDOnYlNfBqhOYOTXlvdY3RaOUfEUz-jwM_ZZGAf_msGg7s4IhVD2Tpwuj-PZcg6dpgfMEqSqskDAw2d3EmesmiXwXrR5iHQH2nnkfDN7Aq3KnvHzVK_qhlITdKD", "size": 2048}python-keyczar-0.6~b.061709.orig/testdata/rsa-sign/1.out0000644000000000000000000000053411111062316021327 0ustar rootrootACkPBxcWuH-_s9acnvgTJOo8NMQnJOnMv9Fqi0-UPBEoHbEnGM8lAvoa7rgtyGPwiN7Q6lG6vwyRcwqJ4VRaoCNJShSqKeT9oAUtNNVR7PF9zxMlt4f25FS9DN4V6ENpEiKJFOTqWt9vZWD2W3s6j0O3pke7M50LHOaieJDs2NTuLQdgUqtLa1RluCCrEc9tbL1_78Qm4ypa-YnGZdvJk2aweUJvHwCLZP3toe-CqvA-prKLGMzHuuu4HU5IVpf99aR4yeM8e2mnaqAKblIfMt8Hfxzc3K3HcZNqofH5QaJYyS9Hmy-FfQceaZVaW2VX-lpsozG2J6VsbEGARlUrKWcOpwsgpython-keyczar-0.6~b.061709.orig/testdata/rsa-sign/2.out0000644000000000000000000000053411111062316021330 0ustar rootrootAK4ATWSGRVydF_F3aKtKwTuQ6jsu-tYY9vGaIoE_fAs61lcQcl2nXNscoRR6UIWppa0n6p2i1KjuYYd4qWg9zTPeecxzEIcdXgc36rT44HBYzXKFGlT0ZnNzEaprzqE2tHfS43UGWWOoS92aPzxaPgtY3C3cp6Yu0NidAZo-sSkIKI-gLXPaIOJ4xws3Rh4fF-Xz38d4UzcsrEHTg-0Yf1cJ8HLXUjkBLnbDzZq_CzJln-x9y4lEYDWifPC04PW3S60Go9Kbxv3uisA-9VOkVUPNF7CsBR12K7N3rwQzItMmc4w_Ir0j48-GmLRlOSI7g8wOA_6tHA9j108jfNhEo-ocQBcspython-keyczar-0.6~b.061709.orig/testdata/rsa-sign/10000644000000000000000000000332511111062316020522 0ustar rootroot{"primeExponentP": "AB9rI3dh7ey3KzLS1HnLCh8AOG27LMS3i2nMnJLCTfEeiLaYKUha2JtuRsa_f4PEDzO0zNm9DxDwOhucsjLANyEDsB_zPPIkxpG0bk9ACZUPgu1cg79vZxUt4YaTLXiqivZ10f8GzJxW6sokfvinKw54oqmQ9i8xsxjGba-4GAVh", "primeExponentQ": "AEBGdX2bQ_bngfqlG0eNPlXRUNvCGpDtxWqcCLU8jNxnqZmfXHdSOhE2I1-4mr9jruPtEFPdlNcGsrkLBHHlcCgsNLGWalkE42At7bR_Ou6_0EzQpHn9XzM2Gkr04ytP8cL5CvPTsIdHYIJATxIqINz97Ep25TpYYHbOGwwI2rF5", "crtCoefficient": "AAXDJ8OIyuKmlDhaY3NpRas57z2CwbTOfrv__d6rB1aCy7wOu2t-Wayw9t8GhYS4iKVlJtmd8PwQvGZeBBGaUspG_VeoUhZWVEow1cG25hEODpAVyzR39QvnzZTIzd8HCVZ44H-i08wCuAtgE55EBLv0lEWrPJEs3kBI5cotUitL", "privateExponent": "ACVcJquIXWLV93X6AwRtdq2PCsL0Dq9h5NM-_1VZfH3LWjpdAJTLnhb2vH9O0afQ_QB3zH-Qj-NpBeZzcr5c1QcDGItef0P6W_lj1_AaQZr_QUU7Lu-Gaip-Yvyfdy7X3tt_tuPMbHCJZEi3E8X9eo5osoNYSWH3vDu53lm3Nuz1fXKMpYfg85xqvwV1JnGJdhi7MxfkOYQEf3VCY-StItAXDwrCNYuKCcgewoxazF6PR5-T5GEL81FH_TKlyodp_V8ihZEoz31hYHZfEPc8Bxvh0xqC-9K3lUeldTSZIOIT-yiEsFM8FuBSNYPE0ZF6kkrygBVN_re3iVEM0yiE9Gk", "publicKey": {"publicExponent": "AAEAAQ", "modulus": "AIBrk-9WZuTlQd9Pvj2Al5rj_thf1l5ffvReqx5vypq7LFvwJFSzUQ2uCLppcSvxIkIt4Td3yepeKwNf9zdXL-D1VT25hDxjygUZjlpQGhC2_MHWwR4DnwPmuSwneQ_3KTZp_5BU3LMkLvgfiIN-khWwJfjk97t7vw9BJidxXBXDUDvjP_lT364dPgaiYucdY31aBq9tIy1B59Bz_ukz6X3DryFwdiKAAdMIKoq4sNBTaJWisGpJeWfFjUfqwzXIqd6v3X3ODC6mNq5J66dONx9Q-R1YqkSUo124Mtyy_6JV0mFM3YzFPoHbaTJai7ng-8WfI2aJ1Nl1ntHvPeueY6E", "size": 2048}, "primeQ": "AKbQkqysw6QlZa8M6jCqswYzZ9JzT40-T3v619Ob8Nfw0EjCOJifIxyXOLWg-RDQF29Fq2tmJ943VGJvfY5QOy47apY7uzgn3an2pto3OZpTSFmL9JdbIXXvrFAe9k9uT23M9yssXd2ckPJXr2jBio3_hsF2NClWhjdg5UxlxU4v", "primeP": "AMUUEIb-K3udyu2Gpb-xsEVAed-Mmz5whIqV6gfQME3t0LBwHpdtZt4PvEz-MXoC0SVXcBYyZX0K2wvthUdo6nfWFHmdIXR6IwzQkFwWkACdZwdvXZj4tgRvHFX4poOHV3LizfAkWj7P9EPOCug8duzhcuuz8FKFWT--S9BQKkcv", "size": 2048}python-keyczar-0.6~b.061709.orig/testdata/rsa-sign/meta0000644000000000000000000000034311046126532021315 0ustar rootroot{"encrypted": false, "versions": [{"status": "ACTIVE", "versionNumber": 1, "exportable": false}, {"status": "PRIMARY", "versionNumber": 2, "exportable": false}], "type": "RSA_PRIV", "name": "Test", "purpose": "SIGN_AND_VERIFY"}python-keyczar-0.6~b.061709.orig/testdata/aes-crypted/0000755000000000000000000000000011567545051021152 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/aes-crypted/20000644000000000000000000000044211111062316021215 0ustar rootrootAE8Km-xZp9LRE3j3Yqe042lqHko-I2jvmiUDqjDZ98Ehh0aICRiEBhgK8o4VD6mepDRkW59ERGADzlmx-d6jrb7cGVLUiMMyT5gIsWcg9kEufPRhA0kmqj-PnuLvDMqkMmefhsFvf-041owf_p2NCSBd4iUur9JhasVXrxS-5NU6Gkb0nomNPyVH6C5rCQLHGse_f4OBaXo1lSNRFEvHu08U7fl1WTXi11fzHPUB9NTVnqJaaX5gb98THe0Y7i3tm9ikpt1WDyrvv4V3xsS_zDCifbulFlhbOQpython-keyczar-0.6~b.061709.orig/testdata/aes-crypted/1.out0000644000000000000000000000014211111062316022017 0ustar rootrootAIvc6OWYQDk_HOO3wRbcLd0zgQb3a1UF1CVY_gptd3JHyxzwGuHc_q-AaUAVg5OVok0X2ok335qg_dOjlJCvfdOtdtAcjInH5Qpython-keyczar-0.6~b.061709.orig/testdata/aes-crypted/2.out0000644000000000000000000000014211111062316022020 0ustar rootrootAFMwbLrAFc5rXErmn1_mZJ0R4JVLv2eQ2v269cJxVIJSddfLc6qkQGjlGukm4oBSWBCJOEXX16fSw66zKzqtQeMBH5gy2FjbEgpython-keyczar-0.6~b.061709.orig/testdata/aes-crypted/10000644000000000000000000000044211111062316021214 0ustar rootrootAE8Km-wYg6FF4EZCsTywr-No39uNyKGPy1ikAce2T9QKywZkWO4H3ouNRZYBVIkqrKjxEfnQAfU_tk-oioIszYqYHMqfU5IARjnzqAaVVI7sI2L-CzcDctlMQ99o0pCacOrHrhKKw536jHpQy6PuX5dRyGT_dNe1KaXzWd9muZRidKPmKWVPnTXzADnS-R1IDDZGgIfgugYZIcbW8_7kf3xhsb7KTspuPOksgABz9D6AI_M6-jOupArLgOnfg6viDa_HKiNrtf5nUZJVi2geU0_PVohF_ioFGwpython-keyczar-0.6~b.061709.orig/testdata/aes-crypted/meta0000644000000000000000000000034111046126532022010 0ustar rootroot{"encrypted": true, "versions": [{"status": "ACTIVE", "versionNumber": 1, "exportable": false}, {"status": "PRIMARY", "versionNumber": 2, "exportable": false}], "type": "AES", "name": "Test", "purpose": "DECRYPT_AND_ENCRYPT"}python-keyczar-0.6~b.061709.orig/testdata/rsa-sign.public/0000755000000000000000000000000011567545051021732 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/rsa-sign.public/20000644000000000000000000000062011111062316021773 0ustar rootroot{"publicExponent": "AAEAAQ", "modulus": "ALbaQMoMXpvjDgkSBy2yIuy9uptjGwvvUyql-v6apZmiPDYxTsvINskQ4IpZBcHSiE1vDm0RHuVPJBqsa7qEhXNnm2F3s65pqri5vv85VPFKWf7A73RZfoTcwNECcnCUMWp7YPKyxnR4KfmfY15Mu1GVMYOoKL7LqoNBFrhmUwxcBGJWF9nvX1RD6jHXKw-I0E8xDR_n9NYI0HaMPyI67jLuYNj5V1Ql1FIPnivMszO0AczY7vQ39eyz2fTbULrHtyoQAw8EgVA34pem7sjL0I-bcexCtAiZtY6PCRCBx6PKMBE0izrFjohLcFhLwA9eb2wBLd1G3qAd6YdGIZhaUPc", "size": 2048}python-keyczar-0.6~b.061709.orig/testdata/rsa-sign.public/10000644000000000000000000000062011111062316021772 0ustar rootroot{"publicExponent": "AAEAAQ", "modulus": "AIBrk-9WZuTlQd9Pvj2Al5rj_thf1l5ffvReqx5vypq7LFvwJFSzUQ2uCLppcSvxIkIt4Td3yepeKwNf9zdXL-D1VT25hDxjygUZjlpQGhC2_MHWwR4DnwPmuSwneQ_3KTZp_5BU3LMkLvgfiIN-khWwJfjk97t7vw9BJidxXBXDUDvjP_lT364dPgaiYucdY31aBq9tIy1B59Bz_ukz6X3DryFwdiKAAdMIKoq4sNBTaJWisGpJeWfFjUfqwzXIqd6v3X3ODC6mNq5J66dONx9Q-R1YqkSUo124Mtyy_6JV0mFM3YzFPoHbaTJai7ng-8WfI2aJ1Nl1ntHvPeueY6E", "size": 2048}python-keyczar-0.6~b.061709.orig/testdata/rsa-sign.public/meta0000644000000000000000000000033111046126532022567 0ustar rootroot{"encrypted": false, "versions": [{"status": "ACTIVE", "versionNumber": 1, "exportable": false}, {"status": "PRIMARY", "versionNumber": 2, "exportable": false}], "type": "RSA_PUB", "name": "Test", "purpose": "VERIFY"}python-keyczar-0.6~b.061709.orig/testdata/rsa/0000755000000000000000000000000011567545051017517 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/rsa/20000644000000000000000000000332511111062316017565 0ustar rootroot{"primeExponentP": "AB8nBZvBCLN8zvepq-esxJJq5vAGWG_DH8bTSGq2zdISX_3zp67F31gv6_nrKax1DN52csWoQby69ptI2LB35rA2R9cOG0CmZJHniYc_mAfREPP7r0et9vsP9NUoXUdKqRjO4fKarzpE62Gah1-aLCG27ufKDRZZPaeTItuqE8JV", "primeExponentQ": "ANCU0vd2adr1X2k97bJBclgMT0CVIAwVHVgeiQT6Ef1RAkIrmL-6bF_l8y-1qbvAzyKDO_askEz4joBtZtW_V7SjWtOq8AIzQSY1I0UIXgh5rDkM4NfQAECivWgTHZVRwSJ82lC1S4fopFt208EUuc9EJzGXLqc23Q4zp1EhYuCp", "crtCoefficient": "AINeV637sAibBcjXWMJFOoD5PDGYM_jZ9tDG2GnZtk0K9pR8uBNSqcxtOCH3_tGRlwcklpYN30QrXMl-UmPlfISLgs6ZctoiXyk0FNNcAemrGNKUDHfoGJ8ULW-wrXZZpAN1MkYdJuyZEhsNlcygiEXj5lwxXfzr0fv8oBKPm4Nn", "privateExponent": "ACXZv5vwwbMHjQosGtrdamBr4MXtZ4Uy9Ga7Dg6rQmCzFDN8pZZsPfqOLeln3bfygCfD1CSNSHZn_5omfDNBaMv4t6aCX0wYOZnN1dv4rwenMmpNGYVFwlF7RbK6OUd624B_ltR7eZ_Uov5hqjdvLZXc4iqXb_OnNb3QDb9qETissjEZZLGoWq9U2XmzK6OQfGFOzkCE-57yEs0CUD5YGpUYmqxVY-QTJ0ILrpIA0q-DvoZnOGkb4riST2Yp9new4kADSVscu7ALR7rizg24kz5HFpow8R6KONHDgasowkehOFeTJ5DJ3fIS5Im6-Af7-Z6EHmNOO6YXigrk9ptlFsk", "publicKey": {"publicExponent": "AAEAAQ", "modulus": "ALOp2NXASQyAYaIqQZSAoCgqS94SmvFEuaq8p2xJhGcd4wMJt49zdtiaRb6oAVTeIH1DzcwS21aKd3unV4dc6Vl9bM3-lld4FiONQpQLQS3R3ta8j9m3pOk0gylKQhNlkarN6E42g3Hw9bD9Nhr8JM4mrX_7vt2zmTnTmpsv-moPtZr4_I6Avc9HLr0GM3Z7aJsImSERL4U-Unv5r0r0yNAgycvD_-eIZvaQXJ-9NfdU3oZYxbgRkEvLunw5YA-DwphZ5aP1PD8Jayv7o0KWU-NPp9iMCOCocSlD8hxslwYgay8F0pLaQFcIMQ-epEHVAAuOsEgUVj1VEdrIsdf3o_8", "size": 2048}, "primeQ": "ANC-aLy-PnmS-RNDGgtFWCS10tARA_P60GnwkiANWZLhr6d8kT-xnMrx9lfF_h0MN0YeEFkZ7goG0M3EF4_AQQCtMUqmWCpbiTpDqrGCToQthZbQjqCMM3KvZExncdyscCIkp_ZduoujcjBoo6ffRH9e1vu7it-FLEe2tzSQ-FKN", "primeP": "ANxWHAk-1qC5uity3WROzTKLZHsI6K9eo_FGprTiyNLchw3cBLVkdU9FklAY2pTS5IZArvFUlHG8WT6zP78JGAoVVIXiHXjjzEnvaFg4HrS3eG5rLQQRbH7WgADOgLyH8J_Mk-fQwG1My74Tzv3jQng18l8tR1ijqu27cIXa9nO7", "size": 2048}python-keyczar-0.6~b.061709.orig/testdata/rsa/1.out0000644000000000000000000000053411111062316020371 0ustar rootrootABkOnR43Y8tppeYDTmZ48VbjmKx1lFhiib_IFVtMrRQBs209Iy6E3I5tnbTZ2cbrVsZX4zIbUY1lV647XjWzWf9LAvzqtrUCWxpzryWb71MUvOuC41lN3uvQklIeAGDDsU13Ri7Gy0ThMHP1-aZIidJbFnNnqGkietKt-9wmDbHTEIVTTtGEWuggZa--zQ36IRHgwRt3o46vEUm8j0t30qKijGu0M_QueTTTZjqndupKjy7q8jmVYO9Cg9nCfPbKbrmxa6X90nggZ8DKfqA5TPpidTFj-2JVsuYbxTiOxG6fCvxSeamkvkwWSBu3ulcgvJtZ_lRn9x0lEys0yDLhjlMhlH0Tpython-keyczar-0.6~b.061709.orig/testdata/rsa/2.out0000644000000000000000000000053411111062316020372 0ustar rootrootALbf-tUUMj6QojB9Bq8cKhwWHQ1TNyxbw6D0n1w9XzSUPTHQrvia354WuuLQ0RdpI_PVFliKJxFYLtryim9qCPSxjT_qRspzWf7zVU5IS7RZyIN9wNcEztqwgjxaUW-WVzs-XgvoDa4LCbwK3JSPlPlkCBUXXEMJEhmV3z86OZGbzXaauMRkSAzX5xaYiZ59Nka6YRqlvxpGI6CuHGAC2prRBhOQluzOIG4U0pJVj1rxCY8VY-EUA2Xhgncwj-eTDwh-jtDVXkZ_wMLNORlr3BmhEo0eFOiQ5dbDdVQwCJb6FwvVL5QlTgaWJAdOy3sqMUBO4_TOPqcdn-WShB3bbe-bciLRpython-keyczar-0.6~b.061709.orig/testdata/rsa/10000644000000000000000000000332511111062316017564 0ustar rootroot{"primeExponentP": "AEibhNDZZ4GUmxvaYJtsMXISIE1S7CWQDe64AszneRUZrMDVf9pNj6WdKKWt9qAVN-qHWrJV1FNi-HJzRotGI8Ds3qU8vV50TAYELCTxir4gmJM7q73xpemOi2Ti0fIjIWsQUcF05_341zTFBOJ9W7Ih52a6-R6YMeAqARmTqww9", "primeExponentQ": "ADspWorDXoOlBrURQSrEVq2Wzn7GTz_U-uWKr5hnByb7EBxOxv4qoh8FNsGm8NmrWntr_UslSoW4vAZGwvZATLUt6Vu67g_fM23BVPq9Be6qixQHqt3OkTs0ovtsM_ys6GFagR39wf5ilab-01P_Iud0a1PLhFtvfKpAFrNSDnhp", "crtCoefficient": "AIw42hdxUFVrFjn4rn-GoA2VDfIik0zwdiIK3DIKTLac0qEDrj5Nqr9HcT1SKUBieXVJoL--mYALYVWVPJfgOUPS2luUnzo7mYQMn7aq-vl_8lUIMFlZzVmlZe9R36mke0A6sMIGGRxgas3Bkpud_nvuIsqfIQ57XAihALjleUU2", "privateExponent": "AFAsDV9fIo175PhZenzaLCArSK8eqZjN_aRd_q2VJT3bIeJh09G7PSBdhXGAb65yV77lNkk7jDed6ceGP7Jf6-8qZgz3E2vt55VtiFojvUFJ_qOUIvxTacCm_hTf1PJY3MPq6HxT3a4tKVnf2KA4j4fZfqkil7m-keSMUK1mu4dI9DtnF6wPGHRb7k_EU5hkT8hHUVPa0O5Iop7QlZQR96f3WvIaWT9EXo_074TR3hSk48eEeaCnT1yoC7gAGLM0evnMS17g-VB2f7wgIYtXbvRv2AQe8rAZpS8HvTxhom74S3WSSdXySMciUC5Yxsa2IPXV4Lmo_zH-PVomKwc7_OE", "publicKey": {"publicExponent": "AAEAAQ", "modulus": "AKe_xYISa_TOcQ2i8nfKlpGkG5y9XKFeIDi4BO7iSgIQDMuTLx91gSYwuhQnb-GtgGkdYk99qojWFUMRurq0asROTxQQ8B6cdpIlOAQnGHI42hsPPUlEfeZoYJsTtlQZsG6x2fjgOQhgTwsCyHB49fupBnpxvq7LNvcst524kvhYB74rVrNFXqCEqJ1HYsTNn5RJWwQ4CT0oKiaP1mk58He0HEceWoCvpjjpsHyEnRVMbpXE_PxEynK0Yt-t3O8xtztG2hJfCfFjxeggRc-jNvDynBqXnOvbpn1njAYWlYdyAv1pPLlmeN90K02RHTppWJgorJWOemqapGLwqdFIiu8", "size": 2048}, "primeQ": "ALsU7vFpMe2KQ0vOH-TLVeisMO8y1GklIKDxxZyyHRoaWTM2AfabkUuGkyaF2uBxS-n-gHoruQldvOpIOfgcMxtq0P7OLk5ae9rz5DupS62kJUk-3x_MzOu0IomeVgHQgaCm1cYagfjRceUNpzjpl4HmanRFBrG_JusrzOdkL7XJ", "primeP": "AOWLo2KZYdF4Kq9HaLgczyZNVetXrFPURwSLODNNWwVkxKGOWJD_aBgQ-JnOHN-FAF4K-zRkW7IkQV6qezpFr-p4eVhWxfknhgSYqdc4CXrqkgP0ba5pzn6Pjzg3aLVy0V8iqYDJQuT3JdVS4kgZEj7zmHjBb9RZahWiaITWifb3", "size": 2048}python-keyczar-0.6~b.061709.orig/testdata/rsa/meta0000644000000000000000000000034711046126532020363 0ustar rootroot{"encrypted": false, "versions": [{"status": "ACTIVE", "versionNumber": 1, "exportable": false}, {"status": "PRIMARY", "versionNumber": 2, "exportable": false}], "type": "RSA_PRIV", "name": "Test", "purpose": "DECRYPT_AND_ENCRYPT"}python-keyczar-0.6~b.061709.orig/testdata/aes/0000755000000000000000000000000011567545051017502 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/aes/20000644000000000000000000000024011111062316017541 0ustar rootroot{"hmacKey": {"hmacKeyString": "fLiLNf4O9ZHUpC5eBlqNFnpybmSXx8egUFM8_WC8io8", "size": 256}, "aesKeyString": "1WnnXOmPTDzQ8NSvdsTqew", "mode": "CBC", "size": 128}python-keyczar-0.6~b.061709.orig/testdata/aes/1.out0000644000000000000000000000014211111062316020347 0ustar rootrootAJehaFGwoOrkzpDCnF1zqIi721eCOMYWRmLyRyn3hxyhh_mYwpnDN6jKN057gr5lzAPFYhq9zoDwFMaGMEipEl__ECOZGeaxWwpython-keyczar-0.6~b.061709.orig/testdata/aes/2.out0000644000000000000000000000014211111062316020350 0ustar rootrootAE8Km-wLslVldQgA2AwYlXb6ZG0Qu3RLWCf1aJs-0_xjGMQaEI5froBXUGzoUF6i4qV9IMI1Id6h9loSqTDkGf3v5sz5b-9Ksgpython-keyczar-0.6~b.061709.orig/testdata/aes/10000644000000000000000000000024011111062316017540 0ustar rootroot{"hmacKey": {"hmacKeyString": "6flZ-mHQWqQJxvLf01sFfC92UGxLDIlUh3SakvfA4d0", "size": 256}, "aesKeyString": "oI8Do9zS2ob61QH_lOivxQ", "mode": "CBC", "size": 128}python-keyczar-0.6~b.061709.orig/testdata/aes/meta0000644000000000000000000000034211046126532020341 0ustar rootroot{"encrypted": false, "versions": [{"status": "ACTIVE", "versionNumber": 1, "exportable": false}, {"status": "PRIMARY", "versionNumber": 2, "exportable": false}], "type": "AES", "name": "Test", "purpose": "DECRYPT_AND_ENCRYPT"}python-keyczar-0.6~b.061709.orig/testdata/dsa/0000755000000000000000000000000011567545051017501 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/dsa/20000644000000000000000000000122411111062316017543 0ustar rootroot{"publicKey": {"q": "AIngy8EZrGFmGJDVKXuy6skntBgh", "p": "AIAAAAAAAAAAwC7ieoABy8YlO4DoAJOVQIG_t8LFAopp5TfjQMerqDL1EG_P_Cn12cwttSRJj1-dc2ZISIM5Cw3yHZWPue8GlEWLa7H88agBwXdV2xDx0E3YqFRw1-Ips8xa_Sn2ikJdIYJt3jbFl3DhxlpvtWvTj0XU8saR_X_9", "y": "AGmLToqwl0_Z4cE4g0p_nZ9G6jmc0hYE2gFJc3yR1qKIfNejQEvTXnRsQMs1SOGeBAoeI-DDp2OGnUQCw2cBAUO8mu0PjYwJ9z3ujlPlTrftn7tiRtE5wlU9Ux1dTxVHOgR1GYicW88X24OMyzOQ0YLweIRY43GxHpIkQ8Njdzsx", "g": "AFDc2__twgvOawCUltfsTB8HPek938DUQVFRqtDUmnuBCwu-t7okzq4SSwJWWMtL2yeqPhKLY06S16NodZwFbDTLCtpSlIKfBxJVHWIP5qdlfyjVtRNtZyq8w1JeIM8unZfTbe7T6VSdpuH2DYt3Sg5W8xMQTLfjH0Ik-GpvbJm-", "size": 1024}, "size": 1024, "x": "AHDVbYVova9s4P9A8l2Ix6-6UQX3"}python-keyczar-0.6~b.061709.orig/testdata/dsa/1.out0000644000000000000000000000010411111062316020344 0ustar rootrootAEhXHGowLAIUG_xNVT171cvqZLk03GuXhaOoM8ICFHjPAT3ODPy5qnhDhB3Luyx6UGOtpython-keyczar-0.6~b.061709.orig/testdata/dsa/2.out0000644000000000000000000000010611111062316020347 0ustar rootrootAHT-RG0wLQIVAIPP5o6MwtwbzFVWYue8t7tlebOCAhRLcsNCqt5eCk27NqGchPP_0APrfApython-keyczar-0.6~b.061709.orig/testdata/dsa/10000644000000000000000000000122411111062316017542 0ustar rootroot{"publicKey": {"q": "AJNngGu_rd8gPsxNvKYlkk2xK-5L", "p": "AIAAAAAAAAAC36I466c_f1bADUCurTdflKhADFpWOtmRoBhuxNeAouxlL2Udz2fEsTKNv6NG712-bn2JnezPJ00TjjczyCkpZCi8B3a15gtjl2qRWel0rnLnIWrwefPSotBmK9lR13-BEZKfwtPuxkuDwpbIc33EBZb6BMphoBZL", "y": "AGDL8GKDAkDvz0_yTEzn2CaFmg8-lWsgLL9ktpMMnXHM7Yw1xTQfcHeBplEC9zIdmqRvtF69JY_pMLo8iwDjJ_yPFoP7AwfKLysgl8I22OJ3ty03MzfUrlM_-OvOlwAakNKotcj4zJbhkOFqmbS5MnQZh5iIMAWUa2woqUE3QXHO", "g": "AA-eUiV59qa6IhTKAMfaq9r0xgC9sHoCUCWZBRe4nvn7f5qEjwJOJmJqKQMIgCYez59hAI7hihgUBqBDj0v-yjcYK-ehsvs8SfUyZRYfN9MpeWZN-Jw72HGmWUL4nwWWqjuRc9DsRoxSLHuuhi6kKSTeCcgRr2DJwpB4RegJ3SI0", "size": 1024}, "size": 1024, "x": "AAaRx8WEKkkvPorY0Ys2KpZVO-F5"}python-keyczar-0.6~b.061709.orig/testdata/dsa/meta0000644000000000000000000000034311046126532020341 0ustar rootroot{"encrypted": false, "versions": [{"status": "ACTIVE", "versionNumber": 1, "exportable": false}, {"status": "PRIMARY", "versionNumber": 2, "exportable": false}], "type": "DSA_PRIV", "name": "Test", "purpose": "SIGN_AND_VERIFY"}python-keyczar-0.6~b.061709.orig/testdata/dsa.public/0000755000000000000000000000000011567545051020756 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/dsa.public/20000644000000000000000000000112211111062316021015 0ustar rootroot{"q": "AIngy8EZrGFmGJDVKXuy6skntBgh", "p": "AIAAAAAAAAAAwC7ieoABy8YlO4DoAJOVQIG_t8LFAopp5TfjQMerqDL1EG_P_Cn12cwttSRJj1-dc2ZISIM5Cw3yHZWPue8GlEWLa7H88agBwXdV2xDx0E3YqFRw1-Ips8xa_Sn2ikJdIYJt3jbFl3DhxlpvtWvTj0XU8saR_X_9", "y": "AGmLToqwl0_Z4cE4g0p_nZ9G6jmc0hYE2gFJc3yR1qKIfNejQEvTXnRsQMs1SOGeBAoeI-DDp2OGnUQCw2cBAUO8mu0PjYwJ9z3ujlPlTrftn7tiRtE5wlU9Ux1dTxVHOgR1GYicW88X24OMyzOQ0YLweIRY43GxHpIkQ8Njdzsx", "g": "AFDc2__twgvOawCUltfsTB8HPek938DUQVFRqtDUmnuBCwu-t7okzq4SSwJWWMtL2yeqPhKLY06S16NodZwFbDTLCtpSlIKfBxJVHWIP5qdlfyjVtRNtZyq8w1JeIM8unZfTbe7T6VSdpuH2DYt3Sg5W8xMQTLfjH0Ik-GpvbJm-", "size": 1024}python-keyczar-0.6~b.061709.orig/testdata/dsa.public/10000644000000000000000000000112211111062316021014 0ustar rootroot{"q": "AJNngGu_rd8gPsxNvKYlkk2xK-5L", "p": "AIAAAAAAAAAC36I466c_f1bADUCurTdflKhADFpWOtmRoBhuxNeAouxlL2Udz2fEsTKNv6NG712-bn2JnezPJ00TjjczyCkpZCi8B3a15gtjl2qRWel0rnLnIWrwefPSotBmK9lR13-BEZKfwtPuxkuDwpbIc33EBZb6BMphoBZL", "y": "AGDL8GKDAkDvz0_yTEzn2CaFmg8-lWsgLL9ktpMMnXHM7Yw1xTQfcHeBplEC9zIdmqRvtF69JY_pMLo8iwDjJ_yPFoP7AwfKLysgl8I22OJ3ty03MzfUrlM_-OvOlwAakNKotcj4zJbhkOFqmbS5MnQZh5iIMAWUa2woqUE3QXHO", "g": "AA-eUiV59qa6IhTKAMfaq9r0xgC9sHoCUCWZBRe4nvn7f5qEjwJOJmJqKQMIgCYez59hAI7hihgUBqBDj0v-yjcYK-ehsvs8SfUyZRYfN9MpeWZN-Jw72HGmWUL4nwWWqjuRc9DsRoxSLHuuhi6kKSTeCcgRr2DJwpB4RegJ3SI0", "size": 1024}python-keyczar-0.6~b.061709.orig/testdata/dsa.public/meta0000644000000000000000000000033111046126532021613 0ustar rootroot{"encrypted": false, "versions": [{"status": "ACTIVE", "versionNumber": 1, "exportable": false}, {"status": "PRIMARY", "versionNumber": 2, "exportable": false}], "type": "DSA_PUB", "name": "Test", "purpose": "VERIFY"}python-keyczar-0.6~b.061709.orig/testdata/hmac/0000755000000000000000000000000011567545051017642 5ustar rootrootpython-keyczar-0.6~b.061709.orig/testdata/hmac/20000644000000000000000000000011511111062316017702 0ustar rootroot{"hmacKeyString": "EuyKHHbO1W1QoUV4BvHf0SADM9ZMhz08M7IHMLysbI0", "size": 256}python-keyczar-0.6~b.061709.orig/testdata/hmac/1.out0000644000000000000000000000004211111062316020506 0ustar rootrootAD5TTkeqKzOUoxIK3NujBNCylibCHJRZrgpython-keyczar-0.6~b.061709.orig/testdata/hmac/2.out0000644000000000000000000000004211111062316020507 0ustar rootrootAEcYuxsWbrgABHY2L_vEk5OzHGrD8eZb7gpython-keyczar-0.6~b.061709.orig/testdata/hmac/10000644000000000000000000000011511111062316017701 0ustar rootroot{"hmacKeyString": "tE41W2GFgxk33RnZHdaE7z-PvALxxVVKdtStfqYMICE", "size": 256}python-keyczar-0.6~b.061709.orig/testdata/hmac/meta0000644000000000000000000000034411046126532020503 0ustar rootroot{"encrypted": false, "versions": [{"status": "ACTIVE", "versionNumber": 1, "exportable": false}, {"status": "PRIMARY", "versionNumber": 2, "exportable": false}], "type": "HMAC_SHA1", "name": "Test", "purpose": "SIGN_AND_VERIFY"}python-keyczar-0.6~b.061709.orig/README0000644000000000000000000000120611207625732015774 0ustar rootrootKeyczar is an open source cryptographic toolkit designed to make it easier and safer for developers to use cryptography in their applications. Keyczar supports authentication and encryption with both symmetric and asymmetric keys. Some features of Keyczar include: A simple API Key rotation and versioning Safe default algorithms, modes, and key lengths Automated generation of initialization vectors and ciphertext signatures Java and Python implementations (C++ coming soon) International support in Java (Python coming soon) Keyczar was originally developed by members of the Google Security Team and is released under an Apache 2.0 license. python-keyczar-0.6~b.061709.orig/doc/0000755000000000000000000000000011567545051015666 5ustar rootrootpython-keyczar-0.6~b.061709.orig/doc/pycrypt.pdf0000644000000000000000000050272611032213447020073 0ustar rootroot%PDF-1.4 3 0 obj << /Length 2239 /Filter /FlateDecode >> stream xÚ¥Xݓ㶠ß¿Âo•g"†¤¾§O›Í^²×dæÚÛ™>äò@Ë´­®$úHé÷¯/@P²ìuÛétîC  üZ¬8ü«BÂ_¾ª»8o"P|W¬ÊeÓ_~û¯¶ öñ³ªÊ“Õ ×°´*Ū{Hór´Ÿþ:¸œñ¤Hp§^¾ÿ «•LYQbõº[É„³"çb•çE™­^·¿EŸÎÃÁôëXeôd×q£óq0ûµà‘ÅÿÔñ°F&‰¼®…ä‘1í[3¬ýøý‡ô Ve™$%K‹"[Å’³R€¡¨äoºÕÊiÚB2έEÊ’4÷kc¤yQ®âT²,´ö‘ýÊhá_ÐŽ±>´M¿ºåÊ;/Çå‰diZVÓj¿øãØ£ÖŒG ÿŽÉy‰«ž_g÷Á2VÀ.Y*X^$¥¿*V¥àì,õ2— ‹'áx)=ù»sòÍy·'Ús:Ö9˜êÞX­nÍÈR~m»h‰Qä½â$](– 8e²ÊDÆ8|½7n°ªf¿]äcQç„(€*™èMXñzÏ%•˜#$©$Dˆ‹A‘aL À뺜CÂKmµ«m³ÑŽæqª~Sû°imúA5=Þ¤[Ë,R¶1£#éú¢©©I¦3Û±Õa~g,q‡;ဘT UÑ€G9ZܨëH›H¢VõûlÀÊ8‡£6¸«H£­©ÇNƒiCã ²Ê9`…ù³‰{Pkȃok‘Eš8Îtš„6Êy“ùÖ<Ø©ÕÛ}S3$H¦ovñ¶ïîdƒZq9Fro&B×Ú9ð^{&FÐd}scy±»ÉHQñÂ:IX.C¼>Á5;Üm¤ܤ"ai™üÿ°µØhÊ¢…] ‘ä’É$-¼Eb ;{é ñPû‹šÏs"pœl!þ›þ¨]³€÷“Q­»%Ü»#I+¹HY\î èú]*È<æ4 TøEnõ–Fƒ¡/%FÏ·f«i­"¾Õm£6mШú°Ì æÆc)®¡,ÖÉ6…÷™!öƒ)ÃA s\ygNZýul¬~2ÇÈÚ½÷´cóê¢$¥òByÕ)Vµ4Ø›‰2;üíÈP#˜gÿ´Î²È砱Ѻ' Ý„ß+7ùÕôqMwl5bz!M\ã0Ri=nw¾zÕa™÷TXØ´j-¢0®[Èpí–¶‚’voÀ£‡'y}@#`‹+ßQthœúCs’W·ènmZS¿Y7ǃ¶D›Í?t=8Ü Ð @8ÕªÓà²mXbN 8Çh{†¶£vÞŽ9x`£ñx4v¸Ú^,¶ßi½Ý¨ÉTÀY½¸èE˜ü¬ÜTÊK@àPÜMl›ZµÓ–.f®./°â \ƒ5M„d GŒ«k†1E†WjIÒ{Þ¯õÁæ-»k2è-F—A<@nÁM§<‹>ƒK=”{ »y;H¹;—uÜ9MoœÖ@ÕfÛ|á\"àX…5s–fÑsP}­;:'NZs4ÎçSz©QxË(>oñü‰™aê‹” çÇO/Ä ,™§›–¿Ü;Gü0ù vKCå# RŠmU!ÃܵR¯ˆ(|î=Êø*‹ãÇ9áPË Ê¤…= jÐ7_+p=°Â·Sox:È Ä…þóLœIÎêcëá¦ÝÒì%óiâ4QÐIb)‡PKy„qÑ6pºmÐizÌŸŠIô²£ihð ¥"û7£éIDÑgCç{wnó¢õ#â>¬ø¥Ü‡˜&Ê£½Ÿ áxè9õãógâèåUÀÄì¼OhH|σ‚2ã`Fô7A Õ%\é18£ ŒÇIGÓCÚª-q7ç°BøùÎÔûK—_,»ü’•œ'°wÖtàh(ëÐì)À,²`{zHãiß×yQd_ÐbÐn`ÿ{…ø¨Â.âTøøo&ØVTa7ô°¬B6Éòrnb˜¡s »-àÐYq V{T­ç›½g}&Y‘ŠIxõúô…gþ‰;f+^þ'‡À³¦LÒ ñøßwLXQÍþç\•E/Ã\þ1‚Z"‡´±í2Dô|>ÿÅÀ,MKµÙ!æ‡Â2 € •¿ž˜›"óªy‹B2‘ì\ù{8àÛÁªÕ5[8 ô‚¢û'Ómš^Mµ8µíÆájfuÑpÜÁ¾Ï¡"‹³Á@ÙÀõn¢àë 2zú>ч °èëËŸñ±0ˆ`o÷»€Ëb¯d–†w=PT+½…¾ÄÕþœXU¡×øI÷%Pã{ ‘î_&¾låQK··ú’¡ø-‹8Ô³¶™°ÞWŸ‹aŠ’Ê—cß`õ»^L§MÓÅiÛ„JýjèéдAü–º#tLqMwMuùf÷÷]@F]À´»¨/$©‡/9»Ï" ¥Ù[ª#¸N§Î¡ Fð𿱈y—Ý8øª„´¥a|G[äÑߤRÐaÂþj’þ: ¦…MÃŌЃøþ›Z{‘EÁ(‘w{¥Ôƒ5XhEÑ{·òeO”QÆá}qüúó?iòèhÆŽ//ôµc~8€Á/M?þïx‘‡w0CK^4œˆô©ñÍ9(1zX˜Ñ!Üàdøâ<‰úÒÔM‹¬NÕ‡¦ÇVûÎIßÉç G$K½yzsQL?äÑñ@Ï:áKÿõ\gLέò$@Ž÷;\=)=)>Uljƒ¿M8"éíˆÓ`š²óá–ñ*z-Þ†mƒôäïE𲓄КÑhFºbÊ6˜Uu­¾‡¡ _çc ZªËSdé' à ëAÕc«ì´noÌc ç…„Nº­ (Q_?‡$,÷{íÖxø‚‰£ꃇӂ> endobj 14 0 obj << /Type /Annot /Border [0 0 0] /Rect [489.726 541.526 540 548.1519] /S /URI /URI (www.amk.ca) >> endobj 4 0 obj << /D [2 0 R /XYZ 72 744.9066 null] >> endobj 1 0 obj << /Font << /F29 7 0 R /F30 10 0 R /F32 13 0 R /F34 17 0 R /F37 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 24 0 obj << /Length 2680 /Filter /FlateDecode >> stream xÚYK“ã6¾÷¯ðžF®Šêi;¹ì<2›™Ôlj«{+‡L´DÛœ–EG”ÒÓùõ‹e©KÙ­Ú“ øJoî¾}Ÿ¥«}¼/Órõp\mÓÕ6Q±Ê¶Ùê¡þ5ú°Þ¤Å.:ëuª¢?ÖI¹6º25Óý™÷Qåj™ÚÚtL¶ŽŸñ}g«ÞºÖCe=»ç*ݦÚ"Û÷z‘+ì&;cšg¦]f/ÓUV70SÑ7¸‹Š¬È¶½gq®³'ÛêF$¹î²þíáãJ­6Iï‹"!ÓIj¾‹žlFj’à€g¾¸Ú~V*­4YÄlÎêÇu¢"ó ûáðÅT=ÏõNŸ5˜â׎YW‘fÀÐhœxÙ-;ëëµ’Lã}EÛ/Cg}ÍnŽ×› ”ø§#?âΰ#S¢(hÖÛ¦™›Ÿ’ù/ŽXûu9&ÁÓfj ÈGô ŽæbÚž'‚ûB˜ÀÐÙ5žGÝqÁ¹WðLÛS|áTs‚#ëÏ?*ÿj](ž¼mOh¬ÚGŽ£G&<è)èíÍÝìBY¼äP×ãâl‹g=4ÆÓa*}£yl2M#<«nèyÒöçy‚¢:ê‘ç™Æö}# l[­ÍxøHñ¼A0yžOX®{äY×ÊìÙz¦®ºzÔ'ÑÏyð¿Ö®}µN@m}„Ü„mŸøN˜ä$\k–Ò‚ý™‰ÕÇ#Ç6.Ó¼¸aF§æ)ó³1x¼•ÑÓ ; §b¼ð{';á]’>ƒÍqhZãéÀ‰•ë:Ȧq$È#ð)¨~Z°»íŸy=ÙŽˆœ(Èkyyî ʯ•A8ŸŒ&GÃLåÚÍR¸@"õ X; fzš¶vÙ¤Ën?ÊGž#žÁ šÄÚ§ÛèÓ-3€»êž¯½;uúz¶•l6Mœ_'Z„,úžScjÈnÏØAªPä?GΩ‹gòœÕ a*PRw–3©„@%³ó" K)ª Ñ4jœÓ¥àF‰J¹îê:Ý 'xæÂRÜ`-?®Z%›ëVäxN@”Ôì¢{¢R°¥Ož™bII¨ú¿ÑoŸGcZ¦è4Ôç?Mý îYˆ>0É(½—0‡gãÚa;Éà§7ÕÐ<ß<~9ÛFÆ?ðãÉ’M@Ñ‘Õ2Kå­íu';8чˆÎ4ú„Í8pÑñ/°ìÀÜŸ¸ßñ ð92xSI½Ã7.²šß>§i~?î–e{*=ÊΠ§JÁBæ'_!q.LA~SÎNèjod˯.LP ÒÞ?Ù@âå'û°Š™ÜÙð`9E·QuÖמÀß(€TèÉQnHh-ײŽìM7T²í}un5]¸"àâƒsµ¹šDmžmc¥Ê¬E#_Ã]Ђ¾hÿfœ›º·qèþS‡Y‘÷¼Å. ÊEîƒx–Nà÷A8Îùä’ ¦‚Û*´–HAzäûPYRŸƒg{:7" >AK-¥¡±G~΋ˆzQ:Ù^Á@wí¸?õäš`Ý,BÂU qú––k¿²ˆ1úÎ V5CõÈ”ÜpgÕã¥<. Ð_ƒn[º4½Ž?Å?ݰnçRæSSÿ]_ãJ/ãÚtÁ/ëž$ö=ßaTôî­”µß¿^RæãÐ 6§J7F¸,GÞÇé>ã ðû–à?¢€ƒ›rü#lüv y„$ÈÜî¢÷C+=ä2(oã}VìH./Ê’2:Ž‹èµ¯”ø¦»ƒí;jŒ3Pü€DÍÉÓ¶Ð\¥®Â"Hiù A ÓG~b7ð•‚_Vzû§,“šsV¶ªÍ™ë7Êh£™¨‚—²|¾Ðœú3÷ ÜÚù7"¢~9Ï¢«óÞ©ó”¡ž­³KÍe í-|º×L¦7Or-Õ¶<”Á{;:  ÂaŒx… ÈkØvï¶Ð"ÊOUc¾>×/Ãvë­ï¥bÿ+–#®kÊp¬ÌP%Sûàjhºž{óB” ùþéXÀ ¥H34=3ЧÇãÐk˜CL£ï¨ùAÜ ­¯ú¯örAKøL5o¤Ã€i¾2’¶%¡#^¨•ž®žôˆ0Z[ú¶@Ÿ)Å€D6ä—­†1.Ï"¯õ'r¼1ºÝ‡ºè‹PÁÄDê!ÜšHÅà‹d4oº›^¼ñ®$ûðÑ)¼ç°¼ˆPœá½‘÷ŽñŽ›a¹ç‰}(£f~9ž ψߨþYlðU ™Âãþ ù.Ö¸°á)‘¶h"/m¡¿‡ùå8E¾—PÂüê¿iÆsøAÙ˜ž'D &º ÞuµL±þ¿„Á'ù>ûáÝV>›þðU£«„‘¿›ìf±fH8â ‡#s³i×Hó7Wþz±`ì§w©” OïŠñŽ%¥õþÇ×Ébõ•rP¦³r¯ôÿ Êx܃–é 9ÊŒkŒiYu6Õ£¨‰ÝcwŠ5K^¬ÔÞ»ÊjŽ |¸I¹‡ÆV©GruÂéÐÖ‹DÑ1[Ð’dÁGcÃÍ^©íÉöüÓñðÔêŽÀÿÅUÒ„–ƒ*¿8xúí ›”¡ë@|#íɬÁ'þÎ|‡Òï~x¸K` µJðQ‘Ǫ„gu¹ûýî×ßÔª¾S«w*Îö»bõ/*†HW—»¼Ü…—æîþî_£˜ ¬ßL½Á?QÐbÌþDåiœ$éØa@ÛAõÿ·hÆ­^¹endstream endobj 23 0 obj << /Type /Page /Contents 24 0 R /Resources 22 0 R /MediaBox [0 0 612 792] /Parent 21 0 R >> endobj 25 0 obj << /D [23 0 R /XYZ 72 744.9066 null] >> endobj 22 0 obj << /Font << /F32 13 0 R /F29 7 0 R /F40 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 2920 /Filter /FlateDecode >> stream xÚÕËnãÈñî¯r±Œ:ì»›»É3ûÀÌ›l²Î!ØÝ%Q3©T<OUW5EÊ”ÇA| ƒÕ¯êzWuéÝÝÍo¿Óf–‰Ì*;»ÛΔQBú™“RX-Íìnóóü}ÞîK•&óí©Zwe]-~½ûþæÛ»9KàOÎtâE¢”™9Œñ³õáæ7?ÿšÌ67Éìû›Dȩ̀³d–)8tˆ Ü”¥©šío~ºùsqÙ£\q¾{B0‰xô˜äoÊû¢íˆè}QÝw»K’•¶B%*’°Æêë$ϘÒÃÔ™H³TÆ™ š{œË!R¢Y …lÔÌÚ™Í2¡œsæ¾QWåj³NHùšrâ|Jc/×RyêªìZ¤v¶L•HåfKºP2/æ:/^ §í«²rFù'Þ ­pòEœ(æ$½Î‰“ÂùäU­}ˆó9^\*´uæ/6>±é˜—¿|øñÛ¾¹ÎNš ¯Ò×ÕÌçsìX-ŒTD¦´ÉÕaLrÁÎOïßÊëÌ'¼ƒ#¯ÉÌçs̤R˜ÔÉ«ÌdÂ(²—Ì€˜®³£S‘ÉT¿*;œÏ±ƒA/‘Y i¼`'¤ Üó–(R¼Ýïac–Íw=ÊꞇzsÚ- Ú]Þv;ÚüÀPYuE³]Èdž¯ ±X‚Dço·0ǡcÝt=âœ>÷åB¥ó.d:/ª«÷¿Y,µTóuiÄë€J “ÀD¾$pT¿$iÿ’7Ä¥„ßå½}¢$ô5IÊ(#k.4¿nмC¦­ lÀ§*œ€A½ú{±î@Ú¸ùßÄSŸhiW|ºœÞņq7 ³&oiØv `mi® "Mô7üPv»óò„¤Àâd?æþtÜGÏ+M„Ñà´ýPt»zó/Hçyµ9³CRKÀ¾ÒÔŒ¥–·aŸOçÛº!€(`GõŠGCAäû/ä+4G>VxyÅ3h$pÆú”a™A¦Ï’ÈÁ&”Ï3 ‘0ãí@ñJ06í£íŠOŸEj=#ʤآ§sw“d§^8é³—´SN=5è ¡¨é…TÎŽ³¾okŽ}yÛ;8˜)|ë#"Ì÷4"sŒ»äê0ìv9—rå~?F\ŦkÛ?Ò*?ÞÄVPð~²êÛEšÎÛx1œØ€ºM™ôZÝFç ƒ Øy¢ªˆ>dyM™¯öÅ$]Àz–n•Ðeô—ª¡ˆT³Ôh0ë_R£¦Â¸,½R¡ö—C”!øÈ“R‹Ì€mõÛʶüW1a)ÈI¢­;èÛ £¬ qÝíÕ‰½S~‰QÌ’np! HÏë-ÍôK,ŸÿuŒ#tÚÑÖ>\â€ÔNl/qm]ŸöŒ„ –tyYE”e{Arg4—Ë8N6¬uˆäð|vÜ£MèH Æ9m9ÎÁŽ.ÿȇ˜ œä7K€QaãŽñDaüÑm.y®)ºSSµá"7_-T2?ñÒ©ÅÝÜ#ΛQ<»4Gƒ5§ñz–Jx(kþgsì1.‡(©’g<”³ÊùóÍϘ£‚Ьu r¨Bäœ*‰ƒ ø¾àðPb¥;ã] R9ÔÍ9Âô¡Š Œ#[Ã!¨ÁmáÊÇö"mëýž24`yAlX×ÇÇ •)ðP™hfó™@žˆ,ƒ—èø%L„‰å8X`Øí˜H¸©ç L0ðP¶W…€E y[MæËLH+Õ¨@˜J:^èÔÆmç诓\W· éçœ!ò-JvK•Ë(ð7å}Ùg›HñSácíå¹¹ŸŸT>Pö¥é絡ĹwZYôo¸~ÉFq‚ÂÎ ÞÊÅ­>Ç@Hã9aêãL­ë ƒ\?öËU‚Zr¬ LÂ^У%8Þ[Õ<‘ïÁ£B¾…KÊ…œWÆk"N²[p¼Tq̵_Òð1”·¨úX7 ùeub½Sê-ñ"ÏG›èK‰si7yç´A‘%ÖŽ ¢¯Ï¦ª,-\æÕ lByá3i¯Ù„‹6á{›pc›ðl®· ?´ 7´‰Œm“M¸Mø ›\Ü'˜Dë (bÚ…Ôþ)ßëòœ ·§…œkR ѳP‰ØíiOzÓ™#)S‘§*òp¦{(× âÅøÝ×q;ÍÄ*g(ÿ…F«Éà©ð nÓ—ÖïøðWI|ß kðB ‚WDcC¸dƒ‡ú¢‡ ‘¡´ÀÉø G‡8“ ¦áœPÆ]Uÿon2 ôÏÇMÆ™  j…ž7 ¨f¦Š¨UÍ™pÒ×4¼9“ôâíýW¢ïóÉ-¾?ºÝ…ÙrŸ/ñy¦¬œ$_]%Ÿ+06§Kó=ÒðéUÍNˆ•æVwûTרÉäêä²a·;|Ñ Ó5XUg@6.5vC3j–~õÕW‹¥ûÝ6õ ¯›ÇcW z#á5dæ¦ipzN{#4Œã÷ýnqñ½~Rœ› ·ùj}û‚O½ûróí/R›OY>‰ü‘†þwá»Q ß-o,­Ú?ü; ÄA!ÃÇm›ÛÏÐ2ù®BN–$„ïõz£Ìv•l,Tp[·Q¾nëÔ-)Ne}“³ «Nc›’ÞlJÈ ‡Ë*Ö'ðo0•²Ã¬ëüüuW´S%cpgm2Õ?„϶h=wûÞª©?b$+*ŽÞ4¿)Î=¹}}ä8ÏÖ;DÈq¼¦éu}8žº‚÷rw°O}WfùAØö@\¾Ò ¤Å>‡r'2—…J ÄÛyxàoî¨æ¤6È¡hÛü>\ŒKD@LШ-eck Ø ²gBBÛÆÍ¿®«¶Ü„0ì-IP ü›vEÃàÛ}¹.âö íW¯x&îŠñÀ!UO$å¶¼¯rÈÄ‘f˜0O39}0·4y(ù –ü‘µÖÒAæ½/iµä¸¤î¤fÁ§îÊr¼™É!މÂHôgî4Å'ô½ ŠDƒþØxð™ ž“mSÚ¶)Õ‰—c7JïÊàyš±&Û„*»äWJST]<ùÂQ¬eqŠqñÚŽ ±=³%àí%£!«e Žã±È›Á]ÒˆJµ:H—ºÈ‘4„Võý©%0Rňƒœ¸Ã4•ÌùÈ.ǹ"ÍT5}ÏOËÖfC·÷×À}óP¶Eh|góïÊjÃ-q î´Þ”Ӈݒ©|$¬«´5’ ê)hÞô‘Ç.'·Æ…›ë«Ô ê«¥¼Þ …Ô+€úXÀûʧ–“tôâa’Þ]é9ö1n¢ÐðJx¯b-µš*_Eæelîðk/öJÛXq¤VÈÄ[ B#N²™Kþ‘gêjÿHP ¸Ü‡G\8‡GQí„·êT4e˜bShÔjSçî®Áåñ­†»ºny㔣‡Å4bôåæñs¤àIùk¨ñ£ý öC%7ˆý°Ä…¡v—¾‹‡"LJUP;<¬Ù^a!¼¢àÌ/J™Qèpãý¯80 òï ?îstއŠvnãï ~ôó ôÈJ—Éoh”CÓÃ0q 'h¤Å_j¢mMá¶«WàÊŠ©v,çï°ó 5ôT¯'2‹Î!ß@‰‚ÿ( ·H}ø­'بöð`–¡,ø#G*T*ÆüRÆ 3AÏŠ²xÓ†§°qð«êõ©Æ†‹ƒ„– /»ðŒƒãy×åëǹ"oË*Þ5à¤7ÔÒ†l)"ï {DrzA*ƒ% 4p…ž6~›=ž†]X‡?ˆÄÂ÷íWcý•Þ« ?ôˆBÓ ʳ~`Ù•Jþ…äÌ`ûÌö¿ŒéHþóZ$/endstream endobj 30 0 obj << /Type /Page /Contents 31 0 R /Resources 29 0 R /MediaBox [0 0 612 792] /Parent 21 0 R >> endobj 32 0 obj << /D [30 0 R /XYZ 72 744.9066 null] >> endobj 29 0 obj << /Font << /F34 17 0 R /F32 13 0 R /F37 20 0 R /F45 35 0 R /F40 28 0 R /F29 7 0 R /F8 38 0 R /F11 41 0 R >> /ProcSet [ /PDF /Text ] >> endobj 44 0 obj << /Length 3863 /Filter /FlateDecode >> stream xڵ˒Û6ò>_¡ÛRU#šïG|òLì8Éf×›¸jS•äI„ŠPøÈxüõÛ/@¤Lç¶hF£ßÐÃÇ»WïÒdU‡u‘«‡U™¬Ê8 £´LW÷¿Ûíôz“”Eðlš†[ƒzZÇQ ×|üÖ—“õE–q’¬"Z}±Ï¿Gy”ܯ7EÛW tcY6ݶ¨Âö·eš[” ðãrÖ `Ôî©gœV0þô- sRKpÛqàa³Žƒáë<d>È/ ^bZß°¼e ›ð7v¡8GÁ¯z½òŠº„Ý2šž§zÕ€z¶<ËîóhŠ€ÁžFì |VlÎy†‹˜g8Ö۳̺¨n0ªq; 7°ƒÜ ²†[BÏbú¥£§N#“«VNT¼ŠY®ø³U=pÔì¸w6ŸX¡ímHs;ϸŸ•Ácc9ÀdÇÎŽí^v»‘ÜeZ»îå2¨V5/ŸõžŒÈ„ŒS3f‰¬Rí?Öq Ýüül4nøiý'1.cRqú²…I‚ÃÈF6¾ªŠj™‹s0½Làh®n¨ªŒ4qF°7l7…¹ð¥[†¨*îgÇŽaÌŸ×r ²ÒÛÇu(Óöƒ`m…fZ¹tß`•Ð¤Ž»Ð:Ð\jþúë¯Ü/{5hn'ÓããZ 0#Xú=PŽ*Þ |Llþž@ôÇNp©ÁáÀÙ¢ ¹šü²‹¶`(d™[ìXLÌGò‡ÈD{Q;9ÉØãð~yÿ&ëK†´ Zí”®= ‚IóðVïÔØko~\9CßZ<µL‡Øç«vâäÉEá R<Í*²w #æâdoYI©„XAt¶{T64Ÿ Òü¬›fc/ƒ9›ÏÈþ´¨ÅõhlÆž[3“Uˆí(ªàSU0œêN÷½íz¸™´®ƒnlÅmbáà›æbá íMdáÀ³záÆD(Z†lõ2)ÃIÉ ÐŒû¥ ÜkôÖrù{©ƒó´sW±lGäxL£übGnÀÕ.zÂ7$×@öRM¸¡ýÓ·(eÑ$PÊò0Kê\¥v!”*!$©b™0ó£I†ôîÇl'ÕfkÁB“ú§©È-Α²\1°QÚº#ѪXêØ0‘dœËÚ0r³˜H2m!’LVž„EVó;™‰7¬$'”§¥7@~¢¤ãábn q­!~á<ã¤ö QÜÖê©…[eàóÉìN2ÀòÃðF±Asg»âI½Ç«È$¢½´àæ÷²+5îT¯ç\¶0hˆûÐ¥iqÝꞃ¹Éé q|ç†ÛaG‰7‡=R#0ªI|‘Ì©®f$yÁpR˜«¶vdJ@'…‘òâtj ­œÉAÌ?ÿá-ˆ2On•Z2(W1BU‡ËȶzPª³žŽ»0ó³@ÙáD´ÿýN^B`Y—÷2ÛÂÒ©¤^ùK8 ¥iÆ•dEI˜¬7102xìôÞ ý‚Â’$ Ó¬æ[üÈ>ÂCD±• ɸ1·Å=O{fÕágÐäCÛZ2•(xþrëG…qwjÀ\áÙ!fð[ ×Ýs^Ï¢IhT#xhèÛçÑÞ%ñüÐŒç-&\è¶³DZÄΈ@Kö‚Öd/¸Î@Ž¥ŽÎãéùbÞ&}ФfúnΪmo÷qö7;-`Žƒ7í`­ÀlßëÍ’P6J“cJÀe1;1=Ù«‹¤"9¦È õÙ àmžŒ¤¼]¼7§í;ÅÐ÷r/È2)IÝa2¯‡¸Â&›&›&ìYðq Þ“9B‚G¿Õ­‘UžväÝ/Ý'‹±; 4þi¶‚ýCc6fÛ©î…;˜ã#ª»·ïÐóD«xWà©Ò8]eiÖI–¯vç»(¬³UæMzò“7~öf:ýË ˆ(U‘¡R}‰•âÌa¸|óêÕóóó.;Ú{Þ¡qß{BÛ_ÝÒ—ÔQXÖi>§O'”ùy_R6S÷/ñ!eXî@Ÿš`þÍ̺Þe<$è° MY¤X)Nƒ´†èŠa?++ˆZABW¥^‡ëÁ¢gð& -RA& F+9YZ‡Iòõ§Þ°9öYRîGs9i†}ƒ ˜oÛ+‹%Õ¨ ’9âÎ1ºeŒ:–íb¾%í‡X<‚ú&ó‡þЩ¶Μ¥{ÒOVÃ-;€Bþ Ð!FàÝ»…¨)‰“0­’Ê•¥ ã€àþÓ°@"˜ú¢ðA– 6B çÇØâ›|aj –bŒPα#˜Rîúòç¯5CFm½@1 z•®&õ6dö½pºªŒ‹9½¹±AÛd4Âx|ÚŽ;ÉZn™U‡eR8l;º÷¿cV 1ZTÊt2Î9Ø363Éõþ$¿@â ¡UoØúSÊL¦¸›òzNÁÁ\™OC[£Z=SÇ”ùe ÙÖ9s r#­“ZSâãMGßÉÁ™Å°-!óY&®u˜̘Ê'Ë#>MùkÖ„O# %KðIÄåÒ˜c×,«8Ù^ ðБµÇèÇžýfÄ4ÙÂGé2í¢v.v:Hö^ÏlNNØ/f)ïpŒ¨DßoWXU›¨2NqªLU”Š- ®9Ù±Ùs{+k'¤Co·-qünldÕJp#‚³ie¥”c®á÷œŽSÅ…ë5Xõ°£`sb …¥èkÑ÷„+ÝW˜íê*q)È%å)ÄTͬ °j’™§’û¦µ$Ðð,’ÉÀ}R$;ôv¶°!G·B´Á‡·ä0œCu»š}˜=8ìÝ‹›×,ÅBy©“y÷‡iw2Ê×ÂCñZ Q›"ŠgˆxÜÈ×±z¶X0 Û3âÄ%.¼ºd$OøÝJS½7E€ïÛFï†Î¶T‡þ#§)9fQö‰[Èög0ÿñAܰì#Û|/´ˆªÉà=o­Õî$áãÓY‹VéÆÒç•Zû‡7„ ‡™5k €¯1èˆW®¯Q! ¹Ö"A Ì;Ë‘kÇïJø]C(Úu|½çÔÓWtqÒW¯ ÉV£¥¼®"JÛj9×¾€7Ñ?‹æÁ­ YŒ2—Zæäµ2÷œƒ&Jíköœe”¹¼F(¼âûéËF‰™çYêRØ#¡)s~pȃGÿzìÔ™aT|å•L<^q¸Â˜5‘`(k5ÁZïàøСz÷0GrÔ$[x 3Ü£]â-ðWÔ]^èIEÉv–ך¿&Ñü{¼{Óïs< ÔÁÜë:× Sg¡nˆ§8œçsŒ§y"gÏþÊÕò½Ù¾l8t z!ƒ½!÷Jäy¹^Ðñ)‘)=Ð;´´á«À6¿Sø×¸±üúêpç»ó4qo þƒEî{t ¸‰ñ‹éd£âÿùìÞW¯hFy»dï~À2¢£c¹å‡)d^SÄ×üv,ª5©K «ÝRè<äÑÈ3€zû–g?«Ãæ¢XÏ~¦ÔpN²`'y[é½VKû^;i´×}¾üT–Va'î®Õô¨¯üïiãgÏøuÛÝÀO:iTù©dBO†gé­´øÓ_ôΰ»Ê‚ß}à†‹¨À[‰•!iùk÷ ¬õ…)*\eÂ}ø²²@ƒß²Èû¾ˆOã#¿n,Ñà¿'ãܾ….¨„/œH¬î!È™ËÖ¶FÏﮈ¾¿wsý•B$zÐ×E ¢í^uûe¯çðØuÈ“aç?ˆ +L£|Ä£×Xœ§;ãÞ@ärŸ/ ýÁ6Í´ê€cˆûö¥J-¹Š/% bÒ°¼Ö©:o]¡öKY«¢0®k÷» XuÔßÜÖÅ]ž…QßÝùîÏ»ßþˆVû»hõÃ]¦u•¯ž±JŽ˜’Õù.+*×iî~¹ûϵnë7D®”?û§a–°ì#=… Uö(@ãñþÓÛêZendstream endobj 43 0 obj << /Type /Page /Contents 44 0 R /Resources 42 0 R /MediaBox [0 0 612 792] /Parent 21 0 R /Annots [ 46 0 R ] >> endobj 46 0 obj << /Type /Annot /Border [0 0 0] /Rect [185.4313 434.7676 290.7935 443.7189] /S /URI /URI (http://www.libtomcrypt.org/) >> endobj 45 0 obj << /D [43 0 R /XYZ 72 744.9066 null] >> endobj 42 0 obj << /Font << /F32 13 0 R /F37 20 0 R /F40 28 0 R /F29 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 49 0 obj << /Length 2858 /Filter /FlateDecode >> stream xÚ­ZmsÛ6þî_¡ÉSs‚w‚Í57Žãt’›kçb_§7I玒h› %ª¤Ÿûëo R¤D)ž©â€€ÅbŸÅb_À¼¹={ùNéQÂ+íèön$eÂ\,F±Ì*¡G·óOÑU¾zȪñ¯·ήoÏĈßI—0 Zî×Úf‹³ßÏ>ýÊGó3>úpÆ™Jœ=BG$‰„E‹¦ Ücä¨8»9ûgËqÒ²œty¾Ù—21Ì9×—òïci¢ìi<‘†G7ùÙË7E9û²ý½ $Ý@š˜ÇÌj«¹gRHf¬°ÍÈ‚–ç¤Ë”È.e˜æFŒ,,q{—×7µl³M sB-wyÈ´ÜQØ Ò¨Ô¡SVÔ*IíôiÕ/…íüBP°›bŽJòr ‚üñJÆì‹•=)ä-Ë#ˆ]Ì”Ä1ðç1,ŒÒ*O§EöÒíÃr,Ñ¢A%ý°<´ÆÇÏœËúá0¾X°Øñ“Þœ.Ï#cÔõóöŽ ^]ÞÜfÀHsÚ“ëð< „ÕBÊçãL;éúÀÞ»„:÷ÈÍIquxÁeÓ&¦KÓE2+Á­…܃¥ˆò37üv¬LTå«"£1˜…aq8ø«DuRàžG€«„.’à}Ž#·Öƒ<=äïß^_&,á§u«žG€É˜mãçãLr·c©¯Ìa\§ø‰ uËò*a˜IÄó\§Eᢠ¨‚+MÆý~9ž(•D)4šGõºÊgkº+«EZP¿Î–uv|^¾Ó¼#‰àp«Áï‚øÈÖUeé‚ÖÍ(™À™÷`€Å*IÂÚl9«žVaóyº"Móõdú4æ 8­ªt¶ÎgiQ<­‰ 0*+qç]kZÿˆ»—Õš*;x‘ò!En ¢änCªàׄæ;qfK<‘‰Œ¦i×l<ÑÊE7awow—‰Š6uF£ÙX˜è°¼x¢™õC˜©ÓEFCù˜ß¡¼é,L¦uØ,dW@ø#n®¢Ç|ýHiº¥”Q‘-ïi·K×4ú˜Á銠 ô‰¬„÷!O½Ç’‘x…­.yM#Mû@±l÷†ñt9§Ns08¿U LÌÒ%uhÍóz/ï7yýÍA±JÄÑíC \zÅAï.ËæÓ´ÙgQÎÃòÏð+J“æÞ@N)Ó° =Èt#®¯ÞPw`-%ä™ROdãÑlSUÙ’N~ Â;ûó®"€¾ ( ›S?_R»n6¹+‹ç€ŽÂ2ÿ.\¬nÊ. I„Ôþ®ƒÓ·G* Å%Ó¨ ׇÅ'ˆ:-ËI—ç~e¡ î°ôn }O„J†K‹=· þÙI(W ×/{N)aZ4*‰–å¤ËsÀñBþ)\,G<°±\=G±:5Å*>¥b»<÷ÅlÛ“‹~hG¹À8ÁÒnÇßAµ ƒrœqáÌIAuxU…åáºö¢^CRªuÌ/?}<ŒN•[uRËïò<† «“ä©,ú¨Í“ÎÉÀœ omýPVè߯þ;v<º, ä÷Þ±À(,=Gçʵþ¸â&[­³Å4 ëÊ;j¨/;!y­ËEV.3"_•ÁMÍ53òÂÐ[—ÔNKyTãÁö ¯Éj³ü„^€$g?Ðù ùc $:pÖ ?ød%ÙšA6tõ}UnVÁ#Æ]Ž[ËØ4yÊ,g”mìg%jÖŽ(Q‚U‘æ ’E¡` ½<ìŸ/ »_@ÈiIJÑQÁHZÜ—Dë…×>†6x@♇e›jI, iÙ¬[ä”–€±HiÜPŒ.%D¡ÙÚNýX®³&‚xa)–TÙùØÀy6‘Ê7ót‘Þ·Q¤©Ã¼·h³4<íè|Á¬œIýªaßÄN™›&ìQþµ< ­;Ci"ÜS¹ ÒL 1ÆÊÍìaŸ(LõôeXÇS¤áu$]Bž‡Kå&ˆ„FÛB$aÓybÃúþ¥ñ°e?,H—›´jPÛb·­•.\Ö°$d€‹¶ ÜÔé}ÖWtí±.î¨ò»Ö¤Ø©Õ>9¦´ÅÏ™Š6{ýúõêÀR• ê]¡—,)?ÖêÝöCî¥æ`U.é3*§¿}4l™=b-{žNgóìîþáü¢]ÏþñÓÛëÿ@ÂÔTµ™­ÀÒ—ß¿øa“ÏKùŠY v>–u½ "£a›RS¯|>ìGŠ<[²G7´%õ{’Héof¡ù&«[( 2JHq)ÒçËeV-Àâ‚@il„?E(™Xl’¸Ïä]^„/þZ¯çùòõ‹ _ðaF„‘ð®b »o³•!—zÂà}±­KÛƒOOúÜÒ1ç´k? 0×,ŽcÙIp€ÛûŸ‡xA31or¡_Ðx^j F Ù–Õ×C¿ÿ –a²ãSAÿ#Û—›&x5 £¹ ,hSãøÀ”R˜§«eí‹" “F6Ø)·Ä·®í›‚J:šímC‘$ÖöÔß©h¬yÒò™žÞß ‰­™1îÌ E×Λ—‰}ý'Œƒ# ‡w«-Àx G©€³Ï)– ÓqbÔÊ ÃI—#•8=Ã0ëÀ¡´d¾T~s5„„€c (ÊjèÖ@’ãe: Î'v`‹§CÚpüTVem¼õÝ›!ìÝþ‹ÁÛébÑè¢s-;<$˜NkÄ>tûL@ƒ½ÄÂêýú"R´ªJt‘_óy6÷¦–ìç(üC> endobj 50 0 obj << /D [48 0 R /XYZ 72 744.9066 null] >> endobj 47 0 obj << /Font << /F34 17 0 R /F32 13 0 R /F40 28 0 R /F37 20 0 R /F45 35 0 R /F29 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 53 0 obj << /Length 3353 /Filter /FlateDecode >> stream xÚÍZÝÛ6ß¿ÂTb…I}$OiÚâÒw¸vqÀ¡íƒ,s×jdÉ•änÜ¿þf8C™²µéÚ‡C°¿Eg~ó›‘¿¼¿{ý6«".Ò$]Ý?¬²d•I •©ÕýîÇè£=¯¾ÿöîëû;¹ðO® %Ìe\u¸ûõîÇŸÅjw'VßÞ‰X¹Y=AEIJ(’ÕáÎÄ:+Œ¯7w?ÜýkZoãÜ„+~y³µ"…œïn¨·¸½×ߨ$)â¼HÓÕFʸ0Fº¡ïÚõ&Q*ªÛÑ®¥‰m :úm˜¨lNö-Ö‹hÜ[éwCºjá.}\K¹eÎuõö×SÝÛõoÏ~B=Pˡۯ7JèèÃo: 6˜,6¢P “g¯²$.tªWi‘Ç"O’?-ùiÅM¸¤ýlo*Ëc˜âòæÏH?IãDÁštŽšô»í»WXÌPŒ-Ie’uÙîu@¹Ûþb«q Ê¾\'Þ«Yjqç‡gcˋ㾷S/}‹sN£ÞÐñf6-üŒÛ¶éª×j/EëÜd«Ô€ag¹üÓj?­¸ —¼E šW¤ ӰϨ=j§0°™š:Ø1×°cØ¡~€²¡âØñÓ© e ‚&§—.Eh˜m«þ|a×Ùu&ˆ³Ý]¢YÀ|ØÙv¬«ùKõee,*‡Ún„†£F‰9ØåU …R¼pñ›DÇ…¸¨ Ýÿ‡/áÉ42xÃû®˺œe’w …º­ÇÚ)“3Cõi_;«ÁbÝð˜-wž'7\«£ç0–ýHÅ’“]@ùÁÚݶeu5–ÃöLGïF?†/ßÕ;nßÙy{9!ƒ«C @%…¿Ã"Ÿ ª|(õö'!Ü/UI"P€­ÕГ¸ãA=Ø8sJùi|‹J‘Dõx½,ÈÞÿ„ÿ•gÞÖ—îZ.Ùºbú^L‹ X´1Ñ^ÙŸ£·ånÓµC¥WK(Ûчl(o=² CýØZQ²®YÎU&A½DûôqcLœ¥ÿ:®®øיƼ˜ë\@G)1¥fý :XD­ÇNo°@Khë³®9ûÁ²„¨ãÖsë¦{ÔÝ=Ã|rË4‘Ÿa>E›¢‰hçÍÿæãWÜ„KÞ2-L,²<½¼ùsÌ'‹!Ó€ù ˜ù€ÏeæCòaa^˜yfeb`·×d‡ù™ä-óƒ»b>hsß`ÍŽ3d~ÏàÂùn˜9œŽÇ®C|™ Zž{É 4yÐ(&€Þø_ƒ¯îhØ3ÎãâyÄçìy„wTbÉ×<ã]®áïsœéM]Ótb¦©;î»Ýç© ™/ƒþ‚úkçZyíG^É«‰`‰‹,óšõ,£L°ÅD]–’KDE§`nHúCûŠö7,¼[q–À /Ož}9¨‡ ƒ“•Ê2Vù,µh³³GÛ¢zИ]9–TBG2›E·nWFw„þG<Õ¨žÁØ,*Ǿ;‚ÚŒ<ùâõ°›ÝuZÈèžup“B$QÆqgýb :ì˜w` )NŽó*öˆð,[z’W-3v›±>6<ˆ‚ {2ÍðEÞ§BÑÆ3iô½O½c=8»GVe(WD‹¦úôŽcSzoði|9!c ó«µ_·¬µ$~z´]»qá×í†rg2ÏÿgUN´ðªäžUeì"UÆRÝÎ.ë2/K; w‡˜ÆÝbvs±po³C8“!ÊÅQÀ7Z&4gÎ¥ŽJVÐáÝn6… s‘^×s`uѶ—Þ2Õ‘zž¤*€æ€^Æ&Ï$øÌ°žK¬¿Á¸·[Ý{—7Wû%vFs—‘È)û ’x@GOXˆªS߃šóÕ .6eøp1Ô#§«Ø’ªõ°äÔ ÀHó‰5‰OR,çJµðÇœ0qÚ½ŒE¼ o$1qž\6´&F½XäOp·ÏD/ÖLDȨɗJàóàÅÕ]>ÁXà‘ž‡ ŒÐò›}<©ÙÕšÃI8õbž?…¾‡¾;P‡˜o,1†·—ÎÉo:ðìžÏîÁì¢"AFjßuƒQˆ+HØ–MÙV>?ú÷d-cxý)oåS\NõxIÑ¿”Y$Ì,~À˜ œC6ñ‡´€´ƒR•'³<ÖÝ-(0&¼lØöù žPóspÙ7†f—V‚FŸ8CÉD†é×줅¹ŒÝ2ÝÁÒ ç„‹wç‚>(|l;Nöa ±ÁyÇpÀƒ3#×~“m óWàÿpìÚQ¾â*Vâ4ét²V3‡£³eÌhôgj eÀMÇnê)›2ÿÄÝ>aZ.D+I¦!òN¼3?µ¿;Û§qá~ÓíCœr!\py˜4ú§Ç@$g>×{¨÷c˜· ¶LöÎ8-²9± SH¦*2ºÜvÀI]O-`7ue©ÕGS&á`#êoµ¥1°ÞÒwv‘Ò&H€^Ñl¶àd:Œ:Û¡FT+ÊWÊçã@ÐòÑReêuÀ°t yì–”ÆÙ‚HÂO.J(ÖNh‡m’æ÷;ËM.Á c¦¸ùÍ€‘½Nq]¾P×ÂÎEHLœ ãt…Rؽ@-òØL©IÒ §Æ _ ¼o¬«`7j¸Ûé^Ì„­õEÅyÒ ©=÷§ \@•È+wÃ3x:3¾Á“2ÿ± ̳1”(x °•Ûî4^‘¹¹Õ!Êï=OWOdí¾úú–*‡0 k:úî5 6A vºˆ %=Œç©¾Öálʘ¦ÌOàé>5ÑRö\)nå°ËcÇátþ Æ‘-`[ù`½ïï&ècËe_èAÝq¡ ¨E}(é#!®K’Žð~‰K ¾[ ¯™°I€M—2€Òßä+ð@øGu"„’ÃʺÙQµäy§atžÊ ÜMÕƒ"ÒÑs´× .ÒòB´7÷²“_Ãåv¾äürsI OE=à#‘ «ïxA²™+³‹&C¡ø×§2µÀ°`«}[CÜûë‰[º‡³Cë3”8cÙÓx§}%Ôç¡^r×9ijÂ{òm0kÛÛ’·åTT)çIn9`–Æ"Í<»;vO¨È X~ ¬A«g’m©Še*³)Mf(@Ñïß  C?ç}JŠÞXüMî ððÀ™,»k}…á'RÄÎÿ"^ºÛÇ‘!™L´c¨É„ÅhŒ¾Ž béPþB¿Œ;Ü-o¹Å¸x`ü#Âh¢~ášNÛ¡Ý8囹T À« þøKˆ3"T¹€¯á*-ö<úaLôpΙzJ™\Â?_¦ù¥ñêG ¯˜•Ò3æÑÊŒùPeàϰÃ5LdÉÊhT³}–ÓiþÌ79˜¿ òÉÙÓtÃyÉ8]œé"LfÁï§4Y‡J¿çöÐö†R;/M¥áñþ Òûœendstream endobj 52 0 obj << /Type /Page /Contents 53 0 R /Resources 51 0 R /MediaBox [0 0 612 792] /Parent 21 0 R /Annots [ 55 0 R ] >> endobj 55 0 obj << /Type /Annot /Border [0 0 0] /Rect [323.7118 346.6454 480.9301 355.5966] /S /URI /URI (http://theory.lcs.mit.edu/\protect \unhbox \voidb@x \penalty \@M \ {}rivest/rc5rev.ps) >> endobj 54 0 obj << /D [52 0 R /XYZ 72 744.9066 null] >> endobj 51 0 obj << /Font << /F45 35 0 R /F32 13 0 R /F37 20 0 R /F40 28 0 R /F29 7 0 R /F14 58 0 R >> /ProcSet [ /PDF /Text ] >> endobj 61 0 obj << /Length 2887 /Filter /FlateDecode >> stream xÚ­YK“Û6¾Ï¯Ð-T• ’ÞÚÃØ™T9ÉÚÞ̬·¶’( ’¸¦H…O&¿~ûð!qÊvÕTÐèÇ×Ð뇛—?j•ŠT+½zدbµŠ¥/ü V»_½‡£iÌzľ—¹FUó÷ÜoË"/Ÿ¸÷ È*ò+ËÝuYþ©µÃ:ò²¢j;î¿ýþîZ:õ~ó#?€ÓzÙšHòÅzú0¯Úñ@Ñ}·Ž"ÏŠÛãViêÞñ”uuà–©êþpävg7{ÌÖÊ÷>¯e䙉”ß~\ù«”""IG6Èógv**³ëâA Úi!JY ðžºã¹±3=7ôoy£¸…çVRûÜ›ž;Hbä G¾$ ù´÷ºäµó}Õyƒ8#UÑõŒÙQõÍíýð]ˆþ×=ßÑ ²’{oÁª‹®ï,S½Ÿ¯bÓUaãaŽ™«º¬v…}SŸ–.$;±+ƒçiþäõél`¹ºi_X×bH¼¢e–sSo³-ÛOì=Õ}í­!ïC!ÇºÈ ¸t+ï­%6}ed Œ­]Çl×v½¶fÚ$áœq§¤.œ¿gÅÒµÏh½ ц#ÝòËTºô°GÎ 2±¡8Áz#}‹o³+º–çÌÂ7LQ¡ÂT¹è šÖèog[l¡Z]Åm;°éŽŒ:dð}Ý15è–EkÈà;º+t4 íió¦ØÚ‚™E±P‰ žqûYE@‹¶^ Æëà±ÉÜ۸Ì–Ù·nÖÍÌj·…EÃ¥©aþèzvoëÞ,¹”ïÞYÇÅ/^Âr‘JBH«RÈ4Mðaè›_÷W»õã/ÀÓ£Õ#>+!ƒZn"ÆiäúåÍýÍ?Ç·¦Aâf*òú­ œP~œŒ+Sõ_üeÄ’;AAÅì3wrQzÁÂX$0áê„BÓûÔ.9(ää0ù‚Kip© Õϸý—æÀÖeýÆ¥mì_—¶±ï¹oư‹í›öê åh<¦£†8®Ìåèt7ô›¢EÆ{»¥ô·ç¿³ Ž­Ñ2ƒ º,æyØ&¡À–¶+`€é\,Ê·ºéW$'kçDò2$8/öõ2:V½´GBû6¼gy­KZDªÑ¨Â9–ZtT)![…RÔŒýÿƒ£7S‘׎*•Kô¤mtTûfàŠ{ˆ¿ß«‰ËÆ åkø~ÅÑB> endobj 63 0 obj << /Type /Annot /Border [0 0 0] /Rect [92.6728 548.0334 205.8897 556.9847] /S /URI /URI (http://www.counterpane.com) >> endobj 62 0 obj << /D [60 0 R /XYZ 72 744.9066 null] >> endobj 59 0 obj << /Font << /F32 13 0 R /F29 7 0 R /F37 20 0 R /F34 17 0 R /F45 35 0 R /F40 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 67 0 obj << /Length 3586 /Filter /FlateDecode >> stream xÚ½ÛŽë¶ñ}¿Â}Š]+uOç$@Rh‘Š"Ƀ,ÑÇÌÊ’#ÊÙl¿¾s£Diµh}±É!9çN}x|øüUî¢((ÓTíÏ»\íò( Â8wÍû$P‡c†áþãp8Æáþå6ö‡$Üú±¯û6øx©Î?†¡ê>~züîóobµ+ƒ2Sâ wG•qR*B÷O\jº®?¨tÿl`É1.‹}Õ5ܨ >€å{ceÿº¾tæ—»æî¹¸¡»KÕÕÆ­º ýŠ?U}ˆÒý Ï{6㥿Üô/w3LtØqè][wõ‡5}Žyï¿ídÒ¥Æw‡c§ûñ¢ñÐxLfbDÇôiÌ¢ýX=¢p¯-wñ ™Ú[=r¿? üèºÑÔÕ¨]µµÕ'AsjûúÉòâÃ4ÄÍiàù¢« ‘àéduÕ4Ë-»ûõ¤‡å®Žåçõ&ˆ×Ô^y©*nW'æ‹`ÓþÚ0¿¾ôVwØÎöM5V %º°ñ·÷(y¯Z·.'i¸¼à}㬫®:ËsÆK52„OpñHÕ0Mƒ­†—C–îß¡”–t14Á;®sÇÃvÛ÷O‚E ,-­i–`A–3£·ŽÏhao•¤rNhX$6Id=4¼¹bØ3ŠFoî.MXÆ\7O‚ç¦û«–5•f‰'~¼0èÚ»oCý0k>ÈÐX™¶gÙ_é„„0ŸycŸ‹ˆ•¹¸!ù r$»¡¢«¢Shˆ0ã EÙ IiH(¡]ã½Ò\Qî]=±–ÎcO;pi½ÝGblÕ¢ "Ðtg]Ysj5ŠW–xéATƒC›Š}p臭;6ÝkíÈQ½ =\ÄhP¯±OÌ‚æ$4ž'K÷¹Ï@œâ D0í”°–vúÉ!»––ÀèüV]o-q®È÷¶BR³pÿ¾5µæYd$„ÌdF°â?ψ„|+üПȌŽY\î¿¿ž[U3ãGóo-8G78#BäleB'ŒÖ wp„#€,;`©aï°æévÃâjQ¼÷?]óL‰„–IÖMò§e®Èz-0p}€,{%Iñ+-EXÝ74šå†&7àñÇ˦Yœ,]Ç|G1ï£¦Û ÈÇîÄÐ`›‰“fÊñòÓDØÎ“í#N1ðD×Ú¢E"Þp6¦[·Ýõneº½T©ð桨þ acÀkšÞô]øå“ÔmY –i6Tµ±¢.­>¢ýJ“@ÿÁF8~ß»‘‘D[ìí¨ÅV¦j¹=5;Ëi²ÏeÂ@&Òñ8QÀë¿bJB5gAÉB¸cϵb»ýÔ \ƒ“E%œ?MóÅÙ6ˆS9&yšËΦ$l*–ÅÉ”¡Íy"t¦RYsZÍDn?ö’¿qês$Sž“rR š‚Ì£Jb²„’F©üÔÀ,¢Á'=>k2YÐ ƒP&wR‚ ýRªHYÑè3éÖ½y޽î2ndCXºÅ\•§A'Žk 9ÙàqQ1‰™Ã=óºÖ´´ÝÉÌeZÇq ˜œ<UT¬ 4u{Ç4]剸hH–—KÕJšš@î]”nPö —üÁÇ*$ çkÆJC %!Âr*¬Q¤-÷ØÁç‰Ä¬ùB>V´¹=Ö±€@üŽ[Æ…eR¥RßDâ∠})Vc«î“T­\1þéHëËýK—%CâÓüÌy´/.V¤ër¡4Sõ¾fNÐŒn¤’Hâ=m3mç—s·B.IµOÃ}ÔGX_KP_1Ðô½p. å®0þ_Rù²ÌXAgÄ4Æ~1ÀD;KH 0еÀÚˆîöÏhoYhA%€±YˆOXŸgS´‹b0Rlƒ4+ùÿÌCa§e¾óXOŽýùȘÑܾirs ±ˆ€°l|ªUM1F°Ú7lél†éFÉV¥qw[ö5QAþ>ûš–±ó*‰xOö2a÷ÅDq2}¼•Áާƒ4œÐ G·,T”Q˜lQ·p’ ˜¹äIœzüÏèÁ·Ø¿q`Ø^8Æ8gA&+ K—0Ùz7)sY³g‘‚ ÂñA­ ³|™¦ú±€OS¬‚8/&ÜÙ±‚[¶\=6øºsîÛÖ{¥cu/}ãta—Ý6Ë(æŸÌnf ]¨4ý/Hœ tni7ß7ÍŠåË‚Þäî]Hôd7 ¸‡·ˆ])EžLºc–ËÖØqY,‰ã4ó­© Aë .F* rp²—Dâv_S—fA–gŽºw´-™mèœ1ŠÓß‹òó f…pWÓ<Îl8c "0mbãâI¦l¨àˆþkÈ|¹â*ÔDû÷½ÔS#~[†?ι=…Ðî£ä;˜d\µÃ~¨ÕÝ'ª–G”¼>oŒ–!L“?Æ7²Ì\BÄ?M”2c CÈ¢b%çD¿rVB?´–ô`“þ}RÿÑ å£ÛvŸ•„ÄCæ*¿…T“K|—ê9SBZ{TÕù¹˜CÂaûêƒ .™bºç± úôq üKaó³’ž[ß5X†É£´ž¦—ì™1àO„äsÝz«¥Y dèOTˆxpn‰8Iá ÁÚ×É‹ëÌäK"ëz½wô<¹%ôVw֌ރ*JIâjÆè)*Y%Bby)#k¤kVtv ]§ÛwüÚ5[š_œÇËc9ºÍodtÆAfùÌdг<Õ¹ò€–O®î/(%Ñþ_‡ˆ> šöœJìЕ”Zúx­ Ù‡¯0Ê w~Ä—Bv“Á}}øåᇟÂ]óî¾{ƒ¸,ÒÝ3t *Kµ»>$Yá:íÃ÷ÿ˜ÐaýÑCôA>œåà F‘bY+è•')þæÏû]Ãøendstream endobj 66 0 obj << /Type /Page /Contents 67 0 R /Resources 65 0 R /MediaBox [0 0 612 792] /Parent 64 0 R >> endobj 68 0 obj << /D [66 0 R /XYZ 72 744.9066 null] >> endobj 65 0 obj << /Font << /F29 7 0 R /F32 13 0 R /F34 17 0 R /F45 35 0 R /F37 20 0 R /F40 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 71 0 obj << /Length 3178 /Filter /FlateDecode >> stream xÚ­]“Û¶ñý~…&}°4cÁø3c'NÒtâ¦õu2$ ˜£H™¤|¹þúîb)ñΗÖ/'p±Xìv‹{s}õâÛ@/2‘Å:^\o‰^$J $ÁâºøeYö«µŽÒeßÐïζ4ØØÜ;˳;ä;S×¶¢²ãߺ³ù±µbµ‚pù÷𑻦:öeSO±ýN¦mM}s¾ÁíJÉ¥]©hyO€¥ñÔöŒÓô—wˆnî¿„u¼lpÝGüã纇]ãÙj¼„÷«ß®XÈÅZ)‘E‘r Ù[Û—õ ¢HŒ~¶íšZ ø‰ˆu9ü×5³ÄÁHâ ÖNb„¢Äøê /¾ åÈ" Ìfa „‘ÞḩÊ|ÍzäòžÖL¬†"‘~EÞÞúæ¦5‡Ý ÕGK°D¦Ë¿2#†ø Ò4žèqºû®·ûçð‘)T[k ÑÐ@/{§ë† E¹]éh¹´º§ùÅì`š×nA稻µŠ"¡¥N½Îµ“ÀÖNr•8[šº€A"‰B¶Îh)¬GEo‹ÓåõŽQ&DsêI€žÙðн),A¼fºaôªìØÁ–LÂÐgQ¶6ï›–—x&÷¦¬h).é ^0ãn÷Í.ó¦mmwhêT vÐZÞíÊÊÒ4 Ò€ä²üŠÙÁ|RÌÍ‹˜pF[Û£Ö¤Zþ{¥Ð˜´w<Ý›Öa¦ÔÙºèo`¢0½¡«Ý„qWö»©œz,g:Òu:µ¸-J&l~˜¦í`@(ÉX\¤Ò–è€ñéí%9p±&¼†>J§„,[þÌÚEDOwðò3zíïNNµ¶‚m æ¸ìŸ­"ÐÍqbø¨ü*¥ÎUΘ——Ì)îÁ.$޲Ëpy3"Ç·©«{Â>Ñò6˜FÜ—è±Ár× ;{¢Ô®Bé¬Xæ(™=ÊâEDφD`*œáΰCÓuå¦béf„±us¼Ùqp/÷Œˆ3s¸òf8Ò!”â$W‹¶³Â‡‹Ò0»7Ä)â±Åß“1thÚÞÔ<é";R.ó[M]!Í–qQK8hË›¯ïÊÿXˆ•a —•iW ìÇH^Îñ.ž£lûœrÞf¥á|xz{SUs^tRû^Äa~ÍáP•îüÂÇÖ™£lÉeäòÃD«8©LÒ_èÿA•“üL“× nª›¦…ȰïèÛ…â@Å0Ñ5"á"<êzžéÊ›šF{ÛuæÆv৤·¬Qñí‘)²šä)-¿ ÒöÙµ^×±K• £ézN£ ºq±Î8ºEjîœÇ¥è"î ²ÞkR%*cr;9j>NÁ>ƒt¥ÌÆ\¼ô„zɦÂÞÈ}ˆX.+ÃÇï‚muyÌH+­5Å„=éÙs‚Éå{.ÝäÄð»`_ô1ʧ|G ¤~Î@,Hº3a7—k"6e1‡õev˜õÝkÏ-'¬c>¡Ž9çž“‰r °‚ðçÊW’ƒ†¶MUQ<:÷ú’˽p\"J„‘Lƒ„‚ÊŠ*O¿/®¸z{}¥@@¹P "’°4R©H5TúùþêÃÕ/¿ÉEq%?\Idi´¸ƒÊ2 ‹ö~èíZ]½¿úÇ@q=\i¾q׋1§ŒEœdá"ÒZ„*ȧ_›ƒÙ@IÔ—]ϘUY"Â$PŽÙP§éÃÌ.˜Çý•3Ê(H=äŒÛæzLôÍÅeH«H¤YšÁÞp%Š%¹ó?ß¿~X£2FÊñgÕèˆæ ƒFÇ<¾ŠÝçÎÀßLY¢£º;R"•2˜¦Ç·Õwƃ­D€£Ï)ì˜æ#†Y*”ô|þIaáv$#¸žM‚Ô7X5Lµˆâೞ“1ÍÇMc¡ÂŒÎÉëOÈ•ˆLŸ‰õáÝÛŸ–+‘"–©ú¬rh>&WÁ0yŠ\*Mh†7)3uVYh¸æa¥ãã§» Äé4îâ·‹»€s€€_CätW}cáöÈkŽßËýD>aò®_°§‘ Ø0cèJɽmóÒTô}h›â˜»{Z¢a¶î¨¶?­ .x¯.‰µ/²ç¯Gœ8 g•g!w/˜Ôm£Æ ]D]ªÉmÝÙóºdÈ63H¹© _{VbÈŠ©æ†'UÜú%Óp:Šä Ã1}Œ™Ä?¨¥:c˜ ¸·\øT—,Rp 8t”Š „!Ô "J4¹ÂW_}µZÇ’fÛìiôµkzˆïM·#Uæ4þñ›hL‚’Óìd~r©ýoöþ’gƒiÁü­_÷j‰[Û”þ«Œd†Ïi WluPµ¿Ð_h†î!8º+¡„w£ÞÜZžÂ «âQ†vƒJ^ Úµ½CN•)ádüÑ#¢(¡–Æ¡tühϘj¯Tà ì鯯ÞškÖ­ÁáŸA‡vFøh!—7í*H–/j9 ')…Ê]K¨»¢$|Êõ(‚ûD=p9(®Ç$])7Fk¸–DYzÚ¥Bö_±èÙ;)%Ùßá-þR‰€”)|ÂÑU’@lÎÞ¾ó¶¡NŸp¨!wÜxq±ãÅLÿE]ö_¦<@çï1±Œ¢±/¹· C¥‰Zš[§R؃õMõˆú}Ì®iÍÞö§Î*ÀŽÝ‘òÕH¦ƒà[еÔrSöÝK®š“L$¡sáóv1vø‡~bKß®Ÿ‰¿6UxÂÜ»êG­êñB ô8Ú0ºkªá7ä×[y¢—®Jñ÷f;3íTÓÑϵ\á‹Â޵N·À/x`y†{!ó: Îëê,¤2fÀ—¬ió}Q<‚Á‡#IÔódê.¸€ÈW0 MÎü€ÓËžÛFÙÙKØ ‘‚€¸1‡$°K÷$Ô8Çk&þn½q½)ÉŽ(aSl¶í;jŒùî)Wñ‡i‘þn­8¦–=£TM}3wBpu!÷"Æ‘m椧!*ºn{˜¹>kD±3/Œëã~㼦9ÓSªOå+pƦ†LJên"f·kŽUAX&Ïí¡Ÿl€w´‚°ôE^ñL\Jg^D¡ }›;ôR$:ðï®ÎœÊ$`Žyõ;÷ŠxCŸYݱ "Ø&QgÑÍëAg”{ç’‹iG³§¢ cŒÍ}ïl ÉëRŒø£ ¯<çyLŸcFïnU ð3zj'¥X…d܃Ÿ¢‘$Þ¢8f‹6>àNÂ1§ÇÂu©d8UŠA.‚„" ¨7 ƒÂbŒr|ütÑ‘/³N– Æ>Tóï_}Y äõÐ4Õœ.50¢Ÿð©}9ç6‘±VŒ‡—|´ïgHBö“XÀæïÇ®'®IÉc9¹ÍPzå ü»èƒr*¨©ÓDy–Ù3 6”‰Ð:ÉÎþñÁ‰ø„óþ”²…:Öq¼HA=ÔMÿoÕ2\(^-*ˆEÄjØ××,sö€ÒtœÂº«&„‚eãަ"¨¿JÐ\ï.¦÷I1䤈O[Uå^–Ü,6bjç­å•\lÀ5M 5oÍßCjŽÎ³d8*Ü'8 f³5")4Oç3§‡îF¾Ô-^úÇ¢áÛµxìöXù‹UëŸ0`_j=XŸ)gñú;úÿ‘QË(z2‡^Oÿl3ldx5;¸dçî—è\— ¾×Oq¼0~è!Ö¯G„œ¿élr EËtj¡·«2ÏÎƨÓendstream endobj 70 0 obj << /Type /Page /Contents 71 0 R /Resources 69 0 R /MediaBox [0 0 612 792] /Parent 64 0 R >> endobj 72 0 obj << /D [70 0 R /XYZ 72 744.9066 null] >> endobj 69 0 obj << /Font << /F32 13 0 R /F40 28 0 R /F34 17 0 R /F37 20 0 R /F45 35 0 R /F49 75 0 R /F29 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 78 0 obj << /Length 3511 /Filter /FlateDecode >> stream xÚ­ZKwë6ÞçWxWûœk(’9]µÓvNÛE;½™3‹¶ ÙfbõÊ’+ɽõýõ ^Q÷4‹Ä à_Þßý㙬ldÓ$]Ý?¬²d•‰8Še&W÷‡Ÿ×ß>l¶Iš®¯õ zýq#âu^uTÝÕT[Tk|ÓÞQÓÇ¢;Rc[Ÿ¸®îŽ®¡â¹©›üô¿l £Ê’FóM¯ÿؽvÓÉ>Tõ&AN¨öÈÍ×åE¹ë–'{˜tÐë¼|¬àêDõ;WTÔriÝás(f zíæ×ûïVñj+Ddµ^E[}¶f —@ €FñHßeݶÑf+ã”DU´&èt¨'C÷yã¨!ßÕ®ôb­›ÄVø WUWۯݱ®¨¥­:Ú…Æ¡ø¤]·Åé\^©ÖBãpݰØàl´ÁR›(5:…õá²ÎÅþCúAš("t;Õ‡K阳£«h\!Šj+m ºÃ"Kü Ê¹tLíü~ñ#•DzBÍ\ˆÃM¾REÝÐ/··Åc•w/±žP?ú—8NJç垬¿í>Ûhíwzœë¦Ëw%Ë÷ l—½†!±chmöG`lóððî˜wÔØ‹¹¹œ‘n‹bO,˜¯¯M­h7ÜT‰H"ž}ãE}{¥‰R¾ýÇË®,öÛ©P€p½û ¸ké#/±™4àÊuÌ~„uAíC]–d*¤VPur°šƒWU¨O–‰3<Ð/Œ=qÏüJäš¼h¹—çéϽ;wE]ñÔÅ0²hxÞKµÇyYt¼‚¹Q±†Ô „ù÷úŸ»+ýòJâÁt#RU¥Gª:â>¯°ÓÝ×÷wÚâ•XÙ8Ò2Ö+£2³ÚŸî~¿ûù×xu¸‹WßÝÅ‘´F¯>ÂG k“ÕéNG*³:|—wïïþÓÓÛ‚Û1Å/Ñ›N8³ˆÅ0+r ZóÔ.“Y¶·_bßX0Ìmb"k…œJò'ÊK[bk.,7Úœ%Ar;Øçg6ø¨yg•5'^ò.ÿœŠÍx2òúe£‹ÿX°‚Ïä±MTdã4½yôÍ"iLòv6¦øÜ†õ};Wí›ë¹[Ø2%"£¤¸aËTY•ªç¶ÌdaË ä·ÌÞ2¨o¶óˆaË ³ß2¨dfiÓp¬÷PÐáঠ¼›x^5c>Æ» Ÿ£Ýܪ$Yßo l1³ìÚnÊr¾dãz :Ç+Ò‘™‹Ù¿Uä^Að½ö½ëçÂf-£L&’w・F z•XÅ™5+IP—7ð=Å혤׬™}›Hk+‡™GÊÕëÎ6cÚ4,à"Žy;_„+JM*ßn=ÅW¡$ŒOµ™.âÜä{Ápo¬ {³èêLªÄí®AëÈh©ÞÐ5Œ(>ëBäÁÉ’+—‘±¼Å•ƒîûŒ_P*ø(y#SátW*ø¼Þ5`4¸ø¨y2KæÁ™«±ùCýØüqìÈüeœ æ|ù8ËégnðjŽòp0xÏmµ¸½po³}F ´ñeÓVƒ‚Œµ„Y”üÛzÓÜŽ(.~,",²~Þ°¸¿fô2¶‘J}3ö{‚/³/Ùʨ û·Z|ò’Å'`Q™šƒ>¨n:n™j<ž7²Y¢–îr.Ï (&z ´|f'‘‘vjš_síÂÄ/ +õÂÌcªIÁAe¸ÇxC("Q²d=ð/ïÜÓ ¢UŽ>Èpɤ1ˆ©Bt dÚ®ŒîG5ûýRpŒ3Š&•ý¤Š"3Ùq»~”k]ÕMc!I¼ SÐI•É©Y÷Ѫ<ôã¨bŠ[‹.àÔ!„†Ož×L~˵œ;ð(·åHëæéžîhg\"‚ “D—¶¼€ Î>à鮿ùË·aAûªD&YÐ~ý—ÁækÚσ€Øy~¿˜ˆd’½b ÚD‰?™G¦ðuõ’)Èþ°^n)HפSS°÷ÚlA+¡õ©) ŒMÁ2B_ãAø%nZD¾‰S™uéªÇ0?u͆Æâ¥)¼Á÷CSŸ¨÷ÒIõOÅ"ª¾7 «Ÿ³ñô,“©Òû~Apü¹Lz½<Ö—ò@„½eZJNÁ‹Þ—iUì¡:ÏÚŸ«XJC¶ÃjR`$Á¿¨¿ÓšsݶÅÎg]”ÒAÈ”hí¸#÷8'yúଈmt˜­z²çRͬ@Aâ/®WJÜUU[x¤ßÃE@` ÚA:ä@°™ÝÑmàïÌmø©–܆„õ©í úŸJ8WÇAK㵑㷙¡ß/NÜ t`y+Dç½õ´®|ˆÎÛ%Ÿ¦²È$qp|>÷k×ÉéV“¤M îZÊyRxtÊž;ºèÌá–” 0„)`'¸WývqϘâsqOßgÿÞ2%"¦¡”!ô‘Rz‘úš#WLÍYñ6îëªË‹ž Y9‹„8ÖZ­?‹ý‘jÙ1À€ûÜ2DKÔ$>%ùhìp°-$sVwîh¯ù¹oHþðA„Aœ#ÌÇÛ:Ëg> KSà¶Üž¼9¬;–Ú×¢0ïØÌ.XÞ÷ŒN«ˆbõúùèV÷ù2dФ •±·ƒ’r/¶Œ$3äÝ ËoìÆû15¡_µ`¿×]Ý\û2Qßð@=];@a×W¸t9ÓeÈ]óÃ_Óxg­K,ŸŠˆüÒ5j™ôÇa‰X0UžGl97ù¾+ð¿Kœã3ÜDï‚YØè ¸°ÌÀ’:Ô\Y]N;×´K0/ÑP\*^ÆyJfj†ó.1àqÞ07•Q6øpvc§”œ‡¥"‚îeð4ÒÙÇÈ3úS ëð;B˜ú \3Ìðà¿|Ï€nyGeP"墲WîAªd}xJ¬->¹ ¿Y:ä‡áSü4Ÿ²|™Ù[¥?¬yêœÙ™Ç„Pµî¨X¾Ûl•œ4™Bæž‚C(0ÆSI<`<¬Rðš³á2lpŒæ°×·Â@$¦„yYÉÀW˜gðÞ 0Ó9M;Ás˜úŸà9¨`<¥³xМ€3%CX‚ƒü³8]Nôá§õ%²*º*WrU¹ %ºlÂŽGq‹‰4ìcåï(a{ry þš»BÑÑ ³~?š‹ƒLìo\ÞF/ä~'Z¦³õCÝœòw3 Q»6ëSíU Ú}nìée Tí®wÛ×'oîP‰]šÖçdâ¥Ï¹1èÖ:wântMϬù^kæÅ¿™^Óü…œÂéQ/y )mDï8À=çÍ¡_sŠ¢Çg1çã–ÃÔB3s${rñä-HDÉd z‚bLÂ~¤†•ÙŽÎ á5ø9]Ê® D‡á+`ø5ïúËÈ*ÌxšôÃ$ÇâñÈMÍüAìÕâ™þ¼ÜöËsÒ×9ñÉ5u´„žÿÛ^à¿síaà‹ÿ£ ¸’Óq S’;*n†(YT£W&xöM} ÅÕíàò××ehR­ÿ¼ Pj#³õ’ó3N/ó Ô4 ñóï dÿ¾€¯~tpFzú^G³ÍC5ŸV…w!ZYÊéëõôõÀ3IÁ‰NoÉÈf™š¤dexk‚`½œfÿåYê^×|¾ty tÈOös†9¤Ã~rZŒù ”[€\ÊÎòã—jGóöÈ1¿ªá¨ ¹¥Ó´™iðè¾l‡oè.¬òô mrÅž·E0ŸC=Á ãZZ]bW½FŒµ\›0ü\@Ùf+â8^ß|?€ø }‡ÂWï¿à„‹0F¯ 3.œ„~.©,i—@¥~zÿÅ;*õ¯Ý¦ö‚nWÚóYJÊàÅÏy“Ÿ\˜ˆÒK=(\ªðDÓXIò„BYPÄé_ãÅC=É ìv tÎ[¦íNgÿ8* ‰Z:=KªÉ!+t¿¢Yr‰mJ¨J|A4ƒJCîU¯Rq8åç²ÂñV¾(«Äöû1ÚtˆõÎíŸPP“µu…wÿ4Î9êõ:¹Â5½Ë†®»ºþ@­LŒ9ü´Ó[¬`ý\æàiÈ ‹?]D8]ü*Û3çêd’½Ø¢^n_^MÌpTý5—ÿòhÊWrD_Çü“?Ìe­$ßkûBQå¶Ô(•WêÙ¸µ¼¤®œ°–K‰ð'÷€˜¶bý¿ ¦¢!ú½ðÄ5…ƒ^Q®¼§ è-Ç7~ ¹=iÁ8ǘ%h1qšÝôàJ¥æ™Ô"¾òIEp“gÆ*‰„HHÚ"Fh'm²Öì>þ…!4˜à!\^ôãÅ»²²Ø¿ñÉxø¸þ“V4´mGä^¾xê^pÁÿ-Wu•endstream endobj 77 0 obj << /Type /Page /Contents 78 0 R /Resources 76 0 R /MediaBox [0 0 612 792] /Parent 64 0 R >> endobj 79 0 obj << /D [77 0 R /XYZ 72 744.9066 null] >> endobj 76 0 obj << /Font << /F32 13 0 R /F37 20 0 R /F45 35 0 R /F40 28 0 R /F29 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 82 0 obj << /Length 3314 /Filter /FlateDecode >> stream xÚ½ZK“ä¶ ¾Ï¯˜Kj5UÓZQ¢^vù°~Æv•íìn)ÛUQKìneÕR[;¿>x‘’z5ç’ˈ$ø€žÏßß½þ: ïs?OÂäþýá> ïSøA”F÷﫟½ÊŒEÝ »(ʼñd ^U´GÓc[yõÀc…|]Ótaì= þïï¿{ýµ;¨(ñU¦ô}@|Ï$«CÀ¢,J…Âòo 2ýýAŞݺ2}=VL×õ–ÞT<¦¼ýUæàýð)tâoÓõf¬Ë¢i®IìÑ-S¯yQY´¼j/·O=_¬e‚·}zPpwË¿- ^è~§tâÇI¬ ¥ü<†Þ…æ¡gÚ²¿^ƺk±Ñ¡q|¨mݹÓ]L_Ì4(†ÑCןMå?ì4œ÷¯|¨•xt@· "¯_Œ òþX'aùA’å/ëD:Šƒ=oÁG;.ÔÐòÌÙ Cq”ë’º©©˜Ü´Å¾‘)V ·ÇŽ…4¾JÁDx¡ØâRÛ°" D qî ¦]òàÜÍ Õ•'«b,>Å9-'éóˆýÄ3 ,ð·â,üŽ;Í$ÝaK|Qî§<çÅi®¤‡ûñiäõ÷:˜Þ´ráƒòPŒ,åÝ¢ÁéŽ;N¨Ðº3̘®k uîë,Ökޏ2W UÁ–ªfÁB{-X BÁ’jïMË4E%68½P•Vóà,ÚÑô¥¹â­ÄîGxŠ<¶´ã+‰-‘E‡v‘Â3б–Ò]E‘šŸœ\å¬_å½€ ëA~Ô2EyâÖ¥¨{n ÐWNÅ^Žx¦~ê˜x¾?Ñs sïÒ¥‘v}¾4æ úíÈäÃÌ£Ç 3|Lhœº¾jÚh îV5¬=£¼ñ]ÿx»•Í@@hÝQä]»‰Y°—"»Â5­Ô…ÍÇ–%p¥$Ž_´l†JÜkÖ!=%^]ñ‰ìÃ#ûŒÒÔWQš¬ín„¯V§,%ÈeuÌ^ƒÇìu ïÊ 83ÅÙ$Ra zk˜0q 5 ÷ÀL;ÇeÞF˜^`®S­M ©(ÉiKKÙ“îÜ\¹w4-:ø-ÁßXè¶à“4Ê·¯ÅttN¦ŸaªGñÐkL{Ov¦”V!KU˜ ^´æÆ¾‡G!¦7¨sûá9Œ=¸œi¥w*FGÁ ¾<·Ûé¼7Â_Ä`·»ôÝÎzå{¼öÕƒøÁÆ"_™ ,ª¦ã´ŠðÒø©¦KÁ}´£-i~¬Ï20t] šŠƒ@^+Ú/Å~ìÛ+˜›²\oÊãCF‚yÚØÙ¡î ( *˜½\# r,SN}=^×žŠ¯Ib´D*l9ÿq1åH¬5ª€Â.N6õÁÈ}5û-üLw±N-gš¥+dC޳Àû–W€‹ˆ¶E@¾GMà2‰(Žáз¯âÀÅ"b^UörÛnêO¼À/q ¬Ÿº=Dø‘pdD¸ƒ¿–;@yi—9'Èmc û*vt(‘yaˆÈ­;E°·Á'LýPå‘Á1O]5 &³þãAÀóFÞ™žž\t±·•ö³0ù/Ðn!‚ÊÀQ^%¹SìüÆ^†ÄbaÌ>ll Ô‚ü”,p.öãôÖ»Õ|Sœ‹F‚ú“‹å.ª„ùbX`MÀòõqϬ.„Þ¹˜û%ˆƒ§š|ÛŒa‹vƒÂ׿AXr0„Éýuä±7z;øƒ´ýpC²]¡ ’ ì¯_2ÐðwžÊâkVl˜†”{à·7 (cá4®<¯ø,$Œžo µz¦9ø—Ú2ß %°YÞÌ9MÞ`¨ÿ-[=Õ)¡UuÒÔÛctŸì©ûiRq´Þ}y¢•®sºˆsûH ±d,úÑnG*Åñ3Æhΰ’̇¡týöIäRcKA'>‚O‰=ñÌóN‘;ïºJ<µPƒ£ö°ÿ…Ç÷Í¡îy]ä5E¾\­²VˆÏTç™÷­D„s}Ö/»o¸¬d.ó9CnŒdýa~ïv'@¤BHA"í«Lê ±‚ Áï0ìA;ö0ö²3ï‡ndcÉ@úgöØùi"cƒ²û€ ƒdÍ›æØY6§ó°qæÓ!?Ò9 ìÍlá,Ú0Õ( ÁðP ™õË¥‘¼L µ•xªï8¶ôŒbÉø`†Ãu&@ï&÷Þ¾{³b¬…ñ’‹ô…;[bé°.Ÿ—çHÓ°á‚túI N˜UµxRÈb¢œâëøÅiøQ¢â›šÆœÄÎa厉¯"Reáœýšb¨Iº*N` µ¿Îfʬ\IÉ™pÙUægÄÜ!Ñ\ÊÕ&he‘':–OËßËX3ÂGhÑÛûPù1Fa°N¸k–³PL‡kÚ¿ÔHýÙgÁ @ghSÙã^$£Wî1/Vï{S|ØPÔ.U~”Å6ãÔDülhÃ`y¿` –_ôMn&6q®}q±¶{â±ÓÔV½-Ãa²À­¦kR@$‡*‚}<ÉîGÁ1—ñ„ 3æ  Çmµ:ÂÐ5“`sªÕ(§å]¤p7µ‹ÈÙRÁšHžÝÔDÊîL>c;•GNó°0ÑrÅ-ôÞ!4Y̱r@^Zúùð„„)i¸zÇoS]~˜ Z„RX5Ç.Â/#GÞ1õ0ÔRFS®–cA9R,À¼].TsðÚ!’ºÅj™-ÇÁþã$¹)ü.ÝT¬èq!yÁ]0ᡳ¥)èçnjÇe%ö§ás û7$‰Á¸@DYH)'¬úòÝ›Gªêk:¹éŽÊ8]àz™›B“t¼a4EµU²…•ƒ}Ÿät²tLø¼Ëúbíukn눛å¡wÅm3»)VFe <Ç %·ÉÀSI§qÂ%W ±3Œ RNýqÈA†,àR·ð/,G0õË4:SžÚdh¿$Ͻ7ãͦçsa‰]qz—±ÉoRßMǹw€D•¡·K¦‰ {cxb• <Íð:s¹ð'°azv.E&"¸ÇÙôe͹Hó¨kE“L#EÄ Zˆ©¿îÀõTh…^›µÂ #y+Ö8@M¾A®›ëP°U —ÎZð,\+¡3M2a¬‚PKÓ}èl·¯Å—/{·Ö$¡€œ(÷Ã<âC'²¾@eVd‡±ÐÝ'˜YkïǪ¬Å{Bã+,fl¨ÔÏ£8[V:ñš§âÂn‘îÜŽEÝÚ‡H^kù4+«j£€Ùɰ¿—¦ÊÂ+ÙGëÛÒà| a‘k$šøê!ù-Jü9|)g‰ð%·Âe—¾î&ç ^fç~˜w4µ%8÷sZ|“Y.@À7_|¹]uȣЦv^6@Aì穃‡<^7“I?ŠR=óÙÊ#ÁDZ©µ/xkÆ©ooTu„à0[2Ä7Ú I%˜zèæ¢ûFq#Žýù§Ä?6“ø¹Ž²Û’ÌšIâgib…sÝÊŒ}F¶³¥Hnj½VÆÑŒ?þX’œl'ÿƒF~УíÃMÐ*¶ëØÕžSQš€Š"½­¢(K¼¢Ý‚Ú•²ÉÞ›D¨±»Bn®@m›ÔBSLž«Ô*·)êí¬)q«Ûã"ˆ =þ™[Ÿy+µSþ¾u‰ˆÌ3³‡ÜçòBXè~ÿØú=’æ(Ïþ7 b~˜¤ù:¤pµç…xvè%ˆ p…Òncq ÷ _ßq@€ÜdÃr*1çzQ(Ñ /)ß!{ôœD&¢Æ6‹z9K¢ÅÆÄ„C*åÈqc?ST¸Gþîî«÷wXp î8•Ø×QªîóÄXåùî·»Ÿ î«»àþ»;PW¹Ît_åàcÏw°"Å2*÷›»wwsüvŽánÁñsúW‡•3 !ÓRIâöåê'ø#|ŽÏ¼xIêŠd\›Å_s‚o±!„XùAîÞÅ[’÷O]×l9,ÈÒ—zuû™rdÆRsƒÖ`z÷Sm&¿0àøeê/ þ¡ÓÖ¥qY•O‡[>ÛSyè«(¶upÑÕ ‰2?A”±§W*¹Æ7?âÛp]ˆ£ïášjö6ZÊïR1ÿ_ ~ÿ邸œí«@ûAhúº2X&úýuÏ¿v¢Uo¨±t×{åßÚcÞÇÀ5DdϘ!¬ß-‘ÂQWÿk£AÔ*TÿŸRH1ÉO){ãÿ5Ù\”endstream endobj 81 0 obj << /Type /Page /Contents 82 0 R /Resources 80 0 R /MediaBox [0 0 612 792] /Parent 64 0 R >> endobj 83 0 obj << /D [81 0 R /XYZ 72 744.9066 null] >> endobj 80 0 obj << /Font << /F32 13 0 R /F40 28 0 R /F37 20 0 R /F29 7 0 R /F45 35 0 R >> /ProcSet [ /PDF /Text ] >> endobj 86 0 obj << /Length 4031 /Filter /FlateDecode >> stream xÚ•]“ã¶í}žE;s«Š¤HJÍCšdri2Ó´½ÛLÒÌT¶¹kådÉÕÇmÜ__€%Ê«M./6B ‰o€úêáæOos}[¦¥‘æöáñÖÊ[+²4SVÝ>~JžÜø®jÝé‡é´sýÝÏßÿé­²ÑE™£ŠÛÌãÿ;Ó!åY„¤ÓÒZÃ8?¼¹»—:Kú;¡ þ8µû ¹Ms-"‚‘d„t/D‘ŠÂh¥¥ÖÂc¿sãÔ·°Lia… å2Í•QaG”m*siá~WD­÷Ü qK<ɳN¤²"™†º}z‰w¨Æ G&évcU·î@ðÇ>`ŒGÇ àÅXw[[–6O…Ñ!Ü‹·¯tZH3rzwŸÇ¿h•i˜ªæÍ[lªARŸ¶Ä}ž“Œ-ï¥ë4 # x¬>܉,qôTѲ¨aPÝŽ×x.,Y$OÓɵL–gm "H=ñÆÝ#£¾Ã˜ùÍŸa°ïúÞ ç®=Ì×>Ç”¹ŽÌÓ23ÎiS#óÜŸ³n?º~p[š+Ò"WÀ"&¶ˆÄDžªÂüŽ(›ªµÞEìšO]·¨¬‘å~ë7/·WèÔFûÛ´œÍŸºÃÔtd”LËÅÌ>nÉÓ\*5«éó…Ö©º¼âþð¾>½Î}ñGÒ••ù¿Êö,ÚØ-ÎÌú~ ¼¿VÁ6ò¨«½ 0+£´ü çT¦V©`Ü5¯uF†°&U ;¸Ñõ'v9𼻬,è]µ«Ûû¿ÕM,ptÃÈbåí|.”øLi5è™Rin2ò´&•w÷"˲äë`r9jYúãX7iLòÜuÍÆ92o[*/‰uoQ3;ÜI!“}¤žúê|¬÷RÉyêÏÝàŒ™·þ¥'׺¾»~ ¹ªw4ñØ»ÿNàh&P·Ãôx'5ˆ;“ûfxÛW“7Äz¤·‡îÄŽ! ÙÚËkD7ç ýÐöÂ’&ùÐv¸Ôs‹kÛ||8Íëõæçêwœ0 ,öÿ××H†Lš0IÁ¤^þÙÖ ¯û8v2Ú†ç6Ò¯†Ñ«¹Ÿ¡§(P™|-ÑòúG^lc ø«‘ç«q‹!Ì;cáXµ÷ô¦@çäA#k±•¯kußMÍPG/sÄíð‚ÆÇ}x¸" 4Í;÷†aìºq#þàF&þ”ºfòQÙ£ÖÃzqR @<ê×zýåP¾0€¬¹®Ê"9VÃѯ«Ê2©š§®¯Çãi I¤ÿa§„5Lû½]ˆ‹Xì>‡0oQk&qâÌ»ÞUæõ¼£¦ªæõb S3Æ“[¤6äŸ pêΈ‘7ÿ± ‚Ú„p¬‚+ ro÷î<t3X QB„Ȃ˫¤ ”ø|ÙJŒdªÔœEyYÝútîzX¤5½Y<¨Å²!³8@œ21ññÜwg׃ýxKÒÉwíÕÙ×LõÙ}†¢j¼›Ä¨‡a ö¹bè%–ÏÚªrØ9z)e…?vwFš9¹j[è’6€«S7á9ˆ® at¤ôês¨Øœ*ÒÔÖüšW/\»¥gÈŽ8¢Mxßñv*š éÞ²Êü o°j·Th}*IÞVI•z:¸e]úågwñVPZUKS¯Ò-fºþHÒ&?§¦iÐÆ¡> È=5~·u÷a-å Æ¡«Â©š×cL´Ò]5ð®€Ö$K´á+@‰†® þòàÙ¯Èh‘Cb|!ÃyЕátÅhc£î„÷ð¸?V}µý àñ?[)g ‘^Û_ümÊVùÓgDÊûLl’”YZæs9òöw)rèù×±—“ VK˜X‹/cñÁ?û>Àe1|>,ð} ^$ ¸ž‡Utmsá%ž‘jGVÑ 2¼B¬u2ŠÅ 0hGÕL”–¨,r†è!:v]=£byDð¡w|bðl­E–9gйt½òì÷‹#|‹?êö+W~eÞoi!å *-vwÇ w2ψø®Cn1l^\oÊ8Ï‹43Yá??AmTG9¨yš©k^o-¤R%¬f*ù]òôËT–Z¬ãÎbÚ™‚P=Õ­W°ª©e»Ì0 V#fw(lñYlñ}7=i¦¢?Œó4;øW„!Z¦½wÖ€%dA`Ô‘‚çKj–Û,ùntxO±]le¢¨Z–ñqžB;‰Õ†}âhÖ zôÂnè ôð%0ϧi+…Œòþ††¿P+ÀzoÍo§ôòCØÁÊ’P3,QlžœÐuù@FÏáÇ :|8-ÉC›Xø6æ×ȯ^iÀGð—j&¦Yqâq¥0ûîb…Ë9ÜìA¸ äjvp®E^ÁäfH‘@ÔŠ`´ßNõ¡Û0\Y¦EaËÈA`å<¬jÖHºsèªê olîªëRªPÚcJf2,Ë;ŸÿUÈÖʹdÿß÷Ïwôx öTJ‰¼á•¯ò£,vÂGšƒ&JaÍ”T.Ø¥†ãžâ<§§ I°_€Ý¾9‡ˆÏT§„êZö`0ÃÈRfãØ aeŽ"ðÓÕÂ=…"§[‚UãXí?0Í–ÿ§ÍÊ9N©#ѳ¢}Éý-²ÀêtnÜŸiæïíÜç;· Íá2ŒŽ›ƒÇê©•€lyž©«HÚz8ÑÄó±Þ 5®½ÄÚÀãæªa ãè,ÒǰqäáÆñÀ {Ì2˜åÑêJ¶wHY*ú{êº ï¬PÓ‡¥3}¤ÙØ0á’¨lgœ³ëÎÞrŒÝgí]Ê_Ím ?ä­ÓV'~³ãéPÆ„³‚¯®}ÓÂpjÜÚð¹d·˜aCøú±NøGõ¦¶Š{e>Ç : ãY§…^U®0…õ%8Ÿƒ‘—3ŒÖÊÐkx–/¢@ÅäM`E z+âGÈÇÚÍÆÆ °ki“H(^7 ö QCÂ;³2t¾- 8Pª˜,°ùB#ŸªVuV>ëp³ íÊmÚ—-–õ¨»BïžP;•àp­‹OJ0 µåL4ºàõ¢*>Ì?ú‡ž)t¡4èCm’¯.W‹ ¤šþ-jxø¶ÚœK!¶Q3ÁUKÐwï¿$@Ô'"Às= ‡4aJ„\#B±_å)}p`ÛuS0ÞÌŒöé ¸* x9ˆíÕ®óEsì¶"l95¤zÕÜðBÓL¿Hòµ¾Ò84À[p3‡pW@]V­‚&V8ï5Nü©ž¯!64ó¿Žñe JÛúÞõÒÄâ«óâªR@ã}9“‡ ¨OÑ?B2ðý-->y…ÆÉƒ¯LZÊ´<Ò™|îWû—(õa öSôáþ£«óœ/ àŸF_wS €rñÅNî»åGÞ#ì.Û™Ø|<[m M)6ߟƕ¦oKÙ•­ü0°4¾üë,0ðÍšÊ×w`±M“Ü_ÞƒJ™æB›×,%¶*]¦Öê—Ÿd€9ámrnä‹&ÉO[àp(iP±.”4ù¼º>cÆ'„HÞ„|z8n-SÊTXÈü¼}ÕjfwõêwƦy¡®îZ}PB¶¶ûÅíýÔ(AضÇ1EjÊB}¢Ã±Ù\²{ʤ›°”×MôŽ}:<`Æ@0ÎPÕŸð–_­yshE"©{¾¹þÔjT«r{Åû­ëó,Õ:ÜÜ8,‡÷Xn™Ñ –©t#eƒ:‡–ˆ>—›S¶± †—7›?×88Êæ¦†ü«àX'a2BAŲÈxyðR(üM~X™*©‚²®T-©ÂïX^osçVu^üÑHÜN$B,¤p©R£Ê«/Œ¸¬oBòËbn¢Á(òˆÐ”š/0¨y‹ž7%BoNDÚ Ñkëž@ýÍaÞ˜ÍàÃtÆ+-&{µ½y11IR{—nyƇ åH¢ÌÐp¶¨‰š)TÅïÿúåBV§ĸN]Ö7yešI9›9™Í>Šá2aýÍ↖Ԕ¼wŸêªÁ»ÑÌøb çæÂ_è݉¢›á@@ª:=¥{8%RA3CG€Èøç¨è›ëú4éV×é8_3ÝpzŸ)¨»^K¢B^Ɔž‡¿´äNg"ߘ3RÿÏ^Ôõƒï›@öúAús þ õbÃüðË=‹åuóÓY|V¨– Ï®¢c(y~ýѤ ›¯fÈɪ =|džiTjkÃd»‡WªG×\‚î6ntK|ßøàI¥:ŸÃëëšW@4ÛÔ¼—¡æ^(qݨàõ'ÅiLà4Ùóü)/ÜU–òØ5\!ÏnmN\@3†«Ïè »Ãðç­/­Ââ«|39À½ùæá/س[q[BÐQ™FžyåÜŸnþ{óÓÏÙíá&»ýþ&KUYèÛgxÈRQ–òöt£ÓÜ‚ åçææýÍ?gr÷Þ}D𫟦–&Íļ¦¿þ¸Íøu›õS¾—OÉVÉ 0Bh­~/I oVß%nЃ-~#Zå\¯åB%:Yš«Tèpð}ZM}V«“«þ‚¨S®÷a°4‹µã[Ñ?E€ÔÓnñjuÃ[”Y@Žìý¬¦,~ìðÚ. ïç=†&-Ôlá[ <³ák¦é¯Íl¾8ÖOG¬¦®Tx‰×ŠÆ~’–æX oª(¼òÚ)Ëõ‡Óà%…ä…„Är@b~ãó8ìVçyòw/:iC¹ƒoÚÃÎòQõÜendstream endobj 85 0 obj << /Type /Page /Contents 86 0 R /Resources 84 0 R /MediaBox [0 0 612 792] /Parent 64 0 R >> endobj 87 0 obj << /D [85 0 R /XYZ 72 744.9066 null] >> endobj 84 0 obj << /Font << /F45 35 0 R /F37 20 0 R /F40 28 0 R /F32 13 0 R /F29 7 0 R /F34 17 0 R >> /ProcSet [ /PDF /Text ] >> endobj 90 0 obj << /Length 3389 /Filter /FlateDecode >> stream xÚ­ZIã6¾×¯ð-6ÐVHQ¢¤ä4$ƒdééT€’dKnkZ‹£¥+ίŸ·Q‹­ª® s(˜¤ÈGò­ß{¬o¾üÎø›ÄK¬o7§Mb½DY»‰´ò”‰Ìæ1ûeÛæ]S}ÑÔ»½DÛtç«íÇnÓ¢Leîí~{üáËï5£Ï$6Ü("ÑõmQ¿çi‹ ýЋ´12í˜Ê‡ÜmE?²œÚ͉³´—¯ý9í¹õT”å’À|—gÜ,ê¾q äë¥iÊ7ØŒ·i-ÓîÎ0tŽ‚[_ÔÇ6O»ï³Ùk•xðCK{Ijº íaL°Íë¾m.;­¶WéøAf„t o·­Ù~·Ó0¡••Øù#­.e‡4¡Ý²ôÚ _ìB’a 9èzé‰Gø=埬9ì/«aWÅûsÏ+ár‹ÓÛsÚù‹¸äŸ;¤™xqå.ìÓ…Ýf_ðÈEßnÓì#^#o»´ÝiäŽ^@§† tGúOÈŸ¦þb§ãmÏCgQ3\Œ#¡ˆ W—)“Ù#³I+æsfw÷ñÒ„¡{vσ,F¥–é Ÿ°ÑŸ‹níúE}jÚ*+ÙÐJø=€ª|!:4ÞçuÞ¦=: ·«‘°éíuäY?ˆê#­°>HºÚšÛ3¹`·èø·wso¾kØî¢™Ýi?òŒ‰FûÌ˓ǚz]±Ò(ðLàk™œžú¼½ÙS¬Z ?Ü8ä¹8Ͳ< 7`;ãNC}nA…Ñ~µE}CÿÔ”eƒ÷z? SÚ³Qb—r¨Òxûl‰Rû1Ð)*iòþ‰n8ó®+ð¨i0~L˲“•ü²Öß²1‰¡mc² ç<|ûø€¼R½ñãÄ ÐÚ ðÂÄ÷7Çêá÷‡_~S›ìAm~xPà&ãpóåé$ñ7ÕCèQº~ùðÓÃF‚û‘â~Nòråó£ù (Td§ñ„ùGò¯*Tð§W smè¼q•÷ç&ãëÂŽ,ÙWEghX‰Êý‰× ‡‡d›ó¤,,C‹ÊžÜ˜ìet´}?€lòìkô^b<8\¢#‰Á†ZîXÈØ…Œ曹—ã¨Äd~ûPkÖK£í¶»v}^ÝRtgBÌ:ã±€¨ç2¯¹9œ„òÎe#:¬–1ã©èÉõêIÛ1ÕX/ˆ?R­}™vIÛ´B¡íµ¥@ %Œhò -ä@`øÜ\¤E·¦ã¤ýt0jˆ5î›6#AÀСèe>‡ š-ŒDGÜJ#?!SN`2¿òÊ[àiSÑÁÌöûZ–Ö¬4Ö6±þRiÒË¥,Žäñ–T¬_Ba°<6„–‘R|«›B°IpÀϵ ½Ä’U±¾Q;Šû9É£´(8Û8í•V›Q#0ÈáõÑ.+Ráѩ̀Éa6~iÀK‡kEQáÃð0Ÿä× «I|Üž»<¸èÃf¼…R‚ã©êÌAÊpv µŒ¤n+ê?ÆÑÙ&ÿØí58«cSw}Z÷Üs‚< ̧ÌîhªÂ>i36ê¡:¸5¨êøËÊ?áÈÝp¸S™-ð;-ås3M»WK€^^DÎ9®}¾v}£½(ÖnVÚƒ—8 zÙ»ʾ[É3–Šìû±]º¢Ã•…¯ â«„/žè9 ùI Ø[æH&\ d§œ@°MÑՉ޳²Dƒúª¬zÏ#¥õËân€œ—÷ƒH0¿|_ÜÏ80 ñ~ÃqŒΗ„¿Í4ˆÞжb̼ý‚là£BeKÐOk:žJ)âiÊ…pûëDì^YoÛŠÕÔÙDzħ}?øl:RÜÏIÞûPí+/Ñ £qÚ+}¨À¼€FoXw¡~åœfN'%[Cà ÊÆBñ}Þ߲Ȩœ=`ô¿E#ÅO°È@JÇÑ’CdPŸäP¼àкIÅ>x/ÝÇ å… œ›ÀðI¢ä³ïïîçéú‹&ÖSzÚõÖ¹-Q62*‘K#wVpÄö(rIØòš6DžC;ÑYãð>ôApÔ…q½£ÔPði* V &„'¯r4­}/k¸;Ü©£µZF"M8¶ã½æº ]3c2 ôÏQqZA°ï—Ä–½ZoÈ®¶ß÷#6çBŒ1žVú&›¨Œ.QȉAJ‹lRr¿mž Ç\ÆÎÒXºÓÙì?ó¶AÓõvIȘÙ4.¹ÓŸ èuÜátú”ñÂÀe/ïHÞWvDG££vƒ]Q]J™Xåi½Z–@Œ‹Òˆ-¹cÉ5íugí|Èëfxx.L&IB{QÒÀ•”ÚãNí±%E˜6=RdÀ!J}àò‚EbMßÎÒ€¨€©’Üçßnª#€÷#–µ0/“W2(´í¸°s¢í.2ŠCQýU#‚¬šºèG²쨓8H¡õ^2 ñy5FjÒ­ŒÇAÓ‹LÄ ¢B¾èyÂ(½òŸ_•ò¹ÛîćûÍ!v¯–Ù 7kI$¯G+]_´k®Ë@­úÇá2±fyŒŸŽV‚)¢8'»$žô^pkèØÁ™™`òIÚQ4CGéŒÏMGš]M“”¾±3†(aŠ+!ŽD¡%˜E3g%G!\¥×5f<Ϋ ÿ´”úÔ¶ÌSª´ùbÞ0”–\ñòµ+0*§Á4ítóoŽC„¹|,me#Ù'`™Jx§¡Gá󺡿 \SU\{”)cñ zYþ¾!íìx™œD‹}]_¬—Ü-¢Dt=q†àä‡-ºES9ºuSïÛyÖG¹!£B^Jî=V¦KD:þ]äá¼ájî[M&Öc½£h_PR{6ô,ÇEÒ.ÇÅö!ó’q±×d¬eÂåDI îðI{&öo*ïHåß"³îwðíø ÒþâF¾“¾eæÙo?ip ›3SDÊ€¤0ÉõåµÚœPÅöÕ<ƒt\/_f‰8¦+-XÃT‡`Ëéÿ«Îã‡^¬G»’1í´ÑÀÑýèóK)#ÁýŒâ=Ä bPØqßW%Ú‹ã&…û Œ½P…œ}\ý1ݺJÌ[´œ®‡=_Ô!@à[LeÚuSeËG‡ÇÝn8ÈG\-ûÇÖ‹­rêø)ͬrG• –„²Lv`WN•¤K:Æ×Dhù„3:qøT6X=uT¸<èÜš©ÌJœÖ…Z ,”pIºUtò°‚Qt|†4ÁZÍ(œ1ï>p‡=Âï䲦N°ÒýðÏ­Ó*G7ùfd»ÆÐ qd&póË ÅÀ‹¢ÈŸ;rñÇâ‚Ckíü…Ë•}È%&Uümå~‹}žKI|k ¥4ÑÒ'r9AÇÛKJ®ëõ30XóPQ¯Ü.R^l”ϰÿ…EÓѹÊã/Ð=ÈæéÐ7ˆ_ÑK]yà“¼]øµáD9Ð"ZÒˆÃ3tVEPíc²S-‡ê†'uÃQ.ÌG¿!ܽqÆÖÌ­<û±š…^¹U¬Æ˜°³/Ò²ø“ÜqÌEZü0tCJõ°ªï%˜7Uq….Gý[iZ–Ÿ(n%Xž/G4”®<ÆÙ¥Ð|:tãX¹³F¸ci÷ü¹è×0ØdÖ‡|¬ìu÷Aǽ§¦K“§P êÖIÐ’Ç¡A²Mr-ƒAÔ†%ÅQ§«=·/ÕlÐEÅÖšWúÏYä§Bg;ço¾·àÝD±§LÜ ÷ôcþw£÷Á (w:Zꊃ¨7WþüL‹N:Æ÷Sñ¬­†Xt=ì¢.i(>ºsµ`)üå)õ¬Òàʹ8ÊÿÚñìu\ú¡õsrE§‡NX—âø¡\»Ä>PX,nJ U“ ~^xÇ_EÆ.~ü;¿š´Í^ÆZyM‚%ðãX^h `w ÷0ÊŒN縷¸`‚ù\–/O2=#Çòšné€%)y€0‘Þ>ç~wQ¶Ÿ|ÅX¸ÿ€~‹Ü+sï«O?1mðŸ+< %±ÿi³‚kx1ÎÇÆ?×ÅrÜSrǦ.¯D‹z?2¨=½–Y§ÓÐâ»b«ßé-C-{w]p€ä.\ ³¤À.™¯Â¸i*÷BÊàý_K+C ÿžùÝt±•Kûµ’Oÿgã+~ ç;æUÆNsÚºJ—çÌ︃üI¦e×,èÀ‰Ž==Ÿa{y^\€ïÛ]ž1×i¬Ç<„fÜ<™L3Æ“Žo$–™¼Áæÿ»‚± .P¦my]F™·ÿz;Ö¥BµPð ãVùñœÖEWy·y±0ð”^õ$ºäÕôÖïg„(1Ì=Ã_þ&h¨}–®õü €ìÿ$EÙ^/p#HS½Ÿû¢ôZ‚ uvo± B  lÅÚ¸‹ü k^endstream endobj 89 0 obj << /Type /Page /Contents 90 0 R /Resources 88 0 R /MediaBox [0 0 612 792] /Parent 92 0 R >> endobj 91 0 obj << /D [89 0 R /XYZ 72 744.9066 null] >> endobj 88 0 obj << /Font << /F32 13 0 R /F40 28 0 R /F37 20 0 R /F45 35 0 R /F34 17 0 R /F29 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 95 0 obj << /Length 2860 /Filter /FlateDecode >> stream xÚ­Zݓ۶¿¿B3}(Õ±$2y:ßëKí¸õ)Ó™&™”'QÇ©ð×k§ÿ{w±KŠ”x¶“Ü‹‹ÅûõÛ=¿\^|õJÇ3¥DlŒž-73«gVI!}ëÏ–ë¼Pøó…’RzWÕ|áKïñДó@zâû&ËÅûWWÊ5ÿiùíW¯|=‹EêÉÙBÂbíø,w)l÷­÷a®¤—Εñkœ ½MYÑÒ¡ÊæÚxñŸ¤IR"HòmYeÍnÏ;ë]ÙækZ»gþIuŸ5UR=É}VðØzë¤IÄ|a¬ôÞ&Å€oýX7)1µ^ZU¼µ;µþ[7tÐk딥†ç }ESðxuzQ实Àz¤¼CR×x£²Z¿˜/xI±¦5`[Ш­é,šÄí¤¥¤‘¨á«ÎCãÁ-­ôáѳšXäÙ>kN7Õ‡dÅÃrÃB–uÝçç\ëNdf’&«ÝùÑî¬ûdž÷Ãé£÷ SX•E ÊŠÔ©Nz Ò¬ 1 §c¯JŠmJsN8ø_—wW··4\í’*YÁó×så ¾‘ž¯J[þÈàÄ4YÙõG=ìÊŽ©\hch8`|0Š;u/'¼¼†¿/Àª›¶3ÎF^Ð|ÖüynŒWÓ×:Û ­ÿ(¥^µyC“Îp°k÷IÁ”hdø[¥ûtŸ2… é·ÛákÞéÔñkwÈT/z‰­u8‰ßx%{u™·MVôåŒFFdÙð]¥¿´iÝÐGB?yZláHé@‹6zØUIÍ7U¹§=3 œË@ä@hŸŸøàª-ˆ[ÖtKUÙnw£“wI½#ªM[¬ŽR×íª#¬é÷îõ唞Ük¾½6 ­@Zï²(A7íÞ‰ð-ðwÕ«¶®ÑdÝtAÄÿh£ ê8–ÞZ—´|làÆQz®›N†×¨ãÅ{°ÍÄÙnR:ZÜã ÁßÐ@Ø‘1Ÿ± i¯“"Kó©¨óFð-W×e‘äkwÕÈ{Éñ—Æ¡g’Šeÿ,jr¼°3A¤!Š<«YDô'÷p;0yšº)¶°¾£.tÕÌz—0U¾q|ϧI¥ü8t¢4zã"jìJ]VSê%ÛOö‡ú¬ˆ8Iµæ(h…ë³+gë#GÛtrá‡ë$EÓÓëñÕT*l 008ú}»šò'?˜vè)-VÉ¡nó„ÿд@„†‡Ô¬«2,_ë®GÁ±£ÝÉæÁÓÈ‹á —9€ðcè¡Ãßð=zfãšlʾ –09¦{ÈŠ,ÐÄá)ˆèûãÞÞ:y j–—ú¤>Ë{—žhdU0Î<Žãd›U¹NDzﻲ5cÚDze`šQžøætkïüÓoÃzyÈò|Ê·˜q7mž³t‰ƒ+ézÄáEïî€]TÄýabÅAS}íz48ºD!€¢£“äËÅçfÔ>§Gr·Ì¹ Ë^¥ŸWÎ+Žæ #LOÊAË& (‡üin2ôâPbi~ eúÏß]¾½á‰kMƒ¯(üÁ;ð:ð2À!¦dÿZ’š8œ ¾KöÌm¶‹[ žŽü0š`†¬p0OçóYÀÍIIPÔIgw¸¾ýëÍÝòç»Ûñ°eÊã 5~ðäìðØ»ì?'W€”‹0ÕŽŸëlëú„8ÆþÚq#ˆðˆ¾üЧ;ä{?z"‘]uÑ \ÛÙÃ9‚)’=!µ³šÝ ©.PºFãIñ£¡€‚Ô˜ E ÀlþhñÓs\ Yºâg\…h@Na|<˜b9â ‹(²1_dÊüÁ##)yâÍã!û!Õq¦pãÿ:=i0Ò8VcƒBÍäùˆX‡v»$ÃÇŸ. á Hѽq„<Ȧ§Nø¡B~vl¿™²òhsfÎË"ˆ 2´Mõ)—>¹5 #’ ‰]XèïKø‹Ø àê×Ü æÕ cQ’;q»vÝ¡“÷˜twx1æOmmœI:".ÑûŽŒGgŒ'bÌ »lÓf”ž:—uÓõìÇé©­ª´‹ºC~=ðèó\2ØÁÙüjˆI çÀ›È*®¬•ðJ7²lÊËl}4†³Ö”¾„m1øThž¡3Ñ1\ 8žû¦2!ø°Vý¹(*šö&èIÙH=› =ÃO ªU(BcÑ }™ùFD!%4¨ƒQ€vÏÁ|æì…|3¡]ð@å&´cŒôŒ ¶¾ˆ©ŸQÁŽŸPpG…¢¶¨ÒÓ'U q]ù—žKÔžá§EÕCÈd#Q¿Š_2ڢζE­±;B)ÔkŒC Ÿgwßn6iõ¢ƒœX¨ÛÚ[Òð ­ž™@ÈÐ~Ñ㞦_ÎbgñÈè%ÿ¯‡ã›Á| …Rš‘ è©B)ÂÐïðÿoíVàMþ¡¼U–endstream endobj 94 0 obj << /Type /Page /Contents 95 0 R /Resources 93 0 R /MediaBox [0 0 612 792] /Parent 92 0 R >> endobj 96 0 obj << /D [94 0 R /XYZ 72 744.9066 null] >> endobj 93 0 obj << /Font << /F29 7 0 R /F32 13 0 R /F45 35 0 R /F37 20 0 R /F40 28 0 R /F14 58 0 R >> /ProcSet [ /PDF /Text ] >> endobj 99 0 obj << /Length 1723 /Filter /FlateDecode >> stream xÚíYÙnÛF}×WÉC¥"œÌ¾¤OvêÍÞÚEÑ&A@K´Å†"‰Š«ý÷Þá )J¡[,’´y1GäðÌ]ÎÝÌã³ÞýG„Iepvh‰ ç"a¦Xp6zÕ‰¼9{|ÿS­~…Ë=//·…݆”Ñ, Rœñr÷î 2JÉ qÍÆöQïä¬G $ š b°XŠ1œôÞ÷^½ÁÁ¨‡ƒÇ=Œ˜Ñ"¸†vLzqeDõ;íö~¬Ã1lB[õWt" ¿T«ê’ËxV¼Æ·ÉJAYL íNÖq‡¬Th$0^“vVDE\Úš ¤¥{ya§ !ùÎùy…!% t0 ®ÕNV(ÏŠy2„ãv7 ‚†×¤ÁH-ws…6![Ü,$Rš’åÉVÚa~µØèfRšt'k¸CVJ€’BÉUYoéæ|>Æ÷6»„1Œ45¼;5kÄj2&ÁuÚt¡æÈÅkÅfF›lfX"" º¨¹±;çå¼há2À\‘ùn’ Óù(vÖ»ÓÊhE–|%9ÂZNè 0l ¶ðY)$ mW›¬¸E<¹JÁzhx§Å R#Ê9ñªEÅÒîãØ-âläùÅÚ“×ÓÔ¯‹Ü]kì쌆ÅLÎý ¨7jË»[Câ²Sí¼•‚L RRh6¡;ó^+İ ÙR¡Q.Åòä•Jµf+Õ‘&mHÚ>µ5B¾X\Å@0ï¾Ò’ný—ó!D¥1d•‘!·çz Â|ˆ§ÕÛV´rù!š&ÑyZ±g‘Ï=gâŠ)ÃqÛ 7Âém‰ÛZcë$¶F’ Ìø¤‹b<ýòbž «¼É4<)‹ø×3/Æ(nÞõ0P}Rש@á¨+WÅ^ÔÒW^ŽZ+}È>£Ö²©n "lð`pÈZ\PÑAWíÃ&dK"©Ífjy²׺Ãf© QÌ R0Ö°5âa)pTB¢YööÓ“oªçÙ,¹Ìª`Ž£©Ëó09 AÔ^pïïU ¿¨K@g'4† œý'´“ S“é.ÉÔ€ÜF¦j›×äf>qý²ìNÜ p‡´P º¬HûY°)ɶƒ… ’4&Äs†¤ñ“×Çp.Bòy±‘†0/n]ûo±)èLx‡\na ßä&Ëýø×‘ 5û¶ÉYs¯!ç&扭¾½1ó¶ÃݘyêÌ[ê¡Ëâ‡õíôS²+ôËPV!05>Ö{İ ÙöïH†%ryòq²·m·Pë“=k™ìO‹iMþ/cýO9ÌõôËžëá"o©Á/IšV’_G ?³œÇKd;äæ~ʉêQ©¤H™i’+˜9¼I0v£±_ ¹ú:õ’©ß;r½ÀB=S H@¡Ñbœtðø 1lB¶•Y‚(üYž|àØ¯°Í{ò ûKvÎý¢"ˆø:÷w0÷ü1­=4ˆdˆ ¥C\÷}p—R† Ķ>Y#e??V»šSÿæ(ÆÐ°u&j ¸]TÊ1ä8eVDý,zå[ÌüÔHvÈ´µƒHŠvÈ!¶…>Š®øÈSq§]~k§»¾²ÓOÊÑ„+sË:_€,—ŸæKÓd »à0Iîg1]a»¹àý°TZ Úù¥µ”ý·#L*”tü}nJMŸ¨Tû¿9¬endstream endobj 98 0 obj << /Type /Page /Contents 99 0 R /Resources 97 0 R /MediaBox [0 0 612 792] /Parent 92 0 R >> endobj 100 0 obj << /D [98 0 R /XYZ 72 744.9066 null] >> endobj 97 0 obj << /Font << /F14 58 0 R /F37 20 0 R /F32 13 0 R /F29 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 103 0 obj << /Length 488 /Filter /FlateDecode >> stream xÚ­R»nÛ@ìù»‘‚p½{o»p• ì, y’óáH§<þ>LJhÊ®ny»7œ™»4ºy ÉH4×,]3«!‘’B@aK‹§Å É,ŸÓÇ›af£c…ýÌ϶,–±F\ìýÎeu7ݧ…>2b¤peìr^G?¢§gdE„ì1B‰UìWø@ $ᬎH“¨ãw}‹¾N€ñ„Ï!ï:E'4I[0]÷DSáòÝŸW¿B…ç s%9ñ#> endobj 104 0 obj << /D [102 0 R /XYZ 72 744.9066 null] >> endobj 101 0 obj << /Font << /F14 58 0 R /F37 20 0 R /F32 13 0 R /F29 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 105 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 74 0 obj << /Length1 1630 /Length2 3648 /Length3 532 /Length 4491 /Filter /FlateDecode >> stream xÚíVgTTÙ²%P 2M’$çœslºÐЉîFh²ä$( "JV’A‚8$E‰Š$E$J’ Jx Þ™¹Ë7¿î_o½^ëô:»¾ª¯ªöW{¯#Àca-® Ǹƒz4A\ZBê"`†@¹ûáM1hq+ÐÓÏ܉H€€€6„´”^ìA8 Â@ZII‰NÐÆ`‰8„§¶µ²‡ˆŠŠýe9t܉ ¤H< ’^®€H ¢ $Šÿ8Ђx  mnáhh¦ë›Ùú ÄA‘€…©`‚€h<<08ùsÀ0h8â°5¼‰K@<„!Ha` ÄBbÄ¡x<é@àOM í Ð0¤ü°’ÝsT‡!y H‰Ìƒ'àa8–²Zèèý¬“à%æÆ#H0€ñ yÂ10¿Ã–Ž0 %@h<@‡¹ÜAŽÀc‘P")7‰ ‹C•á‡G =ÿª@ ÀžP âñ$÷áîüÕ'ðoÝC±X$ñ(säõg DzHÐIËr¤ܞ4äá°¢=0€´ÔO;ÜûvÄmðáÌ@HE@á4’ÀA:I3 ”þÏT–øçDþ$þGþGäýïÄýU£;Äÿíyþ•Zω4ƒ¢Hðó’H· 0ï$Þ5¾~àÿ ƒ¢Hâßþêhþ,ö_|¿Â†(iS4Ñž$aÄ¥e$¤~šx=D·@`^€IÚ³#»-â4HÒöh[IARR¿`6^˜úP¹Ÿˆ†ÿZ>I®£â%u­Œô,Dÿî†=ò´ MÁ†ˆ¥±7ÅÀÿ\òhia€ qyi@\FVPP¸(JK‡üMÆ#é¿Ö¦P8KIHII¤ÿ?ž¿V—~¡ÑEÃ0ðÃɱ&@ÑpÒ°ýi8„a~8Iã£óOjúõÑØƒ`£ÂÀ”£¼3îÞ!T°ç´uë8·<“>Þ-ª²¹Ÿ^†iˈ›Pzxy·0ŸeßȪ9¶±wwϳ”ÐZ?•x鯙)’›á?Ø9Œ-ýzfÁï,O/(ܽ´2)à5(ÔJÝ9çt³Ý«-ª2Ñk\h½åëKîÄÏÇ0ŸÇí‰*4ÙôñÈ¢§§^G5ao*͆ՇÑñíçißÞ-¼ÕÀ³y ?ªûüu­ÉZYe8Ÿ?;4Yy5Õ:ÒÈûΊûÅ\öÌ/ºOÇuø5êK²LÄ'Là÷”i‚˜p“7úËÓr¦ÇðþoÝ£!ëU;O±0EjÒâoUØò_ùfQ?É_ÙL”U‡pfÌhÝ Ë¨²çÙ„L{<¿þû<ª#…yOË•Â5Fg-£¹6J;Ä"¦Áž©Lóvëó—P[sòy±‚>µr¡˜•ω³c/éTSkùÕö߆ßÒR®½ ey-¿È(t~ócðN¶ •^¤ô+ê§Y[=O8½Õܱ4BÌJ¾åNr«^òoFùÜLcÊ ©5ZD—"¢„ñÕ2ÓUqo²©‰Í÷]¥q›-¤jÈàé€8Oó‹«Ž½…Ö¼EÚ|âkŸ÷ÉÕΩè u“Q1Ó´þî²A=y3©…-•kWXûx3<*‹k fîŽ]k/õ|Âth jûŽã çt®_òIˆúEQ9•,UFøŽú"5Iƒmc°Kó÷ˆR]..zŸáÕ×"5·Î„ªÔ•ÏMqlbɘc=ÍqSdü%òaí@FÃ)q¨‡¯“Ó»—?æ©÷ÅýJi/â—æ±ÊíòÞMïÏø16Sû© 3Üj¸K|j^ ¿0~\Âú|2N/$ÂäAk‡ÉùdH¶º ]Š¡Žm Bɼ[&QS¹ ýZNWKœ_•QŽÍžpP£Jã™ÅÖÒKjOâ Í‹:5YÑË™BÅM¿Ðrøð²?œI²Ÿ‚4dB_æ}ةݟåzò &¦ßL@«ÈˆÞ%l6‡Øó¥jo$Z$(Ð>(œ¦XÜü„EkIñ艩>ƒÇp†«/Ulžá CpÊ3ÈÊS…jpO;FÞöËݸÏ=©|Ÿ©B~&æû¸žë%G¯Zq¹W-íj²ùŽ{M}ó™Ëßh¨ ’“*%$?¹”á—ÓŽ]žÒÙò¸äÆ\d×MqIâÆõ¨öëïbâw™Ã+†VÞò›yÁ[=ânÿš×Y6¼a‹Žjê‚QEÍî|kÈœÜCÇð‚¾­Ù;¢|Ñ™&kÄx«“êgiŒ?í¦NÉ *î„mWT°-vmÓ_ׄ~;™ IT®Ž¨Ï•·“]Ôh’é3z»¤KI¿©¦aÌÆû Rœ§]ÈØù¤ÆÜ”Æ>cÚ±fLJvô2YYîç÷Ï ®Œ4žº8¥%gÇÓ—qøðŸd䓊øà¹oü¬ €ÊÐI&ú#Ãë7$‚lðÝ÷Lî Q˜ù5´ÊWÿùa`çÈ •Ø’åM €õ;¯úJ¹#Ñøm¾ÞеÃ^~6%©xÖÑ:Þ±?$ÄÔ™º>ìä³°g]hkkG“9Z=ºS'Ø`=¤yYm~Ã:»¶ž¨YÐ[δçwµñ½ ¡œÔrËæ¾Û;ŠôZÎeó5;ÖÍ™åö»VÃdê«!n£²¬®Xú|÷ê^#¢“öøì¢/œgL{ÚEU–×¢„ Z­`=)yBný Ù{Ý8åô æ ç‡v“ÚpÞÓ–¹èŽ”8 È*"¦õiPâOl[6ËhærˆmÛ†mè•z"G­øi£ÐIVrIkË}ÂÔ#íÅañR£ìÊ& %½‚ïàY¹Ôc0Bwun#¼3ejâY?µ#«KÜ2¤q“W=bCƱjv²ÒêT©PmÎ0 NHgiZf ¯û¬òüض­q¬Ño¢©ü.]F{ÅŒœy:¼2¯ ““ùTæ~ò<ÌÓ0Zn‘É®¾~¶Á©HÛý°WŸø_é·\#/á@é+œ\Ì> A$uE°þ.tŽ6%êä×´ÎÓd/üP:“Œ†¬"q²ºv¥rä ð±>®@«½ƒ¹ü‡©Mïb*¬UBI_ñm“ã'ܮߚq?øÏ *§ûëel{ûî@ÁRµJO*UܺÉÏ+N™kIã=F~+Ì  Ï}¢qÏö:ÿšfYuyù¹Ž]±œœÖ åãmBþçÔ×üƒ¾ËiÑBÝ\›]Î5Š>¦L\NhM¬n¡Þø$‘{€~7]†›ýa¼ÕõuOm°ãö¡c;`t´_éëÿ~‹ú4`JU=DÈyYQÓIv_ü”1"šùYÇ—Ÿ**kmrÂ[«©ï¶f(Ž ò±„Üæ¸¿:O´®DJ®…üFÆ»oŽä·…#ìfÏä%Øê,\Hj[å1*Éf×Ü”¼äžš6*I!—/IO¨b^Ibî†CÅéï×/PœUÚâW½Ì°µÄ~·Q9ÏÅaW_VQ7øt¦@oN²º9^ÓÉýd Wlÿ^oª ­Šqá-ÎF-ÇÖ8Ë¬Û¾Ü ¿UÅ„ŽÓQžXu(Zϱ¸º²O›xŽaŽy¢KÂ*wþéúk{Adœ—QOÕn¯ñ9ôZ‰ú2)t§ì²»üX4°é¾¿ƒUô6ç9KFÖ›åêw‰_ðÄj ‹F¦º÷§•þ¦Ó* zëM;ÇEïÜ«FÉf}à•¾û Ï'øÂI™K¥Ï•E¯~îƒäÝéÆQ mÞgVÑìüçôPJòc[CÏ´{P7’’e¥ ïÞYO‘k·*Üäo¢çÈ"ò£Xù³)Óº/ÒsCŸ¢®cå,=#ñKËŒ’†»Ѫb¸Z›3òÑ Ñ.Ö+AªnsTnž‘;çÔ3y…a‹¹Ùð¹’™Ò~Xæ6ս勓›Î’äe«o¥E ’üˆ&îô|R{Îu Ž…'a¯ˆÄOÀ<¾›Ìö÷XÿdG ÖÕ)‘a½LÏc;Ô)¾%l nfš:øEÀ]Ï:RÄ´ÐHí^y|ŠÜ7…nZÉý x ºœüÂ|ηaoØ* ñQ\ïÈR™ò»‹›¾tIváDêöå4Žý‹kbCašgx5Ù9çwwωt-”ª{ÀíÉWW´ˆJf1á5n¡÷¦ž¸Kçw<]ž^o{=•þr–ëlÚÔc|MAÕ|÷%Ù¦`Ë6wüçk¦äwmßµ}ru(BXoÚGú¬9èóJÅ~Œ—^WêŒ{L=S4õFÒ›Ss6®õùøxÙó‡÷®{ÇØ„¿H73š ßu*A«Ì™²^À†öÇ Ô\ž¬ZÁ{­N¦à\#KÚÁ!6ç§ P®3D¶ô÷ü»í\=©kù ½Þg!ò>Ì—nò¸eémn6ÖÔ èÜØ…™¶{Dìî7©?p£ÚÍ`(Ò½')ÄÞ#RgȶP—— mÉ,xéOžÝŸèTGŸ¨`¹b±ïÝr*ÿıº‘ŒuË/´lžùë¦.éìU•8gQCs)¯!Q±>ìj¶ôõ.'Â|"•'«F¢ 2ЋÉZÏéL4—±ÏÓù90ñ2¡4K¬™AäË[¶çÒ™œ?å U:7ãÝMæ6/ãlû3r]ƒûM¿IÛä§÷¤Ô̈:Ô¡ºÔn¨ŒË/uwóI!¾ 1FVí˜Øå50'Y¤P÷í~'\i3oøV¡¯+¥Ã’碱“^;7‡ñf-²L¶m^×.3žÇ…B⽯KÍ¢l½ÀUCó ¦ˆo±g¥Jƒ—5¥þËÝÿüŸ €!A(Ž€AAq>tÿ.„’´endstream endobj 75 0 obj << /Type /Font /Subtype /Type1 /Encoding 105 0 R /FirstChar 78 /LastChar 111 /Widths 106 0 R /BaseFont /ERJFPX+NimbusMonL-ReguObli /FontDescriptor 73 0 R >> endobj 73 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 /FontName /ERJFPX+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 /FontBBox [-61 -237 774 811] /Flags 4 /CharSet (/N/e/n/o) /FontFile 74 0 R >> endobj 106 0 obj [600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 600 600 ] endobj 57 0 obj << /Length1 750 /Length2 576 /Length3 532 /Length 1110 /Filter /FlateDecode >> stream xÚSU ÖuLÉOJuËÏ+Ñ5Ô3´Rpö Ž44P0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22°25çRUpÎ/¨,ÊLÏ(QÐpÖ)2WpÌM-ÊLNÌSðM,ÉHÍš‘œ˜£œŸœ™ZR©§à˜“£ÒQ¬”ZœZT–š¢Çeh¨’™\¢”šž™Ç¥r‘g^Z¾‚9D8¥´&U–ZT t”‚Бš @'¦äçåT*¤¤¦qéûåíJº„ŽB7Ü­4'Ç/1d<8”0äs3s*¡*òs JKR‹|óSR‹òЕ†§B盚’Yš‹.ëY’˜“™ì˜—ž“ª kh¢g`l ‘È,vˬHM È,IÎPHKÌ)N‹§æ¥ ;|`‡èG9zG¸:iCã,˜™WRYª`€P æ"øÀP*ʬPˆ6Ð300*B+Í2×¼äü”̼t#S3…Ä¢¢ÄJ.` òLª 2óRR+R+€.Ö×ËË/jQM­BZ~(ZÉI? ´©% q.L89åWTëY*èZš 644S077­EQ˜\ZT”šWN+Àà€ñÓ2A˜šZ‘šÌuóZ~²uKÖômm+ë\_XŪÏùóÄÚ—7ÙD쨛™Rl:/P1½dÉ«…¶öϾ(á•l=U¸h‹d¯_OÜ—EÂk¶v-X1¡Át¿Þ`ñÊæ®i¼ÿ´Õ_y. ›1§õ‘´Õþ¢Ç³:•un~Q®?Á3/å…SÔâ}ßï]ãÒ š¤¥$e~sû]F1ñÊ»Ï/ËÚQ?ý¸mò»³·|<ċݺÔ/¦Ùq'}Iüö„+6­ìâEíÀgޝ¼xT.‘òGÀ¿gtÅÙ¥vÕG‚—U|íª“®¾~ª€]üRÇëÞ…_kü9¹öË:½{ápËñGúý îûd}dN<6Îø-uBÛošHºÁ=c¦MÏvHžÎzºq½aûÿìRKë~,KÌž³}Š¬Ë›ªÂå»m¿‡Š÷Öêyo›ù~ÉîÃÜ×v‹ Û_¹éÜÿs>§ß¶.#ßҭߦíÈè{­/þô­É™kÜ—öÉ\mü|¢Ðr¢úÿXöÑñßϾØad­j|ïÇéÖR/ü,2 p0, HÎIM,*ÉÏM,ÊæË rwendstream endobj 58 0 obj << /Type /Font /Subtype /Type1 /Encoding 107 0 R /FirstChar 15 /LastChar 15 /Widths 108 0 R /BaseFont /ZAKXEB+CMSY10 /FontDescriptor 56 0 R >> endobj 56 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /ZAKXEB+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/bullet) /FontFile 57 0 R >> endobj 108 0 obj [500 ] endobj 107 0 obj << /Type /Encoding /Differences [ 0 /.notdef 15/bullet 16/.notdef] >> endobj 40 0 obj << /Length1 865 /Length2 2650 /Length3 532 /Length 3265 /Filter /FlateDecode >> stream xÚí•y<”mÛÇ­Ýd&Ô%¦,13ö»É–h¬Ù™f.LfÑ4DdìÔi³–’DÈ–(kHFÙ2I¢¬½“û¹Ÿû~{þ|ž¿ÞÏ{]ÿ\ßã8Îãü¿ãü|.˜4ÖVÉ@= šP)t%¤2 `,-Í‘€õ@@`0 ÄщTÊ1DHJ8îOTT„&Z]­® ª_èíCä0ò?‹4C2H#âqÀG÷ɬx °¥â‰ =H0$‘›Ÿ+Î6à9”!H$@ âéÀiЛHÀj2§xQÍ?¿?S íK ·#S`‰$P)¤ €zAàVTÖn KËCÖ¯ÍMüI$+ùgû§þ-#IAÿ¬ ’ýüé °¤@å×ÒSàâ,AÑŸükÖœŽ#ñ†o(!Õ”jĉçLˆ K¤ã}/é¸)„_•°üÛÑÇ:ZŸtÆ(þs´;I,ŽH¡Ûùâ¯êFþÅ,“hÄ@À¡Œ@ Y…¬÷Ï/·_63¦à©"ÅPQ×p4.ºD,R‚‘‘B0¥®L¡ÒYK–3/* òs®Üègh‡4U¸ù¿ˆ568î/Òà§ÿE¬épÂß ÀÁ¿uZ8åoÈÊRÿ†(~~ÿÝ8##j`°’ª  ¤¢Î:BM ÐTG\ü_…x ¤Ðw.'Ëþ?Ù‹Èš‚xcˆŠ×Ž>“QSjœ×WÌ-N2³ ºë饪Lmå¹1máAÚã^;ðÀ’Ð%¡3ÄÁôy‹28ÁK}ZmÒl ¿4,ÔÎ/*ŸsÃö·üœ«;GGÖóòí¸ÆA¦ßcÅ…™•ñ€§Ü'f‘š¹Ðùx®¢7C[Ë¡¾aÝ Þë™étˆ[V݉k Ã‡ñÔÎõO¦Ô<*ãn‡¸ë‘m´e´ß÷&*!Ë’óu¦îæn„| ×d7yÓ÷ Ãñê¸-šGRcÐ!;`Û¯+é¨W[caù™gê•Xšm_9Ç)E­›úrŠsò](÷Àåvi'œÏÕº¡¾Ù¯AÂsrþdHíwKÀõ:\t¨ð² C2‹^#gdµtV¬¬i¿âjȆrzFÑ™ÌýòñYcÂMwŒË˜g½ÝÅŽÒGMyÇDJc¹ÜÚkLLòdkx¨ÃSFâÒz"’Ú{ ]™v€O2£¹?0õ“OCˆ°úúšT Zãvÿ¦ötoº}ûãù ©Pîé( ßdåOv ÁZŸ9ŸZ”zõi•>l!v$ƒ`¢dá[RdQCZDí¾VŒºÿÉ™ÒðÕ°¦Í+‹– TÈY„­(È?‡y¼,]¤ ¦b7r=•iNúõ-…Y¾ RÒC]ÛÕ{»_¯À&ÿnpJØÂâ5©8šwrx õ3¾ú#zuØÔŸWȸ¦Ë…A™)Î}1ADME5ä ùËè:–Ök„V4½ÿn`­¤"äeŒ 9)ƳO®Ãµ¹äRQA”Ùa„ó–cìk·i5ÿºÒ^ë—cB‡ÝÛz˜—îeTiHÓO|ÏESl›W“Ø8F¹¾/§ïc®Ð"n˜i>ÊN&è¿ËÁ:¯æ¬ëŽ¿Z÷y9ßý¶NÕÒËò‡‹í5Oq/ÿDh˜ÊYö¢(Êìý…óieC¥±oƒ+H:&Ìï*˜;s´AÍ´ñzrH«³»53f¿t4£hb£óx<ô…»8ôC<¬h¬ÑÜS8Š@ñð2–ýFã/+»v/öæQ~+eÿÈü“OýöÍ,ÌXR9p Þ* ïB4¬zéfƬlQ¾ #õ¦Ò4û‚MZñè s¡l÷ݾÃh(Ì}ðæôJF»P]:V{vÅOGˆãSăƒÍ¸#Ï{Rùj#±’W²Ãáâ°ý3!§óU¤¦›^?á ®h{1ÄÌ2‡Šñ¾[HH]u 3í±ÑèÔ6í›°ôÜÝ·u¶ûÛl›pýéo4­`¾šÛ½Ó¨•6ØÚžåÄ9]= ò‹þèè“w…“n¢œ1Ÿºs‚N;°‘ŒìXUæhR—O¨7‚}0ÚJç©^·9~¶ÕRžý§X)ÕÉ=»Q…Ÿæºa×Ô-Þ~(¯¶âólÑێ퇫¿Ü™1×ÛÜâ ©3ŸIÝzqx2êÄ…ƒå)¹ŠÏlö mkö–¢Ä•M&=ÎçŸØJ«ÙŸl¹'l¼Y›áÃüé#Í\²^{Wú¬W¬/Úl+¦±F2°”«¹:Üý#F¯'ô²1Á­êýÅÑßàbÕgv?- 7û–g’ùå5(åXÙR'/ § _¿]ê|goßöê'³~ü·çÔÃ$V;gÆq®ÙyûkëÎ.}ü>}‘[åÊ‚$å‡V O€N¥£¨y™ˆ¸Ü•FÒË÷bœk>þ ¡)Óä0Ž&^r1vùPYvà½À)tšËu‰Š4~F‰eÅj^œ@hep Û$TG:‘ærJ{ò¡Û­'þÐUÈ+[¦ÁÒºY†˜Ùn˜óü£úù(»ËïU%¥¾a+½{ÃÇ?*äJjËæèÒ{FÐWîz8XŠéða4eõ>O„XYg,ëtøÙ±s"@ÓTVXKmõÊ•£œû5R„ë¤ùИ[‰=k=ˆNã¡ósIðfa"¿Ó¢¥ä5 zã ã çõX$#|~׌]TD¾y3³?Â48Kq~ïß #EƱ£¨|ŠV}þËöH´é žÎù¬|~¡à=YÑX%îçW›}{¿)+nj‰’U™Ý*{+~óù¶<‘7º«ìnÅ,žà³`‘yýõ÷K»‘ö6u»Î&^x×w!“ëi”¶ÝÆ»‡|àÂë Ì³[æå¸ÂDŽš{î›~Þ»ÀAa³e³¼×;é¡„ÞñsªÑ› LLø-Xå€l\ ·iÂ`ü^÷£‘}É©j>£d¢´ôQdÿƒü½÷x¿Hä€^yâݘÑíÖ›ã­$m2‰Æ•ö¤8Åì¶#· W¼ ´kÝ6™‰Î6#ûûý{\Ê÷uHKK`§Q3Wí£0X)©µ²)¦êM}n}› àÚ¥Ã]ô†Ô|}ûÄëÜŽ£ê9S³&‚Oš6$;…''mr·KëjÒÈ=c|#©RÝlÆÌ3=ó?rz¯’~óD¼Mn`SGCòôvs AB×ÙÜ€æbÜt¹ê/·¼}wyîç $5M/ΫʠçÕW2œçfŽê’Æn$ i¯wñ¨‰"˜×6>ëE÷6䣿m»/͸è‘Û˪ãK¸*#ÊÒ9MDÞ”}´uÙ¤…¥S £d3ðXžwÖ»ºZ?~sÈà¿èFmZ8 Âûz4#Âzô^£»©æÈ" XñôjüA· ¨Ëª[„Œ¬rÉI¸|'ÓwÛN¦×½Ñ餛ýK†¦ãÑÖLœWÞ—ÆÙ…*Øî:ôp•“-IQÙ®i·ÚâvçZã—uÄ÷hÃÁDÝc޼éåw®§ß-Sÿ$p@± f *5ueèorpqt«Ä±¦3æ¼ÔÓ+?[Ük¼ðt©ð‹È«°©ùZ»8”­ (S`×iC´8³%¿±°Âí„/<˜É6ò5>——-¶€Å¤¨Mº ¸-ºž\¾µ2W²OMKû¾s니8 ™gzn ƒ_•t³:¶[³±¶Ý‡ëdÛÆÌjàö“°àæÖ{IõþĦV·*õN7]ûC7†ò:žÍèK·MÁ- nÔ3úìê§âï?¸š«‘¸qÌê0&U¡<ÖTÄxdwá¦Ð¾Æn÷ÙP•“úw¶…´+%,«î¢cÕ½'½ Ôßs­Àźåë¤`I¬«o×…ñ•¼û2žü¡ CP¶—8MªC“–ʸU:špêé˜y+Ô½|‹ã wr—q+ûÈãsŸçgÎt<ãHR¾NÌ÷¤ú¡”QiÖ?´¡~’^EŽ•ñót—‹L+në=–.œÙb4Oëî.¿l–Ë=œ45v;òÉDï9²xPbŒuêÄáÄ£xd•obµý+èJÖ¶'Êóã^Uâ?| ÿßàÿD< ÄÑèT2Žæ ù¦ªmendstream endobj 41 0 obj << /Type /Font /Subtype /Type1 /Encoding 109 0 R /FirstChar 66 /LastChar 119 /Widths 110 0 R /BaseFont /PXQOZC+CMMI10 /FontDescriptor 39 0 R >> endobj 39 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /PXQOZC+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/B/I/a/b/d/e/n/o/w) /FontFile 40 0 R >> endobj 110 0 obj [759 0 0 0 0 0 0 440 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 529 429 0 520 466 0 0 0 0 0 0 0 0 600 485 0 0 0 0 0 0 0 716 ] endobj 109 0 obj << /Type /Encoding /Differences [ 0 /.notdef 66/B 67/.notdef 73/I 74/.notdef 97/a/b 99/.notdef 100/d/e 102/.notdef 110/n/o 112/.notdef 119/w 120/.notdef] >> endobj 37 0 obj << /Length1 786 /Length2 1384 /Length3 532 /Length 1959 /Filter /FlateDecode >> stream xÚíR{8Tëm·&iDˆ.K(—0ƒqíâ’)i\QcÍ2Ö´f­±¬qg纹³ÍI$vJÇnìÚ{:Ò&%Úb·KEj‹ÒÅ%§i/:ýœöŸçüuž³Öz¾çûýÞ÷{¿w½ßg¨çíkæÌà†f s†àÊæ0èÜNw¡ºâ—€1t —€†½½%À‚ÂÈ ù90­˜–TCÀÅá0?‚Œ\çH¶€³Âa‹l. I ‹¾CDœ9àŒ gnEÀ¢ <â™S €ƒña”j1gÉ ÇÛOmžXôІð(Ò`4oÓ Mò0‰xP8ÕÂ#wƒH/ÿ [_гÄâÉÎÉÏõ'˜+„‘¸0¡HL@8ÀÆxŽ~I €>ycCvõy…·Ñ¿a¥z”æàèóÍei6¶¬RÄ?ã@ÃZ+=­8²6Ó:£/†–L¾ïçÔdA†òÓûã˜L¼ô}¥òñ¼ÙÝo—Ue«­8M48Û_ÔTeЖüíc˵z§2€ï‹C ÷”9íî©õôúòx·=·Æ´nºe²£G×_”ê}0´ é¯Üceº'¢jûÝ“ô±c•X]Öº)åøÙ ðý ™GÞ×ûG—äY;w)è-¾(Ð× j--ëÒˆg¨N~ã¯ãœL]#Úœÿ1AìTâœTE…£½¸Ï${…-ZÒruƒ÷3‰–Dºj‡G G ·X•í4þÈ%;μ~`wwÏŽ{¦›í· ±ÉpiŸ&ö;qNñmt>‘œ2˜’›v“®ë¾ls…„j’®’ÀõO¤o:«X£ê馪¥=ôãy“Rƒ:Ù¦sí ñ޳5^/í;¦…~Á ²I¨fOéty¾?ò˘²Áh@Y¥ñC}Ú¢ÍWÿb„Ûd;º}Ší6õGAV³®kÞa`ᨷÞãŽ\VdÅ©¥ù/)y'§¡€É1mký øE¥Ü…³jKŠm Ÿ¤Œ+j¸û< Ë[ž ¨”Šƒì¤ÃE&§›õë”̼Ó.¼p²Àû‡‘oÆ/&6µuºgwäÖÑ¢5Š ¤gúÕ»îgh$hP·)F ÿ6õS’vfCZŽ«œ›Ê€lÙ«Êà‘N0óõ̆±£¥ÀñÔ+¾¯^5i•¶™Zðø™¼å1–A=¹Ãæ¦ê´l۵ʹ’ÇE}íCß^ýØê¹¡cßaêÖ]ÕµMŠavç”ÍÖAMSª¡=ïá+†Îź¦3E´³o¤ÔÃRkFÛùžýwô@ %d+ó•fÓdšëðõ'ÓÁ­™›Ö­8gmT,@ä¦z'wä]g—+u_°;tù”—æã!ñr ,٥㉶È[a A3S­C³ê¯¶¹E«œîZ±1À ÎéÙeo1z¢L/qÙXf 6‡ÞNŠYyõL)~~èžôÒ \Ý6¦™ÊÖ#Í’âô–1ÚYUsõ1v‚½U"0êÝkèS¦~¤ÿJä$N¼LüAgÂÂ7ÓñàÄâðÊAÝ7¿Z\ØûJÅDçF‘C‹ë>®÷j´wÿµ‘®j–7Û« Zƒ çªGºå*6d™~б[ºx6õiÎ5냖‘Àªe5¿ÝZß®{ èäÜØ¶° Ùã}§q®~b ÿÎÀ¾8Éã¥{¢m òRøœÚ»³™ÊNyµ‹GÇè” Îª6¢nJ*;’š'}~`ÜçJ»¶©2±ØµóÑ­ÙCévÓAà•©Ð5ê—üdÏÎuw=‰6Û|r ý o@o‡Qˉ˜S|3¾Zr·c¥D«ê NßÊx2§s·ÿbnwïMïÙ‡ {ç"¯ÌŒIÕî u|A®Õí,Ÿ¢ðK§nÛÒèc*Z~JDø6ýZâ²kƒHA¥ùšÚXkk®vèÓ§¨Þ];+Ñ-Íš ÌÖ[/)%%é»Ð‰ö?Üààziÿì±¾{÷ßî)ÊtŽè]îüû ï£[Ìj]SŸM+·×M×¶kh nßÙÔ}\°â©Û½tpé»i…©²¦L³¶¢ÿ{$0f¥yk¦ÕøºÂ§kõ­›Îì’­[xë«×†ôÿð¡þ_àBD .N`B.¾ú;bü™endstream endobj 38 0 obj << /Type /Font /Subtype /Type1 /Encoding 111 0 R /FirstChar 34 /LastChar 49 /Widths 112 0 R /BaseFont /BNSXIU+CMR10 /FontDescriptor 36 0 R >> endobj 36 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /BNSXIU+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/quotedblright/zero/one) /FontFile 37 0 R >> endobj 112 0 obj [500 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 ] endobj 111 0 obj << /Type /Encoding /Differences [ 0 /.notdef 34/quotedblright 35/.notdef 48/zero/one 50/.notdef] >> endobj 34 0 obj << /Length1 1606 /Length2 10873 /Length3 532 /Length 11714 /Filter /FlateDecode >> stream xÚíwePœí–-î®AÓ¸»»kpwoœÆwww'H°` îÜÝ5xp¹|ß™™3uîüš™_·nWuÕ»åY{í½öûT½Td*êLbŽf@iG˜‰™• dã`ææªèR`w´·¼;¹¨¨$\€¦`G¤)ÈÐZ$ævv@ÂÑÉËÅÆÊ  ÕTÓ¦c``ü§ç¯€™×¿GÞOºÚXÔïî@{G' üñß>¨ÀÖ@€¥= ¡¬¢+§$ •QÒÈA@S{€Š›™½9@ÁÆrÒ,]öÿ0æŽ ›¿Zse~Çs˜\€æ6ïÇ€žæ@§¿BŒ' ‹ƒ«ëû3ÀÆ`åb ¿Ïì°™Û»YüEàÝoéø7!'Ç÷ ‡÷Ø;˜Š£+ØÕÜÅÆ x¯ª")ýž`kSð_µ]mÞÃGË÷L Gs·¿Zú;öó›Ú€\` 'ø¯Zf@€…«“½©×{íw0'›¿i¸¹Ú€¬þÉ€à´2u±°ºº¾Ã¼cÿ5ö øOÝ›:9Ù{ý}Úñï¬ÿà`vÚ[2#±±¿×4¿×¶²!±üµ(r KGë?ünNÿsºü= Ú¿v†î„©…#ÈÞ `´DbQr¿—Ðþ÷TfþßùAâÿÿWäýŸ‰û¯ý§—øú>ÿ+´´›½½’©Ãûüゼß0ŽÀ_wÌÿ•kê`cïõ_dÿk¢6ð ÿ+9°éûÄ@VïR°2³þÃiã*mã ´P±›[,Míßgô·_dt±·ßµü{Œ&6VÖ‰iXÛ˜Ûþ:×?B@Å¿2—çoÞ,Z2òŸÄþõ6ý;Kå]u°†—Ó;±ëCÑÑâ?Œ¿0ÄÅ=>Lœ&v^7/€—‡Í│ö7 Û?mES°‹'@ÿ½eV¶¿ÿ·ÿ?-Ñ™;Züµ%ê`SÅûbý‡ã¯°¹›‹Ë»ž¿ëï ÿ»ý÷Šž@s¤¥yGsPÛÌœ,p~Áи¤~_ôP˜SÙw’¢ÀÇî€ÌÈM¾*“çÚ0æ†_ü¯­^sÇN/»òô{#=xö4ÝéÀ³ÏÄ~t½E˜kÔí< {Á,Fe¨Y'Ú±>ç³ 0zܬZ{[ãªjF_žáH~µs¸ œßÑR¸âPÞ:¡ù›g|KÀíÀh€Àª+>>¡N9¼»¥ø1<4Ø} Û»KÄŸ€H%àƒJèœO$¢§YåE?·Ÿ=:n'zÂjÕ=$Ç{ƒÇ½É)°V5äáw†u¨L¢Ž<ì¨:DævjçâÜ›2ÕH8ܾÔ`IÝIvUÝþ‚#“rî&lL¼Ìq(äY˜‰‡b9_7'ç—×[ Fê?¸Ü,ÛBÄ— g …è >RzÉMÕ:rÒ¤µÇQ~ž6SŸ¬q§ÄðêêÍâûšÎŒ\ŽÍ•‹[ç ž; '³:ÆÌš&.ö]»ì Ѧ&šaözýÒ!£é1x"Õ±÷GB-H›~ÿ»€º‰×þ½Ùì°ZÍ® ÄÏîiaw}lCSà´’îº×8õ@Àħö LÆOpã¢ò¶Œ6×4’(?D³–ÛJpe_föb+äu¹‚­þŒ£U›Ÿ™À´y¨­ä£¯ðük8<麶V!ªÀE‘¯à FÊOËÓñqòu9¬±Dd„ý4p]¥9ìjED MôIl¾¦¢mªÒpeM—ügžÄ ÿ×Þ±9뱬,¯?5CµåJËg¸SžÄ7æAžx/¼éâÚQõ#›XÈ"¶^\Õš‚gãs¹u G™ûf„wG¼“V!"hêV¨þY yßWˬ/;AºìÕ4ô7Á¹Ì›Ñ¬3)±ÉqćÙw˜É§X2£¬)•o¥ òµ"GCP{™7o±ýŒŠl!IwŨ1b3v¬8TcµÁs,^OLÌÏ ¿¼h¶kÉÎCÜt ¨ø*OðÑËvü_$}yV¤ YÔÙ4Õ¯û»d1R.@EÑ™³¨o„„q§ ðG™Q â.‚xÍ)Ý×õ2ï8yñœÊ„dŽèï!'Ü—ÔEˆ ¡ç7•·„-pÕæ–ó›Ov,VÙ!Ç¿“ÉHì‡ûêL1¦ê= >³pé´ûG5]±ÀqµHÜ=ûË$ü™vI6nÇý:€E¬¡^¶âè›û»°¤,ßý`P‘ö³eìuQ¬F׆oôåÍô½k@½ÐѰöu¤MÇá#“Ëod#ÛC(˜7PaÓø Ÿý°&z±OFõöBêÏ­YW~Ø6\#ðÍ’q’Q÷–«·pW­XZC”ÅöMÕ‰LVŠ—Ñ¨5|Î0[ÆèŸ¦ƒ^oó¯¬ýãÎSMåí/é‚É\Áù37¶A.MÍv ‚ÌÌúa¡Õêচ.’Ô%©±¸ÔÝsÈ"žEN÷Ç2Žå}h€-åí‘cÄT‰k ’ðF ïôµM ß¾}‘&ÁnÂèÈoÇ’ï6#ˆ´÷b–ukþ„ç^Ô&¸m¾óO ïZ¦µþCi$A}i/T«q4£Õ!^ 1¼`õNV‰OO…§êI‚guã1fD¨qzñ}çÉLI¾+HkXƼÅ3·`“¹Ìˆ*ÒмÚ¼ 礥îëˆôüj>ÔW6aí8÷ƒ9jÄK´JwÀ¸]D£sVPmü~ijºÕÛ~¡á/àpkø„´m ٗԌëVB½#Y»PÄÎHq[Ipwmì” íœhÈKEx…,¯UéÎXôæ15[Õj¿·F÷<„?b¯xv>•FdEs ŒÐëvîÓM“›š•¶¯l£Fôur0S~gùüfÇ)¦„õ¤é±riôcWd½Ò.é×·sõ*|€ÙÒÂ\}P‰yJ®U¸Q\ùr¿ö‰ž¦¥¡‚Hür?u™ÿ€ùËÃPÑÈÿ—Ûßü©¶o]t ]½‹Bã8üKÚilƒàz5‹ ðC;Ó‰‘‘ç×ÐÑð0X„ƒd­/nBÈÎO–'Åb'm9m²m­¿y²,s³Ž†bâºÃkt­¤(`HÛ[KIÈ.4“h¿yÆPsH¡<Àš`N eaœ|½·K¾.¤ÕùCyd×Ñ·5¾‘<)”ji«RNÂðÀoœÍ”¾du«èCqÁeà53`ÔxÏ%(³Åœü#î3z!‚üi_«qP!’v Y¤)ß^™þ“£ôo—6çÈ6Ó|äÏi1 Æ3}ñûŸó(ˆ©iÅ8dŽø†^@Ž¶á·ƒ·ðVõ1ùÜ|õšp¢Ê:+cW*ª»Ôå„SXV=:ÞO\Èý$=ðûáki,ŽÁ[»£Xõe©x±³¯Ý&Íæ’!×¢Ûh"Y¥í —,K9U©7UÊX™ok4–5‘ôȶuÛ*\úþ’HÅ…icTüÍ¡–ƸÒùyYè$Å ØQ"¾Ú LöK>JÕã!Œ`X-hˆÃ3sfÒèöEÜûAYº<ÉÂrê“æ¤ø¬qÆq\ÚõÑðè…F!70€ÀãÈØäíjCÔô›‚!ºŸÍJçQmÓ“«µ¢MÑ ôÚåÒ3Qp`ôòXÃàÅw=ª`ŨòiW'h*çòèüû®aœIÔ¢Üçj–ÛHüAl®Õ6H‚”iÕ¡Içø«h—ijƒ£¶.pE@_£þ`ÍᎄÀ!˜z—@~X­Hâ"wÙÉÂË+‹îL2îQÂ0¿›a™¿µ$Š?6(ïW-m1ë"=±p“|½¸’±*öÙ§ÎH‡¦ïTHäð³F «RøðÄWyL‚ÖtÄchß^PøRðê#ašÒëéýŒ-䆫º«hjì@†ÈUvO€ìP0eÓ+ä{U]Œæ?H»Û­¼:²õ\Ú´# ¼ Q\êV§7%0L­)Elb«·fÈå;ÿhþ²Ä@´f ó˜×=u>g,¦Â6Ô×±\µ_fa ­^Y´ÞI¸¾Šz\ê•ùýkkxõ\áb7S—õê»ÍP래¬¨¿dq˜a\+Þ££Ì|Ë2+¨iV mŽ)¦© r´#뿎„“Àäå¬AÄk©ÌÃ:këy8²ÚRw /à‡¿¡1JDåË®>.”F¤ÌÚƒJaŠ%ÆÊ–,ލ8ðuÉnå™§« i³šžQ(Ũ*9*Ž6ÂIáYBŽåiµ_AsRê®§¡R몈V›5¿N4Éóq­FÕ"øErÍ6Ë&iQ›zƒÂ!ÝF;S•B»ˆŒ×s$"Éìý–˜ÜQdZúBÀìÖAÊdc²™T¢· ¼Ø‘@›|eÝ%jtÒ†»¨í¸åEÊstŽb‹³Òª—f2Òf¥šf`m …rÿ¨'Þ‰«…yH£‰¯û‹úgù7¨ÙbÏúú¤Þúúfkù¶ÜÑ)ĉh<>žRùM§äL\¤yZ Â$lùPâ%Ê‚6 ¿‘Ž´ŽU #?Ì-vÌ2íå ={iø(‘JëPÔrû7 ’ù°Í‹ÇàâW`ý9ÍÉð‰Ccx¸B‚½¡Ú»øU‚êTzˬ DwØH ã‹hr]¦¸ƒc —à] É&$ qý)0ÒŸOAÿÆJ@#› R—b¡µ‘L©àOëU6ånþª+»|>LâÔ1S ¾mβ<Î?Ñóko2‘L;*ì¸ÑCºŽR@óïõI'Pr Ž:¤ú¸½»æÒ÷ÊhØ|Ñøäæºãtv‹óÙ;0GðøÝÙOhÒ–X¸Ös`F´ç7´ª5LZ¼ƒÓ©‰à¬ÈR1D<þÕ‹ÃÄ÷ï‡.Î í.vNl˜u……ô°ý˜} ¯“iÁë A—ÝpUUú¯(5Eni«^‰zíÜhÓ\6ù« žúÀXâóC’ÑÄ´6ÊN˜¥ÊUÞ°_•±Å6ÍÉÛÓz-VZÒŸž~—AUú°§Àíž4EÝæ¼ñ`äv}ÔíÂi—“Å/â]ÕÝ#OÓp¿<mD>º9%©âûÜBIâO í¼õ`.«4àò}ŒHÄQ‹¥(öSŒÚù´XX0b¾2=%c±ÈH?oZb½êðÃÙ}véßWÆ;ÁįÖäÇñj9¢·RÑçbÚ4¹ ÜòH£JÚ&»ñgOMil—† ˆ›æŽ‹¥2Qî»3“Òñö64–Q$£?ܣλz¤ŸFàôkùD[)Í5½&Ôšù¾å–|þ½a Iî™s „¬—,n¢ZO=“fÑ+{)&³Wúrì¯F´˜yRW..hßD‘»Œ>…«tª¥áh‘jöÙcNQ8Û2\áÎAÌÎÍ—Œº ÝÉ9ÐTOþ9íÐŽ,µƒÚXé]w÷!ÖHÍX]íˆ@Õ²çmöç-aÎÛŠÊœL‹ë¤Š†óDå×®4ù§œi,±úŽ0‚S-á0©)r«fÖÀE¨.W±Æ›½)„‰¡iƒ¾ #óQÁ™lœMdŸOã€ç’·:dŒ¾›­êmõì'%#æeÏs…‰Ä½ÉÜœl=^æ“×Ï\OàTçèÞÄXA\*1%À ?±§äÙ÷Ã\šòí˜ß‚þ“ù·ú%” I^]y«Z>Ë“œÒ›L½!ÅAýÁî”~( ðñ6pËöËo~+põ~¢ï{ˆ£Ã¢êÛG‡çUë^ð!^Þoã­3Ä–‚eQ[êá™ùùß‘‰ìá:m†!nÉ_3mËHe~X$Q”@ ð¹læÏþ꘭Ý]Z 9‚M„3X´;YÔþ•¤m˜þÿ,d‚˜Cš£B)pÒJñ‹0;oÉNÊíÈyñäw"óu&]€W“ýÓSݬ¡póümxجfY“…®ó¦@幌ýïÒ¢¹óG²9g²È€ž-Ï;×S ã`ù´&âBqûç6!†'y ï¯ÔÌ?„rì ”“#‘!ó@Ù2ÅϦ2:ÙLBÕë9õ_øEeŽ‹×!Øêg^’¸Ôt-G49Œ)gfð³Rf{‚Ç”é-yü†6vQÜE„„ÐJ ü“ÝøƒÎÐ+™a´ÚÙiŠ·lØ9§ 7çËnºŸÔÛã›ÌÊ_aÍt»‡Y}xФ$SùóWáV@XT2ß[Ê,÷³åÏz6â4õaóD·ƒPl_L¾uj3AÖºIR ÚÙ ›³Â&éöF™êdTø7dL´Tôщ¤iHî.óÒUCòB¦ëˆ¢ÒqÀ°Þ`à `Ã0¯@Y&T¼i®«êO½`ÿ>p Ë®—³6Ëe ´Ô"³Â!þ¸ñ‡x]Ó2ÐP—Ãl‰éÂ^†§© ‘ËMú(C9<§‘ѦÂnDÍH0¸g²+Z™c/zÑü¨X¡Ã0ÍŒ‹{ØÀP$ÙÒØNl…év—í|ká ‰iñ… %^9“Êq­ÀãŠÃ3æÐxèÏæ† Œ ²µ¬É(ÖDÁº)³Éâ6‰b’Ñãïƒí·ðЋ ˜ jjî™vR 4_§6¤"¼e}¨ ¢/Ó¾eODÏô,0U†xî;¦¿i¤&G˜{½ãUY ùˆ.¶¨ÚÏýT÷ÀןµMó`MúðÇ,ðº౤:Çå¡õ¤=aÎb–­4ñ¹ ¸/7%ÒÓ)ο¯…‹ï¤«æ™­•,Åeg, )Aú> ù?G©îíÞN«A7Ó¡W²–Òï³5‹ù ÚŸ²‹æÅ˜Ë5*?Ng}\ïÑ3.j³ŸD®ˆÖX— |¢ÐD—,ÜÑ|ˆú2í<54_ˆ—cË{{8¿ÆÊ\p|Ó!Mwh óÅ©ð&óèÀå•’ÎzBø›¼âPÀ7Œ0zíRÇ·AºjÆÁ^ì;µM„¿µ¯yówé¹ÝÄ8£BɨOÀ¶¸†;‚‘*;‡ÎVëVºLšÔ¦¨Óù<£x>†«ν/°¦K(]=©:¥&oè˜uŽÈ”yúMœTW>Ý#ëf¤“)ë±…¾©åljŠ‡Ç± ´ù`³ŠLÕo&Xì©÷2"¢3/;NOMºîòñR(œ\{Áò¯‰×V¨-ç†P2ƒŸ_ù4³ôs¬g+p®áe£s`•&‹ê¾Ç-s™¥1Úžæ4•Ö.-õA•+ªà3|Ÿ™lo nŠÌ¾†uve°Í74ÈZˆxã“Á?Ÿ …Þ´ÉWi× ãJNo“d^¬…‚) îk>.Kή$ÅFœ0š—€Û®kG[üÆä6Ž›þ8¡®¼iôóÈbCŠÃˆ—åöÇ=ãÇN#D–Ý Ø ×È«®øåG|Е_wħp±¦ë€Ú)(,ñ@,Ùi¸ÁùÎ6ü²2±›¿lÀ׃8?¼Wê˜r‰Ó´‡»‚Š7klF=½æÏ8ý–ÓŠÎRªÕúÁÉßTÅM5Ý’ÐBNÍ&XÎ*5;Žä$Y “&0ܨl… Ëœ®‘zãî<œsÛÑf#ûFذ؞‰B&û!‚ µ½*89©9®VßÞè:ά“îí&M=°² D&a4s!º˜‹”*qCñÌÆîÓÆ; d’¡×ŠŸ‡‡¦P¡É½wÌô yÝÍœ8õôý³“¬”½CMI‹%£Ò«áÕ7ì/¼´¤ ÜŸüàd0#>Š:Œ=V÷9˜&‡³°Õmˆ¾PQ=¹Qü; ûÕ¤Í+H­äxRˆ‡ÊŠ`µEÎY°¹ÿiî~æµÖ¹3^•eÌ °ËænÏ•2tè™ØžÀ$«›wr¼èô âáâð pú<æ›ðdÔ':±X!ÀPg8<¸áýgôg—qB$ÔXˆàNħ`!iæòÁ÷òOM$x{øÜEiǨ½5èøB&ƒl¶^œt©ö€ð+vùðZ¬Ãâ‰ðÓ®³³_æš<åsœ”ë¿–»=a5Ø{©¡·ÎC}¾× ò|LåÓs¸Óϵ˜f­ÙÞGÍײûöd;¢W?/ÛnÂ,ò’/Á4,/b#Q2 ‡¾÷Õrá¸vOÂÔHiz„wPaR“ü"*unPHÕ—÷f¯!!Ì¡;æÄlô&=¼¦X°½W>‘€±¶¦¢ó—§óÒðãÇØï0øÉrÒIMš]Œäü UÊãÓã7»}v’è#¿ìázÎ8ÒÐØÈ9j÷áX]aÙ寬´ý¦êîc&}­O2ZvÎùïÔ}ŒQpçlŠÍn]¦RB û@8±-&7?Ò!™¨ÇŠx †ËF±úZó[ëŸOz•xÒbÜMÐ;¥Åè?áƒë¹™–¡$¬Îs“=½¡`Ž£œ-ŸòD¿¨÷k0¹®{Áñr&hÊÃìr?…;@#ñÕîÚzí`¹=íЙþ] "*/ Cr†§çàñENŸ²7XNçl0D ¶°¢ @+´þö‚Oß¡,—> [én›³]ü5}þ…ÿ9¡Üiëð›Éý”çÔoõp"™¼y Ê}xXÖmd‹ÕÚÊUФ3T¾Î§Hø<õ„p`¯m©WýÀ!á uœÃ03|“å)ýÅ5ÝL–…î§®Û%ÆdÞháèó¸ìÊŠ±’_&h|îØæ×ú’÷Eée Ô‰‘5WV9œ e2CKo Là|‹Àë Mù«UÅÈ¡6\çä žtJâSö£˜´ P(ÛìÜ}V|Ú3“æ×Ô—çcO±S ]5Õ?¾dšh؃l–EQ~Œ¤§ÈB(¯¡[o‘D¸•§É‡Ù~9—¿œØ6x#^œP_6=';ä58¹ì©A…L®¦Ô)éù¥1;ƒÂäë·˜?áXl—”©—o•Ñ[¾&ÙY»ó"½)²rS¾~Ç€³¿À׸Ą,») ¬Ú ±Ï€øñ‹òƒ×ùL!Z‹“f» H&O¶u^äû›ÀqТÄÃ[Kaªvlò!z²¯ ¸±äFãPV¿³„·¹³KµE]}Yv\4 ™ÿЧÀ°¹]>üv…FÄÕÐþЩþiLRmFAê‹r˜9GvNº•¶`â²¢—” ¨Æ|–¢Ež-tæÖqÉVúý¬ûŸ¡‘ϓǟRŸËah´ž–LStẅYtzeyó7›Â€•â+›.W¨!Òë4™ÓÄè6Eœj¬“¨ f—‘z %cƒÄà0N¹ûù ŒZ«æ}Ý#¤ØšZ †ò.?SîA»r®òt°j-N‚wÌÍ!zñçÁ‡ù­Zò=Ä2Yã\Ñ´Æ=º7¹IVˆA÷-F¤xyIR|§Ô„öXÚx%¡*yf]âvzeºïILTõd’¼úÚœñ ‰u½18é“ç$Ãbb \5÷Ü• ýu/¡ÛÍŽ\<€&ÑÜ_Â-hDF‡hg±šÅA\ŒN$tº¯3KOyœè ø`ˆÎ)±òa-B­%S•¿{e¬†’¦ÂaSß{ ò…˜ÜáÖc*1„?áj%m)ÿ9[Ȥ–…M1 «h·Êõ{ÙdÇÀ×qßOQ~¨:Dõ䢺'×ùËu üu÷p¸¥Þ³6§XT¾³A¡cÃæãoÒŒ†iDç)Ù¬»èúì!‰~6ë‘SG'@c<;½ÂÐ0'á` KgBøŒãÇŸÃËzßX ÊôqE¿ÚG©ad¢öºÀKÑl›¨y©˜­,^2; š%ÍÛv- Ü ®ïÉ+LA¥OU… ¦}0ƒ»“ÄWT•Ï•ò`¸ ¡:T1êYòâ|Îuç»OBE°<ÇR˱ð(”GòLùv0ÓxŒÆ®DyDçÛÒ dÞlDiFUöVsÙó;ÉLèN¤DБ)X¿þÈ8¥ud­†’º5)Ðm¿æ=ÿÊi÷óE¼zg “›×Wîç°ÎhÖ@9Mß“¥­ðRoÍDÿ4/§Ç¤¦T¼–a¯¨â…·â¦ô~ÎÓAµÒü«¼A…I§ª‚ªNßí4|iu,…=K@&,Tß>dÈÇJ{³ú×_*éU‡ð§†è Óí$¿~»1Xî¸Æ'Xyy}Ö’içŸ_U¸€I±¢¿5F…4?r[6‘’´ |Áþ¹?ƒ]ŒØg/°ïÓǽ°}ÅXpÝ‚ƒN@x¯—ˆ7N¢ö§ô=š–5šûNsIwIеúßí: £¾ØdHñõm(•ÆÏ(ht‡ÄfJè§%u©ý ixyAíÌmüÂå»Ü»Â°PœÎê’Ä‹u!67¼és Jxò1+®5¥°ŸöøûÀ޽ AXÜÙ`~û’7o; :Às‹ÏЙžÙ#Ÿb­Jñ­Ì}†%Û¼³ 罺¥JßFLIŠ{?G)U4üÙ~Âó”E`r÷ÕP¶ª”ÎÏÔ mMþH $e,S6–«ðÇ—ñÌs¹Æ™Á)·en]°¾N¨~Þ# aÉü®îy£Æ·e=™ìîgË¥«jQ'aÚÒ| ™ñ„²EoË…ÃU²ÃÈpÝ×A2’"I‹<Ë?R> 3v ¼D K¢ >y ÷œÓˆ…fç\G5@ÿ¨pj@Α¹Î³­F˜l4”

’쑾¬fþâU§ c߃ïLâKÜÀÈQ êm{YÐyÆPl‘Ûõ×UFi÷‹—Hò~âÜ‚Ìmª’·­^½¤-1#naœîÍ\èã½É¡œ7ÁM% pòÜêÙŒòúôtR¸‰ñáŒÕŽžöT4ìO7¾Š{×·K‹±>ªN'5Ú$rŸ´×zå–åêÐÃþ [õt½’llö |J4JŠÑ#6Â¥¦¦I&n„¾1 ˆ„Tl¡Ôp¿UwÂ}æ*Ð~%¨ÃÕ/OA½„6øœâùä|Åý]߇ڸfSúOó0¹1~Ýbf»™/þÙl§U*‹ƒ:¯\¢?"7ÔTêwÞ7MaÁog¤:øœçÞa—‚}‚’qYMJTf€‰0ÈCK褽ëåè¢)ÃÂ*óöH¥/Ê6%i¸¹š^!·Ô6ŒËs^Nä~cK”¦H_/q»{ùuÙUæíßF–Ò‡di‘1Ÿû6ºã±ƒÙ]U'"š¿å¤RÂÚJÉ| ºz@uÔˆuç]”âáJÕŵFiœXý¢ÿ~†í0”_„ßÁoÕHxXϬ¯+3Jš¿pGw¼d½ÇІã»¦Žç§O.ÿiDb?VÑÛÁ|„¸¹0Cœ• áÙ/™ˆ¿µYú) qIlCÉ*•Mý6[§‚ i¿v*kU8÷ óè7÷€5×§íÑ®íUwUmtíëo%uá¯äÆ_QK„м‹´S¾%κåÁqaàÙ…­žHxÖV*­Ï¦AŒc£Éìn¤šýø„¹1›”U²ÎGƒw„¯}¡ñTg}¶Qxq„ ++ÇjãRa,­¥Th!70‘µþåiô˵ùsÐb‰]ÞbM”€8‘NLép.ûýrkîZ:÷\µž<©¹^H¨Áa9J?=Áˆ*¾NøDý*"è£Ö¢[gMûƒß©Ü^ëQò ?k¾»úõ¨ b' íϪ£Æ¸ÐÉ›Ußø: )xTHvK©×¼åHm Sõ«–5ˆ vÕºÓ¥!î £Îügƒ‘oCY»!B™ùX«ÌZ”<š?¡°@ü.½òkviرeÖ™úý»_–Mñ#ÔÛ£Ó:é#Å àrˆŒ¤æ êÈ‘ =µy ‰±}ã }f‰4ìu,Ša„Õ2jIüûWá¡‚¡l‚Ž[€—ÜçJ\â]2­‘Ÿ=h\_Ìf³X\±fR,à`Ù{õ¿nÕMl0ÕÊqŠ3-.O©êZ4LñÿDâ´m·Env×¶á{[Ü‘•­µ¾.3s`G‹<ù¶Q'±ÿò1õ°>ô špBq%nÿÞ39$_€DúCÙT¨zOè‚âeFeëÚDû<å†þaõ¦ã„œãã¤ØWz†]š°̪lkbê/áG±Ïηh Xê+ÉK죉×h “1nC RíÈÓ²=ÙÚû…ì; ²,çž"?§¼(Ÿê4³pC&ÍÉÙˆ,°~J:*ŽóÇç~ ‘2¦´ÑBöþ¦“Ù&ý#žVœÞ»?ø2³x÷`ÞÎäU¥e—¡{hü¤™™ÎüðÙ9rfbÐBzÒxVRÒJ^]3^Xɇ(O$ÏN§¬#÷<ç37ßg;˜}“ªScñi–úà=Ÿ™E¶Äc˜*§i%Ð*oÝ"×­8¡íÞdLj'”«Ê±_*¸u™sÝ0ÔAÍ!}kQ½Òƒ¹4ºÙÀ>›ô¡|‹pEÞBóRx™ÉA@ÞƒRÉ3á²B`ø·±‰ lÌá»Uêí7xL‹A°oúæáÜi΂@ˆ46÷R*Û„'ÊCÃu0À q4Òe“g™{ÿLŠ(ÚÎï‘ñ‡se õ¢HS?¿HöêìÇt ‚¸mìÄ× lÃ'S‘µÎý¤EvÉÁcl—+Þ .J9ñ{’>Xj“|÷º}“¥˜U2¡»]ËQÔt÷áß ~˜bú°,hœì&‰/ÿ¤+p{ð“Xް<P)aÏqXvw%D3Ýñ˜¡];Kóc¢1%gk6ÑüÊ÷¨>õ?anjíÁ,#>[2B‹@ ©¡ÚËŽÏÊq$rÏBpÚoÅ«\FÙßCÿþÇ}SÅt—”¹–î4#úTÌ´¶Ü²À![­(áB¨·r[Nc®·-„^L;ó¼Al>ªW©Û¯k[4Tê ÑÒæ¨c:æn¬"\%¼6È…³]ñâCýÌ“¼¹‡çJóFèS‘}RKoR§:[-)'i |€ùó’¹L,Ä0ÝRžc³'†Â(ZN€Äs½!a VŠ@¡2õ‰?ó˲ˆ 3†÷LÈôê#ñHX"ŽÒÙ¥â³ôS;å‹nŽ˜µÕØ‹õøˆ~ÛÚðïjûå²ÕÈ?ƒ5/N&Q%EˆU&òƒú>ÄÌ­aT±Q¯u ;ñ|Ÿülj.Ñ’1¼]4H0P«~ÕWÙ¿`ðs$>]Jî Unø²yøÛºhôÀ1óîòѼÉäTî3$ƒk¨ÆsîUÍJ/£ Báæõ›\*°·ÇKî/ˆ*‡…ÙO¦zö½_÷èãwN«p]U¾HòãØ+Ðï.veò­=òõ(Ûm:yŽ}TËUº†–9‡'›5j¬‹²)[››zÝ—îºÙ2}J£Ÿi*Ãouœú`6ät¹ô#v·˜Óa¿ÒÀâ̼KŒÄ\ uÛ_:š,è:¢Ò=Æ3d®gàzeµY‚yþ|’¸Ò/|T«)?¢¶"yÓ$s÷ùeñÍàøfŽ¿”?O­€gÒ–õøCúÿÿO˜ÛM]Àަ.vHÿÃ:š}endstream endobj 35 0 obj << /Type /Font /Subtype /Type1 /Encoding 105 0 R /FirstChar 65 /LastChar 122 /Widths 113 0 R /BaseFont /VGJKAL+NimbusMonL-Bold /FontDescriptor 33 0 R >> endobj 33 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 /FontName /VGJKAL+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /XHeight 439 /FontBBox [-43 -278 681 871] /Flags 4 /CharSet (/A/C/D/G/I/N/O/P/R/V/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 34 0 R >> endobj 113 0 obj [600 0 600 600 0 0 600 0 600 0 0 0 0 600 600 600 0 600 0 0 0 600 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ] endobj 27 0 obj << /Length1 1647 /Length2 11319 /Length3 532 /Length 12198 /Filter /FlateDecode >> stream xÚíweTœÝ²&îÜi‚»kp—àîÚ@#5ÁàÁÝ-w×àÁÝB° ÁáûÎ=÷Ì:3ógîý5kz­îõîýT=UµŸÚµÞ¦¡TÕ`·t4Ê8‚!,¬ì‚eƒ¹›«º£ƒ²£ÀGu µ›<ÄÌð†ñ ÐÐHºÍ G°”(ÐZ¤€NN‡€€ @ÒÑÉËdmÐk©ë0011ÿkç/€¹×?‘7OW5@ûöà´wtr‚!oÿ׎@ bXìIU=yeY½¬²@º¼¡êfn²|YÁ®@€•£ Àþ €…#ØôWi®¬o\â®3€«Ðôæô´:ý1œ€. W×·gÈ`íb†¼Ä[Ø»Yþ•ÀÛ¾•ãß 9¹8¾Y8¼aodªŽ®W ðUUJæyBlÌ Åv½ÁG«7KKG ·¿Jú{£yC!f °+ô„ü˰¹:Ù›y½Å~#srý†›+lý¯ ˜.@k3K{ «ëÍ÷_§ó¯:ÿSõfNNö^{;þmõŸ9€ ®@{+Vη˜·ØÖ 0 Û_ý"¶rp°ÿcßÒÍ韘;Ðåï¢ÿ«gÞ’0³tÛ{,V(lÊŽ·úÿ;•YÿûDþoø¿Eàÿyÿkâþ»FÿÓ%þ¯Þç§–q³·W6sxk€ÌÀÛ 1Þf à#à¯acoæøkà€,þW3½×ÿÉùß­u€ÿÈú?8ÿþGq°õ›B,<¬<ÿعʀ<–ª ˆ… ÀÊÌþíðþÞ×[]ìA`à›ÈŸï›;û¿aš6 ;ð_jðü‚-ÿ½†7Ýþ®€MR^KB[’éÿ0mÿ6V}ë ˆ¦—ð‘t”-ÿsñ•„„£'À‡…ƒWÀÂÉÇþvß®£'·ßÿ&ìßDÿZ+™A\@žvVvvÀÛï?¿ÿZý4ØÂÑò¯>Ò€˜-ßZï?7þ‚-Ü\\Þÿ{¼UþÏõß—ôZ ,/8Z|±MËL‡ÔäKôõpÀ…:•ÖkT;vû§El Tš>} em˜|iõšÿíôüKq÷{¾=]w ð4ŸÔŠ¡·àÝ:m;Ón›q)zú‘NŒÏÙÜÇM8}^víÝíq5uã’'²Év.¤³[†*÷‚\ê'ŒO©uqxX PØ5…¿h“noèF†‡»ÿÀ÷þ"aʉC¦ùà‡NàœC"ª¯Ué‹£ô±±rr6cˆgŠ<»7­ô¾õоÌ8c ŽrséwaûÅ¿ŒI°T>ó„È/JÈPµ§u¼Ue>¹7G{­É%(× ¾ãÚ †Üà†!¦5ò Ö-¿ŠeúÍfn­ó„Kj¤KöVà…7¬sXìVa ôPZbY½Òòšºú®[í}{vb?HY,!i÷EDFµÑ‹éÀ¸à>òÈ! _BQ²Ýþ½Y „‡YÓ˜Všü0䄤îâZ®ÊÌ­½{áÁØ ‰Î=Ò{ ¯Z}s ‚g#§éý”¹êøE~…Ï…†í¥=ΛŸdG!‹TP°ÃPô‰Òü^ƒhÓ8¯„Ô'(‘ÔÒ ½Ê" ÃÙµó1BálU&Ÿ÷yÉèò;ϸt«B²!Fûíe¡ãÈm.[×ì'Ê·ÓaŠBÖPŸ–# è%xøØPœF°’‡?Þaã|¾Çž †¡£@åö²··©þ(Žx5ýÇ)Á ö£•€Bv*‰ÍãÓ;Žÿ^Ï£ÔÞº¼kׯˋ=ÝÉÊ@W¥»Ò3M9ƒB>Ã~ŒÎHIW¡N¦^„ï )é ÃŒÕ!И$Ô?°MZzLµÉîÚ½K×_¾ÈkF#”À5ÍÝÏÀ¥OÜÁ„qS™áž¬Ì`„뱫ôþ…·1¯×Âí"@ê†À¢©>àKŽjòžå0ïôÛ)ÑbÊ+Ÿ>9ùyõ ÉèÀUèSõvÔ±®qvÀ¡óz‘ÉyuÐ`$ašÏ‘R·!ݰxîž±œF<ßÒû•?[ôD3ä7ˆiØz¹Xb‹H‹2üºnÙWëuÈž/¦4HUyW¶ÔðM꿆»I¬A’uF¶S—¦ÒCB†—vºki"P¿0Óv‡œ*¬FÂú‘ã%`yè–ÑÀ[¡&^B,6ñöýÆïbú{××(°snƒ®Ã7aPé®Ù?Í9µ’Yb†³ð5³Ú·ãÜ­›ëÈCG‘÷fᥧU(³ñ½Ð¦î€ý…jþÐÓMÀ '28äyKj/Û¢U•®áã%myüêçNþJ.^6ug¨Â¨Ÿg àÝTãí'Œ¿Œ >Jï¨úe¼UÕlË‚ßXÌTºdrc¼Èj@=ï©ö¼ /]¥máãÁÇ ›sJ»b½ETüŠŠcVS~5º•†Ñe•G«d©§ÈKhðDÙ‚„~U=bzúaâ„÷¥Ÿ¼¢KªaO $þvpˆåŽk5óWº—×:Ì`6§¨ cŠ·Óýëö‰‚xÛ&[†E§^›waÇ1æDû°ÑVIÆ»f†ëþÒ&;7¦ ûò~6pŒ? ïu“³ÞT`_Ub>þB)îðçØPLTéø³ÉÅ(V-‰5âÒ×mÆAÈõu%¿á`ì„­Å9^jê«c÷{¸‹¬\ž„õ !D*®øqŠÍ+îÌ”sôókÚ£Ï>e6‰Ímõmµ0Ô­ë)ù<Ô äˆG)˜vüࡱf ¿ÈµSYbBF€QhÓ*ÐÄr™je5¤€xÅÆzRª¿²`Fï§7ÍtcTêEÏ».‹ Û§`|%º§7eiŒ%~ìù„´íÏ¿‰rY%-Å;;¹¢½šéwU$ZŽÁ ˜˜±/çg¬¿÷;¨×2n»õ¡k¹Ò Áp7í05;ô3³ƒT³övÁüU,iš‚ŒÍÌtäxó>j¬ª ;?@†Ž‘?¹è K>Öß’@ŸÐK¹¥»Ú¢õOlBLÐ0ÂÃÕ#ï@À.\ÞI"’v{~dKí8Ž|”d? ÷×£ìŠm¶”ºßqÜâ(ï²…\nžð›.ãp Ã¾Ñ9K'j¼·ü.zWjQZÓ£[fŒ¸“ôm`zÓ¯Ðrƒ~oEH2WVÚõœhpvʵŸ·€º…Ó-åš=G¯£MúÓ4[“†Š®åÂrkj ªÇ’;43ìØ24#ƒ¼•¢xÑňŸvøÅhýüˆèc„ÚØž6‰%mL…ÁøÎK‹W9éy¤Ï꼓PËOšx-Æ9§º,´I›±ï…ÖñZjC+¾$°TR9 ɬ-º×0$«wN…ªq“¡sq[<7V•~X ×5»‰å»±Âª:Gû22£f¶¤~x\„är—ëŸ×)`Õ§-–«ñ‡f&ô¥¼ÖýÊ5:étI9™]ž¼n°°Eëêé YEÃÚPS4ýÄ R¿ñæ0- t$±ø*“V3à_\?s÷Ðã3H©L¾ªTÁN{]§³âªŽ`ÔD °mÊ|²ghÊ ˜·ÊILAtE@˜*uë±Hf‰ˆÞ bÿfôB?éy"€þtEô¡èU‹í—®]{\°Pþìëšó[Ý÷£÷„ì¯êñ[=ªå\ Õn1óà Kø1x×bIÆe”O®D¸dóЉÐj9Qâ|Y¤kìîA~Ø™ÎHÝ$óI’3ÐI°ï¤› w%¾«ž°ˆ¿ƒqæ[xÊ¿ûsvNE ±ì0àû´2eiº²v_(éAÕ éχy¥¦+œ£cƒõ¬.02ŽÌ×ÍÅUcçvy¨_g¿a¦+ô~OC9¢]½Ãÿú+Äž…æj”‰MÊ\ƒ(÷’ãx}C »íŒk ‚T¾!1À²÷zW¼žˆåú}¥Ýd5ôHhyîö×9³o3Ý øýˆ‘ì@Zƒ3Oû6PV‹„E¿‡€h¢mžž}7R0ºˆ!“  kV—ñ™½ xŸi C„d̼H^FØ!N-¶4RF4ÚñÆT³WW»%(QòVÿ¿·yð=s”;W8œÅÕ]kDsÆqf÷è[P C\ñÒØ ‰$á6µ±˜ZkìU»BúŽbj›Vì­ƒõ^Ñ’¥9NÃ.·Dy|i¥­¡¬ºŸˆØ9ÂqìáëîþxµEòØñÝykRwªBÄk¾Wöt ﺼx``ÝxúkzJüc°ïeçæ¨wT¿~êÃ^—S¼¤ ;ÏãªÍä8Ñ+lñÄRnúÃ2¼#ØÙÐx¬œ™køÛ-âWÐCñjÏbL](Ž 3B“h¼ìá”s@üìWÉC¡Io7á‰6l0‹š–n uÅ“zae¶‰Ç«¡MÈ)¶Pq É£- ð‡è3­!EÆY¬5¨ç»¶Òn¨}/!#ì‚}½]r—7Ò —À6±“‹Äy¯X¹Ôºòóî¶yí9§Ÿkì‚mQVº}KÇðÞŒ*V@¢–)λ Í$¶§+ó=4ÛZ¯,Á—¯ W̧òzΗðøšLÝ7³·ðœff‚;ø®——´Sóæ²Ó\ý§±3–Ž}PWê^~ü¾7PFrÇA!ÃÁÆáD­°ÿùÝw‰û»ß8…åZÊ*žY/VÄÝÍ Iõ`N.[Õ}lô%ÃÙÄΗåÕŸ[©RÂ@‘ Ó°ùos-{MºìZ¯ÖòöPß~üja÷ouD‡|oÃ[ƒÙNƃ{q,aV1ŒQ̨֓pJWö=s.¸mÿ@¬Þcbö‹N—Þyø°ãÌ5œA„ò>-kåÏ¥/Ç$Ó®Wù§dUügé0îÀÆR q%2É5ø°Ú‰žÓIŽx±'f~2 •ªKJþºÔäÓ¥#ý¥}$£á¹¼Ûõm¨úI±ÄºÁŠ˜~~uC•¾2ãogÅB¹ó‚0½áŠþ×_ Ÿ“Ó¢y­;÷;Ì¥ÕÿÔ¶Œ%²Ð½ƒá޹WA–K²Ü:“‰ö£ï']•Äúü1Õ¢-\ùÎ@ÈOì§ÙÝý±±”Aø#óÏOZ(áÃý Û%¡¹Ïôó ñ})™ .Îô–§Ï»0w˜¨i´Èýaçã3C±ßþÖÍàö€âî·öЧ\%)?%ŠAåÝQPMçU%>ºè>%vÔÜ.·¦Ý[ä%n~/B³aF65…rEóE=ãe4Ý»´£ æ­·9KN²âD¾5°¸P5"ÙeO(òž;È©*4u`ŒéÏ„7Æù\£%á iÆÕd'õêªÆ¦ëd]‚ÎeéE9v\U µÆõ§Û\WNAßù\vŽ"üdGλ§¼Î&êÜ8K®åGTG‹VÁœdt@\C(ðqxB5¬c{ù´‡^ó^<:ñK_–nÓ៓6ÒÒ‡!Þµð¢J8¬†BÝ_}é~«ê4⺰Š*@Ë-¼fb¾ŽB“Ug<„%í)·Ú´ÁGŽg£U]W>ÔÂXëTÈÓFöu':)td!=æÉ½T'¯H?Ë’5{³\|yô­úJ¢Ÿ¡ßÚ–ðxÀŒoXÒÅý¹Ñ½>3›´ôd{޲椽˶|„»–-G`â ñ¸TØÀ˶ ‘ÃÝNXØw”øÎn¥Lá¶ÑüÄJ¦ŠêXxí*ëøaÓ×¾»Êzª^Z«Ì‚éIvÕ ¹É¥–¼¢­msÚÿׄüÇ¢Hž0A²VÚ£ ¯* •íÓ›V3i6ÜbŒì|!­Ñ‹+ñLÏךeðmåÍÏŠÀ›k¢uyjY#q\²|¡0³ËóÐS‹F›ù?X{Ÿ‚J3ÂHé6L+¢¾ÊW†R*Ü#¨¿ wµqH¢Y«ÍÏ$rñZ ÒIb¤rÇ¡˜­×ê!÷-ìR¾³âÑ1Z£JuCêQºÉÑ@«9ä§$N¥ž"R“úåYõíD®MⵂTmò2¦Ä»ÒiÅ9á÷,º QÀE@Z9ëg}nƒ¦——ªõS$’™šmô¹}Àuá¹VÃWkŒ¸íõµÄdÃQï¥×ëæš uÕ…@ñ¦‡: q(!Ðôºht0ø«Hgn{Û¸z4§¢BNßlUsF }o±ä ˆ¡¡YRÿt &.é‰Oíý€]ˆ¤ôÇ# E!ïÖ!‡¨¢y››7ú£Iô…)¾,r9ÜÁîè–“áE£)£„7K“’ëWÒ„ä ½<Ö¨“ ÂQ7nÞšF’•7­Ÿk ”Jıîç¶8#ÍÝxRë^:‰ÍléÏN ¢¡Ä´ØÙâ.;¥ïXÔï)Í?ïF«n:ÒL·«½7žºöaŸM+÷3yèÉëÆÇ©ÓsY9v)¡^k8„˜ÙáÔ‡JÊ'°l<«Š;‡®¿‹ÅßêO„Î ‡ãTþÖ”Zôþd&„í§“µ™hVÕq8ÉRÑ„ð‰±‰ep~Åïâˆò5èµôwmBe^a‡'´}¸ŽN­ô)å‰pâ@ÇÁS÷ÜiÞ—¨@”3B±ÇXCtïn/üd5OY WÅu]F©æ+ ¢ðt©ßm¥ûNb~ìA¨Œ'h‘[Ñôk6³?ø”[6jˆŒT8lÃú»– )acnÛ¿†óYCüki¯w/F4ÂeÞbþ¬^ m0Ã4‘îÅ¡hzqZÿн¦>5W·4tGË®GŸ}ª¨{Ö”){>ö’òØ ãPŸ)É.™’Þ°Öìƒl0ƒS{Œj8¸úŠD0ʽú]T°û^GÌî¢"EE–¶í¬µÆ˜å¥fXÝûE39>‰‘L¢®Ð<ÃX7q¾˜øõcGúÞžñž´8Xê<ª·¦à.eƲãüu´gWHªŠÉËpT÷£‡Ì—.ƒoªCî=G[ìâ÷$_9岬menèD‘º¿¯°Ÿ×’t=VüImâ2d+ïo7H²(.§«÷;c¡×–Áëø‘Ïìg.QORìވˆݣ[Ÿƒ˜°ZpçØQè"èÇî@‹»KØüÝFÕõÂáJ(ß«§µubcvE¬½±ïBÜœRù¹¼ÅXûŒ—æ¦YÈ_<¿ &üü½ydQôž[¸:ƒfÍs3v³Oà {ç ´âÈKú€„Ræ(ÒÆ•tL10gÅ”K[„‰ˆ#TR;âÞ¥8W’ìIæ´bÚ+ˆ+ìCˆ‡fY!‚V—÷;Ãå™x%cüÝž+µRû¹Üݧ܀vL?³Æ“ÁÙ EþXÍò/Þ\ôµAË9±†W4¹çpK†jβ¶"Ĺb”„™dä”_¤ñba¸ÌÞŒù>ŠŠääL`ˆ`ãöŒ ±¢iÜU!èU}€òSÓå2Ý=«n­’˜!=ý€ CQvK?Ú\>_î?*Þ¬\Àzùd6ç úÞ€ðü/ðù%·m!o(vtL¹,WÃe1šÎ¿˜×,ßÄzݳ—å«ÇØU¸u®Ó«ôÄGüsˆ óÃYCo¸R²ãP:ïU”}·QË RÂçÁ×F[ÕUé´Ž Õ–»ÌÌí’øZèòyúi8'V9?’#¤«&F‚(r£V 4Ñ£¦B«Óð&’üû|N©¸sbj#eFP©‡ £$×;ÂüØ6ü¡sþÖÃ!ľÀ´ä4ÎQ¤¹óMÚxb4˜ÙŸIÅLL§X0!{\8ž0^.ŸBƾä¡~ V$— &ëd3ψ¬·rš›(Ä/ßçOAäkžßꙡ"1…¯™ $¶ëUS@e•Ž#ÝÇ,([ñ"jmvûeJmµ2¼Æý@ꔂI¨ÍO‘{}Ì+ü“Ü…uÇ^ž{¨ZæqGv­û”sÃù0¬Ò 5M¢2t¦¬ê~=GѪŒ¨ÕUæêu1m‰OWǽ³)+WŸÙå>´˜‘ƒMõ=f‰˜ÃlvF9ë©OV\7hBTìûD/äC,ô:«8€÷wži_z}‘Ì ~¸ÙyOîo×Êm}ùûoæ²Õˆp…ì\“lšÈQµB.n™OÈpb…³¨ÁD[ä‘+l¾‚§"Õœ}Õ^‚A(4í,isŸö»¼qÞµ þø€‚Îj\&ÎÚn’V¸ga5ÅâÌ8x–ZR Ít'öìÐÌà4Ñ–háǼ#,W—ñ¾oœßìçþ|æUõ¡WkaW}Æ/{63¼îû3¥@RäI' È åƒÔµ"ÛŒT¨•‘eÅÀåžwÂ¥Š[VØÙ#&’è ØMªy¬×þÖn¿@²ÒR*HÊPÚ1ÞfªHXèñd/Ötðø;îg …Lý¬z[~ =U]Y„£¬ÖÙôOcãï<øuŸÇRûÌ·XLÖ,‘IAn-v½N‘¥ïhTÁ¦~¯UçÖY|ìBwmé¹—Žïe…¢p8ù¯üÜ´îÞ›ùüÌ"ƒòœOfÉY€ yn‚sQzXþ<Ý_)¬nâPŠÂÅlf.úõåÁ M•7E5Þ3[™=Æ:49â€Ãt^IÁd˜ZükÛ»ò½ ½Îœî„Ö2ZÌè÷óCª‹3Ë’‘æÚf4ëOÉðñ7Fç—• éO ܨåV3E%j?2w;q"AÜ—sÌچȺ¥¹¶*·ƒ^í^Cýíó„»!³ƒÓ7T×XÚëd%uCÉΤ†Â‹ƒ9Ö>õiÎ Ù,)ÚylZˆ%¢ø!'¥]õ×ì …’6äŒó’"ô‚ùœ'õZJ–‘ }™¦EŒ‚Ç '&ÅhÓ>EO> À/°QÎÕ€’O¿rîÓ _nš¦^ZŒõÚXˆjr·f¡•š—tU¨Ad\&ÿ3Íä¹¥K†á,‡,"òà¬2î˜Ú{–xÅûž5V÷…_ºP”íÒ¾ÂWŸrë}wrÙè¶¼¼À-Ï匂•|Ÿ§ûÈ÷"_¬Ä¹Æ'EÏÉú»V¿7Y”óÙEµÙªÆ ,iÀ_¥ËѱI7C7‘Ö±ûylŠZ©µ>êØb–ó×”˜i'O—ñ‰Ï]èöØÁR„\¢£nî^»HVj× ^ëk¨fŸŠÕÿ9gµa>ºùSÓ8âVïÏÜ­Ù¤¯ H6—~ŽYôÎ_«)þV¯zty?¬ÐKÇM¥ ü|‰N_B §=¨œÃSâïU¾žpèºV‚Îí•S3v¹S*Æz ú¾b_8r8Δ½jøÅuà #ûÄl§üá…¥Ð,¡&C¨ºrìjû$F”Ê[×àséjàÊSçèæ'K.8™¯#çŒ"j¿5†^3¢¼CزiCˆVB›Sñ*üŽ{êà¸ò‡"ÍêïbŒûøòË„æ–æ¸pS=#ݘù'„ë\6lï´m­Ã!Ws&¢’X†Ã# ƒ8Žðâ5‰TþHžÀHÙî…ô4À8ºž›ñ÷[ý´áãCHæþ‚{âLƒUd¸V³bK]U¥Ê¸ÉÛÂ?R¶Ù¥¼Z"[-Œ¦ n<è8ÞwUU ^Çcœ‘ÏßߌŸ…›¤jµX9­"‰$|”wþ8ÑB¯žÊm¶ìaóS„o¹f½:hY~Y’m7mY·ôŽ„ô0+)¸\dizz©úuòôÌÝ´yæùMU ¹íAáj3j\Î%öO¢Ä?—´'SG–¼°ÝZ-À_‘?H;Y2¼×>ƒA2BJ"Ƥikà»­>ééþ|þOrk:XÔ4WKMzI ·±áo£qúÜ¥ê¶7AóüŸQaeáÄóVõÌŽ‹s^¯ÈñÜá”mP J*½¢]]„,:¯I¯¦D"0‚#¿ß‹fÆ7ž ~!K/d躂zª¶sëå?FÄ­ø1Û±yg‰M¶³HáU4uÑ⽃n&ª×-•ŽôúŽrÌ:ß©å˰Vp§«ËúNÿu¹NרVCíŽê{”¶Ë9ÿè¡}@k3a½î%-Õ òÞZ6œØ‚Ø€³vÑ!yžOæã»ä«©Óâ‚]ÎdŸ¹Eݸÿ÷¬Œ5=‡ :€WêûKÔ€{Ú§m"ãÕÔ€ýs8<Ž0"¾ñŽ+½ˆ²:4ÍÜ69úÉNçâ)O›qHB7 ”"ëB¬~ÖfvBÚ©ûo ø™ä_ˆ¶md¶ÉÅÛZÁˆRÜH´cž6ŠˆÃ·­:nfÉï?/%QF¦ùM²5D&¶%ø(E?¥Ðù'~AmüàBèž|E«QµåVòMW‚Lˆ ‰’0l„eÝŠØ.ÎPïü¡ K“v^BõxÈ`„ÿcÚ6s +†$¤Ì§OÉ0+e™Ž7·"¦þ·¨ªäTH¸þ/(÷1lÃ)ãb‡]5;k–uh›èOˆn¦™ëパ®«©œ) R(Ë`<³X…â,Å©-„1""=©$-u•bäÄä› ÷åyE£¥ßâÈK¼CŽC¨fËþÆ^r”Áh„>jÎdWÜU™—',yUļ3ÓE_å$ÜEÝSrãÆl Ñ-ú4x_Ḛ̀¨3ѧU.—=µ?95é3YuË©î –%”÷Š`T…â|ßÙ÷”Š<¼8ÿ0‘˜Ýqf—Í~¿iÙÂÚ¿!¨Õƒ½#þÈñ‘ýÚJ?§Õ6^‹&g¸}"æ<ÁCæ¯4Ù$Ê—Qj5Á¾tG#{ƒ&Jc¡JãCçþÍ,Åü j’7 -“’j9ɧ„›Wßkb_s¿èó߯w/b^ óž/~ûå ÍúþO‡*ˆ´t)ÑddÆþÏÉæÞ ZOys­åùy>ééLœ›+ì>+dX44-|(Êár¤ÇD«n¾ûèð–(ÄÇ ¼¨dHÂÙ›Zê1_i(_6úÙëÝ7k2yÈÆ“om¥ÆKÔA© âÓЯ˜¸p&/&`cƒí6ï©°Ñ×3ùïE\^V[SYI[=Rw”9²ºÛNz%¶V89ä.§6d¥„µÄ——Ápyƒ/w_& Í{Ev º§Ô7 ¾â•è}ª¶â¦šžëjÜÕm6—ÿQšÔü¾˜ýzá<®³vn³Ñô±VK„¹Ê2ÝJ(¢ ®_v7«ÈÍæ2±|Áwe‡aè&’ûÖaŽ·Å±Ï ˆ0ص¾ÐýÎï×ó“ŸDt÷ö6¸(óEà\ºdo»§Èé“É3¥Q#€m¢’‚Q8_ F&Òx¸= Š×o*±¹Ñ¿ëÇn¨çÚîæ?¹gÑýK&änR'Û1upÆü_|úÈê2 ­s|€0n$‹™]¤¿Û3ÒÝ4É80™ß ¿¶tq…!X’pL) ž(KÕ¼·~ èþÕÎÆDUgÕ‹.ä”ZA"XfÉV¾É'ø"¼j‰oéQ äc…ó°‚@àFuØì”—>ì`}›š<Ð;~Ò¼üõµ4q‰­xpÀ­7õ V íÇž<©‡¾eÎt©ð~ç<­Å¤ÔéeZÂdÝ´ Ô¤üy[™^v@²XpÏ/ȵV·ÓPO¬€Cßn¿Wü"¯’æ6³¯º"*•{‡36HÄ ]SNU—§ÜMeI…àv½%Ì~´ªÕL?0ÅœõÁô^›Æˆƒ Œ?↣®*ûæd^\ñ1~â8¾–ÿ›{1¹ülšŸõR!®–bï+ª—‹-ËìÙüùüxCÛð]ˆÎüÀBQBªWq}#K¦(Z¦G¥Ì†ªE5–Æ¢z·”{}åK@G;úbýE0Ó!s]·KQ̰ýÐoÄG‚ž`£x™ÃäÒÑAÙ‹XGZ6 ¡ÆPbÀ'Š`!¹ùñå¡ÊPšMªõG¡‹o”¾ùž=÷C 9Dšâ$½zïîe£rŽÔòØ·‹wŸ¹/ª:¦’w¢‘#d%Ú…T²d¯\Ýp†wq`Öý¤«ûê…<WØ> +Ù[ñ »5ÏG¥yÚiüˆXÈŽÂÙæFŒT­Øb&ó‚šVdW{Œó§7Ûžõßásqc«\dùH>•µ>ГD½GŠ`¯œÁ8›3Ðø¤%z@èíf²™Rô‘Ö±¸ pÐQ³`®k LdfGn/äMpœ; ’:Ó+UñüUVšçÛ^é×â˜AÓ ÛÇÛþ:zÌÉ3CZ„ì¹™4^žYƒa,^ ‘¢„|‡"éù1f³wÓHŠãب Ú^òï†"ÍŒA_rÖ /x,ÔêJéL !0ŸHå¿@8RÈÞ=tTÞ•‘Ž8aUmž•eB«Ü·ՈÝ^ 9™hVXŽcRî©àøG°n¿ÊJæìø… 6Ûxgˬ”XØ‘RN6Êb¾KvPE=”}ù4È@šë Ì#ÖÕo÷$¢=Ça†8ÿŽÿÛÂáeÕ¹,þö U–¸u³¬?v^͹© TG*2:Õ3sÓ»•Ê2œçrž¦sLd¢å%àL)—(Yîäö¯µ ¸x,Ìïè‰rXGµöc8é¬È$íN¸¹¾ëg›¶sì µGÙ“©d’·ÌV —úis2(Qh{„q{5Áš¶¦Õuué¹AºÈ\cŸæÜ2g?y2aÌULís²ì'L5N#¬Ã-=¬ÒCaQàf}\­ 8²çŸ2JQ|çh×ßà °p¬\ÿôc ¬‚ÜÒ”¿ªËb’^¸Ïº\T~Þu$ö.Óg˜\÷‡J­‹ó¯©ßñ&·„øû2ú3#‹ôŸÖg­] ÁGÈKRíÆœ œôWå³UÜà ¿ˆóƒ‡›ˆlªûü˧TX=ÔçqÅyZ« YÆa“› ›]Š8!»fË.¥É<Ø3\YWMß×ÙIŽÝ'Q)_••ùÊäR¹á5þºÉ«¥Û‘ß½ßW«9)‚ñ“X¡Ü}õ¦ÿi½W3¿Ž2ñú»-3OjãS©sxŒMÞ¡=]’ð7é3~†MD˜ïŸ—‚ØÒ”:Ýš«à¢_ý­4QµÇ™U•æ›éÜ˱³äØÿ‹”ÿOðÿ…=ÐÌâè`æb‡ò?Çͤendstream endobj 28 0 obj << /Type /Font /Subtype /Type1 /Encoding 105 0 R /FirstChar 2 /LastChar 122 /Widths 114 0 R /BaseFont /CIUBVC+NimbusRomNo9L-ReguItal /FontDescriptor 26 0 R >> endobj 26 0 obj << /Ascent 669 /CapHeight 669 /Descent -193 /FontName /CIUBVC+NimbusRomNo9L-ReguItal /ItalicAngle -15.5 /StemV 78 /XHeight 441 /FontBBox [-169 -270 1010 924] /Flags 4 /CharSet (/fi/quoteright/comma/hyphen/period/zero/one/equal/A/B/C/I/K/M/N/V/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 27 0 R >> endobj 114 0 obj [500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 250 333 250 0 500 500 0 0 0 0 0 0 0 0 0 0 0 675 0 0 0 611 611 667 0 0 0 0 0 333 0 667 0 833 667 0 0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 500 500 444 500 444 278 500 500 278 0 444 278 722 500 500 500 0 389 389 278 500 444 667 444 444 389 ] endobj 19 0 obj << /Length1 1612 /Length2 18334 /Length3 532 /Length 19244 /Filter /FlateDecode >> stream xÚ¬¸eT]]³%Œ;w9¸÷àîî®w8hp ÁÝÝÝ!8www îç}ûöíq¿þþtßgŒ½ªjÍšU³ÖÚ{JR%Ua3 „ƒ½+ #ó7€‚• ÈEÞÁ^ŽAhü5r PRŠ:]­ìÅŒ]ßš@3€ÐÀÊ `áááA ˆ:8z:[YXºhÔU4iéé¿þ§åŸ€‰çxþît±²°Pý}pÚ:8Úí]ÿBü_oT®–@€¹•- ª¨¤-­  ‘TPHíÎÆ¶%‰­•)@ÎÊh落;8lÿ½˜:Ø›YýSš ã_,a€1ÀÅhjõwÐÃèøë+Àèlgåâò÷`å°p6¶wýÛW€•½©-Èìíæÿ"äèìð7Âî¯ï/˜’ƒ‹«‹©³•£+àoV%1‰ótµ4vý'·‹Õ_7ÀÁüo¤™ƒ)蟒þåû ó×ëjleïpz¸þ“Ë0³rq´5öü›û/˜£³Õ¿h€\¬ì-þ“ÁW€3ÐÂØÙÌèâòæ/ö?ÝùÏ:ÿ[õÆŽŽ¶žÿÚíð¯¨ÿÅÁÊÕhkΈÀÂú7§©ëßÜVöLÿ Š´½¹€…ùßv3ãøÜ€ÎÿjÍ?3Cû—„±™ƒ½­'À hŽÀ¤ààú7%€æÿNeÆÿ>‘ÿ$þoø¿EÞÿ7qÿ«FÿÛ!þ=ÏÿZdk«`l÷wþ}ÁþÞ09À?wŒ­±óÿ'ÜØÎÊÖóÿ°á¿jÿMòÿGÚÕøo3„í-þ ÂÌÈüo£•‹„•ÐLÉÊÕÔ`nlû·Sÿ²«Û›m­ìýW3 ,ÌÌÿŧfiejcÿOë9þíÚ›ýWòEúu&aEyQ)úÿz§þ+Jé¯ö®jžŽ‰ýÏRäÌþ×â €7ÃßÈÀÊÆàü››…Åçÿí_0,ÿ¹–7vu¶òèþ-™™å_…ÿÏß®ôÿ Œ¸½©ƒÙ?³¢êjloöw¼þ—á·)ÈÙù¯ªÿ:ñ þõ¿ôš"¬,:˜ò[§f¤¹Öâä ‹éöõ°@…8–4¨æûW;üòK Ûæ©0z« alœüöÑæ¹pêø¾/Cw0ÒƒmKý+x™GèCNÛ›¶AÕÁEÈdP‚œv¦å}5/·¥Ãɬq°3®¬bPüC4ÙÁæ wõHëOî–ïIñàˆâkšR‹Õ‰Ú†^[pzF•püø@=ð{xhð× tï>}v,<%¯2U¤¿S6 Žz…w8-LZÁMûÕ‰f··A.%>E„Ü‹’EÞª}»Ü["tZ» _‚¼³Të~¥öõìd$ŸpÂ$ÏLÎçˆR܇¯‰p"¨ïÏ´ EÐTl=ñÐ=Ä5MŸK˜w­]5ÝK/JÎÜð”rgI½{ Ì>%3Ãp8¨E´ÕÑ…ÒKoIDÖøVšf›4ð0¯iÂßÑ3cSs&g–£ï\›«ÄxÚüã뤉³À¸ñF¬Bn(¨éZGaLмèLÙ³Ã÷2Ò­€âg™ÜK¤–.bUêSc‰zg‹ÜœÚcâHwQÛ—6K‚…à,q _ž¤0Š8rl“¹ÌѺŸ§ýGé›öè©'^'¡ l2„é¹ ÿ%Ny…­°Vá SUùmó£[MÌ·²dÒèš"§×áÑ”ÉÌ0¾þXì(ƒÐŽ—/z ö û£¹Osd~΃Ð6¯º£6ÏC(^(bÑ|éx·ž£Ñ ˆN$ÊQ +Rüa$‰ËÙ“?òÈé.ôEHÖC—¡£à†³‚?GÄi m¾ÜOJR ¾I±„Ëoöæ¨RjÆ­¨/$hmfIp„Pj ×!›CxëQÁãš–ü¤4Y˜ÎÔä;3†tO×ìdS5k Ž¢;çõXyÙGaÊ®V)žñÔ±Ç`äÓú‰„¢ýk.)¶Ý½sÌ)LßÔE»Ôv+žãô0ðýŠÐüËr2¬iŲóª0® ï¢ðãáOÄ“MîE0Ç¿Ê ZŽC{Ü’ '‚áÚàÆÆñ²­jêz/œAÔcø_{£áŽ;‰R$ÓfõBÃBîrì -Ã{Õ=:õ=;pêËv:™Q_Ñ÷OèMU`&éKêìµÍ®Uù):—BÈÒbè5ܯ€Ó/´ev˜œ•"h/3ÞíOÏÊ#S-ÎJ÷&1eë™d©U*Y%¢ÄÃ÷á¶ðà„^ž1{~uðÄ:ìÕ×Y+T¿ úMÔD¦yNrdÜDïœd›¹£3÷â;Îdûdh¥„ ={Û›Oç—%NéÌ×fôzèç/b9¨®PQ&p‡¶ ™ìb" *ÔÜ¢äÈá`CÍð}U_‹>Ñb ÂD‰'‰õN}-Œr}ÃðGÞõÏéw<ÝsZ$rŸp%L€d¯n¶|ZD éM$ÞòÞ3ˆ¥HŠöðFæ¼Ø2Sš=dÓâIò²}¥û 8ÓBQïbiI؇Ñ;æJº–#@^K?ŒÕWÑ0ÕùµO”†QÙ#±w¬G‚oNŠù0NÆ1¹Zi…ÄÎß:ƃ^Ñâ8bàB®zp¢ñÀÄOâvÝvjëhËΖâË6Øwji0"ÙօΦëSîXµÙJtΉ(/°rî&ac‹¸,º×G7–‹åAМž‚†iWyVªni>ÇÀ»ýwÊ 0-ÒÒë")Éó}2q~ûþúiÁ„ÙE•‡²þW̆à§6©«ÑL¸øÝ- þg0„¸–€g\ŠŸX?OW¤*ÛuåŽo†º£Ÿ¸5¤BÂð„K&¥srm•l4¼šîcCzFEôµ‘P·Ö}P® 7}}öqƒª«³÷tî"t~oQé3G0ƒ@;˜U«¿{ÚL¡ájôBâóûÜÊü„Aæ@c \ ª˜ToMˆIïbØüH«É%‡‡z9¤úÔ2¯ í‹aC!\6Ý7öýoÁSAS¸àeÙ׋!)>5Š<Ý-²ìB´Õ§ŠUj‰FÚán]†’ +”HѬì®X@¶Khˆçài =pØò-`úÄVžÁ"õò%°D|aB%+iGä1H*JVTKøí‡q£RbÎó:KL®ÕBwÑþŒ’ó¯M¹F —JI¿¶ò‚¯Õù7äbðXnæ?ìÏÃÏä/+vN'¨W?}˜ö>V“’%6Y#¹v‹ ® 1¸–ªøÙ|Ú¨Í1ëH| ZÖb»Ü«äKƒíð¶d†–7·­Öf~7è ÁfÀˆ·ìÆ8ݲ3Tû2ÉÿÓ[´å}¹nM/äÙÓ.÷.üŒ#Æäú½ûçðL³*'=y‡“e"›V|:Tf¹¯9MLÒ73AÊFˆãnIV²€Jyö°÷rÍä¡,Àqn6£ß3©ßs#LRc¯–[ªÉ3a¢)èS´Ÿ‡°r†“ƒ ]7Ô×>qµ}by£ºn\Ý4ðúÌu…©8°zÜŒG€‡©y›3‡[{`*€"ýv#]®¶þ¶VÃyñ¶%Ej£ž8p@J0Í÷§Æ—k‡âr`=•E‘kŸPL°®mw¢þ÷®Ã¯üæ]é´ŸGC—ˆµoË®Pžîú«ŸÜ«1;ÖҌצü.=N“EaÌy;ƒ@µK¹C<+Åø{cDгû29Ä ¢Kížée3mb4OTCú|Éüá㬭øË×ñåm“”¢ˆ·Átm^9îÜž@iVÕ¡5yÚßõÁmY½°Ú° 궺>ÍÖj,°ÁÐÆLÑÝ´œßÊ+ñ¿G ð(è¡/!€ÇÝãJáÃi–¬xì@ò‘äæ«ó¼ÓoÛž›GäQk§4ç*ËþYø%TšŠ«ÓjîGsù#ε"¡‘ÁB Ð)(ä¨^jä˜jpKˆ÷«­ï6d³ÑM7ÀââùÅÅѼ ôx¼cÈi{ÁLòÚ¨j†'+ÝšBH÷h}ú”žëBN³8¹Þ=Êýøb =Wg]7mê‚: Ö¾g‰Â(ÞJ{š™ßáM¾uM…¹@Ë -é–|²Ëûa=ð W €†E`-’]šAQ:&ê”Ï^È$´„Bœ_sã°TÏ0hï”Ô£9O3òGÂi&´ r…Ú£‹}Z þxQ¡wÛÉmN;bá¡–g,`“¦^¿ âÜR¯ü4î‚CÏÍaG¯Ã]2ž¹â\ûÑé”±nt°ÐäÀ´Çuõgå-JÛ‹RtâÖº2ÕÇIݰGÐñ£8¨D'²qbÁ¹+„9ök£„ØB°‘ý0'¶ïp"(~¸Þl7G÷ŽÕ½ß ûº¶y†Gä’qq}Œº'û‰I§ôÙÒf™H¨¬ìòRÁùœÏ°ÌËÝp‹ýd_úÖù ¨fâ÷ЙïF-=É^·K;Òfx5bX0Õk±^Cgæíª£ŸWGÛá0”Ì<ôë5aï”#µž,yñY3š†DÉØ)MíÅ ´†©•°[mCRÍšr½¦Þ‘eí¥Óß_õÒeœ‚_«×–¿‡ÌŸ“&ûaøÊ§ ÄÀ«„™LÇè&œ×J–Ȧéë‹òݦ=Üae QáíÁ"(Ez3ÃÁm…ø­–_ÅË.+ç„QÀÂ:uä$”‡ò± ¼P ô Rüróñ¾‘âñP˜F™5<€­”aK¬Šc³lKaù¬:ªû€¯~ª×5¹-ôæŠkëE†œH×#óêìØ¢&PÆÌµÙ74kôÍ ³€íîƒæ^™3„ä²ÏeÒ\<ξk=ñÜ’hµsQPÚ§{UÓeÅqÊC°Ô KF”åÓãú­Ÿ ±zôÊèÞ#Qy‘ºô·Å¨hºP²A wU¶ž<¡‡!Ì$¬©|Á»ÎPRž[Ûf“Í[f=üñ¥‰ vJ‘²ß<}ÊØ¸… 'RBüK7wùsåu[âyã~ïú4¶x $3{uþkK3ßä—²†VA^N9HKyÑ’0:Pʱ¾v{Zñ´þö2onNõ&„$»ÏM׈¤Þ »\TßHu-Æ"Ÿe‰k÷„¤Áì¨(9?VèF ø¸8&íËã½8•7>†´¶˜h9p I[ êt#SFΤ¾%hÀŸÊO݃SÅ™KIþ¼ dÚÎFx.œŽ2cÊ„Ýé§…öذWȶ’·Ó¾?Üg³#ÛåµO´`kE˜ðúˆaYt{þ|dvÁD#›Ú ºë,šV¸31$ ¦ÄUÛí1R¡àý‘Í39;NsþòÚ‚k~÷g]½ðJN·DžI¦ªxi&sb«‰¡AÚCd‰ô ³}ÔçHMn Õ2H®¤§J·Q)tÓd{ZÀ¶(íÍÝÝ·õ¬Ø¡÷$,¾Ibl„·%øÙ tJ¥žR$¸@¼*%{3.bp0ïæ;«2e±T#ä×lóßo XïFTÍÜýi59ŠÉA `—®í'…•òëQµê/›NzWyb:ë—‹í÷'„ŠÚNY‡ ímš¥Æ6ɤòô&‡n¯¹5RBå£=¢3”û¤¢\3M0©Ìü1òõuÊsPeŒ§î‘áGJ!FfV7Pš¬Œ× µÖÑÄff‹(ÝøÂÔÖçb›XŸ±zļ<…]Å•I¯ê¼æ´ÃžYÂ÷³{唵É e)Î=¼ÊŽefF¯ÉIG—a=5¹ ™Ï5¬û^œ5€—-ôÝO J>ºæI|ü‹íˆ)ìÁ•Òßï%K™Keô ø’xˆ&“n”!ønD4]„BúÚÛX2å@/)µÈ'"»JJͯ,@ÊHeúTGôFL‹”bn£Î.ÉÓÐXÈñf=Î÷UZ®Ðþ֬Ϣe·˜ ÕéÌœ‰••¯—Ê PE c¨w[4¤„K0ü_¼¾ï²JhÃÁò™¨Û¾”ßàëŸ-l*Ö© &ßCÅ}wýAÖEMpÎl‹‘Ö[Õ }øC¢Mœãö Cn(£=ùƒ·¾¦6´ Wjàö[÷ÞÆÝVa\åÈªä … ãþÔØV >&jbå«kU¿¥gq»Ð±'êÁñùõOºÕôÄ™àa…2,›¾àSòëÀeÒøÌ´ieaä(T?ÁÖ’¹wÿë‰Ä”JŒÌÛ&B-½m.KNc¡qHÁ¡™Q–¯©^ÙS|Àç#ÃU]Í47ˆò¿¦~ë°)tjGq}QñŠCé±Íô–JüšâÙéø6•’rzë2.× ²Ÿñ »Š"‚7r=ÿØõÿI‹¸gÇ\.7²ðÙiÈ£}ç »N|ÉVÆ:úö´ÈÜ`*£­Ý±®Cª4ß÷‘]±oŠÏÌdk¢%_‹­sC3ºÆ|NžwTL´6šü<·ÛÞæ›q’'eŸ´D®§ÝmÌa¶=Þë¢ }56ª ãŽÎÝæHå·<ž(î=Ä.T‚¸>8/>Œ•ÙJì$>úA—·ý¦Kd¦ÂP.èš{ƒ×oп$n¿7ڙݑGÓ¨¨­î>Œ¼ˆSäáŸ"£n1®Èá4edH߻ЬŸ!N÷]Õäòª¸bh |›&Èn’®“\  ¸" ¸ 9¨ŸùñjÝÜ–Ó᪆b}\x7”ØaSž¤ŸýÙq65—g;ü./ƒãøE^·l&¼3æÜ1®±<šCî95'þ÷õìð¢Kº‚«-7G€Ë—_”œ¿YÄï­aZ èÜ;öزƒ.Å0^ÃÁuÊpåà\Mo‚ÅKÀŒ|³“O1 bÜ áènsD: ¡¶1QA-’·´f±„¦àË**ySÇ}“˜¶$¨¸í<AZY®,³_«Êû{†øÞx_׈Âú¸Ï·îJíóyMÐ&BµìØ ôŸò¿Ù«ÂÀÒ†pH~ƒeÂçΑÞï‘h—òµ¨á„SóÞÒ1ÇqˆgöU|ÏÙ‰XÜ…#ׯì&hZÖùk™1‹f|Ü€ˆ}… W“½½;³Ÿi_íšl´LñíŸ9?S%ÈLRs1ž¦^øz?u2yÕ‚Hº /¨î«Ïc²[mG¸Ë`lÒ–ïÌßÀÎÀ]WLÐ?¯ëtQ?n¤&]ðó-•¶|ɲö·}Ã5<(1ËËn{3·s‘‡Z_¶¹¸Ú?OÇs(xmBsþ¾y‰N,,?{°°Y¾íÍuP"Êëµëž:r«Ae¯ÚxôU¬dZ¨ÃZ*ªÌõv¦Ç}AYÔ)ÆsÊ;£|Ô|ÉV ­zð‘T+?,‡ãô 2Vüä[*OO¤¼|LÚ€ÛÖÌŽL”ëI«Ã;œÒGL¸þZ•F4Q¨ÑUcŠoiéë>ùYo΋ŽÝ8‡9Êê¥Û`çÇaBñ ¾WJ:”óϼ¼6v¯‰4yµ]k5ÛaÞ't -%_¨vhË‘CÑ•Âì‹Ñïà5ÈIéŒ îk1¹j|çÏÁÕ‡4,Á‹O/fÔñ^x²[¹UNÕÃ,ËPxá@3ýß/>%0ŽP11 ¿Ý%¸‚¥—3Η^ßW87±RMocÊð º8¡ (è;¿¢VÔäw[ƒ>ô öZ ÆÁN.<þ¹ò€¸' †¨O#èðY½(UÎѹxYC žÉ =ÙÄ_«7°Ä3y Ùh}›D3‹¿¬÷± ;ÝHÚ “ <®^Ú¯ü±èñŒ¦ba±;¬âÉtšu5Ï«¼»8ƒ£¯ qÀNqåÚÑyËc¿í×$$ÈÙ—à×Å¢H†ó¶‡ø\ ð|£ÒÔ…qÈCµ*´K´ÌK!眯3mtKïÕãÊÞA¥< rÑ0“$¡åºs¹ rçHìBonªcº[aŽEµ¸Ã« ´ßÛÄvh Ý$J)dètuÜbwdJ[˜~â¦7 °Ü®­‚ð¼P0:8dgÏo‘ìÒö„lþ€èjâµExèû¦7(ñð†åH¦3p¦¾e7À”ß²=2О÷ˆ©©nIÖ{뜡ŠÃ£X}ÜÝÌè$~å¹(ŠE,'2Ðp±h‡!ôǃëÞà™èèØ|ùz+Ô‰!§Â'çfm?Ó?™t÷aYqø¾¥j וéüô@:>]ÀîûýÄe<¨×‹\³¯¨%[iFÒ4¯¸ÆÔߌ±ƒ±UŠûŠéÛ»÷$Oµû#ûÖ· ßB¿‚±_;ËRîrÇ;¿|3k™›1¥×$*Ý„&j^{w“Oµ(j&eú~ 3ìâë “q{`kCn9p÷¿ûªåaÒ00««æÉi«˜Ðኽ†/”]VfÛ‹›2’N÷äd8)Îþ†[ï.Ë5eõ/þÓhþgPeA1VöªËäh'Þ)Œ@j˜ùÚø9×{¤àìyѹ¶‡ÿ)þW¼³¸Gú˜Ÿ1pþM„)œ‰Q7÷÷%Ùc^ÞÞ©H>÷šRSkÜ`pa‡Ùc!ÿw2P ­,’aÃ/®¸èZ[ÝCS-„541çÅ¥Q‘dt/?Êf‡Êïý´#ƒS­ °Ò,qr59°¦È-K´è’ (B›ë½³÷Á š>r’šç>Ê;ˆ+uˆ÷EgÐÀ¯ã^-&ÓHÒUu•B‘~wðD„¨1ëÍûvó,Ím'ø¬Ö L“ñ¥ò10Šjê“ñcð>B)B¬aX²Ù¾å“¨£ì½µÌo­ ò ¹ö¨Â8:%ÑT0”ܶÁäòngØG*C Ûy—Fkæâ#vÜÞ½9ýEÕží’´ >˜dLJ~äÈë“ùSÜzb¥ œ© iíJŠȵKFÆ–JýDhæ{èù Ua$]æÓ\¤í™þؔᅲND£œÄ¿øØ&;Bê¸#1í]Í ]J4½óbßÐ~7Ï¡lF<õº¾aÞ^½Ó£‡¿€ðÖêrÄ’‰N>¹ `>lŠ 4˜K9{ßÖȘÖÌúçD¼œbNO«Ýø ÉļÂPÍÆ¯%ÀŠA³zG`*Ø3 Äü~¡z`[øÎ—’—ª >\‡ƒ¯”UA×ßßv·Ç]Ðb…µå¢i@”ÅÝ!þœ\¶ŠÚÕ¥8p(PÜ+(¬ÅÝ`¢"Óµ*A‡8‚*WO2°vú’ÏŸ¬×¦fßL/œw(Íydt<·Ð;4Ýk²}ņ´!I¤E¯@çg`œ¥E¿°P¸8¨¦ÔKlûú½/-§\°½a,ÅCŒ¤V<(Z3º‚ w Óa’ß ½Ò(ÒSÓç-þš¡øó«Ÿf Ì&Z[ l9Yäý‡¼©¡†ý„9‘O-Ǥ–dÙ¡":¦S3r NÔ‰-þ7„–ŒLXÎ*=ØdÆT}Æ,ÎÝÈ×ÀbÖÝo«º dt-®QšÆ‘jždž,î/g¼i_`AÂÎ&²iQÌ3d±—ˆÀ‰,ÍTÛô­%¦7íl¡ÛÊc6Õ%ݾýßo˜Yu»;²øõ®Çl¢ú^ÌGûe1ïýXÙÂÖÀ>:>®•ý  žŠzɪP6·n‰Mûïõ©v;êf«ƒÒ°Dxê¾Á0ù¡ü¶ŽO7€ÈB׋N÷ŠXˆÝEüBÆ ¨ÑŒ,ÂZ)uÊÔ¥XëfÐî– ŒP8qrvŒpƒ&Œ’ü, ÖÃ3+Õ8 ElÍqnÈ•¥<8¢Ñ=Aò¯å>¬±ÖZ‡9oUI•ºBJvøh|ÌÝlAy<[òvm¬Öº‹Œhi†;fªÓ ž¡MÓÎAúçH㣭"Ù_¯ˆöêr|œ9Q.‹(ÊŒÁãqÁíŠl]â²òH!˜^ÊO¾œéU÷ræO4ÂÒ²TVo ®®Æ$¬«?«ièâÅ@] Rr+Ù{˜êuâ;Ä<Ò8(ˆÁ^sv«¬ {XiMkÑ…Ï_'e¬{"2gÒ{Œœ-cþ~4ï|]¯&ôèÀ““!ΡSeÓ² .éí„Ï—†‹´ûaÛêÞ¸c¥9¡js1Õji8rË“Û<æŸx…–c§ûT/s(U«ÀmJI-Â#8ÔàByR´ì–Hù„ž&ƒí–LÜ×-‰nÈ¥×èÌÞ6ÚTyû]”ŽS\ó 7œé‡˜Obs ìÙT0ìÄèÅuê(pkF×¶È¡Úÿ›âÒ \/جS­ˆØÙš 559eŠs>tŠL¾Ü x—Š@* ˆÎ‹ÕJ¤$ÕH§¯O(ôúÑÏ??Ž‹“ˆ >Øûyø}†ä¦Äv‘j4´þ#_ãÊ<,й—~Dš ¬rÂjæhî7º^[Ñè1 —ô>§2·Dw{„ÕxÕhòµjÛ5ÞâךÒÂò;ñAžóôQLIˆ%œÌéüéN«W'L~p¹û(] 1Å©©”¦ßåÊf­ôCâ™ZéOM>çA'¡c­Åýª ô¥Ü dû/“-ËþM°ÄL½4¦6NUnö[±]èÓWònN}:DÙg«¬ûÌ È <×X¸¯x‡»)âZÑäv«¢Ø²•#ç•ö›™+NÐÕÒÓ„È8 ål?¹ù±d›Žô»&x¥Îºo5-^[æÙš‚,ç´à˜ yG¢ˆ.5pzª … «¾¯£L»˜ñü14oÚxy;y´„±¢ëýä,sÜ™¿_Œ h|pûW5®˜ˆòšJ«žÚŸ*äê$ŒA™¨/~@4NEo (nýΉï}7Ь7[æÍÔmñ#œó_ ï·FÈ(EÚðÖ¨Sè÷õ†mµâ³ð©,1]ºebÑ »ìêÌ¿OJâ´À"îÏîÆÒÃjÍcÚ'ÐyRRñÞ®wíø™„g´Pa¤Tmbçpïá©„4WÎ…x¥Ÿº»a̾Œï'Ö¦Ž<¯íœ.`Ó›pæÆq0LÍT6´TRa+ ::yg‚­WmF8ráw‹˜Z ,¤ãëìùÏžŒA^2?ç<  æ!fµT>Ùí3s“L[”VÐ3%©¨gèO¦‹ù)BÖb >äÅÑ7y/I„PäÅD«%\ö,¢E?Ô½æ$WhêÚÚ‰Ššôzêþ8LØ®Gç\’JÚ‰[êÛÀÒËÕáY•n!ÿ¾©sØÊƒ?"Bž¼†ŽŽäfŠC›Ì¯ô ‘Ô+ÇÉO3Ãj˜y£Pº &:ÌcW\Ù¯òûxh¹Ÿp²F]ãJû&_[ºê@ÐñÛ¬ó(bgjØÃâRƒ}ŒïÒýpó–d•ï±ß¾ÚûO³ 3¸ùžpPAÜ[£¡Aíú3¤Je‡ ´¢J©Y¶2\ÔÜ?õÌñ}7³˜O¸¿±qÆY³à5$t„áÝàÕ1ç;%Ù§ÌÃO?Vë'‰‚NÄ7I3ÄDÈ4¥ìŒ*% ¡ì)B_2Oúuâ2d0 ÖÆæ/G~ØÚ#G²Ë²B A4YêµÒGµ»Ývd5¡Ãù™ˆc™™bMfIÖåvÒÖœÚø[ò£L¤]¯ñwù,î……¦S q†?oVfSË Å›]iL—Däªb( Þ¼Zátö¯î^}30EŸÏĸNñ`-nUbØóËÃ<Ø"`Þ¤à’F¹À<Ö¸ífçènI Wg´Î7—ÊBiJ‡°Æ$éèç Û3LÞ¾_V )dütíýbz&`618÷2PAk¯)%,1²ýi2sMoèöÁšDåêH‡°˜p3Gþ0-f0A2?Wn±¿¥MÇ#™A œã ÀW­tøÚ:Ì?äÈæ‚R“Çš¨§ÿ…b›aL‹Ì‹,©CÇ¡·2ñÁ™\†•x+ú)u“$UBgcb#ŸX¯U¼)ÙÞíwqxöI’*x\J|tž„oÄÚ91¢F=–n5Z à,†FWº4FŽÏÑüu6—É30?þlahÂ/§£$&Áà”Bżʀ*ל‡·j¬Á<ŽKrýÔR¬=Ö'J'k×G–é©DtjÜERð!—`¹ödEÅÃC·N®ŽØ¢Ëáë:ÊçP¾ò7 ib–å‰$>f}½£¸í]ëò]oKÅ‹á·$õë»õ â"Kovíþ¼Šß·5úgýÄâ®ÉØ$tóªÓI6sczTÕ+=Æh†›„¼Lµø‡PfM‡¡ÊÂׯ:ñ« µb] ‚ùÛÆNvºz_ëmxõ'I²£Ì]ô´O£U²ÊAVñlº×2`·¿w1Ër¦éNùÞÍy°ëdh_ø°Ê•p&÷=uFÆé»¢!b<ã/hÔ"8ï©/fÜð¢-uñ«ˆ„ŽOÙûp8ýÕ×Htçp7núÌdL†v¡Ša~i:Ò›Oaäe´‚·f¤™CJ†x¾;•)œl¦›:•»¢„¢Ò-jƽ_ ¤‰ØèÔK÷~ÃdH7~•=e˜X{±¡*S'“:rclXå6¡>¦Bæ6 š•q†–²Ÿ£Ø¯œ&0#¯°ôí¾#íÆ,ÖSô–®5.¦LïéWáCÜ'GVšG•Uùj#R â ”9|VôBÆ èÈe¶Id‡ó)Yü;Ëœí ÓÓ-2M•C®žî' Uz£í#,[õÖüuGÝç€Pîv°ˆäŽh‹²Ú~кW0³%%ý×3\ç Y .r Ï«·-¤Î>èH¤t‚6äí&¿€û—r–>áËRºIÏÏ=ˆûñ Ò )Å {__bì]ÓŽ—öögŠNj"IóÊX…R|Ñ*t'¯SQðSÅÒ5úñï‘ » _ñ}Ü Ñ»›àÓ5Ø™»°rTO†yÏ CjDÌ÷?þÒÆ|ÔøoT­ä—¦ÑiñWÌW5ùmº®ªŽ9Èmþ ñîv:9âPqÚ2Cˆ¯„haÌ„êês#M@êBÇ{]­¸èEл߼Á%ocÍ4.…Drj/>%®™C' qOg çHŠÎïEbÊ|VÁ‘QÊÓ°™rp$ÍØM¯²À/\}Lgt FÿäÒ`OeìC¨8—UV/ ;YáónL9öEÉw˜5™À’·ì«]Ñ Í³²}Þ¿X:Ÿp_u³ÕŸ"ìXÐ,ðé üò•[À9®j0h3µ:âDZþÒÕRéÐ(¨e”¯É:¡× yäWŸ•†48ßÏùÈußñô»h∞G®5ÿû²þFóú‹LØn}õbב\ÂÁ S‹‚_“8 f§ ò?HÆ ¤ÏÓ¨š(¬5Xỡèî"­@‹V¹Ôm#Ûê0‰Èw3uu(¤èË£=Ù—£·¥%óÎ9ÉfŽº‘Uƒî”*f,’ÙÜSÍ‘í7ŸÛÌ0Êߊrf“Tå27¦hªîÚ|w"•üPÔqéeaq8†jü6ð. ö´õˆš# ~IæüqOǯLØÆ”´Ù\׺rŸ¿æ#û9][ -7ÿåZïLn}ü³_q"F¸eg¨üåì0ÅDwù°È…À…Fž_Wóh¦³³èØ;˜ V/:Bœ³D§Ï@FƦBʰ’2ÑoµŒÓTˆ}®5 ák#}Ú1jbœ9à+[Žôýb ¼B1œèš½<ÿÏlTAýÏ þ3„W1ûö?ÃsW᫦l6ŠÂàß8neÿÀÊ ‰l¶è4Olíë]$¼÷ Ê"{dSÿq[¦!¿ ÕÅ•›¾³Ó#Ñqš©0‰ ;XÛê§p\¸:¯æþÒ߀Aš;ä˜{Î×ûÝA‹¦Cnagö²•&‘€zör/ã Æ?r@D[Â*Ð[ÄÆòP½ÀZ‘˜ÕÇr9ìÍr£hî¾np4û^Ë.wiAZðé`ªºa2]þ-ƒèÇ—º“ >O£lÄ8ØÅÀy™ˆ—ˆ#hÞ61È1ãpÕÀ‡à&«²IÎRîMCrx‘\Òdq%CÇÏGk­ÙrHWc2ëày¥ïUñ/ÁÒm›“K ßî!ßN™íÇÄ/«ÞN1²CS?ŸÜýìIœ4ünÂö_S6s”ǵ‡ß̤ï¾Ç<"áÂr“|CM¸©Wú\ÛOö)B¹ê*_ªÿE¾¾ ‡o1½ˆH ˎȰÐqs å¶¿s<Œ¢èïô[qéËð¶åC›¶©²‚2RÅ@) òQ”UyCí¬Ð¬#ù ê+ú¯·z[ïRÌ!Dn²@åV«ÒoºÚ‰ïþŒLVåÍ"€üCB©®'2c'Û*ݯýv^ Ã©Š ?¦þŸr¶fÆkSs›‰šLÚêµLù·Ã3íÃð[ß B¨òéÈýO‹ùL3=(Í?xd¢Q™“Ejœ¸5—HÛ æ=å:áÚÎ6uyîÁW²æ‚‡Ò8¢C‘ ‚#7¹ÎáL5²5 ¿¼ <ÂFæÏV%3nŸ|ž÷דq¶uaפ3aЬo“M-ào³Èj±¬-»Œ(Hr ¼È ê%mmÝŽ¬8+˜E$‚§Ô<’‹H—À°6vÀÜ¿LZ‚ñ'(üg‹¶–Ð\JºpCI˜Sm Qþ¸jñ‘«®Ü/mŽ—N¬ùðöÆ…/NÞ©$;ÑnƹF2IíØ[ãKÙ]-¤Öè–ŒôÒ]‘¾1ßùoù}]'ºæ2Ú— (m0)·b2Æ.WZÇ.p‚­âãÌG ÉEM²¥ d¦áp[ |ZŸR¬ŒCËíÛªq-©‰£5Ä Ê“†J×»dÒ:üfqjœuS©å~ÇW Ž‡›X9*¾Â(ÑÊ^'‡%`âo…½¤püë©_QØ>jþ“ÃáÁ‚—!ãVûs›©6O"ã·š(Èc×›þÙ5rì×à ñ9w8¡Þ‘¸ 6•)¡D!¿ñûJdíà]’‹ª¿¬w²ÌÅåã±2{sZWõ.sM®2Þs‚JŸ\Çab¿öµÊßÁÌ2G+p(ÂP»­_ &Kô8æÊªBtá÷ìÙ øéß t»G0߱ة?‚4?Ô9˜b°4äÂÝ#46•´&6ÑU† ´xäÜW·Ð52¨€H"é×WF®Èˆ˜Ý÷»$qHÏHcŽè>l¹ò›bœÃ§ žVGÛÎqâ 0ÉlðB s¦)Ñ9?3Ÿ0ÝåþÝ-‘)B©¶—æ7%”ú!UÁÎìì‡%*|ÖöyÕ5O¿áK™D‡\ßÃ1y3¢Š!T“C0çã0ì´{pV:ëN•,“ÁôÂõ8ùè¿$'SqÁl&@ÕŒŒN"‡ÛÜ5R‡êq²‚d¥#g9˜sÇW.£éñ!Q:aÑÎ{œ`ŸAÒfÑ|}œWÉÉ ÛŠÔÿÒ<ò›:JÈ„B5´Œ."^—!ä1c_ç¢$ö[×2 SÙ^ÉçE"•û?~QgÔ;*&n¯GePDzê™R¬k» ”Å+!q\äZ²x —ÃG€—÷¹š /D|»=©Ì2 ?%ÐŽZ§O÷y”u¿¾KHŒm[·Î€/,I±Zõ‘K ÕpOîTñ³ŽÑw¤ò_(tByýQ3DÖuÊé`¿ixLoáãLl:A«Å]Fw¤»ÒJ9Ba Ü<¬(åëS¬Ã˜È¹ÈD4©6d®Á›ƒŽRc£ÕYç6Ãý@­÷¾…’^ÓÌúiä}åüî?¤+xú¬q’ŸkŽNù…’“D4áÕ¬D«háJ4iåÝ9ãŠ.eªütà†ŸY‹|_ë%š]‚Á«<| 3¥g\‡ZòŽÇÇ)ø ëf ´æk€7eIË(p²¬Ò,µß ³Ñ¥¬Ø†Ç¨q{žø{g¸ ÿã¿y5îinȦŒ´J[_6¥Æù»_òÉÈ1pKÞ )6QÁ+H¡ÊœdôýAs2Ó3\zQ ÷}]4cei´Eö¦pt\‚©sC1þk·‹ê¡m,xû ?Ñ|¦‰¨’8û†&r|Ñà… ‘0Ðõ†©*ði›q+;~-²+š²èˆÙér÷>ò ‡–åN§/¸ÿÔ+“8#é Þ½À¾Ï¯»ë­7<âU/¸NÇ¥$†²’çÙ64 CSV]¡’U%Qïnâùâ"Þît[y쬋Mênu>ÌM¸à_¨®þmùÇáG¬§$¹£>}Þl*^Óí÷vÜd…á¤/™-Ø.Oˆhñûäq¸[FÉ⹫\#<-ÂJ¾2âÌÙ»n^Û¶"ã›(ƒŸÍ&Òå*xÚ/ðf“²‰ôì÷ã)Nm2þ ; é»b¥–Lý.y×)e˜B„nÚ5;š7ŸL³ÚA eªí+ñ½¯¿Y¡õÓŽJñ&{Ù7q ˆ,@CÁ3(j¯åÌø…ò2«Kð䤋Ðj‚³s¡™aP?‹…xQlìã¡é .mê< ·uíÔã«BŠ;Ê{ñ§8EÞÒ«éG4ëJrT^™¼D@ÀÇk& ëØSŸÆô>§,‡gÖ(º…z`bµšý ƒq{1ÃV“7™’m{ïü¬Ÿ‘X¬b°Ä¼ûçà–ø…ÝG¹Çp;™ 7ì\Êí:}½(æDðôÕIK7öÖƒ (½–ìl´šÀ]äß-ýÑ4i3WÍõBdùö/ÄÁÌõ¨š\¹¦w–‘ !¬HÃÔZz•'}Ç«gk”ržÂ9úý¬„ôÞy)KƒY(Δ³Ø$¹>ù*B€Ó—é<¯Ç[ȶ:3*/´ vò‘í¾Ækcx{“VíI€Ë.$¦f‹*6… Þó&\ðäæf ¡p “±@Š¢(~1½e{òÌŠï·íõ)îH¿ {Á$õ7üNþg†_/˜ð ú°%ÖÔY_¼¹Îþãµôöy_Ó¤¬o/ç¥"sk5â1~¸sŽ·ÑÚ•F–r€oÊ#~³ÕŒ(9] ˜Må*ŸZÄèº<›[Ǭ½Q§²--ü-Åž:u0:¸ÀP¤+'î/ºbô"¹y±á¥ëO~[cë3ÖáØÏ’óxuÎ+gN•™‘ÙgM´‰ß_9¯×ýsŒŠÿ¾<»‰œ¿E«ˆVÿ¸›-úƒøûQMüP¬IÖ#ƒâëN„`ÚólÕ^2âîù²»¡£N®E_/ûÌhÈe¬îrbÅ@áXzôþÁ6áq˜õž¿âšÝ‘†ýeÛ"á^¹¨ÑPR…³»Ì!œÝuUòч_Í?!§”ªdÑ|ú´Ó—ÛùãîiçfˆÞ<@ã:Ç) ®"–0]¹uT§v: ÕM¤ÑEÉ5‘ëÞØ·lx:¶«úšò>Ò·*QÔ·,2ñ,Æ#æÝ!ɾükBr»¬b<Ó“zÈ’½M½TqiªVçfÀ.Ùǯ85¡íª;`yѾ¥Líô–¡—ãÛw§pååg¯[ÀèµG¦sQÙ$õÓ³íY½³Kä†ҲΤ¿»ÄÈŶožËòv¾"©Mr¾vEøên¥f¬BÉ)H®œSÖ­ÁÉ»ìd_¦¸j] ¯µ|ï[G?kÉSqŒm¿û³Mr]Ó`Üî™S±F‰µiq+žùì[ƒŠ!¦zu´6hˆ°ÙÚ¥B–ÒZ¶Ÿ^„Ñ~¾È Ö9nÃÄ`œxæƒtQj'{A¬v\y©Š[UnDãÞâÍô²ù¯¯ Ò_X1y/>%“1ßtvlþVÚ W-Ãÿ£9ïg`œ(Ì1wC”#GaTD’¤)·M)W™;sÌåfî%Lj(÷Qcæ¶©cÈUî[’s®!sëýïïï}>Àƒþ|üM 5î¶RþX]Sô÷³6;T†îÉ2-m³³A¡ùjê.+=´LÆ®³òsêMðò ª®üMóÄ’;´Öú·*vÜI/òûGü> ì.5´ñ-Hªü“õ!±ôï•϶lûÑÆCžÈ`½}à‰é—&rDPG.I´ãË•¹[Ô6­… —É|ëä>iÍÐËRØ2‰¤?rÞúáÆn$øÒQƒ„gG\ù”1ðÓRÓ·,}Øû£ð¯.þ+¥µlrƒŠ/ðCXÖ¯¦|ª \Ky;>›ºÛѺ…Zœ‡6R%|_–©ûa¤_«‰“e»uâ¶°§RU‘ƒ{Fy ¡csù®«ÑÊs†!·c×?J|½ÂÊ”¼?Ð {¥Á`^uh :Ã&¼Äõjù$êá¯B™µ,dž¸7liò•ñÙüÍO"—_~ÊÈwg ‘æÖ¿©&¿¢Zq…ú1uƒQÌtcFž*Ñ)"¿A!hŽÖ×J­–êåÌ!-o3käþ]EnJ½=e YyXn0ßt¼˜ª2Ñ öAÉ›üè$¿s¢ß›§8:÷Íç‚”I-\^ ²ÇüÐ*rçbgc.v§rî…ôÁT²ãáÆ:Ò¸%W‰Üž÷He—䩲d6ä|9–¾%›Š:ÍŠæ@qé¡I‰êžÛi¾]ï3ìmòÊ‚FjOœšÿLÒu9âññ"{Éðh”¹AWúá kì²¥-Ç'&èÏsî ™ƒ)i–Ö]Mv°K Qq°n±âÂN/ÁL¬B©«;bPOcl§þÏòC+…t÷ºûÂ|:2]”ÝÖã3†Ø†y†¶u_2À\ØÒC¦¡kc³*Z¹@'Ø÷¥!JBº%'æ3õcôêÞåpÐkø¡Od-lj†uÙ0[vïLÓÔ]Hås.ÊÀYÇ–·|Ü+#–»Ù9rúx”‹q>&:¥±Óïç%O/kZv+WÖÍò„—íx"´Öd¢ç½N•&FŒoÎÅ(~b/0j’Þþbñ©ÙGf4¦¥šÒCH^ñ-ºÉÛŒZ TÛ¯JÉ &‹þ´ve@Ñziö›šµB€6¶»YËBÆÒm £ü‚¥¶ ÷^¬B5+ìXpYÙ:ö|…{‡Eþ6Ùd³þj7^šžâ˜á;ƒ5½-OZÖ% ì,Y&l÷1z¸wŠäù ×v¡çÓ¥ƒ¡àã:© öžÙžö0õ­ÍMk9É›ƒœ˜ÊD¹ÇÜ«@„œ»Æ/¬Äž¹-¾{!þJ¿EÚRf`:¯ry†Øå¤ÄŒI3 •?-yS1GìeŠÈHÑœm²ÅYi:·éèy@†é ¯;›ÃL,¼:àÈü™±ÜñSžgF^Ôk†}ô :q-'óß-y”eY$HSËàÔq2ÅÄï[ ”œ»?CžÏ^ìÁ·Ê$f·ç ºŸH{™-笠Z]ar$ÞH8 åÄqŸqÎå­Á­ÿ‹’×BâÙ(O7J¹ÜÂÞ¡{+áÐéÛÏìˆAÐèVTóÏåø¤Â>Å€“ )·K ýà÷Iw›$BZvú€ãœ8“ª¶k¶bÐFÉ„àb­‡Ë ÙDZƒþe çïùd{ÊÙ(Ýge¡Œ¢Êøœ´Ûb–¡×#rN+1Ií‹æÖy$¶3=~l0,®c þsøî¯µ6j:¾¬0åô©Hß•ß5¨–×ÅÂu_ø«ºq•½ý­½æ@FpñÔ›’ˆGžzC€]w¡»m‹) ›az²¤©°®]¼/6íߢç9ø¡[1½åáâ`úÌdÔýYxÖCºÐ '9‰QWâÇ}R¶roȸÊ[El·0ÉÁ»zš| L¯.ÿõ ò&î'Ú>T{ß å`“Þ{ïê7á+:y(%uÖ´Í +H$ÂôC¤zèC‰Ñ°UGмBŒ<Ì_Ý&èsŽG ,Þª\|0þµÌs«ÓÍ÷Q)åx·ô{ô(Î,G¿q÷•ZMåûT•0BG|°CàÉ«qï%º1¦<ø+ñí0?òWv!Èõk”‘›µTûy’3‘f)Ê»ÏØæ4AŒ¶,Kwô•x@R%ZLÃûýó¬o[Ö‘6 /22]ƶ¿)`Lgì•>A…sE'€â:½s¥ð-ͰÂÞ)µá~ƒ µ—A[©¯Å‹õììw»îPŽ]­¬¯ú"<,ôד£Q—4³ÞE&¤ûÅI~[]»a]g e‘Iöt+:U`5ìïÒ""¡Ç¸P‹€ø–Õ·ÛVü*™l8–8uNÉÉà¬kX¢/PpwÈ¥˜t]î¤jé,Ááø¬Pój ÝoÏ÷3»È ’ºï¿|§ÙùÝQ8þ5Æí4ƒ?4r¯ÁêÀ•=ʃðÜÿ69ñ*}®¦ªK7^¨gìw‹9˜{t­âØç0¦€˜EcQ#›AÇ¿ò&ʤ32ÿJÜ´ÏníÐÏüõîxº—Òq_›:ºðèWÄ*Ñ zžo‰VÖaù½nœ@¦‹u}OŽ–´ Úà~#ÏP9)¤s±¯¬yà¡Õ¯V3!¾ˆŠMsÓy~رLàþ/Cc¨û£ùä[1…GÕ‹o¬VànÅ_‰á yíñäobÝÈÀg*ÚŠ1óM昴Md2Γ‹Wé|ó篜Õ,s`¿í]å›âj{Äc g˜ ||ÇL’qNî$o»Ûå>ú&H1N̓P` ^¤=öÌ[÷/‹­ª±w5 ‰ã$‹þ¨æ\£!‡T\mTëí«vjÔÕzÂe–D™¦¼ÑN>Ü\=;Ö&WßU° •¶ºþ@.‹\…ýÞèlŽùÒÕÆ}}R¬DU­}ë‹ÛBÍiÜV«™ ¡MM%’Êtt|QP_eÒü€n®ga»euð–Õµ]¾Ò ÙQÝåìzöþÛ:ó¬ ɿϔÆÓ º‹˜°ìü…Ó‰ú2έ*6Ì,1ÐèÇ=ÚL?à‰¼Æ9}T'|÷óôòrz¿ÅéIulðÁè;ºÝA´3Vÿâä}5Só÷*d¾õϪàs€"‰&6ZúˆUªÛ¼ ëU×Âqg‘ ø*ù¹L\QÜ„–î'Öë¢]y…§ž §ªôB´¦•캳¾ôb˜¨£RQ™¶åï[ŒvŽÐ‚£P€€Ÿª?¯B…”º(6­9)ØŽ+{ƒ[³€Ñ…Gq´¿Êÿ%Àÿƒÿ‰ÀÁÝ îãçå÷AþúôaÁendstream endobj 20 0 obj << /Type /Font /Subtype /Type1 /Encoding 105 0 R /FirstChar 34 /LastChar 125 /Widths 115 0 R /BaseFont /AOMCBH+NimbusMonL-Regu /FontDescriptor 18 0 R >> endobj 18 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 /FontName /AOMCBH+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 /FontBBox [-12 -237 650 811] /Flags 4 /CharSet (/quotedbl/numbersign/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/braceright) /FontFile 19 0 R >> endobj 115 0 obj [600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 ] endobj 16 0 obj << /Length1 1626 /Length2 9506 /Length3 532 /Length 10367 /Filter /FlateDecode >> stream xÚíveT\ݲ-N°àn»ÜÝ!xpk ‘n\ƒww ÜÝÁÝ]‚[ðà|ß=÷ÜqÞ}Þ=¿Þx{Œ=Æ^U«fͪYkuÓP¨i°ˆ[@Ì€2° +»@doæê¬±Wð+±(-@€Wû;dI' © –2u t€) 9€“ÀÁÏÏL„8x:¬¬]ôZê: LLÌÿ´üÙ0óü‡ç5Òdо~¸í ö@°Ë+Äÿu p±,Av@€¤ªÚyY½¬Š@:™ÚÔ\Íì@æ%9ì dXBœv/æ°èOiά¯XâÎS€³Ðôô0:üq1€Nö gç×oÈ`åd vyí ›Û¹Zü!ðj·„üEÈÁ òºÃþÕ÷ ¦qvq6w9¸^³ªIÉüÍÓÅÚÔåOngЫ±|Ýi1wýSÒ_¾W˜W¯‹)ì pz¸üÉeX€œìL=_s¿‚98þ¢áê [ý“3À heêdatv~…yÅþÓÖ ø/Õ›:8Øyþ ùk×r¹8í,Y‘98_s𻼿¶‘ÙþÌŠ<Øà`ÿÛnáêðŸÐé¯Ñÿ™†W¦°'Àh‰Ì¦qyM  ÿ¿S™õß'ò¿Aâ‹Àÿyÿgâþ«FÿåÿOÏó¿B˸ÚÙ©˜Ú¿Àßw àõ’1^ï€àÏEãjÿ¿…˜Úƒì<ÿOAÿº[ø7[ ˆÅ¿úä]L_["¶z•…•ýo#ÈYä´P¹˜[,Mí^ûõ—] lt²¯ºþÕR ;û¿ø4­Aæ¶à?¼ûÛ[ü+ýW©þ"Ϧ¥"£¡.Îôß\®mT{MO‡WnÿQŠ2Äâ?`$$ o> 7ÇëÙ{%ÄÏÃîóߤü ˆãŸkeS'@ÿµnvŽ¿ªÿ÷Ÿ+Ñ›C,þŒ†‹)ØâuÒþÓðÇmîêäô*ð_‡ÿµê¬ÿšy Ðh޼¼1üd“–™îRƒŸ;0&¥ßÛÃ;ìð¥^³0ß¿ Òí—¶Å_nòXÌÚ0!ðÜê9èðôSqg¨ÏŽ®;xú™Ä‡Šák>æ:m;/ÓN ›Ñ´ô#(ï³9¥M8=víïcïÕŠH'Ú¹œÞœÝ2øS¹åûãPß8¼õ5O­‹ÅíÀh€Âª)8<¢MÜ¿½¡û6<8Ðß}ÿõ'1SN, m¤¿c±¨žV¹w ~(gå[lcwJÜCßæC7ñY\˜ïí)¦{5û®UpPرŒÕ !!ƒ"eR;# VîÈÂXþÞ©u 1oé¬L®®É±„$; Ñ“lò6ñN¢ ¦O¡ˆæì¶ÒV¥èWHÍÜ“_”°ÆqQ`¹%’ã£T–Ì“ÒŃ1Õ»ÙXºÝâ ¦ñæOi• ÁÛß©1®“¥ÆvDôޱ”nú3”}|Þ“e<É[¾©\§rÖ]œŒT&ÑŸÆÚd±-w‚íSÍŽ/•I„èŒAqoѰª3)Î5tu$ÒCQN…_Ì‘ÆSbÚÅ–{Aã’@…r+n\LÎ ñ$Dêà§7líöõO/9äCÑIAÅŠº4 üƒ¨9=ɵAêÝkÜ ]Y‰‰Ÿ¶é‰Çl Þ7‘}ûéÝTS ÿòåÄæ ƒ$¯Þdº¨W½]k¢‹Y4Ž@”Ñz–|ë3hÌBKL/”éÆ, Ž•”æ ðÏk$±ÏÁ\5ó¯Ðu3ýp3”ºÒ§ˆ¬Møžó°~ëîÊ~ïÓ$7´>rz¿<1¯ C*}û±ÜÈ7œI˜<Ô°Ä™*TΧmÈSG~_þ8Q2+‡ò0MЏ‚Žtš¨=¯¬u^sœ6Ho^ï6+ ÆØ`«-OÒXYε¸™úP.\™$©7\Ò)Úò–){k›}ЇR`Ø@/b?äŸ <^Þ£ÑO›8!ª¦å§®üq$sKÿ%9µòzúg* ZLïÈ'k}ÅËúá÷vƒ¡Ín¼Ô¡)½W|NõÝCИzYWå+Ã9yÃò©ÆÌ#Oh|áâü9+¿¨;yÞra†÷QŽ-7Õ¤»j­k;z¨(Ï@½ uQß§F{ Œï¬¦ ùD4"î±çHå”sä|ä}—nL?y.úÄSdLZ‚µÕødéwbˆäâ4£D¸°‹‹Ô¾¥SÄøMJ‚”º*¡M '‚ß­lË æ]ÒIî}wˆø5 i«cºà{9Þââ“e.DÞè~#[N*ýñnž€~Æp­Øsû~G†»Àë{Ñ=æ:‹7zƒ®ØÌ“t#xJ²7Þæó¬|‘øXl¸;›üx.cMÃ'Ûˆ‹9üPÖ©è[å°¼ZÁRû#:ƒ¯6Wˆ@ÓÉg`’ðsÛÝìÔè¤Ø·X^Z e÷RÖñ[übwmº h‘ß´gåçûøÒgõ®¿4>IpõÆyäS×f¤fõœÇ2Èx$ïçýû1;O³óq*íSáµáá[ª ª¤‹F®Øî°§Ö—ΩµLã6fÕwÇÇ×Í—AÉäF΢ð æírÎÏÂßî·¶Uä 8ÔWfŠ1=#2©†zNH6PM YsBc[¸—ïû ïú 6Ag™QµïXÄ|é0ô²ÔÃðjÁ¹XæNןô®?¢Ùêå–Ç?×Ó"cfÊà9yÁHÿ¼y¢‚ 9—B©lS¶*Oj­*4E¶òÕ•­„O~ßÛ3MÚ1YÛ tãèSIt)/O‘¬†í ˜# _Ž~!#`ë âêši¶ñÑc¥KǬ)„›ÃLu‚LŽëßÁoÊF®Úö?@|cåtÕEÒæ/‡ëË-ñA‚ô³*ù•_©„{ôOÌüÕb–Æ÷>jCvQ¹Q¶Nwâöõ…Ç"ˆ¿â­ðËíî£75?¢™™âWÌA¡9â 'Ê(ðö‰ø¬2Ÿ¦éºÖ¢Ê~ï”Ø}R‘E-qšðqg6*ÊÞÞ§Ü¥ ‡Ã+õžMGþ´5U%‰¯T JÈÚ|Sa4ËWáa…8L©¼˜–Tþ\…Ù:^ÄM&tØÓ†K°ž™.B^æQÇšk8ÑWŒÔÒÃ;HàþÌ»0aC™„á7'd±h¡?¦t¢*6¢‹ù•—²Ä´e«ˆá3¼‚„Î'Ó½VÑ×C&3‡®Œw± Íq,lkÍÚù‘™ÅÞdÌó¡.òË6tkôÖ*~÷Á%ªR[N;®U¸oLx1ü 1E€’GY·Jtìfؼj‘ü¢8™¬£~ɾ? L&«ìt²Î¥/ZL±9VYñàs¼ZÑ”x¿í;ÜÎ*qõ×}¬ªí/4L]ëϱÚL‡ÁXËkü”$fL¿°‘[ý{`h¾…ÏÕUŠ(#µÂKSªX¤ýMµMQRÏ4åÓ5̤É9ã»Pi´FëÑ“e~4Çh›¶7=­·­ÃŠw wr)L(ð–rD&Ì÷¬MâêùÅ lðq ¿Ý(ßøöy¼"Öyêp‚×küŒè Qº R”ëi8¢ ð·p œc}mÃ<Òh1ñOz1)Áõh¤Ábèÿ°Æ‡¾š„´äþlÿä:D,˜ e²ü`ÇØ¥¿¯Q~™ÞW\$ÓºX«mÅ?³Á÷áï¢.9r' UýÌð)9^F:s Ë¥;Ôãôµi£?(¤¹ÐÄÄ©r·ÉA'#œ'båöa†˜Á²À¹E×y;Œa‚Us¤«4­ß3)´?²ûz"ýHK§ì;ú^×7âpq››Ÿ,yMÛEƒmÄóà!`>÷0ü‰•¹ƒð`£v¦MëPu1æ¤x4ñÞ©b¾÷?$±K?sÊCåž(s*£.Ù6䮕†ÓõƒŒñC\»NÛ&aÊ⦳(4Åã×PÝw9 7;Wi„øi·uG¸:.V‘ªƒJÚºNùiœ¯%RW<ϧHÞe}üéö¿ð1@W-=íØ´váÆkºE–€ÌOBulg% ªPPävïÅmźùV`.f(‘³¦;Ñ“p²E;0++msÝTh£ÑŸŒO•¾‘-î2vΦêÄýrûÉb®P]I-ºý¦Ø°Ç^þq®Ãé‘ߟÁžhÍwr¶DˆbT °Í彤:×z÷52USÜú,wÐ l²ží÷ÜÉM_Æ`p™^»Cv™kx`Uk¨,ìi¦~‰ú—ÙÂ¥’/Þ;‹qnœªÿNÛ†|eîÆKô€H¿é‘ö ãÄQʈpFê´EǧÂf6½ä£JBè¯AÒÄÛÞzªýºPoeøËòÜïB½ô~—óӬ˜•#u‡ÚÙ¢«O§¢½xlµ˜kònÑî4Vµé^3Ïo ñ‰t[%7ß•\¸¥¬m•u M7ý¸#I‰£Ÿ9ßëesG0ÁºÔŸ«§ ¿}޲,.añqn‚]’~C¢øù)Hã­° qÚ1î'í˜m{ïHsœ”Úçù<N:åû–ßᚪE«ÒCt')9Ç ·Õå6H¨íž[x1V¹~U«9òªvHÍ/’ûKèê@†§øøŽípƒoÈ9…a0;àºTÙ4ö³ga×#—_›mw‘° Gnäç@‰’”õ§gQÆøú‰FO¾ÿ@Û 9ÙïÿQ ï½ßY8õuį–Ô00w2½÷!ªB|ó¥ê¤¯%³y )_Q½OãbïkjÀì_®·¦/<` ƒ|ø'Žá^Þ":©lÊÁ ¸'S \ʦ9‡úkv2àóeÊ8w›åÆ) f¥«TÞSÔâsƒ Ð$ l‘Z.™ÜG3ü)••×*¦¢¿—Ê´?0§lŽG1šD®iu‹­„c»nhή£Ú\—¸¡¨ßÅ@ÚYá·Jð©(ÏÕ)‰òl4´PZ§ß[Ñô»PBû4Lú­€;6‡ÁA^ë};¬÷GXâ©;r„¹O\Ìu ¹ø³r,ŠÄß#òågK¡–=àë;Ü-::$Mal}Ü¢Æh•¶}†‚Çf«®G`G/…ÐÇgŸ>ø)~j?QŸ" tLÎÓÕÂ0F1P#ݦ…cøLô² ‰m¬l¹¿Þ‚ÏžúÍtæÛK'7{Ž…dY«nì§²—°„sh4( %Ñ'‡ÂÔ^ˆîâpú¬ :Ê`S¤q IàЇdCÔ;ëÕ°•ùÃ:64L[oUªòg…ü²kŒ b4Mt .íÛÝ6¹Z'ØÒôš ù’ÿ̃¬c­•€x/¤wì"_ùhºYÙ h;êΰÏë¸âLº„¨Ï½tÏph~†gfMOoc¿ªýHZ¹»0M$$«Ðoò}üN>H{pKj‚ù¡ÖMà’-×>gÑ3‹¸B»wpyÓ[‘¤èí(h>BÜq"„Y1ûæY‡ “¨»/¢|=¸Û̉gØL‹$(íP’ @@l¼v ºPè@K®(]͉e”sO¢—EÑËS=9Û¤nô‡ŽËô†u#¿@„ÂÚ¸^Ÿ;»hOD“N8C½÷™~aHZl¿ÝÌ=iu1 V‘kßoÎ&MµBpÞi„¾PäJ ¢ÚLEC ô‡ÿi ®Â¬‡K\bmTˆì+Ž.rù¦Å“ÎíälpÊžBífÖã^‰@ª'á'ªZ æ™ôî¹_Vù@&1,§½3zÏØ’ë jq^ág3>Ò@c鯸2ƒGÈS\KÈcrd«ŠÌYJió"iÐB¨® ¼›‹ÀOX«Â[bèî&®ä…ûÁÙW 2Wë €Y¥*—$ ÓÑ~mÁS£[lN&æê0“(Ý}ì ¶8ÒDX´Ó¸F“<â¥/‚WÌi®v!RUËPÜøìßWÞþY®3TÎþªuc“y6|S{Stt¢8t` 0?vˆÀêpå xÞ9Ö&ë¸Už*[§ËEÒ«KÕ3|¬Â_HFPœXz4B™Nçuê(Ÿ*ÔªçLÁ瘥ÄÃ…ú®·Â+¬öN½§2qÂwY8Þ²ÃjÓïm£`³ŽnM‡oS °”Ï…ÉfÌ'¯xô˜ãaA­¢8–MpPç:ë¬h4ûÄ6{)ÑúhñU”‡ù ͪ†t¸¨Lø“ÿm¡Éé$½¬nâ[‹s€¸óƒÓåÓgZ©1íÏ”Egrv[{jÖ¨RÂÄëŸ iøNëôÜxGX­*££Ã†äqâÄ4ÂFŒÎÙì[Jäô¼È ìÁ³P¼N±å¼ ˆ<“Š…Ñ•h¨i–Xby/uþakN—#~Ø÷6àCÊ™Ã-LK”ëEÅä…´Aù͘3âÏÏ¥~ ‘{D_øCi~žÔ‰«Ø17гï¾²Ž{,Ö#$¨ùÖ$ìqð„CÇ+¶eÞkzÌZ&:±ÆÕ/Æô%Û-Uðã;”Ç1|êÝ_~»21(¾–ˆ‘=OêþÒ]ɤºÒ®&½%ÀèðD)õ i¤>SÛ»¹H\¦Ú[‹ŸûÝì ÏèÊ>\'HPyþ;4WzS/Jp§S–ꪾ°:DëÔ].Vk°Ä ÓÃåØ"mà("¤!^¦™ÕÎÀYކZ¢«`JÄL¡ø¹ÈQØãŠweº¼`»OÂØ·´â·¬š˜…þF×¥+aúèÉüxÆ]Ìá^̻Řq„/ÛÑÞõõ7)A­*4º˜œ¿4ûŽæ&äA¬#Àop|2¾š4wWr^D@U§{N.;‰ÝÁ¯½ØÈCq~ëö鱺~Ï€m×â…*^ëÜÞà@ÝË5Qµo5 ÿį/¹Ý$‡(@í¥ÛF‘6–À ”H©dw‹U¤„»™cd¦Ý8í]׆îD\ž°ïáOÅûnš´¼7•‰¥$.V%=š“±÷X·Q¨õ*áEÇpÈsè\Uê ó(h.±ÉC5^-"—Ýñ·DP_—´dõy~¥cøáŠˆ>:t-L)7¢¯ôÀHÇóoŠa'¤…:QüŽ(a§O|”k×6 7køÞHÿ9ƒU“%EÁ=ÑÖÍf†X:{ì°b<·¾å<½ë·Óo_–´\¥T ͦfÕ'N§b‰L,;C“?«pqK…¨*ÂÎb@²Õø=ÃRß&í)^èè åïø¬Â–ý››I¸¾Õ)HÁ%ÑŽKN{octj÷Ó¢ãýÇ…ÒiÅÅ+!Xh³8qÎöµGÆûÛiß±þñ7=¹ðÑa¾ùB×&>ýq.cÏÝk½ ‡ôÇ82áiƒ”¶Œê‡ö{³]R³s†5;~Uq™´Í!9»üQzxÓ‘N¶N[Äž!ý|û&¡Õz Ê•{Õ"rßùΕ)MäIØVä\°-wÎVÍW?^$@œÑ”[5CyÏÏØÁsÚSõZ€üQò‘$ €uYª³(«¥ÜÝãºÏø×:Ñá1á ¸7'®'Ú ÿ{?8žjB»f¦µÒš+êÀã¦ÆJ%Ù°…R˦,BV†qû÷8>äÓÒ@FÈÉ:C¦@ §zÄ4–aÄÞ­åMÙb†¸Ù;‹>uÔŸgXªëÂÊpª Dì)š-ZÖ鬲ŠâwaG~à€åË‘“×ç0Ii3"›x6ß…"qk °26j¡?ÚPñ‰gðAHç›èÑêoù’²%û}ñ÷w¡Ä÷ÂÊi„§m.¬v–Öa&9çT_®¾ƒïZU­…I?QÆU‹’9sA1¶Ó!„Ú©®øÆž¾ŸØô»¡èÙFêÏåãS¿IßȾÕH‚ÂóUÂ26è¬ÞQù^‘Û;†#nåÍ1;YÁÍkâs‚Ô'®Ah°ÙvUŸ8$½þEt{ÙmwG)¦¤ª ?•n–ç°îãÎâZ95§úÁ·h÷"€[½zÔäQC5‡>&?7ÃèÍzœ>]‹áÈrÙü#×'Ú–m²dGë€Õ:¼¢hD±özê;žj+÷o@,W›Ý'yBè<ă²Ð~˜þ$æp‰È#Û‚ëù‹îµ{Áð£÷åjoÐ LØNÄ &tæý´-éÄ=æ]±Y®ÚRër´wíLq rEÐuláÏmç™Ó¿ð^Û““§Ú¶…uŠY”žÙ¥‹±¬·£¾F=a’qâ°=ì²´êКî¦öE2×”•­ºïjRêÓoÍDa YRþýMGÕêÌ&ÞŒë6IÙû«ä­E«)íËÀ¦¤¡`®„Á%³¬•ÑtÙIÿœÀæ ×ËS¯ ¥%¨S¸è±È'D`•UY5}$dx_Kg‚ ß=c EË#ˆcú.I¤_*É!ùæØ¸9ÜC¬ÌQFš)¢jÒÝã/# ‚l-äܴзK®}¨Há”Ïjp²qŠG±šb,¤¶¾#–žâ¥V«=VÂ[^&©Ù`èœi˜D^›µÉ§þÜ,K*†®=á }¤kÒOrÙ‡g  Æ̦\Õ¡œÒ‹n-Á|nÓzˆÓ¹!|s¬ñšºûIÕ¿§„¾Ð»©Q®)Û¸ZV‚ŽðE·Í=}Î}xÁWÁk|¡6øÁ£«¾ÅF§½v÷SÉaÌf½ñ‹Ÿ[æÜZ)T†-„Õ(÷Ks±´›þƒžÆÞ¢yè,ôÊôÞ—Aʙx£kÈͯ.Ôvjù*t<«nø üiÍ ðbo îiĈL/¤œd2‡dvçŽb©~ ›™Ñûç(ïgqžàŒŽŒ ­Ã²jµŽÖ±k't0ÏÛßãµÍhñvº½lgž³ûÙq¨ìôà Ä-œ¦ûA-ï)È'Û¨1KøûN4ŸmX À«Ö(ç äKþþð¥××U—ûEwí·ÚH` v%Æ U°VŽ&;!¹×ôé“*JÕ‰ìTéôˆÜôìÕ¾ÝcdR¦øÏ \!`£¹-°õ½oz“lFüÅxbÙÖÕ» ÕýžŠ,¬™-]Î}“;Þ_\RT •,«õs¹J?Ì’º”@M#ÌÏmPçƒwÍZ*ìÎ49òE‹ã-[È[¾Ï/;$CÓ¤ÛhêÎ)ØL£ˆ =»‘D­ÎSK³´Wnis+§DxÌ ¼ÿx»-d…6T²`¤¢ MM"Z©*D‚ö5›¾}ãw‘&|ÈÐLÞϾÒüS®D…åX²õ!¶½Žë¸&{dä}‰x~ÑJÍ‹éØáè|t2¨{¥(^]¹\)sÆu™oæ7tÙ9i˜xíöv +.>RÁTúi …Ñ '-•a}º^x±¢]F4‡‡@á#M:[h­ºöm)n_¸5£Q=ŸRjÒîæÇµ滽jO¿)3ÖXÙÁF[l•oN¥Žg_¶Bÿ–bÑd9\e’¯®‚Æ:—ñ€y—Xh2];*írj£|œ®Œ©œ<õM0÷Brv§‰ ˜Ü3«ÅEÌ´h ‹fñNÇA•„C‹Ú åU È´ú&«JUn%œ¸" WUÀWK\8br)‚aâƒuöàRÐämœÒ4v"·NDXCex@;ÃðÛ£¥¸·Ø?Lû­+V‹sfBo á4|ŒÃô¤du·Óñ}ÙÊó^ i4SNRµN2@IîIZ4Ê¥VoE¿£fº:ïš8†IÁå3]§bŽªQ?N.樂™µÑ½YÊôWØ]14_¿«¬“?GîÊ]³ÉS¨ï);ÃcËW©ý˜þë4+`ÍhÚMcó¶„|H(Ð&iàðÎ(£ ÍŒ"ÂQ ^Âìû¾cX¦ÑfÉ ›—€Y™¢ÓÐÖE;_ò0-|íý:Tú9â—+Þ—’,’Å÷‚ý½?|Ê~äMt–q6•S¼(éx-,/;»pâ-1KÏ@´¾r4‡ÍtÎfQÜ$ RŽûû‡ §žP¯°ÓrJ—!ï:†»;ÎFÃ`¥!”Cpݦ»;ª¡=RÑ"ŸZv%™½*GÚ׊Q©4_.ñ¤á#>Ý üH/¦ûLwÿ¦i]Éñ[¢¥?õîìIx;Z,ÔéòzjF‘8ëÓûõÄN%Wÿ™Oum22Ô#[ñÔç¶oEK·l#ÏÒjÓh¹…¹Ahk莌ólˆV¡É40G :ÖÓ¬?$n«¯ø¼ÎþCaï‘mÑýlÈ%¦…‡[üipåxÕ¨€i&cv¸ÆuÏ-48?É”'fêÁL¼2‘,Rñ'5e^^‡Ý×ÞovGÛ\+²dÛQÂÚk‡{ÉÑ'×Ïì©{ìužïÛÖù×T5FðTxd~¡¡;R%S©>?L‚UÒ:qÎ?_î]§©,?*]š·¹ ›(݇àí´“Î¶á$êõû^‚uMŽ·áÁTøµÌöm?´Ðæ*à%øJ›1ô‡täß3xÊÁ:÷ 1Ï—ßkù6Dê3å*¿èÊ.««ú¹T³¢Ó4ð£èËnÊùˆ__Á†r‘dô#;ÿc·Lp‰øJØoé-ÃÉmªCR(Èäbj+u.Us´‹I‹-Ì‘1 {Y «qöç9™J?ËÜJ(ׂ+ͦ¾šÑeÆžÄíhë NWÖ«~{úCNEk×ç¼4ŽüjKµû¢òÑ'³'Méà…)1–eU/±£ƒˆ”r¼~#¦M|8R…jY­a}.F¥0”<†Ü.š“tm²¦IB&~(àî}v „S÷pu'¢Iòm>9Ô¿3)çÈ/ÜQ6öì ëW`~Ëì3Úw%;T¦Ýr•*UŸUB6Hƒ+žØê«ö¦dàÃHåªX –¶û1å|q† þ[¶Ñ™¾‰oÄôœHÇ¢«†Ãý¤l·M£ño‚y¬b|¤_ÈPUi4;!ä[ŽKN¢ý‹ËÌ´îeV¡”úõ¬÷·/<‹ÞMÐãÉGõÚò¯Iÿ„”}û”ÓÕ¼S„ú¼#tZ»Óÿ]øøxû\ÄiíW^ÿ€†•"gAÁ›)ùŠŒø߽ˆ±QÜ¥ªß´!íD2 ;Ñ;Ï‘²ŸÊCþuRÕ[jB8½$Ïø¢5Ý€ÉÅJOºMÃÙ$XËc„Ðkã>4¸°nN)òø´z¿CÅy;Š„Elß08X^¿JàºÕGè×Z¶Ü‹[ʳu…­؈PL”ó[nÚüîcŽ÷(U‹»qCÃãù¢{Ñíl“{FöL¨î}ÔOËõ~¥Øò=KÅ6kªãÖ>I¨¯ú|_‡Î—ž£mî |ûÊ\èl~—Üìè…q"õQ¢ïRIÒÁìqÄõì.v-ªåÓ€˜»ªÛHVÂHÓÂhu³¥«R+LÈ„>CÌI÷J"ÆÉ¶££*<êѦ˜+ÓBZœö<Ùno†[OȈcœàH™E·¦iެD¡&½a¾/LZÿEéò°Îˆ]OŽ¢Ñ½EŸ¼œ¥VŠEÉ€\µÅ/ó’Þ†ÆxKU¨mLõ-mpDÂÌøÆÀY®ü^õTó¡Ò÷=ï±ö—ŸAz. #wN.%,† Ò,:íÌŸù4V¿—'!^‚Õ!Ë¢ï+È7u‹kÇéÞâ?’´%÷Y¥^ó³ÿäÿðÿ€¹ÐÔÉboêd‹ü¿š] ¿endstream endobj 17 0 obj << /Type /Font /Subtype /Type1 /Encoding 105 0 R /FirstChar 47 /LastChar 122 /Widths 116 0 R /BaseFont /UNFSRA+NimbusRomNo9L-Medi /FontDescriptor 15 0 R >> endobj 15 0 obj << /Ascent 690 /CapHeight 690 /Descent -209 /FontName /UNFSRA+NimbusRomNo9L-Medi /ItalicAngle 0 /StemV 140 /XHeight 461 /FontBBox [-168 -341 1000 960] /Flags 4 /CharSet (/slash/A/B/C/D/H/K/S/a/b/c/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/y/z) /FontFile 16 0 R >> endobj 116 0 obj [278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 667 722 722 0 0 0 778 0 0 778 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 500 556 444 0 444 333 500 556 278 0 556 278 833 556 500 556 0 444 389 333 556 0 0 0 500 444 ] endobj 12 0 obj << /Length1 1630 /Length2 18219 /Length3 532 /Length 19137 /Filter /FlateDecode >> stream xÚ¬¶ct¦]·%ÛvîØ¶Y±mÛ¶ŠmÛ¶mÛ¶]IU’¯ž÷íÓ§ÇùºÿtŸ××^˜ sí56‘‚2‰½‘©˜½ =#7@ÎÒÖÈÕYÉÞVΞK†NÉÔÜðWÎCF&âdjèbio'jèbÊ P75ˆš˜™L\\\0d{O'Ks ¥ª’: íJþ1yþ‡æ¯§³¥¹€ü½ƒ­©Ë_ˆÿkGeSS€‹…)ÀÌÒÆ "¯ ))' —Sˆ›Ú™:Ú\l,2–ƦvΦT3{'€Í¿c{;ËJs¦ÿ‹%ä 08;˜[þu3õ06uøGE p0u²µtvþû°t˜;Ú¹üí‹=ÀÒÎØÆÕäŸþÊÍìÿ•ƒ“ý_ Û¿º¿` öÎ.ÎÆN–.€¿QDÅþ§‹…¡Ë?±-ÿªöf-Mì]ÿ)é_º¿0µ.†–vÎS—b™L,l =ÿÆþ æàdù¯4\-íÌÿ3Z€“©¹¡“‰©³ó_˜¿Øÿtç?ëü/Õ:8ØxþËÛþ_Vÿ3KgS3z&æ¿1]þÆ6·´ƒaøgV$íÌìLŒÿ–›¸:ü‡ÎÍÔé_ ¢ügf¨þ&ahbogã 015ƒa³wù@ùÇ2ýÉÿ ÿ·üßBïÿ¹ÿ•£ÿåÿ¿Þçÿ -æjc#ghûwþ½c—Œ¡àïžÈþY46†Nÿ?C[KÏÿ“×µV7ýwºÿ0Iÿm²3ÿK #=ã¿…–Îb–¦& –.Æ3C›¿=û—\ÕÎÄÔÉÆÒÎô/·ÿj+€Ž‰‘ñ¿èT,,­íþ!íß*S;“ÿZÁ_ºþ•?ƒ˜––˜ÍÿfÁþËPáï ¸¨x:üÍíT#koò?ÿÀ Û{¼é˜Ø9tÌœLïßß„¸˜Y}ÿ7!ÿÄôŸgYC'K€öߺ™þUýÿøþó¤û_`~ØÛ›ü3:Ê.†v&§í þQ»:9ý%ù_ àoÕÿqþ×Ü›šz˜Ãl¬Úó„X¥ge¸ÔcæN‹jö3ކ:”5©ÔÚ÷ù§GìsUü© ¥ožåþêð\¹tø<–¢>ïǰ¡èK5½-Àó%¡(DÞ!ïâ 9 bÐ+ƒÏ¸Rö¾[–ÙÓbgT;9˜VTÒ+ý?ÛÅâu÷F@âV€Fúê€àgœÖ‡ÞÔ „R_tyEžtþöJ1<16:Ò÷>pŒK“MÆãOà˜‹+ ¥Zå‹N-x/”(ùxó=±KL®0y ô,oÏ·9øÝù%—½‡"ÑÝP¬Ÿ×C¿ÝÙvà&œE}œõXÄ"5mgŽùìž‹WÊŽ_{hò‘_{X*Ö*“­±_ä÷LíZªç%Þ^K›«ßn›”©¨v™é>S#Èœud=­ÚÇý‰F}_+øöÊÑ«á2÷|ÀËŠf)ã“hŨgkÖ‡6×VÍ.f¤"8‡§qÎîÿD"é“'|ï'ˆ¤×œ.4@nßo]ÌÌ£Hü,9[Y}ËéL…KU–áÊV Ó« C,Ü_–Vå¯FwYÑótp‘Oüþ½}ú[Ä´§›Ê´‹>wscÿê¾°%¤µ”öR¼1†$b¦~&K~Î¥>ö#2X„TË8€Kü5ÖáÄŠ[PÆhÅ;$‡2@¦Q#DD e{¢SHªË™æw-‰ð‹únÉ…S'gÑØÄ•k¥8|~ UÏw_<òšü‚È@„AuØÝòá™…M¦²\Êáx¦îÅHdßI5XÀÜ«’é¢ˆÞæ©Ï `íþX/‰Õàê­„}}±l¸Hì5n]È‚éç#7 ˜)hb~äÃôˇB»DK:xMÌ‹\/à& !~ÒÊ‹Øâc´ÓZYË´Öó®W¼dˆ ŒËÐ)šÅ´óê?vstÄ5!–Ö>6-!=¡Ó€N´š¥n~²­˜9â Þß÷2ÃðGLñ®‹Ô-·!Y¬@ §Ã˜£&eAóª’[ô/NI 4blƒM.b»zI37ñç-f–ýó× NɰE×xÔó†añ^ Mcx5âö1vv£ â69»]Pi¾D5µ#Õ„E2wÁ?yß­Iî¶`Å•gìEVÆ…yÛÆ‰$ƒ4sížëœb#åŒÔ— Ì뼯­˜ÿàÿm¦/uta 0;p™¯—òÍÿ^ûÓ|&@oD‘¸KcÆ|gŸÈüù§ÊŸ»”c¤ m=ÛDÆqpìdd9Á0go j› öA.¯ÔæD)8_¯{d†‡‚½íÚó†6-š>Žg’îˆÓžy{êWTàOƒ„ÏÇQ#C2¦Bv3“[Aª”øž]pâØÁº–µC9¬x-ïÊv:æ´‰ÙmÀ»^ÅWåºgàê¦S*fð£Òq¶ª‹‡ý݈߫ò(Ç—ÜY[”Ú7Á4|6³¾¥d|Ù b®Üùžòp<:Ip¤:>ÒXK0b…^ù+òÔ¸d©¿?tÌ,LdÐ… m‰U7bè#oyڪЖM§äˆDÑ/Uö¾Dæ­+íh½Ž·p qjœW®ãjḬ̀›}¤ªx6–üÒúPɺ¥rÚÉ¡ò”mϳdœw,õ¼™õbüL§Ã¢kš2ž°JqÁMŸfR`Ç>³8jÏž«]sb)†¬mlæU3©…iϹÓC+äžö-¯¸!³WQ&LAÿðJÖ(e\ÃWkcÉã’´º&Ã×Ô“»xï%¯X»¾ ã{Ùâ™ Ý‚E7nÏŸÀ(é0Í.þâÌS Ó;]ÞM·7 *îï®POX„cfJjƒ£7¥8$’;MÀôwèGà$`?AÆw¹>9´[3Š›BDŠÖTЖb$œRñ(˜=¦G>öã½£ÉÖ›ÅFGe§žOxý®lÝyÓÜ&§üIñDÓÕ åK“sc#××—"°ŠS-ªtK‘=ãßaãêY’¤}[7…h™’•‡ûåñ>ïãɪSiù¼Å$;x["ǸµÔrx9äEý|/s’Ò?#¤ó±J€˜?¦ÇÁÜ¥,>Z.ÌË­ò˜°—2ïýé>7ÊyZzñnNˆ™€f*Àfê<y¡RnùÐe£ aÈó”]>•€ºñg~†wå°à¼ Êlº¥ßÝïM°ÈóR¸AF.!¼ö>?èR9º"™Ž·^R({‚Α)G?°Dbî—X{íÞáBì~œuo”ïc kU]ä¬tì^;÷>‘ê @ÅÁ}Í­ý7ì]v*£L_‘‡é“s3öa•ù# hCÒùübð&#ë×f8‹RHˆ‘÷¨Äœ«ÑÊjv)®þ‰píšK„{’ÑBؽåHçëÃrDå@žÕg§/Cœç±ñæ„2†Ô%×RvÔ™»“žŒÊ¸—hÕÄcé«­ÛüѤ &Õ*ÎoÏû:Ó7r¾ä-ßø–û+ðU'Ô„ 6ÎðÚWɶ§F¬3ö§ŸCì¸âÀ¼;7bd# ~Æ©*ÝëPÁ·Hy°?/¡y‚øéÍD’8@ÖJ5Vl”`fÁÝÛ‡G8çØöqfìí´A¼ç_Ô»ëãw×\®mB¾5-ÄhøDް9„­lÂãÕBê&ðJçÅÔÆàØž,¢P{P2K3æEƒ.Zaã£%¥ìøzôHÅ8„ë#H½ò™ì6 Âvà s >$¡^„B¬%®—üÀDî~}3hÚn@¹+ñ=K•Ym ~"«¨¹Ÿ¸æ°Ž²Ùk·2Kš¦m…Û<ù¨¯E;¬€a<Žxë›`ŒNj“h*R`å_Ÿ¾Ö—Rħ>Ûf/ãÜo‘4‰à¹ý€UØéã>×‡ŠŽ-sÇÆ€NËüÀfÎÝ®§¯ö¾N0U¥ô#‰v€É©Á¤R _'œñ»±Í¯ ­d¸ÚIçÜÝVê<*<ÏœªI".UŒ1 ^{þ “¼ØÊ;’Lú cïÃrµØÜú%—Ôþ<ÛIo†Š—‘P ½”øˆ…véû=†hÅyjUïÍÑVïçñ[V¢oÜNß®Þ`à­Â©a²Ò]˜½@Y毵‚µQ•¸¼G¤‘yÞ÷âðïž™«žŒe~Ê-ç©^KÔ¼AÀšÊQJØ/«Ùkƒ>ÛÁ¢ÿ¨J­(÷j}@œ[¯S?ó)ö_òÄO¡i'ÿÀÝo› EaŸ¸+Ñ¡NYѧmþ1g›w/7ÈDG”jRsÉúA|ŽI¡[ éœ *¸É þ['dPÄ|džI­¹Å‰ž@^Û0‘n8ßâI;ׯÁ/R+Ýh/Â#×bÒ帋tÒxNkrª3mˆ)Ð@ ïüZCfrýÄ9í½­*Ó&çvEIÅ3î»ïp\ùÛ@é÷¤±î¼wzé˜ýÕ]˜âNv –Ú¤-Jê$Ž÷¹üQWW“^éZX*ËËE["S]±ªn œ«E¡uÕÓqús†5!5Öšñ¦ûΘp®O_(Šfý/§.R‡§Ñ樸iÑ ç¯õ“#β͡¯×)=l ÷ßaŽ?Šyõ§¹Œ*½EêqD[§HŽ÷ ß›C$³y`¥ÉˆY¼(‡ml+h ΰÑð½…æØÔÔr#úƒK›8w8«"–òôìÈðVØR ƹYÀÒxŠg°#8?†¢œµYŒüÖŸ¹¥š¼Z÷©Gu~eΧ÷€K$Ú|?÷Ã`û.Û~ØÔ'ˆn(aY '+ô˜yÚšÌPÙAVȸŠƒ‘0ó±¡ïQª"Ê "åj~8ô€zÇäû?YIxvP¯¾ñ.7%µUYžþé@ˆvD[ç‡XÇ^ñÉdkD䪆ðÆ/ï»È4·ïÈ'—È fÒBXGÃ&-fñ¯—¬ÈU bÆÜ,A“£¸9¶W O˜+&&ùB‘Cy]“¡±ÌBÌç±FKÆ:ÉVÁ:Íh4we²Tã@JG‡ÏâÎ êõèŒçýÊgì¼XãPMê²ÜaLWölñ¥¿ØÅCȺõZÙôË&mƒpZ1ä &È+³ ÃHµd<€2‹¯N–övä1ÞM6]ñ¢Jœ‰dNèáâe‚ìAº×xÅEJ…(ÖU‚ˆê—²W%ÅŸ•´™Fu$¥,.ußšéà» ö̃Áh*'És;Xj’9DsÈÛ{»„Eþ¬Q¢ú¡C:§Ò:õ9½®ì£{Ûš#ÈGÓÛP…žvÇÏ jµp?ÓdLDû0~>Üè[ÂMf}¦;™”¸ñz*/>9Ö‡-š‰àiÜ2zöér“œÃ7i3o 1]¼òtÀŸñ¥YiHQîðMƒØ7ðØìÌ©P´Š:Ânhó•(žR l°¬öÝ~”úA0æ”ÊCÕ…°€­àRFU/ö#“}ýUDˆWåžS†´«Û?¸hGí¾ó&N«ê!kY.4`6¿~Æ‹•N öWߥÝ~¡ bŒ–¡ß)ÞP_åC3:sæ—2i_zà[¼Ÿ\ˉ0éD Ò0#:T fÕ0 W ˆØõïåtŸíôœÑÇ6Sì™3YƒÅRãYd&?¸¶Ba¢QDÔ_œÜŽt÷¸¼Á“üª§ÈA Ï £¾]Ec¬ÌP˜É;›cȨ?€„ÚpEŸ²y@,Ï¡ ´‹wA5¦®':ø¢å±­ÛŸD“êØ§%òpÔ ±!|ñˆOÔ¦¦ÝÄý\'ôbÞÇÆH.È›‰U…`æ*¤ Ù„ÙNXêŒH ú¥W‚¾júÚû)î?´8/é÷8ô˜›ƒ)Pwïë ÔT­íò‚Hv›°WzèÔ¬Dç¾+«ÌoÙâH¬}Àýž%®:¶¸}ýÍM¯%ÓrØÓ˜}¿`•Œ ynm"‹š,\Àó.ìY|KéͲz=Þ(9¡{ª>wÎê3– £Ÿ‡Gwt®§u4^P£èè0þɈ©ÁmðôFT¹EWzðò^ËCCÈöž´‹ÒÓ¯N{)í  ê4öVè&ÜRfçñ’éü͹¤ø16kK6`…}®ór{îJfB 9äã‚»2šô#쥉о¢áÇoµ¢Ç®XÛv3…ùãæ Fq·žñ—p6DfqPÔ‘„œžk'° ›ñ#Ñm N¨Î(P¹3IßwÉê_!„Œ4GFË1«œ– X¥867KÝ1dDÈçŠA4.¯¶h@SQŽs¶æN'g.´¦DìBº1l£óMÌ [ j©‡ÒlR_˜ùç×…ëÌЊFóx[øÃ0õšÐ¿‰pRŽŸã¿YÈ&Í¿E‡ì•=І×<*F€4µ,óÈ^®5ír†Ádk…xÆ.´§z'â…)«å ho§¬Âññð¾C9þ`§ååhG§bGPÑâ60ß„—PÈÂ]Çùq¼¼\ƒ/¬ò}ð“ÑEîDÐ{^O¶ØÂ‘ã v—0K{öf\Mã]••dÛ£¨ŸìÿÖŠê0Fÿq]Öüûs MhÍ+­¼‹1YªS…£Ùþ®y¸\Þ|¶;7¶¿€ˆzØ^-ª¼èÔO^ÄÊ÷Ó¸M€”“‹Í986¸á–7]à,ï% ( Y!]ѨÜQPWÞN´sx?bS·;²BhS¯Í€úÂà~Kþt‘É/Lׇ´Þ³,E'=r?õ#9aÌ‚ó…ý3©R"Pß`Wü›¸T,€à——‹ÏòçþºübW ’0Iox¡«6]§ôšé[ñ»YÏV¿‚oY½Äë}~P’«F.äžô}5ÇÅ“³G<2’?FCƒwæ}¢¬²'äW‰$°À¢¾‹ÀgyùÐ#çÅQÊËd{3‹‰Á<õ&¶\܃f;¼ qf™ *¨)bãÑ¥ï™ù›¬]Habî5úLüÓ×øb^j_/©,Ïœã¨Y}I ég{^L†ËÑ™µ:ÜÓÑ #ïã<ìË46ð»9sEôä‰ræÔèæÔÆÊ[ã&9u¶‡ôÙæ„Î%xJʸMÕ^­@'fŒÓ’ø ïå–%üÅ*nôHÒ4›RwÞ‘ï½P‡×úc=é£CU>W¦?è'0À!b¸qq^‡zg±ˆ9p ïQæ°²¬pðp×ù¸@£“üù_€¬‡[çïº]gšq? @énâKr‹YÏ”@ŽgŠŽËÙŽ! %/õxÊÔn¶ºÇ{udí:–_ŠPF6;K«H„–ÞÐÃ{wÒ`ŒŸ:ZT¤ÔÐ&ú¦¸+Ðqà}¨Ñ®çñª.x„éøì›©Ûi–›w(;,#ü%¥t]Ø•úývÈçÎÜÏXŠà5‡Õ dH¥Y~.‡pÔ5 R~Äà ¢hšJ¿óµ1Lâ}Š >é§Ó2öBD§ƒê¼)’”Pç,Aþݹ…‡cŸk(¥îzÓi¯"c¨/Ãða’F…25u‘IÀ…­ÌU>?`6vš¼¥¥O.‰hÅ=îÕ±(€°Ê•VGù:$RšxÇGä÷]­%iÝxåÂŒÆòqŽ»@qkð¼æô(¬ou„¹ò —£”K[n `€Fb¨›e 2ÞÙÇʹòúë"±Q–e¨ßG•˜D•›¬¤öˆXðþÚßG>¯ùÂÈž¢SDŽžË¬ütPO‘Hþ°Z®á|18ð¤g:>„ÿÃ…oâÕ—y½h§Mf™È!cÜÛcÚ¼k¢Án5­¤3š¹-Õ5˜C2eïJ¯×iZÛí¼¡‹åWBK÷•òvi%É_ãD<)ôÚ’{öðÎÎ[avÇ©º×ç›™Q6•<úEšt2¿Lü ã˜FGÑHmJ=6¹_î­ÿ“¿³ðK“~>¢.Ásœ)ˆT`JÝ#ŽžVznú~µÌ”Zऺ™p×m¤R-i/pjëbX÷Oî¦×…ñÂRB#8»tJ›ç¤=WbŽŸz;ÌÆ=ô@Ëä\M\„ŸLœ‹!?xI%1ÊZØ® 8gÈ]„†Íø÷H$Áe¤òɇ7. ù^ê¯`ï—tÿ|Z¤ÄUO¥úŸZ›`“£í«H5²^xà íÄÇM ŒÐrܽä\QŸnú,€Déaãuâþe•ÈI$Â>“Ì89뜡®á¯òÁ…“GK‹W‡æ"ÌÇfA8^?”eTÞ»—W‚q±Ùb­¾"úmJÒz„MQº"##q½òÕ©dwW :0NX+«0…ݭΚÚ^7#Ù÷¹ÂB&_)|’ø&;­(£'|VÎÞýé :aÝkœ’Ibhnbêg@Euÿø>—_K—DŒ¸­ÜŸ’^KZRd¨š†êüB$A,]R[ô&cÈËE'Ø ó቎'e°Ca×Cõz<»¼wÔ»ÎÏl‰ÙÕ·–_Œ¤EÃV(3 朾ˢ§œè¿IçÌo_2m'è°Ïài«Ë}: · ¡,4Ü2J»"#ߣp+Ê-ñ†ÿ »¼š'óÄzÒžÿ£NFŽÂ)0C«6I[¶cæ£O[¶'½gøÕ\§×gµâÿq$ý‰$²!3^$÷0.('a­8roR’!8ê½iˆ±åã hf]ÀØÿéhËç'4Ãa ˜åú¤Îì†MW3ÕÏÉ)¨éîÔ;gÉë^ÂPzîq‚”h´IE-•ÜËIYY”‘¶¦HÙÞ­Gcºy¿K°Iæ’M»†)±x³²æ˜¾`ï¾Î‚>ÞãxkÿŒòȼ;}§ÚòcO&R¹9ªèÓÈ%¥Ê[’^`¿Ápš(¹8’muô‹ò”jÜúÜãŽ4‰Ž7áªQ™–uQÉTz²Þùˆ»7WÉ㵩8?²Ç Cii¦/ASzœt=ˆbÅj=( ‡ès?°Å ™Ëò•g‰ˆÚ¯’ožŠg¸ËͶˆz+-€”Ü¡1½îP­õguË¿ºççž8œ;øé€ÊL¬ß/Æöi¸ªE®äÛ¯Ú†cC oÑȱ4dGËöu‹\«ÝÊ «‘<ÿ é6÷ÔÀ= õªJoæð Ÿ= “j¹”…ê· 0/L!tÇUë#BCÜ*\HÙ½áíËGË ­ne2…Oé¾äÙÐËnÀ4ômù¸›8É7ñò”^Ú¬±å2Ã[4&«<sÂȸùܘ¡w•S™ ypl3–’Ñ~naûÒ¢JãÿnK1ªUw¥Æ=:G™Ý‡9¢ë¥V¶Y—-)%~°®•>ãØ ÌÝŽ7 Þ„u|aVG·4ßg±Í±wX43÷¢ ȘE¯×gIJyšlÑ^œ±f0ÄÖÀ…f’xÚWÇHß›þ‡³ÚÔ‚À—r¿h3l $²ðȆÛõbÂàªØïÙNp6Žõ掠ç§BO*™Ìlf(2\L·‹Äùã°OåÓånË.{—èžkÙ^uö÷ü;1š3BøºdáÏl·DÒ±,Óº÷³ O#„0 l|Œ3 j¤c° Ü] Æ·]ãä‡Ã/?ÛÒ/çTˆj—Ëd CË8$,ÍZ¼³Çÿ¬$ÛÔ‡º%k‰‚»ãyy‰ÿ†ºó[(¤ZŒŠEøaÑ´VÒîìßñY ä:ð{º§:®ÊÒ®ãb“YÜûÍùZD?H*…—»á¾i.¥p0@ºåÖû~kÖ’¤Y¥|#˜‡§Òò$¯éÃŒuÚRŒó%hŠÀÆkR/Ô»s`)R¨h77ñG27Éy I%7[#œnø¶“´QÖƒ½¾•ÝÀÓóñ¨CzàE…V@˜ÆléM~ÿi^µ›ýNûÑâD²-îij@$íZC,×ÊŒÂà­Ùçj²wð­=b·Zç¸ÿE&äò!š„$ìGIÍÈqë¨ÕZ]ÙÂIXj0Ûtá/‰> ˜{N Mh—Çî¹Ê? ‚ãg€¾†ˆÒ h&7òœßCWñZjebˆÝÎtZ îÍ$·ïѽœpôãò­þBQÎ@D¸˜"¿Ï;Ón·E÷-ïzRIÞ@R|î6Ù¬ AÆ!r@ë€LxŸÝ…Ì›‡r¾íµs;ÇÖ“rÿuê±OšH %ÃVò­ü%Ý*ëü 0%ïŒ],M°¼Á/Å`­ èeãØØÑ`{# †Î?ËOøt2éKŽÃrv7•(ÀF*(þÈCãjutCÕS¯ êºGcJaªõeÝÓéx:aQŠ÷Ì¿ÌÈ þ°2ÝX§/®¹_’¥­Nl³$âžÛu¸4M zV ¿¬QKFâÓŒæ/"xr2†^Ho›WYpGn?à<¦ÍÍ¢cµ-?½| ÚaXL0›)Õ¸¥ÛÙƒ 0nè¤À@‘·åéiÏß‘õ1jÐ†É „ëˆanƒ(p¯f2,´ÏÕ'‚…—!îU¨¶¼Ü=ú²SÌã{+¦› ¯‚_Ùü>RNÌ=bb Ï0Kº†î—VÁƒÃ×ÝÑФ!…LÙê‚z­.AC;æAiì Vúx,PÖqÖ°Ç.¿±;œuƒæ|˜”|­c÷6T`ŠLâ嚢Ü¡k¨žk4gèºÁ¹7˜£ ’µÁÆŒºÖÚ’´Sëâl?Ymc3}¢%q‚oþîÑtZ„$žKtTSy–õ—SÌJe§¶ÐúXÞàRHBñx®ì<ÁYW[¨eìNá +fœ÷IŠî"Œ¿+D’ã>ü04½U¿Ã‚åuÒö# SS `˜"`p!*šYXú ¡Ð@7l±Ç°X¹´pK²˜õ”QÓÈ~ýLjR¬“÷·‚Ÿ¥t¹FM@qòH`UyšµÉ~äíQp£Ø4±IËJéq{=m臂¬CÌX€hv£R¯lÒ/“ªåæ…rÄžK1÷/0¨o‘æeÁßãóëë%nëÂntI_49)ȸ¦Ÿ¡ê·Å³‘H$±<)¶Bw)Ê2,¹š_Á®) ÍP ΀.åÊÆžOªM}BW/ƒû!Laý˜36±C sFÏB)g;‹_¤ã&,ëF ÞˆÚÒBa•оÆê[îxVB ‘oË®±Ìöü!éÄØJ‡8CNî~Ä€‰ä“©4pQ-/xþ¾¶IŸ–I¬Â$?G´ŠU€w² ·Ãц6!‹˜ävîqãÌÇJîü—M6IÅŠŠKKûÔø&XÒê>Üé( îyoröD‘¿Ž?ž§ŠÓ!œÊýêEFŒ,\Û)ZípR}öÛ¸2Ã…K‹·_6ÂþAÔ+¡¯–•É¡‹Þ§üZ‹ìŒy,›úä‰Å,™Î¾6ÑMôâÍ=ó ó©½RºÐv4šTì+5|…«jžtÚg.àÄ;ÕwBˆþh‡ Oì@v¸ÒÕ1õ— ˜º"Þµ²Çïô°*÷”Ÿ<Ó¯ŸÒ2¨aÃ¥Ð6GU0£.šX]qTByn×ËÛ9ø±6‡Àê·ïø™_ŒPÊ ðLA/N†ê(W§kx)Â×…atëžnf޹ò’o™–c‰‘ÂåjÇ„zXH–ÌPþÏðxdŽhŸRãû<Ç…A9ô,ï6Ë$aƒ¬¢ÞA=ŠYÆ9áÅíó Ö)¹ ‰ÒËØqùàì² 0}¿—ZGs1ó]@qc‡û¦l—ó±.Û@ŒÈ øŠ|cµ=ƒòbĬb¢íVì j5“;k½íA°Þv^Bª H©¥änGST ß2xIÜ9V<ÜQëÙY(§³/×ú˜[Ò¦tî˜ÈT„ûÀj´ã  ÐåNíðÅVìä²¢CòåÎÊY8“Ý,xwœÙ$£e ½ù5Í}3/|OfOSºr7üø„ׂríS LX¿ïlí¥›Òy98fÏ1ø+‘ÃþhEuì"A $a‡Èÿ„$ L¤î{‚…¦:ËCƒí)(ã%Ý¿÷|™Žp›}Ôľ®î¸›K±L}yЦöq1!•àül޾kWH•^©øLõV’èÊD ±ìûÙåLü³Ù\¹”‘,Ë”øŠ§ÉEÎÉ©=ä äu&žvòÑAPc·]¬ÒrÓ6Æl”¹Å1XéxöÇý®qde-òìwðIÌ„?ßåݧíìŠõ8·¹é¢1±Ëg0BuÉÏL;“0îòB¦ÊtßÚn8õÓÉ¥RìËß#Y÷‚Rì[RÙïÔ_‹šéæãEíÛgcý“²-Cçàú™>ȬԪåGôJ¥ÛîXN­ Ãøxí¸¨æI™÷}¯öl¯V)]Ñ&Ð °¢U§ÑÔÀq•ÑêK°þa™`Xb`M^X@X"> wHÙt3·;õ­Ï’µ]B /%ˆñ§pE!`ºƒ\Ë/Ûãô’0~¾øE£? ŸSpþŒ‚…5^’U.Xl¶Hß,W…Zgw»ÞÚ‹Ó߸r… $ÉD„Æ‘m%(Y›usÖO§žå‚Rù³­|èdÑ¥…@øù§Š£»ìüsµÿµFX>tn '+L náɃÉguGæRc;ùˆ’sÓQªzÛZc÷„úØâ´(¯>ýj¤˜]l… 1‰;1µ‘Ïñ3;ËfÚ¤*¹06\éÙ¡ÏP:…&Éâ´Ù£9*$}²šø©@iF±UËkï0Á8Úææ\Š=ßßIÎÜ”› šáOqDÖŽ§Žìù–Ùº‚ÕNäçc¨ÿI¸KI´xÝ%À?xýÔJ¡PÑWª›[iº ~^íÆ-6«W™TŒ©•ïœs­E‚ò­ÜIwò<¤Ú Å]›«&ð€€‡?‰ !‹Qݯ¡S× GBõ «C™ƒåœ¸ÁˆrŠÇmâ¸E¦†#û3²¢Ó^Æï@ùnQ.fôô‰ ö\G íÕëH`O¥…œÁiàEmG(ó¯…÷cö›É̉œ€q1<3îÄ@'W)û/i/ì×¾YP¼_ _‰fgœ«(5½4ÌÃu‡tPÀÜ9Ãò¥6_ ›#29 ¤lÜÐý±.Ï_ÈQ¦IŠ¿ F[&¦Gˆ§›g–`Ùæâæ‰Ð „k°å&¾žX°(¯á€ùËNǧBV%½²í ú×Ôß¼VÈùcl ‘)‡Êâz†Á®…›s¾×îÐv/¦Pt!œ›–6F¶¤š“Ì™X'Â)s}ö™/ˆ,B©My5cÙŽ¥Oüãný\ãÔÛš‹â°_å:G]È÷Hõ^)¾Ï¾@7î‚ßü—•P‚QÓ,_¬O§4©–<‘Á XÚÃ@©?¿%¬ªØòªH¦ðAmlI¹ù£¼ýúÕ1çI2ÿ3S½^òùQå)zϦ%H…« Õ!I(>yS9ӻ”(Ÿªì%²«7'*³ VûœX*‰Ô= ùj¹bÛÔ-¡‹—û‘RŒ2œáŽcW“ ¬¸‘Ia)£u„žâ óÝWÏî@hgW¯a‘ d}ø´ ÈZwMRqœ=ýI1ÁŒ–¼,¬…c Kˆ½¬…PѤ¤³¹G‚5i£UÊè]øñ®/Iá¯A÷}9.ûãP°©µÈ~àñfü;ëx£>C6Ûð@¦Æš:ÈN£±Â»¤¡t:þÞŵn 8H"yKD—ôÐ~ÝÆ^©o‹Ud…&<°†b#Œ¨úîÊür¸*D€ŠCÐÎw¢“·ð]×Þ/4 Ü®ÁK_˜‚Œ• –-£ç/BÌíB:ìˆÂ_±l Рd¹øœD›ºô¢!ëH¨ý¹$ÆuÞ½ Èw¯­öü¯ýhFÀê_àÆ0Ò«ÖáÆieñΘïã#×Â%&VÚÃz´Î4†¸²;‹Ø\HÉ®4%šH/Ë5ñê7ª„ºo2Õãlœ–òÒoØ8Ù ÓéÊ»ç´pâ¯u«wìšEeôr‡ß÷›à5…j‡I½êÅT`d9ÂmBx ÓªñôR­¾ÎM–}‘ôV¿/ WY§½ 8gIÏS<Ìp)“Ùâ>:×l.s„ØõËýOC]³¼ç òá0Á‚xÈQO>_õ|Cu¨¢?›™üm ƒÆß7¢C*ÉØ¢~})'þì¥à¼| †ì8£ùBö”:ÑéIª ¬ÁÔu³G 6§çüB©•Ô4ë‘)ìÇáòg–ê#XwÚŽÜnž¹F»ãR‘„VML¥Pû¥v…9Ù,¤ßóAg¤…tרóÍ0Qá"»äyÕåÉ ë¨î-’|ÒîÚŠ…K~ñ‚Sµ§ô¹<„«%þð&bã`¤K}%µ‡RZˆÿAΤ˜za£wÈãB§SË5ü©L†ÄkFÅÅ:=Ï]1Ùÿží‘0ŒŽ,×øôGÎòÊŠyt92ŽÐ §”èÔyǪÉOŒ‡lYÜû`‹H½ª™yˆcâ@ì¹Ï)>'|Ú'Z¿ë»ƒ}6+‹ÿEÁ=uÓü Œ£4=¯á]jöŒçèüñRåÚ뵟§JqJ…šÃÂÖ«“ÎZí¼ˆ( Ø$ÚÜ询^½é½>“qU‹14ÿû~(û#1°î ö„dú¤±–„znó+¥¥Kj™Ú­-²™`xo}=ZDg<¼÷“¾à÷þé­08ùÀâèMBjÊ7(Ð(át¹kb#¶,EÇG29ÒÏA&ŽÏ%%›+o«=g¾Ñ¹ÐqtÓú»<ƒQа_£âxLÜ uæ­{2Žˆ¥ÓZC]ðÎ Bü1ªÞ>"—ëVÏ(Ï™P>¨6 å÷Ë-ãƒe¨ÄˆoZ°ÐeÇ©úÖàÛТMŽØ° þÁZNœêð vÝU˜(n‹—5ûÏ'ImÎÔZÖ2 ¤.×Gîì¤ÒB¯ßG+hŽI‰Æ)£æŽ‡Ï˜F䮲 1é+šxÅq_ÿÃHL;ûB¥ ÉSÏ„p§R›Ha"/p.Ok%Ó¢F;%Šàü Æà¦«†‡k/UaNƒˆœ”i“#R#qµ£ Ç€sR-hý誫ñ)§¶AËß„­¹8ø¸¼&Ê„M(\6¹KË2]RÄITªê‡Y¥tu¯¼BŸ>Ì<Ž;ÆDÃèMˆçR¼»ê ˆ…À­}DHmT^—|ÔÔF6Ž2Ÿš+ F[ßì*¶´¼®JÅpÒ…7Pút°ÉAˆ? q +¢1t[Î,×8l/¤Èp>­§ç_CÛó¾–ø›8ÝßU™j„ïÕEû18—rU§lªUOËYJ'v©¯ìhsnÎásJp Í *Älbi™JŒíŒݠãpt« ³‰ú¸‡R,I&„ÑZù&ƒ\"gºØÝø ¼³8/ÛÛ*üP 3žßnëHí˜bY:;‡ ²¾oYW˜(fÁ¯¾[zñµ‡¤Â&fÙ|,°íXÆ£Bßð¢íYî  "JWNb´P FúJ Èz?|3” :¼ÁUh6w Ú´%ÝÒûµ…Ø€<"”Aɸœ;ìrîøkGW¨v¸3JweK,C±x ¬&÷~ûr”¯€¾ŸoügáÓÃû³üƼ|sñiÚµ™Fñt°/:KK7i¤é£…‡8ÿdiÀ̘ýM6žÓ¢XT×Ų<=þ«‘Ú<ñFÏ,DHa!>w¾¤|À¢?Ðd# n€B³Úq³·{J"y«±U(ª  urišÁl[bÆy÷×úúÁÙ­Þ"4AGuX°À$Åý#BÄJÂS=A¢ ŠTea³>O²¤[gN$äB¦å…s‘LÙr–TÔîD¨'D¯‚2ehO~,ƒ0Béò±?§çZ¹óYC--¨ÍA’k>ÂIñ]M®ˆ5Ž~OmuáÎ@£›¨•½~“%¸Éæ?!g;¼4h»Œ˜%£b]?37Ø/èÅø@%а =aºpã¿ÎôšY¨%dÁô‰ÒÈÞ­%X𔉌ÒbÚKDtÿìd*Ðu ¾ÛÑ` ×(m² AHBõ_ë@ß?rë…›¤SÜ€ÒÕï!p—hGº¡/¼Üoò®¿ékTþV˜^t“ZcQB\ͲøÒ’_ïHp"Ie_dzëÞž-Š ½·€¼Ãâ"ÚïËC©)~…ô‘{\.×û‰£ÚNUrðÛuÇFØÏìÖíJ¢“¼PqÖÙVD&NZNI'f‚ò99÷‡¸]«ÎS—O\ð³Þ2ÈÚšQ§•Œ«ï÷'9Ò®3ÏhLÕé]„ýŠY|–ª^¬?ìÂùÌhï–jÅN*Ë΢åÝ%k¯s§›å‘òŒ-ÇVuTæ'ÓØQ‚:“NÉØ‡-èÆÔ&)Ém”)ñü'ý‚š ‰Áääö]¼ÎÅG&î22aCé3lë\Á«’Eãq½;ÀìÀzUĺÚ7}'?>ÆÞˆË@§eA?½ªªÝqÚâÎK»ð„$7) bÝi£¢Í€ß ð1 áæD‚´,3®2Ø•9ÍžkÒ:Ú Ãû²¡u÷«v0^$þùZ}è·ÙÒŠRÆÝäíŠÐŠšêµÀò,wg–9IBõf—ï|.‚TÏÃ;‚ÝLw—Þ.ñ×gnñíÙ¥ØMеìOš1oxš£Á>X»RhDÒ®Ù¡#FF¹ôTä]Í»øÅˆ[s2E÷M¦x@rMêe/?Ÿ6’¸foþÛ< dÕ`¨”ý3YSoóKó(öë&Ø»—òŸ] 7³Ê¡˜¸þ¨µ=¢Í_ T5›lDwY¥=ü¥£ås•‘±×ãÆðéPl²6: ñŽXÄ~וJÞ"8Q÷­§H?OdšcA×~½ušøòÿù;ßÍt›Šz½ÁÖÚH±ô+5Ï€‹&Œ™½hæšù|äfþ×9Pl‘_¶W;%Ëæ´zdA•²o¦`ÙóüGq¡BÉCêjf¤êCqa²(û©“ƒ‘Qž/kÆoqløîŸßåá쪱çm^Ê­ö!“¿ïaò}÷M;]V°Iø$3êT¼B%ãø)F\΃ü;ˆˆ¦û¶l†(éE6h<)F)ÈêT‘«/¿Ë†ƒ«Ðü“¹Rîû!Ú=7HGù†—–ÏEóϽX¥ ( ¿' 9zM°§SÆŠâÆ»‚‘l&!y›¹#‰¼d aàÐijzâ Û§›Üƒ¥æb¿6 H÷sy0¡ÅŒ|TŸ…ªÏòù9ˆ<C–m¬ð°Ÿëçs{.ç.èI»u­Lôx8’ÆxuÎËB‘ǬoƒEÌÑa:%¡Ù3B~„l¢?·Áj’q©è>?ÆLEÏ,,o¸œxQ5å¸Q[Ô¢¤äýÇQ@LtÍj6zlâ°ÙÕ­¾ë QIεì†V½ÈÀ Mk†– ¦*§.fw³™ákEì ä–;&¥ÅÌUü:©õÕÌmzŽ'ÙÏÔ©¨ñ°ÃQŠ¢"zkÃŽ½À¹”dT¬F‰xÚÉù g}‘ª¸x¨“„@™Ö›}Æ®Àqœ´¯4–Z›Õ„¥qŠyDm±›2”9¿Ú;¡—·XqpëÜa±]oi(x¼æ-`½Àª8˜?ñémCeRzÌiº:sÍUTR÷÷$*ðÌÉl›ª¥”%ƒùã÷€5õl»KåŒRátŠ!¹Ïá¡gÑ]Ì@M†~g¢÷È[ÙÌ]z¦.ŒåRs Å$Xy^®[ÛÁϸ¡ªÒ‰q8Ö¹M´I "ÜÅ>ø6ú—mÜá¸!kIãÃBØNX!ýíÞ™ÜÁ¸h;6´<]!™ä;´^+íùo#4ÅjÏÚ¢J¯&’úhu¢ö†ò@`ì’°Ê r&×  nœ©Ê-‰™Óy¥½¦ŽȨÿËàågo¶~p¿¶/†©-1F«;Ksí×Oݺ3÷†½AÒ ä4× ÛDsP÷ÎË·úßÒOe™¾ „$i†Ä¾®ôðá ‰õåy*/š­ [K¼Tè©…5ZåMFŒ4h…ÛµÏr*øÂèó|¯Ä'o–{gžÇû')³€W)!Ó¸÷}¬ 6E™Ú ö+»Ç´I×té$)›g ÜL¾iN|c”Ÿ'©}´¢¤_ìf<–²b»æ.²êÛýÄb^í F8¬;Õh~'CO‹wÄuŒª}ÑÀ´ðpÚ‹<äˆt¾”4ŸÄ$È1د+hwaȶ0~p*щÎ)Sþ¥µt¦ì¼d"6{lþåKK…R²–m­RgF

 1Çt‡’=»prx:hªƒü¾Å¦ÅŽd: sã¦C"‚Òönú 1?u÷ì+%³†÷Füõ ß§©:3ë;&G3w¹˜£ï&ó[Óx[B/­F³ôñS§ƒqÝ»÷æ¯:ɰt(LqÆ»?”ÎEnL׈¿âÚp¥‡‘b¾VîÉìtîG Ü ÒÛ&le—$Q‡yGuXlÌ[ùVC™XÔôÓ#ÙraotUªX/6ßo”æo5 kœÛí¨Ì.M æ`qgËÌÉhÖ <[³§è°”×øC*g"½ ˆ[1®<ÉžäõÑëkYÍþ/‘Æ3+-ÐØxvï›(kH\w0<¬?áW¡ðšgÈ^•ocóŸZ°x s ΆQ¾RLßÛiåÓ{7e䑬‘ {ÐŒóM†‹é[Ïõ6ÈXø½~îgÖ_ 4Ë„ø#'÷Ž$GWÜØÊ)ñ=¥Šý¾Zõa¸…¸lz0Ö˜â^ =R›—¥Çp[jÐÍ2 dÿoÓÊT¥Nwd´›O<Úýå–Ðu2(Å;ôîö=œQ^ )Þ^EÒ…~’½¹½¡$¥)tå(*Ö/ñ^ß'œþAáÇ®ÞÊ{NpöÖó¥ÄY`æI‚´v³“2:¼K$ÎÙ¾¶€Æœa¡Ñ¾8˜3 KB/ù™BGF×­bºhµ–^¹­²Ð*GB(/K¡qf¸³ŸËgy@߇7\ íÒìã°ô{±ÏÛ¸¶*ªö–#1Q:¢†¨OãǴ߬¼ñ7(›/ã³Z=–Ï*“)ÑäüœÓ¤bÙ54Î0Áº“À Ý î«æö›c_ÃàÖ=:k{6näÅÞÅ;ÕìÉÒ (G¥K =òú™2k ¿¼ ùt_6ç÷l] ÜVžÒ;ÅQèý(!2äºyX. î’HýÆ‚Ì+K j¤&ÀÁ‘”œŽUá!–Ÿ¼jÉÆ}>Îú%y,Ý®¶ê4‰–´†d™ó²ªÜÍ•µÙMogÕ#|{õº[Í„´¨ÖÚvëó¤K;´=D…RhMvb¯IG¯ VsIÛäy· p‚ T»åè¦hI€-*ãd€×&ÔÛr¥Î‰ß@ÈTæ½Oò5?ª¿ÐåàÊ+ÃÐU­&fÇÃI‚âgý *()T~®Ó·Û¤Æ-Y ±ùgèw_ RÂðÞÄæ¬|=>hýÃ_=°bìá1…ø~rò`¦×å¾Õ4_j'kÈô<Ò…­€ÌVóöoó…z¸û-m2^òMb¦ü¾(³¯ ¼0߯qÓÔ}9¾¸,]Ò7*V„Xv~α;/<•”š™[^b>.’©­'öåórYUÿÖÅl® 1Áâ¥J³ýchÛ?¾Ô*`ýê¹ >?Xù@e/¼$xÙ:Z„ÈIµ lÔ´vIü;I¬VEí™îx­âøÓš“jøâf'ª8E‹¤¤K«œ¹,lØh”®’)A¿9L.‰1ôvz%ª("úO_ó¾MC½Ÿsu?jéÁÆ5ëÉEÍs½Çq~2ÏÙõÜõ/Âò­LiYbHëT¨¢IÓÚÏÝêpiíÌ´‘ð+:#8(êgçG©»›€6«,i|§#Æ(»Ùk¢D”‰¿9ÉCN€Ú œ*`©ž?<‡ƒ. ð@.¡ïì¦}#KÙRIu‚¦‘&(É^Tk²èvøô´+OâžÞm¬–# IQhpK,±a=Â6„ú@þKÀÿÿ“—‹ƒ ÒÛÁßøÚålendstream endobj 13 0 obj << /Type /Font /Subtype /Type1 /Encoding 105 0 R /FirstChar 2 /LastChar 161 /Widths 117 0 R /BaseFont /FZZAFV+NimbusRomNo9L-Regu /FontDescriptor 11 0 R >> endobj 11 0 obj << /Ascent 678 /CapHeight 651 /Descent -216 /FontName /FZZAFV+NimbusRomNo9L-Regu /ItalicAngle 0 /StemV 85 /XHeight 450 /FontBBox [-168 -281 1000 924] /Flags 4 /CharSet (/fi/fl/exclam/dollar/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblleft/quotedblright/endash/exclamdown) /FontFile 12 0 R >> endobj 117 0 obj [556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 500 0 0 333 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 0 0 0 444 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 0 667 556 611 722 722 944 722 722 0 333 0 333 0 0 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 444 0 500 0 0 0 0 0 0 0 0 0 0 333 ] endobj 9 0 obj << /Length1 1199 /Length2 3076 /Length3 544 /Length 3877 /Filter /FlateDecode >> stream xÚíXW\SÙ·FZ$¥J'0&”€@ˆˆ”Ä¡)½’“ $¡ÉPF¥X"MA… -ºTQ±0EEa¨¢HDåÇû÷úvßîïžópö^ßZßZëÛk¿uUG's-°¢Q™:H8 ±'‡„3œpT[Ã)ËÄQ \ÀVWw&3)ÀO]¸ %À1É4*Çäú8†Cìptˆ‚D (ôwÐÿæH££!ŽtríÄ`t ™Ê…04|x@e:…‡†RÈá0À …Óñ !r+üyfˆ%-4šN&2!P—Ãn0--í櫓±1$ úÁ 2‰ Ñà." -t+— tná„-_G"îÌÜj d2CѺº¡DÀµÁD8`ê¸Å ,i![ ð–~2Às‹Öý™†ÁTZ$5æ§‘L%|iªëB%‡…XÌ?\ø»0!=„1 @>Pw+µst(ðDn™qTBlL(-BÄQ@,™p?à.€0éá@lÌþsF"!2ž HÜ#ùÎÎ5į{;“NŽ‚x!à‚Øzÿ]ùp—@£R¢¿»ÛãBˆ®ÆÍÂÂ\ëgýÿëiaAãÒê P=ÔÉíÓØ@ÿGÖõø¦Å«#ŽüO­ˆï”X*‘1þÚWËomEtwV!Ð/£ ƒü'¿=IÆè÷1òF ¸Äý :^ÿÿtÈ~ÌaN¡|QúUWIJ¥ …{q¶”!ãÿG.„L‰þIÜŽnÀ× ñÝðWvs*‰@tz_d†9 8’™øÀ¯³óMn— 8Òä­+Î 1@þ€9’ñÁT€ÁàÊ ~Hz€Š§ÈTĉÉQð¯a ƇÓé\¾œ7öÛžHæ–Q<¡á÷&±“Z×jÍ"u&ïêwº¬n†«ì§S¶½‚óvÙËW(ì¹°‚Ê.Ä8Þ4­öâ³ãÛ–œ¥p Ý(2ØØ¢ ’<&Áks\~^oby»zÑ-ê¤lNñŒetŸÍÕÊUuSËA §dšt¼ÒšçÔt˜ƒ ‚rei•Ã4f,óá肃 %îZðá@;t4%Gø`GÓƒõÝ=…›æßKVµIøsz,D â&[ƒ™ì· FèöÁ½¬â‡ÚÐRƒƒú>¡OµïÕ»AÓßm·ÐÊ“ª Ÿš—Mtÿ£R­«,–U¶ÐY>za°¦ŽœÔP~¼Ñ™Ò)*1ÒÖ) Í=PÔæº:»,¶;yÍ"c`bþÁ"®ç”SsÉû’ìyååœbÁ0e³ ÕÂ;V73oþʸîg}͉°± Ÿº¿G»`h|Î]ÉND}E¨ÃÃIjV ‚l>'¸gŠEƒû®jáÃÄŽ]¾ý÷æÈngœµÉðì“úÁ㢵Û솼ΛùGÞɶ%}–äŸó@T‰Vz »¬&ºv{ýØËüY!k››æ¼ˆáéìÌxS™§":‚ÖÍ7ÊfáÕâºÂúU…çtÛðíøä =]*ŽÂF²“¿Ï]tE¼=,u^×ø¶‰ÓFïŒhòòí{tÉ´hsÂÐJ£Ò%-çL`í"Ö礣}yÓËSS¬Œ†fÎ4ŽtùGgi-Î&y÷Í0žÜKq(ln½£ò;¦¾N|—žÉg÷=î3û¯+3›@ÈöÜ›¶Zì/¸Å/ówƒÕÕA%²ËGO'37P'ê„°1 *à‘9hþHÒs¸´Ýï ·ÝQŸ+Íx\,{—¯ÝðÀ{Ïዜ[)V%ë€ì4På4è`‘é¯ øÂ+xÿîîËÚwSŸÚq¤¢õ–䥳[uLe"µÅîmÜ]P“ŸÝ89°vãNu5r€õi<%ÏÜ`ˆ©ðlµ'AÛPrv=‚kéè³î»=—ãH`·Íaä{¨áV¯©ËQ|é¶ñ>«-Þ  ž™B[5S%–/¥y—I(r®\Qµ{briž~ÔJ3ÛÓ×d³›}ò4Ûðþ/6ã³üÃx<ˆ …?ï0ÚWÈÊ|´°œsÔSŒGÌ횸˜\ŒZø»-Q;hôdå½#ù¾OË‘2#’çä&@5úòÖYÀ,íÑ¥4+Jâ¶gæ±Äl_0;ÌÉ?7Á"å‰ÐƒÛó­Ð½ÐCiÊO7TÝSÎRÔÈ…|¢fIwcŽ„Ílv¤ýbMrð>5«9Çë©U÷Áfµc÷ÜîZC3®f’É`¬`è]¿±[d¡1¼ÑÊÕx®nу~žjQá?›$°£;V½œ%ÈÏk¥Oúß°Éﺪt¯}8’/}zGÊÝäp©³züXž¸ µÆÓNÍ¿ò&íkÂÇ·=ö¬¹q$ã¼Èx…cæŽ ÷$ÖÛÄmè^ÙÙ[b¡~Ðêð×Ú]Z×ó›1xþVWB…íúT$w¶Y.goã¹…ÅxV#ÂF“vruX£m¡(•Øëšþ|=Ê©´`/. î¶ñps|†Wñ1¸Ÿ~­óaòbAܰӚÔ!ɨ¹z¾˜Zb<ßщÝ%¤d¾5ïÉê:6k”­Û|ƒ}˜]'Í€yŒoR *Î<7ýQ»ã`P@d©nˆÏε‡sX#}½†7¦Ó/± ÃÊöÏÇNµ~¬µ‹è²m75›(.Ã7ޏ”6(žQÏP×y"g=˜Ó¥WYÎTöz¾vÊ$¸IØ3c=µZìy¬ÑPj%;y÷•0Âÿ®€íìØÇ¿ŽÜÊé> sa«.`þ¹Ö1ï³Y¶FméžÑcÝ+uCñó~qÒeØ7Yç†b÷Q¥÷Ö'WL³{­ý?NçbØ®5r>gŸÈ^©Y­Ð¹Ú œ4íw)Z½U:rì“eç…¤)Ó¥²#.H¬)FüUn±¼ƒ]u{ïíàÛª ëXŸJ"OcGúo`Ç–ÂMЃGÕ¾FOÆÖ8¥,ì®wÀÒ/JÊåDи©b­&ßåénëç Ò]4×àÍöd%VgÙÜ{GéÏ2¶M¸äì{¼ºí·½rqŒDšGmYCrwb®C3ÇGS×aI¹@„—Àyþåܾt4”§Ýf©Nq >ýñÔÙ—IÄð‹R†ëxçÛ9V©m'}*?ÕŸ>ðÇña+™Êy™ÔŽîJhçYX€ìpßPØX×TuÑe~Þ[ÔåרüžâSñc˜‰¼m–§ÕdiAÁ^Óx-˜`B÷×"k¿£wº® çç©»þ¸}Ã[/%¹}—D©MPf†•¦#r¤ðåì’ÝÎ}¡ñõ6ò(;ÑÐÁÓ’ÂxÁ¦£œ¦îû&‡]Â3,ÃÜðð] -o®ÌG~2­æïKÍ~à´Ô¹²îЛµn~ÿ²‰WÜRÒTg£j%¿@mÂ!õ-§žé7{ö¹þH,¯2Oæ2"òÊ'%ƒšÎ;b7ƒ uòø£òÙÞ £ "˃ªÐ¢È£€SßL<£óf{¹EQyŃñ¦V©ˆÃMfçwý2éñò“š':Û ™=j^W§ÕþüЃÔD±žjM}•ÎSÏU»õ|næü*ª¹v±eþ„ßÃÈ9|G¬ö:¬#‚FÅcæçS&/¼êU{uÑU?R¢ÜK6fR¼(Pú\öʬ$Kü}ëw-³0´¢+Çž"ô(:v™~ùÐæ^ð…9ÏSÏ·Ýx;ŽP5¼Ÿp¥ê–÷Ÿž½-†ë¼y ¬xE4Ö=‰ÖÀÞí1YÖwî=Ò\º6Åš=ºî\tæ16Ü·*Lƒqòxy•2¦ÉU0xWåÕ÷"´™~Jð¡ñ6[äIàÁ©Ž#ŽÿX|™^L¹ô…WÙÜõa´OXbÅ«œÀõ ö+QÚ¾YÍi4ÎÁq|éG_–Úµ±Ë)·`oÝkÒHŽyN•;Dº2yBŸM¢t=–Fñž¿Å–¯Ý¶zpy%üæÎFBÿ+ý¡ŒµêPߥ˜ ñx<—Ÿ°Cü ÅèmyÁÙõ¬rsgÞ64(¿òr}Höq{ïøó<нvŽÓ¼§-ãªh¯Ô"¬N Ô´`M˜TŠÌÁ¢ï×îûè7%GkÊÈþÕУ†cÝxO¯·÷H›þê«\üWƒi¿íæý¾;oH8H¦ÇT |¸ÍòŒ¬n Ö‰ÏÃl?)Î0.¦½Ø9÷9­x܃GT„?Ü÷úÙs=©Óñóu#‘m8S] ×’B$'!*+‡¯i÷¯â;»½¡¦Úàñ‹¥ü™ÅÄÙ_,£ô¤‡úø³Œþ"žm}t³° öRVT;²ÃR×ýMÄ­ ¸­[à2!ÙtïŸ d"V^$‰ˆV^Ô.ùd¡ÝɬU²±Ð17¤2(œ:Jö%ØY`©»RjV~“µõÅk ÚÉ}øXòÚéP‡ˆÿñw‹³ZäñÄëÇ’Ú¥ˆ&—òGØ™öuEÞ®Bù‰ç4¥^®d¨gŽÚÐ,ƒš‡±5¸òÉÌ#¼Årɼ¯)ÊÙ+}„Þné Õâ½{®•wÜ»#ñbi{«¨ÄÕCT7óg”]ü’“{JR „ž~xŒEá8¶E$frëby“ëDø¯ì7{ãßÕwâàÔ¥ ]‰Õ{=~çɈÁú+µ7©âŸùFÞ\›”Ûé‡Ð> @`kìW£»`.ŸCÜSú×ÅyÏVœá<¹µ{Üç5]ñ·)˜ª î5]xêºÓ¶ÛBzæìGö]?¶XÞí9çýöŸ=õÍ)6ÌÑ3D³:ž›\~D*¿¥¬°|Ò¾–?¸«Å‰ ‘ñ·•mðæsuj¥ƒt‚R`Í>+î‚Sy jA×.Å,{#1E¹F/ì0§ —t[Îo‚}5½Á¦.®ðØ æáœÅ.¶¾E(ïv# >Ue)͈k3 ŠÈóBÝ)óCÛ<wÔè÷voç¸~åÕº:óg¶ ûtŒÛºñtq‚*] b…5l*>ò{Óˤ% Ô,vñ¿|ÀÿOð‚Opt&-GÇГFßú…þ/¤¤ÙÉendstream endobj 10 0 obj << /Type /Font /Subtype /Type1 /Encoding 105 0 R /FirstChar 46 /LastChar 115 /Widths 118 0 R /BaseFont /WDWBBA+NimbusSanL-ReguItal /FontDescriptor 8 0 R >> endobj 8 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 /FontName /WDWBBA+NimbusSanL-ReguItal /ItalicAngle -12 /StemV 88 /XHeight 523 /FontBBox [-178 -284 1108 953] /Flags 4 /CharSet (/period/zero/one/two/R/a/e/l/s) /FontFile 9 0 R >> endobj 118 0 obj [278 0 556 556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 556 0 0 0 0 0 0 222 0 0 0 0 0 0 500 ] endobj 6 0 obj << /Length1 1166 /Length2 8541 /Length3 544 /Length 9358 /Filter /FlateDecode >> stream xÚízUX\[Ö-ÁÝ¥p§ðàîÁ5Hð +  ww î ¹Óð£Ç;Âoq!ô¨“:| à!”–'§9j'QmŒ¨†‘D!ÿÒÓAX¦ƒ Ÿ A)šü€«^L]óeê”»—<9Ž4£`OÖ{@阶òÒQBv_'BHumôs×U…‚º²¨ê…ÆîWVaâÛ# %Ç-”¹áN9nûÈ •/MÓ7Ì*FMWUøæó_ûd°ç"Ñau'–†^ŠtŽá½µ«h³¹­v)Pá{ã²ÄÑ_ˆmZ°ûÙ·ØÎ’Ò_o‡á–´„O–¾Õ;iJq ³iæß@R¨Æ`« >ºŽÜÕwœ¶6ýIá/–ˆ q¡Â¦Q¤Ä4г”?r†Ö§ûù¾×µþÎO_a¡p»RM‚1âKé™m“N’ ƒ ;ꀭ—›ÑºXk¸§q÷"•WÆñ-×]B¿ï†ë ¸úz\†KGÊN!××¶®Q"~æ'ã5mÕhó¸¡Ff÷]³¾>pƒ„‚ćn`Òfû{™N¹’ß5&I/æVôÍâ†à±lÞ ë­â…l®Êe÷/7òiÆ„/|nRjG-[´1uxè=¦W‡šd«º'eû§oìV¶#D„ø…õóˆû¤fÖ8„(rqÌæM?l‘ŠsêØ‚¾Ó•í$ÑslðµNˆ/n¤õãäöݸ:ß–ùó6¨é:ÉäŸvßÛÝo·üDTC Ùå±ü(Q!ÛöB#sûŽ+øÝ/ÿ~ÙîkGãÎFª¥vy»ÁL[D‹2¢çO’Ò†ÀwX™$=l®ûvªÚôÓúhH~ÉVlÊÙh&Žd bÚð#V3!^:Tíi¤[¢ìê"ò¶Ÿ¹BÛ»yR· Ç6 ¤h#L`‘²ýjÆÇé÷Çû_{Š8ˆŸÉv ¹2æb'ÔNfÄÆ&RñFT_ܪƒßëÀÝüzhÛÇâT¨òü%ORÕ»òÁ~–«W'p)±š#æœí´ÞT™‹Ø(&‰o…z@éX)ý<ò‘Œ…±ƒºàº<§Y®\õx¢¬]ûvcnBžf—:VøäÚb¢N˨½z9™89âíß²À7J ´RÞÊæ$?ˆ·Í" a½Œ5™ü#Át¼U ‚šžˆ)´ëÉ"ÞÝÛ’„phw çËÞ…YY¾ )¦èîLIƒ_Êh6¸¾P‘ð¤VdSþ¨úC£7ØpÕÚ¨cŽd—ôå±éG‘>ô«]Q×TS òeDUÑ $¡Ìé[ÚíØ%¦)ªÒźá%>0–ÉÆ[{ÝœýðT²RªN’¥ˆvÞTª¡“ïð ä :ü c„ð¤*Õõpù¸@NÒ+(5"VS‹7ïûb·kv–2¼Sc¶ª¬¸}ÛÂW‘7£;…ôåµB¢‹=L›cËÝâîtŠQ¶°·°•ûæ¾ï Êí,êŽXŲCoµrÑ´* Øö¥i?‰5þü°'ÉŠáô¶êýDEZ ‘:ð»’IßÏcâ¬!TOu²ï&4T¶Â©Šj}çºÖª­~›·ú5ÅÇùè•÷»ädŸ9Áv‘¯Ô_¬àÐVµæ±Ž}ò•á¤þ|Ó9G¿º¯G83ÒØë,°­ê\ÁrŒþöú Ñùš»6›PɱO)OÁ)PVaAæél¤jî_ ®î¡ÇŒ‘g,ão!嶘IñKxýF_7 ØÌŠ.íÐgx'›ìCè2O2~upƒ'-lœ·¹ïUgHÓ}2¨œÅ7µ’þ*þ®òoÅÃZ#´jMÞ,?ZÇŠlÒ—m&÷x[ó–uælï#îÅ2:Ý?<,|MÆMˆTßRu÷å1[‘>õõ$ŠA ¹e&?„žXtOZ4àrdh»5‰(åNëø«2g歷òcÛÂk+ëÙ¨ÁpGÎ/¤Lˆ»ñ¾1­§l0‹”À^‚~ûI|25ž€2j9&|N+ª½(RÏaèIýÒPËSØt+±)oÊâ¥nRv䯻V7 @-ùLö`ÎRpa2‡b²C”û6Žd?"&a9M£`ü@¹Î4{¼G@5|¶t óCóšñÒžûÞt‡7#ð‘˜{³[…×aôBŸ®4@9…úÑba‹£üT­=o!tš……/{C…Xà½Ë©à‡7+›¼ÂJwFVZ×ÑíáÂ0K:ߨè^ì}_{?iYŸÌWâlÕbá ¯²ÄÞ˜æéÆÂïò£ËíèõE_©7‹¸Y›åñUØ„©£9Û^£ ¨¿’Š·^ã,7À;óI‘Æ} 䲤ö‹zk‹Æ¥xÚÃAœw¯ð›r†O­¾nl{‹í·aŠlV¸ÈM—®íy/½ÖM28ÇžÝ7k)³¬É¡Mt‡š?œI¾8TÐÉ|À ‘JLL5ƒƒã.»NØ­[ð—U¤ÉIl|y&ûIÝ~œì{¬65ÆÚfnD`Ô§;w$™P3_²ˆ„Ïo‰3d>- Ùz4ê~›Ä=VþÅ>9<0GáyÝ&âA¦wªü¥'ât”pBVRkžò5½ _wœnàîç±Ç¡¡µ¸íÀÕ: Æ'‚-S ŸÇI;à•ÚL(8ròWÊ/¿[~ Þ¸|±áX88¨ ô1˜}/ûŽ»Z.F>Ž•j…À®ècŸ¼­¸÷‚ÞZšõÛ%†h•†%¡<†¿ ¹Löc®èÀÆ :¬˜»tBxCý+6Á©Çæ]ê·A8Št4 w˜W&!§‹ùÝr9î{rBtz;ÈÞŸ‹I´¥H¡~š×žÞñŽî›„u8£ˆC8>K:;”îrö úz8Ò”tµ†á•œŠ¼Ð‚VìŸ _ïåÞ{V.Ç©*Qxq[¾ wh‹<=¢ê±à  åP"®›;Õ3~ÌNî£Rá(.ØZ—µí©äùÚÏ«œec&&Ø-âÇÕ1k¬ÂšJò (ŽMñfJC(¥=ò5<éý'¾ùÊJ>POZ¨)Ò*ã8ñørSwª¡èôoù…íê&šI®våeץ䘎õßè©H A{#ljúûd›!$•Íç¡ßºvÇV6d ~ùï&ñø:J Ðnø÷"x¼„áH/Ï7/”ÙHÚh[ŒŸS£ˆîFõÒï¾Ü?Z»5"GZae“7þ@©P~µ㉵¼?,½"ík`i8n*½šà-)´"L´€^~Q÷{Š(bö;ÿÝþ{¯"G…¾á5œ ÄÞêWÙ÷çi•eô]äQ¨r­iý úí¾\½ÖC9X˜$ÛÕZ©.¬ŽçSéÅÞBË|./äu^U¶4 ôÈÎŽszN:A7ÅC/ÊgµKäŽ xSYà Ty‰uñÕŸ1Ït4albŸÕé28~|Â*ÇHïUid׉ÏÑžëçE‰šüªJ[§*ùvËKöJÕsviµc™ª(o“£iA¡zÕŒlÕwƘ=#1c«¢‰>íFøDñ-ÿaÁÙQ eÃìM>;×®W[®p)§½ÆÓ:ýçf“Ÿx¹±/©(É;´dóB#_Ø›ŸÞ߇â«ÇÛŸŠ£÷Îï49OÈé ÙnGKõ½ñŽ¿?å ðlÍtN‚Züë±w6¦áUÍŠPu^¨aLj4×ámX•h‡ß[¥•ôqrö»­-¯KKuÛSHŠG• ”·BÓ‚vîTéù˳-#^©x•Üê¬À¿´Rlç´*1—Z:pmòÑè0¬x?ÔTõh3«t]wÉð–'«Hy/»Mʸ¸ƒ™'MºHH64ÛxîµÚcJCˆè L´ti2çË ŒŽ4Éà(ÿÁ>UäLtž=‘SÒ&0ËN¢,Œœê8é¥ÂεX$K¤Ü°»öR#¤½ŒÎuZ™É¾K‰‰®+4]Â@ ÝT£TaåM!$^ê.O+i8à9êØFÑïxŠrñ¯ÃÍgµ´-xƒ;”[៬ào ô‡{§ˆ¢§>ü.øÑŒ<‡gµ*hÂ}Üu°çVÐè á÷÷*ò%€”î£ÿ¶p®×ÒÛòS}–úoiTfÌÌ˽½IŠs¸¸Ëð_,ÆÐQâÎÎØç 5ÑCã鄵ÎÈÂ=-´Ùkj§_ÚÁ^€Õm!m¼æhCHÙe%Jˆ¤l³!wÞ¹rdžå[œ™IÌÃðxÛm-£åR2×)5ãsFÐ[òQ2Eɲ–¼Ï«à]Ê\6zjèZÜÝ­ÃÆi¼4§gÐBqò(|K/6ëÊ@îa‘q¾„Ó·VÛ·¼¿d¤îL‘»„~‚?]0'Ôv‡«%ã$žŸˆ —¹ ÐΟ:€‰÷SÖUW'$”j>Á]}TuŠ…‹aùPò>hs’í,X/Óƒ.¹/Ò#OÏs÷?U§ô £æpÌ;šë»JsúÃFxg7a„Œà#WèVtjƒ¯gf™á.gÕ÷9èC!¾# ‘LþTtb§J­¦þ‰6B×qèƒHO„¤˜zå*5·ôÕÓ•>˜êG6ŶÄËýX{ê\µªÈ+ÜÀÕíb–<OQ.‡ [(~sj¹•îÄ«…Ä´°ÌžÄC|’šï±fQ™ú*~[ÂßI6Žæß×'™Èlדj?öÿ.j%)NÕ»`: ‚ï9p=XžÕåϺ z>ç_ó~˜î•µ\\£¯æy»Ÿ·m­|§¾êwh2YÙÄÿ–SBJÇ%^N•¥•¶,sõ”cçèÌn?êD»õØ!ŒÑaÑ/í)º§ú,8š(1-ƒçÓðÃvîD÷p95úÄ*Ìïb9œzHa¢%C@R;øã<;Ö{&ø%C>t7!û0È»Jø9ì CÊc66¶¶÷ƒŸŠ3?oM2#rW ߨ€:7„uˆš«†:¶€ÎnEaþÚÈžÔï1^ce{úsæ®D£NSã{›šóúNè#0”¦ÏO s,~À/zÂ2[¤P™™‚HZåa¶W¥¹üžë½&ËoàÒƒ…ä‚ÿºš–‡Z-ë—´uø›Nd>yxg]ðûWüøEäÄu‰ð'TÊ-#° ¶+“ïRdãðöƒ\ø´üµaÁÇrzùoßÜgõZÒ/…å°{’bCùU@› ð,ŒÌGõìV+A äÓÔßa:HÈc©sþ?­p9ÚpäS°ꤋ‰Ë[­]ü¬­ó! dÅ–?ºÊ.|ìËÙÕn¬jb.V¾rAÇw­è;B°Ô¼Ïˆ{ʽäMFΞÔD®à'‘–Š÷·h»c§m!—I4ÿlÌÝ纂(f¡ÚCsà65llÄâíUËÖÈ€æ çê×^Û}AÂá‹3Âké÷o’bQˆÂp!6¹¢51.m•J’á 8òYäѲ1 "Å1š2@8ÏPTãvGAÃe®¼Ù&9c¦nƒÃkºÛ¯Á¡4aªþ_ÑÎè| T%¶Òç h·õ⪔`[éj¡ßT!åÝO1`ù߇ûs¾vé› þˆ+“ SŽôøÌEµ‰,^³EcÚ_pætc‰’õ^¨¼‚Ýqw#lŸ=ýóøikË0¦æµVʔ܆!µ¦kD„}ÑË-³\ÁœÕLcqóIÛ§N¶†s]žr)•dFLé )ûÜÛLø(ÝUQ¸K9*¢ÜìxóþœP½@¾~ÞˆmÌæ^ƒÔý§ðÆ)¥†óLHGàøÖDw^äÑg»YjëÚNçõ€ˆ,rDn’Ʀڢ3¥• SÏãÑ}~¦µ*¦&kÆO?Cþ/Æ…]äðt"pfH­^ä+A©\f×÷ºmúªnûõ̓·o¡[gQœû±v|üOÖyÍwiô¬Õ‹ù;d¥ $©m72ÇÆÓæÀ¥ŸbvÕ~WE¾:˦›_Hýhy?‘›Ú…{™e°ÜÁ‡W.%Afdnq§%GK\î¯}n“Ä2ÝFMxåj>ŠøZ6}w8¿ZZ€-صKJâÀ/ß+Ú$Z¢F‰Jí²~ÜPéS÷¿Þ€~ŽÁÕwй©™Ò9×+È)ÒÓ«­:kpØJFÅ|kãi°Ü’¸ß™œ;¼ëŠ@6k\ÿÕVÝœO}b¯þ‘_‡™,]`Ó2rÿ ΉɆ.öõìËä©gÄ#}›:öé`¦ûú%ùVJï¹EÌÔéæô„ØRìZõåZ‰ÔyS“_–ÙˆÓY}ÅJo¹ÿ޵¯¥Äê}o}ì¤dlþ;©4¾U1ð¯cša1ÈÈaó5Gò:Æ]WÖ2¢¯ Xx¥ÏØwMJ—€Ö5“=j3l†;úÛP¹h|cü·Ó-Ö‡”ñ“½YA²¦R¯a^EÒ9=Ç=€‘]„»¨×‘>Á™Â×O)1l œÖ‡Šçj˜RM…1Ò'¦#ô­ˆÛêgYÕ¥m£)ðJÞ·JJI{©",lâXgxbó(}dX]…/$¢Móý Ú¶'T>¶ø*G+˜3óá]viF—úÖqÖ^£6mͿٹ`ÊýѸ‹³¤.ɼ1°xAúäŽvÊ“…jsÎûèìç6μ®8¿œ%jÓ=hÄ"5æ­˜LE®êÙÂæ¥O ÀŸ›„é0å½)[}‡ÆÙ¯.»MoPDÃ;C‚dM@šÑ[Uø}cfR”éû‡Î­NÝc#œl ½’¸ýæeÙ5é Gïö\/žº=DÙÓ{üU”OËÜ—ð±WQÁád33Zî> ±ªù>l¹ßÎo³=^Í‚Ô5ajO…¶eYt[D¹£r9[‡W+¿Ê ’;"5qßÝë(ff¢52ùZ$`ÉLÞzWW„vy«E2Úb%'ÈÔ¥j¢ÇŠZCc΋ç²VŒé%õ““âøzåàaè-¤€RåíKQ5ÕGîŽFÔŒ²®îTÚUp¦Éð‰Fýsqç™Å÷ÄÆ ¿¼Þ$"ö5«Phú~m?>×[{ÓÐ>”Ì"•8Å"‘ЊC˜õ`­ šo½ÚZìâ9 /%$Èa/-šþâëâ#¶µ™§!ë:Ç?fjÀ7¹ž'ƒIpÛŸê)µ¨ÑëlO^°›A®¿ëëFܺ¬×2«ßŸMbhÑäц1óDNH‰(*”³W 4±ÚcÍÜa4✠‹î‰¡É4Yt%ž ˜Êuz©Õ·;.îÂ%™2 ozèïÈYVÞ—Õ8I^ü6úÐNxÄîÉ+ÊÄ {•o‘ËèŒZý+ xŸ‚§šûÆ)­6Jy⇰ ߀ªbv€¼&î­] ¾q7® )Gªîh/§ÂŒ­ taõ­úÃú¤b‰…Ok}ݜԋúÂ…1ì+Ú”Cµ¬<37_n)ÙÒyÔ2g×Wºƒ† vbõ â“Ifá}䥻ÁÇrúw”çîdÞ“8±þówæÖ½tmm ¡ºEë› zró’Ò¤hånä(sÊ4‹Ø4Ò‰ a8¶;"âmCVNi¸g±Ë®7Oí—¤«¸ 3N^˜.U?·¿awá·×YΚ歲ɑScÏÌ~zEÉKæÊ{î2'Ï%Š£GÜȼÝþ¦W|^¨—¹÷±–«j›ÿf¹ìTQ\ÆgB—ƒ£·.§Æ“êà‡}Æc+sgláÞ¾?ÜwÖ(Ó¶Rlh–Á+Ô½†s¥†7i¡rmá4ý-,„Or3²§ØðbëH}WS+&ú•¶ßP‹å?§úÜÇÝ+®w™¯™ŽBB‹ŒrÊ„“C} w´Qäºë×,bÆ–Ä¿P"á>:È€ä¡ Í¬ T[]„¦íðÔ,•–"~üÍ 9›ÊisßɧXL$UÞØsá«>RP ô0=º¯§¿d‰à£2mzcŸòNö:YÙð—’$£® ~wy·¾(¼8Ûj@x÷4Äýy¡ÿÿ'¬An0ˆ“…›º¯ ƒ¸ýñw0ôÿÝ«v|endstream endobj 7 0 obj << /Type /Font /Subtype /Type1 /Encoding 105 0 R /FirstChar 2 /LastChar 121 /Widths 119 0 R /BaseFont /ZQHVIW+NimbusSanL-Regu /FontDescriptor 5 0 R >> endobj 5 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 /FontName /ZQHVIW+NimbusSanL-Regu /ItalicAngle 0 /StemV 85 /XHeight 523 /FontBBox [-174 -285 1001 953] /Flags 4 /CharSet (/fi/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/at/A/B/C/D/E/F/G/H/I/K/M/N/O/P/R/S/T/U/V/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y) /FontFile 6 0 R >> endobj 119 0 obj [500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 278 278 556 556 556 556 556 556 556 556 556 556 278 0 0 0 0 0 1015 667 667 722 722 667 611 778 722 278 0 667 0 833 722 778 667 0 722 667 611 722 667 0 0 0 0 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 0 500 222 833 556 556 556 0 333 500 278 556 500 722 500 500 ] endobj 21 0 obj << /Type /Pages /Count 6 /Parent 120 0 R /Kids [2 0 R 23 0 R 30 0 R 43 0 R 48 0 R 52 0 R] >> endobj 64 0 obj << /Type /Pages /Count 6 /Parent 120 0 R /Kids [60 0 R 66 0 R 70 0 R 77 0 R 81 0 R 85 0 R] >> endobj 92 0 obj << /Type /Pages /Count 4 /Parent 120 0 R /Kids [89 0 R 94 0 R 98 0 R 102 0 R] >> endobj 120 0 obj << /Type /Pages /Count 16 /Kids [21 0 R 64 0 R 92 0 R] >> endobj 121 0 obj << /Names [(page001) 4 0 R (page002) 25 0 R (page003) 32 0 R (page004) 45 0 R (page005) 50 0 R (page006) 54 0 R (page007) 62 0 R (page008) 68 0 R (page009) 72 0 R (page010) 79 0 R (page011) 83 0 R (page012) 87 0 R (page013) 91 0 R (page014) 96 0 R (page015) 100 0 R (page016) 104 0 R] /Limits [(page001) (page016)] >> endobj 122 0 obj << /Kids [121 0 R] >> endobj 123 0 obj << /Dests 122 0 R >> endobj 124 0 obj << /Type /Catalog /Pages 120 0 R /Names 123 0 R >> endobj 125 0 obj << /Producer (pdfeTeX-1.21a) /Author (A.M. Kuchling) /Title (Python Cryptography Toolkit) /Creator (TeX) /CreationDate (D:20080630091847-07'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref 0 126 0000000000 65535 f 0000002618 00000 n 0000002326 00000 n 0000000009 00000 n 0000002564 00000 n 0000160769 00000 n 0000151126 00000 n 0000160603 00000 n 0000150710 00000 n 0000146542 00000 n 0000150538 00000 n 0000145500 00000 n 0000126071 00000 n 0000145329 00000 n 0000002450 00000 n 0000125575 00000 n 0000114916 00000 n 0000125403 00000 n 0000113968 00000 n 0000094434 00000 n 0000113799 00000 n 0000161514 00000 n 0000005657 00000 n 0000005493 00000 n 0000002734 00000 n 0000005601 00000 n 0000093764 00000 n 0000081270 00000 n 0000093589 00000 n 0000008913 00000 n 0000008749 00000 n 0000005750 00000 n 0000008857 00000 n 0000080795 00000 n 0000068791 00000 n 0000080626 00000 n 0000068399 00000 n 0000066163 00000 n 0000068241 00000 n 0000065626 00000 n 0000062082 00000 n 0000065466 00000 n 0000013328 00000 n 0000013007 00000 n 0000009065 00000 n 0000013272 00000 n 0000013134 00000 n 0000016534 00000 n 0000016370 00000 n 0000013433 00000 n 0000016478 00000 n 0000020474 00000 n 0000020095 00000 n 0000016663 00000 n 0000020418 00000 n 0000020222 00000 n 0000061764 00000 n 0000060377 00000 n 0000061605 00000 n 0000023888 00000 n 0000023569 00000 n 0000020603 00000 n 0000023832 00000 n 0000023696 00000 n 0000161623 00000 n 0000027846 00000 n 0000027682 00000 n 0000024017 00000 n 0000027790 00000 n 0000031396 00000 n 0000031232 00000 n 0000027975 00000 n 0000031340 00000 n 0000060065 00000 n 0000055281 00000 n 0000059892 00000 n 0000035291 00000 n 0000035127 00000 n 0000031537 00000 n 0000035235 00000 n 0000038965 00000 n 0000038801 00000 n 0000035408 00000 n 0000038909 00000 n 0000043356 00000 n 0000043192 00000 n 0000039082 00000 n 0000043300 00000 n 0000047117 00000 n 0000046953 00000 n 0000043485 00000 n 0000047061 00000 n 0000161733 00000 n 0000050349 00000 n 0000050185 00000 n 0000047246 00000 n 0000050293 00000 n 0000052445 00000 n 0000052280 00000 n 0000050478 00000 n 0000052388 00000 n 0000053287 00000 n 0000053118 00000 n 0000052550 00000 n 0000053229 00000 n 0000053393 00000 n 0000060281 00000 n 0000061995 00000 n 0000061971 00000 n 0000065989 00000 n 0000065843 00000 n 0000068674 00000 n 0000068616 00000 n 0000081066 00000 n 0000094092 00000 n 0000114538 00000 n 0000125843 00000 n 0000146040 00000 n 0000150948 00000 n 0000161137 00000 n 0000161830 00000 n 0000161905 00000 n 0000162240 00000 n 0000162279 00000 n 0000162317 00000 n 0000162385 00000 n trailer << /Size 126 /Root 124 0 R /Info 125 0 R /ID [<5AE1030E6D92CEE50B6446EFC52C53C9> <5AE1030E6D92CEE50B6446EFC52C53C9>] >> startxref 162652 %%EOF python-keyczar-0.6~b.061709.orig/doc/pycrypt.tex0000644000000000000000000014722611031260411020112 0ustar rootroot\documentclass{howto} \title{Python Cryptography Toolkit} \release{2.0.1} \author{A.M. Kuchling} \authoraddress{\url{www.amk.ca}} \begin{document} \maketitle \begin{abstract} \noindent The Python Cryptography Toolkit describes a package containing various cryptographic modules for the Python programming language. This documentation assumes you have some basic knowledge about the Python language, but not necessarily about cryptography. \end{abstract} \tableofcontents %====================================================================== \section{Introduction} \subsection{Design Goals} The Python cryptography toolkit is intended to provide a reliable and stable base for writing Python programs that require cryptographic functions. A central goal of the author's has been to provide a simple, consistent interface for similar classes of algorithms. For example, all block cipher objects have the same methods and return values, and support the same feedback modes. Hash functions have a different interface, but it too is consistent over all the hash functions available. Some of these interfaces have been codified as Python Enhancement Proposal documents, as \pep{247}, ``API for Cryptographic Hash Functions'', and \pep{272}, ``API for Block Encryption Algorithms''. This is intended to make it easy to replace old algorithms with newer, more secure ones. If you're given a bit of portably-written Python code that uses the DES encryption algorithm, you should be able to use AES instead by simply changing \code{from Crypto.Cipher import DES} to \code{from Crypto.Cipher import AES}, and changing all references to \code{DES.new()} to \code{AES.new()}. It's also fairly simple to write your own modules that mimic this interface, thus letting you use combinations or permutations of algorithms. Some modules are implemented in C for performance; others are written in Python for ease of modification. Generally, low-level functions like ciphers and hash functions are written in C, while less speed-critical functions have been written in Python. This division may change in future releases. When speeds are quoted in this document, they were measured on a 500 MHz Pentium II running Linux. The exact speeds will obviously vary with different machines, different compilers, and the phase of the moon, but they provide a crude basis for comparison. Currently the cryptographic implementations are acceptably fast, but not spectacularly good. I welcome any suggestions or patches for faster code. I have placed the code under no restrictions; you can redistribute the code freely or commercially, in its original form or with any modifications you make, subject to whatever local laws may apply in your jurisdiction. Note that you still have to come to some agreement with the holders of any patented algorithms you're using. If you're intensively using these modules, please tell me about it; there's little incentive for me to work on this package if I don't know of anyone using it. I also make no guarantees as to the usefulness, correctness, or legality of these modules, nor does their inclusion constitute an endorsement of their effectiveness. Many cryptographic algorithms are patented; inclusion in this package does not necessarily mean you are allowed to incorporate them in a product and sell it. Some of these algorithms may have been cryptanalyzed, and may no longer be secure. While I will include commentary on the relative security of the algorithms in the sections entitled "Security Notes", there may be more recent analyses I'm not aware of. (Or maybe I'm just clueless.) If you're implementing an important system, don't just grab things out of a toolbox and put them together; do some research first. On the other hand, if you're just interested in keeping your co-workers or your relatives out of your files, any of the components here could be used. This document is very much a work in progress. If you have any questions, comments, complaints, or suggestions, please send them to me. \subsection{Acknowledgements} Much of the code that actually implements the various cryptographic algorithms was not written by me. I'd like to thank all the people who implemented them, and released their work under terms which allowed me to use their code. These individuals are credited in the relevant chapters of this documentation. Bruce Schneier's book \emph{Applied Cryptography} was also very useful in writing this toolkit; I highly recommend it if you're interested in learning more about cryptography. Good luck with your cryptography hacking! A.M.K. \email{comments@amk.ca} Washington DC, USA June 2005 %====================================================================== \section{Crypto.Hash: Hash Functions} Hash functions take arbitrary strings as input, and produce an output of fixed size that is dependent on the input; it should never be possible to derive the input data given only the hash function's output. One simple hash function consists of simply adding together all the bytes of the input, and taking the result modulo 256. For a hash function to be cryptographically secure, it must be very difficult to find two messages with the same hash value, or to find a message with a given hash value. The simple additive hash function fails this criterion miserably and the hash functions described below meet this criterion (as far as we know). Examples of cryptographically secure hash functions include MD2, MD5, and SHA1. Hash functions can be used simply as a checksum, or, in association with a public-key algorithm, can be used to implement digital signatures. The hashing algorithms currently implemented are: \begin{tableii}{c|l}{}{Hash function}{Digest length} \lineii{MD2}{128 bits} \lineii{MD4}{128 bits} \lineii{MD5}{128 bits} \lineii{RIPEMD}{160 bits} \lineii{SHA1}{160 bits} \lineii{SHA256}{256 bits} \end{tableii} All hashing modules share the same interface. After importing a given hashing module, call the \function{new()} function to create a new hashing object. You can now feed arbitrary strings into the object with the \method{update()} method, and can ask for the hash value at any time by calling the \method{digest()} or \method{hexdigest()} methods. The \function{new()} function can also be passed an optional string parameter that will be immediately hashed into the object's state. Hash function modules define one variable: \begin{datadesc}{digest_size} An integer value; the size of the digest produced by the hashing objects. You could also obtain this value by creating a sample object, and taking the length of the digest string it returns, but using \member{digest_size} is faster. \end{datadesc} The methods for hashing objects are always the following: \begin{methoddesc}{copy}{} Return a separate copy of this hashing object. An \code{update} to this copy won't affect the original object. \end{methoddesc} \begin{methoddesc}{digest}{} Return the hash value of this hashing object, as a string containing 8-bit data. The object is not altered in any way by this function; you can continue updating the object after calling this function. \end{methoddesc} \begin{methoddesc}{hexdigest}{} Return the hash value of this hashing object, as a string containing the digest data as hexadecimal digits. The resulting string will be twice as long as that returned by \method{digest()}. The object is not altered in any way by this function; you can continue updating the object after calling this function. \end{methoddesc} \begin{methoddesc}{update}{arg} Update this hashing object with the string \var{arg}. \end{methoddesc} Here's an example, using the MD5 algorithm: \begin{verbatim} >>> from Crypto.Hash import MD5 >>> m = MD5.new() >>> m.update('abc') >>> m.digest() '\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr' >>> m.hexdigest() '900150983cd24fb0d6963f7d28e17f72' \end{verbatim} \subsection{Security Notes} Hashing algorithms are broken by developing an algorithm to compute a string that produces a given hash value, or to find two messages that produce the same hash value. Consider an example where Alice and Bob are using digital signatures to sign a contract. Alice computes the hash value of the text of the contract and signs the hash value with her private key. Bob could then compute a different contract that has the same hash value, and it would appear that Alice signed that bogus contract; she'd have no way to prove otherwise. Finding such a message by brute force takes \code{pow(2, b-1)} operations, where the hash function produces \emph{b}-bit hashes. If Bob can only find two messages with the same hash value but can't choose the resulting hash value, he can look for two messages with different meanings, such as "I will mow Bob's lawn for $10" and "I owe Bob $1,000,000", and ask Alice to sign the first, innocuous contract. This attack is easier for Bob, since finding two such messages by brute force will take \code{pow(2, b/2)} operations on average. However, Alice can protect herself by changing the protocol; she can simply append a random string to the contract before hashing and signing it; the random string can then be kept with the signature. None of the algorithms implemented here have been completely broken. There are no attacks on MD2, but it's rather slow at 1250 K/sec. MD4 is faster at 44,500 K/sec but there have been some partial attacks on it. MD4 makes three iterations of a basic mixing operation; two of the three rounds have been cryptanalyzed, but the attack can't be extended to the full algorithm. MD5 is a strengthened version of MD4 with four rounds; an attack against one round has been found XXX update this. MD5 is still believed secure at the moment, but people are gravitating toward using SHA1 in new software because there are no known attacks against SHA1. The MD5 implementation is moderately well-optimized and thus faster on x86 processors, running at 35,500 K/sec. MD5 may even be faster than MD4, depending on the processor and compiler you use. All the MD\var{n} algorithms produce 128-bit hashes; SHA1 produces a larger 160-bit hash, and there are no known attacks against it. The first version of SHA had a weakness which was later corrected; the code used here implements the second, corrected, version. It operates at 21,000 K/sec. SHA256 is about as half as fast as SHA1. RIPEMD has a 160-bit output, the same output size as SHA1, and operates at 17,600 K/sec. \subsection{Credits} The MD2 and MD4 implementations were written by A.M. Kuchling, and the MD5 code was implemented by Colin Plumb. The SHA1 code was originally written by Peter Gutmann. The RIPEMD code was written by Antoon Bosselaers, and adapted for the toolkit by Hirendra Hindocha. The SHA256 code was written by Tom St.~Denis and is part of the LibTomCrypt library (\url{http://www.libtomcrypt.org/}); it was adapted for the toolkit by Jeethu Rao and Taylor Boon. %====================================================================== \section{Crypto.Cipher: Encryption Algorithms} Encryption algorithms transform their input data, or \dfn{plaintext}, in some way that is dependent on a variable \dfn{key}, producing \dfn{ciphertext}. This transformation can easily be reversed, if (and, hopefully, only if) one knows the key. The key can be varied by the user or application and chosen from some very large space of possible keys. For a secure encryption algorithm, it should be very difficult to determine the original plaintext without knowing the key; usually, no clever attacks on the algorithm are known, so the only way of breaking the algorithm is to try all possible keys. Since the number of possible keys is usually of the order of 2 to the power of 56 or 128, this is not a serious threat, although 2 to the power of 56 is now considered insecure in the face of custom-built parallel computers and distributed key guessing efforts. \dfn{Block ciphers} take multibyte inputs of a fixed size (frequently 8 or 16 bytes long) and encrypt them. Block ciphers can be operated in various modes. The simplest is Electronic Code Book (or ECB) mode. In this mode, each block of plaintext is simply encrypted to produce the ciphertext. This mode can be dangerous, because many files will contain patterns greater than the block size; for example, the comments in a C program may contain long strings of asterisks intended to form a box. All these identical blocks will encrypt to identical ciphertext; an adversary may be able to use this structure to obtain some information about the text. To eliminate this weakness, there are various feedback modes in which the plaintext is combined with the previous ciphertext before encrypting; this eliminates any repetitive structure in the ciphertext. One mode is Cipher Block Chaining (CBC mode); another is Cipher FeedBack (CFB mode). CBC mode still encrypts in blocks, and thus is only slightly slower than ECB mode. CFB mode encrypts on a byte-by-byte basis, and is much slower than either of the other two modes. The chaining feedback modes require an initialization value to start off the encryption; this is a string of the same length as the ciphering algorithm's block size, and is passed to the \code{new()} function. There is also a special PGP mode, which is an oddball variant of CFB used by the PGP program. While you can use it in non-PGP programs, it's quite non-standard. The currently available block ciphers are listed in the following table, and are in the \code{Crypto.Cipher} package: \begin{tableii}{c|l}{}{Cipher}{Key Size/Block Size} \lineii{AES}{16, 24, or 32 bytes/16 bytes} \lineii{ARC2}{Variable/8 bytes} \lineii{Blowfish}{Variable/8 bytes} \lineii{CAST}{Variable/8 bytes} \lineii{DES}{8 bytes/8 bytes} \lineii{DES3 (Triple DES)}{16 bytes/8 bytes} \lineii{IDEA}{16 bytes/8 bytes} \lineii{RC5}{Variable/8 bytes} \end{tableii} In a strict formal sense, \dfn{stream ciphers} encrypt data bit-by-bit; practically, stream ciphers work on a character-by-character basis. Stream ciphers use exactly the same interface as block ciphers, with a block length that will always be 1; this is how block and stream ciphers can be distinguished. The only feedback mode available for stream ciphers is ECB mode. The currently available stream ciphers are listed in the following table: \begin{tableii}{c|l}{}{Cipher}{Key Size} \lineii{Cipher}{Key Size} \lineii{ARC4}{Variable} \lineii{XOR}{Variable} \end{tableii} ARC4 is short for `Alleged RC4'. In September of 1994, someone posted C code to both the Cypherpunks mailing list and to the Usenet newsgroup \code{sci.crypt}, claiming that it implemented the RC4 algorithm. This claim turned out to be correct. Note that there's a damaging class of weak RC4 keys; this module won't warn you about such keys. % XXX other analyses of RC4? A similar anonymous posting was made for Alleged RC2 in January, 1996. An example usage of the DES module: \begin{verbatim} >>> from Crypto.Cipher import DES >>> obj=DES.new('abcdefgh', DES.MODE_ECB) >>> plain="Guido van Rossum is a space alien." >>> len(plain) 34 >>> obj.encrypt(plain) Traceback (innermost last): File "", line 1, in ? ValueError: Strings for DES must be a multiple of 8 in length >>> ciph=obj.encrypt(plain+'XXXXXX') >>> ciph '\021,\343Nq\214DY\337T\342pA\372\255\311s\210\363,\300j\330\250\312\347\342I\3215w\03561\303dgb/\006' >>> obj.decrypt(ciph) 'Guido van Rossum is a space alien.XXXXXX' \end{verbatim} All cipher algorithms share a common interface. After importing a given module, there is exactly one function and two variables available. \begin{funcdesc}{new}{key, mode\optional{, IV}} Returns a ciphering object, using \var{key} and feedback mode \var{mode}. If \var{mode} is \constant{MODE_CBC} or \constant{MODE_CFB}, \var{IV} must be provided, and must be a string of the same length as the block size. Some algorithms support additional keyword arguments to this function; see the "Algorithm-specific Notes for Encryption Algorithms" section below for the details. \end{funcdesc} \begin{datadesc}{block_size} An integer value; the size of the blocks encrypted by this module. Strings passed to the \code{encrypt} and \code{decrypt} functions must be a multiple of this length. For stream ciphers, \code{block_size} will be 1. \end{datadesc} \begin{datadesc}{key_size} An integer value; the size of the keys required by this module. If \code{key_size} is zero, then the algorithm accepts arbitrary-length keys. You cannot pass a key of length 0 (that is, the null string \code{''} as such a variable-length key. \end{datadesc} All cipher objects have at least three attributes: \begin{memberdesc}{block_size} An integer value equal to the size of the blocks encrypted by this object. Identical to the module variable of the same name. \end{memberdesc} \begin{memberdesc}{IV} Contains the initial value which will be used to start a cipher feedback mode. After encrypting or decrypting a string, this value will reflect the modified feedback text; it will always be one block in length. It is read-only, and cannot be assigned a new value. \end{memberdesc} \begin{memberdesc}{key_size} An integer value equal to the size of the keys used by this object. If \code{key_size} is zero, then the algorithm accepts arbitrary-length keys. For algorithms that support variable length keys, this will be 0. Identical to the module variable of the same name. \end{memberdesc} All ciphering objects have the following methods: \begin{methoddesc}{decrypt}{string} Decrypts \var{string}, using the key-dependent data in the object, and with the appropriate feedback mode. The string's length must be an exact multiple of the algorithm's block size. Returns a string containing the plaintext. \end{methoddesc} \begin{methoddesc}{encrypt}{string} Encrypts a non-null \var{string}, using the key-dependent data in the object, and with the appropriate feedback mode. The string's length must be an exact multiple of the algorithm's block size; for stream ciphers, the string can be of any length. Returns a string containing the ciphertext. \end{methoddesc} \subsection{Algorithm-specific Notes for Encryption Algorithms} RC5 has a bunch of parameters; see Ronald Rivest's paper at \url{http://theory.lcs.mit.edu/~rivest/rc5rev.ps} for the implementation details. The keyword parameters are: \begin{itemize} \item \code{version}: The version of the RC5 algorithm to use; currently the only legal value is \code{0x10} for RC5 1.0. \item \code{wordsize}: The word size to use; 16 or 32 are the only legal values. (A larger word size is better, so usually 32 will be used. 16-bit RC5 is probably only of academic interest.) \item \code{rounds}: The number of rounds to apply, the larger the more secure: this can be any value from 0 to 255, so you will have to choose a value balanced between speed and security. \end{itemize} \subsection{Security Notes} Encryption algorithms can be broken in several ways. If you have some ciphertext and know (or can guess) the corresponding plaintext, you can simply try every possible key in a \dfn{known-plaintext} attack. Or, it might be possible to encrypt text of your choice using an unknown key; for example, you might mail someone a message intending it to be encrypted and forwarded to someone else. This is a \dfn{chosen-plaintext} attack, which is particularly effective if it's possible to choose plaintexts that reveal something about the key when encrypted. DES (5100 K/sec) has a 56-bit key; this is starting to become too small for safety. It has been estimated that it would only cost \$1,000,000 to build a custom DES-cracking machine that could find a key in 3 hours. A chosen-ciphertext attack using the technique of \dfn{linear cryptanalysis} can break DES in \code{pow(2, 43)} steps. However, unless you're encrypting data that you want to be safe from major governments, DES will be fine. DES3 (1830 K/sec) uses three DES encryptions for greater security and a 112-bit or 168-bit key, but is correspondingly slower. There are no publicly known attacks against IDEA (3050 K/sec), and it's been around long enough to have been examined. There are no known attacks against ARC2 (2160 K/sec), ARC4 (8830 K/sec), Blowfish (9250 K/sec), CAST (2960 K/sec), or RC5 (2060 K/sec), but they're all relatively new algorithms and there hasn't been time for much analysis to be performed; use them for serious applications only after careful research. AES, the Advanced Encryption Standard, was chosen by the US National Institute of Standards and Technology from among 6 competitors, and is probably your best choice. It runs at 7060 K/sec, so it's among the faster algorithms around. \subsection{Credits} The code for Blowfish was written by Bryan Olson, partially based on a previous implementation by Bruce Schneier, who also invented the algorithm; the Blowfish algorithm has been placed in the public domain and can be used freely. (See \url{http://www.counterpane.com} for more information about Blowfish.) The CAST implementation was written by Wim Lewis. The DES implementation was written by Eric Young, and the IDEA implementation by Colin Plumb. The RC5 implementation was written by A.M. Kuchling. The Alleged RC4 code was posted to the \code{sci.crypt} newsgroup by an unknown party, and re-implemented by A.M. Kuchling. %====================================================================== \section{Crypto.Protocol: Various Protocols} \subsection{Crypto.Protocol.AllOrNothing} This module implements all-or-nothing package transformations. An all-or-nothing package transformation is one in which some text is transformed into message blocks, such that all blocks must be obtained before the reverse transformation can be applied. Thus, if any blocks are corrupted or lost, the original message cannot be reproduced. An all-or-nothing package transformation is not encryption, although a block cipher algorithm is used. The encryption key is randomly generated and is extractable from the message blocks. \begin{classdesc}{AllOrNothing}{ciphermodule, mode=None, IV=None} Class implementing the All-or-Nothing package transform. \var{ciphermodule} is a module implementing the cipher algorithm to use. Optional arguments \var{mode} and \var{IV} are passed directly through to the \var{ciphermodule}.\code{new()} method; they are the feedback mode and initialization vector to use. All three arguments must be the same for the object used to create the digest, and to undigest'ify the message blocks. The module passed as \var{ciphermodule} must provide the \pep{272} interface. An encryption key is randomly generated automatically when needed. \end{classdesc} The methods of the \class{AllOrNothing} class are: \begin{methoddesc}{digest}{text} Perform the All-or-Nothing package transform on the string \var{text}. Output is a list of message blocks describing the transformed text, where each block is a string of bit length equal to the cipher module's block_size. \end{methoddesc} \begin{methoddesc}{undigest}{mblocks} Perform the reverse package transformation on a list of message blocks. Note that the cipher module used for both transformations must be the same. \var{mblocks} is a list of strings of bit length equal to \var{ciphermodule}'s block_size. The output is a string object. \end{methoddesc} \subsection{Crypto.Protocol.Chaffing} Winnowing and chaffing is a technique for enhancing privacy without requiring strong encryption. In short, the technique takes a set of authenticated message blocks (the wheat) and adds a number of chaff blocks which have randomly chosen data and MAC fields. This means that to an adversary, the chaff blocks look as valid as the wheat blocks, and so the authentication would have to be performed on every block. By tailoring the number of chaff blocks added to the message, the sender can make breaking the message computationally infeasible. There are many other interesting properties of the winnow/chaff technique. For example, say Alice is sending a message to Bob. She packetizes the message and performs an all-or-nothing transformation on the packets. Then she authenticates each packet with a message authentication code (MAC). The MAC is a hash of the data packet, and there is a secret key which she must share with Bob (key distribution is an exercise left to the reader). She then adds a serial number to each packet, and sends the packets to Bob. Bob receives the packets, and using the shared secret authentication key, authenticates the MACs for each packet. Those packets that have bad MACs are simply discarded. The remainder are sorted by serial number, and passed through the reverse all-or-nothing transform. The transform means that an eavesdropper (say Eve) must acquire all the packets before any of the data can be read. If even one packet is missing, the data is useless. There's one twist: by adding chaff packets, Alice and Bob can make Eve's job much harder, since Eve now has to break the shared secret key, or try every combination of wheat and chaff packet to read any of the message. The cool thing is that Bob doesn't need to add any additional code; the chaff packets are already filtered out because their MACs don't match (in all likelihood -- since the data and MACs for the chaff packets are randomly chosen it is possible, but very unlikely that a chaff MAC will match the chaff data). And Alice need not even be the party adding the chaff! She could be completely unaware that a third party, say Charles, is adding chaff packets to her messages as they are transmitted. \begin{classdesc}{Chaff}{factor=1.0, blocksper=1} Class implementing the chaff adding algorithm. \var{factor} is the number of message blocks to add chaff to, expressed as a percentage between 0.0 and 1.0; the default value is 1.0. \var{blocksper} is the number of chaff blocks to include for each block being chaffed, and defaults to 1. The default settings add one chaff block to every message block. By changing the defaults, you can adjust how computationally difficult it could be for an adversary to brute-force crack the message. The difficulty is expressed as: \begin{verbatim} pow(blocksper, int(factor * number-of-blocks)) \end{verbatim} For ease of implementation, when \var{factor} < 1.0, only the first \code{int(\var{factor}*number-of-blocks)} message blocks are chaffed. \end{classdesc} \class{Chaff} instances have the following methods: \begin{methoddesc}{chaff}{blocks} Add chaff to message blocks. \var{blocks} is a list of 3-tuples of the form (\var{serial-number}, \var{data}, \var{MAC}). Chaff is created by choosing a random number of the same byte-length as \var{data}, and another random number of the same byte-length as \var{MAC}. The message block's serial number is placed on the chaff block and all the packet's chaff blocks are randomly interspersed with the single wheat block. This method then returns a list of 3-tuples of the same form. Chaffed blocks will contain multiple instances of 3-tuples with the same serial number, but the only way to figure out which blocks are wheat and which are chaff is to perform the MAC hash and compare values. \end{methoddesc} %====================================================================== \section{Crypto.PublicKey: Public-Key Algorithms} So far, the encryption algorithms described have all been \dfn{private key} ciphers. The same key is used for both encryption and decryption so all correspondents must know it. This poses a problem: you may want encryption to communicate sensitive data over an insecure channel, but how can you tell your correspondent what the key is? You can't just e-mail it to her because the channel is insecure. One solution is to arrange the key via some other way: over the phone or by meeting in person. Another solution is to use \dfn{public-key} cryptography. In a public key system, there are two different keys: one for encryption and one for decryption. The encryption key can be made public by listing it in a directory or mailing it to your correspondent, while you keep the decryption key secret. Your correspondent then sends you data encrypted with your public key, and you use the private key to decrypt it. While the two keys are related, it's very difficult to derive the private key given only the public key; however, deriving the private key is always possible given enough time and computing power. This makes it very important to pick keys of the right size: large enough to be secure, but small enough to be applied fairly quickly. Many public-key algorithms can also be used to sign messages; simply run the message to be signed through a decryption with your private key key. Anyone receiving the message can encrypt it with your publicly available key and read the message. Some algorithms do only one thing, others can both encrypt and authenticate. The currently available public-key algorithms are listed in the following table: \begin{tableii}{c|l}{}{Algorithm}{Capabilities} \lineii{RSA}{Encryption, authentication/signatures} \lineii{ElGamal}{Encryption, authentication/signatures} \lineii{DSA}{Authentication/signatures} \lineii{qNEW}{Authentication/signatures} \end{tableii} Many of these algorithms are patented. Before using any of them in a commercial product, consult a patent attorney; you may have to arrange a license with the patent holder. An example of using the RSA module to sign a message: \begin{verbatim} >>> from Crypto.Hash import MD5 >>> from Crypto.PublicKey import RSA >>> RSAkey = RSA.generate(384, randfunc) # This will take a while... >>> hash = MD5.new(plaintext).digest() >>> signature = RSAkey.sign(hash, "") >>> signature # Print what an RSA sig looks like--you don't really care. ('\021\317\313\336\264\315' ...,) >>> RSAkey.verify(hash, signature) # This sig will check out 1 >>> RSAkey.verify(hash[:-1], signature)# This sig will fail 0 \end{verbatim} Public-key modules make the following functions available: \begin{funcdesc}{construct}{tuple} Constructs a key object from a tuple of data. This is algorithm-specific; look at the source code for the details. (To be documented later.) \end{funcdesc} \begin{funcdesc}{generate}{size, randfunc, progress_func=\code{None}} Generate a fresh public/private key pair. \var{size} is a algorithm-dependent size parameter, usually measured in bits; the larger it is, the more difficult it will be to break the key. Safe key sizes vary from algorithm to algorithm; you'll have to research the question and decide on a suitable key size for your application. An N-bit keys can encrypt messages up to N-1 bits long. \var{randfunc} is a random number generation function; it should accept a single integer \var{N} and return a string of random data \var{N} bytes long. You should always use a cryptographically secure random number generator, such as the one defined in the \module{Crypto.Util.randpool} module; \emph{don't} just use the current time and the \module{random} module. \var{progress_func} is an optional function that will be called with a short string containing the key parameter currently being generated; it's useful for interactive applications where a user is waiting for a key to be generated. \end{funcdesc} If you want to interface with some other program, you will have to know the details of the algorithm being used; this isn't a big loss. If you don't care about working with non-Python software, simply use the \module{pickle} module when you need to write a key or a signature to a file. It's portable across all the architectures that Python supports, and it's simple to use. Public-key objects always support the following methods. Some of them may raise exceptions if their functionality is not supported by the algorithm. \begin{methoddesc}{can_blind}{} Returns true if the algorithm is capable of blinding data; returns false otherwise. \end{methoddesc} \begin{methoddesc}{can_encrypt}{} Returns true if the algorithm is capable of encrypting and decrypting data; returns false otherwise. To test if a given key object can encrypt data, use \code{key.can_encrypt() and key.has_private()}. \end{methoddesc} \begin{methoddesc}{can_sign}{} Returns true if the algorithm is capable of signing data; returns false otherwise. To test if a given key object can sign data, use \code{key.can_sign() and key.has_private()}. \end{methoddesc} \begin{methoddesc}{decrypt}{tuple} Decrypts \var{tuple} with the private key, returning another string. This requires the private key to be present, and will raise an exception if it isn't present. It will also raise an exception if \var{string} is too long. \end{methoddesc} \begin{methoddesc}{encrypt}{string, K} Encrypts \var{string} with the private key, returning a tuple of strings; the length of the tuple varies from algorithm to algorithm. \var{K} should be a string of random data that is as long as possible. Encryption does not require the private key to be present inside the key object. It will raise an exception if \var{string} is too long. For ElGamal objects, the value of \var{K} expressed as a big-endian integer must be relatively prime to \code{self.p-1}; an exception is raised if it is not. \end{methoddesc} \begin{methoddesc}{has_private}{} Returns true if the key object contains the private key data, which will allow decrypting data and generating signatures. Otherwise this returns false. \end{methoddesc} \begin{methoddesc}{publickey}{} Returns a new public key object that doesn't contain the private key data. \end{methoddesc} \begin{methoddesc}{sign}{string, K} Sign \var{string}, returning a signature, which is just a tuple; in theory the signature may be made up of any Python objects at all; in practice they'll be either strings or numbers. \var{K} should be a string of random data that is as long as possible. Different algorithms will return tuples of different sizes. \code{sign()} raises an exception if \var{string} is too long. For ElGamal objects, the value of \var{K} expressed as a big-endian integer must be relatively prime to \code{self.p-1}; an exception is raised if it is not. \end{methoddesc} \begin{methoddesc}{size}{} Returns the maximum size of a string that can be encrypted or signed, measured in bits. String data is treated in big-endian format; the most significant byte comes first. (This seems to be a \emph{de facto} standard for cryptographical software.) If the size is not a multiple of 8, then some of the high order bits of the first byte must be zero. Usually it's simplest to just divide the size by 8 and round down. \end{methoddesc} \begin{methoddesc}{verify}{string, signature} Returns true if the signature is valid, and false otherwise. \var{string} is not processed in any way; \code{verify} does not run a hash function over the data, but you can easily do that yourself. \end{methoddesc} \subsection{The ElGamal and DSA algorithms} For RSA, the \var{K} parameters are unused; if you like, you can just pass empty strings. The ElGamal and DSA algorithms require a real \var{K} value for technical reasons; see Schneier's book for a detailed explanation of the respective algorithms. This presents a possible hazard that can inadvertently reveal the private key. Without going into the mathematical details, the danger is as follows. \var{K} is never derived or needed by others; theoretically, it can be thrown away once the encryption or signing operation is performed. However, revealing \var{K} for a given message would enable others to derive the secret key data; worse, reusing the same value of \var{K} for two different messages would also enable someone to derive the secret key data. An adversary could intercept and store every message, and then try deriving the secret key from each pair of messages. This places implementors on the horns of a dilemma. On the one hand, you want to store the \var{K} values to avoid reusing one; on the other hand, storing them means they could fall into the hands of an adversary. One can randomly generate \var{K} values of a suitable length such as 128 or 144 bits, and then trust that the random number generator probably won't produce a duplicate anytime soon. This is an implementation decision that depends on the desired level of security and the expected usage lifetime of a private key. I can't choose and enforce one policy for this, so I've added the \var{K} parameter to the \method{encrypt} and \method{sign} methods. You must choose \var{K} by generating a string of random data; for ElGamal, when interpreted as a big-endian number (with the most significant byte being the first byte of the string), \var{K} must be relatively prime to \code{self.p-1}; any size will do, but brute force searches would probably start with small primes, so it's probably good to choose fairly large numbers. It might be simplest to generate a prime number of a suitable length using the \module{Crypto.Util.number} module. \subsection{Security Notes for Public-key Algorithms} Any of these algorithms can be trivially broken; for example, RSA can be broken by factoring the modulus \emph{n} into its two prime factors. This is easily done by the following code: \begin{verbatim} for i in range(2, n): if (n%i)==0: print i, 'is a factor' break \end{verbatim} However, \emph{n} is usually a few hundred bits long, so this simple program wouldn't find a solution before the universe comes to an end. Smarter algorithms can factor numbers more quickly, but it's still possible to choose keys so large that they can't be broken in a reasonable amount of time. For ElGamal and DSA, discrete logarithms are used instead of factoring, but the principle is the same. Safe key sizes depend on the current state of number theory and computer technology. At the moment, one can roughly define three levels of security: low-security commercial, high-security commercial, and military-grade. For RSA, these three levels correspond roughly to 768, 1024, and 2048-bit keys. %====================================================================== \section{Crypto.Util: Odds and Ends} This chapter contains all the modules that don't fit into any of the other chapters. \subsection{Crypto.Util.number} This module contains various number-theoretic functions. \begin{funcdesc}{GCD}{x,y} Return the greatest common divisor of \var{x} and \var{y}. \end{funcdesc} \begin{funcdesc}{getPrime}{N, randfunc} Return an \var{N}-bit random prime number, using random data obtained from the function \var{randfunc}. \var{randfunc} must take a single integer argument, and return a string of random data of the corresponding length; the \method{get_bytes()} method of a \class{RandomPool} object will serve the purpose nicely, as will the \method{read()} method of an opened file such as \file{/dev/random}. \end{funcdesc} \begin{funcdesc}{getRandomNumber}{N, randfunc} Return an \var{N}-bit random number, using random data obtained from the function \var{randfunc}. As usual, \var{randfunc} must take a single integer argument and return a string of random data of the corresponding length. \end{funcdesc} \begin{funcdesc}{inverse}{u, v} Return the inverse of \var{u} modulo \var{v}. \end{funcdesc} \begin{funcdesc}{isPrime}{N} Returns true if the number \var{N} is prime, as determined by a Rabin-Miller test. \end{funcdesc} \subsection{Crypto.Util.randpool} For cryptographic purposes, ordinary random number generators are frequently insufficient, because if some of their output is known, it is frequently possible to derive the generator's future (or past) output. Given the generator's state at some point in time, someone could try to derive any keys generated using it. The solution is to use strong encryption or hashing algorithms to generate successive data; this makes breaking the generator as difficult as breaking the algorithms used. Understanding the concept of \dfn{entropy} is important for using the random number generator properly. In the sense we'll be using it, entropy measures the amount of randomness; the usual unit is in bits. So, a single random bit has an entropy of 1 bit; a random byte has an entropy of 8 bits. Now consider a one-byte field in a database containing a person's sex, represented as a single character \samp{M} or \samp{F}. What's the entropy of this field? Since there are only two possible values, it's not 8 bits, but one; if you were trying to guess the value, you wouldn't have to bother trying \samp{Q} or \samp{@}. Now imagine running that single byte field through a hash function that produces 128 bits of output. Is the entropy of the resulting hash value 128 bits? No, it's still just 1 bit. The entropy is a measure of how many possible states of the data exist. For English text, the entropy of a five-character string is not 40 bits; it's somewhat less, because not all combinations would be seen. \samp{Guido} is a possible string, as is \samp{In th}; \samp{zJwvb} is not. The relevance to random number generation? We want enough bits of entropy to avoid making an attack on our generator possible. An example: One computer system had a mechanism which generated nonsense passwords for its users. This is a good idea, since it would prevent people from choosing their own name or some other easily guessed string. Unfortunately, the random number generator used only had 65536 states, which meant only 65536 different passwords would ever be generated, and it was easy to compute all the possible passwords and try them. The entropy of the random passwords was far too low. By the same token, if you generate an RSA key with only 32 bits of entropy available, there are only about 4.2 billion keys you could have generated, and an adversary could compute them all to find your private key. See \rfc{1750}, "Randomness Recommendations for Security", for an interesting discussion of the issues related to random number generation. The \module{randpool} module implements a strong random number generator in the \class{RandomPool} class. The internal state consists of a string of random data, which is returned as callers request it. The class keeps track of the number of bits of entropy left, and provides a function to add new random data; this data can be obtained in various ways, such as by using the variance in a user's keystroke timings. \begin{classdesc}{RandomPool}{\optional{numbytes, cipher, hash} } An object of the \code{RandomPool} class can be created without parameters if desired. \var{numbytes} sets the number of bytes of random data in the pool, and defaults to 160 (1280 bits). \var{hash} can be a string containing the module name of the hash function to use in stirring the random data, or a module object supporting the hashing interface. The default action is to use SHA. The \var{cipher} argument is vestigial; it was removed from version 1.1 so RandomPool would work even in the limited exportable subset of the code. I recommend passing \var{hash} using a keyword argument so that someday I can safely delete the \var{cipher} argument \end{classdesc} \class{RandomPool} objects define the following variables and methods: \begin{methoddesc}{add_event}{time\optional{, string}} Adds an event to the random pool. \var{time} should be set to the current system time, measured at the highest resolution available. \var{string} can be a string of data that will be XORed into the pool, and can be used to increase the entropy of the pool. For example, if you're encrypting a document, you might use the hash value of the document; an adversary presumably won't have the plaintext of the document, and thus won't be able to use this information to break the generator. \end{methoddesc} The return value is the value of \member{self.entropy} after the data has been added. The function works in the following manner: the time between successive calls to the \method{add_event()} method is determined, and the entropy of the data is guessed; the larger the time between calls, the better. The system time is then read and added to the pool, along with the \var{string} parameter, if present. The hope is that the low-order bits of the time are effectively random. In an application, it is recommended that \method{add_event()} be called as frequently as possible, with whatever random data can be found. \begin{memberdesc}{bits} A constant integer value containing the number of bits of data in the pool, equal to the \member{bytes} attribute multiplied by 8. \end{memberdesc} \begin{memberdesc}{bytes} A constant integer value containing the number of bytes of data in the pool. \end{memberdesc} \begin{memberdesc}{entropy} An integer value containing the number of bits of entropy currently in the pool. The value is incremented by the \method{add_event()} method, and decreased by the \method{get_bytes()} method. \end{memberdesc} \begin{methoddesc}{get_bytes}{num} Returns a string containing \var{num} bytes of random data, and decrements the amount of entropy available. It is not an error to reduce the entropy to zero, or to call this function when the entropy is zero. This simply means that, in theory, enough random information has been extracted to derive the state of the generator. It is the caller's responsibility to monitor the amount of entropy remaining and decide whether it is sufficent for secure operation. \end{methoddesc} \begin{methoddesc}{stir}{} Scrambles the random pool using the previously chosen encryption and hash function. An adversary may attempt to learn or alter the state of the pool in order to affect its future output; this function destroys the existing state of the pool in a non-reversible way. It is recommended that \method{stir()} be called before and after using the \class{RandomPool} object. Even better, several calls to \method{stir()} can be interleaved with calls to \method{add_event()}. \end{methoddesc} The \class{PersistentRandomPool} class is a subclass of \class{RandomPool} that adds the capability to save and load the pool from a disk file. \begin{classdesc}{PersistentRandomPool}{filename, \optional{numbytes, cipher, hash}} The path given in \var{filename} will be automatically opened, and an existing random pool read; if no such file exists, the pool will be initialized as usual. If omitted, the filename defaults to the empty string, which will prevent it from being saved to a file. These arguments are identical to those for the \class{RandomPool} constructor. \end{classdesc} \begin{methoddesc}{save}{} Opens the file named by the \member{filename} attribute, and saves the random data into the file using the \module{pickle} module. \end{methoddesc} The \class{KeyboardRandomPool} class is a subclass of \class{PersistentRandomPool} that provides a method to obtain random data from the keyboard: \begin{methoddesc}{randomize}{} (Unix systems only) Obtain random data from the keyboard. This works by prompting the user to hit keys at random, and then using the keystroke timings (and also the actual keys pressed) to add entropy to the pool. This works similarly to PGP's random pool mechanism. \end{methoddesc} \subsection{Crypto.Util.RFC1751} The keys for private-key algorithms should be arbitrary binary data. Many systems err by asking the user to enter a password, and then using the password as the key. This limits the space of possible keys, as each key byte is constrained within the range of possible ASCII characters, 32-127, instead of the whole 0-255 range possible with ASCII. Unfortunately, it's difficult for humans to remember 16 or 32 hex digits. One solution is to request a lengthy passphrase from the user, and then run it through a hash function such as SHA or MD5. Another solution is discussed in RFC 1751, "A Convention for Human-Readable 128-bit Keys", by Daniel L. McDonald. Binary keys are transformed into a list of short English words that should be easier to remember. For example, the hex key EB33F77EE73D4053 is transformed to "TIDE ITCH SLOW REIN RULE MOT". \begin{funcdesc}{key_to_english}{key} Accepts a string of arbitrary data \var{key}, and returns a string containing uppercase English words separated by spaces. \var{key}'s length must be a multiple of 8. \end{funcdesc} \begin{funcdesc}{english_to_key}{string} Accepts \var{string} containing English words, and returns a string of binary data representing the key. Words must be separated by whitespace, and can be any mixture of uppercase and lowercase characters. 6 words are required for 8 bytes of key data, so the number of words in \var{string} must be a multiple of 6. \end{funcdesc} %====================================================================== \section{Extending the Toolkit} Preserving the a common interface for cryptographic routines is a good idea. This chapter explains how to write new modules for the Toolkit. The basic process is as follows: \begin{enumerate} \item Add a new \file{.c} file containing an implementation of the new algorithm. This file must define 3 or 4 standard functions, a few constants, and a C \code{struct} encapsulating the state variables required by the algorithm. \item Add the new algorithm to \file{setup.py}. \item Send a copy of the code to me, if you like; code for new algorithms will be gratefully accepted. \end{enumerate} \subsection{Adding Hash Algorithms} The required constant definitions are as follows: \begin{verbatim} #define MODULE_NAME MD2 /* Name of algorithm */ #define DIGEST_SIZE 16 /* Size of resulting digest in bytes */ \end{verbatim} The C structure must be named \ctype{hash_state}: \begin{verbatim} typedef struct { ... whatever state variables you need ... } hash_state; \end{verbatim} There are four functions that need to be written: to initialize the algorithm's state, to hash a string into the algorithm's state, to get a digest from the current state, and to copy a state. \begin{itemize} \item \code{void hash_init(hash_state *self);} \item \code{void hash_update(hash_state *self, unsigned char *buffer, int length);} \item \code{PyObject *hash_digest(hash_state *self);} \item \code{void hash_copy(hash_state *source, hash_state *dest);} \end{itemize} Put \code{\#include "hash_template.c"} at the end of the file to include the actual implementation of the module. \subsection{Adding Block Encryption Algorithms} The required constant definitions are as follows: \begin{verbatim} #define MODULE_NAME AES /* Name of algorithm */ #define BLOCK_SIZE 16 /* Size of encryption block */ #define KEY_SIZE 0 /* Size of key in bytes (0 if not fixed size) */ \end{verbatim} The C structure must be named \ctype{block_state}: \begin{verbatim} typedef struct { ... whatever state variables you need ... } block_state; \end{verbatim} There are three functions that need to be written: to initialize the algorithm's state, and to encrypt and decrypt a single block. \begin{itemize} \item \code{void block_init(block_state *self, unsigned char *key, int keylen);} \item \code{void block_encrypt(block_state *self, unsigned char *in, unsigned char *out);} \item \code{void block_decrypt(block_state *self, unsigned char *in, unsigned char *out);} \end{itemize} Put \code{\#include "block_template.c"} at the end of the file to include the actual implementation of the module. \subsection{Adding Stream Encryption Algorithms} The required constant definitions are as follows: \begin{verbatim} #define MODULE_NAME ARC4 /* Name of algorithm */ #define BLOCK_SIZE 1 /* Will always be 1 for a stream cipher */ #define KEY_SIZE 0 /* Size of key in bytes (0 if not fixed size) */ \end{verbatim} The C structure must be named \ctype{stream_state}: \begin{verbatim} typedef struct { ... whatever state variables you need ... } stream_state; \end{verbatim} There are three functions that need to be written: to initialize the algorithm's state, and to encrypt and decrypt a single block. \begin{itemize} \item \code{void stream_init(stream_state *self, unsigned char *key, int keylen);} \item \code{void stream_encrypt(stream_state *self, unsigned char *block, int length);} \item \code{void stream_decrypt(stream_state *self, unsigned char *block, int length);} \end{itemize} Put \code{\#include "stream_template.c"} at the end of the file to include the actual implementation of the module. \end{document} python-keyczar-0.6~b.061709.orig/setup.cfg0000644000000000000000000000007311207625732016736 0ustar rootroot[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 python-keyczar-0.6~b.061709.orig/setup.py0000644000000000000000000000057411216306477016637 0ustar rootrootfrom distutils.core import setup import sys setup(name='python-keyczar', description='Toolkit for safe and simple cryptography', author='Arkajit Dey', author_email='arkajit.dey@gmail.com', url='http://www.keyczar.org/', version='0.6b', packages=['keyczar'], package_dir={'keyczar': 'src/keyczar'}, requires=['pycrypto (>2.0)'], ) python-keyczar-0.6~b.061709.orig/MANIFEST.in0000644000000000000000000000017411207625732016655 0ustar rootrootinclude README recursive-include doc * recursive-include jtestdata * recursive-include testdata * recursive-include tests * python-keyczar-0.6~b.061709.orig/jtestdata/0000755000000000000000000000000011567545050017103 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign/0000755000000000000000000000000011567545050020626 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign/20000644000000000000000000000327311111062316020677 0ustar rootroot{"publicKey":{"modulus":"AIXhlPK9JAd4gsXQFeG6JEnv2Mk4lYV2JxjHeX7vT0RPu_FImvt79WDQYc-gfYDM_OhmkqdU_t25ciBhXhwcfbrQ3K7kluewCbSi-hZMf1hzHQbw0uoOXYLJ7Wrf6uVMmy-GNjcyE5Z1KlpENDrozUXq-7QVl08T1u0Y0spkxBsF0DU6kyawk_Ce-hl2_P7f6aYaUdMDS0XDzCIc3c4mqRaEkBXvA5n5VFAybasVb7s6wtezLQm1lf4QPQXk7eoL2opjPsAoqf-PRMXVxLhh7sR0qG0pkChG2yAhOw53n6sD3w9Zs13wkzTu6b94jjIzDPkkiDPTGr_OhmSyqvXuuxU","publicExponent":"AQAB","size":2048},"privateExponent":"Mk4FuoOpMwlsEcnTPwLDOejeSxVw0ToJDL1_AFwJK8DN_KZsXYxBMgR6jBpgrfHYIbbQ6gD81vEkWdhcFTH7aCOsmCaaMSorK22FjLVnsCNox7_bcEi_iDI5fEvwpgH32Y6Tdn_hbkpOBKbV_UCWSOw3cX4fYX4x5trJ8XSVXxVv7IfMMYnQf7OnQ6Vn1qtiTB2RH6PN9YqkMSt8e9pv6Kc3Q7iHiZoA5kyeSfBeg4DPkRt1YxssZe4W055R4Xv_5GJ8Wlrr-TPUaiGsQGSA5im4b8LjZ0kyltOKYCx2s52_upUy0axRbfRrQPcr_GXZfXR8TfzBsjxm-nPxmMMwbQ","primeP":"AL6KexVs6QQVt-2H8MJQKzohpU2CfDOpL8XwksaIzBUsXdAICKeRZit4-HTtRTNRC2YCly-YhYcMEHqjAPmAk5rk9bN1OKKb1o2mAX6x768QdbjMhxI80vw0rHfsedwpKRMf5MB20NzHCK47mKx2hUIPqml9TFXmbfrWv13yMDJ_","primeQ":"ALPgCl2T9YL4GmfHgOQdW50R390j-LFdLXNCX7CA5w-C0yhGNNX0qTbp5w7TuKHsDDaWLrU8iW_63JpQH88yUgzOWlB5YkGLCoEQ266OQEBx1w0NqfmpKW_pYs5s_T7FZHTAZ9MyUPeuiFA68U5NaS47TcCqmgaH3zepKEnWJmBr","primeExponentP":"PqgtJ3OEAJrfu9V7H3rbbCdKQ33IN_jHw_CDY5PygHfxdYpexjOzBFKoaVLo8aIR_H6XlsgyCKG3_YwCswlMAKCQB25hrF9Qo43WagI7Tjc8bwOa2y1zOApeOKVjwTkrz6UqRPwNXLx6p0jjwLrMwVeDc2MHqiu3OMhLb6pHnSM","primeExponentQ":"dNKZaNVjqsAARk6oQ39dtNGbF0D5kBf4INeG1lehuc053vpZ7muMSwH28wZG78Mi24EGrOa4TGYdSIupXSRNbcvHlGSBkBgBpnmQc_oneLN2_B9XubJIG0r0xSS8BTymVb1wsRYIyBQurAzcFALqwP_7K5qhloRAUSIn7GyNWCk","crtCoefficient":"X0zxQaY1jOxm_QkiJZ0UIFjvjabfR9K1n-QHhn9zNz9t2-frtP0kuyZCJ3SxkzmT23CjwkvUsYKyCmyv4iDXZdGKN626AYCXfISanOOhNb2dmPF7PPFDGUW7-B4InSyBmsr9Ggk-GJ4Grq0rmtOEnODUzODQH7UYP2N0-WeiZHo","size":2048}python-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign/1.out0000644000000000000000000000053411111062316021501 0ustar rootrootAP4Kc4EMnXEqZyeVXl29QuV0Dy53J9-a9FbpBhK2dQ6OWBkLAhVZZXqxLHFfKEcOEqmhqX1tVE1D-XkW9mqAKbYaWEVPDjPOvAIMc9I1b2FtTHjdZv7v-NJeJ8pvhXaGsVu5vIHxDM6q7wGSBrPx5YSgdoYhFyL3CEt1rcmT2fDJov1fiRoMI6RJ-xDW-Avhc9q74VPQCo1YrZVv7By9o5gu4mqBcLW2V5TSIaZWE_Y0VkMbkf-UvMBnjzIPUtuCSiSNkLWRf9mSJnYdyXmIMbVoWZMLPY7yuT8gFAh5D7-suaMA-YOG5bphAkaxr60iPKGLKIfWzUGv7tqHnGWUGu9VZFoipython-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign/2.out0000644000000000000000000000053411111062316021502 0ustar rootrootADbghgE_pbkQA92uco5MkIjnzgVMYBkR8ZivTfdmey3D4Nem8-T9AIXc4SLZMvgXIVC6Hb1kancGm5ciD01QpbKqQudP7bxASyZlmHF85ye01KzcF_n3sFC81eX6yuLk0FAf7fNdcfpVBKig2zG1ne6dPhJfAtlGgQXKrxifxfMSacrxnVPMj6pRY4573VU8ZEMZW4lREtCrYuQwKKuU26_n4X-4-xtsGl3tZn_lRqEITJmqNcp_oV3SrPc1ZxVxeLbGiHGXQBRYqM2hFNwBbzAmwz7bumVzkyueqUK0MTsDBGRDar85yNjHcFOHsSoE-FpFgJkJVarg5JePeoW09Q6tG1_9python-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign/10000644000000000000000000000327311111062316020676 0ustar rootroot{"publicKey":{"modulus":"ALCQk9Ne64cFuOI8vngAbebkkf8tFpj1zwRYwVz5Hm0blP4eKIXfcm58ztHcqeVlA-jtFcoI1FSjPo2vaBbv29zK7Jwe_Bmc0rwl0MhWF7tntYXhGl1AL5_15ZdcfBPQLbEtAyPtPTqpKtBx7XsUwYNes9apDwlwdZYGIGHiubk6xCBSGSJpBEN85brYpzxGB21SZWvOo4JUtqK7GXLrWRAR4QQZWr3BVrYu2e6vi0ne_EwmH7jwK52i1lbfwAl31GCmkslNtiky8Woq-YLKZh-8N0Efg0UZPAnKjyE1d59HN3c1rzI7zn6v8hq3i2nccTrgJOzNOu6jme-cVvG_Rzk","publicExponent":"AQAB","size":2048},"privateExponent":"V3LT9G1fw9ker9acE31K8X-lm7fuKEYeiS2YX373Bd0SVyYCtgNsfrKMEL702qvEWvoJv63N1DmiArSsniegQmOy-sQR4nGcohkspfyV9niwHCXYU_U1YUl9tBDXV0zVRJphosqed85PaTvz_fDSw0kFUz0aOHedlXdlVHXhvI47onFTAVKKUd0ORPGSqXgVJ6A9qxoJLC7EjnMUa8o02RBn8Q7zcF19leFuKvphZG7MdWUtjzabTAL8RwUDUVn7G5-fT0-wR5j4Xu2n19KtYFttvKlEDQqtU7idh8XZelUIW3_4_tdoPVBWpy4j9bgzkEdiQGX08nPP-TbNUiwy_Q","primeP":"AP3_SHDRqtOLqk5Z0Ytd5GMcVowiN_nWKLuBtgK7GIav6btSuB-b0oeVOohc1NqBH6a20BEoNf8SD5SUHOaHEAvdE_jtDID5RSfYQM6CBpk2cFLtQzNDLiKIe4Zy8VD4S6sR3lLwmgc8cqTzqcuvd3zSOREauaugp00ovykjMr-f","primeQ":"ALH0_WfXzyhk67XAWYmlTl6LIW1qfrFCC-g48ZHbWVPOEPe5ewBZZNYnK0otMJVlAChJmfSRLvFplqVdMxfMCvN-HfhwtZb1YfQQtDEoqxbbvY6IkYwYW9DfK7z4uSKOu_2VhQF0zoMWOeT-km_DovF8o230GUZpMniy10qF7Con","primeExponentP":"a7scaaW0c_eYK5VTGG6hkRwS5WsaHOCl9CnnHi9nDrGMTISgTd_Uouc7pVzidy8vUpHVnIFWrbJmY1mTDIAa4T1K3FkG5alUmLrTegOScuexKqsxxotnBQSoh_U2v2YhChURHFKqsgkEg0xKJ3dsEchEpimUuOPyMfrnYbZpLvc","primeExponentQ":"enlRrZYpTHOohX3MIZ9TQF4gs10HtJbv-vK1ztxXrgW0R8mvjZ34eCqc8IAJX8gTQ6bj_h2tYRh6RXTPJSGYp9u0ZLetQie_MmoMmYiTtzekTeRPx0s8ZZQyVewX_mCdoPi2gToSpsU1MxTBU4ohKnHNSG8mtf7QbaEn6nIhByE","crtCoefficient":"XpYnBtzjQUfSBCEj9Kg7pOwx9iz_38gZH3qIkpcRCYNHN0wwhlG1CTP2eNcD9JvdK93IPgeqWnMIq5hnU0Gv6TOVkcrS9vbHxUwqK7ch0RXvJ4bf2ddVlESp-V3vcrgEJPKVywhfoq019qymvPlwoY2DNxn6d7nk8It_Qhs5Jgg","size":2048}python-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign/meta0000644000000000000000000000031711043404044021462 0ustar rootroot{"name":"test","purpose":"SIGN_AND_VERIFY","type":"RSA_PRIV","versions":[{"exportable":false,"status":"ACTIVE","versionNumber":1},{"exportable":false,"status":"PRIMARY","versionNumber":2}],"encrypted":false}python-keyczar-0.6~b.061709.orig/jtestdata/aes-crypted/0000755000000000000000000000000011567545050021323 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/aes-crypted/20000644000000000000000000000041411111062316021366 0ustar rootrootAMqJf9z0otfxgvsf89PBd_NPOIGq1luSL7ifAvYz7bnEDjkYl4JCM3qlMDMnTl6BKpWO1MteeQ7FWIcWoE0ogIeYTcef45BIycQet508kIQ_I6obFyfOrIkca7f1GRTV_bqgPPYo1nMi5OwzKWOEzQzyJQhji-DkDsr8RObaRKoIet72Huo6roFeDkJZGfp2Btqg6lssBsFXBXtrSqQZ99ojItMgpjmvIT3RK4hTOXo-tl1_9itJdXdjxqUWpAbKA8UAmtGE-Jhapython-keyczar-0.6~b.061709.orig/jtestdata/aes-crypted/1.out0000644000000000000000000000014211111062316022171 0ustar rootrootAIHUAkQPmFn4fjqVjiEEq9RRdjN7P4fmmCgLkHpWAv-KecNATlyhkl754nqe0sryyh0xXXwQNxNzDSBmJXneYD1rphiZsv_Z3Qpython-keyczar-0.6~b.061709.orig/jtestdata/aes-crypted/2.out0000644000000000000000000000014211111062316022172 0ustar rootrootAA5kxJr4jVeSZ2rCg6ulK7ZYxAWQ4FUhZ8R5N5wJCcrsMu_K5x8QKetecqBnB44z82-vxAYF5AnPXkesjdPyKmTeXPBVkrzwigpython-keyczar-0.6~b.061709.orig/jtestdata/aes-crypted/10000644000000000000000000000041411111062316021365 0ustar rootrootAMqJf9wnz5d-VGaXDGjxIGpz94Fn5nLxPjd3MgbjfaJHToHHuw_AQEOSP2XaxE0SelDS1S-ufcalAj1KNGm1qhkD2nAwwwurGMQD8lmdtQ72lZiPgszOn56t0DVm_-l9lsUOvGhVzJ3SMVRhuHTmqieFag0hcXu5rKMIE0V2R3WZIHoeFVFQIaPHrKY61vbs0il56Ac2oz62Kozf0nD3ZQvAkWx0I2akOknGfbKSNFXoCzonVHrK315v2HyxHcem4qganxnbhcaUpython-keyczar-0.6~b.061709.orig/jtestdata/aes-crypted/meta0000644000000000000000000000031511043404044022155 0ustar rootroot{"name":"test","purpose":"DECRYPT_AND_ENCRYPT","type":"AES","versions":[{"exportable":false,"status":"ACTIVE","versionNumber":1},{"exportable":false,"status":"PRIMARY","versionNumber":2}],"encrypted":true}python-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign.public/0000755000000000000000000000000011567545050022103 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign.public/20000644000000000000000000000061111111062316022145 0ustar rootroot{"modulus":"AIXhlPK9JAd4gsXQFeG6JEnv2Mk4lYV2JxjHeX7vT0RPu_FImvt79WDQYc-gfYDM_OhmkqdU_t25ciBhXhwcfbrQ3K7kluewCbSi-hZMf1hzHQbw0uoOXYLJ7Wrf6uVMmy-GNjcyE5Z1KlpENDrozUXq-7QVl08T1u0Y0spkxBsF0DU6kyawk_Ce-hl2_P7f6aYaUdMDS0XDzCIc3c4mqRaEkBXvA5n5VFAybasVb7s6wtezLQm1lf4QPQXk7eoL2opjPsAoqf-PRMXVxLhh7sR0qG0pkChG2yAhOw53n6sD3w9Zs13wkzTu6b94jjIzDPkkiDPTGr_OhmSyqvXuuxU","publicExponent":"AQAB","size":2048}python-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign.public/10000644000000000000000000000061111111062316022144 0ustar rootroot{"modulus":"ALCQk9Ne64cFuOI8vngAbebkkf8tFpj1zwRYwVz5Hm0blP4eKIXfcm58ztHcqeVlA-jtFcoI1FSjPo2vaBbv29zK7Jwe_Bmc0rwl0MhWF7tntYXhGl1AL5_15ZdcfBPQLbEtAyPtPTqpKtBx7XsUwYNes9apDwlwdZYGIGHiubk6xCBSGSJpBEN85brYpzxGB21SZWvOo4JUtqK7GXLrWRAR4QQZWr3BVrYu2e6vi0ne_EwmH7jwK52i1lbfwAl31GCmkslNtiky8Woq-YLKZh-8N0Efg0UZPAnKjyE1d59HN3c1rzI7zn6v8hq3i2nccTrgJOzNOu6jme-cVvG_Rzk","publicExponent":"AQAB","size":2048}python-keyczar-0.6~b.061709.orig/jtestdata/rsa-sign.public/meta0000644000000000000000000000030511043404044022734 0ustar rootroot{"name":"test","purpose":"VERIFY","type":"RSA_PUB","versions":[{"exportable":false,"status":"ACTIVE","versionNumber":1},{"exportable":false,"status":"PRIMARY","versionNumber":2}],"encrypted":false}python-keyczar-0.6~b.061709.orig/jtestdata/rsa/0000755000000000000000000000000011567545050017670 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/rsa/20000644000000000000000000000327411111062316017742 0ustar rootroot{"publicKey":{"modulus":"AKbxdQ-_zbTlUgOA34WKNMvM_Z8gAAbXqiAwEgJqPxMXGBBC_dP9Du5OeqpnTqC63751NqgPNcT91Dz8tZ8ysEjm_AbPY-7JixJvjrZ5MXtBJvLoF1gat1tm9GuPVYSYoSKUkcEMino09uk-x1Oh9RBjWRsLelVJgYbHbZJ_OlpczBSgZTMU1B55eLgLFm5FOwsTF4D-eJVBZCFX1mogKTA1-C89DDnUtyPcsV2Qep5u1tqPlvdYocGoxktH08RjRSbzAeLcUZiYv4Qvu_vLJ_NGBRXdEk-M2SGq37f4AVnNCVpdx2Xb30FxEmyjj8G0w59JGE4AyQ7v7X_8ylha_-s","publicExponent":"AQAB","size":2048},"privateExponent":"bbcchwg4Kh3YI6NLw1jMT_Bd8nk2a0jLbzIIc_vdji9MSkusw-h5Kpb7OQiB_VIzf9lK3XJ5lQh4tsgimQjYIGFl2xfrhmCAfNJCSZwmr-lmrpdn2ChevrxQAGyH-IfSxoY7sFMMozox16LBny4-f9G7GvIVKP4RGUHxuijRcdadBcffD3lev1U3W22oRubLhG28OoX4hsrYCKH6aEnWDLUvyjsqfF5xUh43XDUKlNn7-jmcje31Ju0dQkEJRMgepekBSnmdbhSJv9UgqIpTTOt60OabWSPQxnX3PAOhP8FDEiGXdDIp08FbacxLPPWIDBzyaYYDSSp_-b8c0QlUgQ","primeP":"APZF0TrJ3TD3RDuNwcL3tXuaau0A8Obr9ZNjNcq8XB9Kev1zflRoTFBPUo0JJoWp-dC4G72u_pnQw_dtzr64f6JA-Fcl14HAaxOs2p2dcpcerEotvIGP6IhM5GMmarm4GIwkeOuetMgpJb1py_3p1Gsr7tQkVwBUYyqlyhpmc-Wr","primeQ":"AK2JgCzYijAMuqcJOMA5HYmhcm_uw7-Nx9rfs-o__ZhetmTWXfHfhMoubbXhwg4lFDbjqPmBieagnGm7N8OZ8lgoDptV33HPtv0tmYcDzNS2My30yOOImjrWgakg31xChqQApw19-fi9tKQe2C6C1euWn1Wm9ZQ3HNpRBf5Swo7B","primeExponentP":"F9MBPrKwl0AUdb5s9DOKdv6lQXBJ3c0N4MhEN-yo7M4Dv-kgW4ILf-lsjwBHnb6n0C0_YcZAExlDG_ife4vVrRij7apXgtHeifS64WyN3Vi2SibKia4mTKlDnuPkhzrsBQKyP_kGfCae5AgMF_A7AHMrk5JAaGPBhCqttogaxik","primeExponentQ":"bHTWHbEL1HHwKbrys_g-RKkZO2mO_2Xd9SYAbLOni5YOCkGLn0Ih3LZdrOG2hV6ZHqD0F1PlWrUgbFgsxtutAXmvf1eQ-bFm3R6lqCMw3fQtUlh9QO877O_pQ0mfLysIuPELdrw4AUSW5Ee-tnrgtYeCd2aMbyBusOcYhtU0cUE","crtCoefficient":"AN3ieZrFXOGUzuwwnRYhZQ4P6_c5n6HpSQ4XV9lWPvG_L-qlzfHcZKBmg5fcFcu-0lKuGITG3m30Evd-tDGG3tD0sbt-9jqqTyK-A2iQmfZur_DubU-xncjoNGVeuxIwMa_KP0vj53E3gB9MGBbgEBm34P9MUR39O3D_AfpSdMCM","size":2048}python-keyczar-0.6~b.061709.orig/jtestdata/rsa/1.out0000644000000000000000000000053411111062316020543 0ustar rootrootAKlPbZhAcJwPGCzr_tw8p9POChkq7WqYOiQuWNVzOTEhMTC26E0HwEVaJO-MWowP1DhoXzGGJJ8AAHMO9UscyNr475Cjc2ywy-QJeCVwirN2zu3Hspf2v5vl2iAP6oy1xLbX4eOq7sPDOHj1qsx_wUMDumC-GRkBqtQ5rSTB2faiSq4jHSAPOA17SHSussEQhGtab_wUx8l5OUJCnOHIranr8edc4lwAuKGjSNXYY6fxiGr2VEP4nOyp51R2wtx36nDm-dPN7-zUbXmcxmWnblcUFXYJDR7Yjg7iyHZhbi0ig8dR_PdM_LitYNQYxGe7D72dS39hyDjJwgCRB_eX4uUjue60python-keyczar-0.6~b.061709.orig/jtestdata/rsa/2.out0000644000000000000000000000053411111062316020544 0ustar rootrootAPwFIByTqvYgpAn_DNWZW7fpCetYdI_pddEEEYDMjlRE1fw_5TTo3I0bbf6WADE3wAe5g0hShzMNkjFl7zOpIQzIjbs_JdSpFyJp2u70PifXagDBdHysGi5TFDrfUkizqfFFpVIwTZ82WpS-U8xO4K__80SKmdzjce60jWlfvAmoMDj2-bh6yXO8Li7wr98wj-3GXwcezha0LT_yy6N_vmWEt049ceTWuNm0zUOJoiEWfNYmQuRE-2lAJl2lmcFhheOzr1iHyex9h7V6-OWfTtalIEYEoCaSeDWHUT6mRE5KFMb7kL-HTgpYbddIfITfkAwIBvnypLArsECUkKIeOwNTwGPopython-keyczar-0.6~b.061709.orig/jtestdata/rsa/10000644000000000000000000000327311111062316017740 0ustar rootroot{"publicKey":{"modulus":"AK7YwXqDeRH4XcEWubMRFWDlXnZNA8Dr3KBMIdSG4wMTojNigSlgb-VhQ2_h_gBjZMRXeXB31DA_cEOoSpoOBf8ddQG1e5npQ7rp8-XqJo12iLgSxZSHaK4xLxh9rQjTPrCw8vrclzjJ5nvPCMVRLKlK4F1IxnCQ8lKno2uSOQxjzsMAnBoi0HgV0Zr4_-Hr713J2rNYGc5D9wVIJ0TXXkQ11xJ29xrzhk2ZjlBvG-R5yxZjq7baXKxV0yFQbso2kySZk07v8F8o7ByUqhDfI81U1n4s_vrQf5lroYEGZqWq4cVOBROcdHUhvqNmMl0sJ-ZpEad6H_FJPa6hRtAeRCc","publicExponent":"AQAB","size":2048},"privateExponent":"Vh69bbLEN222AB1JakHH3eocFPjqGGQUT4AwSZYGysUo51ZleBPgCYNWzAzsJxTN1UegsRzUjs8wZKLH3Al8OqQvtZ_GOZEDo1UIpP4n7xWrUb8tQnNPxDzFjbKZP_eMsUr240kz0uzfcawQDeBltx0CVfA6jcdXFA8uFxX2s3rB4BDgLsogUtJ0qAvzpQ2iqt0qyIjTlSAI5-p3o_OdUkEfpbn6K-mH3RpOk3Bin3MpZnMRuBf7Pdy_GUMJ96FDgm4LpTqwL37SPBIcN-ht-VnKNuXF2ZWoX-o7oMhkOAMoB1Y_dMHkVhJjTSNtjED92euhzVY9J8Soj8lb_WHpQQ","primeP":"AP0Pn83rJeRJSu2oT1gL4RShvfCP93qPRlIDktWld6x4x_rzZPv0XBG5B6PVVOMiKF7o1J5WFHy8cHC2rxbS3WRXu8Iudo9AkYFesfVMLrAucbpkDhvw96hYGc_9jcqAUrGLpIfapdQkvIZm7f05TImg-_qGaK8zH4_TC0T3Kuwz","primeQ":"ALDgl67oa0KebvaEdETq59XIKnNCwQaM75NOUqpk-o2l4dJsZYnrHUtJ4M_qVFpCXgqWRVP3kWEgv6iqcFatF56PkQAdD7Nj4ZH9vXYyGEOkaKIHV1CtIFPhTo37_AcslQgbutG1DQN6iGuxmU3zGJM1bR_QPTKVKb1uEJ290BQ9","primeExponentP":"LSWYcPg-rleVEokwfpi_8xpX9I76q9bbyM3yaEM48oApzU-W-IxD0LWd81Cf8FWrtiL7q7PXu9kyhilRW1ULQleUm7QGWtA-JUJrpUOOIMhoacRn7_wxcssk78JghXwXRK2RENulMg_Lwn6ifsa2LOeXjL5l9ru8KcCRBiDCe5k","primeExponentQ":"VuNdX_yohCdUFyFmBFzo2inkQI6wR8l__vrgvPex5VdxoW7CSogG8e8u0rQoD9a-X7EGCYN6FR6DSBXB7bJGAgxAjK-6AMO2EYN2SNO--6uOAtpcWDNTyCDL-A-q9NM_uqX0lgO8itLspQqvZo1eqyH5o0Embuy7fmTNINAXoXk","crtCoefficient":"Kf8QbMXaadzFdAcsC41qBnWHjDUPrd5qz6-H6iwAMEJ1JC0_cBAUFVhIjjV6eUsGijqdk5x5JimamOaNf1E0efM5-nNVLRSLwHYDOJ--3hlwsg8msB2It2YsUGRaXehr2UZbcK3rNOiG_BavDH08boUJa0Gl055RxIfQ5INjgDY","size":2048}python-keyczar-0.6~b.061709.orig/jtestdata/rsa/meta0000644000000000000000000000032311043404044020521 0ustar rootroot{"name":"test","purpose":"DECRYPT_AND_ENCRYPT","type":"RSA_PRIV","versions":[{"exportable":false,"status":"ACTIVE","versionNumber":1},{"exportable":false,"status":"PRIMARY","versionNumber":2}],"encrypted":false}python-keyczar-0.6~b.061709.orig/jtestdata/aes/0000755000000000000000000000000011567545050017653 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/aes/20000644000000000000000000000022611111062316017717 0ustar rootroot{"aesKeyString":"modBcT7wtu9M5xlHcx0lGw","hmacKey":{"hmacKeyString":"F9N11whfdKwcF5AlllMyWzylQTMh37TaHFQ4Wwyregg","size":256},"mode":"CBC","size":128}python-keyczar-0.6~b.061709.orig/jtestdata/aes/1.out0000644000000000000000000000014211111062316020521 0ustar rootrootAJubU4KnIdbjw-NEcJCAPyeggY8nam1GNZzGMbkz4lZM0Kkr3r6Lr65pXzt2VOuCYoOHYoU-6zspSjNQxAZBG7fcfBR2ItQ--Qpython-keyczar-0.6~b.061709.orig/jtestdata/aes/2.out0000644000000000000000000000014211111062316020522 0ustar rootrootAMqJf9wZuzfDkDX3ILv1GVoNTWmr_Lj9grE1uw2lNNrBYDS7uPnKXEfApqN1oDQmfGtaszz6JVObUpaIYO6X7Q1Nx8lDo6X8cApython-keyczar-0.6~b.061709.orig/jtestdata/aes/10000644000000000000000000000022611111062316017716 0ustar rootroot{"aesKeyString":"WwyzvandqTxlRTFY0lBjzQ","hmacKey":{"hmacKeyString":"tt2G01lN0hp3vopj_tMJE-v9IacrL6feNMbDTzz28BQ","size":256},"mode":"CBC","size":128}python-keyczar-0.6~b.061709.orig/jtestdata/aes/meta0000644000000000000000000000031611043404044020506 0ustar rootroot{"name":"test","purpose":"DECRYPT_AND_ENCRYPT","type":"AES","versions":[{"exportable":false,"status":"ACTIVE","versionNumber":1},{"exportable":false,"status":"PRIMARY","versionNumber":2}],"encrypted":false}python-keyczar-0.6~b.061709.orig/jtestdata/dsa/0000755000000000000000000000000011567545050017652 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/dsa/20000644000000000000000000000120411111062316017713 0ustar rootroot{"publicKey":{"y":"OzkwAmyS3ROz5Fo_-TLQwrdy8ZqDO_cQbuBuff9adnpYrxHyVgh8jMnv9j6p1Q6MB2ksukuLk2vHLVIMnMu8zCHCt8F_a4cx5szal9XaVRfqfA851aImjXC65SfTwdWHLUpPGAmzd20dKd8wTmR5B-op58fiDwLthxIPqq0rFRM","p":"AP1_U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq_xfW6MPbLm1Vs14E7gB00b_JmYLdrmVClpJ-f6AR7ECLCT7up1_63xhv4O1fnxqimFQ8E-4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHH","q":"AJdgUI8VIwvMspK5gqLrhAvwWBz1","g":"APfhoIXWmz3ey7yrXDa4V7l5lK-7-jrqgvlXTAs9B4JnUVlXjrrUWU_mcQcQgYC0SRZxI-hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv-z0kq","size":1024},"x":"UcnvQDd09yn900DybfscZ1PMk4Q","size":1024}python-keyczar-0.6~b.061709.orig/jtestdata/dsa/1.out0000644000000000000000000000010611111062316020520 0ustar rootrootANFrFsYwLQIVAIcDJ2ez5mygnrUfwgGCrZwWPOe5AhQ1-sAPNq4WyjMF7M12hreDh2bCFQpython-keyczar-0.6~b.061709.orig/jtestdata/dsa/2.out0000644000000000000000000000010411111062316020517 0ustar rootrootAAK9BcUwLAIUQTFTcZilB_pzJCLV4vTQF71uPcECFGuOHDtHTEqaQHVc49j7BozGDFZXpython-keyczar-0.6~b.061709.orig/jtestdata/dsa/10000644000000000000000000000120411111062316017712 0ustar rootroot{"publicKey":{"y":"K3YU5x0w2VI37MylO4rOKXSVe1U_69szeEWQFjey1mgEXIlqMWKg6hlj_SuJ_PloChN5reaZsGKS1O9jKV2qO1XafGam-Qwna3Iq66q8R-X6vKhFpQZ1VvDJwhOtT4wCatoReFJFm8yLeQ_-1mIC3c9eeLh6z704h8DXpDRXtO8","p":"AP1_U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq_xfW6MPbLm1Vs14E7gB00b_JmYLdrmVClpJ-f6AR7ECLCT7up1_63xhv4O1fnxqimFQ8E-4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHH","q":"AJdgUI8VIwvMspK5gqLrhAvwWBz1","g":"APfhoIXWmz3ey7yrXDa4V7l5lK-7-jrqgvlXTAs9B4JnUVlXjrrUWU_mcQcQgYC0SRZxI-hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv-z0kq","size":1024},"x":"BLYie87KQr2hKXA49XJKDIRe1RE","size":1024}python-keyczar-0.6~b.061709.orig/jtestdata/dsa/meta0000644000000000000000000000031711043404044020506 0ustar rootroot{"name":"test","purpose":"SIGN_AND_VERIFY","type":"DSA_PRIV","versions":[{"exportable":false,"status":"ACTIVE","versionNumber":1},{"exportable":false,"status":"PRIMARY","versionNumber":2}],"encrypted":false}python-keyczar-0.6~b.061709.orig/jtestdata/dsa.public/0000755000000000000000000000000011567545050021127 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/dsa.public/20000644000000000000000000000111011111062316021164 0ustar rootroot{"y":"OzkwAmyS3ROz5Fo_-TLQwrdy8ZqDO_cQbuBuff9adnpYrxHyVgh8jMnv9j6p1Q6MB2ksukuLk2vHLVIMnMu8zCHCt8F_a4cx5szal9XaVRfqfA851aImjXC65SfTwdWHLUpPGAmzd20dKd8wTmR5B-op58fiDwLthxIPqq0rFRM","p":"AP1_U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq_xfW6MPbLm1Vs14E7gB00b_JmYLdrmVClpJ-f6AR7ECLCT7up1_63xhv4O1fnxqimFQ8E-4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHH","q":"AJdgUI8VIwvMspK5gqLrhAvwWBz1","g":"APfhoIXWmz3ey7yrXDa4V7l5lK-7-jrqgvlXTAs9B4JnUVlXjrrUWU_mcQcQgYC0SRZxI-hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv-z0kq","size":1024}python-keyczar-0.6~b.061709.orig/jtestdata/dsa.public/10000644000000000000000000000111011111062316021163 0ustar rootroot{"y":"K3YU5x0w2VI37MylO4rOKXSVe1U_69szeEWQFjey1mgEXIlqMWKg6hlj_SuJ_PloChN5reaZsGKS1O9jKV2qO1XafGam-Qwna3Iq66q8R-X6vKhFpQZ1VvDJwhOtT4wCatoReFJFm8yLeQ_-1mIC3c9eeLh6z704h8DXpDRXtO8","p":"AP1_U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq_xfW6MPbLm1Vs14E7gB00b_JmYLdrmVClpJ-f6AR7ECLCT7up1_63xhv4O1fnxqimFQ8E-4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHH","q":"AJdgUI8VIwvMspK5gqLrhAvwWBz1","g":"APfhoIXWmz3ey7yrXDa4V7l5lK-7-jrqgvlXTAs9B4JnUVlXjrrUWU_mcQcQgYC0SRZxI-hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv-z0kq","size":1024}python-keyczar-0.6~b.061709.orig/jtestdata/dsa.public/meta0000644000000000000000000000030511043404044021760 0ustar rootroot{"name":"test","purpose":"VERIFY","type":"DSA_PUB","versions":[{"exportable":false,"status":"ACTIVE","versionNumber":1},{"exportable":false,"status":"PRIMARY","versionNumber":2}],"encrypted":false}python-keyczar-0.6~b.061709.orig/jtestdata/hmac/0000755000000000000000000000000011567545050020013 5ustar rootrootpython-keyczar-0.6~b.061709.orig/jtestdata/hmac/20000644000000000000000000000011211111062316020051 0ustar rootroot{"hmacKeyString":"1LNZNV3PUpp71FiPfVDOrjNqpaVotwEJsvFAXtB1wiE","size":256}python-keyczar-0.6~b.061709.orig/jtestdata/hmac/1.out0000644000000000000000000000004211111062316020660 0ustar rootrootAI-Dj_WPGI-aws3Wfog1Y3RSXZ9ICiI-iApython-keyczar-0.6~b.061709.orig/jtestdata/hmac/2.out0000644000000000000000000000004211111062316020661 0ustar rootrootALw_zW5enSdJ34dAJ1Cidm8w7OkgsxW2kQpython-keyczar-0.6~b.061709.orig/jtestdata/hmac/10000644000000000000000000000011211111062316020050 0ustar rootroot{"hmacKeyString":"zfAeeLafawzfkpOyrfRHxJo2WAUyL9PyCgqFXr10wv4","size":256}python-keyczar-0.6~b.061709.orig/jtestdata/hmac/meta0000644000000000000000000000032011043404044020641 0ustar rootroot{"name":"test","purpose":"SIGN_AND_VERIFY","type":"HMAC_SHA1","versions":[{"exportable":false,"status":"ACTIVE","versionNumber":1},{"exportable":false,"status":"PRIMARY","versionNumber":2}],"encrypted":false}python-keyczar-0.6~b.061709.orig/tests/0000755000000000000000000000000011567545050016262 5ustar rootrootpython-keyczar-0.6~b.061709.orig/tests/keyczar/0000755000000000000000000000000011567545050017732 5ustar rootrootpython-keyczar-0.6~b.061709.orig/tests/keyczar/openssl0000644000000000000000000000001611111062316021315 0ustar rootrootLYf0AA base64 python-keyczar-0.6~b.061709.orig/tests/keyczar/alltests.py0000644000000000000000000000201011053353132022114 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Suite of all unittests for Python Keyczar. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import unittest import crypter_test import keyczart_test import signer_test def suite(): alltests = unittest.TestSuite() alltests.addTest(crypter_test.suite()) alltests.addTest(keyczart_test.suite()) alltests.addTest(signer_test.suite()) return alltests if __name__ == '__main__': unittest.main(defaultTest='suite')python-keyczar-0.6~b.061709.orig/tests/keyczar/__init__.py0000644000000000000000000000134011046627164022040 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tests for Keyczar Cryptography Toolkit Suite of unit tests for keyczar package. @author: arkajit.dey@gmail.com (Arkajit Dey) """python-keyczar-0.6~b.061709.orig/tests/keyczar/signer_test.py0000644000000000000000000001240411111062316022613 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Testcases to test behavior of Keyczar Signers. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import os import unittest from keyczar import errors from keyczar import keyczar from keyczar import util TEST_DATA = os.path.realpath(os.path.join(os.getcwd(), "..", "..", "testdata")) class SignerTest(unittest.TestCase): def setUp(self): self.input = "This is some test data" def __signInput(self, subdir): signer = keyczar.Signer.Read(os.path.join(TEST_DATA, subdir)) sig = signer.Sign(self.input) return (signer, sig) def __unversionedSignInput(self, subdir): unversioned_signer = keyczar.UnversionedSigner.Read(os.path.join(TEST_DATA, subdir)) sig = unversioned_signer.Sign(self.input) return (unversioned_signer, sig) def __readGoldenOutput(self, subdir, verifier=False, public=False): path = os.path.join(TEST_DATA, subdir) if verifier and not public: czar = keyczar.Verifier.Read(path) elif verifier and public: czar = keyczar.Verifier.Read(os.path.join(TEST_DATA, subdir+".public")) else: czar = keyczar.Signer.Read(path) active_sig = util.ReadFile(os.path.join(path, "1.out")) primary_sig = util.ReadFile(os.path.join(path, "2.out")) return (czar, active_sig, primary_sig) def __testSignAndVerify(self, subdir): (signer, sig) = self.__signInput(subdir) self.assertTrue(signer.Verify(self.input, sig)) self.assertFalse(signer.Verify("Wrong string", sig)) def __testUnversionedSignAndVerify(self, subdir): (unversioned_signer, sig) = self.__unversionedSignInput(subdir) self.assertTrue(unversioned_signer.Verify(self.input, sig)) self.assertFalse(unversioned_signer.Verify("Wrong string", sig)) def __testSignerVerify(self, subdir): (signer, active_sig, primary_sig) = self.__readGoldenOutput(subdir) self.assertTrue(signer.Verify(self.input, active_sig)) self.assertTrue(signer.Verify(self.input, primary_sig)) def __testVerify(self, subdir): (verifier, active_sig, primary_sig) = self.__readGoldenOutput(subdir, True) self.assertTrue(verifier.Verify(self.input, active_sig)) self.assertTrue(verifier.Verify(self.input, primary_sig)) def __testPublicVerify(self, subdir): (pubverifier, active_sig, primary_sig) = self.__readGoldenOutput(subdir, True, True) self.assertTrue(pubverifier.Verify(self.input, active_sig)) self.assertTrue(pubverifier.Verify(self.input, primary_sig)) def __testBadVerify(self, subdir): (signer, active_sig, primary_sig) = self.__readGoldenOutput(subdir) self.assertFalse(signer.Verify("Wrong string", active_sig)) self.assertFalse(signer.Verify("Wrong string", primary_sig)) self.assertFalse(signer.Verify(self.input, primary_sig[:-4]+"Junk")) def testHmacSignAndVerify(self): self.__testSignAndVerify("hmac") def testHmacUnversionedSignAndVerify(self): self.__testUnversionedSignAndVerify("hmac") def testHmacVerify(self): self.__testSignerVerify("hmac") def testBadHmacVerify(self): self.__testBadVerify("hmac") def testDsaSignAndVerify(self): self.__testSignAndVerify("dsa") def testDsaUnversionedSignAndVerify(self): self.__testUnversionedSignAndVerify("dsa") def testDsaSignerVerify(self): self.__testSignerVerify("dsa") def testDsaVerify(self): self.__testVerify("dsa") def testDsaPublicVerify(self): self.__testPublicVerify("dsa") def testBadDsaVerify(self): self.__testBadVerify("dsa") def testRsaSignAndVerify(self): self.__testSignAndVerify("rsa-sign") def testRsaUnversionedSignAndVerify(self): self.__testUnversionedSignAndVerify("rsa-sign") def testRsaSignerVerify(self): self.__testSignerVerify("rsa-sign") def testRsaVerify(self): self.__testVerify("rsa-sign") def testRsaPublicVerify(self): self.__testPublicVerify("rsa-sign") def testBadRsaVerify(self): self.__testBadVerify("rsa-sign") def testHmacBadSigs(self): (signer, sig) = self.__signInput("hmac") sig_bytes = util.Decode(sig) self.assertRaises(errors.ShortSignatureError, signer.Verify, self.input, "AB") bad_sig = util.Encode(chr(23) + sig_bytes[1:]) self.assertRaises(errors.BadVersionError, signer.Verify, self.input, bad_sig) char = chr(ord(sig_bytes[1]) ^ 45) # Munge key hash info in sig bad_sig = util.Encode(sig_bytes[0] + char + sig_bytes[2:]) self.assertRaises(errors.KeyNotFoundError, signer.Verify, self.input, bad_sig) def tearDown(self): self.input = None def suite(): return unittest.makeSuite(SignerTest, 'test')python-keyczar-0.6~b.061709.orig/tests/keyczar/keyczart_test.py0000644000000000000000000000613011474547771023210 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Testcases to test behavior of Keyczart. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import unittest from keyczar import readers from keyczar import keyczart from keyczar import keyinfo class KeyczartTest(unittest.TestCase): def setUp(self): self.mock = readers.MockReader('TEST', keyinfo.ENCRYPT, keyinfo.AES) self.mock.AddKey(42, keyinfo.PRIMARY) self.mock.AddKey(77, keyinfo.ACTIVE) self.mock.AddKey(99, keyinfo.INACTIVE) keyczart.mock = self.mock # enable testing def testCreate(self): keyczart.main(['create', '--name=testCreate', '--purpose=crypt', '--asymmetric=rsa']) self.assertEquals('testCreate', self.mock.kmd.name) self.assertEquals(keyinfo.DECRYPT_AND_ENCRYPT, self.mock.kmd.purpose) self.assertEquals(keyinfo.RSA_PRIV, self.mock.kmd.type) def testAddKey(self): self.assertEquals(3, self.mock.numkeys) keyczart.main(['addkey', '--status=primary']) self.assertEquals(4, self.mock.numkeys) # The next version number will be 100, since the previous max was 99 self.assertEquals(keyinfo.PRIMARY, self.mock.GetStatus(100)) self.assertEquals(keyinfo.ACTIVE, self.mock.GetStatus(42)) def testAddKeySizeFlag(self): keyczart.main(['addkey', '--size=256']) self.assertEquals(256, self.mock.GetKeySize(100)) def testPubKey(self): pubmock = readers.MockReader('PUBTEST', keyinfo.DECRYPT_AND_ENCRYPT, keyinfo.RSA_PRIV) pubmock.AddKey(33, keyinfo.PRIMARY, 1024) # small key size for fast tests keyczart.mock = pubmock # use pubmock instead self.assertEquals(None, pubmock.pubkmd) keyczart.main(['pubkey']) self.assertNotEqual(None, pubmock.pubkmd) self.assertEquals('PUBTEST', pubmock.pubkmd.name) self.assertEquals(keyinfo.ENCRYPT, pubmock.pubkmd.purpose) self.assertEquals(keyinfo.RSA_PUB, pubmock.pubkmd.type) self.assertTrue(pubmock.HasPubKey(33)) def testPromote(self): keyczart.main(['promote', '--version=77']) self.assertEquals(keyinfo.PRIMARY, self.mock.GetStatus(77)) self.assertEquals(keyinfo.ACTIVE, self.mock.GetStatus(42)) def testDemote(self): keyczart.main(['demote', '--version=77']) self.assertEquals(keyinfo.INACTIVE, self.mock.GetStatus(77)) def testRevoke(self): self.assertTrue(self.mock.ExistsVersion(99)) keyczart.main(['revoke', '--version=99']) self.assertFalse(self.mock.ExistsVersion(99)) def tearDown(self): keyczart.mock = None def suite(): return unittest.makeSuite(KeyczartTest, 'test') python-keyczar-0.6~b.061709.orig/tests/keyczar/crypter_test.py0000644000000000000000000000572711046443334023040 0ustar rootroot#!/usr/bin/python2.4 # # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Testcases to test behavior of Keyczar Crypters. @author: arkajit.dey@gmail.com (Arkajit Dey) """ import os import unittest from keyczar import errors from keyczar import keyczar from keyczar import readers from keyczar import util TEST_DATA = os.path.realpath(os.path.join(os.getcwd(), "..", "..", "testdata")) class CrypterTest(unittest.TestCase): def setUp(self): self.input = "This is some test data" def __testDecrypt(self, subdir, reader=None): path = os.path.join(TEST_DATA, subdir) if reader: crypter = keyczar.Crypter(reader) else: crypter = keyczar.Crypter.Read(path) active_ciphertext = util.ReadFile(os.path.join(path, "1.out")) primary_ciphertext = util.ReadFile(os.path.join(path, "2.out")) active_decrypted = crypter.Decrypt(active_ciphertext) self.assertEquals(self.input, active_decrypted) primary_decrypted = crypter.Decrypt(primary_ciphertext) self.assertEquals(self.input, primary_decrypted) def __testEncryptAndDecrypt(self, subdir): crypter = keyczar.Crypter.Read(os.path.join(TEST_DATA, subdir)) ciphertext = crypter.Encrypt(self.input) plaintext = crypter.Decrypt(ciphertext) self.assertEquals(self.input, plaintext) def testAesDecrypt(self): self.__testDecrypt("aes") def testAesEncryptedKeyDecrypt(self): file_reader = readers.FileReader(os.path.join(TEST_DATA, "aes-crypted")) key_decrypter = keyczar.Crypter.Read(os.path.join(TEST_DATA, "aes")) reader = readers.EncryptedReader(file_reader, key_decrypter) self.__testDecrypt("aes-crypted", reader) def testRsaDecrypt(self): self.__testDecrypt("rsa") def testAesEncryptAndDecrypt(self): self.__testEncryptAndDecrypt("aes") def testRsaEncryptAndDecrypt(self): self.__testEncryptAndDecrypt("rsa") def testBadAesCiphertexts(self): crypter = keyczar.Crypter.Read(os.path.join(TEST_DATA, "aes")) ciphertext = util.Decode(crypter.Encrypt(self.input)) # in bytes bad = util.Encode(chr(0)) char = chr(ord(ciphertext[2]) ^ 44) # Munge key hash info in ciphertext ciphertext = util.Encode(ciphertext[:2]+char+ciphertext[3:]) self.assertRaises(errors.ShortCiphertextError, crypter.Decrypt, bad) self.assertRaises(errors.KeyNotFoundError, crypter.Decrypt, ciphertext) def tearDown(self): self.input = None def suite(): return unittest.makeSuite(CrypterTest, 'test')