PKœŒ.;“×2EGG-INFO/dependency_links.txt PK Œ.;ÍÒ11EGG-INFO/native_libs.txtpygr/cdict.so pygr/cnestedlist.so pygr/seqfmt.so PK Œ.;“×2EGG-INFO/not-zip-safe PKœŒ.;ØÁ»èžžEGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: pygr Version: 0.8.0 Summary: Pygr, a Python graph-database toolkit oriented primarily on bioinformatics applications Home-page: http://code.google.com/p/pygr/ Author: Christopher Lee Author-email: leec@chem.ucla.edu License: New BSD License Description: Pygr ==== Pygr is an open source software project used to develop graph database interfaces for the popular Python language, with a strong emphasis on bioinformatics applications ranging from genome-wide analysis of alternative splicing patterns, to comparative genomics queries of multi-genome alignment data. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000 Classifier: Operating System :: OS Independent Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: Unix Classifier: Programming Language :: Python Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Scientific/Engineering :: Bio-Informatics PKœŒ.;»Eˆ  EGG-INFO/SOURCES.txtLICENSE.txt MANIFEST.in README.txt setup.cfg setup.py doc/Makefile doc/rest/conf.py doc/rest/contents.rst doc/rest/guidelist.rst doc/rest/sequences.rst doc/rest/team.rst doc/rest/whatsnew.rst doc/rest/guides/devguide.rst doc/rest/guides/libnclist.rst doc/rest/guides/testing.rst doc/rest/recipes/alignment_recipes.rst doc/rest/reference/annotation.rst doc/rest/reference/blast.rst doc/rest/reference/classutil.rst doc/rest/reference/cnestedlist.rst doc/rest/reference/coordinator.rst doc/rest/reference/downloader.rst doc/rest/reference/mapping.rst doc/rest/reference/metabase.rst doc/rest/reference/seqdb.rst doc/rest/reference/sequence.rst doc/rest/reference/sequtil.rst doc/rest/reference/sqlgraph.rst doc/rest/reference/worldbase.rst doc/rest/static/contents.png doc/rest/static/data-browser.png doc/rest/static/pygr-doc.css doc/rest/static/pygr-epydoc.css doc/rest/static/pygr-logo.gif doc/rest/templates/index.html doc/rest/templates/indexsidebar.html doc/rest/templates/layout.html doc/rest/templates/media.html doc/rest/tutorials/alignment.rst doc/rest/tutorials/annotating-yeast.rst doc/rest/tutorials/annotation.rst doc/rest/tutorials/annotation2.rst doc/rest/tutorials/compgenomics.rst doc/rest/tutorials/db.rst doc/rest/tutorials/db_basic.rst doc/rest/tutorials/develop.rst doc/rest/tutorials/gene.rst doc/rest/tutorials/graphquery.rst doc/rest/tutorials/sequence.rst doc/rest/tutorials/slice_pickle_obj.py doc/rest/tutorials/worldbase.rst doc/rest/tutorials/worldbase2.rst doc/rest/tutorials/xmlrpc.rst misc/pygrrc.example misc/debian/changelog misc/debian/compat misc/debian/control misc/debian/copyright misc/debian/pycompat misc/debian/rules misc/debian/watch misc/fink/pygr-doc.info misc/fink/pygr-py.info misc/portage/pygr-9999.ebuild misc/portage/pygr-VER.ebuild pygr/Data.py pygr/__init__.py pygr/annotation.py pygr/blast.py pygr/cdict.c pygr/cdict.pxd pygr/cdict.pyx pygr/cgraph.c pygr/cgraph.h pygr/classutil.py pygr/cnestedlist.c pygr/cnestedlist.pxd pygr/cnestedlist.pyx pygr/coordinator.py pygr/dbfile.py pygr/default.h pygr/downloader.py pygr/graphquery.py pygr/intervaldb.c pygr/intervaldb.h pygr/logger.py pygr/mapping.py pygr/metabase.py pygr/nlmsa_utils.py pygr/parse_blast.py pygr/schema.py pygr/seqdb.py pygr/seqfmt.c pygr/seqfmt.pyx pygr/sequence.py pygr/sequtil.py pygr/sqlgraph.py pygr/translationDB.py pygr/xnestedlist.py pygr.egg-info/PKG-INFO pygr.egg-info/SOURCES.txt pygr.egg-info/dependency_links.txt pygr.egg-info/top_level.txt pygr/apps/__init__.py pygr/apps/catalog_downloads.py pygr/apps/leelabdb.py pygr/apps/maf2VSgraph.py pygr/apps/maf2nclist.c pygr/apps/maf2nclist.h pygr/apps/maf2nclist.py pygr/apps/seqref.py pygr/apps/splicegraph.py tests/README.txt tests/annotation_dm2_megatest.py tests/annotation_hg18_megatest.py tests/annotation_test.py tests/blast_test.py tests/doctests_test.py tests/downloadNLMSA_megatest.py tests/graph_test.py tests/metabase_test.py tests/nlmsa_dm2_megatest.py tests/nlmsa_hg18_megatest.py tests/nlmsa_test.py tests/pairwise_hg18_megatest.py tests/pygrdata_test.py tests/restartIterator_megatest.py tests/runtest.py tests/seqdb_test.py tests/sequence_test.py tests/sqlsequence_test.py tests/sqltable_test.py tests/translationDB_test.py tests/worldbase_test.py tests/data/alignments.fa tests/data/bad_tblastn.txt tests/data/blastp_output.txt tests/data/blastx_output.txt tests/data/dnaseq.fasta tests/data/exontuples.txt tests/data/funnyseq.fasta tests/data/gapping.fa tests/data/hbb1_mouse.fa tests/data/hbb1_mouse_rc.fa tests/data/multiblast_long_correct.txt tests/data/multiblast_long_output.txt tests/data/multiblast_output.txt tests/data/partial-yeast.fasta tests/data/prefixUnionDict-1.txt tests/data/prefixUnionDict-2.txt tests/data/prefixUnionDict-3.txt tests/data/sp_all_hbb tests/data/sp_hbb1 tests/data/sp_hbb1.phr tests/data/tblastn_output.txt tests/data/test.gz tests/data/test.zip tests/testlib/__init__.py tests/testlib/pathfix.py tests/testlib/pygrdata_server.py tests/testlib/testoptions.py tests/testlib/testutil.py tests/testlib/unittest_extensions.py tests/tools/run_megatests tests/tools/send_megatest_email.pyPKœŒ.; ׃™EGG-INFO/top_level.txtpygr PK`x+;2ó\œJJpygr/__init__.pyimport sys __version__ = "0.8.0" try: worldbase except NameError: import metabase mdb = metabase.MetabaseList() # use default WORLDBASEPATH worldbase = mdb.Data if sys.version_info < (2, 6): def dir(obj): """provide Python 2.6+ style __dir__ support """ try: get_dir = obj.__dir__ except AttributeError: return __builtins__['dir'](obj) else: return get_dir() else: # Python 2.6 or later, just use the builtin dir() dir = __builtins__['dir'] __all__ = ('__version__', 'worldbase', 'dir') PKŒ.;«ô¨¨pygr/__init__.pyc;ò ɪJc@s‹dkZdZyeWn1ej o%dkZeiƒZeiZnXeiddfjo d„Z n e dZ dddfZ dS(Ns0.8.0iicCs<y |i}Wn!tj otd|ƒSn X|ƒSdS(s*provide Python 2.6+ style __dir__ support sdirN(sobjs__dir__sget_dirsAttributeErrors __builtins__(sobjsget_dir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/__init__.pysdir s  sdirs __version__s worldbase( ssyss __version__s worldbases NameErrorsmetabases MetabaseListsmdbsDatas version_infosdirs __builtins__s__all__(smetabases worldbases__all__smdbssyss __version__sdir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/__init__.pys?s    PKŒ.;«ô¨¨pygr/__init__.pyo;ò ɪJc@s‹dkZdZyeWn1ej o%dkZeiƒZeiZnXeiddfjo d„Z n e dZ dddfZ dS(Ns0.8.0iicCs<y |i}Wn!tj otd|ƒSn X|ƒSdS(s*provide Python 2.6+ style __dir__ support sdirN(sobjs__dir__sget_dirsAttributeErrors __builtins__(sobjsget_dir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/__init__.pysdir s  sdirs __version__s worldbase( ssyss __version__s worldbases NameErrorsmetabases MetabaseListsmdbsDatas version_infosdirs __builtins__s__all__(smetabases worldbases__all__smdbssyss __version__sdir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/__init__.pys?s    PK`x+;î)·å E Epygr/annotation.pyfrom __future__ import generators from sequence import * import classutil import UserDict import weakref def getAnnotationAttr(self,attr): 'forward attributes from slice object if available' return self.db.getSliceAttr(self.db.sliceDB[self.id], attr) def annotation_repr(self): if self.annotationType is not None: title = self.annotationType else: title = 'annot' if self.orientation>0: return '%s%s[%d:%d]' % (title,self.id,self.start,self.stop) else: return '-%s%s[%d:%d]' % (title,self.id,-self.stop,-self.start) class AnnotationSeqDescr(object): 'get the sequence interval corresponding to this annotation' def __get__(self,obj,objtype): return absoluteSlice(obj._anno_seq,obj._anno_start,obj._anno_start+obj.stop) class AnnotationSliceDescr(object): 'get the sequence interval corresponding to this annotation' def __get__(self,obj,objtype): return relativeSlice(obj.pathForward.sequence,obj.start,obj.stop) class AnnotationSeqtypeDescr(object): 'get seqtype of the sequence interval corresponding to this annotation' def __get__(self,obj,objtype): return obj._anno_seq.seqtype() class AnnotationSeq(SeqPath): 'base class representing an annotation' start=0 step=1 orientation=1 def __init__(self,id,db,parent,start,stop): self.id = id self.db = db self.stop = stop-start self._anno_seq = parent self._anno_start = start self.path = self __getattr__ = getAnnotationAttr sequence = AnnotationSeqDescr() annotationType = classutil.DBAttributeDescr('annotationType') _seqtype = AnnotationSeqtypeDescr() __repr__ = annotation_repr def __cmp__(self, other): if not isinstance(other, AnnotationSeq): return -1 if cmp(self.sequence, other.sequence) == 0: if self.id == other.id and self.db is other.db: return cmp((self.start,self.stop),(other.start,other.stop)) return NOT_ON_SAME_PATH def strslice(self,start,stop): raise ValueError('''this is an annotation, and you cannot get a sequence string from it. Use its sequence attribute to get a sequence object representing this interval.''') class AnnotationSlice(SeqDBSlice): 'represents subslice of an annotation' __getattr__=getAnnotationAttr sequence = AnnotationSliceDescr() annotationType = classutil.DBAttributeDescr('annotationType') __repr__ = annotation_repr class TranslationAnnotSeqDescr(object): 'get the sequence interval corresponding to this annotation' def __get__(self,obj,objtype): return absoluteSlice(obj._anno_seq, obj._anno_start, obj._anno_stop) class TranslationAnnotFrameDescr(object): """Get the frame of this protein translation, relative to original DNA.""" def __get__(self, obj, objtype): orig = obj.pathForward.sequence if orig.orientation > 0: frame = (orig.start % 3) + 1 else: return -((orig.start + 1) % 3 + 1) return frame class TranslationAnnot(AnnotationSeq): 'annotation representing aa translation of a given nucleotide interval' def __init__(self, id, db, parent, start, stop): AnnotationSeq.__init__(self, id, db, parent, start, stop) self.stop /= 3 self._anno_stop = stop sequence = TranslationAnnotSeqDescr() frame = TranslationAnnotFrameDescr() _seqtype = PROTEIN_SEQTYPE def strslice(self, start, stop): 'get the aa translation of our associated ORF' try: aa = self._translation except AttributeError: aa = self._translation = translate_orf(str(self.sequence)) return aa[start:stop] class TranslationAnnotSliceDescr(object): 'get the sequence interval corresponding to this annotation' def __get__(self,obj,objtype): return relativeSlice(obj.pathForward.sequence, 3*obj.start, 3*obj.stop) class TranslationAnnotSlice(AnnotationSlice): sequence = TranslationAnnotSliceDescr() frame = TranslationAnnotFrameDescr() class AnnotationDB(object, UserDict.DictMixin): 'container of annotations as specific slices of db sequences' def __init__(self, sliceDB, seqDB, annotationType=None, itemClass=AnnotationSeq, itemSliceClass=AnnotationSlice, itemAttrDict=None, # GET RID OF THIS BACKWARDS-COMPATIBILITY KLUGE!! sliceAttrDict=None,maxCache=None, autoGC=True, checkFirstID=True, **kwargs): '''sliceDB must map identifier to a sliceInfo object; sliceInfo must have attributes: id, start, stop, orientation; seqDB must map sequence ID to a sliceable sequence object; sliceAttrDict gives optional dict of item attributes that should be mapped to sliceDB item attributes. maxCache specfies the maximum number of annotation objects to keep in the cache.''' if autoGC: # automatically garbage collect unused objects self._weakValueDict = classutil.RecentValueDictionary(autoGC) else: self._weakValueDict = {} # object cache self.autoGC = autoGC if sliceAttrDict is None: sliceAttrDict = {} if sliceDB is not None: self.sliceDB = sliceDB else: # NEED TO CREATE / OPEN A DATABASE FOR THE USER self.sliceDB = classutil.get_shelve_or_dict(**kwargs) self.seqDB = seqDB self.annotationType = annotationType self.itemClass=itemClass self.itemSliceClass=itemSliceClass self.sliceAttrDict=sliceAttrDict # USER-PROVIDED ALIASES if maxCache is not None: self.maxCache = maxCache if checkFirstID: try: # don't cache anything now; schema may change itemClass! k = iter(self).next() # get the first ID if any self.get_annot_obj(k, self.sliceDB[k]) # valid annotation? except KeyError: # a convenient warning to the user... raise KeyError('''\ cannot create annotation object %s; sequence database %s may not be correct''' % (k, repr(seqDB),)) except StopIteration: pass # dataset is empty so there is nothing we can check... __getstate__ = classutil.standard_getstate ############### PICKLING METHODS __setstate__ = classutil.standard_setstate _pickleAttrs = dict(sliceDB=0,seqDB=0,annotationType=0, autoGC=0, itemClass=0,itemSliceClass=0,sliceAttrDict=0,maxCache=0) def __hash__(self): # @CTB unnecessary?? 'ALLOW THIS OBJECT TO BE USED AS A KEY IN DICTS...' return id(self) def __getitem__(self,k): 'get annotation object by its ID' try: # GET FROM OUR CACHE return self._weakValueDict[k] except KeyError: pass return self.sliceAnnotation(k,self.sliceDB[k]) def __setitem__(self,k,v): raise KeyError('''you cannot save annotations directly using annoDB[k] = v Instead, use annoDB.new_annotation(k,sliceInfo) where sliceInfo provides a sequence ID, start, stop (and any additional info desired), and will be saved directly to the sliceDB.''') def getSliceAttr(self,sliceInfo,attr): try: k = self.sliceAttrDict[attr] # USE ALIAS IF PROVIDED except KeyError: return getattr(sliceInfo,attr) # GET ATTRIBUTE AS USUAL try: # REMAP TO ANOTHER ATTRIBUTE NAME return getattr(sliceInfo,k) except TypeError: # TREAT AS int INDEX INTO A TUPLE return sliceInfo[k] def get_annot_obj(self, k, sliceInfo): 'create an annotation object based on the input sliceInfo' start = int(self.getSliceAttr(sliceInfo,'start')) stop = int(self.getSliceAttr(sliceInfo,'stop')) try: orientation = self.getSliceAttr(sliceInfo, 'orientation') orientation = int(orientation) if orientation < 0 and start >= 0: start,stop = (-stop, -start) # NEGATIVE ORIENTATION COORDINATES except (AttributeError, IndexError): pass # ok if no orientation is specified. if start>=stop: raise IndexError('annotation %s has zero or negative length [%s:%s]!' %(k,start,stop)) seq_id = self.getSliceAttr(sliceInfo, 'id') seq = self.seqDB[seq_id] return self.itemClass(k, self, seq, start, stop) def sliceAnnotation(self,k,sliceInfo,limitCache=True): 'create annotation and cache it' a = self.get_annot_obj(k, sliceInfo) try: # APPLY CACHE SIZE LIMIT IF ANY if limitCache and self.maxCachemaxAnnot: raise ValueError('too many hits for %s: %d' %(id,len(hits))) out = [] i = 0 k = id for ival in hits: # CREATE ANNOTATION FOR EACH HIT if len(hits)>1: # NEED TO CREATE AN ID FOR EACH HIT if autoIncrement: k = len(self.sliceDB) else: k = idFormat %(id,i) i += 1 if sliceInfo is not None: # SAVE SLICE AS TUPLE WITH INFO a = self.new_annotation(k, (ival.id,ival.start,ival.stop)+sliceInfo) else: a = self.new_annotation(k, (ival.id,ival.start,ival.stop)) out.append(a) # RETURN THE ANNOTATION return out def close(self): 'if sliceDB needs to be closed, do it and return True, otherwise False' try: if self._wroteSliceDB: self.sliceDB.close() self._wroteSliceDB = False # DISK FILE IS UP TO DATE return True except AttributeError: pass return False def __del__(self): if self.close(): import sys print >>sys.stderr,''' WARNING: you forgot to call AnnotationDB.close() after writing new annotation data to it. This could result in failure to properly store the data in the associated disk file. To avoid this, we have automatically called AnnotationDB.sliceDB.close() to write the data for you, when the AnnotationDB was deleted.''' def clear_cache(self): 'empty the cache' self._weakValueDict.clear() # not clear what this should do for AnnotationDB def copy(self): raise NotImplementedError, "nonsensical in AnnotationDB" def setdefault(self, k, d=None): raise NotImplementedError, "nonsensical in AnnotationDB" def update(self, other): raise NotImplementedError, "nonsensical in AnnotationDB" # these methods should not be implemented for read-only database. def clear(self): raise NotImplementedError, "no deletions allowed" def pop(self): raise NotImplementedError, "no deletions allowed" def popitem(self): raise NotImplementedError, "no deletions allowed" class AnnotationServer(AnnotationDB): 'XMLRPC-ready server for AnnotationDB' xmlrpc_methods={'get_slice_tuple':0,'get_slice_items':0, 'get_annotation_attr':0, 'keys':0, '__len__':0, '__contains__':0} def get_slice_tuple(self, k): 'get (seqID,start,stop) for a given key' try: sliceInfo = self.sliceDB[k] except KeyError: return '' # XMLRPC-acceptable failure code start = int(self.getSliceAttr(sliceInfo,'start')) stop = int(self.getSliceAttr(sliceInfo,'stop')) try: if int(self.getSliceAttr(sliceInfo,'orientation'))<0 and start>=0: start,stop = (-stop,-start) # NEGATIVE ORIENTATION COORDINATES except AttributeError: pass return (self.getSliceAttr(sliceInfo, 'id'), start, stop) def get_slice_items(self): 'get all (key,tuple) pairs in one query' l = [] for k in self.sliceDB: l.append((k,self.get_slice_tuple(k))) return l def get_annotation_attr(self, k, attr): 'get the requested attribute of the requested key' try: sliceInfo = self.sliceDB[k] except KeyError: return '' try: return self.getSliceAttr(sliceInfo, attr) except AttributeError: return '' class AnnotationClientSliceDB(dict): 'proxy just queries the server' def __init__(self, db): self.db = db dict.__init__(self) def __getitem__(self, k): try: return dict.__getitem__(self, k) except KeyError: t = self.db.server.get_slice_tuple(k) if t == '': raise KeyError('no such annotation: ' + str(k)) dict.__setitem__(self, k, t) return t def __setitem__(self, k, v): raise ValueError('XMLRPC client is read-only') def keys(self): return self.db.server.keys() def __iter__(self): return iter(self.keys()) def items(self): return self.db.server.get_slice_items() def iteritems(self): return iter(self.items()) def __len__(self): return self.db.server.__len__() def __contains__(self, k): return self.db.server.__contains__(k) class AnnotationClient(AnnotationDB): 'XMLRPC AnnotationDB client' def __init__(self, url, name, seqDB,itemClass=AnnotationSeq, itemSliceClass=AnnotationSlice, autoGC=True, **kwargs): if autoGC: # automatically garbage collect unused objects self._weakValueDict = classutil.RecentValueDictionary(autoGC) else: self._weakValueDict = {} # object cache self.autoGC = autoGC import coordinator self.server = coordinator.get_connection(url, name) self.url = url self.name = name self.seqDB = seqDB self.sliceDB = AnnotationClientSliceDB(self) self.itemClass = itemClass self.itemSliceClass = itemSliceClass def __getstate__(self): return dict(url=self.url, name=self.name, seqDB=self.seqDB, autoGC=self.autoGC) def getSliceAttr(self, sliceInfo, attr): if attr=='id': return sliceInfo[0] elif attr=='start': return sliceInfo[1] elif attr=='stop': return sliceInfo[2] elif attr=='orientation': raise AttributeError('ori not saved') else: v = self.server.get_annotation_attr(sliceInfo[0], attr) if v=='': raise AttributeError('this annotation has no attr: ' + attr) return v PKŒ.; ¨Põqõqpygr/annotation.pyc;ò ɪJc@sdklZdkTdkZdkZdkZd„Zd„Zdefd„ƒYZ defd„ƒYZ d efd „ƒYZ d e fd „ƒYZ d efd„ƒYZdefd„ƒYZdefd„ƒYZde fd„ƒYZdefd„ƒYZdefd„ƒYZdeeifd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZdS(!(s generators(s*NcCs$|ii|ii|i|ƒSdS(s1forward attributes from slice object if availableN(sselfsdbs getSliceAttrssliceDBsidsattr(sselfsattr((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysgetAnnotationAttrscCsw|itj o |i}nd}|idjo!d||i|i|ifSn d||i|i |i fSdS(Nsannotis %s%s[%d:%d]s -%s%s[%d:%d](sselfsannotationTypesNonestitles orientationsidsstartsstop(sselfstitle((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysannotation_repr s  !sAnnotationSeqDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs$t|i|i|i|iƒSdS(N(s absoluteSlicesobjs _anno_seqs _anno_startsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSeqDescrs sAnnotationSliceDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs t|ii|i|iƒSdS(N(s relativeSlicesobjs pathForwardssequencesstartsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSliceDescrs sAnnotationSeqtypeDescrcBstZdZd„ZRS(sEget seqtype of the sequence interval corresponding to this annotationcCs|iiƒSdS(N(sobjs _anno_seqsseqtype(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSeqtypeDescrs s AnnotationSeqcBshtZdZdZdZdZd„ZeZe ƒZ e i dƒZ eƒZeZd„Zd„ZRS(s%base class representing an annotationiicCs>||_||_|||_||_||_||_dS(N( sidsselfsdbsstopsstartsparents _anno_seqs _anno_startspath(sselfsidsdbsparentsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__'s      sannotationTypecCst|tƒ odSnt|i|iƒdjoS|i|ijo|i|ijo)t|i|i f|i|i fƒSqˆnt SdS(Niÿÿÿÿi( s isinstancesothers AnnotationSeqscmpsselfssequencesidsdbsstartsstopsNOT_ON_SAME_PATH(sselfsother((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__cmp__3s &-cCstdƒ‚dS(Ns”this is an annotation, and you cannot get a sequence string from it. Use its sequence attribute to get a sequence object representing this interval.(s ValueError(sselfsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysstrslice;s(s__name__s __module__s__doc__sstartssteps orientations__init__sgetAnnotationAttrs __getattr__sAnnotationSeqDescrssequences classutilsDBAttributeDescrsannotationTypesAnnotationSeqtypeDescrs_seqtypesannotation_reprs__repr__s__cmp__sstrslice(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys AnnotationSeq"s     sAnnotationSlicecBs2tZdZeZeƒZeidƒZ e Z RS(s$represents subslice of an annotationsannotationType( s__name__s __module__s__doc__sgetAnnotationAttrs __getattr__sAnnotationSliceDescrssequences classutilsDBAttributeDescrsannotationTypesannotation_reprs__repr__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSlice?s  sTranslationAnnotSeqDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCst|i|i|iƒSdS(N(s absoluteSlicesobjs _anno_seqs _anno_starts _anno_stop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__Hs(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSeqDescrFs sTranslationAnnotFrameDescrcBstZdZd„ZRS(sDGet the frame of this protein translation, relative to original DNA.cCsM|ii}|idjo|idd}n|iddd S|SdS(Niii(sobjs pathForwardssequencesorigs orientationsstartsframe(sselfsobjsobjtypesframesorig((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__Ms  (s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotFrameDescrKs sTranslationAnnotcBs8tZdZd„ZeƒZeƒZeZ d„Z RS(sEannotation representing aa translation of a given nucleotide intervalcCs8ti||||||ƒ|id:_||_dS(Ni( s AnnotationSeqs__init__sselfsidsdbsparentsstartsstops _anno_stop(sselfsidsdbsparentsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__WscCsNy |i}Wn/tj o#tt|iƒƒ}|_nX|||!SdS(s,get the aa translation of our associated ORFN( sselfs _translationsaasAttributeErrors translate_orfsstrssequencesstartsstop(sselfsstartsstopsaa((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysstrslice^s  !( s__name__s __module__s__doc__s__init__sTranslationAnnotSeqDescrssequencesTranslationAnnotFrameDescrsframesPROTEIN_SEQTYPEs_seqtypesstrslice(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotUs    sTranslationAnnotSliceDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs(t|iid|id|iƒSdS(Ni(s relativeSlicesobjs pathForwardssequencesstartsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__hs(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSliceDescrfs sTranslationAnnotSlicecBstZeƒZeƒZRS(N(s__name__s __module__sTranslationAnnotSliceDescrssequencesTranslationAnnotFrameDescrsframe(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSliceks s AnnotationDBcBs|tZdZeeeeeeeed„Zei Z ei Z e ddddddddddddd dd dƒZd „Zd „Zd „Zd„Zd„Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zededeed„Z d„Z!d„Z"d „Z#d!„Z$ed"„Z%d#„Z&d$„Z'd%„Z(d&„Z)RS('s;container of annotations as specific slices of db sequencesc Ks9| oti| ƒ|_n h|_| |_|tjo h}n|tj o ||_nti| |_||_ ||_ ||_ ||_ ||_|tj o ||_n| ouy-t|ƒiƒ} |i| |i| ƒWq5tj o#td| t|ƒfƒ‚q5tj oq5XndS(scsliceDB must map identifier to a sliceInfo object; sliceInfo must have attributes: id, start, stop, orientation; seqDB must map sequence ID to a sliceable sequence object; sliceAttrDict gives optional dict of item attributes that should be mapped to sliceDB item attributes. maxCache specfies the maximum number of annotation objects to keep in the cache.sKcannot create annotation object %s; sequence database %s may not be correctN(sautoGCs classutilsRecentValueDictionarysselfs_weakValueDicts sliceAttrDictsNonessliceDBsget_shelve_or_dictskwargssseqDBsannotationTypes itemClasssitemSliceClasssmaxCaches checkFirstIDsitersnextsks get_annot_objsKeyErrorsreprs StopIteration( sselfssliceDBsseqDBsannotationTypes itemClasssitemSliceClasss itemAttrDicts sliceAttrDictsmaxCachesautoGCs checkFirstIDskwargssk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__rs2               ssliceDBisseqDBsannotationTypesautoGCs itemClasssitemSliceClasss sliceAttrDictsmaxCachecCst|ƒSdS(s1ALLOW THIS OBJECT TO BE USED AS A KEY IN DICTS...N(sidsself(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__hash__žscCs@y|i|SWntj onX|i||i|ƒSdS(sget annotation object by its IDN(sselfs_weakValueDictsksKeyErrorssliceAnnotationssliceDB(sselfsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getitem__¡s cCstdƒ‚dS(Nsêyou cannot save annotations directly using annoDB[k] = v Instead, use annoDB.new_annotation(k,sliceInfo) where sliceInfo provides a sequence ID, start, stop (and any additional info desired), and will be saved directly to the sliceDB.(sKeyError(sselfsksv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __setitem__¨scCsgy|i|}Wn tj ot||ƒSnXyt||ƒSWntj o||SnXdS(N(sselfs sliceAttrDictsattrsksKeyErrorsgetattrs sliceInfos TypeError(sselfs sliceInfosattrsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys getSliceAttr­scCst|i|dƒƒ}t|i|dƒƒ}yT|i|dƒ}t|ƒ}|djo |djo| | f\}}nWnttfj onX||jotd|||fƒ‚n|i|dƒ}|i |}|i |||||ƒSdS(s8create an annotation object based on the input sliceInfosstartsstops orientationis2annotation %s has zero or negative length [%s:%s]!sidN(sintsselfs getSliceAttrs sliceInfosstartsstops orientationsAttributeErrors IndexErrorsksseq_idsseqDBsseqs itemClass(sselfsks sliceInfos orientationsseqsseq_idsstopsstart((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys get_annot_obj¶s   cCsr|i||ƒ}y5|o|it|iƒjo|ii ƒnWnt j onX||i|<|SdS(screate annotation and cache itN( sselfs get_annot_objsks sliceInfosas limitCachesmaxCacheslens_weakValueDictsclearsAttributeError(sselfsks sliceInfos limitCachesa((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyssliceAnnotationÉs  cCsY|i||ƒ}y||i|scCs td‚dS(Nsnonsensical in AnnotationDB(sNotImplementedError(sselfsother((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysupdate@scCs td‚dS(Nsno deletions allowed(sNotImplementedError(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysclearDscCs td‚dS(Nsno deletions allowed(sNotImplementedError(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyspopFscCs td‚dS(Nsno deletions allowed(sNotImplementedError(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyspopitemHs(*s__name__s __module__s__doc__sNones AnnotationSeqsAnnotationSlicesTrues__init__s classutilsstandard_getstates __getstate__sstandard_setstates __setstate__sdicts _pickleAttrss__hash__s __getitem__s __setitem__s getSliceAttrs get_annot_objssliceAnnotationsnew_annotations foreignKeys __contains__s__len__s__iter__skeyss iteritemss itervaluessitemssvaluessFalses add_homologyscloses__del__s clear_cachescopys setdefaultsupdatesclearspopspopitem(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys AnnotationDBps@ !(               )      sAnnotationServercBsetZdZhdd<dd<dd<dd<dd<ddg}x-|iD]"}|i||i|ƒfƒqW|SdS(s&get all (key,tuple) pairs in one queryN(slsselfssliceDBsksappendsget_slice_tuple(sselfsksl((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysget_slice_items^s   cCs]y|i|}Wntj o dSnXy|i||ƒSWntj o dSnXdS(s0get the requested attribute of the requested keysN(sselfssliceDBsks sliceInfosKeyErrors getSliceAttrsattrsAttributeError(sselfsksattrs sliceInfo((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysget_annotation_attrds (s__name__s __module__s__doc__sxmlrpc_methodssget_slice_tuplesget_slice_itemssget_annotation_attr(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationServerKs <  sAnnotationClientSliceDBcBs_tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z RS( sproxy just queries the servercCs||_ti|ƒdS(N(sdbsselfsdicts__init__(sselfsdb((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__qs cCsyti||ƒSWnftj oZ|iii|ƒ}|djotdt |ƒƒ‚nti |||ƒ|SnXdS(Nssno such annotation: ( sdicts __getitem__sselfsksKeyErrorsdbsserversget_slice_tuplestsstrs __setitem__(sselfskst((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getitem__ts cCstdƒ‚dS(NsXMLRPC client is read-only(s ValueError(sselfsksv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __setitem__}scCs|iiiƒSdS(N(sselfsdbsserverskeys(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyskeys~scCst|iƒƒSdS(N(sitersselfskeys(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__iter__scCs|iiiƒSdS(N(sselfsdbsserversget_slice_items(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysitems€scCst|iƒƒSdS(N(sitersselfsitems(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys iteritemsscCs|iiiƒSdS(N(sselfsdbsservers__len__(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__len__‚scCs|iii|ƒSdS(N(sselfsdbsservers __contains__sk(sselfsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __contains__ƒs( s__name__s __module__s__doc__s__init__s __getitem__s __setitem__skeyss__iter__sitemss iteritemss__len__s __contains__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationClientSliceDBos        sAnnotationClientcBs2tZdZeeed„Zd„Zd„ZRS(sXMLRPC AnnotationDB clientc Ks|oti|ƒ|_n h|_||_dk}|i||ƒ|_ ||_||_||_ t |ƒ|_ ||_ ||_dS(N(sautoGCs classutilsRecentValueDictionarysselfs_weakValueDicts coordinatorsget_connectionsurlsnamesserversseqDBsAnnotationClientSliceDBssliceDBs itemClasssitemSliceClass( sselfsurlsnamesseqDBs itemClasssitemSliceClasssautoGCskwargss coordinator((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__‡s       c Cs/td|id|id|id|iƒSdS(NsurlsnamesseqDBsautoGC(sdictsselfsurlsnamesseqDBsautoGC(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getstate__–scCsª|djo |dSnŽ|djo |dSnu|djo |dSn\|djotdƒ‚n?|ii|d|ƒ}|d jotd |ƒ‚n|SdS( Nsidisstartisstopis orientations ori not savedssthis annotation has no attr: (sattrs sliceInfosAttributeErrorsselfsserversget_annotation_attrsv(sselfs sliceInfosattrsv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys getSliceAttr™s     ( s__name__s __module__s__doc__s AnnotationSeqsAnnotationSlicesTrues__init__s __getstate__s getSliceAttr(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationClient…s  (s __future__s generatorsssequences classutilsUserDictsweakrefsgetAnnotationAttrsannotation_reprsobjectsAnnotationSeqDescrsAnnotationSliceDescrsAnnotationSeqtypeDescrsSeqPaths AnnotationSeqs SeqDBSlicesAnnotationSlicesTranslationAnnotSeqDescrsTranslationAnnotFrameDescrsTranslationAnnotsTranslationAnnotSliceDescrsTranslationAnnotSlices DictMixins AnnotationDBsAnnotationServersdictsAnnotationClientSliceDBsAnnotationClient(sTranslationAnnotSliceDescrsAnnotationSeqDescrsAnnotationSlicesAnnotationSliceDescrsTranslationAnnotSeqDescrsTranslationAnnots generatorssTranslationAnnotSlices classutilsUserDictsAnnotationClientSliceDBsTranslationAnnotFrameDescrsAnnotationSeqtypeDescrsgetAnnotationAttrsAnnotationServers AnnotationSeqsAnnotationClients AnnotationDBsweakrefsannotation_repr((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys?s(       Û$PKŒ.; ¨Põqõqpygr/annotation.pyo;ò ɪJc@sdklZdkTdkZdkZdkZd„Zd„Zdefd„ƒYZ defd„ƒYZ d efd „ƒYZ d e fd „ƒYZ d efd„ƒYZdefd„ƒYZdefd„ƒYZde fd„ƒYZdefd„ƒYZdefd„ƒYZdeeifd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZdS(!(s generators(s*NcCs$|ii|ii|i|ƒSdS(s1forward attributes from slice object if availableN(sselfsdbs getSliceAttrssliceDBsidsattr(sselfsattr((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysgetAnnotationAttrscCsw|itj o |i}nd}|idjo!d||i|i|ifSn d||i|i |i fSdS(Nsannotis %s%s[%d:%d]s -%s%s[%d:%d](sselfsannotationTypesNonestitles orientationsidsstartsstop(sselfstitle((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysannotation_repr s  !sAnnotationSeqDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs$t|i|i|i|iƒSdS(N(s absoluteSlicesobjs _anno_seqs _anno_startsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSeqDescrs sAnnotationSliceDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs t|ii|i|iƒSdS(N(s relativeSlicesobjs pathForwardssequencesstartsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSliceDescrs sAnnotationSeqtypeDescrcBstZdZd„ZRS(sEget seqtype of the sequence interval corresponding to this annotationcCs|iiƒSdS(N(sobjs _anno_seqsseqtype(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSeqtypeDescrs s AnnotationSeqcBshtZdZdZdZdZd„ZeZe ƒZ e i dƒZ eƒZeZd„Zd„ZRS(s%base class representing an annotationiicCs>||_||_|||_||_||_||_dS(N( sidsselfsdbsstopsstartsparents _anno_seqs _anno_startspath(sselfsidsdbsparentsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__'s      sannotationTypecCst|tƒ odSnt|i|iƒdjoS|i|ijo|i|ijo)t|i|i f|i|i fƒSqˆnt SdS(Niÿÿÿÿi( s isinstancesothers AnnotationSeqscmpsselfssequencesidsdbsstartsstopsNOT_ON_SAME_PATH(sselfsother((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__cmp__3s &-cCstdƒ‚dS(Ns”this is an annotation, and you cannot get a sequence string from it. Use its sequence attribute to get a sequence object representing this interval.(s ValueError(sselfsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysstrslice;s(s__name__s __module__s__doc__sstartssteps orientations__init__sgetAnnotationAttrs __getattr__sAnnotationSeqDescrssequences classutilsDBAttributeDescrsannotationTypesAnnotationSeqtypeDescrs_seqtypesannotation_reprs__repr__s__cmp__sstrslice(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys AnnotationSeq"s     sAnnotationSlicecBs2tZdZeZeƒZeidƒZ e Z RS(s$represents subslice of an annotationsannotationType( s__name__s __module__s__doc__sgetAnnotationAttrs __getattr__sAnnotationSliceDescrssequences classutilsDBAttributeDescrsannotationTypesannotation_reprs__repr__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSlice?s  sTranslationAnnotSeqDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCst|i|i|iƒSdS(N(s absoluteSlicesobjs _anno_seqs _anno_starts _anno_stop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__Hs(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSeqDescrFs sTranslationAnnotFrameDescrcBstZdZd„ZRS(sDGet the frame of this protein translation, relative to original DNA.cCsM|ii}|idjo|idd}n|iddd S|SdS(Niii(sobjs pathForwardssequencesorigs orientationsstartsframe(sselfsobjsobjtypesframesorig((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__Ms  (s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotFrameDescrKs sTranslationAnnotcBs8tZdZd„ZeƒZeƒZeZ d„Z RS(sEannotation representing aa translation of a given nucleotide intervalcCs8ti||||||ƒ|id:_||_dS(Ni( s AnnotationSeqs__init__sselfsidsdbsparentsstartsstops _anno_stop(sselfsidsdbsparentsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__WscCsNy |i}Wn/tj o#tt|iƒƒ}|_nX|||!SdS(s,get the aa translation of our associated ORFN( sselfs _translationsaasAttributeErrors translate_orfsstrssequencesstartsstop(sselfsstartsstopsaa((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysstrslice^s  !( s__name__s __module__s__doc__s__init__sTranslationAnnotSeqDescrssequencesTranslationAnnotFrameDescrsframesPROTEIN_SEQTYPEs_seqtypesstrslice(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotUs    sTranslationAnnotSliceDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs(t|iid|id|iƒSdS(Ni(s relativeSlicesobjs pathForwardssequencesstartsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__hs(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSliceDescrfs sTranslationAnnotSlicecBstZeƒZeƒZRS(N(s__name__s __module__sTranslationAnnotSliceDescrssequencesTranslationAnnotFrameDescrsframe(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSliceks s AnnotationDBcBs|tZdZeeeeeeeed„Zei Z ei Z e ddddddddddddd dd dƒZd „Zd „Zd „Zd„Zd„Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zededeed„Z d„Z!d„Z"d „Z#d!„Z$ed"„Z%d#„Z&d$„Z'd%„Z(d&„Z)RS('s;container of annotations as specific slices of db sequencesc Ks9| oti| ƒ|_n h|_| |_|tjo h}n|tj o ||_nti| |_||_ ||_ ||_ ||_ ||_|tj o ||_n| ouy-t|ƒiƒ} |i| |i| ƒWq5tj o#td| t|ƒfƒ‚q5tj oq5XndS(scsliceDB must map identifier to a sliceInfo object; sliceInfo must have attributes: id, start, stop, orientation; seqDB must map sequence ID to a sliceable sequence object; sliceAttrDict gives optional dict of item attributes that should be mapped to sliceDB item attributes. maxCache specfies the maximum number of annotation objects to keep in the cache.sKcannot create annotation object %s; sequence database %s may not be correctN(sautoGCs classutilsRecentValueDictionarysselfs_weakValueDicts sliceAttrDictsNonessliceDBsget_shelve_or_dictskwargssseqDBsannotationTypes itemClasssitemSliceClasssmaxCaches checkFirstIDsitersnextsks get_annot_objsKeyErrorsreprs StopIteration( sselfssliceDBsseqDBsannotationTypes itemClasssitemSliceClasss itemAttrDicts sliceAttrDictsmaxCachesautoGCs checkFirstIDskwargssk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__rs2               ssliceDBisseqDBsannotationTypesautoGCs itemClasssitemSliceClasss sliceAttrDictsmaxCachecCst|ƒSdS(s1ALLOW THIS OBJECT TO BE USED AS A KEY IN DICTS...N(sidsself(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__hash__žscCs@y|i|SWntj onX|i||i|ƒSdS(sget annotation object by its IDN(sselfs_weakValueDictsksKeyErrorssliceAnnotationssliceDB(sselfsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getitem__¡s cCstdƒ‚dS(Nsêyou cannot save annotations directly using annoDB[k] = v Instead, use annoDB.new_annotation(k,sliceInfo) where sliceInfo provides a sequence ID, start, stop (and any additional info desired), and will be saved directly to the sliceDB.(sKeyError(sselfsksv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __setitem__¨scCsgy|i|}Wn tj ot||ƒSnXyt||ƒSWntj o||SnXdS(N(sselfs sliceAttrDictsattrsksKeyErrorsgetattrs sliceInfos TypeError(sselfs sliceInfosattrsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys getSliceAttr­scCst|i|dƒƒ}t|i|dƒƒ}yT|i|dƒ}t|ƒ}|djo |djo| | f\}}nWnttfj onX||jotd|||fƒ‚n|i|dƒ}|i |}|i |||||ƒSdS(s8create an annotation object based on the input sliceInfosstartsstops orientationis2annotation %s has zero or negative length [%s:%s]!sidN(sintsselfs getSliceAttrs sliceInfosstartsstops orientationsAttributeErrors IndexErrorsksseq_idsseqDBsseqs itemClass(sselfsks sliceInfos orientationsseqsseq_idsstopsstart((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys get_annot_obj¶s   cCsr|i||ƒ}y5|o|it|iƒjo|ii ƒnWnt j onX||i|<|SdS(screate annotation and cache itN( sselfs get_annot_objsks sliceInfosas limitCachesmaxCacheslens_weakValueDictsclearsAttributeError(sselfsks sliceInfos limitCachesa((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyssliceAnnotationÉs  cCsY|i||ƒ}y||i|scCs td‚dS(Nsnonsensical in AnnotationDB(sNotImplementedError(sselfsother((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysupdate@scCs td‚dS(Nsno deletions allowed(sNotImplementedError(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysclearDscCs td‚dS(Nsno deletions allowed(sNotImplementedError(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyspopFscCs td‚dS(Nsno deletions allowed(sNotImplementedError(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyspopitemHs(*s__name__s __module__s__doc__sNones AnnotationSeqsAnnotationSlicesTrues__init__s classutilsstandard_getstates __getstate__sstandard_setstates __setstate__sdicts _pickleAttrss__hash__s __getitem__s __setitem__s getSliceAttrs get_annot_objssliceAnnotationsnew_annotations foreignKeys __contains__s__len__s__iter__skeyss iteritemss itervaluessitemssvaluessFalses add_homologyscloses__del__s clear_cachescopys setdefaultsupdatesclearspopspopitem(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys AnnotationDBps@ !(               )      sAnnotationServercBsetZdZhdd<dd<dd<dd<dd<ddg}x-|iD]"}|i||i|ƒfƒqW|SdS(s&get all (key,tuple) pairs in one queryN(slsselfssliceDBsksappendsget_slice_tuple(sselfsksl((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysget_slice_items^s   cCs]y|i|}Wntj o dSnXy|i||ƒSWntj o dSnXdS(s0get the requested attribute of the requested keysN(sselfssliceDBsks sliceInfosKeyErrors getSliceAttrsattrsAttributeError(sselfsksattrs sliceInfo((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysget_annotation_attrds (s__name__s __module__s__doc__sxmlrpc_methodssget_slice_tuplesget_slice_itemssget_annotation_attr(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationServerKs <  sAnnotationClientSliceDBcBs_tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z RS( sproxy just queries the servercCs||_ti|ƒdS(N(sdbsselfsdicts__init__(sselfsdb((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__qs cCsyti||ƒSWnftj oZ|iii|ƒ}|djotdt |ƒƒ‚nti |||ƒ|SnXdS(Nssno such annotation: ( sdicts __getitem__sselfsksKeyErrorsdbsserversget_slice_tuplestsstrs __setitem__(sselfskst((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getitem__ts cCstdƒ‚dS(NsXMLRPC client is read-only(s ValueError(sselfsksv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __setitem__}scCs|iiiƒSdS(N(sselfsdbsserverskeys(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyskeys~scCst|iƒƒSdS(N(sitersselfskeys(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__iter__scCs|iiiƒSdS(N(sselfsdbsserversget_slice_items(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysitems€scCst|iƒƒSdS(N(sitersselfsitems(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys iteritemsscCs|iiiƒSdS(N(sselfsdbsservers__len__(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__len__‚scCs|iii|ƒSdS(N(sselfsdbsservers __contains__sk(sselfsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __contains__ƒs( s__name__s __module__s__doc__s__init__s __getitem__s __setitem__skeyss__iter__sitemss iteritemss__len__s __contains__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationClientSliceDBos        sAnnotationClientcBs2tZdZeeed„Zd„Zd„ZRS(sXMLRPC AnnotationDB clientc Ks|oti|ƒ|_n h|_||_dk}|i||ƒ|_ ||_||_||_ t |ƒ|_ ||_ ||_dS(N(sautoGCs classutilsRecentValueDictionarysselfs_weakValueDicts coordinatorsget_connectionsurlsnamesserversseqDBsAnnotationClientSliceDBssliceDBs itemClasssitemSliceClass( sselfsurlsnamesseqDBs itemClasssitemSliceClasssautoGCskwargss coordinator((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__‡s       c Cs/td|id|id|id|iƒSdS(NsurlsnamesseqDBsautoGC(sdictsselfsurlsnamesseqDBsautoGC(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getstate__–scCsª|djo |dSnŽ|djo |dSnu|djo |dSn\|djotdƒ‚n?|ii|d|ƒ}|d jotd |ƒ‚n|SdS( Nsidisstartisstopis orientations ori not savedssthis annotation has no attr: (sattrs sliceInfosAttributeErrorsselfsserversget_annotation_attrsv(sselfs sliceInfosattrsv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys getSliceAttr™s     ( s__name__s __module__s__doc__s AnnotationSeqsAnnotationSlicesTrues__init__s __getstate__s getSliceAttr(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationClient…s  (s __future__s generatorsssequences classutilsUserDictsweakrefsgetAnnotationAttrsannotation_reprsobjectsAnnotationSeqDescrsAnnotationSliceDescrsAnnotationSeqtypeDescrsSeqPaths AnnotationSeqs SeqDBSlicesAnnotationSlicesTranslationAnnotSeqDescrsTranslationAnnotFrameDescrsTranslationAnnotsTranslationAnnotSliceDescrsTranslationAnnotSlices DictMixins AnnotationDBsAnnotationServersdictsAnnotationClientSliceDBsAnnotationClient(sTranslationAnnotSliceDescrsAnnotationSeqDescrsAnnotationSlicesAnnotationSliceDescrsTranslationAnnotSeqDescrsTranslationAnnots generatorssTranslationAnnotSlices classutilsUserDictsAnnotationClientSliceDBsTranslationAnnotFrameDescrsAnnotationSeqtypeDescrsgetAnnotationAttrsAnnotationServers AnnotationSeqsAnnotationClients AnnotationDBsweakrefsannotation_repr((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys?s(       Û$PK`x+;¸¤•TT pygr/blast.pyimport os, tempfile, glob import classutil, logger from sequtil import * from parse_blast import BlastHitParser from seqdb import write_fasta, read_fasta from nlmsa_utils import CoordsGroupStart, CoordsGroupEnd, CoordsToIntervals,\ EmptySlice from annotation import AnnotationDB, TranslationAnnot, TranslationAnnotSlice import cnestedlist import translationDB import UserDict # NCBI HAS THE NASTY HABIT OF TREATING THE IDENTIFIER AS A BLOB INTO # WHICH THEY STUFF FIELD AFTER FIELD... E.G. gi|1234567|foobarU|NT_1234567|... # THIS JUST YANKS OUT THE SECOND ARGUMENT SEPARATED BY | NCBI_ID_PARSER=lambda id:id.split('|')[1] def blast_program(query_type,db_type): progs= {DNA_SEQTYPE:{DNA_SEQTYPE:'blastn', PROTEIN_SEQTYPE:'blastx'}, PROTEIN_SEQTYPE:{DNA_SEQTYPE:'tblastn', PROTEIN_SEQTYPE:'blastp'}} if query_type == RNA_SEQTYPE: query_type = DNA_SEQTYPE if db_type == RNA_SEQTYPE: db_type = DNA_SEQTYPE return progs[query_type][db_type] def read_blast_alignment(ofile, srcDB, destDB, al=None, pipeline=None, translateSrc=False, translateDest=False): """Apply sequence of transforms to read input from 'ofile'. srcDB: database for finding query sequences from the blast input; destDB: database for finding subject sequences from the blast input; al, if not None, must be a writeable alignment object in which to store the alignment intervals; translateSrc=True forces creation of a TranslationDB representing the possible 6-frames of srcDB (for blastx, tblastx); translateDest=True forces creation of a TranslationDB representing the possible 6-frames of destDB (for tblastn, tblastx). If pipeline is not None, it must be a list of filter functions each taking a single argument and returning an iterator or iterable result object. """ p = BlastHitParser() d = dict(id='src_id', start='src_start', stop='src_end', ori='src_ori', idDest='dest_id', startDest='dest_start', stopDest='dest_end', oriDest='dest_ori') if translateSrc: srcDB = translationDB.get_translation_db(srcDB) if translateDest: destDB = translationDB.get_translation_db(destDB) cti = CoordsToIntervals(srcDB, destDB, d) alignedIvals = cti(p.parse_file(ofile)) if pipeline is None: result = save_interval_alignment(alignedIvals, al) else: # apply all the filters in our pipeline one by one result = alignedIvals for f in pipeline: result = f(result) return result def save_interval_alignment(alignedIvals, al=None): """Save alignedIvals to al, or a new in-memory NLMSA""" needToBuild = False if al is None: al = cnestedlist.NLMSA('blasthits', 'memory', pairwiseMode=True, bidirectional=False) needToBuild = True al.add_aligned_intervals(alignedIvals) if needToBuild: al.build() return al def start_blast(cmd, seq, seqString=None, seqDict=None, **kwargs): """Run blast and return results.""" p = classutil.FilePopen(cmd, stdin=classutil.PIPE, stdout=classutil.PIPE, **kwargs) if seqString is None: seqString = seq if seqDict is not None: # write all seqs to nonblocking ifile for seqID, seq in seqDict.iteritems(): write_fasta(p.stdin, seq) seqID = None else: # just write one query sequence seqID = write_fasta(p.stdin, seqString) if p.wait(): # blast returned error code raise OSError('command %s failed' % ' '.join(cmd)) return seqID, p def process_blast(cmd, seq, blastDB, al=None, seqString=None, queryDB=None, popenArgs={}, **kwargs): """Run blast and return an alignment.""" seqID,p = start_blast(cmd, seq, seqString, seqDict=queryDB, **popenArgs) try: if not queryDB: # need a query db for translation / parsing results try: queryDB = seq.db # use this sequence's database except AttributeError: queryDB = { seqID : seq } # construct a trivial "database" al = read_blast_alignment(p.stdout, queryDB, blastDB, al, **kwargs) finally: p.close() # close our PIPE files return al def repeat_mask(seq, progname='RepeatMasker', opts=()): 'Run RepeatMasker on a sequence, return lowercase-masked string' ## fd, temppath = tempfile.mkstemp() ## ofile = os.fdopen(fd, 'w') # text file p = classutil.FilePopen([progname] + list(opts), stdin=classutil.PIPE, stdinFlag=None) write_fasta(p.stdin, seq, reformatter=lambda x:x.upper()) # save uppercase! try: if p.wait(): raise OSError('command %s failed' % ' '.join(p.args[0])) ifile = file(p._stdin_path + '.masked', 'rU') # text file try: for id,title,seq_masked in read_fasta(ifile): break # JUST READ ONE SEQUENCE finally: ifile.close() finally: # clean up our temp files no matter what happened p.close() # close temp stdin file for fpath in glob.glob(p._stdin_path + '.*'): try: os.remove(fpath) except OSError: pass return seq_masked # ONLY THE REPEATS ARE IN LOWERCASE NOW def warn_if_whitespace(filepath): l = filepath.split() # check filepath for whitespace if len(l) > 1 or len(l[0]) < len(filepath): # contains whitespace logger.warn(""" Your sequence filepath contains whitespace characters: %s The NCBI formatdb (and blastall) programs cannot handle file paths containing whitespace! This is a known NCBI formatdb / blastall bug. Please use a path containing no whitespace characters!""" % filepath) return True # signal caller that a warning was issued class BlastMapping(object): 'Graph interface for mapping a sequence to homologs in a seq db via BLAST' def __init__(self, seqDB, filepath=None, blastReady=False, blastIndexPath=None, blastIndexDirs=None, verbose=True, showFormatdbMessages=True, **kwargs): '''seqDB: sequence database object to search for homologs filepath: location of FASTA format file for the sequence database blastReady: if True, ensure that BLAST index file ready to use blastIndexPath: location of the BLAST index file blastIndexDirs: list of directories for trying to build index in ''' self.seqDB = seqDB self.idIndex = BlastIDIndex(seqDB) self.verbose = verbose self.showFormatdbMessages = showFormatdbMessages if filepath is not None: self.filepath = filepath else: self.filepath = seqDB.filepath if blastIndexPath is not None: self.blastIndexPath = blastIndexPath if blastIndexDirs is not None: self.blastIndexDirs = blastIndexDirs self.checkdb() # CHECK WHETHER BLAST INDEX FILE IS PRESENT... if not self.blastReady and blastReady: # FORCE CONSTRUCTION OF BLAST DB self.formatdb() def __repr__(self): return "" % (self.filepath) def __getitem__(self, k): 'return NLMSASlice representing BLAST results' al = self.__call__(k) # run BLAST & get NLMSA storing results return al[k] # return NLMSASlice representing these results def test_db_location(self, testpath): '''check whether BLAST index files ready for use; return status.''' if not os.access(testpath+'.nsd',os.R_OK) \ and not os.access(testpath+'.psd',os.R_OK) \ and not os.access(testpath+'.00.nsd',os.R_OK) \ and not os.access(testpath+'.00.psd',os.R_OK): return False else: # FOUND INDEX FILES IN THIS LOCATION if testpath != self.filepath: self.blastIndexPath = testpath return True def checkdb(self): 'look for blast index files in blastIndexPath, standard list of locations' for testpath in self.blast_index_paths(): self.blastReady = self.test_db_location(testpath) if self.blastReady: break return self.blastReady def run_formatdb(self, testpath): 'ATTEMPT TO BUILD BLAST DATABASE INDEXES at testpath' dirname = classutil.file_dirpath(testpath) if not os.access(dirname, os.W_OK): # check if directory is writable raise IOError('run_formatdb: directory %s is not writable!' % dirname) cmd = ['formatdb', '-i', self.filepath, '-n', testpath, '-o', 'T'] if self.seqDB._seqtype != PROTEIN_SEQTYPE: cmd += ['-p', 'F'] # special flag required for nucleotide seqs logger.info('Building index: ' + ' '.join(cmd)) if self.showFormatdbMessages: kwargs = {} else: # suppress formatdb messages by redirecting them kwargs = dict(stdout=classutil.PIPE, stderr=classutil.PIPE) if classutil.call_subprocess(cmd, **kwargs): # bad exit code, so command failed warn_if_whitespace(self.filepath) \ or warn_if_whitespace(testpath) # only issue one warning raise OSError('command %s failed' % ' '.join(cmd)) self.blastReady=True if testpath!=self.filepath: self.blastIndexPath = testpath def get_blast_index_path(self): 'get path to base name for BLAST index files' try: return self.blastIndexPath except AttributeError: return self.filepath # DEFAULT: BUILD INDEX FILES IN self.filepath . HOME OR APPROPRIATE # USER-/SYSTEM-SPECIFIC TEMPORARY DIRECTORY blastIndexDirs = ['FILEPATH',os.getcwd,os.path.expanduser, tempfile.gettempdir()] def blast_index_paths(self): 'iterate over possible blast index directories' try: # 1ST TRY ACTUAL SAVED LOCATION IF ANY yield self.blastIndexPath except AttributeError: pass for m in self.blastIndexDirs: # NOW TRY STANDARD LOCATIONS if m=='FILEPATH': yield self.filepath continue elif m == os.path.expanduser: s = m('~') # GET HOME DIRECTORY elif callable(m): s = m() else: # TREAT AS STRING s = str(m) yield os.path.join(s,os.path.basename(self.filepath)) def formatdb(self, filepath=None): 'try to build BLAST index files in an appropriate location' if filepath is not None: # JUST USE THE SPECIFIED PATH return self.run_formatdb(filepath) notFirst = False for testpath in self.blast_index_paths(): if notFirst: logger.info('Trying next entry in self.blastIndexDirs...') notFirst = True try: # BUILD IN TARGET DIRECTORY return self.run_formatdb(testpath) except (IOError,OSError): # BUILD FAILED pass raise IOError, "cannot build BLAST database for %s" % (self.filepath,) def raw_fasta_stream(self, ifile=None, idFilter=None): '''Return a stream of fasta-formatted sequences. Optionally, apply an ID filter function if supplied. ''' if ifile is not None: # JUST USE THE STREAM WE ALREADY HAVE OPEN return ifile,idFilter try: # DEFAULT: JUST READ THE FASTA FILE, IF IT EXISTS return file(self.filepath, 'rU'),idFilter except IOError: # TRY READING FROM FORMATTED BLAST DATABASE cmd='fastacmd -D -d "%s"' % self.get_blast_index_path() return os.popen(cmd),NCBI_ID_PARSER #BLAST ADDS lcl| TO id _blast_prog_dict = dict(blastx='#BlastxMapping') def blast_program(self, seq, blastprog=None): 'figure out appropriate blast program & remap via _blast_prog_dict' if blastprog is None: blastprog = blast_program(seq.seqtype(), self.seqDB._seqtype) oldprog = blastprog try: # apply program transformation if provided blastprog = self._blast_prog_dict[blastprog] if blastprog.startswith('#'): # not permitted by this class! raise ValueError('Use %s for %s' % (blastprog[1:],oldprog)) except KeyError: pass # no program transformation to apply, so nothing to do... return blastprog def blast_command(self, blastpath, blastprog, expmax, maxseq, opts): 'generate command string for running blast with desired options' filepath = self.get_blast_index_path() warn_if_whitespace(filepath) cmd = [blastpath, '-d', filepath, '-p', blastprog, '-e', '%e' % float(expmax)] + list(opts) if maxseq is not None: # ONLY TAKE TOP maxseq HITS cmd += ['-b', '%d' % maxseq, '-v', '%d' % maxseq] return cmd def get_seq_from_queryDB(self, queryDB): 'get one sequence obj from queryDB' seqID = iter(queryDB).next() # get 1st seq ID return queryDB[seqID] def translation_kwargs(self, blastprog): 'return kwargs for read_blast_alignment() based on blastprog' d = dict(tblastn=dict(translateDest=True), blastx=dict(translateSrc=True), tblastx=dict(translateSrc=True, translateDest=True)) try: return d[blastprog] except KeyError: return {} def __call__(self, seq=None, al=None, blastpath='blastall', blastprog=None, expmax=0.001, maxseq=None, verbose=None, opts=(), queryDB=None, **kwargs): "Run blast search for seq in database, return alignment object" if seq is None and queryDB is None: raise ValueError("we need a sequence or db to use as query!") if seq and queryDB: raise ValueError("both a sequence AND a db provided for query") if queryDB is not None: seq = self.get_seq_from_queryDB(queryDB) if not self.blastReady: # HAVE TO BUILD THE formatdb FILES... self.formatdb() blastprog = self.blast_program(seq, blastprog) cmd = self.blast_command(blastpath, blastprog, expmax, maxseq, opts) return process_blast(cmd, seq, self.idIndex, al, queryDB=queryDB, ** self.translation_kwargs(blastprog)) class BlastxMapping(BlastMapping): """Because blastx changes the query to multiple sequences (representing its six possible frames), getitem can no longer return a single slice object, but instead an iterator for one or more slice objects representing the frames that had homology hits.""" def __repr__(self): return "" % (self.filepath) _blast_prog_dict = dict(blastn='tblastx', blastp='#BlastMapping', tblastn='#BlastMapping') def __getitem__(self, query): """generate slices for all translations of the query """ # generate NLMSA for this single sequence al = self(query) # get the translation database for the sequence tdb = translationDB.get_translation_db(query.db) # run through all of the frames & find alignments. slices = [] for trans_seq in tdb[query.id].iter_frames(): try: slice = al[trans_seq] except KeyError: continue if not isinstance(slice, EmptySlice): slices.append(slice) return slices class MegablastMapping(BlastMapping): def __repr__(self): return "" % (self.filepath) def __call__(self, seq, al=None, blastpath='megablast', expmax=1e-20, maxseq=None, minIdentity=None, maskOpts=['-U', 'T', '-F', 'm'], rmPath='RepeatMasker', rmOpts=['-xsmall'], verbose=None, opts=(), **kwargs): "Run megablast search with optional repeat masking." if not self.blastReady: # HAVE TO BUILD THE formatdb FILES... self.formatdb() # mask repeats to lowercase masked_seq = repeat_mask(seq,rmPath,rmOpts) filepath = self.get_blast_index_path() warn_if_whitespace(filepath) cmd = [blastpath] + maskOpts \ + ['-d', filepath, '-D', '2', '-e', '%e' % float(expmax)] + list(opts) if maxseq is not None: # ONLY TAKE TOP maxseq HITS cmd += ['-b', '%d' % maxseq, '-v', '%d' % maxseq] if minIdentity is not None: cmd += ['-p', '%f' % float(minIdentity)] return process_blast(cmd, seq, self.idIndex, al, seqString=masked_seq, popenArgs=dict(stdinFlag='-i')) class BlastIDIndex(object): """This class acts as a wrapper around a regular seqDB, and handles the mangled IDs returned by BLAST to translate them to the correct ID. Since NCBI treats FASTA ID as a blob into which they like to stuff many fields... and then NCBI BLAST mangles those IDs when it reports hits, so they no longer match the true ID... we are forced into contortions to rescue the true ID from mangled IDs. Our workaround strategy: since NCBI packs the FASTA ID with multiple IDs (GI, GB, RefSeq ID etc.), we can use any of these identifiers that are found in a mangled ID, by storing a mapping of these sub-identifiers to the true FASTA ID.""" def __init__(self, seqDB): self.seqDB = seqDB self.seqInfoDict = BlastIDInfoDict(self) # FOR UNPACKING NCBI IDENTIFIERS AS WORKAROUND FOR BLAST ID CRAZINESS id_delimiter='|' def unpack_id(self,id): """Return |-packed NCBI identifiers as unpacked list. NCBI packs identifier like gi|123456|gb|A12345|other|nonsense. Return as list.""" return id.split(self.id_delimiter) def index_unpacked_ids(self,unpack_f=None): """Build an index of sub-IDs (unpacked from NCBI nasty habit of using the FASTA ID as a blob); you can customize the unpacking by overriding the unpack_id function or changing the id_delimiter. The index maps each sub-ID to the real ID, so that when BLAST hands back a mangled, fragmentary ID, we can unpack that mangled ID and look up the true ID in this index. Any sub-ID that is found to map to more than one true ID will be mapped to None (so that random NCBI garbage like gnl or NCBI_MITO wont be treated as sub-IDs). """ if unpack_f is None: unpack_f=self.unpack_id t={} for id in self.seqDB: for s in unpack_f(id): if s==id: continue # DON'T STORE TRIVIAL MAPPINGS!! s=s.upper() # NCBI FORCES ID TO UPPERCASE?!?! try: if t[s]!=id and t[s] is not None: t[s]=None # s NOT UNIQUE, CAN'T BE AN IDENTIFIER!! except KeyError: t[s]=id # s UNIQUE, TRY USING s AS AN IDENTIFIER for id in t.itervalues(): if id is not None: # OK THERE ARE REAL MAPPINGS STORED, SO USE THIS self._unpacked_dict=t # SAVE THE MAPPING TO REAL IDENTIFIERS return # NO NON-TRIVIAL MAPPINGS, SO JUST SAVE EMPTY MAPPING self._unpacked_dict={} def get_real_id(self,bogusID,unpack_f=None): "try to translate an id that NCBI has mangled to the real sequence id" if unpack_f is None: unpack_f=self.unpack_id if not hasattr(self,'_unpacked_dict'): self.index_unpacked_ids(unpack_f) for s in unpack_f(bogusID): s=s.upper() # NCBI FORCES ID TO UPPERCASE?!?! try: id=self._unpacked_dict[s] if id is not None: return id # OK, FOUND A MAPPING TO REAL ID except KeyError: pass # KEEP TRYING... # FOUND NO MAPPING, SO RAISE EXCEPTION raise KeyError, "no key '%s' in database %s" % (bogusID, repr(self.seqDB)) def __getitem__(self, seqID): "If seqID is mangled by BLAST, use our index to get correct ID" try: # default: treat as a correct ID return self.seqDB[seqID] except KeyError: # translate to the correct ID return self.seqDB[self.get_real_id(seqID)] def __contains__(self, seqID): try: self.seqInfoDict[seqID] return True except KeyError: return False class BlastIDInfoDict(object, UserDict.DictMixin): """provide seqInfoDict interface for BlastIDIndex """ def __init__(self, db): self.blastDB = db def __getitem__(self, seqID): try: return self.blastDB.seqDB.seqInfoDict[seqID] except KeyError: seqID = self.blastDB.get_real_id(seqID) return self.blastDB.seqDB.seqInfoDict[seqID] def __len__(self): return len(self.blastDB.seqDB.seqInfoDict) def __iter__(self): return iter(self.blastDB.seqDB.seqInfoDict) def keys(self): return self.blastDB.seqDB.seqInfoDict.keys() PKŒ.;ÛY¶íéhéhpygr/blast.pyc;ò ɪJc@sŽdkZdkZdkZdkZdkZdkTdklZdkl Z l Z dk l Z l Z lZlZdklZlZlZdkZdkZdkZd„Zd„Zeeeed„Zed „Zeed „Zeeehd „Zd fd „Zd„Z de!fd„ƒYZ"de"fd„ƒYZ#de"fd„ƒYZ$de!fd„ƒYZ%de!ei&fd„ƒYZ'dS(N(s*(sBlastHitParser(s write_fastas read_fasta(sCoordsGroupStartsCoordsGroupEndsCoordsToIntervalss EmptySlice(s AnnotationDBsTranslationAnnotsTranslationAnnotSlicecCs|idƒdS(Ns|i(sidssplit(sid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysscCszhthtd<td<<thtd<td<<}|tjo t}n|tjo t}n|||SdS(Nsblastnsblastxstblastnsblastp(s DNA_SEQTYPEsPROTEIN_SEQTYPEsprogss query_types RNA_SEQTYPEsdb_type(s query_typesdb_typesprogs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_programs <    c Csètƒ} tddddddddd d d d d dddƒ}|oti|ƒ}n|oti|ƒ}nt |||ƒ} | | i |ƒƒ} |tjot| |ƒ} n$| } x|D]}|| ƒ} qÊW| SdS(sàApply sequence of transforms to read input from 'ofile'. srcDB: database for finding query sequences from the blast input; destDB: database for finding subject sequences from the blast input; al, if not None, must be a writeable alignment object in which to store the alignment intervals; translateSrc=True forces creation of a TranslationDB representing the possible 6-frames of srcDB (for blastx, tblastx); translateDest=True forces creation of a TranslationDB representing the possible 6-frames of destDB (for tblastn, tblastx). If pipeline is not None, it must be a list of filter functions each taking a single argument and returning an iterator or iterable result object. sidssrc_idsstarts src_startsstopssrc_endsorissrc_orisidDestsdest_ids startDests dest_startsstopDestsdest_endsoriDestsdest_oriN(sBlastHitParserspsdictsds translateSrcs translationDBsget_translation_dbssrcDBs translateDestsdestDBsCoordsToIntervalssctis parse_filesofiles alignedIvalsspipelinesNonessave_interval_alignmentsalsresultsf( sofilessrcDBsdestDBsalspipelines translateSrcs translateDestsdsfs alignedIvalsspsresultscti((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysread_blast_alignments$   cCset}|tjo(tidddtdtƒ}t}n|i|ƒ|o|i ƒn|SdS(s1Save alignedIvals to al, or a new in-memory NLMSAs blasthitssmemorys pairwiseModes bidirectionalN( sFalses needToBuildsalsNones cnestedlistsNLMSAsTruesadd_aligned_intervalss alignedIvalssbuild(s alignedIvalssals needToBuild((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyssave_interval_alignmentEs    cKsÉti|dtidti|}|tjo |}n|tj o7x*|i ƒD]\}}t |i |ƒqUWt}nt |i |ƒ}|iƒotddi|ƒƒ‚n||fSdS(sRun blast and return results.sstdinsstdoutscommand %s faileds N(s classutils FilePopenscmdsPIPEskwargssps seqStringsNonesseqsseqDicts iteritemssseqIDs write_fastasstdinswaitsOSErrorsjoin(scmdsseqs seqStringsseqDictskwargsspsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys start_blastQs$      c Ks”t|||d||\} }z]| o6y |i}Wqbt j oh| |<}qbXnt |i ||||}Wd|iƒX|SdS(s"Run blast and return an alignment.sseqDictN(s start_blastscmdsseqs seqStringsqueryDBs popenArgssseqIDspsdbsAttributeErrorsread_blast_alignmentsstdoutsblastDBsalskwargssclose( scmdsseqsblastDBsals seqStringsqueryDBs popenArgsskwargsspsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys process_blastas!  s RepeatMaskerc Cs ti|gt|ƒdtidtƒ}t|i |dd„ƒz~|i ƒo$t ddi |idƒƒ‚nt|idd ƒ}z%xt|ƒD]\}}}PqžWWd |iƒXWd |iƒxEti|id ƒD]-}yti|ƒWqæt j oqæXqæWX|Sd S( s>Run RepeatMasker on a sequence, return lowercase-masked stringsstdins stdinFlags reformattercCs |iƒS(N(sxsupper(sx((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysxsscommand %s faileds is.maskedsrUNs.*(s classutils FilePopensprognameslistsoptssPIPEsNonesps write_fastasstdinsseqswaitsOSErrorsjoinsargssfiles _stdin_pathsifiles read_fastasidstitles seq_maskedsclosesglobsfpathsossremove( sseqsprognamesoptsstitles seq_maskedsifilesfpathspsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys repeat_maskrs.  $    cCsY|iƒ}t|ƒdjpt|dƒt|ƒjotid|ƒtSndS(Niisù Your sequence filepath contains whitespace characters: %s The NCBI formatdb (and blastall) programs cannot handle file paths containing whitespace! This is a known NCBI formatdb / blastall bug. Please use a path containing no whitespace characters!(sfilepathssplitslslensloggerswarnsTrue(sfilepathsl((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyswarn_if_whitespace‹s 0s BlastMappingc BsþtZdZeeeeeed„Zd„Zd„Zd„Z d„Z d„Z d„Z de ie iieiƒgZd „Zed „Zeed „Zed d ƒZed„Zd„Zd„Zd„Zeededeefed„ ZRS(sHGraph interface for mapping a sequence to homologs in a seq db via BLASTc Ks²||_t|ƒ|_||_||_|tj o ||_n |i|_|tj o ||_n|tj o ||_ n|i ƒ|i o|o|i ƒndS(sRseqDB: sequence database object to search for homologs filepath: location of FASTA format file for the sequence database blastReady: if True, ensure that BLAST index file ready to use blastIndexPath: location of the BLAST index file blastIndexDirs: list of directories for trying to build index in N( sseqDBsselfs BlastIDIndexsidIndexsverbosesshowFormatdbMessagessfilepathsNonesblastIndexPathsblastIndexDirsscheckdbs blastReadysformatdb( sselfsseqDBsfilepaths blastReadysblastIndexPathsblastIndexDirssverbosesshowFormatdbMessagesskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__init__™s           cCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__±scCs|i|ƒ}||SdS(s,return NLMSASlice representing BLAST resultsN(sselfs__call__sksal(sselfsksal((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys __getitem__³scCs™ti|dtiƒ oNti|dtiƒ o3ti|dtiƒ oti|dtiƒ otSn"||ijo ||_ntSdS(s=check whether BLAST index files ready for use; return status.s.nsds.psds.00.nsds.00.psdN( sossaccessstestpathsR_OKsFalsesselfsfilepathsblastIndexPathsTrue(sselfstestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pystest_db_location·s l cCsCx5|iƒD]'}|i|ƒ|_|ioPq q W|iSdS(sHlook for blast index files in blastIndexPath, standard list of locationsN(sselfsblast_index_pathsstestpathstest_db_locations blastReady(sselfstestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyscheckdbÂs   cCs<ti|ƒ}ti|tiƒ otd|ƒ‚ndd|i d|ddg}|i i t jo|ddg7}ntid d i|ƒƒ|io h}ntd tid tiƒ}ti||o7t|i ƒp t|ƒtd d i|ƒƒ‚nt|_||i jo ||_ndS(s3ATTEMPT TO BUILD BLAST DATABASE INDEXES at testpaths+run_formatdb: directory %s is not writable!sformatdbs-is-ns-osTs-psFsBuilding index: s sstdoutsstderrscommand %s failedN(s classutils file_dirpathstestpathsdirnamesossaccesssW_OKsIOErrorsselfsfilepathscmdsseqDBs_seqtypesPROTEIN_SEQTYPEsloggersinfosjoinsshowFormatdbMessagesskwargssdictsPIPEscall_subprocessswarn_if_whitespacesOSErrorsTrues blastReadysblastIndexPath(sselfstestpathskwargsscmdsdirname((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys run_formatdbÉs"   cCs,y |iSWntj o|iSnXdS(s+get path to base name for BLAST index filesN(sselfsblastIndexPathsAttributeErrorsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysget_blast_index_pathßs  sFILEPATHccs¿y |iVWntj onXx—|iD]Œ}|djo|iVq+nJ|tiijo|dƒ}n't |ƒo |ƒ}n t |ƒ}tii |tii |iƒƒVq+WdS(s-iterate over possible blast index directoriessFILEPATHs~N(sselfsblastIndexPathsAttributeErrorsblastIndexDirssmsfilepathsosspaths expanduserssscallablesstrsjoinsbasename(sselfsmss((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysblast_index_pathsés       cCs|tj o|i|ƒSnt}x_|iƒD]Q}|oti dƒnt }y|i|ƒSWq1t t fj oq1Xq1Wt d|if‚dS(s9try to build BLAST index files in an appropriate locations+Trying next entry in self.blastIndexDirs...s"cannot build BLAST database for %sN( sfilepathsNonesselfs run_formatdbsFalsesnotFirstsblast_index_pathsstestpathsloggersinfosTruesIOErrorsOSError(sselfsfilepathsnotFirststestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysformatdbús   cCsr|tj o||fSnyt|idƒ|fSWn6tj o*d|iƒ}t i |ƒt fSnXdS(stReturn a stream of fasta-formatted sequences. Optionally, apply an ID filter function if supplied. srUsfastacmd -D -d "%s"N( sifilesNonesidFiltersfilesselfsfilepathsIOErrorsget_blast_index_pathscmdsosspopensNCBI_ID_PARSER(sselfsifilesidFilterscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysraw_fasta_stream s sblastxs#BlastxMappingcCs|tjot|iƒ|iiƒ}n|}y?|i |}|i dƒot d|d|fƒ‚nWnt j onX|SdS(sAfigure out appropriate blast program & remap via _blast_prog_dicts#s Use %s for %siN( s blastprogsNones blast_programsseqsseqtypesselfsseqDBs_seqtypesoldprogs_blast_prog_dicts startswiths ValueErrorsKeyError(sselfsseqs blastprogsoldprog((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_programs  "c Cs||iƒ}t|ƒ|d|d|ddt|ƒgt|ƒ}|t j o"|dd|dd|g7}n|SdS( s>generate command string for running blast with desired optionss-ds-ps-es%es-bs%ds-vN( sselfsget_blast_index_pathsfilepathswarn_if_whitespaces blastpaths blastprogsfloatsexpmaxslistsoptsscmdsmaxseqsNone(sselfs blastpaths blastprogsexpmaxsmaxseqsoptssfilepathscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_command%s  / "cCst|ƒiƒ}||SdS(s!get one sequence obj from queryDBN(sitersqueryDBsnextsseqID(sselfsqueryDBsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysget_seq_from_queryDB.sc Csftdtdtƒdtdtƒdtdtdtƒƒ}y ||SWntj o hSnXdS(s;return kwargs for read_blast_alignment() based on blastprogstblastns translateDestsblastxs translateSrcstblastxN(sdictsTruesds blastprogsKeyError(sselfs blastprogsd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pystranslation_kwargs3s sblastallf0.001c KsÚ|tjo | tjotdƒ‚n|o| otdƒ‚n| tj o|i| ƒ}n|i o|iƒn|i||ƒ}|i |||||ƒ} t| ||i|d| |i|ƒSdS(s=Run blast search for seq in database, return alignment objects)we need a sequence or db to use as query!s+both a sequence AND a db provided for querysqueryDBN(sseqsNonesqueryDBs ValueErrorsselfsget_seq_from_queryDBs blastReadysformatdbs blast_programs blastprogs blast_commands blastpathsexpmaxsmaxseqsoptsscmds process_blastsidIndexsalstranslation_kwargs( sselfsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptssqueryDBskwargsscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__call__<s  (s__name__s __module__s__doc__sNonesFalsesTrues__init__s__repr__s __getitem__stest_db_locationscheckdbs run_formatdbsget_blast_index_pathsossgetcwdspaths expanduserstempfiles gettempdirsblastIndexDirssblast_index_pathssformatdbsraw_fasta_streamsdicts_blast_prog_dicts blast_programs blast_commandsget_seq_from_queryDBstranslation_kwargss__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys BlastMapping—s$      !    s BlastxMappingcBs;tZdZd„ZeddddddƒZd„ZRS(sBecause blastx changes the query to multiple sequences (representing its six possible frames), getitem can no longer return a single slice object, but instead an iterator for one or more slice objects representing the frames that had homology hits.cCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__Sssblastnstblastxsblastps #BlastMappingstblastncCs“||ƒ}ti|iƒ}g}xd||ii ƒD]O}y||}Wnt j o q8nXt |tƒ o|i|ƒq8q8W|SdS(s2generate slices for all translations of the query N(sselfsquerysals translationDBsget_translation_dbsdbstdbsslicessids iter_framess trans_seqsslicesKeyErrors isinstances EmptySlicesappend(sselfsquerysslicesslicesstdbs trans_seqsal((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys __getitem__Ws (s__name__s __module__s__doc__s__repr__sdicts_blast_prog_dicts __getitem__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys BlastxMappingMs   sMegablastMappingc BsGtZd„Zeddeeddddgdd gefd „ ZRS( NcCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__lss megablastf9.9999999999999995e-21s-UsTs-Fsms RepeatMaskers-xsmallc  Ks|i o|iƒnt||| ƒ}|iƒ} t | ƒ|g|d| ddddt |ƒgt| ƒ}|tj o"|dd|dd|g7}n|tj o|d d t |ƒg7}nt|||i|d |d td dƒƒSdS(s2Run megablast search with optional repeat masking.s-ds-Ds2s-es%es-bs%ds-vs-ps%fs seqStrings popenArgss stdinFlags-iN(sselfs blastReadysformatdbs repeat_masksseqsrmPathsrmOptss masked_seqsget_blast_index_pathsfilepathswarn_if_whitespaces blastpathsmaskOptssfloatsexpmaxslistsoptsscmdsmaxseqsNones minIdentitys process_blastsidIndexsalsdict(sselfsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargssfilepaths masked_seqscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__call__ns   7 " (s__name__s __module__s__repr__sNones__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysMegablastMappingks s BlastIDIndexcBsPtZdZd„ZdZd„Zed„Zed„Zd„Z d„Z RS(s•This class acts as a wrapper around a regular seqDB, and handles the mangled IDs returned by BLAST to translate them to the correct ID. Since NCBI treats FASTA ID as a blob into which they like to stuff many fields... and then NCBI BLAST mangles those IDs when it reports hits, so they no longer match the true ID... we are forced into contortions to rescue the true ID from mangled IDs. Our workaround strategy: since NCBI packs the FASTA ID with multiple IDs (GI, GB, RefSeq ID etc.), we can use any of these identifiers that are found in a mangled ID, by storing a mapping of these sub-identifiers to the true FASTA ID.cCs||_t|ƒ|_dS(N(sseqDBsselfsBlastIDInfoDicts seqInfoDict(sselfsseqDB((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__init__’s s|cCs|i|iƒSdS(s’Return |-packed NCBI identifiers as unpacked list. NCBI packs identifier like gi|123456|gb|A12345|other|nonsense. Return as list.N(sidssplitsselfs id_delimiter(sselfsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys unpack_id—scCs|tjo |i}nh}xœ|iD]‘}xˆ||ƒD]z}||joq=n|iƒ}y4|||jo||tj ot||scCszhthtd<td<<thtd<td<<}|tjo t}n|tjo t}n|||SdS(Nsblastnsblastxstblastnsblastp(s DNA_SEQTYPEsPROTEIN_SEQTYPEsprogss query_types RNA_SEQTYPEsdb_type(s query_typesdb_typesprogs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_programs <    c Csètƒ} tddddddddd d d d d dddƒ}|oti|ƒ}n|oti|ƒ}nt |||ƒ} | | i |ƒƒ} |tjot| |ƒ} n$| } x|D]}|| ƒ} qÊW| SdS(sàApply sequence of transforms to read input from 'ofile'. srcDB: database for finding query sequences from the blast input; destDB: database for finding subject sequences from the blast input; al, if not None, must be a writeable alignment object in which to store the alignment intervals; translateSrc=True forces creation of a TranslationDB representing the possible 6-frames of srcDB (for blastx, tblastx); translateDest=True forces creation of a TranslationDB representing the possible 6-frames of destDB (for tblastn, tblastx). If pipeline is not None, it must be a list of filter functions each taking a single argument and returning an iterator or iterable result object. sidssrc_idsstarts src_startsstopssrc_endsorissrc_orisidDestsdest_ids startDests dest_startsstopDestsdest_endsoriDestsdest_oriN(sBlastHitParserspsdictsds translateSrcs translationDBsget_translation_dbssrcDBs translateDestsdestDBsCoordsToIntervalssctis parse_filesofiles alignedIvalsspipelinesNonessave_interval_alignmentsalsresultsf( sofilessrcDBsdestDBsalspipelines translateSrcs translateDestsdsfs alignedIvalsspsresultscti((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysread_blast_alignments$   cCset}|tjo(tidddtdtƒ}t}n|i|ƒ|o|i ƒn|SdS(s1Save alignedIvals to al, or a new in-memory NLMSAs blasthitssmemorys pairwiseModes bidirectionalN( sFalses needToBuildsalsNones cnestedlistsNLMSAsTruesadd_aligned_intervalss alignedIvalssbuild(s alignedIvalssals needToBuild((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyssave_interval_alignmentEs    cKsÉti|dtidti|}|tjo |}n|tj o7x*|i ƒD]\}}t |i |ƒqUWt}nt |i |ƒ}|iƒotddi|ƒƒ‚n||fSdS(sRun blast and return results.sstdinsstdoutscommand %s faileds N(s classutils FilePopenscmdsPIPEskwargssps seqStringsNonesseqsseqDicts iteritemssseqIDs write_fastasstdinswaitsOSErrorsjoin(scmdsseqs seqStringsseqDictskwargsspsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys start_blastQs$      c Ks”t|||d||\} }z]| o6y |i}Wqbt j oh| |<}qbXnt |i ||||}Wd|iƒX|SdS(s"Run blast and return an alignment.sseqDictN(s start_blastscmdsseqs seqStringsqueryDBs popenArgssseqIDspsdbsAttributeErrorsread_blast_alignmentsstdoutsblastDBsalskwargssclose( scmdsseqsblastDBsals seqStringsqueryDBs popenArgsskwargsspsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys process_blastas!  s RepeatMaskerc Cs ti|gt|ƒdtidtƒ}t|i |dd„ƒz~|i ƒo$t ddi |idƒƒ‚nt|idd ƒ}z%xt|ƒD]\}}}PqžWWd |iƒXWd |iƒxEti|id ƒD]-}yti|ƒWqæt j oqæXqæWX|Sd S( s>Run RepeatMasker on a sequence, return lowercase-masked stringsstdins stdinFlags reformattercCs |iƒS(N(sxsupper(sx((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysxsscommand %s faileds is.maskedsrUNs.*(s classutils FilePopensprognameslistsoptssPIPEsNonesps write_fastasstdinsseqswaitsOSErrorsjoinsargssfiles _stdin_pathsifiles read_fastasidstitles seq_maskedsclosesglobsfpathsossremove( sseqsprognamesoptsstitles seq_maskedsifilesfpathspsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys repeat_maskrs.  $    cCsY|iƒ}t|ƒdjpt|dƒt|ƒjotid|ƒtSndS(Niisù Your sequence filepath contains whitespace characters: %s The NCBI formatdb (and blastall) programs cannot handle file paths containing whitespace! This is a known NCBI formatdb / blastall bug. Please use a path containing no whitespace characters!(sfilepathssplitslslensloggerswarnsTrue(sfilepathsl((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyswarn_if_whitespace‹s 0s BlastMappingc BsþtZdZeeeeeed„Zd„Zd„Zd„Z d„Z d„Z d„Z de ie iieiƒgZd „Zed „Zeed „Zed d ƒZed„Zd„Zd„Zd„Zeededeefed„ ZRS(sHGraph interface for mapping a sequence to homologs in a seq db via BLASTc Ks²||_t|ƒ|_||_||_|tj o ||_n |i|_|tj o ||_n|tj o ||_ n|i ƒ|i o|o|i ƒndS(sRseqDB: sequence database object to search for homologs filepath: location of FASTA format file for the sequence database blastReady: if True, ensure that BLAST index file ready to use blastIndexPath: location of the BLAST index file blastIndexDirs: list of directories for trying to build index in N( sseqDBsselfs BlastIDIndexsidIndexsverbosesshowFormatdbMessagessfilepathsNonesblastIndexPathsblastIndexDirsscheckdbs blastReadysformatdb( sselfsseqDBsfilepaths blastReadysblastIndexPathsblastIndexDirssverbosesshowFormatdbMessagesskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__init__™s           cCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__±scCs|i|ƒ}||SdS(s,return NLMSASlice representing BLAST resultsN(sselfs__call__sksal(sselfsksal((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys __getitem__³scCs™ti|dtiƒ oNti|dtiƒ o3ti|dtiƒ oti|dtiƒ otSn"||ijo ||_ntSdS(s=check whether BLAST index files ready for use; return status.s.nsds.psds.00.nsds.00.psdN( sossaccessstestpathsR_OKsFalsesselfsfilepathsblastIndexPathsTrue(sselfstestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pystest_db_location·s l cCsCx5|iƒD]'}|i|ƒ|_|ioPq q W|iSdS(sHlook for blast index files in blastIndexPath, standard list of locationsN(sselfsblast_index_pathsstestpathstest_db_locations blastReady(sselfstestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyscheckdbÂs   cCs<ti|ƒ}ti|tiƒ otd|ƒ‚ndd|i d|ddg}|i i t jo|ddg7}ntid d i|ƒƒ|io h}ntd tid tiƒ}ti||o7t|i ƒp t|ƒtd d i|ƒƒ‚nt|_||i jo ||_ndS(s3ATTEMPT TO BUILD BLAST DATABASE INDEXES at testpaths+run_formatdb: directory %s is not writable!sformatdbs-is-ns-osTs-psFsBuilding index: s sstdoutsstderrscommand %s failedN(s classutils file_dirpathstestpathsdirnamesossaccesssW_OKsIOErrorsselfsfilepathscmdsseqDBs_seqtypesPROTEIN_SEQTYPEsloggersinfosjoinsshowFormatdbMessagesskwargssdictsPIPEscall_subprocessswarn_if_whitespacesOSErrorsTrues blastReadysblastIndexPath(sselfstestpathskwargsscmdsdirname((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys run_formatdbÉs"   cCs,y |iSWntj o|iSnXdS(s+get path to base name for BLAST index filesN(sselfsblastIndexPathsAttributeErrorsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysget_blast_index_pathßs  sFILEPATHccs¿y |iVWntj onXx—|iD]Œ}|djo|iVq+nJ|tiijo|dƒ}n't |ƒo |ƒ}n t |ƒ}tii |tii |iƒƒVq+WdS(s-iterate over possible blast index directoriessFILEPATHs~N(sselfsblastIndexPathsAttributeErrorsblastIndexDirssmsfilepathsosspaths expanduserssscallablesstrsjoinsbasename(sselfsmss((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysblast_index_pathsés       cCs|tj o|i|ƒSnt}x_|iƒD]Q}|oti dƒnt }y|i|ƒSWq1t t fj oq1Xq1Wt d|if‚dS(s9try to build BLAST index files in an appropriate locations+Trying next entry in self.blastIndexDirs...s"cannot build BLAST database for %sN( sfilepathsNonesselfs run_formatdbsFalsesnotFirstsblast_index_pathsstestpathsloggersinfosTruesIOErrorsOSError(sselfsfilepathsnotFirststestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysformatdbús   cCsr|tj o||fSnyt|idƒ|fSWn6tj o*d|iƒ}t i |ƒt fSnXdS(stReturn a stream of fasta-formatted sequences. Optionally, apply an ID filter function if supplied. srUsfastacmd -D -d "%s"N( sifilesNonesidFiltersfilesselfsfilepathsIOErrorsget_blast_index_pathscmdsosspopensNCBI_ID_PARSER(sselfsifilesidFilterscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysraw_fasta_stream s sblastxs#BlastxMappingcCs|tjot|iƒ|iiƒ}n|}y?|i |}|i dƒot d|d|fƒ‚nWnt j onX|SdS(sAfigure out appropriate blast program & remap via _blast_prog_dicts#s Use %s for %siN( s blastprogsNones blast_programsseqsseqtypesselfsseqDBs_seqtypesoldprogs_blast_prog_dicts startswiths ValueErrorsKeyError(sselfsseqs blastprogsoldprog((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_programs  "c Cs||iƒ}t|ƒ|d|d|ddt|ƒgt|ƒ}|t j o"|dd|dd|g7}n|SdS( s>generate command string for running blast with desired optionss-ds-ps-es%es-bs%ds-vN( sselfsget_blast_index_pathsfilepathswarn_if_whitespaces blastpaths blastprogsfloatsexpmaxslistsoptsscmdsmaxseqsNone(sselfs blastpaths blastprogsexpmaxsmaxseqsoptssfilepathscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_command%s  / "cCst|ƒiƒ}||SdS(s!get one sequence obj from queryDBN(sitersqueryDBsnextsseqID(sselfsqueryDBsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysget_seq_from_queryDB.sc Csftdtdtƒdtdtƒdtdtdtƒƒ}y ||SWntj o hSnXdS(s;return kwargs for read_blast_alignment() based on blastprogstblastns translateDestsblastxs translateSrcstblastxN(sdictsTruesds blastprogsKeyError(sselfs blastprogsd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pystranslation_kwargs3s sblastallf0.001c KsÚ|tjo | tjotdƒ‚n|o| otdƒ‚n| tj o|i| ƒ}n|i o|iƒn|i||ƒ}|i |||||ƒ} t| ||i|d| |i|ƒSdS(s=Run blast search for seq in database, return alignment objects)we need a sequence or db to use as query!s+both a sequence AND a db provided for querysqueryDBN(sseqsNonesqueryDBs ValueErrorsselfsget_seq_from_queryDBs blastReadysformatdbs blast_programs blastprogs blast_commands blastpathsexpmaxsmaxseqsoptsscmds process_blastsidIndexsalstranslation_kwargs( sselfsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptssqueryDBskwargsscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__call__<s  (s__name__s __module__s__doc__sNonesFalsesTrues__init__s__repr__s __getitem__stest_db_locationscheckdbs run_formatdbsget_blast_index_pathsossgetcwdspaths expanduserstempfiles gettempdirsblastIndexDirssblast_index_pathssformatdbsraw_fasta_streamsdicts_blast_prog_dicts blast_programs blast_commandsget_seq_from_queryDBstranslation_kwargss__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys BlastMapping—s$      !    s BlastxMappingcBs;tZdZd„ZeddddddƒZd„ZRS(sBecause blastx changes the query to multiple sequences (representing its six possible frames), getitem can no longer return a single slice object, but instead an iterator for one or more slice objects representing the frames that had homology hits.cCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__Sssblastnstblastxsblastps #BlastMappingstblastncCs“||ƒ}ti|iƒ}g}xd||ii ƒD]O}y||}Wnt j o q8nXt |tƒ o|i|ƒq8q8W|SdS(s2generate slices for all translations of the query N(sselfsquerysals translationDBsget_translation_dbsdbstdbsslicessids iter_framess trans_seqsslicesKeyErrors isinstances EmptySlicesappend(sselfsquerysslicesslicesstdbs trans_seqsal((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys __getitem__Ws (s__name__s __module__s__doc__s__repr__sdicts_blast_prog_dicts __getitem__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys BlastxMappingMs   sMegablastMappingc BsGtZd„Zeddeeddddgdd gefd „ ZRS( NcCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__lss megablastf9.9999999999999995e-21s-UsTs-Fsms RepeatMaskers-xsmallc  Ks|i o|iƒnt||| ƒ}|iƒ} t | ƒ|g|d| ddddt |ƒgt| ƒ}|tj o"|dd|dd|g7}n|tj o|d d t |ƒg7}nt|||i|d |d td dƒƒSdS(s2Run megablast search with optional repeat masking.s-ds-Ds2s-es%es-bs%ds-vs-ps%fs seqStrings popenArgss stdinFlags-iN(sselfs blastReadysformatdbs repeat_masksseqsrmPathsrmOptss masked_seqsget_blast_index_pathsfilepathswarn_if_whitespaces blastpathsmaskOptssfloatsexpmaxslistsoptsscmdsmaxseqsNones minIdentitys process_blastsidIndexsalsdict(sselfsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargssfilepaths masked_seqscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__call__ns   7 " (s__name__s __module__s__repr__sNones__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysMegablastMappingks s BlastIDIndexcBsPtZdZd„ZdZd„Zed„Zed„Zd„Z d„Z RS(s•This class acts as a wrapper around a regular seqDB, and handles the mangled IDs returned by BLAST to translate them to the correct ID. Since NCBI treats FASTA ID as a blob into which they like to stuff many fields... and then NCBI BLAST mangles those IDs when it reports hits, so they no longer match the true ID... we are forced into contortions to rescue the true ID from mangled IDs. Our workaround strategy: since NCBI packs the FASTA ID with multiple IDs (GI, GB, RefSeq ID etc.), we can use any of these identifiers that are found in a mangled ID, by storing a mapping of these sub-identifiers to the true FASTA ID.cCs||_t|ƒ|_dS(N(sseqDBsselfsBlastIDInfoDicts seqInfoDict(sselfsseqDB((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__init__’s s|cCs|i|iƒSdS(s’Return |-packed NCBI identifiers as unpacked list. NCBI packs identifier like gi|123456|gb|A12345|other|nonsense. Return as list.N(sidssplitsselfs id_delimiter(sselfsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys unpack_id—scCs|tjo |i}nh}xœ|iD]‘}xˆ||ƒD]z}||joq=n|iƒ}y4|||jo||tj ot||}‰¦| x=ŒŒ.¸N€ |¦BŸ}h¦|¦=kk=ì}i¦N€ |¦¿¡ÿô8€|}x8`”!ÿ°H•|~yA‚,£ëx8€H/ƒ~@¾Ãóx;ÀHI`8!PÃóx€»¡ÿô|¦N€ ``|¦¿¡ÿô|}x”!ÿ°``€cH£ëxHù8!P8`€»¡ÿô|¦N€ ```€C€8`ÿÿ‚Mœ @ 8`N€ 8`N€ ``,A‚\C/ŠA\HH`|R| p}k”Ub8}(.|h„HMž ‰ Aœ }j[xH8ë‡PAœÿÈ`8`N€ ``}Kp8àU`8}(.|h„H@žÿ¸N€ |¦¿¡ÿô8€|}x8`”!ÿ°H|~yA‚,£ëx8€H/ƒ~@¾Ãóx;ÀHÉ`8!PÃóx€»¡ÿô|¦N€ ``,A‚\C/ŠA\HH`|R| p}k”Ub8}(.|h„HMž ‰ Aœ }j[xH8ë‡PAœÿÈ`8`N€ ``}Kp8àU`8}(.|h„H@žÿ¸N€ 8€H,``|¦¿ÿð||x”!ÿ°``€/€@<;À`€WÂ8;Þ|Bƒ¢€}H¹£ëxH±€€ðAÿÔ€|HƒãxH•8!P8`€»ÿð|¦N€ |¦¿Áÿø|ƒ#xBŸ|¤+xè¦8”!ÿ <ß<¿8Æ9¨8¥!ä8á88Hµ;À/ƒAžX!8€I8BIa8€K8BKƒÁ8€^8Bÿÿ/‚^@ž €a8€C€| ¦| xN€!`8!`Ãóx€»Áÿø|¦N€ ``|¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿Áÿø”!ÿ°``€ƒÃ /€@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ ```|¦¿Áÿø|~x”!ÿ 8a88<8¡@H‘€~€^/ƒ8B^Až Kÿû5€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`HA/ƒAž ÃóxH‘€^€a8€<€¡@8Bÿÿ^Hµ€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ `|¦¿ÿð|}x|ƒ#x;€”!ÿ°He|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿Áÿø|~x”!ÿ 8a88<8¡@H1€~€^/ƒ8B^Až KÿùÕ€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Há/ƒAž ÃóxH1€^€a8€<€¡@8Bÿÿ^HU> /‰Až0€I8Bÿÿ/‚I@ž€~ €C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦|Œ#x|¤+x”!ÿ°``€c /ƒAž}‰¦N€!,@‚8`8!P€|¦N€ `|¦“áÿüBŸè¦”!ÿ°=?)6øc ‘# /‹€I8BIAž0€K8Bÿÿ/‚K@ž€K}c[x€| ¦| xN€!8!P8`€ƒáÿü|¦N€ |¦¿ÿð|}x|ƒ#x;€”!ÿ°Hõ|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿Áÿø|~x”!ÿ°``# /‰Až<€I8Bÿÿ/‚I@ž(€c €C€| ¦| xN€!```>/‰Až0€I8Bÿÿ/‚I@ž€~€C€| ¦| xN€!€^8!PÃóx»Áÿø€ | ¦| x€|¦N€ |¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c /ƒAžÉ¦|¤+xÌóxN€!,@‚,€}/ƒAžÉ¦„ãxÌóxN€!,@‚8`8!P€»ÿð|¦N€ `|¦¿¡ÿô|~xBŸè¦”!ÿ°?¿€]4¤€c ^ /ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]4¤H€]4¤€~^/ƒ"9)‘"Až,€C8Bÿÿ/‚C@ž€C€| ¦| xN€!8!P8`€»¡ÿô|¦N€ |¦¿ÿð|}x|ƒ#x;€”!ÿ°HU|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿Áÿø|~x”!ÿ 8<8a88¡@H!>€^/‰8B^Až€iHá€~HÙ€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``HÁ/ƒAž ÃóxH€^€a8€<€¡@8Bÿÿ^H5> /‰Až0€I8Bÿÿ/‚I@ž€~ €C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦|Œ#x|¤+x”!ÿ°``€c /ƒAž}‰¦N€!,@‚8`8!P€|¦N€ `|¦“áÿüBŸè¦”!ÿ°=?)1Øc ‘# /‹€I8BIAž0€K8Bÿÿ/‚K@ž€K}c[x€| ¦| xN€!8!P8`€ƒáÿü|¦N€ |¦¿ÿð|}x|ƒ#x;€”!ÿ°HÕ|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦“áÿü8€BŸè¦”!ÿ°€˜| ¦| xN€!|kyA‚0<_€B0ÄK"9)‘"K`"9)‘"8!P€ƒáÿü|¦N€ ```|¦¿Áÿø|~x”!ÿ°``#/‰Až<€I8Bÿÿ/‚I@ž(€c€C€| ¦| xN€!```>/‰Až0€I8Bÿÿ/‚I@ž€~€C€| ¦| xN€!€^8!PÃóx»Áÿø€ | ¦| x€|¦N€ |¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c/ƒAžÉ¦|¤+xÌóxN€!,@‚,€}/ƒAžÉ¦„ãxÌóxN€!,@‚8`8!P€»ÿð|¦N€ `|¦¿¡ÿô|~xBŸè¦”!ÿ°?¿€]/€c^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]/H€]/€~^/ƒ"9)‘"Až,€C8Bÿÿ/‚C@ž€C€| ¦| xN€!8!P8`€»¡ÿô|¦N€ |¦“áÿü8€BŸè¦”!ÿ°€˜| ¦| xN€!|byA‚=?).4‘" €I8BI8!P€ƒáÿü|¦N€ |¦¿Áÿø|~x”!ÿ°``# /‰Až0€I8Bÿÿ/‚I@ž€c €C€| ¦| xN€!€^8!PÃóx»Áÿø€ | ¦| x€|¦N€ `|¦|Œ#x|¤+x”!ÿ°``€c /ƒAž}‰¦N€!,@‚8`8!P€|¦N€ `|¦“áÿüBŸè¦”!ÿ°=?)-c ‘# /‹€I8BIAž0€K8Bÿÿ/‚K@ž€K}c[x€| ¦| xN€!8!P8`€ƒáÿü|¦N€ |¦¿Áÿø|~x”!ÿ 8a88<8¡@Ha€~€^/ƒ8B^AžH %€~/ƒAžH €^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`H /ƒAž ÃóxH Q€^€a8€<€¡@8Bÿÿ^H u€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ `|¦¿ÿð|}x|ƒ#x;€”!ÿ°H%|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿aÿì||x|@&BŸ-|ž#xè¦|½+xA”!ÿ AŠ€C8BC-žAŽ€^8B^.A’€]8B]?€+@ž<€]8Bÿÿ/‚]@žh€]£ëx; €| ¦| xN€!HX`A’P<_€€B+€Až<<_<Ÿ€B+(8„d€bH õ@Ž@Hl``; ```@Ž ;+€I}>Kx8BI``<_<€B+‰Až˜€+žAž4<_<Ÿ-ž.€B+(8„€bH uKÿÿ€```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!<<_€B+$‰@žT<žãx€I}ß8`“Á8“Á<“¡@“D€-ГaL8€8 8ÀgÛxÈóxÉóxÊóxHHq|yy&A‚xHAEÓx$Ëx8ÀH|zy~à&A‚Œ€-Ð@H9H|€]£ëx€| ¦| xN€!``AŠ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€! A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```~ø A‚œ€Z8Bÿÿ/‚Z@žˆ€Z8!CÓxaºÁÿØ€}r }q | ¦| x€}p |¦N€ ~à&;@H,;À;`; ;@.M~à&V÷€&W€€]8Bÿÿ/‚]@žþ˜Kÿþt8!a€ºÁÿØ|¦}r }q }p N€ ```|¦¿ÿð||xBŸ|#x覔!ÿ°€C|ƒ#x8B\$9)‘$Hõ|~xH­/ƒAž4<_8t=?€B*¼b<_*´‘i*¸H ```€|ÄóxKÿæ©,@‚@<_8€8 €B$è€bKÿù9<_8v=?€B*¼b<_*´‘i*¸HD€cH½,A‚ |~xH<<_8w=?€B*¼b<_*´‘i*¸``<;À8c àKÿûÅ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!PÃóx€»ÿð|¦N€ ```|¦¿ÿð||xBŸ|ƒ#x|¤+xè¦;À”!ÿ°<ß<¿8Æ(Ä8¥ÜHy/ƒAžЀ\<Ÿƒãx8B\€„)lHµ|~y@‚,<_8o=?€B)b<_)‘i)HH`8€Hý|}y@‚D<_8o=?€B)b<_)‘i)€^8Bÿÿ/‚^@žHÀ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxHÝ|`y@‚D<_8o=?€B)b<_)‘i)€]8Bÿÿ/‚]@ž€H\``€]|x8Bÿÿ/‚]@žl€]£ëx€| ¦| xN€!HP€^Ãóx€| ¦| xN€!H$€]£ëx€| ¦| xN€!``<;À8c hKÿùe€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!PÃóx€»ÿð|¦N€ ``|¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8Æ&”8¥¨HþA/ƒAž9<_8`ƒÂ! 9)‘9€^8B^HýÑ|{y@‚8<_8iÝóx€B&è"<_&à<_‘"&äHP```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@;@>ß>_>¿>Ÿ:`k``€–'cÛxHÉ||yA‚˜9W^8€I|bð.H.|}x@²@M€U&è;À;M€’t&à&ä€\8Bÿÿ/‚\@ž¬H`9€I|Bò€bH1-ƒ|~x@®M €U&è;HL8`Hí-|xx@ª€U&èH0`“£ “Ã8`HÅ.|}x@²(M€U&è;À€’t&à&äKÿÿ```“ ¤ëxƒãxHE|~y@¢,M€U&è;À;M€€’t&à&äKÿÿ`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`;Z—Ð@žþ(`€[~Ûx}Ûx8B[Hü€\ƒãx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŠ`€X8Bÿÿ/‚X@žL€XÃx}Ûx€| ¦| xN€!H<<_8k}Ûx€B&è"<_&à<_‘"&äH}Ûx```<;À8cXKÿõ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóxa€ºAÿÈ|¦}r }q }p N€ ``|¦¾AÿÈ|xx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8Æ"8¥Hù±/ƒAžh8<_8`ƒÂ9)‘8€^8B^HùA|zy@‚8<_8_Ýóx€B"X"<_"P<_‘""TH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€X‚â/—@„; >ß>_>¿>Ÿ:`a``€–"„CÓxHü9|}yA‚ì€XW+8"|kH.Hýý|{yÀ&@‚@N€U"X;€€’t"P"T€]8Bÿÿ/‚]@ž4H```8`Hü.||x@’€U"XKÿÿ¸`“c „ãx£ëxHý%|~y@‚À&€U"X;`KÿÿŒ``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`;9—È@žþ¨`€Z^Óx]Óx8BZHÌ€]£ëx€| ¦| xN€!Ø A‚0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!A’`€\8Bÿÿ/‚\@žL€\ƒãx]Óx€| ¦| xN€!H8<_8a]Óx€B"X"<_"P<_‘""TH]Óx``<;À8cèKÿñ5€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦¿ÿð||xBŸè¦”!ÿ°<Ÿ€C8BC€„èHùQ|~y@‚(<_8e=?€BŒb<_„‘iˆHD8€Hú|}y@‚D<_8e=?€BŒb<_„‘iˆ€^8Bÿÿ/‚^@žHÀ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxH÷}|`y@‚D<_8e=?€BŒb<_„‘iˆ€]8Bÿÿ/‚]@ž€H\``€]|x8Bÿÿ/‚]@žl€]£ëx€| ¦| xN€!HP€^Ãóx€| ¦| xN€!H$€]£ëx€| ¦| xN€!``<;À8c “¾“ž€[8B[“~€c $Hæ|`y@‚<<_8Ë=?€B ¨b<_  ‘i ¤€^8Bÿÿ/‚^@ž¨Hˆ€^|x8Bÿÿ/‚^@žœ€^Ãóx€| ¦| xN€!H€€]£ëx€| ¦| xN€!`A’P€\8Bÿÿ/‚\@ž<€\ƒãx€| ¦| xN€!H €^Ãóx€| ¦| xN€!`<; 8cíØKÿÚÕ€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`£ëx€a»aÿì|¦}p N€ `|¦¿Aÿè|›#xBŸ||x覔!ÿ <_ƒB”#9)‘#€D8BD<Ÿ:€„´9)‘:€c Hâù|}y@‚0<_8ý=?€B\b<_T‘iXHÌ``dÛxHã½|~y@‚D<_8ý=?€B\b<_T‘iX€]8Bÿÿ/‚]@ž€H@``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ÃóxHä½|}xHâu/ƒAž<<_8ý=?€B\b<_T‘iX€^8Bÿÿ/‚^@žøHÔ€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€|¤ëxKÿÄ9|`y@‚@<_8€8 €Bˆ€bKÿÕÉ<_8ÿ=?€B\b<_T‘iXHt€\€b|cP|cpHãA|}y@‚(<_8=?€B\b<_T‘iXH48`Háí|~y@‚(<_8=?€B\b<_T‘iXKÿþp€\<Äóx8B\“¾“ž €càHâ]|}y@‚(<_8=?€B\b<_T‘iXKÿþ¨€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€]¾ëxºëx8B]HP€]£ëx€| ¦| xN€!H$€^Ãóx€| ¦| xN€!``<;À8cë°Kÿ×%€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`Ãóx€»Aÿè|¦N€ ```|¦¾ÿÐ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8Æ 8¥âHÛ¡/ƒAžH9<_8`ƒbþ€9)‘9€[8B[HÛ1|zy@‚8<_8}Ûx€BH"<_@<_‘"DHP```€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€Y‚â/—@;>¿>ß>ŸÃxHà|}yA‚”8`HÞí.|~x@²06H8€I@UD€]8Bÿÿ/‚]@ž H€Y|dx8BY“£“# <€cÌHßQ|}yA‚€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`<ŸCÓx»ëx€„tHÝQ.|~xA’¼8`HÝý|}yA‚ €[Ãóx¤ëx8B[“} HÞ™||y@¢ 6H8€I@UDKÿþð`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`;—À@žþ`€Z^Óx]Óx8BZHü<_8=?€BHb<_@‘iDHD<_8=?€BHb<_@‘iDH €]£ëx€| ¦| xN€!A’x€^8Bÿÿ/‚^@žd€^Ãóx]Óx€| ¦| xN€!HT<_]Óx8€BH"H<_]Óx8€BH"<_@<_‘"DH]Óx```<;À8cçÀKÿÒu€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!pÃóx€aºÿÐ|¦}p N€ |¦¿aÿì||x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ <ß<¿8Æÿ`8¥ÝXHÖñ/ƒAžø€\8`8B\HÜ|~y@‚,<_8 =?€Bÿ˜b<_ÿ‘iÿ”Hx`8`HÛÝ.|{x@’@<_8 =?€Bÿ˜b<_ÿ‘iÿ”€^8Bÿÿ/‚^@žÜH¼`8`HÚm|}yA‚ÿ¸€\<¤ëx8B\“Ý“}“ €cÿ HÚý|`y@‚D<_8 =?€Bÿ˜b<_ÿ‘iÿ”€]8Bÿÿ/‚]@ž°H``€]|x8Bÿÿ/‚]@žœ€]£ëx€| ¦| xN€!H€€^Ãóx€| ¦| xN€!`A’P€[8Bÿÿ/‚[@ž<€[cÛx€| ¦| xN€!H €]£ëx€| ¦| xN€!`<;À8cã0Kÿϵ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€a»aÿì|¦}p N€ |¦¿aÿì||x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ <ß<¿8Æý8¥ÚøHÔ‘/ƒAžø€\8`8B\HÙµ|~y@‚,<_8=?€Bý8b<_ý0‘iý4Hx`8`HÙ}.|{x@’@<_8=?€Bý8b<_ý0‘iý4€^8Bÿÿ/‚^@žÜH¼`8`HØ |}yA‚ÿ¸€\<¤ëx8B\“Ý“}“ €cüÀHØ|`y@‚D<_8=?€Bý8b<_ý0‘iý4€]8Bÿÿ/‚]@ž°H``€]|x8Bÿÿ/‚]@žœ€]£ëx€| ¦| xN€!H€€^Ãóx€| ¦| xN€!`A’P€[8Bÿÿ/‚[@ž<€[cÛx€| ¦| xN€!H €]£ëx€| ¦| xN€!`<;À8càôKÿÍU€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€a»aÿì|¦}p N€ |¦¿ÿð||xBŸ8`覔!ÿ°€\8B\HÖe|~y@‚,<_8=?€BúÜb<_úÔ‘iúØH¸`€\<Äóx8B\“ž €cúdHÖÕ|`y@‚<<_8=?€BúÜb<_úÔ‘iúØ€^8Bÿÿ/‚^@žXH8€^|x8Bÿÿ/‚^@žL€^Ãóx€| ¦| xN€!H0€^Ãóx€| ¦| xN€!`<; 8cÞ¸KÿËå€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!P£ëx€»ÿð|¦N€ ```|@&|¦¾!ÿÄ|{xBŸè¦A”!ÿ€<_ƒ‚ó #|ƒ#x9)‘;€\8B\HÖ™|~xHÔQ/ƒAž(<_šãx8€Bùh"HH```/žAœ€ žAœ`8`HÔ‰|}y@‚`<_šãx8ƒ€Bùh"<_ù`<_‘"ùdHÈ<_8‡Ãx€Bùh"<_ù`<_‘"ùdHt```=?¤ëxiùì€K8BK<_€BóŒ)ùì‘= €bHÔµ|~y@‚LÀ&<_8ƒšãx; €Bùh"<_ù`<_‘"ùd€]8Bÿÿ/‚]@ž¤Hˆ`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`Ãóx8€8 KÿÆÕ€^8Bÿÿ/‚^@žþÔ€^Ãóx€| ¦| xN€!Kÿþ¸€€[;|Ö|ÖT:ÀJHε|xy@‚<_šãx8…€Bùh"KÿþŒ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€€[~À×@TÚóx:à>¿>>Ÿ>_: ‡`€•ù”ÃxHÑÉ|yyÀ&A‚4€z;ZHÓ‘|}y@‚(N€Tùh;€€Ãx’2ù`ùdHP`8`HÒ=.||xA’ýÜ“£ „ãx#ËxHÒá|~y@‚€TùhKÿÿ¸```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`:÷–¸@žþØ`€XÃxÃx8BXHÌ<_8‡Ãx€Bùh"<_ù`<_‘"ùdH”€]£ëx€| ¦| xN€!Ø A‚t;€.€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!A’<€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```<;À8cÝdKÿÆõ€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!€Ãóx€aº!ÿÄ|¦}p N€ `|¦¿aÿì|}x|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8Æì¨8¥ÔÐ8á88HË™;À/ƒAž,=a89)‘=€K8BK€}HÊé€a8HÑA|~xHÎù/ƒAž(<_8=?€BôHb<_ô@‘iôDH\“Ý€}HÐa|~y@‚(<_8‘=?€BôHb<_ô@‘iôDH$€a8ÄóxHÎ .||x@’<<_8‘=?€BôHb<_ô@‘iôD€^8Bÿÿ/‚^@žXH<€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€}Hϱ|~y@‚(<_8‘=?€BôHb<_ô@‘iôDHøƒãxÄóxHÍY|{yA‚ÿX€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!cÛxHϱ|~xHÍi/ƒ@ž¤€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!ÃóxKÿ¯ý=?})î€}>Kx€I8BIH¬€^Ãóx€| ¦| xN€!A’€€\8Bÿÿ/‚\@žl€\ƒãx€| ¦| xN€!HP<_8‘=?€BôHb<_ô@‘iôD€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<;À8cØpKÿÃU€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!pÃóx€a»aÿì|¦}p N€ |¦¿ÿð|#xBŸ8€|¾+x覔!ÿ €˜| ¦| xN€!||yA‚Ø=<_<¿<ßkñX€Bñ\8£ëxÄóx8¥Õ8Æé8á8<89<9!@‘a@AD9ADHǹ/ƒAžH€\8B\!8€I8BIa<€K8BK!@€I8BIaD€K8BK€a8HÍ=|~xHÊõ,A‚(<_8k=?€Bð¬b<_ð¤‘ið¨H¸“Ü| €a@HÌù|~xHʱ/ƒAž(<_8m=?€Bð¬b<_ð¤‘ið¨Ht“Ü€a8€Kx8BIH8€^Ãóx€| ¦| xN€!```<;À8cÏKÿº…€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!`Ãóx€»Áÿø|¦N€ ``|¦¾¡ÿÔ|ƒ#xBŸ|¤+x; è¦;€”!ÿp<ß<¿8Æà8¥ÌÄ8á89<“¡8“¡<“¡@“¡D“¡HH¿M/ƒAž T!8?ß??ƒ~âD€I8BIa<€K8BK;€a8€™èd9)‘;HÂa/ƒa@@ž4?>ß>ÿ8 8è €I!@è/‰Vè@žxH¤€¿4€ADZ8€H<€a8€•èTH¿Ù|}y€&A‚ôH¾é/ƒÿÿ|{x@ž4H`!@/‰Až0€I8Bÿÿ/‚I@ž€a@€C€| ¦| xN€!!D/‰Až0€I8Bÿÿ/‚I@ž€aD€C€| ¦| xN€!!H/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!;@€Xè ƒÞâD8; ,"è &‘6è€&H° &€Xè ƒÞâD8;@"è‘6èHŒ;@€Xè ƒÞâD8/š"è &W9à‘6èH`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!cÛxHÀ9|{y@‚0 &8è ƒÞâD8; ;@€&€IèVèHø€~âD€C8Bÿÿ/‚C@ž€C€| ¦| xN€!€™èd€a8H½í|}y€&@‚  &€Xè ~Ûx;@8"Hœ€<eÛxHÀY/ƒ@œ,;@€Xè 8~Ûx,"è &‘6èH\€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€•èT€a8H½Q|}y€&@‚( &€Xè ~Ûx;@8"è‘6èHô<Ÿ€„è8H½|zy &A‚p€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`H½•|}y€&A‚0!<CÓx¤ëx€I8BI€< H¾%|~y@‚ 8è 8~Ûx€IèVèHT€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€[8B[!@€I8Bÿÿ/‚I@ž€a@€C€| ¦| xN€!;À€AD“Á@"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!“ÁD€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁH|Ûx~ÛxHd &ƒÞâD; ;@€&!@/‰Až4€I8Bÿÿ/‚I@ž €a@€C€| ¦| xN€!`!D/‰Až8€I8Bÿÿ/‚I@ž$€aD€C€| ¦| xN€!``!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``˜ A‚<€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```8 A‚<€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```<;€8cÌàKÿ±€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!ƒãx€º¡ÿÔ|¦N€ ``|¦¿Áÿø|ƒ#xBŸ|¤+xè¦8”!ÿ <ß<¿8ÆÖÌ8¥Âô8á89<<8Hµ;À/ƒAžða8<Ÿ€K8BK!<€I8BI€„Þ¤€a8€¡Kx8BIH8€^Ãóx€| ¦| xN€!```<;À8cÃ8Kÿ®…€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!`Ãóx€»Áÿø|¦N€ ``|¦¿¡ÿô|ƒ#xBŸ|¤+x8@覔!ÿ€<ß<¿8ÆÔx8¥Á(8X8áHAXAHALAP8AT9L9!P9ATH³;À/ƒAžDaH<Ÿ€K8BK!L€I8BIaP€K8BK!T€I8BIaX€K8BK€„Ü€aH€¡LH·¡/ƒ@œ(<_88=?€BÛÜb<_ÛÔ‘iÛØH´<Ÿ€aH€¡P€„ÜKx8BIH,€^Ãóx€| ¦| xN€!<;À8cÁ0Kÿ«E€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!8!€Ãóx€»¡ÿô|¦N€ ``|¦¿¡ÿô|ƒ#xBŸ|¤+xè¦8”!ÿ <ß<¿8ÆÐÀ8¥¸”8á88H¯e;À/ƒAžH!8<Ÿ€I8BI€„Øl€a8H²™|~yA‚ H±­/ƒÿÿ|}x@ž@<_8>=?€BØ b<_Ø‘iØ€^8Bÿÿ/‚^@žœH|`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxH³í,A‚|~xH\``<_8>=?€BØ b<_Ø‘iØH €^Ãóx€| ¦| xN€!`<;À8c½„Kÿ¨Õ€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!`Ãóx€»¡ÿô|¦N€ ``|¦¾áÿÜ|ƒ#x|@&BŸ|¤+x8è¦A”!ÿ€<ß<¿8ÆÏ8¥¶à8á88H­­;À/ƒAžà€A8?Ÿ"9)‘"€a8€œÖ¸H°á|}y@‚(<_8I=?€BÖXb<_ÖP‘iÖTHT<Ÿ€„Ö¤H°©.|~x@’lM<_8I~à&V÷€€BÖX;`;@;€; M&W€"<_ÖP<_‘"ÖT€]8Bÿÿ/‚]@žÐH´``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ÃóxH®].@T<_; 8I;`€BÖX-;@;€~à&V÷@"<_Mˆ&W@‘"ÖT<_ÖPH<`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`A’@<_8€8 €BЈ€bKÿ£‰<_8J=?€BÖXb<_ÖP‘iÖTHÔ<Ÿ€a8€„ÖÈH¯%|}y@‚(<_8K=?€BÖXb<_ÖP‘iÖTH˜<Ÿ€a8€„Ö”H®é.|~x@’0M<_;`~à&V÷€€BÖXM&W€"H@<Ÿ€a8€„ÖˆH®¡-ƒ|{x@ŽH&W`<_M €BÖX~à&V÷`";@;€; <_8K‘"ÖT<_ÖPKÿþ8`H°)-|zx@Š,~à&V÷@<_;€; &W@€BÖX"Kÿÿ°€œÖ¸€a8H® ||y&@‚0~à&<_8K; €BÖX"<_ÖP<_‘"ÖTKÿý€8`H®‰|yy~à&@‚(<_8K=?€BÖXb<_ÖP‘iÖTKÿýH“Ù “y£ëx$Ëx“Y“™€A8"9)‘"€8H®å|~y@‚4M€<_;À&€BÖX;`;@;€NM"KÿþÈ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!=?)ЀI}>Kx8BIH<€]£ëx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!AŠ0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€! A‚<€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```~ø A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```<;À8c»ôKÿ¢…€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!€Ãóxa€ºáÿÜ|¦}r }q }p N€ ``|¦¿ÿà|ƒ#x|@&BŸ|¤+x8è¦A”!ÿ<ß<¿8ÆÈ¼8¥´°8á89<<8H§E;À/ƒAžè!8??<<ŸYÊ08„µ¸€I8BIa<€K8BK<_*€cÏìƒbÐp9)‘*H§é|}yA‚@8`H¦™|~y@‚ N;€;@H°```<€cÏèH§)||y@‚ N;€;@HL```H¨á.|zx@’ ;€H(<Ÿ†ãxeÛx£ëx8„µÄGÓxÈóxH«m||x€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`A’0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!/œ@ž<``<_8Bƒ¹Ê0€BÏø"<_Ïð<_‘"ÏôHŒ``€yÊ0€C8Bÿÿ/‚C@ž€C€| ¦| xN€!`<Ÿƒãx€„Ð H¨•|}y@‚<_ãx8C€BÏø"Hà€a<¤ëxH¥©/ƒÿÿ|~x@žl<_;8C;À€BÏø.;`; M@&WZ€"<_MÏð<_‘"Ïô€]8Bÿÿ/‚]@žäHÈ```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/žAž8`H¨u|}y@‚,<_ãx8D€BÏø"<_Ïð<_‘"ÏôH4=?¤ëxiÐt€K8BK<_€BÊ)Ðt‘= €bH¨Õ|~y@‚@N<_;ÀM;`; @&€BÏø;8DM€"<_‘"ÏôH€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!Ãóx8€8 Kÿ›€^8Bÿÿ/‚^@žÿ€^Ãóx€| ¦| xN€!Kÿþü<_<ƒÂÏü€cÏèÄóxH¦|}y@‚@<_Äóxãx€BÊ8€bH¤­<_8G=?€BÏøb<_Ïð‘iÏôHø<Ÿ€a8€„Ð4H¦9|~y@&@‚@M€<_;`NM€BÏø"<_; ;8G‘"Ïô<_ÏðKÿýÜ<Ÿ€a8€„ÐXH¥á.|{x@’M<_M€BÏø"Kÿÿ°€ÿ€—ňHžÙ-ƒ|zx@Ž,M <_¹ëx~À&VÖ`€BÅ(:à;`"Ht€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`CÓxH/ƒÿÿ|~x@žP;`<_¹ëx;À,€BÅ(:à~À&"NM<_8.‘"Å$<_Å Kÿÿ``€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`ÃóxHŸ½.|~x@’4~À&VÖ€<_¹ëx;@:àM€BÅ(;`M"KÿÿpƒãxÄóx8¡€Ý <Ÿ<¿€B´¬8„08¥ ¤€é €bH’<_8N=?€Bº\b<_ºT‘iºX```<;Àÿÿ8c ÈKÿŠå€\8Bÿÿ/‚\@žÐH°€| €C€| ¦| xN€!€8€a< H•õ|~xH“­/ƒAž(<_8P=?€Bº\b<_ºT‘iºXKÿÿ€“Ü€a@H•µ|}xH“m,A‚(<_8Q=?€Bº\b<_ºT‘iºXKÿÿ@;À“¼|Kÿÿ@€\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!8!`Ãóx€»ÿð|¦N€ ``|¦¿aÿì|{xBŸ|ƒ#x|¤+xè¦8”!ÿ<_?¿=<߃·̃½·Ä<¿k·È8ư8¥Ä8á89<“ÁD8“¡<‘a@9!@9ADHŽQ;Àÿÿ/ƒAž¤;a89)‘;€K8BK!<€I8BI=?a@€K8BKAD€J8BJƒÉ¶¸ƒ¡8/žAž„?Ÿ€±dAž €}žAžÄóxH“A/ƒAž(<_ƒÁDƒ¢¶°/AžD€±dž@žXHt<_=€Þ <Ÿ<¿€B±|8„š8¥¼€é €bHŽéH”<_<Ÿ€B±L8„™ì€bHŽÍHx`€~Až¤ëxH’±/ƒAž(ƒÁD€±dž@žx!8‰ð@ž$H¼`<_>€Ý <Ÿ<¿€B±|8„š8¥À€é €bHŽY`<_8)=?€B·,b<_·$‘i·(H```€^8B^;€I8Bÿÿ/‚I@ž €{€C€| ¦| xN€!`!D‘;€  i €K8BK;€I8Bÿÿ/‚I@ž€{€C€| ¦| xN€!€AD€ €a €bHñ|}y@‚H<_83=?€B·,b<_·$‘i·(€^8Bÿÿ/‚^@ž4H```€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!£ëx8€8 Kÿ‚€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<_83=?€B·,b<_·$‘i·(H˜`<_84=?€B·,b<_·$‘i·(Hp“Û€a@Hå|}xH,A‚(<_85=?€B·,b<_·$‘i·(H0;À“»{H0€^Ãóx€| ¦| xN€!`<;Àÿÿ8cÌKÿ„%€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!8!pÃóx€»aÿì|¦N€ ``|@&|¦½áÿ¼8 8À8àôBŸè¦A”!ÿp<<Ÿ<_?8c—¤8„°x8B©(?_[°àHŒñ/ƒ|ixz°ÐAž@€C<??8c—¬8BIHŒ/ƒ|exy°ÔAž€z°Ð<Ÿ8„—¸H…/ƒ@œ Hø`€ž €~8„ÿÿHˆ}€~€/€AžЀ/€AžHˆa```ƒ¾;Þ/@žÿ´<_;¢(ÃóxHŠ5/ƒAœ$€z°Ð<ŸÅóx;°Ð8„—ÈHŒõ/ƒ@œ€[°à8N"<_A8HÄ=?<_ƒ‰«8;¢ Ô<_£ëx“°t“ H‰Ñ/ƒAœ €z°Ð<Ÿ¥ëx8„—ØHŒ•/ƒ@œ€[°à8"<_A8Hd<_=?;Ÿ€“©°l“ž ÃóxH‰y/ƒAœ €z°Ð<ŸÅóx8„—äHŒ=/ƒ@œ8€[°à8»"<_A8```<_°Ø<_‘"°ÜH<_=?;¢ž“ɰd“ £ëxH‰/ƒAœ €z°Ð<Ÿ¥ëx8„—ôH‹É/ƒ@œ€[°à8å"<_A8Kÿÿ˜<_=?;ÂD“©°`“ž ÃóxHˆ­/ƒAœ €z°Ð<ŸÅóx8„˜H‹q/ƒ@œ€[°à8'"<_A8Kÿÿ@<_=?;¢œ„“ɰ\“ £ëxHˆU/ƒAœ €x<Ÿ¥ëx8„˜H‹/ƒ@œ€[°à8L"<_A8Kÿþè<_=?;šȓ©°hÃóxHˆ/ƒAœ €x<ŸÅóx8„˜ HŠÅ/ƒ@œ€[°à8h"<_A8Kÿþ”<_“°pH‡Y|wy@‚(```€[°à8"<_A8Kÿþ\>¿€y°Ôƒµ±D¤ëxHˆ|~y&@‚lN<_¤ëxM€;€:À€B« €b<_A8H†!€[°à8=?b<_°Ø‘i°Ü€W8Bÿÿ/‚W@žTH8``8`Hˆ].||x@’ M€[°à"HL```“à <¿>_~ã»x8’˜0€¥±hH†Ù/ƒ@œ@;À€[°à,"&M€<_:À8A8<_‘"°Ü<_°ØKÿÿT<_>Ÿ8b˜8A8ƒ°èHƒ½|}yA‚`>?~ã»x¥ëx;À8‘˜DH†]/ƒAœ<Ãxƒãx~ä»xH‡%|~xH$€]£ëx€| ¦| xN€!,&@‚0;À€[°à:À8-ž"<_&W`‘"°ÜKÿÿP€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c¤@H…m.||x@’M€[°à:À8bHì8€ÅóxH„}-ƒ|vx@Ž€[°à8"Hü€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!>Ãóx~ųx€°üH‡A/ƒ@œ,€[°à;€8."<_‘"°Ü<_°ØKÿý°€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<8€8 8c£ìH„q.||x@’M€[°à:À8 bHð8€ÅóxHƒ-ƒ|vx@Ž€[°à8 "H€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!>Ãóx~ųx€“°øH†E/ƒ@œ,€[°à;€8 ."<_‘"°Ü<_°ØKÿü´€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€”°è€z°ÐÅóxH…Ù/ƒ@œ,;€€[°à:À8-œ"<_N ‘"°ÜKÿüì€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!H‚­.||x@’,M€[°à8=?:Àb<_°Ø‘i°ÜHP8`H„1-ƒ|vxAެ=?<¿ƒãx8’˜0)«$€I8BI‘6 €¥±lH‚¹/ƒAœx€A8>Ÿƒ°ä8b˜8HÝ|}yA‚\ƒãx8‘˜D¥ëx;ÀH‚/ƒAœxÃx~óx„ãxHƒI|~xH`€]£ëx€| ¦| xN€!,&@‚€[°à8"H(€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<8€8 8c£ÜH­|wy@‚,M€€[°à8=?:Àb<_°Ø‘i°ÜHè8€ÅóxH€±-ƒ|vx@Ž€[°à8"H 0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€°üÃóx~ųxHƒy/ƒ@œ€[°à8"HŒ€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€”°ä€z°ÐÅóxHƒ%/ƒ@œ,€[°à:À8-–"<_‘"°Ü<_°ØH€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!Hù|wy@‚€[°à8$"Kÿ÷ƒÕ±D€y°ÔÄóxH€Ñ-ƒ|vx@ŽL&W`<_Äóx;À;€N €B« €bH~Ý€[°à8$=?b<_°Ø‘i°ÜKÿø¼8`H5|~y&@‚N€[°à;€8$bH 4’Þ <¿~ã»x8’˜0€¥±pH¹/ƒAœt€A8>Ÿ‚Ô°ì8b˜8H|Ý|}yA‚X~ã»x8‘˜D¥ëx;€H/ƒAœ ~ųxÃóx~ä»xH€I||xH x€]£ëx€| ¦| xN€!.@’,;€€[°à:À8$-œ"<_N ‘"°ÜKÿø|€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<8€8 8c£ÌH~™-ƒ|vx@Ž &W`€[°à;À8&bH 8€…ãxH}¥|~y&@‚€[°à8&"H $€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€°üƒãxÅóxH€m/ƒ@œ,€[°à:À8&-–"<_‘"°Ü<_°ØKÿöÜ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<8€8 8c£¼H}-ƒ|vx@Ž &W`€[°à;À8*bH8€…ãxH|©|~y&@‚€[°à8*"H(€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!=ÿƒãxÅóx€±Hm/ƒ@œ,€[°à:À8*-–"<_‘"°Ü<_°ØKÿõÜ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<8€8 8c£¬H|-ƒ|vx@Ž &W`€[°à;À8-bH8€…ãxH{©|~y&@‚€[°à8-"H(€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<ŸƒãxÅóx€„±H~m/ƒ@œ,€[°à:À8--–"<_‘"°Ü<_°ØKÿôÜ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€”°ì€z°Ð…ãxH~/ƒ@œ0;À€[°à:À8$-ž"<_&W`‘"°ÜKÿõ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!HzÑ-ƒ|vx@Ž$€[°à85"<_°Ø<_‘"°ÜH¬ƒµ±D€y°Ô¤ëxH{•|~y@‚8<_¤ëx€B« €bHy¹€[°à85=?b<_°Ø‘i°ÜH`8`H|.||x@’$€[°à85"<_°Ø<_‘"°ÜHГà <¿8’˜0~óx€¥±tHz/ƒAœt€A8??ƒ¹°ð8b˜8Hw±|~yA‚X8‘˜D~óxÅóx:àHzU/ƒAœ|¥ëxƒãx~ijxH{|wxHd€^Ãóx€| ¦| xN€!/—@ž$€[°à85"<_°Ø<_‘"°ÜHL€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£œHyu|~y&@‚N€[°à;€87bHô8€~å»xHx….||x@’€[°à87"H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€°ü~ã»x…ãxH{M/ƒ@œ0;À€[°à87,"<_&‘"°Ü<_°ØKÿñ¸€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£ŒHxy|~y&@‚N€[°à;€8=bHø8€~å»xHw‰.||x@’€[°à8="H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~ã»x…ãx€„±HzM/ƒ@œ0;À€[°à8=,"<_&‘"°Ü<_°ØKÿð¸€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£|Hwy|~y&@‚N€[°à;€8?bHø8€~å»xHv‰.||x@’€[°à8?"H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€±~ã»x…ãxHyQ/ƒ@œ0;À€[°à8?,"<_&‘"°Ü<_°ØKÿï¼€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£lHv}|~y&@‚N€[°à;€8AbHü8€~å»xHu.||x@’€[°à8A"H €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€“°ø~ã»x…ãxHxU/ƒ@œ0;À€[°à8A,"<_&‘"°Ü<_°ØKÿîÀ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£\Hu|~y&@‚,N€[°à;€8Hb<_=?°Ø‘i°ÜKÿîL8€~å»xHt.||x@’$€[°à8H"<_°Ø<_‘"°ÜKÿî€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~ã»x…ãx€„±Hw5/ƒ@œ0;À€[°à8H,"<_&‘"°Ü<_°ØKÿí €\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€z°Ð€™°ð~å»xHvÅ/ƒ@œ0;€€[°à;À85."<_&W€‘"°ÜKÿíÔ€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!8`Hvq|`yA‚<_8`±xHvY|`y@‚€[°à8)"Kÿê<_8`ƒÂ«<_±|<_>“±€9)‘>Hv|`yA‚<_8`±„Huý|`y@‚€[°à8N"Kÿê4<_8`±ˆHuÕ|`y@‚€[°à8j"Kÿê ~<_=?8`±Œ“ɱ9k‘~Hu™,@‚€[°à8w"KÿéÐ8!<_a€¹áÿ¼b±”|¦}q }p N€ €W~ã»x€| ¦| xN€! A‚0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!A’0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ8€V8Bÿÿ/‚V@ž$€V~óx€| ¦| xN€!``€A88!€a¹áÿ¼8b˜8|¦}q }p KÿiÌ€]8Bÿÿ/‚]@žëèKÿëÌ€]8Bÿÿ/‚]@žï¬Kÿï€]8Bÿÿ/‚]@žò”Kÿòx€^8Bÿÿ/‚^@ž÷¨Kÿ÷Œ``?Ÿƒ¼¤P8¤P/Ažç@|xKÿæè`|¦¾aÿÌ|ƒ#x|@&BŸ|¤+x8è¦A”!ÿp<ß<¿8Æ8¥|ä8á89<D8<@9!@9ADHnU;À/ƒAžhHp<_:`8€B—-“"<_‘"—<_—HìM€<_8=?:`€B—b<_—‘i—HÀ<_8Ãx~ü»x€B—"<_‘"—<_—H”M€<_Ãx~ü»x:`€B—8"<_‘"—HX<_8Ãx~ü»x€B—"<_‘"—<_—Hß<<Ÿƒ–‘P€c‘\€K8BK!<€I8BIa@€K8BKAD€J8BJ<€„—49)‘<HoÑ|~y@‚M€<_8™ãxšãx€B—”ãx:`ãx"<_—<_‘"—: -@Ž ôH M<_8=?:`€B—b<_—‘i—Hà<_8Ãx~ü»x€B—"<_‘"—<_—H´<_;`8Ãx€B—.~ü»x"<_‘"—<_—H€<_8 Ãx~ü»x€B—"<_‘"—<_—HT`8`Ho}.|{x@’`M<_8™ãxšãx€B—:`”ãxãx"<_—<_‘"—€^8Bÿÿ/‚^@ž ”H t```€A8ÃóxdÛx"9)‘"€8 Ho±|}y@‚HM€<_8™ãxšãx€B—”ãxãx:`"<_‘"—<_—Kÿÿx``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8`Ho-|~y@‚DM€<_8™ãxšãx€B—”ãxãx:`"<_‘"—<_—Kÿý|`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<Ÿ€aD€„—pHlÅ|{y@‚@M€<_8šãx”ãx€B—ãxÙóx:`"<_‘"—<_—Kÿüô<Ÿ€„—`Hlu|zy@‚HM<_8M€šãx”ãx€B—ãxÙóx:`: "<_‘"—<_—H d€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!a@€K8BK<9)ÿÿ/‰‘<@ž€\ƒãx€| ¦| xN€!‚@ãxÙóxH~ü»xÃxÔóxyÛx~ƒ£xHj/ƒÿÿA¾ùÄ/ƒ@X~ƒ£x8€8 Hkm|~yA¢ùÐHj!.|{xA²û¸€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`cÛxHm]|xyÀ&@‚PHk-/ƒ@ž<_<Ÿ€B‘l8„~”€bHlÍWÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>€B—H”`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`cÛxHlÍ|wyÀ&@‚pHj/ƒ@ž<_<Ÿ€B‘l8„~”€bHl=WÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>Ãx€B—"<_:`: 8‘"—<_—H0€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`cÛxHl|iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€B‘l8„~”€bHkuH```Hi¡/ƒA¾ø<_: ~ü»xÃx€B—-:`8Mˆ"<_‘"—Kÿÿ(€[cÛx€| ¦| xN€!``CÓxÃxHiù-ƒ|sxA®÷¤?¿€a<€—X:½—XHhÙ|~yA¢÷ˆ$ËxHiÉ.|{xA²ùl€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```?ŸcÛx€œ—„Hhu|~y@¢Kx8BIHЀ^Ãóx€| ¦| xN€!`A²óD: -€[8Bÿÿ/‚[@žó0€[cÛx€| ¦| xN€!Kÿó`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`AŠ0€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!<;À8c~´KÿYU€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€AD"9)ÿÿ/‰‘"@žL€aD€C€| ¦| xN€!H0```€[8Bÿÿ/‚[@ž÷PKÿ÷,``8!Ãóxa€ºaÿÌ|¦}r }q }p N€ ``|@&|¦¾!ÿÄ|sx|”#xBŸè¦A”!ÿp>?ƒÑL#9)‘#€D8BD>9)‘>H^Ý/ƒÿÿ@ž4<_8=?€B…b<_… ‘i…ƒLÃxH`Kÿ@|vy@‚ˆ<_8€€B\€bH`å|~yA‚<8€8 KÿS€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<_8ƒ=?€B…b<_… ‘i…Kÿÿp```<Ÿ~c›x€„…hH^å|wy@‚ì<_8…=?€B…b<_… ‘i…Kÿÿ(<_8…=?€B…b<_… ‘i…HôM <_zÛx˜ãx:@€B…8†"<_‘"…HX=?:@<_zÛx)…-˜ãx€ 9 †…HÐMˆ<_zÛx˜ãx; €B…8‡"<_‘"…<_… HhMKÿÿÌ```8€H_m-ƒ|yx@Ž`M <_8…Úóx:@€B…Øóx"<_… <_‘"…```€W8Bÿÿ/‚W@ž°Hˆ``€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`#ËxH\-|wy@‚DM<_8…Úóx:@€B…Øóx"<_‘"…<_… H4```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`Úóx: Øóx`~ã»xH_-ƒ|yx@®0H\í/ƒAžPM <_:@€B…"H ``H[a-|rxAªýÀ€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`~C“xH^|{yÀ&@‚`H\m/ƒ@ž<_<Ÿ€Bh8„l€bH^ WÞ >Ñ WÞ`><_; €B…"<_8…… <_‘"…Kÿþ8`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`~C“xH]ý||yÀ&@‚`H[Í/ƒ@ž<_<Ÿ€Bh8„l€bH]mWÞ >Ñ WÞ`><_8…=?€B…zÛx; b<_… ‘i…Kÿý”€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`~C“xH]]|iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bh8„l€bH\µH```HZá/ƒA¾(=?<_; zÛx)…˜ãx-™€ 9 ……<_‘"… KÿüÄ€R~C“x€| ¦| xN€!``~ƒ£xdÛxH[9-ƒ|yxA®ûœH\©|}xHZa.@²û´€Y8Bÿÿ/‚Y@ž$€Y#Ëx€| ¦| xN€!``€VV¾8~ƒ£x„ãx¢ñ.HZÍ-|rxAªûˆH\=|}xHYõ/ƒ@¾û¨€R8Bÿÿ/‚R@ž(€R~C“x€| ¦| xN€!```€V:µ˜ãxzÛx|Bò“¢Kÿü˜€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!’¶<߀v~¤«x8 €ÆH~Þ³xHV HÔ€W~ã»x€| ¦| xN€!```AŽ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!AŠ0€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!8<8¡@8a8HYµ<8clØHU)€<€¡@|~x€a8HY5/ž@ž ƒÑL`Ãóx;ÀHVÙ€Z8Bÿÿ/‚Z@ž$€ZCÓx€| ¦| xN€!``€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€T8Bÿÿ/‚T@ž@€T~ƒ£x€| ¦| xN€!H$€R8Bÿÿ/‚R@žý Kÿüü``8!Ãóxa€º!ÿÄ|¦}r }q }p N€ ``|¦¿ÿð|œ#xBŸ8€|½+x覔!ÿ €˜| ¦| xN€!|~yA‚È=?<¿<ß8)vdƒãx¤ëx8¥`ä8ÆuD8á89<‘> <8€I8BIHSA/ƒAž8€^8B^!8€I8BIa<€K8BK€a8€Ò WÞ@><_WÞ >Ñ WÞ`>8ì€Bz¹ëx:à: ¸ëx"<_‘"z<_zKÿþ|`8`HN½|yy@‚D<_-8í¹ëx€Bz:à: Mˆ¸ëx"<_‘"z<_zKÿþ,`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€a8HP½|zyA‚ ¸ëxH@M<_8îM€¸ëx:à€Bz: "<_‘"z<_zKÿý¨ØóxCÓxHSé|~y@‚pHQ½/ƒAž4<_: 8îÃx€Bz-•;€:àN M "<_z<_‘"z€Z8Bÿÿ/‚Z@ž8H```€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`<Ÿ#Ëx€„z4HPÕ.||x@’8M<_8ïM:à: €Bz"<_‘"z<_zKÿÿ`€a<ÄóxHQ‰-ƒ|wx@ŽM <_: €Bz"Hp8`HQ-|ux@Š0<_8ï=?€Bzb<_z‘izKÿþø``’ã ~¤«xƒãxHQ•|}y@‚° W½€><_8V:à€Bnè"<_nàKÿþÜ`HEÁ.|wxA’Ì€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`~ã»xHHý|~y &A‚dHI |yxHFÅ/ƒ@žt€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```~ã»xHH|~y &@‚@HFm/ƒ@ž<_<Ÿ€Bi<8„Vd€bHH <_€BnèbHÜ``HHq|{xHF)/ƒ@¾ÿØ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!~ã»xHH |iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bi<8„Vd€bHGeH```HE‘/ƒA¾<_;À€Bnè, &b```8V<_=?nà‘inäKÿý €W~ã»x€| ¦| xN€!<W 8;€I"Y.<€I|BZ“bKÿýœ€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\<ß8 ;À€Æi“€\`€‚€bHAuH €ZCÓx€| ¦| xN€!`¸ A‚<€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```A’0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!<;Àÿÿ8cVèKÿ;€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!/ž@œl€\8Bÿÿ/‚\Až0;€HP```€W8Bÿÿ/‚W@žþ@Kÿþ$€\ƒãx;€€| ¦| xN€!```8!€ƒãx€aºáÿÜ|¦}p N€ |¦¾ÁÿØ|{xBŸ|ƒ#x|¤+xè¦8”!ÿ€<_<ß<¿€Bh 8Æa$8¥P$8á89<8Aß???:à{`ƒÁ8€^€B4/‚Až0€ /€Až$Ãóx„ãxH?é|~xH````ƒãxHCÍ|}yA‚LÃóx¤ëxHBÙ€]|~x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/ž@ž€Yg쀒øgägèH`ÃóxHCý|}xHAµ/ƒAž,€Yg쀒øgägè€^8Bÿÿ/‚^@žØH¼€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`W‚:;œ;šà¢I.@žþÌ€aKx8BIH,€^Ãóx€| ¦| xN€!<;À8cP(Kÿ7•€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!€Ãóx€ºÁÿØ|¦N€ ``|¦¿ÿà|}xBŸè¦”!ÿ ??ƒY^ô#9)‘#€Z8BZc #€K€‰AœP<_8€8 XÓx€B^ì€bKÿ3u<_8Z=?€Bd¼b<_d´‘id¸HP```€/€@žXÓxH ```<Ÿ€k €„eH>å||y@‚,<_8\XÓx€Bd¼"<_d´<_‘"d¸Hä€\} =4KU)8/ˆ€J|‰.Až€ /€AžH<]|~xHd|ƒ#xH@M|{y@‚`&;ÀHTƒãxdÛxH?M€[|~x8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``,`&@‚H<_8\ƒ^ô€Bd¼"<_d´<_‘"d¸€\8Bÿÿ/‚\@žÀHœ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€y^ôØóx€C8Bÿÿ/‚C@ž€C€| ¦| xN€!€/€AžÈ€}H?1||y@‚(<_8^=?€Bd¼b<_d´‘id¸HT8`H=Ý|~y`&@‚0<_8^=?€Bd¼b<_d´‘id¸Kÿÿ ``= <Äóx€I8BI€ “ž €cd@H>9||y@‚(<_8^=?€Bd¼b<_d´‘id¸H„€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€šãx/€Ažx8`H<Ý|iy@‚(<_8`=?€Bd¼b<_d´‘id¸H €X€y^ô}>Kx8BX“ €\8B\“‰€C8Bÿÿ/‚C@ždHH€\€y^ôžãx8B\H`€X€y^ôÃx8BX#9)ÿÿ/‰‘#@ž€C€| ¦| xN€!`=Üóx9)‘=€^8B^Hx€\ƒãx€| ¦| xN€!``x A‚<€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```<;€8cMKÿ1õƒÙ^ô€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!`ƒãx€»ÿà|¦N€ ```|¦¿!ÿä||xBŸè¦”!ÿ ?_ƒÚY$#9)‘#€^8B^# €C€ ‚AœT<_8€8 Ùóx€BYÛóx€bKÿ-¥<_8==?€B^ìb<_^ä‘i^èH ```€/€@žÙóxH°```<Ÿ€c€„_4H9|}y@‚<<_8?ÙóxÛóx€B^ì"<_^ä<_‘"^èH°```=| €\)4KTB8/‰|‚P.Až€ /€AžH6|{xHh|ƒ#xH:q|~y@‚À&;`H\£ëxÄóxH9q€^|{x8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```/›À&WÞà@žD<_8?ƒ:Y$€B^ì"<_^ä<_‘"^è€]8Bÿÿ/‚]@žlHH`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€zY$yÛx€C8Bÿÿ/‚C@ž€C€| ¦| xN€!€/€Ažh<Ÿ€|€„_4H7i|}y@‚0<_8AƒzY$€B^ì"<_^ä<_‘"^èH`=| €\)4€ TB8/‰|B€‚Až€ /€AžH4Ý|{xHd|ƒ#xH8Í|~y@‚À&;`HX£ëxÄóxH7Í€^|{x8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``/›À&WÞà@ž4<_8A=?€B^ìb<_^ä‘i^èKÿþd```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ƒÚY$€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€/€Ažˆ8`H6¡|iy@‚(<_8C€B^ì"<_^ä<_‘"^èH„€Y8BY“) €[8B[“i€^8Bÿÿ/‚^Až }>KxH¸€^Ãóx}>Kx€H˜€[8B[>9)ÿÿ/‰‘>Až ~ÛxH|€^Ãóx~Ûx€| ¦| xN€!H\``€YzY$8BY+9)ÿÿ/‰‘+Až}{[x>ËxH$€K}c[x}{[x>Ëx€| ¦| xN€!<Ýóx9)‘<€^8B^H”€]£ëx€| ¦| xN€!``WÞ >Ð WÞà>Až8€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!ƒzY$HƒzY$``<; 8cGpKÿ+UƒÚY$```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!`£ëx€»!ÿä|¦N€ ```|¦¾!ÿÄ|xx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆX8¥5øH/‘/ƒAž¸8<_8`ƒ"Rp9)‘8€Y8BYH/!|wy@‚8<_8 =Ëx€BX8"<_X0<_‘"X4HÀ```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€X‚¢/•@:À>>Ÿ>_: ```~óxH3ý|~yA‚ü8`H2Í.|{x@²04X88€IX0SX4€^8Bÿÿ/‚^@žØH¼€X|dx8BX“Ó <€cW¼H31|zyA‚°€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`<Ÿ~ã»xYÓx€„XdH11.|{xA’$<Ÿ€x €„X€H1|~yA‚0>xVÊ8)4€K/‰|Š.Až€ /€AžH.½|}xHT|ƒ#xH2­||yA‚¼Ãóx„ãxH1¹€\|}x8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`,€&A‚p€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``8`H0ý|~yA‚„“¾ 8`€Z8BZ“^H0Ù|}y€&@¢€TX8€’2X0X4Kÿþ`“Ý cÛx¤ëxH1e|~yA‚,€[8Bÿÿ/‚[@ž(€[cÛx€| ¦| xN€!```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`:Ö•°@žý`€W~þ»x~ý»x8BWH\€^Ãóx€| ¦| xN€!@’tH$€&<_; 8€BX8"H€&<_; 8€BX8"<_X0<_‘"X4H4<_8=?€BX8b<_X0‘iX4H; ,€&€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!˜ A‚x€]8Bÿÿ/‚]@žd€]£ëx~ý»x€| ¦| xN€!HL<_~ý»x8€BX8"H<_~ý»x8€BX8"<_X0<_‘"X4H ~ý»x`<;À8c@àKÿ$õ€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`8!€Ãóx€aº!ÿÄ|¦}p N€ |¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆQì8¥/ØH)q/ƒAžh9<_8`ƒÂLP9)‘9€^8B^H)|zy@‚8<_8Ýóx€BR"<_R<_‘"RH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:```€–RDCÓxH+ù||yA‚ô<Ÿ€y €„R`H+á.|~x@²D &W½€€UR;`€’tRR€\8Bÿÿ/‚\@ž4H```#yW 8)4€K/‰|Š.Až$€ /€AžH)E|{xH\``|ƒ#xH--|}yA‚TÃóx¤ëxH,9€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€UR/›€’tR &W½àRKÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H+M.|~x@²€URKÿþ¸`“c ÄóxƒãxH+å|}y@¢ &€UR;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8]Óx€BR"<_R<_‘"RH]Óx<;À8c:ÜKÿõ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦½áÿ¼|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿp<ß<¿8ÆM 8¥+H$¡/ƒAž(9<_8`ƒÂG€9)‘9€^8B^H$1|xy@‚8<_8ÒÝóx€BMH"<_M@<_‘"MDH````€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚Â/–@:à>Ÿ>¿>?>>_:Ô9àÕ€”MtÃxH')|{yA‚´€y €•MH'.|~x@²H &W½€€SMH;€;@M€’M@MD€[8Bÿÿ/‚[@žÀH¤``#yVú8)4€K/‰|‚Ð.Až$€ /€AžH$u||xH\``|ƒ#xH(]|}yA‚LÃóx¤ëxH'i€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`-œ@®<;@€SMH;€/š€’M@ &W½àMDMœKÿÿ ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€y €•MH%¹.|~x@², &W½€€SMH;@€‘òM@MDKÿþ¬``#y)4€K/‰|BÒ€‚Až$€ /€AžH#5|zxH\``|ƒ#xH'|}yA‚TÃóx¤ëxH&)€]|zx8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/š &W½à@¾4;@€SMH/š€‘òM@ &W½àMDKÿýà```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H%=.|~x@²€SMHH4`“ƒ “C8`H%-ƒ||x@®( &W½`€SMH;@€’M@MDKÿýH`“à „ãxcÛxH%•|~y@¢, &€SMH;À;@N€’M@MDKÿý`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`:÷–¸@žü`€XÃxÃx8BXHü€[cÛx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!W½ >° W½à>Až`€Z8Bÿÿ/‚Z@žL€ZCÓxÃx€| ¦| xN€!H0<_8ÔÃx€BMH"<_M@<_‘"MDHÃx<;À8c6(Kÿe€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!Ãóxa€¹áÿ¼|¦}q }p N€ ```|¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆF„8¥$hH/ƒAžh9<_8`ƒÂ@à9)‘9€^8B^H‘|zy@‚8<_8ÙÝóx€BF¨"<_F <_‘"F¤H ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:`Û``€–FÔCÓxH ‰||yA‚ô<Ÿ€y €„FðH q.|~x@²D &W½€€UF¨;`€’tF F¤€\8Bÿÿ/‚\@ž4H```#yW 8)4€K/‰|Š.Až$€ /€AžHÕ|{xH\``|ƒ#xH!½|}yA‚TÃóx¤ëxH É€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€UF¨/›€’tF  &W½àF¤Kÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`HÝ.|~x@²€UF¨Kÿþ¸`“c ÄóxƒãxH u|}y@¢ &€UF¨;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8Û]Óx€BF¨"<_F <_‘"F¤H]Óx<;À8c/¨Kÿ…€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆA¸8¥˜H1/ƒAžh9<_8`ƒÂ<9)‘9€^8B^HÁ|zy@‚8<_8ßÝóx€BAØ"<_AÐ<_‘"AÔH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:`á``€–BCÓxH¹||yA‚ô<Ÿ€y €„B H¡.|~x@²D &W½€€UAØ;`€’tAÐAÔ€\8Bÿÿ/‚\@ž4H```#yW8)4€ /‰|B€‚Až € /€AžH|{xHX`|ƒ#xHí|}yA‚TÃóx¤ëxHù€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€UAØ/›€’tAР&W½àAÔKÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H .|~x@²€UAØKÿþ¸`“c ÄóxƒãxH¥|}y@¢ &€UAØ;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8á]Óx€BAØ"<_AÐ<_‘"AÔH]Óx<;À8c*øKÿµ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦¿Aÿè|š#xBŸ|{x覔!ÿ #9)‘#€D8BD<Ÿ€c €„=dH½|~y@‚4<_8Å=?€B= b<_=‘i=HÐ```DÓxH}|}y€&@‚@<_8Å=?€B= b<_=‘i=€^8Bÿÿ/‚^@žŸ>¿>?>>_:§9਀”9dÃxH|{yA‚´€y €•9€H.|~x@²H &W½€€S98;€;@M€’9094€[8Bÿÿ/‚[@žÀH¤``#yVú8)4€K/‰|‚Ð.Až$€ /€AžHe||xH\``|ƒ#xHM|}yA‚LÃóx¤ëxHY€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`-œ@®<;@€S98;€/š€’90 &W½à94MœKÿÿ ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€y €•9€H©.|~x@², &W½€€S98;@€‘ò9094Kÿþ¬``#y)4€K/‰|BÒ€‚Až$€ /€AžH%|zxH\``|ƒ#xH |}yA‚TÃóx¤ëxH€]|zx8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/š &W½à@¾4;@€S98/š€‘ò90 &W½à94Kÿýà```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H-.|~x@²€S98H4`“ƒ “C8`H-ƒ||x@®( &W½`€S98;@€’9094KÿýH`“à „ãxcÛxH…|~y@¢, &€S98;À;@N€’9094Kÿý`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`:÷–¸@žü`€XÃxÃx8BXHü€[cÛx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!W½ >° W½à>Až`€Z8Bÿÿ/‚Z@žL€ZCÓxÃx€| ¦| xN€!H0<_8§Ãx€B98"<_90<_‘"94HÃx<;À8c"¤KÿU€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!Ãóxa€¹áÿ¼|¦}q }p N€ ```|¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8Æ2€8¥XH ñ/ƒAžh9<_8`ƒÂ,Ð9)‘9€^8B^H |zy@‚8<_8¬Ýóx€B2˜"<_2<_‘"2”H ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:`®``€–2ÄCÓxH y||yA‚ô<Ÿ€y €„2àH a.|~x@²D &W½€€U2˜;`€’t22”€\8Bÿÿ/‚\@ž4H```#yW 8)4€K/‰|Š.Až$€ /€AžH Å|{xH\``|ƒ#xH ­|}yA‚TÃóx¤ëxH ¹€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€U2˜/›€’t2 &W½à2”Kÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H Í.|~x@²€U2˜Kÿþ¸`“c ÄóxƒãxH e|}y@¢ &€U2˜;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8®]Óx€B2˜"<_2<_‘"2”H]Óx<;À8c$Kÿu€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8Æ-´8¥ ˆH!/ƒAžh9<_8`ƒÂ(9)‘9€^8B^H±|zy@‚8<_8²Ýóx€B-È"<_-À<_‘"-ÄH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:`´``€–-ôCÓxH©||yA‚ô<Ÿ€y €„.H‘.|~x@²D &W½€€U-È;`€’t-À-Ä€\8Bÿÿ/‚\@ž4H```#yW8)4€ /‰|B€‚Až € /€AžHñ|{xHX`|ƒ#xHÝ|}yA‚TÃóx¤ëxHé€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€U-È/›€’t-À &W½à-ÄKÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`Hý.|~x@²€U-ÈKÿþ¸`“c ÄóxƒãxH•|}y@¢ &€U-È;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8´]Óx€B-È"<_-À<_‘"-ÄH]Óx<;À8cpKþû¥€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦BŸ}h¦=k|¦…‹"@}‰¦N€ |¦BŸ}h¦=k|¦…‹"$}‰¦N€ |¦BŸ}h¦=k|¦…‹"}‰¦N€ |¦BŸ}h¦=k|¦…‹!ì}‰¦N€ |¦BŸ}h¦=k|¦…‹!Ð}‰¦N€ |¦BŸ}h¦=k|¦…‹!´}‰¦N€ |¦BŸ}h¦=k|¦…‹!˜}‰¦N€ |¦BŸ}h¦=k|¦…‹!|}‰¦N€ |¦BŸ}h¦=k|¦…‹!`}‰¦N€ |¦BŸ}h¦=k|¦…‹!D}‰¦N€ |¦BŸ}h¦=k|¦…‹!(}‰¦N€ |¦BŸ}h¦=k|¦…‹! }‰¦N€ |¦BŸ}h¦=k|¦…‹ ð}‰¦N€ |¦BŸ}h¦=k|¦…‹ Ô}‰¦N€ |¦BŸ}h¦=k|¦…‹ ¸}‰¦N€ |¦BŸ}h¦=k|¦…‹ œ}‰¦N€ |¦BŸ}h¦=k|¦…‹ €}‰¦N€ |¦BŸ}h¦=k|¦…‹ d}‰¦N€ |¦BŸ}h¦=k|¦…‹ H}‰¦N€ |¦BŸ}h¦=k|¦…‹ ,}‰¦N€ |¦BŸ}h¦=k|¦…‹ }‰¦N€ |¦BŸ}h¦=k|¦…‹ô}‰¦N€ |¦BŸ}h¦=k|¦…‹Ø}‰¦N€ |¦BŸ}h¦=k|¦…‹¼}‰¦N€ |¦BŸ}h¦=k|¦…‹ }‰¦N€ |¦BŸ}h¦=k|¦…‹„}‰¦N€ |¦BŸ}h¦=k|¦…‹h}‰¦N€ |¦BŸ}h¦=k|¦…‹L}‰¦N€ |¦BŸ}h¦=k|¦…‹0}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹ø}‰¦N€ |¦BŸ}h¦=k|¦…‹Ü}‰¦N€ |¦BŸ}h¦=k|¦…‹À}‰¦N€ |¦BŸ}h¦=k|¦…‹¤}‰¦N€ |¦BŸ}h¦=k|¦…‹ˆ}‰¦N€ |¦BŸ}h¦=k|¦…‹l}‰¦N€ |¦BŸ}h¦=k|¦…‹P}‰¦N€ |¦BŸ}h¦=k|¦…‹4}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹ü}‰¦N€ |¦BŸ}h¦=k|¦…‹à}‰¦N€ |¦BŸ}h¦=k|¦…‹Ä}‰¦N€ |¦BŸ}h¦=k|¦…‹¨}‰¦N€ |¦BŸ}h¦=k|¦…‹Œ}‰¦N€ |¦BŸ}h¦=k|¦…‹p}‰¦N€ |¦BŸ}h¦=k|¦…‹T}‰¦N€ |¦BŸ}h¦=k|¦…‹8}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹ä}‰¦N€ |¦BŸ}h¦=k|¦…‹È}‰¦N€ |¦BŸ}h¦=k|¦…‹¬}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ pygr.cdict.IntTupleArrayholder for array of integer index valuesisDoneset_vectorreallocpygr.cdict.CGraphIteratoriterator for looping over elements in CGraphDictpygr.cdict.CDictIteratoriterator for looping over elements in CDictionarypygr.cdict.CGraphDictgeneral purpose graph in C; key_index supplies mapping to integer indexeskey_indexiteritemsitervaluesitemskeysvaluespygr.cdict.CDictionaryRefholds a reference to a CDictpygr.cdict.CDictionarygeneral purpose dict in C; key_index supplies mapping to integer indexespygr.cdict.CIntDictionaryboth keys and values MUST be integersget_more__getitem____iter____len____init____next__cdict.pyxselfOraise: arg 3 must be a traceback or Noneinstance exception may not have a separate valueraise: exception must be an old-style class or instancepygr.cdict.CIntDictionary.__getitem__pygr.cdict.CIntDictionary.iteritemspygr.cdict.CIntDictionary.itemspygr.cdict.CIntDictionary.keyspygr.cdict.CIntDictionary.__iter__pygr.cdict.CDictionary.__getitem__pygr.cdict.CDictionary.itervaluespygr.cdict.CDictionary.iteritemspygr.cdict.CDictionary.__iter__pygr.cdict.CDictionaryRef.itervaluespygr.cdict.CDictionaryRef.iteritemsgraphidictOiMissing type objectArgument '%s' has incorrect type (expected %s, got %s)pygr.cdict.CDictionaryRef.__cinit__pygr.cdict.CDictionaryRef.__iter__pygr.cdict.CGraphDict.__getitem__pygr.cdict.CGraphDict.valuespygr.cdict.CGraphDict.itervaluespygr.cdict.CGraphDict.iteritemspygr.cdict.CGraphDict.__iter__pygr.cdict.IntTupleArray.__getitem__npygr.cdict.IntTupleArray.reallocvector_lendimskipIndexOO|OOpygr.cdict.IntTupleArray.__cinit__pygr.cdict.KeyIndex.__init__kOOpygr.cdict.__getitem__pygr.cdict.KeyIndex.__getitem__qmlistpygr.cdict.QueryMatchIterator.__init__gqcompilermatchesdataGraphquery_fOOOOOpygr.cdict.QueryMatchList.__init__pygr.cdict.QueryMatchList.__len__pygr.cdict.QueryMatchList.get_more__import__OOOOpygr.cdict.QueryMatchList.__getitem__pygr.cdict.QueryMatchList.__iter__pygr.cdict.QueryMatchIterator.__next__gyieldKeysyieldValuesO|OOpygr.cdict.CGraphIterator.__init__cdcdrO|OOOpygr.cdict.CDictIterator.__init__cdict__builtin____builtins__CIntDictionaryCDictionaryCDictionaryRefCGraphDictCDictIteratorCGraphIteratorIntTupleArray__doc__pygr.cdict__module__dataTupleunpack sequence of wrong sizepygr.cdict.CGraphQueryMatch.__init__pygr.cdict.cdict_initdpygr.cdict.CGraphDict.__cinit__pygr.cdict.CIntDictionary.__cinit__vectorgotoNextO|Opygr.cdict.IntTupleArray.set_vectorpygr.cdict.CGraphIterator.__next__pygr.cdict.CDictIterator.__next__pygr.cdict.CGraphDict.itemspygr.cdict.CGraphDict.keyspygr.cdict.CDictionaryRef.itemspygr.cdict.CDictionaryRef.keyspygr.cdict.CDictionaryRef.valuespygr.cdict.CDictionaryRef.__getitem__pygr.cdict.CDictionary.itemspygr.cdict.CDictionary.keyspygr.cdict.CDictionary.values3À(#ÀPˆA˜AŒPxû3à@ì@Äe`4 $4î AP4 aÀAchange the number of hits to be loaded as one blocksave vector for continuing from this point, or next point0\ 0$ 4("pQtQLQ@Q0Eû4D"ð#@ÐñPQ ›°"4x R`R8R,REû4” À!@p÷ R žà€4ÈSD”DˆRøEû4à p[0D(DÜ5, 58XÐ5DVp5PýÐ5Xð5`QÀM°ð5h`S°EèEÜS Eû5„  K`E|H`58Eð5DC€5PÀ5X`5`0p5¤ðTXG<G0THEû5¼PBFÐÙà58?°5D=P5PÐ5X#p5`(@9€Ð6 UHpHdTðû6$7€H$ç 5X3°5P/ 58,ð+P`6L°6X†6dŽ€6p~6xz06„à6d°6xwÐ6x¾ð6XnI8get the integer index for python object k, or create one if needed6xkV NPV$ND V(N0V,N V0N V4N V8Mü V<Mð V@MèVDMÜ VHMÔVLMÈ VPM¼ VTM° VXM¤ V\M V`MœVdM VhMˆVlM€VpMt VtMh VxM`V|MXV€MPV„MHVˆM< VŒM4VM,V”M$V˜MVœLèV LÔV¤L 3V¨LXFV¬L0%V°KìAprovide queryMatch mapping based on a list of (node,edge) tuplesiterate over items in QueryMatchListprovides mapping of query nodes / edges onto CGraphDict nodes / edgesconstruct integer index for sets of python objectsindex out of boundscd or cdr must be non-Nonethis type cannot do slicing...typessortquery_fqueryNodeqmlistobjectmatcheskeyskey_indexiteritemsitemsisDoneindex_keysigqigqcompilerget_morefromNodedataGraphappend__next____len____iter____init____getitem__SliceTypeQueryMatchListQueryMatchIteratorKeyIndexCGraphQueryMatch66œ8È8Ð:@:@:h:t:x6œ6œ:Ð6œ;6œ;@;L;T;`6œ6œ6œ:Ð6œ6œ@>Hàà@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@@OX@OT@OL@OD@O@@O8@O4@O,@O(@O$@O @O@O@O@O @O@O@Nü@Nô@Nì@Nä@Nà@NØ@NÐ@NÈ@NÄ@NÀ@N¼@N¸@N°@N¬@N¤@N @N˜@N@NŒ@Nˆ@N„@N|@Nt@Np@Nh@Nd@KÔ@KÌ@KÄ@K¼@K´@K¬@K¤@Kœ@K”@KŒ@K„@K|@Kt@Kl@Kd@K\@KT@KL@KD@K<@K4@K,@K$@K@K@K @K@Jü@Jô@Jì@Jä@JÜ@JÔ@JÌ@JÄ@J¼@J´@J¬@J¤@Jœ@J”@JŒ@J„@J|@Jt@Jl@Jd@J\@JT@JL@JD@J<@J4@J,@J$@J@J@J @J@Iü@Iô@Iì@Iä@IÜ@IÔ@IÌ@IÄ@I¼@I´@I¬@I¤@Iœ@I”@IŒ@I€@I|@I4@I,@I(@I@I@I @I@Hü@Hø@Hì@Hè@HÜ@HØ@HÌ@HÈ@H¼@H¸@H¬@H¨@Hœ@H˜@H|@Hh@HH@HD@H8@H4@H(@H$@H@GØ@GÐ@G¼@G´@Gœ@G˜@G”@G|@Gp@GH@G4@G@G@G@G@Fô@Fð@Fä@Fà@FÔ@FÐ@F¬@F„@F|@Fp@Fl@Fh@F`@FH@FD@F@@F(@F@Eô@Eà@EÀ@E¼@E°@E¬@E @Eœ@E@EŒ@E€@E|@EX@E0@E(@E@E@E@E @Dô@Dð@Dì@DÔ@DÈ@D @DŒ@Dl@Dh@D\@DX@DL@DH@D<@D8@D,@D(@D@CÜ@C¸@C´@C¬@C @Cœ@C˜@C@Cx@Ct@Cp@CX@CL@C@C@Bô@Bð@Bì@Bà@BÜ@BØ@BÐ@B¸@B´@B°@B˜@BŒ@B\@BT@B4@B0@B,@B @B@B@B@Aø@Aô@Að@AØ@AÌ@A¤@A˜@A@AŒ@A@A@@ü@@ø@@ð@@ì@@Ä@@ @@|@@x@@\@@T@@<@@8@@4@@@@@Ol@Oh@P8@P4@P0@P,@P(@P$@P @P@P@P@P@P @P@P@P@Oü@Oø@Oô@Oð@Oì@Oè@Oä@Oà@OÜ@OØ@OÔ@OÐ@OÌ@OÈ@OÄ@OÀ@O¼@O¸@O´@O°@O¬@O¨@O¤@O @Oœ@O˜@O”@O@OŒ@Oˆ@O„@O€@O|@Ox@Ot@Op@[@p@md–d¤f¥<´€.DD ˜DœD  D¤D ¬D °D ¸DÄD ÈDÌDÐDàÂ$Õ@Þ@çÀèàøé€ø€"€5€_€n€†€­$hNø.DDD$D,®$À@É$DND.PDPD!PD#dD'tÊ$Pá@ï@ý€ €$(Nx.€D+€D/€D3ˆD2ŒD4D5 D6¬D8ÀD9ÐD4ÔD5ðD6ôD> $+€3@*<@*E@,N€Y@, d@, m@-vÀ€wàx$N.DCDFDCDF DC$DF,DG0DI8DJDDIHDJLDKPDO`y$CŽ@B—@D¡À¢àx£€´€Ê€ö€ € "€ J$hNx.€D^€Db€DfˆDeŒDgDh Di¬DkÀDlÐDgÔDhðDiôDq K$^€ b@] l@] u@_ ~@_ ‰@_ ’@` œÀ€ à ž$N.DuDv Ÿ$u ²@t »€ Ë$N. DS DU4DVPDUXDV\DdDlDUtDW€DXˆDZ Ì$S ß@R é@T òÀ ó@V üÀd ýàt þਠÿ$ˆN¨ d¨ d° *d° 7f 8< G€ U#À ‚Pˆ ¤A˜ ÈAŒ ëPx @ì 7@Ä ae` Šî »AP îaÀ A L0 z\  ¬$  Ö"p Qt 'QL LQ@ pQ0 “"ð Â#@ îÐñPNQ y›°©"Ó R`"R8FR,iR‹ À¹!@äp÷ BR lžà›€ÄîS D”.DˆNRøm ˜pÀ[0ìD(D:Ü`XÐVp»ýÐäð QÀ6M°eðŒ`ºS°ÝEèEÜ&S I x ¤K`ÔE|ÿH`)EðZC€ŒÀ¹`å0FpqðœTX¼G<ÞG0ÿTHKPtB¡FÐÉÙàð?°=PMÐw#p (@Ë9€ûÐ#QUtHp™Hd½Tðà7€H$;ç e3°‘/ ¾,ðï+P"`MU˜uUœšU ÃU¤ìU¨H˜E°uH¨«†ÞH¸Ž€AHÈs~¢HØÕz0Hè<àpHø§°ÛIwÐFI{¾ð­I(Ün I8 6I| bk ‹U¬ ³U° ÜIŒ îV !NP!V$!%ND!0V(!LN0!WV,!oN !zV0!N!˜V4!­N!¸V8!ÊMü!ÔV<!æMð!ñV@"Mè" VD"MÜ"*VH":MÔ"DVL"WMÈ"bVP"tM¼"~VT"M°"›VX"¯M¤"ºV\"ÇM "ÑV`"ÜMœ"æVd"úM#Vh#Mˆ#Vl#.M€#9Vp#LMt#WVt#jMh#tVx#‚M`#V|#žMX#©V€#¹MP#ÄV„#ÔMH#ÞVˆ#ñM<#ûVŒ$ M4$V$%M,$0V”$?M$$JV˜$VM$aVœ$mLè$xV $„LÔ$V¤$›L $¦V¨$²LX$½V¬$ÉL0$ÔV°$àKì$ëU´$úNd% Nh.°DT°DX¸DT¼DXÀDTÄDUÌDTÐDXÔDUèDXìDYüDZ D[D` DbP% $T°%Z@T%l@T%~@T%€U8%£@V%²&WNh%È€%Ô€%ã€%ý€&€&C€&R€&€&©€&Ó€&ä€+€+¡€+»€+Ì€+å€+ö€,€,"€,=€,N€,e€,v€,Ž€,Ÿ€,°€,Á€,Ò€,ê€,û€-€-'€-C€-T€-p€-€-²€-À-߀-ð€.€.€.3€.N€.j€.{€.Œ€.€.¹€.Õ€.í€.þ€/€/(€/?€/P€/h€/x€/ˆ€/˜€/¨€/¸€/È€/ç€0€0(€09€0I€0Y€0i€0†€0–€0¦€0¶€1€1€2€2€2 €20€6;€7J€7§€8/€8J€8\€8r€8„€8š€8ª€8Ä€8Ý€8ï€9€9€93€9E€9b€9t€9‘€9¤€9Æ€9á€9ÿ€:€:5€:Y€:l€:€: €:À:Ô€:å€:ö€;€;€;)€;:€;K€;\€;mÀ°;nàh;o$¸Nh.pD ´pD ·„D ½D ¿´;p$ ´p;¥@ ´;¹$\NÌ.ÐD SÐD VäD \ðD ^;º$ SÐ;ð@ S<$\N,.0D –0D ˜@D ™LD žPD  l<$ –0<;@ –€>€>K€>^€>z€>£€ “8>¯€ “<>º€ “@>ÄÀ>Åà>Æ$Nô.D ŸD ¢D £(D ¦<>Ç$ Ÿ>ù@ Ÿ?@ Ÿ ? @ Ÿ?@  ? €?+€?>€?Y€?jÀ?kàL?l$LNL.PD ¨PD ¬hD «pD ¬tD ­xD ¬|D ­ˆD ¯¸?m$ ¨P?œ@ ¨?¥@ ª ?®ÀP?¯àÐ?°$€NÐ.ÐD °ÐD ²ÜD °äD ²ìD ³øD ´D ³D ´ D ¶H?±$ °Ð?ß@ °?è@ °?ó@ ±?ü@ ²@ÀÐ@à`@$N`.`DE`DGtDHÀDIøDJüDIDJDIDJDI@$E`@<@E@E€@Ü$ÀN . DL DO<DPHDR`DSlDVˆ@Ý$L A@LA@LA&@LA0@MA9À A:àœA;$|Nœ. DX D\¼D[ÄD\ÈD]ÌD\ÐD]ÜD^D_D`D_ D`,DbXA<$X An@XAw@ZA€À AàpA‚$ÐNp.pDcpDe|Dc„DeŒDf˜Dg¸Df¼DgÀDièAƒ$cpA´@cA½@cAÈ@dAÑ@eAÚÀpAÛàAÜ$N.D÷DûD C$Dü(D D,D B0D D8D G<D JDD OPDþ€Dÿ”D˜Dÿ¤D¬D°DèDAÝ$÷B @÷B€B–€B©€BÁ€Bï€C€C€CJ€ú8CV€ú<Ca€ú@CkÀClà°Cm$N. D D 4D HD \Cn$ CŸ@C¨@ C³@C½@CÆÀ CÇàlCÈ$LNl.pDpDˆDD”D˜DœD¨DØCÉ$pC÷@D@ D ÀpD àðD $€Nð.ðDðDüDD DD8D<D@DhD $ðD9@DB@DM@DV@D_ÀðD`à€Da$N€.€D¤€D¦ˆD¤ŒD¦œD§¬D©´DªÌD¬àDb$¤€D‘@¤Dœ@¤D¥@¤D®€E€€E“€E°@¦ E¹À€EºàôE»$tNô. D® D° D± `D² ˜D³ œD²  D³ ¤D² ¨D³ ´D² ¼E¼$® Eï@®Eø$ÀN À. ÀDµ ÀD¸ ÜD¹ èD»!D¼! D¿!(Eù$µ ÀF-@µF6@µFA@µFK@¶FTÀ ÀFUà!<FV$|N!<.!@DÁ!@DÅ!\DÄ!dDÅ!hDÆ!lDÅ!pDÆ!|DÇ!´DÈ!¸DÉ!¼DÈ!ÀDÉ!ÌDË!øFW$Á!@Fˆ@ÁF‘@ÃFšÀ!@F›à"Fœ$ÐN"."DH"DJ"DH"DJ",DK"<DM"DDO"\F$H"FÍ@HFØ@HFá@HFê@JFóÀ"Fôà"pFõ$`N"p."pDQ"pDS"„DT"ÄDU"ÈDT"ÌDU"ÐDT"ÔDU"àDT"èFö$Q"pG*@QG3€G߀Gò$|N"ì."ðDW"ðDZ#D[#D^#,Gó$W"ðH(@WH1@W H<@WHF@XHOÀ"ðHPà#<HQ$LN#<.#@D`#@Dd#XDc#`Dd#dDe#hDd#lDe#xDg#¨HR$`#@H„@`H$€N#À.#ÀDí#ÀDð#ÔD ×#äDñ#èD Ø#ìD Ô#ðD Ø#øD Ù#üD ß$D à$D á$ D æ$Dó$@Dô$TDõ$XDô$dDõ$lD÷$pDø$ˆHŽ$í#ÀHÁ@íHÊ€ï8HÖ€ï<Há€ï@HëÀ#ÔHìà$pHí$ÜN$œ.$ Dù$ Dû$¬Dù$´Dû$¼Dü$ÈDý$èDü$ìDý$ðDÿ%Hî$ù$ I@ùI'@ùI2@úI;@ûIDÀ$ IEà%0IF$N%0IG%0.%0D—%0D˜%8D—%<D˜%DD—%HD˜%`D™%pDš%„Dœ%˜D%¨D %àD¡%øDÐ&D£& D¦&0D¨&4D«&PD±&dD²&pD·& Dº&ÐD»&àD¼&äDÔ&øDÍ&üDÔ'DÍ'$D¿'0DÐ'PDÑ'€DÒ'°DÔ'ÌDÒ'ÐDÔ'ÔDÒ'ÜDÔ'àDÒ'èDÔ'ðDÒ'üDÔ(IT$—%0Ig@—Is@—I€@—IŠ$ôN($I‹(0.(0DG(0DP(TIŸVDQ(`DR(hDS(pDT(|I¯V DU(ˆDV(DW(˜DX(ÐDY(ÜDZ)I¸VDj)TDk)`Dq)tDr)€Ds)ˆDu)Dv)°Dw)àDx*Dy*@Dz*€D{* Dz*¤D{*¨Dz*°D{*´Dz*¼D{*ÄDz*ÐD{*ØDu+D{+ IÆ$G(0Ià@GIð@HJ@IJ@JJ'@KJ:@LJN@MJ_@NJq€J„€J—€Jµ€JÔ€LZ€NÈ€NÛ€Nì€Nÿ€O€O:€OY€Ou€Qˆ€QÓ€Qæ€Qù€R €R*€RN€R_€SU€ShÀ(0Sià+DSj$N+D.+PDÏ+PDÔ+pDØ+tDÔ+xDÕ+€DØ+ŒSkVDÙ+ÐDÝ+ÜDÞ+äDß+üDå, Dî,`Dñ,pDò, Dô,ÌSt$Ï+PS­@ÏSÁ@ÏSÒ@ÐSå@ÑSô@ÓTÀ+PTà,äT$”N,äTUÄ.,ðD²,ðD·-D²-D·-D²-D·-D¸-4D¹-8D¸-@D¹-HDº-€DÅ-°D»-ÐD¼.DÆ.0D½.PDÅ.„DÆ. DÇ.ÀDÊ.ÐDÌ/T$²,ðTR@²Tf@²Tx@²TŠ@³T™@´T¨@µT·&¶UÄTÏ€TëÀ,ðTìà/Tí$(N/TîUÈ./ Du/ D/8Du/@D/DDu/HD/PD€/lD/pD„/tD/xD€/|D/„D„/D…/ÐDŠ0D‹0DŒ00D0DDŒ0HD0LD¥0„DŽ0 D0ÐD0ðD‘0ôD”0øD•10D—14D˜1pD™1 Dš1ÐD‹2Dž2D¥2(D¦2@D§2pD¨2 DŒ2ØD¨3D©3D¬3 D­3PD¯3€U$u/ U6@uUJ@uU\@uUn@vU@wU@xUŸ@yU®@zU½@{UÌ@|UÛ@}Uê&~UÈV€VÀ/ Và3¨V $ˆN3¨V!UÌ.3°D%3°D.3ÈD%3ÐD.3ÔD%3ØD.3àD/3üD04D34D04D/4 D04D34 D44`D94D:4˜D;4ÀD<4ÔDN5 D=50D>5PD@5TDA5€DB5°DC5àD:6DG6 DN68DO6PDP6„D;6¼DP6äDQ6ðDT7DU70DW7`V6$%3°Vh@%V|@%VŽ@%V @&V±@'VÂ@(VÑ@)Và@*Vï@+Vþ@,W &-UÌW%€WAÀ3°WBà7€WC$ÐN7€.7€DZ7€D_7œD^7 D_7¬D`7àDk8Da80Db8`Dl8Dc8°Dk8äDl9Dm9 Dp90Dr9\WD$Z7€Wz@ZWŽ@[W@\W¬@]W»À7€W¼à9tW½$ôN9t.9€D…9€D‹9 DŒ9¬D9¸D:Dª:4D‘:PD’:€D“:ÀD”:ðD˜:üD™;Dš;D ;@D ;|D¡;€D ;„D;œD;¨D;°D;ÄD;ÐD;ÔD;ØD¡<D¢<0DªDÿ>0D>@D>DD>LD>TD>XD>\D>`D>D>°D>äD?D?4D?PD?`D?X–$õ=PXË@õXß@õXñ@õY@öY@÷Y!@øY0@ùY?&úUÐYW€YsÀ=PYtà?°Yu$`N?°YvUÔ.?°DÐ?°DÖ?ÈDÐ?ÐDÖ?ÔDÐ?ØDÖ?àD×?üDØ@D×@DØ@ DÙ@@Dê@tDÚ@DÛ@ Dá@¤DÛ@¬DÝ@´DÞ@¸DÜ@¼Dá@ÀDì@ðDâADêADDëA`DìA”DíA°DðAÀDòAðY‹$Ð?°Y¿@ÐYÓ@ÐYå@ÐY÷@ÑZ@ÒZ@ÓZ$@ÔZ3&ÕUÔZK€ZgÀ?°ZhàBZi$`NB.BDµBDºB DµB$D¹B0DºB<D»BpD½BtD»B|D¼B„D½BˆDÆB¸D¾BÐDÆCDÈC DËC0DÍC\Zj$µBZ@µZ±@¶ZÀ@·ZÏ@¸ZÞÀBZßàCtZà$dNCtZáUØ.C€DvC€D|C˜DvC D|C¤DvC¨D|C°D}CÌD~CÐD}CÔD~CÜDDD’DDD€D`DDpD‰DtDD|D‚DŒDƒDD„D”D…D˜D†D¤D‰D¨D”DØDŠDðD’E$D“E@D”EtD•ED˜E DšEÐZö$vC€[.@v[B@v[T@v[f@w[u@x[„@y[“@z[¢&{UØ[º€[ÖÀC€[×àEð[Ø$pNEð[ÙUÜ.EðDOEðDUFDOFDUFDOFDUF DVF<DWF@DVFDDWFLDXF€DkF´DYFÐDZFàDbFäDZFìD[FüD\GD]GD^GD_GDbGDmGHDcG`DkG”DlG°DmGäDnHDqHDsH@[î$OEð\%@O\9@O\K@O\]@P\l@Q\{@R\Š@S\™&TUÜ\±€\ÍÀEð\ÎàH`\Ï$pNH`\ÐNp.H`D8H`D:HpD8HtD:H„D;H”D=HœDÜH D=H¬DÜH°DØH¼DÜHÀD=HÈD>HØDØHÜD>HàDÜHìDÝHøDßHüDÝIDÞIDßIDI DI(DßI@DñIDDßIHDñITDßI\DñIlDôIpDIDâI¸DãIÄD IàDãJDäJ0DçJ8DèJLDéJ€DìJ„DéJˆDìJDôJ´DõJÐD?KD@KDCKD\å$8H`]@8] @8])@8]2@:];ÀH`]<€Ø8]R€Ù<]f@Ú]uÀH ]vàH¬]w€Ø8]€Ù<]¡@Ú]°ÀH°]±àHÈ]²€Ø8]È€Ù<]Ü@Ú]ëÀHÜ]ìàHà]í€Ø8^€Ù<^@Ú^&ÀHì^'@ß^5ÀI ^6àI@^7@ß^EÀI^FàI¸^G@ß^UÀIà^VàJ^WàK^XàK\^Y$üNK\.K`D*K`D0KtD*KxD/KˆD0KœD1KÐDDLD2L D3L0D;L4D3L<D4LLD5LPD6LTD7LXD8LdD;LhDFL˜D<L°DDLäDEMDFM4DGMPDJM`DLMŒ^Z$*K`^@*^¤@+^³@,^Â@-^Ñ@.^àÀK`^áàM¬^â$LNM¬.M°DÏM°DÙMÐD×MØDØMäDÜMðDÙMôDÜMøDÙMüDÜNDÝN@D NpDÞNDßNÀD NøDàODáO@DåOLDæOTDçOlDðODñOÐDòPDöPDòPDôPDóPDöP D÷PTDøP€DýP¬DùP°DýP´D PÄD PàD QD QD Q@D QpD Qœ^ã$ÏM°_@Ï_,@Ï_=@Ð_P@Ñ_d€_w@Ó_†@Ô_•@Õ_¤ÀM°_¥àQ´_¦$NQ´_§Uà.QÀD úQÀD QØD úQàD QäD úQèD QðD R D RD RD RD RD R$D R0D RpD R D R¨D RÀD RÐD 3RøD SD SD SD S D S$D S(D S<D SpD !S D S¨D !S¬D "SÀD #SÐD %SÔD #SÜD $SäD %SèD &TD 'T@D (TpD T D ,T°D TÈD "TìD 3UD 4U(D U`D !UxD 4U D 6U°D 9UÀD :UðD ;V D =VP_¼$ úQÀ_ì@ ú`@ ú`@ ú`$@ û`5@ ü`I@ ý`Z@ þ`i@ ÿ`x@ `‡@ `–@ `¥& Uà`½€`ÙÀQÀ`ÚàVp`Û$°NVp`ÜUä.VpD PVpD VVˆD PVD VV”D PV˜D VV D WV¼D XVÀD WVÄD XVÌD YWD jW4D ZWPD [W`D aWdD [WlD ]WtD ^WxD \W|D aW€D lW°D bWÐD jXD kX D lXTD mXpD pX€D rX°`ñ$ PVpa%@ Pa9@ PaK@ Pa]@ Qal@ Ra{@ SaŠ@ Ta™& UUäa±€aÍÀVpaÎàXÐaÏ$`NXÐaÐUè.XÐD +XÐD 1XèD +XðD 1XôD +XøD 1YD 2YD 3Y D 2Y$D 3Y,D 4Y`D EY”D 5Y°D 6YÀD <YÄD 6YÌD 8YÔD 9YØD 7YÜD <YàD GZD =Z0D EZdD FZ€D GZ´D HZÐD KZàD M[aå$ +XÐb@ +b,@ +b>@ +bP@ ,b_@ -bn@ .b}@ /bŒ& 0Uèb¤€bÀÀXÐbÁà[0bÂ$`N[0.[0D [0D [@D [DD [PD [\D [D [”D [œD [¤D [¨D ![ØD [ðD !\$D #\@D &\PD (\|bÃ$ [0bõ@ c @ c@ c'@ c6À[0c7à\”c8$dN\”.\ D K\ D V\ÄD U\ÌD W\ÐD U\ÔD V\ÜD W\èD [] D ^](D _]4D y]lD `] D b]¤D `]¨D b]¸D a]ÀD b]ÈD Š^D c^ D d^PD e^`D l^D o^¬D p^ÐD u_D v_D w_0D x_HD Š_lD x_pD y_€D z_”D |_˜D }_ÀD ~_ðD ` D v`PD ƒ``D w`xD Š` D ‹`¸D Œ`ôD a0D a@D ‘apD “aœc9$ K\ cq@ Kc…@ Kc˜@ Mc©@ Nc¿€cÐ@ Ocá@ Pcð@ Qcÿ@ Rd@ Sd@ Td,À\ d-àa¼d.$Na¼d/N|.aÀD ¤aÀD ¬aØD ¤aàD ¥aäD ¤aèD ¬aðD ¥bD ¬bD ­bD ®bD ­b D ®b(D ±b4D ´b<D µbxD ¸b|D ¹b°D ÆbèD ºcD »c,D ¼c`D ½ctD ¾c D ¿cÌD ÀcäD ÁdD ÃdD ÁdD Ãd D Æd8D ÇdPD ¿d„D Èd¤D ÉdÐD ÌdàD ÍeD Ïe@dE$ ¤aÀdy@ ¤d@ ¤dŸ@ ¤d±€ ¥8dÁ@ ¦dÐ@ ¨dß@ ©dî@ ªdý& «N|e€e1ÀaÀe2àe`e3$ Ne`e4N„.e`Däe`DåepDäetDåe„Dæe”D ÓeœeIVÈD Ôe eSVÌD Õe¤D Óe¬D Ôe°D Êe´D Õe¸D ËeÌD ÊeÐD ÕeÔD ÓeÜD ÔeàD ÕeäD ÖeôD ×fD ØfD Ùf D Úf0D Ýf@D Þf|D áf€D äf„D åfÀD èfÄD éfüD g,D êgPD ëg|D g´D ìgÌD ígøD ðhD ñh@D ôhDD õh€D ùhˆD õhŒD ùhD øh”D ùh˜D úh D ûhÔD üi D ýi8D þitD ÿi D i¨D iàD iäD iôD jD j0D j@D jpD j D jÐD kDçk0Dèk8Dëkte]$äe`eŒ@äe—@äe @äe©@åe²Àe`e³€ Ê8eÀ Ë<eÜ€ Ì@eî€ ÍDf@ Îf@ Ðf$@ Ñf3Àeœf4àk0f5àkŒf6$,NkŒf7N˜.kDkDk˜DkœDk Dk¤Dk¬Dk°Dk´DkÈDkÌDkÜDkìDl D&l\Dl€Dl°D lðD!m0D#m`D&m|D'm D*m°D,màfL$kf{@f@fŸ@f±€8fÄ@fÓ@fâ&N˜fú€gÀkgàmøg$hNmøgN .nD1nD?nD1n D?nD2nD1nD?n D1n$D?n(D2n@D3nDD6nHD7nLD9nPD?nTD@n`DBndDDnhDBnlD@npDAn|DBnŒDDnDBn˜DDn DMnÈDDnÌDMnÐDDnÔDMnØDEnàDFnôDGo0DHo4DFo<DMoPDNo€DMo„DNoŒDQoÀDNoÄDQoÈDNoÌDQoÐDRoØDSoàDhoäDSoðDgoøDhoüDgpDhpDipDjp Dlp,Dmp<DnpLDop\Dpp”DqpÌDrqDWqDrq DsqDtqDWq DXq8DwqPDxqˆDyqÀDTqøDWr,DXrLDYrxDZr¤D[ràD`s Das@Dbs|Des¨DfsäDgsüDht(Dit<Dkt@DitHDjtTDkt\Dlt„Dmt°DntÜDquDsuDtuHDsuLDtuPDuu€DvuÄD‚uÔDƒvD„vPD…vD†vÐDˆwD‹w DŒwPDw€Dw°g.$1ng`@1gr@1g„@1g–€28g©€3<g¹@4gÊ@5gÙ€6@gç€7Dgõ€9Hh@:h@;h#@<h2@=hA&>N hY€huÀnhv@gh†Àoäh‡àoðhˆ@gh˜Àoøh™àqhš@ghªÀq h«àq h¬@gh¼ÀqPh½àqøh¾àwÈh¿$ ÈNwÈhÀN¬.wÐD4wÐD:wØD4wÜD:wàD4wäD5wìD4wðD:wôD6x D5xD:xD;x$D?x(D;x,D<x8D?xHDBxDCxÐDIy DDy0DFy`DIy|DJy DMy°DNyàDPzhÕ$4wÐi@4i!@4i3@4iE€58iX€6<im@7i|@8i‹&9N¬i£€i¿ÀwÐiÀàz(iÁ$XNz(iÂN¸.z0DÆz0DÏz8DÆz<DÏz@DÇzDDÆzHDÏzTDËzlDÇzpDÈztDÉzxDÏz|DÊz€DÏz„DÐz D×z¤DÐz¨DÑz´DÒzÄDÓzÔDÔzäD×zôDÚ{0DÝ{pDà{°Dá{ìDê|$Dâ|@Då|lDç|¬Dê|ÈDë|àDî|ðDï} Dð}PDñ}€Dò}°Dô}ài×$Æz0j @Æj@Æj1@ÆjC€ÇHjV€ÈLjo€ÉPj…€ÊTj€ËXj³@ÌjÂ@ÍjÑ&ÎN¸jé€kÀz0kà}øk$ÈN}økNÐ.~Dø~Dþ~Dø~ Dþ~Dø~Dù~Dø~ Dþ~$Dù~8Dþ~<Dÿ~LD~PDÿ~TD~`D~tD ~¤D~ÀD~ðD 4D PD`Dk$ø~kR@økd@økv@økˆ€ù8k›@úkª@ûk¹@ükÊ&ýNÐkâ€kþÀ~kÿà¨l$¨N¨lNØ.°Dˆ°D“¸Dˆ¼D“ÈD‰ÌDˆÐD“ÜD‰ðD“ôD”€D—€D”€ D—€D˜€PD¼€°D™€ÐDšD›`DœD”Dž¬D¤ÐD¥‚ D¦‚TD§‚´D¨‚ðD©ƒ4DªƒlD«ƒpD´ƒtD¬ƒ|D­ƒ€D®ƒ„D¯ƒ”D´ƒœDµƒØD¶„D·„0D¹„\D¼„xD½„D¾„ÀD¿„ðDÀ… DÁ…`DÂ… DÅ…°DÇ…àl$ˆ°lL@ˆl^@ˆlp@ˆl‚€‰8l•@Šl¤@‹l³@ŒlÂ@ŽlÑ@là@lï@‘lþ&’NØm€m2À°m3à†m4$XN†m5Nà.†D8†DD†D8†DD†(D9†,D8†0DD†<D:†TD9†XDD†\DE†lDG†pDå†tmJVDG†|D冀DE†„DF†DJ† DG†¤D冨DJ†¬DG†°D冸D憼Dë†ÄDì†ÌDð†ðDñ†üDó‡ Dô‡$Dö‡8Dù‡\Dú‡Dû‡ÀDJ‡ðDKˆ0DPˆ`DQˆDxˆìDR‰DS‰@DT‰HDU‰€DW‰„DU‰ˆDW‰˜DV‰ DW‰¨DX‰ôDYŠ DZŠ0D_Š`DØŠdD_ŠhDØŠlDÙŠxDÚŠ€D_ŠˆDÚŠŒD_Š˜D`мDa‹Db‹HDc‹dDd‹De‹ØDfŒDgŒDlŒDhŒDlŒ DmŒdDnŒDxŒÈDyŒàDzD{DD|tD}°D€ÀDðD‚Ž D„ŽPmS$8†mŒ@8mž@8m°@8m€98mÕ€:<må@;mú@<n @=n@>n'@?n6@@nE@AnT@Bnc&CNàn{€n—À†n˜@Jn¤À†tn¥@ßn·@ànÉ@ânÜ@ãnîÀ†tnïà†|nðà†|nñ@JnýÀ†€nþ@ßo@ào"@âo5@ãoGÀ†€oHà†„oIà†„oJ@JoVÀ†¨oW@ßoi@ào{@âoŽ@ão À†¨o¡à†¬o¢à†¬o£@Jo¯À†¸o°@ßoÂ@àoÔ@âoç@ãoùÀ†¸oúà‡ðoûà‡ðoü@_pÀŠdp àŠhp @_pÀŠlpàŠˆp@_p$ÀŠŒp%àŠ˜p&àŽxp'$hNŽxp(Nì.Ž€DŽ€DŽˆDŽŒDŽDŽ”DŽœDŽ DޤDޏD޼DŽÌDŽÐDØŽÔDŽØDŽäDØŽèDÙŽôDÚŽüDD@D,tD D"”D œD!¨D"°D#¼D$ðD,$D-@D/€D2D4Àp=$Ž€ps@p…@p—@p©€8p¼@pË@pÚ@pé@pø&Nìq€q,ÀŽ€q-@q9ÀŽÔq:àŽØq;@qGÀŽèqHàqIàØqJ$XNØqKNô.àDfàDrèDfìDrøDgüDf‘Dr‘ Dg‘ Dr‘$Ds‘4Dt‘8Dw‘<Dt‘@Ds‘DDt‘PDw‘TDt‘\Dw‘dDx‘ D·‘üDy’ Dz’`D{’D|’ðD}“ D~“dD“¬D€“¼D“èD‚”Dƒ” D„”8DŠ”`DØ”dDŠ”hDØ”lDÙ”xDÚ”ˆDŠ”œDÚ”¤DŠ”¬D‹”ÔDŒ•$D•pDŽ•œD·•àD•èD–,D‘–XD’–˜D“–°D”–ÜD•—D–— D——XD˜—„D™—ÀDš—ÄDŸ—ÈD›—ÐDŸ—ÔD ˜D¡˜<D¢˜hD§˜”D¨˜¬D©˜äDª™8D«™dD¬™D­™äD°šD·š(D¸š@D¹špDºš D»šàD¼›D¿› DÀ›PD›€q`$fàqš@fq¬@fq¾@fqЀg8qã@hqý@ir @jr@kr*@lr9@mrJ€n<rX@org@prv&qNôrŽ€rªÀàr«@Šr·À”dr¸à”hr¹@ŠrÅÀ”lrÆà”œrÇ@ŠrÓÀ”¤rÔà”¬rÕà›¨rÖ$ ÈN›¨r×Nü.›°D %›°D .›ÀD %›ÈD &›ÐD %›ÔD ,›ØrìVÀD -›ÜröVÄD .›àD ,›èD -›ìD .›ðD &œD ,œD -œD .œ D /œ D 0œ$D /œ(D 0œ0D 1œ<D 3œLD 2œPD 3œ`DœhDœpDœD 6œÀD 7œÌD œèD 3D H@D KPD 7hD 8€D ;„D 8ˆD ;ŒD <ÄD ?ÈD CžD @žD Cž D KžD Lž0D Mž`D NžD PžÀs$ %›°s6@ %sJ@ %s\@ %sn€ &8s€€ '<s˜€ (@s²@ )sÁ& +NüsÙ€sõÀ›°sö@ 3tÀœhtàœÀt@ 3tÀœètàtàžØt$(NžØtO .žàD SžàD `žðD SžøD TŸD SŸD _Ÿt-V¼D ]Ÿ t7V´D ^ŸtAV¸D `ŸD _ŸD ]ŸD `Ÿ D ^Ÿ$D `Ÿ(D _Ÿ8D TŸ<D ]Ÿ@D ^ŸDD `ŸHD aŸ`D bŸdD aŸhD bŸpD cŸ|D fŸŒD dŸD eŸ D fŸ°DŸ¸DŸÀD gŸìDŸøD D  D @D `D k €D { ŒD | D   D g ÐD n¡D o¡ D p¡@D s¡HD v¡PD w¡`D x¡D ™¡œD ¡¸D €¡ÄD ¡ôD „¡üD ‡¢D ˆ¢D ‰¢DD ¢TD Ž¢dD ¢hD Ž¢lD ¢|D ¢„D ¢ŒD ¦¢¼D ‘¢àD ’£ D “£D ”£HD ™£pD š£”D £˜D ¡£ÔD ž£ØD ¡£ÜD ¦£äD ¨¤D «¤D ¬¤@D ­¤pD ®¤ D ¯¤ÐD ±¥tK$ Sžàt€@ St”@ St¦@ St¸€ T8tË€tÞ€ U<tö€ V@u€ WDu$@ Xu3@ ZuB@ [uQ& \O ui€u…Àžàu†@ fu”@ fuŸÀŸ¸u àŸìu¡@ gu¯ÀŸøu°à u±@ fu¿@ fuÊÀ uËà @uÌ@ guÚÀ @uÛà €uÜ@ guêÀ  uëà Ðuìà¥uí$8N¥.¥ DŠ¥ D’¥,DŠ¥8D’¥LDc¥TD’¥\Dc¥dD’¥hDc¥lD’¥pD“¥tD’¥xD“¥€D”¥„D•¥ˆD”¥”D•¥œD–¥ D•¥¤D–¥¬D—¥°D(¥ÐD)¥äD+¥ôD,¦D'¦D™¦ Dš¦8Dœ¦pD›¦€D¦„D›¦ˆDœ¦ŒD¦Dž¦œD ¦ÐDŸ¦ÔD ¦ØDŸ¦ÜD ¦àD¡¦äD¢¦ôD¤§DD£§HD¤§LD£§PD¤§TD¥§XD¦§hD¨§œD§§ D¨§¤D§§¨D¨§¬D©§°Dª§ÀD¬§ôD«§øD¬§üD«¨D¬¨D­¨D®¨D°¨LD¯¨PD°¨TD¯¨XD°¨\D±¨lD²¨ Dµ¨¨D¶¨ØDبÜD¶¨àDبäDÙ¨ìDÚ¨üD¶©DÚ©D¶©$DS©@D·©`D¸©Dº©”D8©ðD»©ôD8©øD»ªD8ªD9ªD;ªD™ªD;ª D=ª0D?ªHD»ª`D¼ª˜D¿ªÄDÀªüDÁ«$D«PDë”DÆ«ÀDÇ«øDȬ DɬLDʬDˬ¼D̬üDÍ­(DЭTDÑ­ŒDÒ­ DÔ­¤DÒ­°DÓ­ÀDÔ­ÄD8­ÔDÕ­ØD8­àD9­èD;­ðD?­üD;®D=® D?®$DÕ®<DÖ®XD×®„DØ®ÈDÙ®ðDÚ¯DÛ¯DDܯpDݯ°DÞ¯ÜDá°Dâ°$Dذ(DÙ°4DÚ°HDâ°PDÚ°\Dâ°hDã°ˆDä°´Dæ°¸D8°ÔDç°ØD8°àD9°èD;°ðD?°üD;±D=± D?±$Dç±<Dè±lD뱘Dì±ÔDí±üDî²(Dï²hDò²”Dó²ÐDô²øDõ³$Dö³hDù³”Dú³ÐDû³øDü´$Dý´hDþ´”Dÿ´ØDµDµ0Dµ`DصdDÙµpDÚµxDµŒDµ¬DµàDµäD8¶D ¶D8¶ D9¶D;¶D?¶(D;¶,D=¶8D?¶PD ¶hD ¶D ¶¼D¶ôD·D·HD·ŒD·¸D·ðD¸D¸DD¸ŒD¸¸D¸ðD¹D¹DD¹ˆD"¹´D#¹ìD$ºD%º@D&º„D)º°D*ºøD+»0D,»\D-»¤D.»ÐD/¼D0¼@D3¼lD4¼|D6¼€D4¼„D6¼ˆD9¼¤D=¼¨D9¼¬D7¼°D:¼¸D9¼¼D:¼ÀD9¼ÄD=¼ÌD>¼ØD@¼ÜD>¼àD@¼äDA½DE½DA½DE½ DH½(DF½,DI½0DL½4DF½8DI½<DH½@DL½HDZ½dDM½huîVÐDZ½lDM½xDZ½|DS½ŒDT½¤DU½ØDV¾DY¾@DZ¾DDY¾TDZ¾XDY¾dD?¾hD'¾Ðuø$Š¥ v @‹v@Œv'@v6@ŽvE@vT@vcÀ¥ vd@¶vpÀ¨Üvqà¨àvr@¶v~À¨ävà©v€@¶vŒÀ©và©$vŽ@»všÀ©ðv›@5v­À©ðv®à©ôv¯à©ôv°@»v¼À©øv½@5vÏÀ©øvÐàªvÑàªvÒ@»vÞÀªvß@5vñÀªvòàªvóàªvô@»wÀª w@5wÀª wàª`wàª`w@Õw"À­Ôw#@5w5À­Ôw6à­Øw7à­Øw8@ÕwDÀ­àwE@5wWÀ­àwXà­üwYà­üwZ@»wfÀ­üwg@5wyÀ­üwzà®w{à®w|@ÕwˆÀ®w‰@5w›À®wœà®<wà®<wž@âwªÀ°(w«à°Pw¬@âw¸À°\w¹à°hwº@çwÆÀ°ÔwÇ@5wÙÀ°ÔwÚà°ØwÛà°ØwÜ@çwèÀ°àwé@5wûÀ°àwüà°üwýà°üwþ@Õx À°üx @5xÀ°üxà±xà±x @çx,À±x-@5x?À±x@à±<xAà±<xB@xNÀµdxOൌxP@ x\À¶x]@5xoÀ¶xpà¶xqà¶xr@ x~À¶ x@5x‘À¶ x’à¶(x“à¶(x”@çx À¶(x¡@5x³À¶(x´à¶,xµà¶,x¶@ xÂÀ¶,xÃ@5xÕÀ¶,xÖà¶hx×à¶hxØ@»xäÀ¾hxå@5x÷À¾hxøà¾€xùྀxú@ÕyÀ¾€y@5yÀ¾€y྘y྘y@çy(À¾˜y)@5y;À¾˜y<ྰy=ྰy>@ yJÀ¾°yK@5y]À¾°y^à¾Ðy_à¾Ðy`à¾ìya$ÌN¾ìybO .¾ðD“¾ðD¥¾øD“¾üD¥¿D”¿ D“¿D¥¿D—¿4D”¿8D•¿<D–¿@D¥¿DDÏ¿`DÔ¿D俸Dî¿èDñÀDöÀ@DÀpDÀ D¦ÀÌD®ÀÐD±ÀÔD®ÀÜD±ÀàD¦ÀäD§ÀðD¨ÁD©ÁD®Á D±Á$D®Á(D±Á0D ÁtD!Á|DÕÁˆDåÁ°DéÁÜDÂD²Â@DÂŒD³Â°DµÂ´D³Â¼D´ÂÈDµÂÐD¶Ã D·ÃPD¸Ã€D»Ã°D¼ÄDÁÄ0DÂÄ„DÃÄÜDÄÅDÉÅ4DÊÅDDËÅpDÏÅDÑÅ DÔŨDÕÅÀDÖÅÐDƒÆD„ÆD~Æ DׯDDØÆ`DƒÆD„ƤD~ưDÛÆÔDÜÇDŒÇ@DÇPD~ÇxD‘Ç DßǬDàÇàDãÈDäÈDåÈ4DæÈHDçÈ€DèÈÐDéÉDêÉDëÉPDîÉ€DïÉ”DðÉàDñÊDòÊ(DôÊ`DõÊDöÊœD÷Ê´DøÊàDùÊðDúË DûË8DüËpDý˰DþËÄDÿËðDÌ0DÌ`DÌtDÌxDÌ|DÌÀDÌðDÍ DÍ4DÍHDÍ€DͰDÍÌDÍüDÎD Î0D!ÎpD"ΠD#ÎÐD&ÎàD'ÏD(Ï@D)ÏpD*Ï D+ÏÐD,ÐD-Ð0D.Ð`DàРD0ÐÀyw$“¾ðy¯@“yÁ@“yÓ@“y倔8yø€•<z€–@z)€—DzA@˜zR@™zl@šz}@›z‘@œz¥@z´@žzÃ@ŸzÒ@ zá@¡zò@£{&¤O {€{5À¾ð{6@‹ {BÀÇ@{CàǬ{DàÐè{E$øNÐè{FÐð.ÐðDÐðDÑDÑ DÑ,DÑ8DÑDD8ÑpDÑ€DÑ„DÑŒDѨDÑ´DÑàD'ÒD2ÒLD@ÒtDAÒœDFÒÌD(ÓD]Ó`D)Ó€D*Ó°D+ÔD-Ô@D.ÔHD/ÔTD2Ô€D3ÔDƒÔÀD„ÔÔD~ÔàD4ÕD5Õ0DƒÕ`D„ÕtD~Õ€D8Õ¤D9ÕÐDŒÖDÖD~Ö8D‘Ö`D<ÖlD=Ö D@ÖÀDAÖØDBÖìDC× DB×$DF×(DC×0DF×4DG×DDH×XDI×DL×”DI× DN׬DQרDT×ÜD]×üD^Ø D_ØPDØ€DØDØœDؤDبDذDØÀDcØÌDdÙDeÙ0DfÙ`D=ÙDhÙ°{g$Ðð{@{¡@{º@{Ë@{ß@{ð@|@ |@ |!@ |0@|?ÀÐð|@@‹ |LÀÖ|MàÖl|N€8|\€<|j€@|w@|‚ÀØ€|ƒàØÌ|„àÙØ|…$èNÙØ|†O4.ÙàD „ÙàD †ÙðD „ÙôD †ÚD ‡ÚD ‰ÚDpÚ DlÚ(D ‰Ú,DpÚ0D ‰ÚHDmÚLDlÚPD ‰ÚTDpÚ`DqÚlDrÚxDsÚˆDvÚ˜DyÚ¨DzÚ¸D~ÚðD{ÚôD~ÚøD{ÚüD~ÛDÛ0D€Û`D ‹Û D ŽÛä|›$ „Ùà|È@ „|Ó@ „|Ü@ „|å@ †|îÀÙà|ï€l8|ÿ€m<}ÀÚ }àÚ,}€l8})€m<}AÀÚ0}BàÚH}C€l8}S€m<}kÀÚL}làÚT}m€l8}}€m<}•ÀÚ`}–àÛ }—àÛü}˜$NÛü}™O@.ÜDëÜDíÜDëÜDíÜ,DîÜ<DðÜDDZÜHDðÜTDMÜXDZÜ\DðÜpDMÜtDNÜxDðÜ|DZ܈D[Ü”D\Ü D]ܰD_ÜÀDbÜÄD_ÜÈDbÜÐD¿ÝD¯ÝD¬ÝDD¨Ý\DcÝDfݘDgݨDlÝàDhÝäDlÝèDhÝìDlÝðDmÝüDnÞDoÞ$DpÞ\DvÞ DwÞðD|ß D~ßtDß|D€ß„D¿ßÌDƒßðD†à D‡àpDˆà D‰ààD‹àäDŒá0Dá`DŽáDáÀD“áìD­â8D”â`D¿âœD•â¨D–âÔDœãDžã4DŸã<D ãDD£ã€D¨ã¬D©ãÄD¨ãÈD¬ãÌD©ãÐD¬ãØD­ãìD®äD¯ä,D°ä@D±älD²äˆDµä´D·äÀDºäìD¿äüDÀåDÁåPDÂå€DÃå°DÆåÀDÇåðDÈæ DÉæPDÊæ€Dñæ°Dòæ¸Dõæô}®$ëÜ}Ú@ë}å@ë}î@ë}÷@í~ÀÜ~€M8~€N<~)@O~:@P~K@R~Z@W~i@X~xÀÜH~yàÜT~z€M8~Š€N<~¢@O~³@P~Ä@R~Ó@W~â@X~ñÀÜX~òàÜp~ó€M8€N<@O,@P=@RL@W[@XjÀÜtkàÜ|l€M8|€N<”@O¥@P¶@RÅ@WÔ@XãÀ܈äàæ°åàçæ$ NççOL.ç D éç D êç8D éç<D êçLD ëç\DÖçdDËçlDÖçpDËç„DÖçˆD×ç”DØç DÛç°DÜçðDàçôDÜçøDàçüDáèDâèDãè(DäèTDíè€DîèÀDéDïé DðéPDñéDóéÐDôéØDõéäDøê Dùê0Dƒê`DûêtDüêˆDƒêÀD„êÔD~êàDþêøDÿëDë$DŒëPDë`D~ëˆD‘ë°Dë¼DëøDìDìD ìDìD ì$Dì8DìdDìhDìxDì|Dì”Dì°DìðDí Dí0D í`D ìíD íí˜DíÀD ííØD ðîü$ éç €,@ é€7@ é€@@ é€I@ ê€RÀç €S€Ë8€c@Ì€t@Ï€ƒ@Ò€’@Ó€¡@Ô€°Àçd€±@‹ €½ÀëP€¾àë¼€¿àí€À€Ë8€Ð@Ì€á@Ï€ð@Ò€ÿ@Ó@ÔÀíÀàíØàî $Nî !OT.î D î D 'î0D î8D î@D îDD &îHD 'îLD &îTD 'îXD îhD &îlD 'îpD (î€D )î„D (îˆD )îD *îœD -î¬D .î°D /îÐD îÔDîðDïDïDï Dï,Dï0Dï4D /ï`D 0ï€D @ï¨D 1ïÀD 2ïðD .ïôD 2ïøD .ïüD 2ðD .ðD 6ðD 7ð@D 8ðDD =ð\D @ðxD AðD Dð D EðÐD FñD Hñ07$ î n@ ‚@ ”@ ¦€ 8»€ <Ò@ ã@ !ò@ "‚@ #‚& %OT‚(€‚DÀî ‚E@ /‚NÀîÔ‚O@‚XÀï‚Yàï`‚Zàï`‚[àñH‚\$(NñH.ñPD añPD jñlD iñtD lñ€D oñŒD pñD qñ¤D rñ°D qñ´D rñÀD yñðD zòD òPD {òTD ò\D {ò`D òhD {òlD òtDò„DòDò˜Dò¬Dò¸Dò¼DòÀD {òðD ¼ó D |ó@D }ópD †ó D ‰ó¬D ŠóàD ‹ô D ô$D ‹ô,D Œô8D ô<D Œô@D ôDD ôxD ‘ô¤D —ôÐD ’ôÔD —ôØD ˜ôàD ™õD õD ™õ D šõ(D ›õ,D œõ8D õ<D £õTD ¤õXD £õ\D «õpD ¬õtD «õ|D ¬õ„D ²õ°D µõ´D ²õ¸D µõÀD ¼õÐD ½õðD ¾ö0D ÁöDD ÂöpD Ãö D ÄöÐD Æöü‚]$ añP‚“@ a‚§@ b‚»@ c‚Ì@ d‚â@ e‚ñ@ gƒ@ hƒÀñPƒ@ {ƒÀòPƒàòTƒ@ {ƒ(Àò\ƒ)àò`ƒ*@ {ƒ5Àòhƒ6àòlƒ7@ {ƒBÀòtƒC@ƒLÀòƒMàòðƒNàòðƒOà÷ƒP$ÄN÷.÷ D Â÷ D Í÷<D Ê÷DD Í÷PD Ñ÷\D Ò÷pD Ó÷|D Ò÷€D Ó÷„D Ò÷ˆD Ó÷D Ú÷ÀD Û÷àD ø0D Üø4D ø<D Üø@D øHD ÜøLD øPDø`DølDøtDøˆDø”Dø˜DøœD ÜøÐD ùD Ýù D ÞùPD çù€D êùŒD ùÐD ëùÔD ùÜD ëùàD ùèD ëùìD ùôDúDúDúDú,Dú8Dú<Dú@D ëúpD ìú°D íúàD óûD ôûD õûPD öû\D ÷û`D øûlD ùûpD ÿû D û¬D ûðD ûôD ûøD üD ü@D üDD üHD üPD ü`D ü€D üÐD üðD ý D ýPD ý€D "ý¬ƒQ$ Â÷ ƒ†@ ƒš@ ë@ ă¼@ ŃÒ@ ƃá@ È ƒð@ ɃÿÀ÷ „@ Ü„ Àø0„ àø4„ @ Ü„Àø<„àø@„@ Ü„%ÀøH„&àøL„'@ Ü„2ÀøP„3@„<Àøl„=àøÐ„>àøÐ„?@ ë„JÀùЄKàùÔ„L@ ë„WÀùÜ„Xàùà„Y@ ë„dÀùè„eàùì„f@ ë„qÀùô„r@„{Àú„|àúp„}àúp„~àýÄ„$¤NýÄ„€Uì.ýÐD uýÐD ýèD uýðD ýôD uýøD þD €þD þ D …þ$D þ(D €þ,D ‚þ4D …þ@D †þ€D ‹þ°D Œþ¸D þàD þðD ¶ÿD ‘ÿ0D •ÿ4D ‘ÿ8D “ÿ@D ’ÿDD •ÿHD –ÿ\D —ÿD œÿÀD ˜ÿÈD œÿÌD ÿàD ÿøD žÿüD D žD  D žD D$D0D8D@DLDPDTD ž€D ŸŒD  ÀD ¡ÐD ¥ÔD ¢ØD £äD ¥èD ¦D ¨D ©(D ª`D «D ŒÀD ¯ÐD ¶èD ·D • D (D ¨PD ·tD ¸¬D èD œD ¸(D ¹0D ¼@D ½pD ¾ D ÀЄ•$ uýЄÄ@ u„Ø@ u„ê@ u„ü@ v… @ w…!@ x…2@ y…A@ z…P@ {…_@ |…n@ }…}& ~Uì…•€…±ÀýÐ…²@ ž…½Àÿø…¾àÿü…¿@ ž…ÊÀ…Ëà…Ì@ ž…×À …Øà…Ù@ ž…äÀ…å@…îÀ0…ïà€…ðà€…ñàð…ò$ Nð…óUð.ðD ÃðD ÌD ÃD ÌD ÃD Ì D Í<D Î@D ÑDD ÎHD ÍLD ÎTD Ñ`D Ò D ×ÐD ØØD ÙD ÚD îLD pD ÛtD |D Û€D „D ÛˆD ŒDœD°D¸DÀDÌDÐDÔD ÛD Ü@D ÝpD ÞD à”D áÀD âðD ã D ØPD ç`D îxD ïD ðÀD ÙD ð,D ñ0D ô@D õpD ÷ †$ Ãð†6@ ÆJ@ Æ\@ Æn@ Ć@ ņ@ ƆŸ@ dž®@ Ȇ½@ ɆÌ@ ʆÛ& ËUð†ó€‡Àð‡@ Û‡Àp‡àt‡@ Û‡(À|‡)à€‡*@ Û‡5À„‡6àˆ‡7@ Û‡BÀŒ‡C@‡LÀ°‡Mà‡Nà‡OàÀ‡P$ÐNÀ‡QUô.ÀDÀD§ØDàD§äDèD§ðD¨ D© D¬ D© D¨ D© $D¬ 0D­ pD²  D³ ¨D´ ÐDµ äDÑ D  @D¶ DDµ HD  LD¶ PD  TD¶ XD  \D lD €D ˆD D œD  D ¤D¶ ÐD· D¸ @D  €D¹ „D  ˆD¹ ŒD  D¹ ”D  œD ¬D ÀD ÈD ÐD ÜD àD äD¹ Dº PD» €D¼  D½ ¤DÀ ¨DÁ àDà äDÄ DÅ PDÆ €D³ °DÊ ÀDÑ ØDÒ ðDÓ DÔPD´”DÔ¼DÕÀDØÐDÙDÛ0‡f$À‡™@‡­@‡¿@‡Ñ@ž‡â@Ÿ‡ó@ ˆ@¡ˆ@¢ˆ @£ˆ/@¤ˆ>@¥ˆM&¦Uôˆe€ˆÀÀˆ‚@¶ˆÀ @ˆŽà Dˆ@¶ˆšÀ Lˆ›à Pˆœ@¶ˆ§À Tˆ¨à Xˆ©@¶ˆ´À \ˆµ@ˆ¾À €ˆ¿à ЈÀà ЈÁ@¹ˆÌÀ €ˆÍà „ˆÎ@¹ˆÙÀ ˆˆÚà ŒˆÛ@¹ˆæÀ ˆçà ”ˆè@¹ˆóÀ œˆô@ˆýÀ Àˆþà ˆÿà ‰àT‰$”NT‰Uø.`DÞ`DçxDÞ€Dç„DÞˆDçDè¬Dé°Dì´Dé¸Dè¼DéÄDìÐDíDò@DóHDôpDõ„D ¼D àDöäD ìDöðD ôDöøD üD D D(D0D<D@DDDöpD÷°DøàDùDûDü0Dý`DþDóÀDÐD èD D 0DôtD œD  D°DàD‰$Þ`‰I@Þ‰]@Þ‰o@Þ‰@߉’@à‰£@ቲ@â‰Á@ã‰Ð@ä‰ß@å‰î&æUøŠ€Š"À`Š#@öŠ.ÀàŠ/àäŠ0@öŠ;ÀìŠ<àðŠ=@öŠHÀôŠIàøŠJ@öŠUÀüŠV@Š_À Š`àpŠaàpŠbà0Šc$ÐN0ŠdUü.0D0DHDPDTDXD`D|D €D#„D ˆDŒD ”D# D$àD)D*D+@D,TD@ŒD °D-´D ¼D-ÀD ÄD-ÈD ÐDàDðDøDD DDD-@D.€D/°D0ÐD2ÔD3D40D5`D*D9 D@¸DAÐDBD+DDBlDCpDF€DG°DIàŠy$0Š­@ŠÁ@ŠÓ@Šå@Šö@‹@‹@‹%@‹4@‹C@‹R&Uü‹j€‹†À0‹‡@-‹’À°‹“à´‹”@-‹ŸÀ¼‹ àÀ‹¡@-‹¬ÀÄ‹­àÈ‹®@-‹¹ÀЋº@‹ÃÀð‹Äà@‹Åà@‹Æà‹Ç$ÐN.DúD D,D8D€D´DÐDD@D pD |D„DœDÀD üDD DD(D0DDDPDTDXD€D°DäD D!@D$PD%€D'¬‹È$úŒ@úŒ@úŒ&@ûŒ9@üŒH@ýŒW@þŒfÀŒg@ŒrÀüŒsàŒt@ŒÀŒ€@Œ‰À(ŒŠà€Œ‹à€ŒŒàÄŒ$ÄNÄŒŽV.ÐDÐD$èDðD$ôDøD$D%D& D)$D&(D%,D&4D)@D*€D/°D0¸D1àD2ôDN0D PD3TD2XD \D3`D dD3hD lD|DD˜D D¬D°D´D3àD4 D5PD D6”D ˜D6œD  D6¤D ¬D¼DÐDØDàDìDðDôD6 D7 `D8 D9 °D: ´D= ¸D> ðD@ ôDA!0DB!`DC!D0!ÀDG!ÐDN!èDO"DP"0DQ"`D1"¤DQ"ÌDR"ÐDU"àDV#DX#@Œ£$ÐŒÓ@Œç@Œù@ @@-@<@K@Z@ i@!x@"‡&#VŸ€»Àм@3ÇÀPÈàTÉ@3ÔÀ\Õà`Ö@3áÀdâàhã@3îÀlï@øÀùààúààû@6ŽÀŽà”Ž@6ŽÀ˜ŽàœŽ@6Ž À Ž!ऎ"@6Ž-À¬Ž.@Ž7ÀÐŽ8à Ž9à Ž:à#dŽ;$”N#dŽ<V.#pD[#pDd#ˆD[#Dd#”D[#˜Dd# De#¼Df#ÀDi#ÄDf#ÈDe#ÌDf#ÔDi#àDj$ Do$PDp$XDq$€Dr$”D†$ÌD $ðDs$ôD $üDs%D %Ds%D % D%D%0D%8D%@D%LD%PD%TDs%€Dt%ÀDu%ðDv&Dx&Dy&@Dz&pD{& Dp&ÐD&àD†&øD‡'Dˆ'@Dq'„Dˆ'¬D‰'°DŒ'ÀD'ðD( ŽQ$[#pŽ€@[Ž”@[ަ@[ޏ@\ŽÉ@]ŽÚ@^Žé@_Žø@`@a@b%&cV=€YÀ#pZ@seÀ$ðfà$ôg@srÀ$üsà%t@sÀ%€à%@sŒÀ% @–À%0—à%€˜à%€™à(@š$ÐN(@›V.(@D’(@D›(XD’(`D›(dD’(hD›(pDœ(ŒD(D (”D(˜Dœ(œD(¤D (°D¡(ðD¦) D§)(D¨)PD©)dD½)œD )ÀDª)ÄD )ÌDª)ÐD )ÔDª)ØD )àD)ðD*D*D*D*D* D*$Dª*PD«*D¬*ÀD­*àD¯*äD°+D±+@D²+pD§+ D¶+°D½+ÈD¾+àD¿,D¨,TD¿,|DÀ,€DÃ,DÄ,ÀDÆ,ð°$’(@á@’õ@’@’@“*@”;@•J@–Y@—h@˜w@™†&šVž€ºÀ(@»@ªÆÀ)ÀÇà)ÄÈ@ªÓÀ)ÌÔà)ÐÕ@ªàÀ)Ôáà)Øâ@ªíÀ)àî@÷À*øà*Pùà*Púà-û$ÐN-ü(%V ‘ (&V‘('V‘.((V‘D€‘P()V‘a€‘r&U°‘£&‚U¨‘Ñ&ƒU ’&„Uœ’/&…U˜’_&†U¤’&‡U¬’À&Mh’Ò&ŽM’ä&MÔ’ö&Mü“&‘M “&’M<“,&“M¼“>&”MH“P&•Mœ“b&–MX“u&—NP“ˆ&˜M¤“›&™MÈ“®&šM4“Á&›N0“Ô&œM$“ç&N“ú&žM” &ŸMˆ” & Mt”3&¡M`”F&¢M€”Y&£M,”l&¤Lè”&¥LÔ”’&¦ND”¥&§MP”¸&¨L ”Ë&©N”Þ&ªLX”ñ&«L0•&¬Mð•&­MÜ•*&®N •=&¯Kì•P&°Mè•c&±M°•v(³V •–(´V$•®(µV(•Ð(¶V,•î(·V0–(¸V4–"(¹V8–:(ºV<–R(»V@–i(¼VD–(½VH–—(¾VL–°(¿VP–È(ÀVT–à(ÁVX–ú(ÂV\— (ÃV`—(ÄVd—8(ÅVh—N(ÆVl—c(ÇVp—|(ÈVt—•(ÉVx—©(ÊV|—À(ËV€—Ö(ÌV„—ì(ÍVˆ˜(ÎVŒ˜(ÏV˜0(ÐV”˜E(ÒV˜˜W(ÓVœ˜i(ÔV ˜{(ÕV¤˜(ÖV¨˜Ÿ(×V¬˜±(ØV°˜Ã&ÚIŒ˜Ý(V´˜í(V¸˜ý(V¼™€™+€™H€™d€™€€™œ€™¸€™Ô€™ð€š €š(€šE€šb€š~€šš€š·€šÓ€šï€› €›(€›D€›`€›|€›˜€›µ€›Ò€›î€œ €œ'€œD€œa€œ~€œš€œ¶€œÓ€œð€ €(€G€m€¶(VÀÆ(VÄÖ(VÈæ( VÌö( VО&I|žI€že&/I8ž›&0I(žÒ&’IŸ&3IŸN&SHøŸ&eHèŸÌ&ÅHØ &÷HÈ A&H¸ |&7H¨ º&‡H˜ õ& AP¡0& £A¡h& H$¡›& U¡Å& 9Hp¡ñ& FHd¢& LTð¢F& ¸FТv& ÁTX¢& íG<¢Æ& úG0¢î&TH£&kE|£H&tS°£r& E裞&­EÜ£É&³S £ó&D(¤"&(D¤Q&-S¤w&YD”¤Ÿ&fDˆ¤Æ&lRø¤ì&ÍR ¥&ÑR`¥G&ýR8¥r& R,¥œ&R¥Å&iQ ¥ø&mQt¦"&™QL¦N&¦Q@¦y&¬Q0¦£&@ì¦Õ&@ħ& Pˆ§0&8A˜§[&EAŒ§…&KPx§®&ƒU´§Å&\Nd§Þ S¨ ¨; º¨k s¨— ¨Æ ³¨ö R©%€©B€©_€©|€©™€©¶€©Ó€©ð€ª €ª*€ªG€ªd€ª€ªž€ªºd-0ÁB€èF D¼5C@YAÀGd©@CO\h€wPˆ– £€Ð¥ Ûþøþ þþ&þ2þ>þTþaþyþ†þ”þ®þ¾þÍþÞþïþþþ(þ;þLþaþtþ…þ—þ¤þ¸þÉþ×þçþôþþþ þ.þAþTþkþ€þŽþŸþ±þÉþÛþíþþþ%þ=þOþ^þrþ‡þœþ¸þÐþãþõþþþ&þ4þDþ³»TvuTN5jkwVbl\_9hY?CcUEna:g6r;mXW^iA7@OpB`=>s[dZRDqeSQfvuTN5jkwVbl\_9hY?CcUEna:g6r;mXW^iA7@OpB`=>s[dZRDqeSQfKF8GJ0toI<HPLM]__dyld_func_lookupdyld_stub_binding_helper__mh_bundle_header_calloc_int_cdict_alloc_cdict_free_cdict_getitem_cdict_qsort_cmp_cgraph_alloc_cgraph_free_cgraph_getitem_calloc_free___pyx_type_4pygr_5cdict_CDictIterator___pyx_type_4pygr_5cdict_CDictionary___pyx_type_4pygr_5cdict_CDictionaryRef___pyx_type_4pygr_5cdict_CGraphDict___pyx_type_4pygr_5cdict_CGraphIterator___pyx_type_4pygr_5cdict_CIntDictionary___pyx_type_4pygr_5cdict_IntTupleArray_initcdict_PyArg_ParseTupleAndKeywords_PyCFunction_NewEx_PyClass_New_PyClass_Type_PyCode_New_PyDict_New_PyDict_SetItemString_PyDict_Type_PyErr_ExceptionMatches_PyErr_Fetch_PyErr_Format_PyErr_NormalizeException_PyErr_Occurred_PyErr_Restore_PyErr_SetObject_PyErr_SetString_PyErr_WriteUnraisable_PyExc_IndexError_PyExc_KeyError_PyExc_MemoryError_PyExc_NameError_PyExc_StopIteration_PyExc_SystemError_PyExc_TypeError_PyExc_ValueError_PyFrame_New_PyImport_AddModule_PyInstance_Type_PyInt_AsLong_PyInt_FromLong_PyIter_Next_PyList_New_PyMethod_New_PyModule_GetDict_PyNumber_Add_PyNumber_Multiply_PyNumber_Subtract_PyObject_CallFunction_PyObject_CallObject_PyObject_Cmp_PyObject_GC_Del_PyObject_GetAttr_PyObject_GetAttrString_PyObject_GetItem_PyObject_GetIter_PyObject_IsInstance_PyObject_IsTrue_PyObject_SetAttr_PyObject_SetAttrString_PyObject_SetItem_PyObject_Size_PySequence_GetItem_PySequence_GetSlice_PyString_FromString_PyString_FromStringAndSize_PyString_InternInPlace_PyThreadState_Get_PyTraceBack_Here_PyTraceBack_Type_PyTuple_New_PyType_IsSubtype_PyType_Ready_Py_InitModule4__Py_NoneStruct_qsortdyld__mach_header/Users/administrator/Desktop/pygr-0.8.0/pygr/cgraph.cgcc2_compiled.:t(0,1)=(0,1)cdict_alloc:F(0,2)n:P(0,3)d:r(0,2):t(0,2)=*(0,4)int:t(0,3)=r(0,3);-2147483648;2147483647;CDict:t(0,4)=(0,5):T(0,5)=s8n:(0,3),0,32;dict:(0,6),32,32;;:t(0,6)=*(0,7)CDictEntry:t(0,7)=(0,8):T(0,8)=s8k:(0,3),0,32;v:(0,3),32,32;;cdict_free:F(0,3)d:P(0,2)cdict_qsort_cmp:F(0,3)void_a:P(0,9)void_b:P(0,9):t(0,9)=*(0,10):t(0,10)=k(0,1)cdict_getitem:F(0,6)d:P(0,2)k:P(0,3)l:r(0,3)int:t(0,3)mid:r(0,3)r:r(0,3)p:r(0,6)cgraph_alloc:F(0,11)n:P(0,3)d:r(0,11):t(0,11)=*(0,12)CGraph:t(0,12)=(0,13):T(0,13)=s8n:(0,3),0,32;dict:(0,14),32,32;;:t(0,14)=*(0,15)CGraphEntry:t(0,15)=(0,16):T(0,16)=s8k:(0,3),0,32;v:(0,2),32,32;;cgraph_getitem:F(0,14)d:P(0,11)k:P(0,3)l:r(0,3)mid:r(0,3)r:r(0,3)p:r(0,14)calloc_int:F(0,17)n:P(0,3):t(0,17)=*(0,3)cgraph_free:F(0,3)d:P(0,11)i:r(0,3)d:r(0,2)/Users/administrator/Desktop/pygr-0.8.0/pygr/cdict.cgcc2_compiled.:t(0,1)=(0,1)___pyx_tp_dealloc_4pygr_5cdict_IntTupleArray___pyx_tp_as_number_IntTupleArray___pyx_tp_as_sequence_IntTupleArray___pyx_tp_as_mapping_IntTupleArray___pyx_tp_as_buffer_IntTupleArray___pyx_methods_4pygr_5cdict_IntTupleArray___pyx_members_4pygr_5cdict_IntTupleArray___pyx_tp_new_4pygr_5cdict_IntTupleArray___pyx_f_4pygr_5cdict_13IntTupleArray_set_vector___pyx_doc_4pygr_5cdict_13IntTupleArray_set_vector___pyx_f_4pygr_5cdict_13IntTupleArray_realloc___pyx_doc_4pygr_5cdict_13IntTupleArray_realloc___pyx_f_4pygr_5cdict_13IntTupleArray___len_____pyx_f_4pygr_5cdict_13IntTupleArray___getitem_____pyx_sq_item_4pygr_5cdict_IntTupleArray___pyx_tp_dealloc_4pygr_5cdict_CGraphIterator___pyx_tp_as_number_CGraphIterator___pyx_tp_as_sequence_CGraphIterator___pyx_tp_as_mapping_CGraphIterator___pyx_tp_as_buffer_CGraphIterator___pyx_tp_traverse_4pygr_5cdict_CGraphIterator___pyx_tp_clear_4pygr_5cdict_CGraphIterator___pyx_f_4pygr_5cdict_14CGraphIterator___iter_____pyx_f_4pygr_5cdict_14CGraphIterator___next_____pyx_methods_4pygr_5cdict_CGraphIterator___pyx_f_4pygr_5cdict_14CGraphIterator___init_____pyx_tp_new_4pygr_5cdict_CGraphIterator___pyx_tp_dealloc_4pygr_5cdict_CDictIterator___pyx_tp_as_number_CDictIterator___pyx_tp_as_sequence_CDictIterator___pyx_tp_as_mapping_CDictIterator___pyx_tp_as_buffer_CDictIterator___pyx_tp_traverse_4pygr_5cdict_CDictIterator___pyx_tp_clear_4pygr_5cdict_CDictIterator___pyx_f_4pygr_5cdict_13CDictIterator___iter_____pyx_f_4pygr_5cdict_13CDictIterator___next_____pyx_methods_4pygr_5cdict_CDictIterator___pyx_f_4pygr_5cdict_13CDictIterator___init_____pyx_tp_new_4pygr_5cdict_CDictIterator___pyx_tp_dealloc_4pygr_5cdict_CGraphDict___pyx_tp_as_number_CGraphDict___pyx_tp_as_sequence_CGraphDict___pyx_tp_as_mapping_CGraphDict___pyx_tp_as_buffer_CGraphDict___pyx_tp_traverse_4pygr_5cdict_CGraphDict___pyx_tp_clear_4pygr_5cdict_CGraphDict___pyx_f_4pygr_5cdict_10CGraphDict___iter_____pyx_methods_4pygr_5cdict_CGraphDict___pyx_members_4pygr_5cdict_CGraphDict___pyx_tp_new_4pygr_5cdict_CGraphDict___pyx_f_4pygr_5cdict_10CGraphDict_iteritems___pyx_f_4pygr_5cdict_10CGraphDict_itervalues___pyx_f_4pygr_5cdict_10CGraphDict_items___pyx_f_4pygr_5cdict_10CGraphDict_keys___pyx_f_4pygr_5cdict_10CGraphDict_values___pyx_f_4pygr_5cdict_10CGraphDict___getitem_____pyx_sq_item_4pygr_5cdict_CGraphDict___pyx_tp_dealloc_4pygr_5cdict_CDictionaryRef___pyx_tp_as_number_CDictionaryRef___pyx_tp_as_sequence_CDictionaryRef___pyx_tp_as_mapping_CDictionaryRef___pyx_tp_as_buffer_CDictionaryRef___pyx_tp_traverse_4pygr_5cdict_CDictionaryRef___pyx_tp_clear_4pygr_5cdict_CDictionaryRef___pyx_f_4pygr_5cdict_14CDictionaryRef___iter_____pyx_methods_4pygr_5cdict_CDictionaryRef___pyx_tp_new_4pygr_5cdict_CDictionaryRef___pyx_f_4pygr_5cdict_14CDictionaryRef_iteritems___pyx_f_4pygr_5cdict_14CDictionaryRef_itervalues___pyx_f_4pygr_5cdict_14CDictionaryRef_items___pyx_f_4pygr_5cdict_14CDictionaryRef_keys___pyx_f_4pygr_5cdict_14CDictionaryRef_values___pyx_f_4pygr_5cdict_14CDictionaryRef___getitem_____pyx_sq_item_4pygr_5cdict_CDictionaryRef___pyx_tp_dealloc_4pygr_5cdict_CDictionary___pyx_tp_as_number_CDictionary___pyx_tp_as_sequence_CDictionary___pyx_tp_as_mapping_CDictionary___pyx_tp_as_buffer_CDictionary___pyx_tp_traverse_4pygr_5cdict_CDictionary___pyx_tp_clear_4pygr_5cdict_CDictionary___pyx_f_4pygr_5cdict_11CDictionary___iter_____pyx_methods_4pygr_5cdict_CDictionary___pyx_tp_new_4pygr_5cdict_CDictionary___pyx_f_4pygr_5cdict_11CDictionary_iteritems___pyx_f_4pygr_5cdict_11CDictionary_itervalues___pyx_f_4pygr_5cdict_11CDictionary_items___pyx_f_4pygr_5cdict_11CDictionary_keys___pyx_f_4pygr_5cdict_11CDictionary_values___pyx_f_4pygr_5cdict_11CDictionary___getitem_____pyx_sq_item_4pygr_5cdict_CDictionary___pyx_tp_dealloc_4pygr_5cdict_CIntDictionary___pyx_tp_as_number_CIntDictionary___pyx_tp_as_sequence_CIntDictionary___pyx_tp_as_mapping_CIntDictionary___pyx_tp_as_buffer_CIntDictionary___pyx_f_4pygr_5cdict_14CIntDictionary___iter_____pyx_methods_4pygr_5cdict_CIntDictionary___pyx_tp_new_4pygr_5cdict_CIntDictionary___pyx_f_4pygr_5cdict_14CIntDictionary_keys___pyx_f_4pygr_5cdict_14CIntDictionary_items___pyx_f_4pygr_5cdict_14CIntDictionary_iteritems___pyx_f_4pygr_5cdict_14CIntDictionary___getitem_____pyx_sq_item_4pygr_5cdict_CIntDictionary___pyx_ptype_4pygr_5cdict_CDictIterator___pyx_ptype_4pygr_5cdict_CGraphDict___pyx_ptype_4pygr_5cdict_CDictionaryRef___pyx_ptype_4pygr_5cdict_CGraphIterator___pyx_ptype_4pygr_5cdict_CDictionary___pyx_mdef_4pygr_5cdict_14QueryMatchList_get_more___pyx_f_4pygr_5cdict_14QueryMatchList_get_more___pyx_mdef_4pygr_5cdict_14QueryMatchList___getitem_____pyx_f_4pygr_5cdict_14QueryMatchList___getitem_____pyx_mdef_4pygr_5cdict_14QueryMatchList___iter_____pyx_f_4pygr_5cdict_14QueryMatchList___iter_____pyx_mdef_4pygr_5cdict_14QueryMatchList___len_____pyx_f_4pygr_5cdict_14QueryMatchList___len_____pyx_mdef_4pygr_5cdict_14QueryMatchList___init_____pyx_f_4pygr_5cdict_14QueryMatchList___init_____pyx_mdef_4pygr_5cdict_18QueryMatchIterator___next_____pyx_f_4pygr_5cdict_18QueryMatchIterator___next_____pyx_mdef_4pygr_5cdict_18QueryMatchIterator___iter_____pyx_f_4pygr_5cdict_18QueryMatchIterator___iter_____pyx_mdef_4pygr_5cdict_18QueryMatchIterator___init_____pyx_f_4pygr_5cdict_18QueryMatchIterator___init_____pyx_mdef_4pygr_5cdict_16CGraphQueryMatch___init_____pyx_f_4pygr_5cdict_16CGraphQueryMatch___init_____pyx_mdef_4pygr_5cdict_8KeyIndex___getitem_____pyx_f_4pygr_5cdict_8KeyIndex___getitem_____pyx_doc_4pygr_5cdict_8KeyIndex___getitem_____pyx_mdef_4pygr_5cdict_8KeyIndex___init_____pyx_f_4pygr_5cdict_8KeyIndex___init_____pyx_ptype_4pygr_5cdict_IntTupleArray___pyx_ptype_4pygr_5cdict_CIntDictionary___pyx_string_tab___pyx_n_CGraphQueryMatch___pyx_k11___pyx_n_KeyIndex___pyx_k26___pyx_n_QueryMatchIterator___pyx_k15___pyx_n_QueryMatchList___pyx_k34___pyx_n_SliceType___pyx_k17___pyx_n___getitem_____pyx_k29___pyx_n___init_____pyx_k4___pyx_n___iter_____pyx_k32___pyx_n___len_____pyx_k36___pyx_n___next_____pyx_k33___pyx_n_append___pyx_k3___pyx_n_dataGraph___pyx_k13___pyx_n_fromNode___pyx_k7___pyx_n_get_more___pyx_k37___pyx_n_gqcompiler___pyx_k12___pyx_n_gqi___pyx_k5___pyx_n_i___pyx_k9___pyx_n_index_keys___pyx_k2___pyx_n_isDone___pyx_k19___pyx_n_items___pyx_k22___pyx_n_iteritems___pyx_k20___pyx_n_key_index___pyx_k1___pyx_n_keys___pyx_k21___pyx_n_matches___pyx_k10___pyx_n_object___pyx_k27___pyx_n_qmlist___pyx_k8___pyx_n_queryNode___pyx_k6___pyx_n_query_f___pyx_k14___pyx_n_sort___pyx_k23___pyx_n_types___pyx_k16___pyx_k18p___pyx_k18___pyx_k24p___pyx_k24___pyx_k25p___pyx_k25___pyx_k28p___pyx_k28___pyx_k30p___pyx_k30___pyx_k31p___pyx_k31___pyx_k35p___pyx_k35___pyx_methods___pyx_filenames___pyx_argnames.7294__pyx_f_4pygr_5cdict_18QueryMatchIterator___iter__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_argnames:V(0,3)void:t(0,1):t(0,2)=*(0,4):t(0,3)=ar(0,5);0;1;(0,6)PyObject:t(0,4)=(0,7)long unsigned int:t(0,5)=r(0,5);0;037777777777;:t(0,6)=*(0,8)_object:T(0,7)=s8ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;;char:t(0,8)=r(0,8);0;127;int:t(0,9)=r(0,9);-2147483648;2147483647;:t(0,10)=*(0,11)_typeobject:T(0,11)=s192ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;ob_size:(0,9),64,32;tp_name:(0,6),96,32;tp_basicsize:(0,9),128,32;tp_itemsize:(0,9),160,32;tp_dealloc:(0,12),192,32;tp_print:(0,14),224,32;tp_getattr:(0,16),256,32;tp_setattr:(0,18),288,32;tp_compare:(0,20),320,32;tp_repr:(0,22),352,32;tp_as_number:(0,24),384,32;tp_as_sequence:(0,25),416,32;tp_as_mapping:(0,26),448,32;tp_hash:(0,27),480,32;tp_call:(0,29),512,32;tp_str:(0,22),544,32;tp_getattro:(0,31),576,32;tp_setattro:(0,33),608,32;tp_as_buffer:(0,35),640,32;tp_flags:(0,36),672,32;tp_doc:(0,6),704,32;tp_traverse:(0,37),736,32;tp_clear:(0,39),768,32;tp_richcompare:(0,41),800,32;tp_weaklistoffset:(0,36),832,32;tp_iter:(0,43),864,32;tp_iternext:(0,44),896,32;tp_methods:(0,45),928,32;tp_members:(0,46),960,32;tp_getset:(0,47),992,32;tp_base:(0,10),1024,32;tp_dict:(0,2),1056,32;tp_descr_get:(0,48),1088,32;tp_descr_set:(0,49),1120,32;tp_dictoffset:(0,36),1152,32;tp_init:(0,50),1184,32;tp_alloc:(0,51),1216,32;tp_new:(0,53),1248,32;tp_free:(0,55),1280,32;tp_is_gc:(0,39),1312,32;tp_bases:(0,2),1344,32;tp_mro:(0,2),1376,32;tp_cache:(0,2),1408,32;tp_subclasses:(0,2),1440,32;tp_weaklist:(0,2),1472,32;tp_del:(0,12),1504,32;;:t(0,13)=*(0,57)destructor:t(0,12)=(0,13):t(0,15)=*(0,58)printfunc:t(0,14)=(0,15):t(0,17)=*(0,59)getattrfunc:t(0,16)=(0,17):t(0,19)=*(0,60)setattrfunc:t(0,18)=(0,19):t(0,21)=*(0,61)cmpfunc:t(0,20)=(0,21):t(0,23)=*(0,62)reprfunc:t(0,22)=(0,23):t(0,24)=*(0,63):t(0,25)=*(0,64):t(0,26)=*(0,65):t(0,28)=*(0,66)hashfunc:t(0,27)=(0,28):t(0,30)=*(0,67)ternaryfunc:t(0,29)=(0,30):t(0,32)=*(0,68)getattrofunc:t(0,31)=(0,32):t(0,34)=*(0,69)setattrofunc:t(0,33)=(0,34):t(0,35)=*(0,70)long int:t(0,36)=r(0,36);-2147483648;2147483647;:t(0,38)=*(0,71)traverseproc:t(0,37)=(0,38):t(0,40)=*(0,72)inquiry:t(0,39)=(0,40):t(0,42)=*(0,73)richcmpfunc:t(0,41)=(0,42)getiterfunc:t(0,43)=(0,23)iternextfunc:t(0,44)=(0,23):t(0,45)=*(0,74):t(0,46)=*(0,75):t(0,47)=*(0,76)descrgetfunc:t(0,48)=(0,30)descrsetfunc:t(0,49)=(0,34)initproc:t(0,50)=(0,34):t(0,52)=*(0,77)allocfunc:t(0,51)=(0,52):t(0,54)=*(0,78)newfunc:t(0,53)=(0,54):t(0,56)=*(0,79)freefunc:t(0,55)=(0,56):t(0,57)=f(0,1):t(0,58)=f(0,9):t(0,59)=f(0,2):t(0,60)=f(0,9):t(0,61)=f(0,9):t(0,62)=f(0,2)PyNumberMethods:t(0,63)=(0,80)PySequenceMethods:t(0,64)=(0,81)PyMappingMethods:t(0,65)=(0,82):t(0,66)=f(0,36):t(0,67)=f(0,2):t(0,68)=f(0,2):t(0,69)=f(0,9)PyBufferProcs:t(0,70)=(0,83):t(0,71)=f(0,9):t(0,72)=f(0,9):t(0,73)=f(0,2)PyMethodDef:T(0,74)=s16ml_name:(0,6),0,32;ml_meth:(0,84),32,32;ml_flags:(0,9),64,32;ml_doc:(0,6),96,32;;PyMemberDef:T(0,75)=s20name:(0,6),0,32;type:(0,9),32,32;offset:(0,9),64,32;flags:(0,9),96,32;doc:(0,6),128,32;;PyGetSetDef:T(0,76)=s20name:(0,6),0,32;get:(0,85),32,32;set:(0,87),64,32;doc:(0,6),96,32;closure:(0,89),128,32;;:t(0,77)=f(0,2):t(0,78)=f(0,2):t(0,79)=f(0,1):T(0,80)=s152nb_add:(0,90),0,32;nb_subtract:(0,90),32,32;nb_multiply:(0,90),64,32;nb_divide:(0,90),96,32;nb_remainder:(0,90),128,32;nb_divmod:(0,90),160,32;nb_power:(0,29),192,32;nb_negative:(0,91),224,32;nb_positive:(0,91),256,32;nb_absolute:(0,91),288,32;nb_nonzero:(0,39),320,32;nb_invert:(0,91),352,32;nb_lshift:(0,90),384,32;nb_rshift:(0,90),416,32;nb_and:(0,90),448,32;nb_xor:(0,90),480,32;nb_or:(0,90),512,32;nb_coerce:(0,92),544,32;nb_int:(0,91),576,32;nb_long:(0,91),608,32;nb_float:(0,91),640,32;nb_oct:(0,91),672,32;nb_hex:(0,91),704,32;nb_inplace_add:(0,90),736,32;nb_inplace_subtract:(0,90),768,32;nb_inplace_multiply:(0,90),800,32;nb_inplace_divide:(0,90),832,32;nb_inplace_remainder:(0,90),864,32;nb_inplace_power:(0,29),896,32;nb_inplace_lshift:(0,90),928,32;nb_inplace_rshift:(0,90),960,32;nb_inplace_and:(0,90),992,32;nb_inplace_xor:(0,90),1024,32;nb_inplace_or:(0,90),1056,32;nb_floor_divide:(0,90),1088,32;nb_true_divide:(0,90),1120,32;nb_inplace_floor_divide:(0,90),1152,32;nb_inplace_true_divide:(0,90),1184,32;;:T(0,81)=s40sq_length:(0,39),0,32;sq_concat:(0,90),32,32;sq_repeat:(0,94),64,32;sq_item:(0,94),96,32;sq_slice:(0,96),128,32;sq_ass_item:(0,98),160,32;sq_ass_slice:(0,100),192,32;sq_contains:(0,102),224,32;sq_inplace_concat:(0,90),256,32;sq_inplace_repeat:(0,94),288,32;;:T(0,82)=s12mp_length:(0,39),0,32;mp_subscript:(0,90),32,32;mp_ass_subscript:(0,103),64,32;;:T(0,83)=s16bf_getreadbuffer:(0,104),0,32;bf_getwritebuffer:(0,106),32,32;bf_getsegcount:(0,107),64,32;bf_getcharbuffer:(0,109),96,32;;PyCFunction:t(0,84)=(0,32):t(0,86)=*(0,111)getter:t(0,85)=(0,86):t(0,88)=*(0,112)setter:t(0,87)=(0,88):t(0,89)=*(0,1)binaryfunc:t(0,90)=(0,32)unaryfunc:t(0,91)=(0,23):t(0,93)=*(0,113)coercion:t(0,92)=(0,93):t(0,95)=*(0,114)intargfunc:t(0,94)=(0,95):t(0,97)=*(0,115)intintargfunc:t(0,96)=(0,97):t(0,99)=*(0,116)intobjargproc:t(0,98)=(0,99):t(0,101)=*(0,117)intintobjargproc:t(0,100)=(0,101)objobjproc:t(0,102)=(0,21)objobjargproc:t(0,103)=(0,34):t(0,105)=*(0,118)getreadbufferproc:t(0,104)=(0,105)getwritebufferproc:t(0,106)=(0,105):t(0,108)=*(0,119)getsegcountproc:t(0,107)=(0,108):t(0,110)=*(0,120)getcharbufferproc:t(0,109)=(0,110):t(0,111)=f(0,2):t(0,112)=f(0,9):t(0,113)=f(0,9):t(0,114)=f(0,2):t(0,115)=f(0,2):t(0,116)=f(0,9):t(0,117)=f(0,9):t(0,118)=f(0,9):t(0,119)=f(0,9):t(0,120)=f(0,9)__pyx_f_4pygr_5cdict_13CDictIterator___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_f_4pygr_5cdict_14CGraphIterator___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_f_4pygr_5cdict_13IntTupleArray___len__:f(0,121)__pyx_v_self:P(0,2)__pyx_r:r(0,121)Py_ssize_t:t(0,121)=(0,9)__pyx_tp_dealloc_4pygr_5cdict_CIntDictionary:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_sq_item_4pygr_5cdict_CIntDictionary:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CDictionary:f(0,1)o:P(0,2)__pyx_obj_4pygr_5cdict_CDictionary:T(0,122)=s16ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;d:(0,123),64,32;key_index:(0,2),96,32;;:t(0,123)=*(0,124)CDict:t(0,124)=(0,125):T(0,125)=s8n:(0,9),0,32;dict:(0,126),32,32;;:t(0,126)=*(0,127)CDictEntry:t(0,127)=(0,128):T(0,128)=s8k:(0,9),0,32;v:(0,9),32,32;;etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_5cdict_CDictionary:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)int:t(0,9):t(0,130)=*(0,131)visitproc:t(0,129)=(0,130):t(0,131)=f(0,9)__pyx_tp_clear_4pygr_5cdict_CDictionary:f(0,9)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_5cdict_CDictionary:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CDictionaryRef:f(0,1)o:P(0,2)__pyx_obj_4pygr_5cdict_CDictionaryRef:T(0,132)=s20ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;d:(0,123),64,32;key_index:(0,2),96,32;graph:(0,2),128,32;;__pyx_tp_traverse_4pygr_5cdict_CDictionaryRef:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)__pyx_tp_clear_4pygr_5cdict_CDictionaryRef:f(0,9)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_5cdict_CDictionaryRef:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CGraphDict:f(0,1)o:P(0,2)__pyx_obj_4pygr_5cdict_CGraphDict:T(0,133)=s16ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;d:(0,134),64,32;key_index:(0,2),96,32;;:t(0,134)=*(0,135)CGraph:t(0,135)=(0,136):T(0,136)=s8n:(0,9),0,32;dict:(0,137),32,32;;:t(0,137)=*(0,138)CGraphEntry:t(0,138)=(0,139):T(0,139)=s8k:(0,9),0,32;v:(0,123),32,32;;etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_5cdict_CGraphDict:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)__pyx_tp_clear_4pygr_5cdict_CGraphDict:f(0,9)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_5cdict_CGraphDict:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)__pyx_tp_new_4pygr_5cdict_CDictIterator:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)__pyx_obj_4pygr_5cdict_CDictIterator:T(0,141)=s32ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;i:(0,9),64,32;d:(0,123),96,32;cd:(0,2),128,32;yieldKeys:(0,9),160,32;yieldValues:(0,9),192,32;key_index:(0,2),224,32;;:t(0,140)=*(0,142)PyTypeObject:t(0,142)=(0,11)o:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CDictIterator:f(0,1)o:P(0,2)__pyx_tp_traverse_4pygr_5cdict_CDictIterator:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)__pyx_tp_clear_4pygr_5cdict_CDictIterator:f(0,9)o:P(0,2)t:r(0,2)__pyx_tp_new_4pygr_5cdict_CGraphIterator:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CGraphIterator:f(0,1)o:P(0,2)__pyx_obj_4pygr_5cdict_CGraphIterator:T(0,143)=s24ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;i:(0,9),64,32;g:(0,144),96,32;yieldKeys:(0,9),128,32;yieldValues:(0,9),160,32;;:t(0,144)=*(0,133)__pyx_tp_traverse_4pygr_5cdict_CGraphIterator:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)__pyx_tp_clear_4pygr_5cdict_CGraphIterator:f(0,9)o:P(0,2)__pyx_tp_dealloc_4pygr_5cdict_IntTupleArray:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_sq_item_4pygr_5cdict_IntTupleArray:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)___Pyx_Raise__Pyx_Raise:f(0,1)type:P(0,2)value:P(0,2)tb:P(0,2)___Pyx_AddTraceback___pyx_filename___pyx_m___pyx_lineno__Pyx_AddTraceback:f(0,1)funcname:P(0,6)py_srcfile:r(0,2)py_funcname:r(0,2)py_globals:r(0,2)empty_tuple:r(0,2)empty_string:r(0,2)py_code:r(0,145)py_frame:r(0,146):t(0,145)=*(0,147):t(0,146)=*(0,148)PyCodeObject:t(0,147)=(0,149)PyFrameObject:t(0,148)=(0,150):T(0,149)=s64ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;co_argcount:(0,9),64,32;co_nlocals:(0,9),96,32;co_stacksize:(0,9),128,32;co_flags:(0,9),160,32;co_code:(0,2),192,32;co_consts:(0,2),224,32;co_names:(0,2),256,32;co_varnames:(0,2),288,32;co_freevars:(0,2),320,32;co_cellvars:(0,2),352,32;co_filename:(0,2),384,32;co_name:(0,2),416,32;co_firstlineno:(0,9),448,32;co_lnotab:(0,2),480,32;;_frame:T(0,150)=s336ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;ob_size:(0,9),64,32;f_back:(0,151),96,32;f_code:(0,145),128,32;f_builtins:(0,2),160,32;f_globals:(0,2),192,32;f_locals:(0,2),224,32;f_valuestack:(0,152),256,32;f_stacktop:(0,152),288,32;f_trace:(0,2),320,32;f_exc_type:(0,2),352,32;f_exc_value:(0,2),384,32;f_exc_traceback:(0,2),416,32;f_tstate:(0,153),448,32;f_lasti:(0,9),480,32;f_lineno:(0,9),512,32;f_restricted:(0,9),544,32;f_iblock:(0,9),576,32;f_blockstack:(0,154),608,1920;f_nlocals:(0,9),2528,32;f_ncells:(0,9),2560,32;f_nfreevars:(0,9),2592,32;f_stacksize:(0,9),2624,32;f_localsplus:(0,155),2656,32;;:t(0,151)=*(0,150):t(0,152)=*(0,2):t(0,153)=*(0,156):t(0,154)=ar(0,5);0;19;(0,157):t(0,155)=ar(0,5);0;0;(0,2)PyThreadState:t(0,156)=(0,158)PyTryBlock:t(0,157)=(0,159)_ts:T(0,158)=s84next:(0,160),0,32;interp:(0,161),32,32;frame:(0,151),64,32;recursion_depth:(0,9),96,32;tracing:(0,9),128,32;use_tracing:(0,9),160,32;c_profilefunc:(0,162),192,32;c_tracefunc:(0,162),224,32;c_profileobj:(0,2),256,32;c_traceobj:(0,2),288,32;curexc_type:(0,2),320,32;curexc_value:(0,2),352,32;curexc_traceback:(0,2),384,32;exc_type:(0,2),416,32;exc_value:(0,2),448,32;exc_traceback:(0,2),480,32;dict:(0,2),512,32;tick_counter:(0,9),544,32;gilstate_counter:(0,9),576,32;async_exc:(0,2),608,32;thread_id:(0,36),640,32;;:T(0,159)=s12b_type:(0,9),0,32;b_handler:(0,9),32,32;b_level:(0,9),64,32;;:t(0,160)=*(0,158):t(0,161)=*(0,164):t(0,163)=*(0,165)Py_tracefunc:t(0,162)=(0,163)PyInterpreterState:t(0,164)=(0,166):t(0,165)=f(0,9)_is:T(0,166)=s36next:(0,167),0,32;tstate_head:(0,160),32,32;modules:(0,2),64,32;sysdict:(0,2),96,32;builtins:(0,2),128,32;codec_search_path:(0,2),160,32;codec_search_cache:(0,2),192,32;codec_error_registry:(0,2),224,32;dlopenflags:(0,9),256,32;;:t(0,167)=*(0,166)___pyx_f__pyx_f_4pygr_5cdict_14CIntDictionary___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_e:r(0,126)__pyx_r:r(0,2)__pyx_2:r(0,2)___pyx_argnames.7984__pyx_f_4pygr_5cdict_14CIntDictionary_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_argnames:V(0,168):t(0,168)=ar(0,5);0;0;(0,6)___pyx_argnames.7915__pyx_f_4pygr_5cdict_14CIntDictionary_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,169):t(0,169)=ar(0,5);0;0;(0,6)___pyx_argnames.7817__pyx_f_4pygr_5cdict_14CIntDictionary_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,170):t(0,170)=ar(0,5);0;0;(0,6)__pyx_f_4pygr_5cdict_14CIntDictionary___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_f_4pygr_5cdict_11CDictionary___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_e:r(0,126)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8329__pyx_f_4pygr_5cdict_11CDictionary_itervalues:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,171):t(0,171)=ar(0,5);0;0;(0,6)___pyx_argnames.8283__pyx_f_4pygr_5cdict_11CDictionary_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,172):t(0,172)=ar(0,5);0;0;(0,6)__pyx_f_4pygr_5cdict_11CDictionary___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)___pyx_argnames.8798__pyx_f_4pygr_5cdict_14CDictionaryRef_itervalues:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,173):t(0,173)=ar(0,5);0;0;(0,6)___pyx_argnames.8752__pyx_f_4pygr_5cdict_14CDictionaryRef_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,174):t(0,174)=ar(0,5);0;0;(0,6)___pyx_argnames.8602__pyx_tp_new_4pygr_5cdict_CDictionaryRef:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_graph:(0,144)__pyx_v_idict:(0,9)__pyx_r:r(0,9)__pyx_v_graph:(0,144)__pyx_v_idict:(0,9)__pyx_r:r(0,9)__pyx_v_graph:(0,144)__pyx_v_idict:(0,9)__pyx_r:r(0,9)__pyx_v_graph:(0,144)__pyx_v_idict:(0,9)__pyx_r:r(0,9)type:r(0,140)type:r(0,140)type:r(0,140)__pyx_f_4pygr_5cdict_14CDictionaryRef___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_f_4pygr_5cdict_10CGraphDict___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_e:r(0,137)__pyx_v_cd:r(0,175):t(0,175)=*(0,132)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)___pyx_argnames.9523__pyx_f_4pygr_5cdict_10CGraphDict_values:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_cd:r(0,175)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,176):t(0,176)=ar(0,5);0;0;(0,6)___pyx_argnames.9320__pyx_f_4pygr_5cdict_10CGraphDict_itervalues:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,177):t(0,177)=ar(0,5);0;0;(0,6)___pyx_argnames.9274__pyx_f_4pygr_5cdict_10CGraphDict_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,178):t(0,178)=ar(0,5);0;0;(0,6)__pyx_f_4pygr_5cdict_10CGraphDict___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_f_4pygr_5cdict_13IntTupleArray___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_arg_k:P(0,2)__pyx_v_i:r(0,9)__pyx_v_data:r(0,179):t(0,179)=*(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,9)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)___pyx_argnames.10208__pyx_f_4pygr_5cdict_13IntTupleArray_realloc:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_n:(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,180):t(0,180)=ar(0,5);0;1;(0,6)___pyx_argnames.9961___pyx_d6___pyx_d7__pyx_tp_new_4pygr_5cdict_IntTupleArray:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_n:(0,2)__pyx_v_vector_len:(0,2)__pyx_v_dim:(0,2)__pyx_v_skipIndex:(0,2)__pyx_r:r(0,9)__pyx_2:r(0,2)__pyx_3:r(0,2)___pyx_argnames.6978__pyx_f_4pygr_5cdict_8KeyIndex___init__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_argnames:V(0,181):t(0,181)=ar(0,5);0;1;(0,6)___pyx_argnames.7026__pyx_f_4pygr_5cdict_8KeyIndex___getitem__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_k:(0,2)__pyx_v_i:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:(0,2)__pyx_4:(0,2)__pyx_5:r(0,2)__pyx_6:r(0,121)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_argnames:V(0,182):t(0,182)=ar(0,5);0;2;(0,6)tstate:r(0,153)tstate:r(0,153)tstate:r(0,153)tstate:r(0,153)___pyx_argnames.7252__pyx_f_4pygr_5cdict_18QueryMatchIterator___init__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_qmlist:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_argnames:V(0,183):t(0,183)=ar(0,5);0;2;(0,6)___pyx_argnames.7416__pyx_f_4pygr_5cdict_14QueryMatchList___init__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_gqcompiler:(0,2)__pyx_v_matches:(0,2)__pyx_v_dataGraph:(0,2)__pyx_v_query_f:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_argnames:V(0,184):t(0,184)=ar(0,5);0;5;(0,6)___pyx_argnames.7484__pyx_f_4pygr_5cdict_14QueryMatchList___len__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,121)__pyx_argnames:V(0,185):t(0,185)=ar(0,5);0;1;(0,6)___pyx_argnames.7665__pyx_f_4pygr_5cdict_14QueryMatchList_get_more:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,186):t(0,186)=ar(0,5);0;1;(0,6)___pyx_argnames.7575___pyx_b__pyx_f_4pygr_5cdict_14QueryMatchList___getitem__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_k:(0,2)__pyx_v_types:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_argnames:V(0,187):t(0,187)=ar(0,5);0;2;(0,6)name:r(0,2)__import__:r(0,2)empty_list:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)name:r(0,2)__import__:r(0,2)empty_list:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)name:r(0,2)__import__:r(0,2)empty_list:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)name:r(0,2)__import__:r(0,2)empty_list:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.7522__pyx_f_4pygr_5cdict_14QueryMatchList___iter__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,188):t(0,188)=ar(0,5);0;1;(0,6)name:r(0,2)name:r(0,2)___pyx_argnames.7326__pyx_f_4pygr_5cdict_18QueryMatchIterator___next__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_queryMatch:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,121)__pyx_5:(0,9)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,189):t(0,189)=ar(0,5);0;1;(0,6)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.9800___pyx_d4___pyx_d5__pyx_f_4pygr_5cdict_14CGraphIterator___init__:f(0,9)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_g:(0,144)__pyx_v_yieldKeys:(0,2)__pyx_v_yieldValues:(0,2)__pyx_r:r(0,9)__pyx_argnames:V(0,190):t(0,190)=ar(0,5);0;3;(0,6)type:r(0,140)type:r(0,140)___pyx_argnames.9611___pyx_d3___pyx_d1___pyx_d2__pyx_f_4pygr_5cdict_13CDictIterator___init__:f(0,9)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_cd:(0,191):t(0,191)=*(0,122)__pyx_v_yieldKeys:(0,2)__pyx_v_yieldValues:(0,2)__pyx_v_cdr:(0,175)__pyx_r:r(0,9)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,192):t(0,192)=ar(0,5);0;4;(0,6)type:r(0,140)obj:r(0,2)type:r(0,140)type:r(0,140)obj:r(0,2)type:r(0,140)type:r(0,140)___pyx_d8initcdict:F(0,1)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)___pyx_argnames.7125__pyx_f_4pygr_5cdict_16CGraphQueryMatch___init__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_gqcompiler:(0,2)__pyx_v_dataTuple:(0,2)__pyx_v_dataGraph:(0,2)__pyx_v_i:r(0,2)__pyx_v_index_keys:r(0,2)__pyx_v_l:r(0,2)__pyx_v_node:r(0,2)__pyx_v_edge:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,121)__pyx_6:r(0,2)__pyx_argnames:V(0,193):t(0,193)=ar(0,5);0;4;(0,6)item:r(0,2)___pyx_f_4pygr_5cdict_cdict_init__pyx_f_4pygr_5cdict_cdict_init:f(0,123)__pyx_v_d:P(0,2)__pyx_v_key_index:P(0,2)__pyx_v_i:r(0,9)__pyx_v_cd:r(0,123)__pyx_v_k:r(0,2)__pyx_v_v:r(0,2)__pyx_r:r(0,123)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)item:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_argnames.8158__pyx_tp_new_4pygr_5cdict_CDictionary:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)___pyx_argnames.9066__pyx_tp_new_4pygr_5cdict_CGraphDict:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,9)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,9)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,9)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,9)__pyx_5:r(0,2)__pyx_6:r(0,2)___pyx_argnames.7741__pyx_tp_new_4pygr_5cdict_CIntDictionary:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_d:(0,2)__pyx_v_i:r(0,9)__pyx_r:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)item:r(0,2)__pyx_v_d:(0,2)__pyx_v_i:r(0,9)__pyx_r:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)___pyx_argnames.10046__pyx_f_4pygr_5cdict_13IntTupleArray_set_vector:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_vector:(0,2)__pyx_v_gotoNext:(0,2)__pyx_v_i:r(0,9)__pyx_r:r(0,2)__pyx_1:r(0,9)__pyx_2:r(0,2)__pyx_argnames:V(0,194):t(0,194)=ar(0,5);0;2;(0,6)o:r(0,2)j:r(0,2)__pyx_f_4pygr_5cdict_14CGraphIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_cd:r(0,175)__pyx_v_k:r(0,2)__pyx_v_result:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)__pyx_f_4pygr_5cdict_13CDictIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:r(0,2)__pyx_v_v:r(0,2)__pyx_v_result:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.9370__pyx_f_4pygr_5cdict_10CGraphDict_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_cd:r(0,175)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,195):t(0,195)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.9454__pyx_f_4pygr_5cdict_10CGraphDict_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,196):t(0,196)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8848__pyx_f_4pygr_5cdict_14CDictionaryRef_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,197):t(0,197)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8925__pyx_f_4pygr_5cdict_14CDictionaryRef_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,198):t(0,198)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8993__pyx_f_4pygr_5cdict_14CDictionaryRef_values:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,199):t(0,199)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)__pyx_f_4pygr_5cdict_14CDictionaryRef___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_e:r(0,126)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8379__pyx_f_4pygr_5cdict_11CDictionary_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,200):t(0,200)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8456__pyx_f_4pygr_5cdict_11CDictionary_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,201):t(0,201)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8524__pyx_f_4pygr_5cdict_11CDictionary_values:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,202):t(0,202)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)__pyx_m:S(0,2)__pyx_b:S(0,2)__pyx_lineno:S(0,9)__pyx_filename:S(0,6)char:t(0,8)__pyx_f:S(0,203):t(0,203)=*(0,6)__pyx_ptype_4pygr_5cdict_CIntDictionary:S(0,140)__pyx_ptype_4pygr_5cdict_CDictionary:S(0,140)__pyx_ptype_4pygr_5cdict_CDictionaryRef:S(0,140)__pyx_ptype_4pygr_5cdict_CGraphDict:S(0,140)__pyx_ptype_4pygr_5cdict_CDictIterator:S(0,140)__pyx_ptype_4pygr_5cdict_CGraphIterator:S(0,140)__pyx_ptype_4pygr_5cdict_IntTupleArray:S(0,140)__pyx_k1:S(0,204)__pyx_k2:S(0,205)__pyx_k3:S(0,206)__pyx_k4:S(0,207)__pyx_k5:S(0,208)__pyx_k6:S(0,209)__pyx_k7:S(0,210)__pyx_k8:S(0,211)__pyx_k9:S(0,212)__pyx_k10:S(0,213)__pyx_k11:S(0,214)__pyx_k12:S(0,215)__pyx_k13:S(0,216)__pyx_k14:S(0,217)__pyx_k15:S(0,218)__pyx_k16:S(0,219)__pyx_k17:S(0,220)__pyx_k18:S(0,221)__pyx_k19:S(0,222)__pyx_k20:S(0,223)__pyx_k21:S(0,224)__pyx_k22:S(0,225)__pyx_k23:S(0,226)__pyx_k24:S(0,227)__pyx_k25:S(0,228)__pyx_k26:S(0,229)__pyx_k27:S(0,230)__pyx_k28:S(0,231)__pyx_k29:S(0,232)__pyx_k30:S(0,233)__pyx_k31:S(0,234)__pyx_k32:S(0,235)__pyx_k33:S(0,236)__pyx_k34:S(0,237)__pyx_k35:S(0,238)__pyx_k36:S(0,239)__pyx_k37:S(0,240)__pyx_n_CGraphQueryMatch:S(0,2)__pyx_n_KeyIndex:S(0,2)__pyx_n_QueryMatchIterator:S(0,2)__pyx_n_QueryMatchList:S(0,2)__pyx_n_SliceType:S(0,2)__pyx_n___getitem__:S(0,2)__pyx_n___init__:S(0,2)__pyx_n___iter__:S(0,2)__pyx_n___len__:S(0,2)__pyx_n___next__:S(0,2)__pyx_n_append:S(0,2)__pyx_n_dataGraph:S(0,2)__pyx_n_fromNode:S(0,2)__pyx_n_get_more:S(0,2)__pyx_n_gqcompiler:S(0,2)__pyx_n_gqi:S(0,2)__pyx_n_i:S(0,2)__pyx_n_index_keys:S(0,2)__pyx_n_isDone:S(0,2)__pyx_n_items:S(0,2)__pyx_n_iteritems:S(0,2)__pyx_n_key_index:S(0,2)__pyx_n_keys:S(0,2)__pyx_n_matches:S(0,2)__pyx_n_object:S(0,2)__pyx_n_qmlist:S(0,2)__pyx_n_queryNode:S(0,2)__pyx_n_query_f:S(0,2)__pyx_n_sort:S(0,2)__pyx_n_types:S(0,2)__pyx_k18p:S(0,2)__pyx_k24p:S(0,2)__pyx_k25p:S(0,2)__pyx_k28p:S(0,2)__pyx_k30p:S(0,2)__pyx_k31p:S(0,2)__pyx_k35p:S(0,2)__pyx_string_tab:S(0,241)__pyx_d1:S(0,2)__pyx_d2:S(0,2)__pyx_d3:S(0,175):t(0,204)=ar(0,5);0;9;(0,8):t(0,205)=ar(0,5);0;10;(0,8):t(0,206)=ar(0,5);0;6;(0,8):t(0,207)=ar(0,5);0;8;(0,8):t(0,208)=ar(0,5);0;3;(0,8):t(0,209)=ar(0,5);0;9;(0,8):t(0,210)=ar(0,5);0;8;(0,8):t(0,211)=ar(0,5);0;6;(0,8):t(0,212)=ar(0,5);0;1;(0,8):t(0,213)=ar(0,5);0;7;(0,8):t(0,214)=ar(0,5);0;16;(0,8):t(0,215)=ar(0,5);0;10;(0,8):t(0,216)=ar(0,5);0;9;(0,8):t(0,217)=ar(0,5);0;7;(0,8):t(0,218)=ar(0,5);0;18;(0,8):t(0,219)=ar(0,5);0;5;(0,8):t(0,220)=ar(0,5);0;9;(0,8):t(0,221)=ar(0,5);0;30;(0,8):t(0,222)=ar(0,5);0;6;(0,8):t(0,223)=ar(0,5);0;9;(0,8):t(0,224)=ar(0,5);0;4;(0,8):t(0,225)=ar(0,5);0;5;(0,8):t(0,226)=ar(0,5);0;4;(0,8):t(0,227)=ar(0,5);0;26;(0,8):t(0,228)=ar(0,5);0;19;(0,8):t(0,229)=ar(0,5);0;8;(0,8):t(0,230)=ar(0,5);0;6;(0,8):t(0,231)=ar(0,5);0;50;(0,8):t(0,232)=ar(0,5);0;11;(0,8):t(0,233)=ar(0,5);0;69;(0,8):t(0,234)=ar(0,5);0;36;(0,8):t(0,235)=ar(0,5);0;8;(0,8):t(0,236)=ar(0,5);0;8;(0,8):t(0,237)=ar(0,5);0;14;(0,8):t(0,238)=ar(0,5);0;64;(0,8):t(0,239)=ar(0,5);0;7;(0,8):t(0,240)=ar(0,5);0;8;(0,8):t(0,241)=ar(0,5);0;37;(0,242)__Pyx_StringTabEntry:t(0,242)=(0,243):T(0,243)=s16p:(0,152),0,32;i:(0,9),32,32;s:(0,6),64,32;n:(0,36),96,32;;__pyx_d4:S(0,2)__pyx_d5:S(0,2)__pyx_d6:S(0,2)__pyx_d7:S(0,2)__pyx_d8:S(0,2)__pyx_mdef_4pygr_5cdict_8KeyIndex___init__:S(0,244)=xsPyMethodDef:PyMethodDef:t(0,244)=(0,74)__pyx_doc_4pygr_5cdict_8KeyIndex___getitem__:S(0,245)__pyx_mdef_4pygr_5cdict_8KeyIndex___getitem__:S(0,244)__pyx_mdef_4pygr_5cdict_16CGraphQueryMatch___init__:S(0,244)__pyx_mdef_4pygr_5cdict_18QueryMatchIterator___init__:S(0,244)__pyx_mdef_4pygr_5cdict_18QueryMatchIterator___iter__:S(0,244)__pyx_mdef_4pygr_5cdict_18QueryMatchIterator___next__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList___init__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList___len__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList___iter__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList___getitem__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList_get_more:S(0,244)__pyx_doc_4pygr_5cdict_13IntTupleArray_set_vector:S(0,246)__pyx_doc_4pygr_5cdict_13IntTupleArray_realloc:S(0,247)__pyx_methods_4pygr_5cdict_CIntDictionary:S(0,248)__pyx_tp_as_number_CIntDictionary:S(0,63)__pyx_tp_as_sequence_CIntDictionary:S(0,64)__pyx_tp_as_mapping_CIntDictionary:S(0,65)__pyx_tp_as_buffer_CIntDictionary:S(0,70)__pyx_methods_4pygr_5cdict_CDictionary:S(0,249)__pyx_tp_as_number_CDictionary:S(0,63)__pyx_tp_as_sequence_CDictionary:S(0,64)__pyx_tp_as_mapping_CDictionary:S(0,65)__pyx_tp_as_buffer_CDictionary:S(0,70)__pyx_methods_4pygr_5cdict_CDictionaryRef:S(0,250)__pyx_tp_as_number_CDictionaryRef:S(0,63)__pyx_tp_as_sequence_CDictionaryRef:S(0,64)__pyx_tp_as_mapping_CDictionaryRef:S(0,65)__pyx_tp_as_buffer_CDictionaryRef:S(0,70)__pyx_methods_4pygr_5cdict_CGraphDict:S(0,251)__pyx_members_4pygr_5cdict_CGraphDict:S(0,252)__pyx_tp_as_number_CGraphDict:S(0,63)__pyx_tp_as_sequence_CGraphDict:S(0,64)__pyx_tp_as_mapping_CGraphDict:S(0,65)__pyx_tp_as_buffer_CGraphDict:S(0,70)__pyx_methods_4pygr_5cdict_CDictIterator:S(0,253)__pyx_tp_as_number_CDictIterator:S(0,63)__pyx_tp_as_sequence_CDictIterator:S(0,64)__pyx_tp_as_mapping_CDictIterator:S(0,65)__pyx_tp_as_buffer_CDictIterator:S(0,70)__pyx_methods_4pygr_5cdict_CGraphIterator:S(0,254)__pyx_tp_as_number_CGraphIterator:S(0,63)__pyx_tp_as_sequence_CGraphIterator:S(0,64)__pyx_tp_as_mapping_CGraphIterator:S(0,65)__pyx_tp_as_buffer_CGraphIterator:S(0,70)__pyx_methods_4pygr_5cdict_IntTupleArray:S(0,255)__pyx_members_4pygr_5cdict_IntTupleArray:S(0,256)__pyx_tp_as_number_IntTupleArray:S(0,63)__pyx_tp_as_sequence_IntTupleArray:S(0,64)__pyx_tp_as_mapping_IntTupleArray:S(0,65)__pyx_tp_as_buffer_IntTupleArray:S(0,70)__pyx_methods:S(0,257)__pyx_filenames:S(0,258)__pyx_type_4pygr_5cdict_CIntDictionary:G(0,142)__pyx_type_4pygr_5cdict_CDictionary:G(0,142)__pyx_type_4pygr_5cdict_CDictionaryRef:G(0,142)__pyx_type_4pygr_5cdict_CGraphDict:G(0,142)__pyx_type_4pygr_5cdict_CDictIterator:G(0,142)__pyx_type_4pygr_5cdict_CGraphIterator:G(0,142)__pyx_type_4pygr_5cdict_IntTupleArray:G(0,142):t(0,245)=ar(0,5);0;66;(0,8):t(0,246)=ar(0,5);0;57;(0,8):t(0,247)=ar(0,5);0;51;(0,8):t(0,248)=ar(0,5);0;3;(0,74):t(0,249)=ar(0,5);0;5;(0,74):t(0,250)=ar(0,5);0;5;(0,74):t(0,251)=ar(0,5);0;5;(0,74):t(0,252)=ar(0,5);0;1;(0,75):t(0,253)=ar(0,5);0;0;(0,74):t(0,254)=ar(0,5);0;0;(0,74):t(0,255)=ar(0,5);0;2;(0,74):t(0,256)=ar(0,5);0;1;(0,75):t(0,257)=ar(0,5);0;0;(0,74):t(0,258)=ar(0,5);0;0;(0,6)PK5u);3Pù%íZíZpygr/classutil.pyimport os, sys, tempfile from weakref import WeakValueDictionary import dbfile, logger class FilePopenBase(object): '''Base class for subprocess.Popen-like class interface that can be supported on Python 2.3 (without subprocess). The main goal is to avoid the pitfalls of Popen.communicate(), which cannot handle more than a small amount of data, and to avoid the possibility of deadlocks and the issue of threading, by using temporary files''' def __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, *largs, **kwargs): '''Mimics the interface of subprocess.Popen() with two additions: - stdinFlag, if passed, gives a flag to add the stdin filename directly to the command line (rather than passing it by redirecting stdin). example: stdinFlag="-i" will add the following to the commandline: -i /path/to/the/file If set to None, the stdin filename is still appended to the commandline, but without a preceding flag argument. -stdoutFlag: exactly the same thing, except for the stdout filename. ''' self.stdin, self._close_stdin = self._get_pipe_file(stdin, 'stdin') self.stdout, self._close_stdout = self._get_pipe_file(stdout, 'stdout') self.stderr, self._close_stderr = self._get_pipe_file(stderr, 'stderr') kwargs = kwargs.copy() # get a copy we can change try: # add as a file argument stdinFlag = kwargs['stdinFlag'] if stdinFlag: args.append(stdinFlag) args.append(self._stdin_path) del kwargs['stdinFlag'] stdin = None except KeyError: # just make it read this stream stdin = self.stdin try: # add as a file argument stdoutFlag = kwargs['stdoutFlag'] if stdoutFlag: args.append(stdoutFlag) args.append(self._stdout_path) del kwargs['stdoutFlag'] stdout = None except KeyError: # make it write to this stream stdout = self.stdout self.args = (args, bufsize, executable, stdin, stdout, self.stderr) + largs self.kwargs = kwargs def _get_pipe_file(self, ifile, attr): 'create a temp filename instead of a PIPE; save the filename' if ifile == PIPE: # use temp file instead! fd, path = tempfile.mkstemp() setattr(self, '_' + attr + '_path', path) return os.fdopen(fd,'w+b'), True elif ifile is not None: setattr(self, '_' + attr + '_path', ifile.name) return ifile, False def _close_file(self, attr): 'close and delete this temp file if still open' if getattr(self, '_close_' + attr): getattr(self, attr).close() setattr(self, '_close_' + attr, False) os.remove(getattr(self, '_' + attr + '_path')) def _rewind_for_reading(self, ifile): if ifile is not None: ifile.flush() ifile.seek(0) def close(self): """Close any open temp (PIPE) files. """ self._close_file('stdin') self._close_file('stdout') self._close_file('stderr') def __del__(self): self.close() def call_subprocess(*popenargs, **kwargs): 'portable interface to subprocess.call(), even if subprocess not available' p = FilePopen(*popenargs, **kwargs) return p.wait() try: import subprocess PIPE = subprocess.PIPE class FilePopen(FilePopenBase): 'this subclass uses the subprocess module Popen() functionality' def wait(self): self._rewind_for_reading(self.stdin) p = subprocess.Popen(*self.args, **self.kwargs) p.wait() self._close_file('stdin') self._rewind_for_reading(self.stdout) self._rewind_for_reading(self.stderr) return p.returncode except ImportError: CSH_REDIRECT = False # SH style redirection is default import platform if platform.system() == 'Windows': def mkarg(arg): """Very basic quoting of arguments for Windows """ return '"' + arg + '"' else: # UNIX from commands import mkarg try: if os.environ['SHELL'].endswith('csh'): CSH_REDIRECT = True except KeyError: pass badExecutableCode = None class FilePopen(FilePopenBase): 'this subclass fakes subprocess.Popen.wait() using os.system()' def wait(self): self._rewind_for_reading(self.stdin) args = map(mkarg, self.args[0]) if self.args[3]: # redirect stdin args += ['<', mkarg(self._stdin_path)] if self.args[4]: # redirect stdout args += ['>', mkarg(self._stdout_path)] cmd = ' '.join(args) if self.args[5]: # redirect stderr if CSH_REDIRECT: cmd = '(%s) >& %s' % (cmd, mkarg(self._stderr_path)) else: cmd = cmd + ' 2> ' + mkarg(self._stderr_path) returncode = os.system(cmd) self._close_file('stdin') self._rewind_for_reading(self.stdout) self._rewind_for_reading(self.stderr) if badExecutableCode is not None and badExecutableCode == returncode: raise OSError('no such command: %s' % str(self.args[0])) return returncode PIPE = id(FilePopen) # an arbitrary code for identifying this code # find out exit code for a bad executable name, silently badExecutableCode = call_subprocess(('aZfDqW9',), stdout=PIPE, stderr=PIPE) def ClassicUnpickler(cls, state): 'standard python unpickling behavior' self = cls.__new__(cls) try: setstate = self.__setstate__ except AttributeError: # JUST SAVE TO __dict__ AS USUAL self.__dict__.update(state) else: setstate(state) return self ClassicUnpickler.__safe_for_unpickling__ = 1 def filename_unpickler(cls,path,kwargs): 'raise IOError if path not readable' if not os.path.exists(path): try:# CONVERT TO ABSOLUTE PATH BASED ON SAVED DIRECTORY PATH path = os.path.normpath(os.path.join(kwargs['curdir'], path)) if not os.path.exists(path): raise IOError('unable to open file %s' % path) except KeyError: raise IOError('unable to open file %s' % path) if cls is SourceFileName: return SourceFileName(path) raise ValueError('Attempt to unpickle untrusted class ' + cls.__name__) filename_unpickler.__safe_for_unpickling__ = 1 class SourceFileName(str): '''store a filepath string, raise IOError on unpickling if filepath not readable, and complain if the user tries to pickle a relative path''' def __reduce__(self): if not os.path.isabs(str(self)): print >>sys.stderr,''' WARNING: You are trying to pickle an object that has a local file dependency stored only as a relative file path: %s This is not a good idea, because anyone working in a different directory would be unable to unpickle this object, since it would be unable to find the file using the relative path. To avoid this problem, SourceFileName is saving the current working directory path so that it can translate the relative path to an absolute path. In the future, please use absolute paths when constructing objects that you intend to save to worldbase or pickle!''' % str(self) return (filename_unpickler,(self.__class__,str(self), dict(curdir=os.getcwd()))) def file_dirpath(filename): 'return path to directory containing filename' dirname = os.path.dirname(filename) if dirname=='': return os.curdir else: return dirname def get_valid_path(*pathTuples): '''for each tuple in args, build path using os.path.join(), and return the first path that actually exists, or else None.''' for t in pathTuples: mypath = os.path.join(*t) if os.path.exists(mypath): return mypath def search_dirs_for_file(filepath, pathlist=()): 'return successful path based on trying pathlist locations' if os.path.exists(filepath): return filepath b = os.path.basename(filepath) for s in pathlist: # NOW TRY EACH DIRECTORY IN pathlist mypath = os.path.join(s,b) if os.path.exists(mypath): return mypath raise IOError('unable to open %s from any location in %s' %(filepath,pathlist)) def report_exception(): 'print string message from exception to stderr' import traceback info = sys.exc_info()[:2] l = traceback.format_exception_only(info[0],info[1]) print >>sys.stderr,'Warning: caught %s\nContinuing...' % l[0] def standard_invert(self): 'keep a reference to an inverse mapping, using self._inverseClass' try: return self._inverse except AttributeError: self._inverse = self._inverseClass(self) return self._inverse def lazy_create_invert(klass): """Create a function to replace __invert__ with a call to a cached object. lazy_create_invert defines a method that looks up self._inverseObj and, it it doesn't exist, creates it from 'klass' and then saves it. The resulting object is then returned as the inverse. This allows for one-time lazy creation of a single object per parent class. """ def invert_fn(self, klass=klass): try: return self._inverse except AttributeError: # does not exist yet; create & store. inverseObj = klass(self) self._inverse = inverseObj return inverseObj return invert_fn def standard_getstate(self): 'get dict of attributes to save, using self._pickleAttrs dictionary' d={} for attr,arg in self._pickleAttrs.items(): try: if isinstance(arg,str): d[arg] = getattr(self,attr) else: d[attr] = getattr(self,attr) except AttributeError: pass try: # DON'T SAVE itemClass IF SIMPLY A SHADOW of default itemClass from __class__ if not hasattr(self.__class__,'itemClass') or \ (self.itemClass is not self.__class__.itemClass and (not hasattr(self.itemClass,'_shadowParent') or self.itemClass._shadowParent is not self.__class__.itemClass)): try: d['itemClass'] = self.itemClass._shadowParent except AttributeError: d['itemClass'] = self.itemClass if not hasattr(self.__class__,'itemSliceClass') or \ (self.itemSliceClass is not self.__class__.itemSliceClass and (not hasattr(self.itemSliceClass,'_shadowParent') or self.itemSliceClass._shadowParent is not self.__class__.itemSliceClass)): try: d['itemSliceClass'] = self.itemSliceClass._shadowParent except AttributeError: d['itemSliceClass'] = self.itemSliceClass except AttributeError: pass try: # SAVE CUSTOM UNPACKING METHOD d['unpack_edge'] = self.__dict__['unpack_edge'] except KeyError: pass return d def standard_setstate(self,state): 'apply dict of saved state by passing as kwargs to constructor' if isinstance(state,list): # GET RID OF THIS BACKWARDS-COMPATIBILITY CODE! self.__init__(*state) print >>sys.stderr,'WARNING: obsolete list pickle %s. Update by resaving!' \ % repr(self) else: state['unpicklingMode'] = True # SIGNAL THAT WE ARE UNPICKLING self.__init__(**state) def apply_itemclass(self,state): try: self.itemClass = state['itemClass'] self.itemSliceClass = state['itemSliceClass'] except KeyError: pass def generate_items(items): 'generate o.id,o for o in items' for o in items: yield o.id,o def item_unpickler(db,*args): 'get an item or subslice of a database' obj = db for arg in args: obj = obj[arg] return obj item_unpickler.__safe_for_unpickling__ = 1 def item_reducer(self): ############################# SUPPORT FOR PICKLING 'pickle an item of a database just as a reference' return (item_unpickler, (self.db,self.id)) def shadow_reducer(self): 'pickle shadow class instance using its true class' shadowClass = self.__class__ trueClass = shadowClass._shadowParent # super() TOTALLY FAILED ME HERE! self.__class__ = trueClass # FORCE IT TO PICKLE USING trueClass keepDB = False if hasattr(shadowClass, 'db') and not hasattr(self, 'db'): keepDB = True self.__dict__['db'] = shadowClass.db # retain this attribute!! if hasattr(trueClass,'__reduce__'): # USE trueClass.__reduce__ result = trueClass.__reduce__(self) elif hasattr(trueClass,'__getstate__'): # USE trueClass.__getstate__ result = (ClassicUnpickler,(trueClass,self.__getstate__())) else: # PICKLE __dict__ AS USUAL PYTHON PRACTICE result = (ClassicUnpickler,(trueClass,self.__dict__)) self.__class__ = shadowClass # RESTORE SHADOW CLASS if keepDB: # now we can drop the temporary db attribute we added del self.__dict__['db'] return result def get_bound_subclass(obj, classattr='__class__', subname=None, factories=(), attrDict=None, subclassArgs=None): 'create a subclass specifically for obj to bind its shadow attributes' targetClass = getattr(obj,classattr) try: if targetClass._shadowOwner is obj: return targetClass # already shadowed, so nothing to do except AttributeError: # not a shadow class, so just shadow it pass else: # someone else's shadow class, so shadow its parent targetClass = targetClass._shadowParent if subname is None: # get a name from worldbase ID try: subname = obj._persistent_id.split('.')[-1] except AttributeError: subname = '__generic__' class shadowClass(targetClass): __reduce__ = shadow_reducer _shadowParent = targetClass # NEED TO KNOW ORIGINAL CLASS _shadowOwner = obj # need to know who owns it if attrDict is not None: # add attributes to the class dictionary locals().update(attrDict) for f in factories: f(locals()) if classattr == 'itemClass' or classattr == 'itemSliceClass': shadowClass.db = obj # the class needs to know its db object try: # run subclass initializer if present subclass_init = shadowClass._init_subclass except AttributeError: # no subclass initializer, so nothing to do pass else: # run the subclass initializer if subclassArgs is None: subclassArgs = {} subclass_init(**subclassArgs) shadowClass.__name__ = targetClass.__name__ + '_' + subname setattr(obj,classattr,shadowClass) # SHADOW CLASS REPLACES ORIGINAL return shadowClass def method_not_implemented(*args,**kwargs): raise NotImplementedError def read_only_error(*args, **kwargs): raise NotImplementedError("read only dict") def methodFactory(methodList, methodStr, localDict): 'save a method or exec expression for each name in methodList' for methodName in methodList: if callable(methodStr): localDict[methodName] = methodStr else: localDict[methodName]=eval(methodStr%methodName) def open_shelve(filename, mode=None, writeback=False, allowReadOnly=False, useHash=False, verbose=True): '''Alternative to shelve.open with several benefits: - uses bsddb btree by default instead of bsddb hash, which is very slow for large databases. Will automatically fall back to using bsddb hash for existing hash-based shelve files. Set useHash=True to force it to use bsddb hash. - allowReadOnly=True will automatically suppress permissions errors so user can at least get read-only access to the desired shelve, if no write permission. - mode=None first attempts to open file in read-only mode, but if the file does not exist, opens it in create mode. - raises standard exceptions defined in dbfile: WrongFormatError, PermissionsError, ReadOnlyError, NoSuchFileError - avoids generating bogus __del__ warnings as Python shelve.open() does. ''' if mode=='r': # READ-ONLY MODE, RAISE EXCEPTION IF NOT FOUND return dbfile.shelve_open(filename, flag=mode, useHash=useHash) elif mode is None: try: # 1ST TRY READ-ONLY, BUT IF NOT FOUND CREATE AUTOMATICALLY return dbfile.shelve_open(filename, 'r', useHash=useHash) except dbfile.NoSuchFileError: mode = 'c' # CREATE NEW SHELVE FOR THE USER try: # CREATION / WRITING: FORCE IT TO WRITEBACK AT close() IF REQUESTED return dbfile.shelve_open(filename, flag=mode, writeback=writeback, useHash=useHash) except dbfile.ReadOnlyError: if allowReadOnly: d = dbfile.shelve_open(filename, flag='r', useHash=useHash) if verbose: logger.warn(''' Opening shelve file %s in read-only mode because you lack write permissions to this file. You will NOT be able to modify the contents of this shelve dictionary. To avoid seeing this warning message, use verbose=False argument for the classutil.open_shelve() function. ''' % filename) return d else: raise def get_shelve_or_dict(filename=None,dictClass=None,**kwargs): if filename is not None: if dictClass is not None: return dictClass(filename,**kwargs) else: from mapping import IntShelve return IntShelve(filename,**kwargs) return {} class PathSaver(object): def __init__(self,origPath): self.origPath = origPath self.origDir = os.getcwd() def __str__(self): if os.access(self.origPath,os.R_OK): return self.origPath trypath = os.path.join(self.origDir,self.origPath) if os.access(trypath,os.R_OK): return trypath def override_rich_cmp(localDict): 'create rich comparison methods that just use __cmp__' mycmp = localDict['__cmp__'] localDict['__lt__'] = lambda self,other: mycmp(self,other)<0 localDict['__le__'] = lambda self,other: mycmp(self,other)<=0 localDict['__eq__'] = lambda self,other: mycmp(self,other)==0 localDict['__ne__'] = lambda self,other: mycmp(self,other)!=0 localDict['__gt__'] = lambda self,other: mycmp(self,other)>0 localDict['__ge__'] = lambda self,other: mycmp(self,other)>=0 class DBAttributeDescr(object): 'obtain an attribute from associated db object' def __init__(self,attr): self.attr = attr def __get__(self,obj,objtype): return getattr(obj.db,self.attr) def get_env_or_cwd(envname): 'get the specified environment value or path to current directory' try: return os.environ[envname] # USER-SPECIFIED DIRECTORY except KeyError: return os.getcwd() # DEFAULT: SAVE IN CURRENT DIRECTORY class RecentValueDictionary(WeakValueDictionary): '''keep the most recent n references in a WeakValueDictionary. This combines the elegant cache behavior of a WeakValueDictionary (only keep an item in cache if the user is still using it), with the most common efficiency pattern: locality, i.e. references to a given thing tend to cluster in time. Note that this works *even* if the user is not holding a reference to the item between requests for it. Our Most Recent queue will hold a reference to it, keeping it in the WeakValueDictionary, until it is bumped by more recent requests. n: the maximum number of objects to keep in the Most Recent queue, default value 50.''' def __init__(self, n=None): WeakValueDictionary.__init__(self) if n<1: # user doesn't want any Most Recent value queue self.__class__ = WeakValueDictionary # revert to regular WVD return if isinstance(n, int): self.n = n # size limit else: self.n = 50 self.i = 0 # counter self._keepDict = {} # most recent queue def __getitem__(self, k): v = WeakValueDictionary.__getitem__(self, k) # KeyError if not found self.keep_this(v) return v def keep_this(self, v): 'add v as our most recent ref; drop oldest ref if over size limit' self._keepDict[v] = self.i # mark as most recent request self.i += 1 if len(self._keepDict)>self.n: # delete oldest entry l = self._keepDict.items() imin = l[0][1] vmin = l[0][0] for v,i in l[1:]: if ithis subclass uses the subprocess module Popen() functionalitycCsj|i|iƒti|i|iŽ}|iƒ|i dƒ|i|i ƒ|i|i ƒ|i SdS(Nsstdin( sselfs_rewind_for_readingsstdins subprocesssPopensargsskwargsspswaits _close_filesstdoutsstderrs returncode(sselfsp((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyswaitVs  (s__name__s __module__s__doc__swait(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopenTs sWindowscCsd|dSdS(s,Very basic quoting of arguments for Windows s"N(sarg(sarg((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysmkargcs(smkargsSHELLscshcBstZdZd„ZRS(s=this subclass fakes subprocess.Popen.wait() using os.system()cCsW|i|iƒtt|idƒ}|ido|dt|iƒg7}n|ido|dt|iƒg7}ndi|ƒ}|ido?t od|t|i ƒf}qØ|d t|i ƒ}nt i |ƒ}|id ƒ|i|iƒ|i|iƒttj o t|jo!td t|idƒƒ‚n|SdS( Niiss is (%s) >& %ss 2> sstdinsno such command: %s(sselfs_rewind_for_readingsstdinsmapsmkargsargss _stdin_paths _stdout_pathsjoinscmds CSH_REDIRECTs _stderr_pathsosssystems returncodes _close_filesstdoutsstderrsbadExecutableCodesNonesOSErrorsstr(sselfsargsscmds returncode((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyswaitrs$ !(s__name__s __module__s__doc__swait(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopenps saZfDqW9sstdoutsstderrcCsT|i|ƒ}y |i}Wn#tj o|ii|ƒn X||ƒ|SdS(s#standard python unpickling behaviorN( sclss__new__sselfs __setstate__ssetstatesAttributeErrors__dict__supdatesstate(sclssstatessetstatesself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysClassicUnpickler‹s  icCsÁtii|ƒ o{yQtiitii|d|ƒƒ}tii|ƒ otd|ƒ‚nWqtj otd|ƒ‚qXn|t jot |ƒSnt d|i ƒ‚dS(s"raise IOError if path not readablescurdirsunable to open file %ss$Attempt to unpickle untrusted class N( sosspathsexistssnormpathsjoinskwargssIOErrorsKeyErrorsclssSourceFileNames ValueErrors__name__(sclsspathskwargs((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysfilename_unpickler˜s% sSourceFileNamecBstZdZd„ZRS(s‡store a filepath string, raise IOError on unpickling if filepath not readable, and complain if the user tries to pickle a relative pathcCsdtiit|ƒƒ otidt|ƒIJnt|it|ƒt dti ƒƒffSdS(Ns1 WARNING: You are trying to pickle an object that has a local file dependency stored only as a relative file path: %s This is not a good idea, because anyone working in a different directory would be unable to unpickle this object, since it would be unable to find the file using the relative path. To avoid this problem, SourceFileName is saving the current working directory path so that it can translate the relative path to an absolute path. In the future, please use absolute paths when constructing objects that you intend to save to worldbase or pickle!scurdir( sosspathsisabssstrsselfssyssstderrsfilename_unpicklers __class__sdictsgetcwd(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __reduce__ªs (s__name__s __module__s__doc__s __reduce__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysSourceFileName¦s cCs2tii|ƒ}|djo tiSn|SdS(s,return path to directory containing filenamesN(sosspathsdirnamesfilenamescurdir(sfilenamesdirname((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys file_dirpath»s   cGsBx;|D]3}tii|Œ}tii|ƒo|SqqWdS(szfor each tuple in args, build path using os.path.join(), and return the first path that actually exists, or else None.N(s pathTuplesstsosspathsjoinsmypathsexists(s pathTuplesstsmypath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysget_valid_pathÃs cCsˆtii|ƒo|Sntii|ƒ}x>|D]6}tii||ƒ}tii|ƒo|Sq4q4Wt d||fƒ‚dS(s9return successful path based on trying pathlist locationss)unable to open %s from any location in %sN( sosspathsexistssfilepathsbasenamesbspathlistsssjoinsmypathsIOError(sfilepathspathlistsbsssmypath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyssearch_dirs_for_fileËs cCsLdk}tiƒd }|i|d|dƒ}tid|dIJdS(s-print string message from exception to stderrNiiis Warning: caught %s Continuing...(s tracebackssyssexc_infosinfosformat_exception_onlyslsstderr(sinfos tracebacksl((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysreport_exception×s  cCs>y |iSWn,tj o |i|ƒ|_|iSnXdS(s@keep a reference to an inverse mapping, using self._inverseClassN(sselfs_inversesAttributeErrors _inverseClass(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysstandard_invertÞs  cCs|d„}|SdS(smCreate a function to replace __invert__ with a call to a cached object. lazy_create_invert defines a method that looks up self._inverseObj and, it it doesn't exist, creates it from 'klass' and then saves it. The resulting object is then returned as the inverse. This allows for one-time lazy creation of a single object per parent class. cCs>y |iSWn,tj o ||ƒ}||_|SnXdS(N(sselfs_inversesAttributeErrorsklasss inverseObj(sselfsklasss inverseObj((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys invert_fnïs    N(sklasss invert_fn(sklasss invert_fn((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyslazy_create_invertæs cCsëh}xq|iiƒD]`\}}y>t|tƒot||ƒ||scCsæ|i}|i}||_t}t|dƒot|dƒ ot}|i |i dÍss__lt__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÎss__le__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÏss__eq__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÐss__ne__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÑss__gt__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÒss__ge__N(s localDictsmycmp(s localDictsmycmp((smycmps?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysoverride_rich_cmpÊs sDBAttributeDescrcBs tZdZd„Zd„ZRS(s-obtain an attribute from associated db objectcCs ||_dS(N(sattrsself(sselfsattr((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__×scCst|i|iƒSdS(N(sgetattrsobjsdbsselfsattr(sselfsobjsobjtype((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__get__Ùs(s__name__s __module__s__doc__s__init__s__get__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysDBAttributeDescrÕs  cCs3yti|SWntj otiƒSnXdS(s@get the specified environment value or path to current directoryN(sossenvironsenvnamesKeyErrorsgetcwd(senvname((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysget_env_or_cwdÜs sRecentValueDictionarycBs>tZdZed„Zd„Zd„Zd„Zd„ZRS(s›keep the most recent n references in a WeakValueDictionary. This combines the elegant cache behavior of a WeakValueDictionary (only keep an item in cache if the user is still using it), with the most common efficiency pattern: locality, i.e. references to a given thing tend to cluster in time. Note that this works *even* if the user is not holding a reference to the item between requests for it. Our Most Recent queue will hold a reference to it, keeping it in the WeakValueDictionary, until it is bumped by more recent requests. n: the maximum number of objects to keep in the Most Recent queue, default value 50.cCsgti|ƒ|djot|_dSnt|tƒo ||_n d|_d|_h|_dS(Nii2i( sWeakValueDictionarys__init__sselfsns __class__s isinstancesintsis _keepDict(sselfsn((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__ñs      cCs'ti||ƒ}|i|ƒ|SdS(N(sWeakValueDictionarys __getitem__sselfsksvs keep_this(sselfsksv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __getitem__üs cCs­|i|i|<|id7_t|iƒ|ijoq|iiƒ}|dd}|dd}x5|dD])\}}||jo|}|}qnqnW|i|=ndS(s@add v as our most recent ref; drop oldest ref if over size limitiiN( sselfsis _keepDictsvslensnsitemsslsiminsvmin(sselfsvsvminsisiminsl((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys keep_thiss  cCs$ti|||ƒ|i|ƒdS(N(sWeakValueDictionarys __setitem__sselfsksvs keep_this(sselfsksv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __setitem__ scCs|iiƒti|ƒdS(N(sselfs _keepDictsclearsWeakValueDictionary(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysclears ( s__name__s __module__s__doc__sNones__init__s __getitem__s keep_thiss __setitem__sclear(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysRecentValueDictionaryäs   cCsqt|ƒo\|iƒd}t|tƒot|ƒSnt|tƒot|ƒSnt dƒ‚nt SdS(s¶ If 'd' contains int values, use them to index tuples. If 'd' contains str values, use them to retrieve attributes from an obj. If d empty, use standard 'getattr'. is%dictionary values must be int or str!N( slensdsvaluessvs isinstancesints AttrFromTuplesstrsAttrFromObjects ValueErrorsgetattr(sdsv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysmake_attribute_interfaces s AttrFromTuplecBstZd„Zed„ZRS(NcCs ||_dS(N(sattrDictsself(sselfsattrDict((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__(scCsXy||i|SWn.ttfj o|tj o|SqDnXtd|ƒ‚dS(sgetattr from tuple objsobject has no attribute '%s'N( sobjsselfsattrDictsattrs IndexErrorsKeyErrorsdefaultsNonesAttributeError(sselfsobjsattrsdefault((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__call__+s  (s__name__s __module__s__init__sNones__call__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys AttrFromTuple's sAttrFromObjectcBstZed„ZRS(NcCs~yt||i|ƒSWnOtj oCyt||ƒSWqjtj o|tj o|SqeqjXnXtd|ƒ‚dS(s#getattr with attribute name aliasessobject has no attribute '%s'N( sgetattrsobjsselfsattrDictsattrsKeyErrorsdefaultsNonesAttributeError(sselfsobjsattrsdefault((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__call__5s (s__name__s __module__sNones__call__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysAttrFromObject4scCsGh}x6|D].}y||||this subclass uses the subprocess module Popen() functionalitycCsj|i|iƒti|i|iŽ}|iƒ|i dƒ|i|i ƒ|i|i ƒ|i SdS(Nsstdin( sselfs_rewind_for_readingsstdins subprocesssPopensargsskwargsspswaits _close_filesstdoutsstderrs returncode(sselfsp((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyswaitVs  (s__name__s __module__s__doc__swait(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopenTs sWindowscCsd|dSdS(s,Very basic quoting of arguments for Windows s"N(sarg(sarg((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysmkargcs(smkargsSHELLscshcBstZdZd„ZRS(s=this subclass fakes subprocess.Popen.wait() using os.system()cCsW|i|iƒtt|idƒ}|ido|dt|iƒg7}n|ido|dt|iƒg7}ndi|ƒ}|ido?t od|t|i ƒf}qØ|d t|i ƒ}nt i |ƒ}|id ƒ|i|iƒ|i|iƒttj o t|jo!td t|idƒƒ‚n|SdS( Niiss is (%s) >& %ss 2> sstdinsno such command: %s(sselfs_rewind_for_readingsstdinsmapsmkargsargss _stdin_paths _stdout_pathsjoinscmds CSH_REDIRECTs _stderr_pathsosssystems returncodes _close_filesstdoutsstderrsbadExecutableCodesNonesOSErrorsstr(sselfsargsscmds returncode((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyswaitrs$ !(s__name__s __module__s__doc__swait(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopenps saZfDqW9sstdoutsstderrcCsT|i|ƒ}y |i}Wn#tj o|ii|ƒn X||ƒ|SdS(s#standard python unpickling behaviorN( sclss__new__sselfs __setstate__ssetstatesAttributeErrors__dict__supdatesstate(sclssstatessetstatesself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysClassicUnpickler‹s  icCsÁtii|ƒ o{yQtiitii|d|ƒƒ}tii|ƒ otd|ƒ‚nWqtj otd|ƒ‚qXn|t jot |ƒSnt d|i ƒ‚dS(s"raise IOError if path not readablescurdirsunable to open file %ss$Attempt to unpickle untrusted class N( sosspathsexistssnormpathsjoinskwargssIOErrorsKeyErrorsclssSourceFileNames ValueErrors__name__(sclsspathskwargs((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysfilename_unpickler˜s% sSourceFileNamecBstZdZd„ZRS(s‡store a filepath string, raise IOError on unpickling if filepath not readable, and complain if the user tries to pickle a relative pathcCsdtiit|ƒƒ otidt|ƒIJnt|it|ƒt dti ƒƒffSdS(Ns1 WARNING: You are trying to pickle an object that has a local file dependency stored only as a relative file path: %s This is not a good idea, because anyone working in a different directory would be unable to unpickle this object, since it would be unable to find the file using the relative path. To avoid this problem, SourceFileName is saving the current working directory path so that it can translate the relative path to an absolute path. In the future, please use absolute paths when constructing objects that you intend to save to worldbase or pickle!scurdir( sosspathsisabssstrsselfssyssstderrsfilename_unpicklers __class__sdictsgetcwd(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __reduce__ªs (s__name__s __module__s__doc__s __reduce__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysSourceFileName¦s cCs2tii|ƒ}|djo tiSn|SdS(s,return path to directory containing filenamesN(sosspathsdirnamesfilenamescurdir(sfilenamesdirname((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys file_dirpath»s   cGsBx;|D]3}tii|Œ}tii|ƒo|SqqWdS(szfor each tuple in args, build path using os.path.join(), and return the first path that actually exists, or else None.N(s pathTuplesstsosspathsjoinsmypathsexists(s pathTuplesstsmypath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysget_valid_pathÃs cCsˆtii|ƒo|Sntii|ƒ}x>|D]6}tii||ƒ}tii|ƒo|Sq4q4Wt d||fƒ‚dS(s9return successful path based on trying pathlist locationss)unable to open %s from any location in %sN( sosspathsexistssfilepathsbasenamesbspathlistsssjoinsmypathsIOError(sfilepathspathlistsbsssmypath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyssearch_dirs_for_fileËs cCsLdk}tiƒd }|i|d|dƒ}tid|dIJdS(s-print string message from exception to stderrNiiis Warning: caught %s Continuing...(s tracebackssyssexc_infosinfosformat_exception_onlyslsstderr(sinfos tracebacksl((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysreport_exception×s  cCs>y |iSWn,tj o |i|ƒ|_|iSnXdS(s@keep a reference to an inverse mapping, using self._inverseClassN(sselfs_inversesAttributeErrors _inverseClass(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysstandard_invertÞs  cCs|d„}|SdS(smCreate a function to replace __invert__ with a call to a cached object. lazy_create_invert defines a method that looks up self._inverseObj and, it it doesn't exist, creates it from 'klass' and then saves it. The resulting object is then returned as the inverse. This allows for one-time lazy creation of a single object per parent class. cCs>y |iSWn,tj o ||ƒ}||_|SnXdS(N(sselfs_inversesAttributeErrorsklasss inverseObj(sselfsklasss inverseObj((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys invert_fnïs    N(sklasss invert_fn(sklasss invert_fn((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyslazy_create_invertæs cCsëh}xq|iiƒD]`\}}y>t|tƒot||ƒ||scCsæ|i}|i}||_t}t|dƒot|dƒ ot}|i |i dÍss__lt__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÎss__le__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÏss__eq__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÐss__ne__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÑss__gt__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÒss__ge__N(s localDictsmycmp(s localDictsmycmp((smycmps?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysoverride_rich_cmpÊs sDBAttributeDescrcBs tZdZd„Zd„ZRS(s-obtain an attribute from associated db objectcCs ||_dS(N(sattrsself(sselfsattr((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__×scCst|i|iƒSdS(N(sgetattrsobjsdbsselfsattr(sselfsobjsobjtype((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__get__Ùs(s__name__s __module__s__doc__s__init__s__get__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysDBAttributeDescrÕs  cCs3yti|SWntj otiƒSnXdS(s@get the specified environment value or path to current directoryN(sossenvironsenvnamesKeyErrorsgetcwd(senvname((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysget_env_or_cwdÜs sRecentValueDictionarycBs>tZdZed„Zd„Zd„Zd„Zd„ZRS(s›keep the most recent n references in a WeakValueDictionary. This combines the elegant cache behavior of a WeakValueDictionary (only keep an item in cache if the user is still using it), with the most common efficiency pattern: locality, i.e. references to a given thing tend to cluster in time. Note that this works *even* if the user is not holding a reference to the item between requests for it. Our Most Recent queue will hold a reference to it, keeping it in the WeakValueDictionary, until it is bumped by more recent requests. n: the maximum number of objects to keep in the Most Recent queue, default value 50.cCsgti|ƒ|djot|_dSnt|tƒo ||_n d|_d|_h|_dS(Nii2i( sWeakValueDictionarys__init__sselfsns __class__s isinstancesintsis _keepDict(sselfsn((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__ñs      cCs'ti||ƒ}|i|ƒ|SdS(N(sWeakValueDictionarys __getitem__sselfsksvs keep_this(sselfsksv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __getitem__üs cCs­|i|i|<|id7_t|iƒ|ijoq|iiƒ}|dd}|dd}x5|dD])\}}||jo|}|}qnqnW|i|=ndS(s@add v as our most recent ref; drop oldest ref if over size limitiiN( sselfsis _keepDictsvslensnsitemsslsiminsvmin(sselfsvsvminsisiminsl((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys keep_thiss  cCs$ti|||ƒ|i|ƒdS(N(sWeakValueDictionarys __setitem__sselfsksvs keep_this(sselfsksv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __setitem__ scCs|iiƒti|ƒdS(N(sselfs _keepDictsclearsWeakValueDictionary(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysclears ( s__name__s __module__s__doc__sNones__init__s __getitem__s keep_thiss __setitem__sclear(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysRecentValueDictionaryäs   cCsqt|ƒo\|iƒd}t|tƒot|ƒSnt|tƒot|ƒSnt dƒ‚nt SdS(s¶ If 'd' contains int values, use them to index tuples. If 'd' contains str values, use them to retrieve attributes from an obj. If d empty, use standard 'getattr'. is%dictionary values must be int or str!N( slensdsvaluessvs isinstancesints AttrFromTuplesstrsAttrFromObjects ValueErrorsgetattr(sdsv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysmake_attribute_interfaces s AttrFromTuplecBstZd„Zed„ZRS(NcCs ||_dS(N(sattrDictsself(sselfsattrDict((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__(scCsXy||i|SWn.ttfj o|tj o|SqDnXtd|ƒ‚dS(sgetattr from tuple objsobject has no attribute '%s'N( sobjsselfsattrDictsattrs IndexErrorsKeyErrorsdefaultsNonesAttributeError(sselfsobjsattrsdefault((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__call__+s  (s__name__s __module__s__init__sNones__call__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys AttrFromTuple's sAttrFromObjectcBstZed„ZRS(NcCs~yt||i|ƒSWnOtj oCyt||ƒSWqjtj o|tj o|SqeqjXnXtd|ƒ‚dS(s#getattr with attribute name aliasessobject has no attribute '%s'N( sgetattrsobjsselfsattrDictsattrsKeyErrorsdefaultsNonesAttributeError(sselfsobjsattrsdefault((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__call__5s (s__name__s __module__sNones__call__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysAttrFromObject4scCsGh}x6|D].}y||||Ëx; ?H\<Ÿ<¿<ÿˆãx8„1p8¥1X8ç1l8a88À H&<_88€B¤,€bH%©Hd;½8ÿÿœè;ÞAžLCÓx8›1 Åóx8Þ8þ9 9>H&­/ƒAžÿÄ<<Ÿ¥ëx†ãx€c¤08„1°8c°H&e8!`#Ëx€»!ÿä|¦N€ ``€C€‚Aœ$A0€C€‚AAœ8`N€ 8`ÿÿN€ ``8`N€ ``€C€‚Aœ$A0€C€‚AœA8`N€ 8`ÿÿN€ ``8`N€ ``€C€‚Aœ$A0€C € ‚AœA8`N€ 8`ÿÿN€ ``8`N€ ``,L |i¦`d8/‹@œ8ÿÿ```€(Až0€$ }kЀD‘d|Ð})Ð|BБ$D 8„Bÿ¨N€ |¦¿¡ÿô|~yBŸè¦”!û°AT<Ÿ<¿<ÿÈóx8„.p8¥.¨8ç.¼8À78a8; H#Ù<_88€B¡„€bH#eH````8€H$M|}y@¢D<Ÿ<¿<ÿÈóx8„.À8¥.¨8ç.¼8a88À7H#}<_88€B¡|€bH# `8!P£ëx€»¡ÿô|¦N€ ``5fÿÿ|jx8`@@| | p})”I|B*€Š@œ}+KxH``8iƒXAœÿȆ@0|E.| *‚ @œ€€PM ```8`ÿÿN€ ``4Æÿÿ|kx8`L || p})”U"8|B*€€X@}&KxH``8iƒ0AœÿÈN€ |¦¿Áÿø8`BŸ8€ 覔!û°H"á|~y@¢H<Ÿ<¿<ÿ8a88„-8¥,è8ç-„8Àv9H"<_88€BŸ¼€bH!``8!PÃóx€»Áÿø|¦N€ ``|¦¿ÿð||y”!ÿ°A‚ŒƒÜ/žAž@```€~ƒ¾/ƒAžH!±ÃóxH!©/Až¾ëxKÿÿØ`žãx```€~ƒ¾/ƒAžH!qÃóxH!i/Až¾ëxKÿÿØ`8!P8`€»ÿð|¦N€ ``H```|x€/€@žÿôN€ ``|¦|Å1Ö|©þp|ª+x|¢+x|å;x¿ÿð”!ÿ°|Ì3x|Ëþp|}x|œ#x} P|ëI|©þp‡HA,@žˆ(@A ```|^xH``|Ö|ÖÀ(P8` 8À|Œ|¬Ö£ëx|€"H ƒãx¦ëxÅóx8€Hu8!PÃóx€»ÿð|¦N€ ``|¦¿ÿð|½+yBŸ||x|ž#x覔!û°@‚¬€d/ƒAP<Ÿ<¿<ÿ|hx8„*`8¥*˜8ç*¬8a88À÷H¹<_88€Bt€bHEHœ```8€H -|}y@¢D<Ÿ<¿<ÿ8a88„*°8¥*˜8ç*¬8À÷H]<_88€Bl€bHéH@€8`8À| þp|€| Öƒãx)|‰"HÝ€¾£ëx†ãx8€HI8!P£ëx€»ÿð|¦N€ ```|¦¿aÿì|½+x|„+Ö|{x|ü;x”!ÿ Ä)Ö|ò€0@¾0PÄþpWÀ~WÅ88ÀT„8ƒãx|#xHQcÛx¥ëx†ãx8€H½8!`Ãóx€»aÿì|¦N€ |¦¿Aÿè|œ#x|½+x8€…ãx|zx”!ÿ |Û3xH|ëÖ|éÖÀàQA‚8ÞèQ@0; ``;½CÓx8€8 fÛxHÝžè@žÿä8!`|~※Aÿè|¦N€ ``|¦¿ÿà|ü;yBŸ|xx|™#xè¦|»+x|Ú3x”!û A¡T<Ÿ<¿<ÿˆãx8„( 8¥(X8ç(ø8À¯8a8H}<_88€B›4€bH 8`ÿÿHÀ```ƒãx8€Hé|}y@¢0<Ÿ<¿<ÿˆãx8„(p8¥(X8ç(ø8À¯8a8H@`ƒãx8€H©|~y@¢P<Ÿ<¿<ÿˆãx8„(p8¥(X8ç)8À°8a8HÙ<_88€B›,€bHe8`ÿÿH``‰¦KÓx8àªëx ›@@œ(Tà8€K}>|^.‘ ê8ç``9J9kBÿȉ¦KÓxªëx`` ˆØA(Tà8€K}>|^.‘ ê8ç``9J9kBÿÈ/™@0HT``€/€AœT:|].C8cBÿäW…8ÄóxCÓxH5£ëxHíÃóxHå8`H)¦ÃxKÿÿ°```8!`€»ÿà|¦N€ ```|¦¿!ÿä|#y|zx|¹+x|Û3x;€”!ÿ @l;À`~8€ÞÊ8 fÛx|cÒH8~ÿÿA8}ÿÿc8€8 fÛx;œ|z8cHéðAÿ°```8!`ƒãx€»!ÿä|¦N€ ``|¦¾áÿÜ|˜#x|@&BŸ|{x|º+xè¦|exA”!óp<Ÿ8„&;ÁLÃóxH‘<ŸÃóx8„&H¡|}yA‚Ø<Ÿ8¡88Á<8á@8„&,9D9!HH9£ëxH±€H4`AT;¡L<Ÿ<¿<ÿ|hx8„%8¥%T8ç&<8ÀF£ëx:àH<_¤ëx€B˜0€bH¡H``8€H||y@‚TH;¡L<Ÿ<¿<ÿ8„%l8ÀF8¥%T8ç&<9£ëx:àH±<_¤ëx€B˜(€bH=H¸`€H/€@L<ŸeÛxÃóx??8„&@Hq8™&LÃóxH…|}yA‚¼€¡Hƒãx8€¦ëxH‰£ëxH¡8`8€0HÕ.|wx@’8;¡L<Ÿ<¿<ÿ8„%l£ëx8¥%T8ç&P8ÀS9H``!D/‰A8`??H4``<ŸeÛxÃóx??8„&\H½Ãóx8™&LHÑ|}y@‚8`/˜Až¬<ŸÃxÅóx:à8„&H…H ```/šAL;¡L<Ÿ<¿<ÿ8„%HÓx8¥%T8ç&h£ëx8À]HA<_¤ëx€B˜0€bHÍH`CÓx8€H¹,@‚P;¡L<Ÿ<¿<ÿ8„%lHÓx8¥%T8ç&h£ëx8À]`Há<_¤ëx€B˜(€bHmH¸`|Г·(w“W $!D€8€A<‘7W€@}"Ö | Ö‘7‚Až 8 w“—<ŸeÛx8„&tÃóxHY8™&LÃóxHm/ƒw,@ž`/˜Až4<ŸÃxÅóx8„&H%H```ƒãxH-A’~ã»x:àHH`:à```8! ~ã»x€aºáÿÜ|¦}p N€ |¦¿Áÿø|~x”!ÿ°``€c,/ƒAžHù€~(/ƒAžHé€~/ƒAžH™8€~/ƒAžH8ÃóxHq8!P8`€»Áÿø|¦N€ `|¦¾áÿÜ|#xBŸ|yx|·+xè¦|ex|Ø3x”!÷P<Ÿ8„!l;atcÛxHõ<ŸcÛx8„!tH|~yA‚Œ<Ÿ8¡88Á<8á@8„!9D9!HH/ƒ@ž”ÃóxH €á<@|CÖ|ü;x|AÖ|8Q@ |@P‡€Á8!D<Ÿ¥ëxAHÃx8„!àH)/ƒAœd€H/€@˜<Ÿ%ËxcÛx8„!¤HA<ŸcÛx8„!°HQ|}yA‚Ø€H/€@XHP`CÓx8€8 ¦ëxHA/ƒ@žØ€¡L€ÁP<ŸÃx8„!øH¡/ƒAœÜ€H;ÞžAœÿ¸£ëxH!€D/€@¤<Ÿ%ËxcÛx8„!ÀH¡<ŸcÛx8„!°H±|}yA‚8€D/€@dH¼`CÓx8€8 ¦ëxH¡/ƒ@ž8€¡T€ÁX<ŸÃx8„"H/ƒAœ<€D;Þ€ATž€X‚Aœÿ¬£ëxHu/œ8`@X<Ÿ%ËxcÛx8„!ØHõ<ŸcÛx8„!°H|}yA‚Œ;À;!\?_```#Ëx8€8 ¦ëxHñ/ƒ@žˆ€¡\€Á`Ãx8š"€ádh!lApHE/ƒAœ€;Þœð@žÿ°£ëxHÉ8`H°```/—Až|<Ÿ~ã»xeÛx8„!xH98`ÿÿH€```/—AžL<Ÿ~ã»xeÛx8„"(H 8`ÿÿHP/—Až(<Ÿ~ã»x8 .8„"HHE8`ÿÿH,``8`ÿÿH;À;ALKÿý°;À;ATKÿþD8!°€ºáÿÜ|¦N€ ```|¦¾ÿÐ|xxBŸ|–#x|º+xè¦<ÿÿ8€ÿÃx`oP|!n;¡t£ëxHU/ƒAž,;!t<Ÿ£ëx8Á88„Ø%Ëx8á<9@9!D9AHH¡/ƒ@žø:¡t<Ÿ~ųx&Ëx8„ð~£«xHý<Ÿ~£«x8„üH ||yA‚ €¡8€Á<<Ÿ€á@D!H8„H…/ƒAœôƒãxHƒa<€A@|Ö|Ö|ØQ@ |P{€H/€@¼<Ÿ~ųx&Ëx~£«x8„>ŸHm~£«x8”H|wyA‚€H/€@tH°`£ëx8€ÿÃxH5/ƒAž ;T<Ÿ£ëx8ÁX8„ …ãxH‘/ƒ@žèƒãx8€8 ~æ»xHÕ/ƒ@ž$€H;ÞžAœÿœ~ã»xH5H>Ÿ€D/€@¼<Ÿ~ųx&Ëx~£«x8„(H©~£«x8”H½|wyA‚P€D/€@|Hô£ëx8€ÿÃxHu/ƒAžL;L<Ÿ£ëx8ÁP8„8…ãxHÑ/ƒ@ž(ƒãx8€8 ~æ»xH/ƒ@žd€D;Þ€ALž€PbAœÿ~ã»xHi<Ÿ&Ëx~ųx~£«x8„@Hñ8”~£«xH|yyA‚˜/›@€;€>ÿ;Á\`£ëx8€ÿÃxHµ/ƒAžŒ£ëx8—LÅóx8Á`8ád9h9!l9ApH /ƒ@ž`Ãóx8€8 &ËxHM/ƒ@žœ;œ›à@žÿ˜#ËxH±8`HÈ/šAž <ŸCÓx~¥«x8„ØH-8`ÿÿH¤/šAž|=?8`ÿÿ8I`)`€bB ‘:‘z‘Z €"bB‘:‘z‘ZHL/šAž$<ŸCÓx~¥«x8„€H±8`ÿÿH(`8`ÿÿH;ÀKÿýT;ÀKÿþ ``€!€ºÿÐ|¦N€ ```,|hxA€˜T 88`|@:|§.B5jÿÿ|À2@@| | p})”I|B2€ˆ@œ}+KxH``8iƒXAœÿȃP@œ0|F.|Æ„@€ˆ@œ/ƒ|c*Lœ 8`ÿÿN€ ``|¦¾!ÿÄ|Ú3yBŸ|wx|•#xè¦|±+x|ò;x”!û€}Cx}8Kxƒa¸‚¼ƒÀ‚aÄ@€\5hÿÿ;À@ô```| ò| p})”U"8|B’€•@œ}+KxH``;ÉžXAœÿÈH¨€›š Aœ€»|*šAœlH€»|+Ö|½+x‚Ûƒ À)Ö|EòŠ@œ¾PPÄþpWÀ~8ÀWÅ8T„8Ãx|#xH m8€~óx¥ëxÃxH Ù“ÛÄóx|ÐP€ÛT82XœPAœ;Àÿÿ;@:ÀHt*ãÖD0.~ÚãÖ|áÖŠAž;95yÿÿVÀ8;À|à’@@| ò| p})”U"8|B:€•@œ}+KxH``;ÉžXAœÿÈ}TSxƒ·/@ž¸/œA½P<Ÿ<¿<ÿˆãx8„8¥88çÌ8À78a8H ¹<_88€B‹€bH E8`ÿþHÔ``ƒãx8€H )/ƒ|}xw@¾H<Ÿ<¿<ÿˆãx8„P8¥88çÌ8À78a8H Q<_88€B‹ €bH Ý8`ÿþHl/žAœ¨~²‚þpƒãxÚ¢|áÖ| x| þp}Š}iÂþp‹A@ž$Œð@@```|ãÖ|áÖ€ðP8` 8À|Š|ªÖ~c›x|€"H y£ëx~f›x8€…ãxH å|ʈãx“—“× “wH8~c›x¥ëxÃxKÿêi€8@W8@W|x``5hÿÿW8`@@| | p})”I|BR€•@œ}+KxH``8iƒXAœÿȈ@0|J.}*‘@€ •Aœ```8`ÿÿw8!€€º!ÿÄ|¦N€ `|¦½¡ÿ´}Cx|@&BŸ.|´+xè¦|Ö3x|ï;x}0Kx|ux|#xA”!÷`@‘@|Å3x|æ;x}CxKÿë‘/ƒÿþ@ž(?¿<Ÿ~e›x;½‡˜8„УëxH =£ëxH¤:A@=ß<Ÿ~ƒx~C“x;®88„. /ˆU8}~.AÿÐ4€@48Âóx9 | ¦```€‘"8B})Bÿð@‘T8ÿÿ9,Šãx| ¦``h€J‹@ TB8Uk8|Bò|X."|J|Y.99JBÿÌ<߃ãxdÛx8 8Æà,Hõ8@ˆi¦ˆãx8 8à8`8€ÿÿ``h8ȇXAœTà8}^€JH0U`89+ÿÿ}g[x|^.}^B|Bâ‘"|¾.|bxj8B8¥9J†Bÿ 8½ÿÿÃóx8žT¥8HH8`€ * }kЀJ‘j|Ð})Ð|BÐ ‘*J Kÿû°8!`Ãóxa€»Aÿè|¦}q }p N€ ```|¦¾áÿÜ|ž#yBŸ|}x|¸+xè¦|×3x€&”!û@(ɦ|jx``j/‹Aœ89JBÿð<ߣëxÄóx8 8ÆÛHy˜ @ 8@;@9bX@™Œ/‚AœxË|Ix`` |ý2€G}]B€ ‚A@ž$|@.|]0.‚@ž*H$``‘'}i[x9k;ZX8Æ@™/‰@œÿ }b[xKÿÿt`/š@üCÓx8€H!||y@‚H<Ÿ<¿<ÿHÓx8„ @8¥ (8ç8Àÿ8a8; HÿM<_88€B}ü€bHþÙHDɦ«ëx8à;`8Àÿÿ9@``€ 9 /€Aœ4|\R |êá.9J|]J€/€@œ“b;{`È8ç9kBÿ´<߃ãxDÓx8 8ÆÛ`Hþí/›AP<Ÿ<¿<ÿhÛx8„ ð8¥ (8ç <8À8a8; Hþy<_88€B~€bHþƒãxHþ}HhcÛx8€Hþí|yy@‚D<Ÿ<¿<ÿhÛx8„ @8¥ (8ç <8a88ÀHþ<_88€B}ü€bHý©Kÿÿ¤I¦ˆãx8 8€ÿÿ€(T(4T8)|ÀP|ý2|0.})ê€GgG H‘h‘H €€GH€ T8}9€I/‚@ž|¹.88¥9 ‡|1.Bÿ|ɦªëx8à;À8À` /ˆÿÿ@ž€ /€ÿÿAžT``‡ð@<€ *|]2j }1.‘"‘b € *‘"``;Þ8Æ8ç9JBÿ~º„ãx|}Hü-i¦"Ëx€|8BBÿðƒãxHüÉ“ØHl```“Ø8`8€Hý%|yy@‚D<Ÿ<¿<ÿ8a88„ @8¥ (8ç <8À)9HüU<_88€B}ü€bHûáHL;`“wH@```€ * }kЀJ‘j|Ð})Ð|BÐ ‘*J Kÿû 8!p#Ëx€ºáÿÜ|¦N€ ``|¦¾ÿÐ|œ#x|@&BŸ.|º+xè¦|Û3x|þ;x}Cx}XSxA”!û‚¨@’@8`8€ Hü%|}y@¢0<Ÿ<¿<ÿ8À¦8„l8¥T8çð98a8H<|}x/œ:à@œ\HH<Ÿ<¿<ÿ8À¾8„l8¥T8ç <98a8Hû<_88€By(€bHú¥8`ÿÿH|Ð:àÿÿ\Ð|x€/€@žx5~ÿÿ“Ý9@@8| R| p})”I|BÚ€œ@œ }+KxH9I‹PAÿЊð@œ$ |[.};š@€ œAœ9@ÿÿ‘]; HH*j ;9|X}.â‘"‘b € j‘b=I9)|BÚ€‘=/€AœäT88àÕ|Õ.5hÿÿ}[@H``| :| p})”I|BR€œ@œ}+KxH``8é‹8Aÿȇ@@œt|J.}*š@`€ œ@œT/‡AœL~Ç2A€D€}/ƒ@ž 8`8€ Hùù,A‚þ}“£’Ã|}x€^€|™ @œÈ ëx|x€]/‚Aœ4€‚@œ(}.}@Úš@@€êœ8Aœþˆ`ƒÝ/žÀóx@žÿ´@’lƒ/œAž4€|ƒÜ/ƒAžHøÑƒãxHøÉ/žAž ÜóxKÿÿ؃Ý€}/ƒAžHø¥£ëxHø/žAžÝóxƒÞKÿÿØ; /™@h)¦ Ãxj8/‹@œ8ÿÿ```—Až0€ * }kЀJ‘j|Ð})Ð|BÐ ‘*J 9JBÿ¨€A¬8`“"!°“©8!p€aºÿÐ|¦}p N€ `|¦½¡ÿ´|™#x|@&BŸ.|¸+xè¦|Ó3x|ò;x}Cx}0Kx}OSxA”!û```ÁØ‚áÜ‚Áà‚è@’H8`8€ H÷ý|{y@¢8<Ÿ<¿<ÿ8ÀX8„\8¥D8çà98aHHÄ``|{x/™9 @œ|Ð9 ÿÿÐ|x€/€Až€[;;@: H$cÛx$Ëx‘á8‘Á<’á@’ÁDÃx8Àÿÿ~g›x~H“x~)‹x~ ƒxKÿé/ƒÿþ@žÿ´H\€ €I ;Z‘‘^^ € €I^;ƒ»€I/9i|Bƒ‚‘{@ž 8`8€ Höå|}yA‚°“}“»/œAœL†ãx£ëx‘á8‘Á<’á@’ÁD$ËxÃx~g›x~H“x~)‹x~ ƒxKÿèI|uyA€»ëxH`/•ÿþAž”``š ;Þ@œ¸{/‹Aœ8€‹@œ0+€[} .})˜@@I™PAœþìH€€[‹8B[@ž¬;‚H@œ¤|¹Ö€» ~âþpƒ»~ã»x| x| þp}Š}i|¢þp‹A@ž Œ(@A ~þ»xH|»Ö|¹ÖÀ(P8` 8À|Š|ªÖ~óx|€"Hôµ£ëx8€Åóx~ƳxHô!€[;8“ÛH;‚H@œ€AäÂKÿþè``ƒÛ/žAž€^>ÛóxKÿÿÈ@’lƒ»/Až4€}ƒÝ/ƒAžHô…£ëxHô}/žAž ÝóxKÿÿ؃Û€{/ƒAžHôYcÛxHôQ/žAžÛóxƒÞKÿÿØ;``/š@hI¦Aäj8/‹@œ8ÿÿ```Až0€ * }kЀJ‘j|Ð})Ð|BÐ ‘*J 9JBÿ¨€Aì8`“B€Að“bHP<Ÿ<¿<ÿ8Às8„\8¥D8ç,98aHHói<_8H€Bu€bHòõ8`ÿÿH 8`ÿÿ`8! €a¹¡ÿ´|¦}p N€ |¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿¡ÿô|~xBŸ|ƒ#x|¤+x覔!ÿ°<ß<¿8Æ{X8¥ýDHöÍ8@/ƒAž€~€^/ƒ8B^AžHò…€~/ƒAžHòu8<_ƒ¢p0€]8B]>9)ÿÿ/‰‘>Až¢ëxH(`€^Ãóx€| ¦| xN€!¢ëx`8!P|Cx€»¡ÿô|¦N€ ``|¦8@”!ÿ°C`€/€@ž€C€| ¦| xN€!8!P8`€|¦N€ `|¦¿ÿà|~x|›#x|¼+x|Ú3x|ù;x”!ÿ }Cx`C€(€CŠ8BCAœ,€C8€€ | ¦| xN€!^```>j;ªiY.€^|K“‚>}+J“I€^|K“" €}k“ “¾€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!`£ëx€»ÿà|¦N€ ``|¦¿¡ÿô|~x; ”!ÿ°`€ƒ€C/„8BCAž@€(„@œ$„€cHôù€^H```€c8|}x8ÿÿ/€@ž€^Ãóx€| ¦| xN€!8!P£ëx€»¡ÿô|¦N€ |¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿¡ÿô|~xBŸ|ƒ#x|¤+x覔!ÿ°<ß<¿8Æx 8¥ùôHó}8@/ƒAž€€~€^/ƒ8B^AžKÿØU8<_ƒ¢là€]8B]>9)ÿÿ/‰‘>Až¢ëxH,``€^Ãóx€| ¦| xN€!¢ëx`8!P|Cx€»¡ÿô|¦N€ ``|¦¿Áÿø”!ÿ°``€ƒÃ /€@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ ```|¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿Áÿø”!ÿ°``€ƒÃ/€@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ ```|¦¿Áÿø”!ÿ°``C€€CŠ9‘@h€C  }@PPc}I¦€(})€ €XA8€ ‹@œ,€ € @ž € €(@ž;ÀH``9)Bÿ¼;À8ÿÿ/€@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ ``|¦¿Aÿè|›#y||x|º+x”!ÿ ``€C8BC@0|¾+x; `€~;½;ÞHìe›è@žÿì``CÓxHìM€\8Bÿÿ/‚\@ž8€\8!`ƒãx»Aÿè€| ¦| x€|¦N€ ```8!`€»Aÿè|¦N€ ```|¦¿Áÿø|~x”!ÿ 8a88<8¡@Hî¡€~€^/ƒ8B^AžH륀~/ƒAžHë•€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Hì/ƒAž ÃóxHôQ€^€a8€<€¡@8Bÿÿ^HðU€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ `|¦¿Áÿø|~x”!ÿ 8<8a88¡@HíÁ€^€~8B^KÿÈÝ€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```Hë±/ƒAž ÃóxHó€^€a8€<€¡@8Bÿÿ^Hï…>`$/‰Až0€I8Bÿÿ/‚I@ž€~`$€C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦|Œ#x|¤+x”!ÿ°``€c`$/ƒAž}‰¦N€!,@‚8`8!P€|¦N€ `|¦“áÿüBŸè¦”!ÿ°=?)fôc`$‘#`$/‹€I8BIAž0€K8Bÿÿ/‚K@ž€K}c[x€| ¦| xN€!8!P8`€ƒáÿü|¦N€ |¦¿Áÿø|~x”!ÿ 8a88<8¡@Hëá€~€^/ƒ8B^Až KÿÒ€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`HéÑ/ƒAž ÃóxHñ¡€^€a8€<€¡@8Bÿÿ^Hí¥€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ `|¦“áÿü8€BŸè¦”!ÿ°€˜| ¦| xN€!|kyA‚ <_=?)e €BqH‘+ K€I8BI‘+$``€I8BI‘+(€I8BI‘+,€I8BI‘+0€I8BI‘+8€I8BI‘+<€I8BI‘+@€I8BI8!P€ƒáÿü|¦N€ ```|¦¿Áÿø|~x”!ÿ 8a88<8¡@Hê!€~4€^/ƒ8B^Až Hçe€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Hè/ƒAž ÃóxHïá€^€a8€<€¡@8Bÿÿ^Hëå> /‰Až8€I8Bÿÿ/‚I@ž$€~ €C€| ¦| xN€!``>$/‰Až8€I8Bÿÿ/‚I@ž$€~$€C€| ¦| xN€!``>(/‰Až8€I8Bÿÿ/‚I@ž$€~(€C€| ¦| xN€!``>,/‰Až8€I8Bÿÿ/‚I@ž$€~,€C€| ¦| xN€!``>0/‰Až8€I8Bÿÿ/‚I@ž$€~0€C€| ¦| xN€!``>8/‰Až8€I8Bÿÿ/‚I@ž$€~8€C€| ¦| xN€!``>@/‰Až0€I8Bÿÿ/‚I@ž€~@€C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c /ƒAžÉ¦|¤+xÌóxN€!,@‚€}$/ƒAžÉ¦„ãxÌóxN€!,@‚à€}(/ƒAžÉ¦„ãxÌóxN€!,@‚¼€},/ƒAžÉ¦„ãxÌóxN€!,@‚˜€}0/ƒAžÉ¦„ãxÌóxN€!,@‚t€}8/ƒAžÉ¦„ãxÌóxN€!,@‚P€},/‰Až8€I8Bÿÿ/‚I@ž$€~,€C€| ¦| xN€!``>0/‰Až0€I8Bÿÿ/‚I@ž€~0€C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c,/ƒAžÉ¦|¤+xÌóxN€!,@‚,€}0/ƒAžÉ¦„ãxÌóxN€!,@‚8`8!P€»ÿð|¦N€ `|¦¿¡ÿô|~xBŸè¦”!ÿ°?¿€][`€c,^,/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€][`H€][`€~0^0/ƒ"9)‘"Až,€C8Bÿÿ/‚C@ž€C€| ¦| xN€!8!P8`€»¡ÿô|¦N€ |¦“áÿü8€BŸè¦”!ÿ°€˜| ¦| xN€!|kyA‚à<_=?)Z€Bf@‘+ K€I8BI‘+``€I8BI‘+€I8BI‘+€I8BI‘+€I8BI‘+$€I8BI‘+(€I8BI‘+D€I8BI‘+H€I8BI‘+L€I8BI‘+P€I8BI‘+T€I8BI8!P€ƒáÿü|¦N€ ```|¦¿Áÿø|~x”!ÿ°``# /‰Až<€I8Bÿÿ/‚I@ž(€c €C€| ¦| xN€!```>/‰Až8€I8Bÿÿ/‚I@ž$€~€C€| ¦| xN€!``>/‰Až8€I8Bÿÿ/‚I@ž$€~€C€| ¦| xN€!``>/‰Až8€I8Bÿÿ/‚I@ž$€~€C€| ¦| xN€!``>/‰Až8€I8Bÿÿ/‚I@ž$€~€C€| ¦| xN€!``>$/‰Až8€I8Bÿÿ/‚I@ž$€~$€C€| ¦| xN€!``>(/‰Až8€I8Bÿÿ/‚I@ž$€~(€C€| ¦| xN€!``>D/‰Až8€I8Bÿÿ/‚I@ž$€~D€C€| ¦| xN€!``>H/‰Až8€I8Bÿÿ/‚I@ž$€~H€C€| ¦| xN€!``>L/‰Až8€I8Bÿÿ/‚I@ž$€~L€C€| ¦| xN€!``>P/‰Až8€I8Bÿÿ/‚I@ž$€~P€C€| ¦| xN€!``>T/‰Až0€I8Bÿÿ/‚I@ž€~T€C€| ¦| xN€!€^8!PÃóx»Áÿø€ | ¦| x€|¦N€ |¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c /ƒAžÉ¦|¤+xÌóxN€!,@‚”€}/ƒAžÉ¦„ãxÌóxN€!,@‚p€}/ƒAžÉ¦„ãxÌóxN€!,@‚L€}/ƒAžÉ¦„ãxÌóxN€!,@‚(€}/ƒAžÉ¦„ãxÌóxN€!,@‚€}$/ƒAžÉ¦„ãxÌóxN€!,@‚à€}(/ƒAžÉ¦„ãxÌóxN€!,@‚¼€}D/ƒAžÉ¦„ãxÌóxN€!,@‚˜€}H/ƒAžÉ¦„ãxÌóxN€!,@‚t€}L/ƒAžÉ¦„ãxÌóxN€!,@‚P€}P/ƒAžÉ¦„ãxÌóxN€!,@‚,€}T/ƒAžÉ¦„ãxÌóxN€!,@‚8`8!P€»ÿð|¦N€ ```|¦¿¡ÿô|~xBŸè¦”!ÿ°?¿€]T0€c ^ /ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~$^$/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~(^(/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~D^D/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~H^H/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~L^L/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~P^P/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]T0H€]T0€~T^T/ƒ"9)‘"Až,€C8Bÿÿ/‚C@ž€C€| ¦| xN€!8!P8`€»¡ÿô|¦N€ |¦¿ÿð|}x|ƒ#x;€”!ÿ°HØU|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿Áÿø|~x”!ÿ 8a88<8¡@HÕ!€~(€^/ƒ8B^AžHÒ%8(€~,/ƒAžHÒ 8,€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`HÒñ/ƒAž ÃóxHÚÁ€^€a8€<€¡@8Bÿÿ^HÖÅ>0/‰Až8€I8Bÿÿ/‚I@ž$€~0€C€| ¦| xN€!``>4/‰Až8€I8Bÿÿ/‚I@ž$€~4€C€| ¦| xN€!``>8/‰Až8€I8Bÿÿ/‚I@ž$€~8€C€| ¦| xN€!``>Kx8BI``<_<€BEü‰Až˜€EÜžAž4<_<Ÿ-ž.€BF8„ÜÀ€bHƵKÿÿ€```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!<<_€BEì‰@žT<žãx€I}4/‰Až8€I8Bÿÿ/‚I@ž$€~4€C€| ¦| xN€!``>8/‰Až8€I8Bÿÿ/‚I@ž$€~8€C€| ¦| xN€!``>ß8`“Á8“Á<“¡@“D€F$“aL8€8 8ÀgÛxÈóxÉóxÊóxHHÁ|yy&A‚xHÀqEÓx$Ëx8ÀHÄ|zy~à&A‚Œ€F$@HÂ)H|€]£ëx€| ¦| xN€!``AŠ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€! A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```~ø A‚œ€Z8Bÿÿ/‚Z@žˆ€Z8!CÓxaºÁÿØ€}r }q | ¦| x€}p |¦N€ ~à&;@H,;À;`; ;@.M~à&V÷€&W€€]8Bÿÿ/‚]@žþ˜Kÿþt8!a€ºÁÿØ|¦}r }q }p N€ ```|¦¿ÿð|}xBŸ|ƒ#x|¤+xè¦8”!ÿ <_<ß<¿€BFð8Æ3D8¥Ï@8á89<8AKx8BIHL€\ƒãx€| ¦| xN€!H €^Ãóx€| ¦| xN€!`<;À8cÏDKÿú%€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!`Ãóx€»ÿð|¦N€ ``|¦¿aÿì|}xBŸ|ƒ#x|¤+xè¦;À”!ÿ <ß<¿8Æ?08¥ÁHº™/ƒAž0=<_€b49)‘=€C8BC€/€Až$<_||xƒÂ4\€^8B^Hˆ`?ß~Bd€K8BK#9)ÿÿ/‰‘#@ž€C€| ¦| xN€!`8`ƒžBdH¸|~yA‚à€\Äóx8B\“ž <_€B4(€bH»m|{y@‚D<_8‰=?€B? b<_?˜‘i?œ€^8Bÿÿ/‚^@žÀH ``€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!cÛx8€8 Kÿ와[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``<_8‰=?€B? b<_?˜‘i?œH €^Ãóx€| ¦| xN€!`<;À8cÌKÿ÷e€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8!`Ãóx€»aÿì|¦N€ ``|¦½áÿ¼|xx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ŸP<ß<¿8Æ-L8¥¿l8áH9LH·ù/ƒAž €X?<ŸÃxƒ»1l8BX€]€„=È8B]HµA||y@‚<_8w=?€B= b<_=‘i=ƒ{1lH°~ &V1@<_;Ëx: ~€&V”@€B= }à&Uï@"H<_~£x~‘£x;Ëx€B= "<_8€:@:‘"=<_=Hä<_8€=?~/‹x€B= ;Ëx:b<_=‘i=H´<_8€;Ëx€B= "<_=<_‘"=HŒ~€&<_;Ëx:À: }à&€B= M~ &"Kÿÿ`8€H¸=|~y@‚tM<_8w~ &€B= »ëx;@:À: M€:@:~€&"<_}à&=<_‘"=€\8Bÿÿ/‚\@žäHÈ```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Kÿ!|sy@‚(<_8x=?€B= b<_=‘i=Kÿþ8`’aTH´‰|yy@‚(<_8z=?€B= b<_=‘i=KÿýÈ€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```€aT/ƒAž€Ø€ø 88AP89AX€H€¡L88TA<@Kÿ´Ñ/ƒÿÿ@¾h<_8|=?€B= b<_=‘i=;ËxHÐ<_8€=?€B= b<_=‘i=KÿÿØ``€—=¨#ËxH±ù-ƒ|zxA®ÿÀ€~ÿðHµÅ||y@¢\N<_8€; €B= "<_=<_‘"=:;Ëx:@: ,:À~€&}à&M~ &HÐ`€~ÿôHµ]-|vxAªüd€~ÿøHµI|uy~€&A¢ü€€~ÿüHµ5|ry~ &A¢ü¤€~Hµ!|py}à&A¢üÀ8`H±Í.|}xA²ü¬“ƒ ’Ã’£’C’8`H±¥||y@¢,<_8€=?€B= b<_=‘i=Kÿÿ(`“¼ CÓx„ãxH´å|}yA¢üp€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€P;{;Þ›AœþKÿýl~c›x>Ëx;ËxKÿŒm€Y8BYHœ€\ƒãx€| ¦| xN€!@Ž; .HD; .€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!~˜ A‚<€U8Bÿÿ/‚U@ž(€U~£«x€| ¦| xN€!```~8 A‚<€R8Bÿÿ/‚R@ž(€R~C“x€| ¦| xN€!```}ø A‚<€P8Bÿÿ/‚P@ž(€P~ƒx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cÉœKÿïu€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€X8Bÿÿ/‚X@ž@€XÃx€| ¦| xN€!H$€P/€@ûH;`;Áh>ÿKÿûØ`8!`°Ãóxa€¹áÿ¼|¦}r }q }p N€ ``|¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8Æ%88¥·L8á89Kx8BIHd€]£ëx€| ¦| xN€!Ø A‚4€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<;À8c¾°Kÿä¥!@/‰Až8€I8Bÿÿ/‚I@ž$€a@€C€| ¦| xN€!``€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!!Œ/‰Až8€I8Bÿÿ/‚I@ž$€aŒ€C€| ¦| xN€!``!/‰Až<€I8Bÿÿ/‚I@ž(€a€C€| ¦| xN€!H `;À8!pÃóx€»Aÿè|¦N€ `|¦¿¡ÿô|~xBŸ|ƒ#x|¤+xè¦; ”!ÿ <_<ß<¿€B-l8Æô8¥¶Ô8á8A8H¤y/ƒAž€€^a88B^+9)‘+€a8H¢M/ƒ@œT<_8V=?€B)b<_)ˆ‘i)Œ<; 8c¶ØKÿâµ€^8Bÿÿ/‚^@žàH¼``AžP€~€ž8¾ 8ÞKÿš-,@‚t<_8W=?€B)b<_)ˆ‘i)ŒKÿÿ```€~€ž8¾ 8ÞKÿž±,@‚(<_8Y=?€B)b<_)ˆ‘i)ŒKÿÿD~=?)ð}=Kx€I8BIKÿÿ4€^Ãóx€| ¦| xN€!``€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!`£ëx€»¡ÿô|¦N€ ``|¦¿Aÿè|œ#x|@&BŸ8€|½+xè¦A”!ÿ€€˜| ¦| xN€!|{yA‚ð<_=_“<“¡8=J+p;Â88aÐ WÞ€><_86; €B'œ"<_'”<_‘"'˜€\8Bÿÿ/‚\@žtHX```€L8@/€A8@AL€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€L/€Ažh€a@H£/ƒ@ž<_¼ëx87€B'œ"Kÿÿ <Ÿ8„òHš‘0Cÿÿ||~x/€LAžh€{ÄóxKÿt},@‚<_¼ëx89€B'œ"Kÿþ¼{ÃóxH›€1 ÿÿ|I/‚ALAžÌ<ŸcÛx€„)ÄHœ¹||y@‚<_¼ëx8<€B'œ"Kÿþh8`H1.|}xA’€¡Hƒãx¤ëxHŸ•|~y@‚,<_8<=?€B'œb<_'”‘i'˜Kÿþt`€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@žÜ€^Ãóx;À€| ¦| xN€!ƒšüHÄ<€@€c*PH Å||y@‚<_¼ëx8>€B'œ"KÿýT€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`H›ñ|}yA‚¼€\¤ëx8B\“ <_€BL€bHŸE|~y@‚(<_8?=?€B'œb<_'”‘i'˜H¸€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!Ãóx8€8 KÿЀ^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<_8?=?€B'œb<_'”‘i'˜H\€\ƒãx€| ¦| xN€!@’ ƒšüH8ƒšü€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<;Àÿÿ8cµKÿÛ%Hƒšü;À`!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!! €bH”Ù||y@‚@<_8™=?€B b<_˜‘iœ€^8Bÿÿ/‚^@žÐH´`€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!ƒãx8€8 KÿÆ €\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<_8™=?€B b<_˜‘iœH<`=?) €I}>Kx8BIH8€^Ãóx€| ¦| xN€!<;À8c¦üKÿÐÁ```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8!PÃóx€»ÿð|¦N€ ``|¦½áÿ¼|xx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!Ÿ@<ß<¿8Æ8¥˜ì8áX9\H‘y/ƒAžà€X?<ŸÃxƒ» ì8BX€]€„H8B]HŽÁ||y@‚8<_8†=?€BŒb<_„‘iˆƒ{ ìHð~ &V1@<_;Ëx: ~€&V”@€BŒ}à&Uï@"H<_~£x~‘£x;Ëx€BŒ"<_8’:@:‘"ˆ<_„H<_8“=?~/‹x€BŒ;Ëx:b<_„‘iˆHÔ<_;Ëx8“€BŒ"H<_;Ëx8’€BŒ"<_„<_‘"ˆH”~€&<_;Ëx:À: }à&€BŒM~ &"KÿÿH``8€H‘|~y@‚tM<_8†~ &€BŒ»ëx;@:À: M€:@:~€&"<_}à&„<_‘"ˆ€\8Bÿÿ/‚\@žHè```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Kÿh|sy@‚(<_8‡=?€BŒb<_„‘iˆKÿýà8`’adHé|yy@‚(<_8‰=?€BŒb<_„‘iˆKÿý¨€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```€ad/ƒAž°€X€X€¡\€€Â9B€â"8€ <8hb,D8`8@L8dAH‘a@PKÿ’/ƒÿÿ@¾d<_8‹=?€BŒb<_„‘iˆ;ËxHÌ<_8’=?€BŒb<_„‘iˆKÿÿØ`€—(#ËxH‹9-ƒ|zxA®ÿÄ€~ÿðH||y@¢\N<_8’; €BŒ"<_„<_‘"ˆ:;Ëx:@: ,:À~€&}à&M~ &HÐ`€~ÿôHŽ-|vxAªü$€~ÿøHމ|uy~€&A¢ü@€~ÿüHŽu|ry~ &A¢üd€~HŽa|py}à&A¢ü€8`H‹ .|}xA²ü„“ƒ ’Ã’£’C’8`HŠå||y@¢,<_8’=?€BŒb<_„‘iˆKÿÿ(`“¼ CÓx„ãxHŽ%|}yA¢üH€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€`;{;Þ›AœþKÿýL~c›x>Ëx;ËxKÿe­€Y8BYHœ€\ƒãx€| ¦| xN€!@Ž; .HD; .€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!~˜ A‚<€U8Bÿÿ/‚U@ž(€U~£«x€| ¦| xN€!```~8 A‚<€R8Bÿÿ/‚R@ž(€R~C“x€| ¦| xN€!```}ø A‚<€P8Bÿÿ/‚P@ž(€P~ƒx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8c¥Kÿȵ€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€X8Bÿÿ/‚X@ž@€XÃx€| ¦| xN€!H$€`/€@û(;`;Áx>ÿKÿûØ`8!`ÀÃóxa€¹áÿ¼|¦}r }q }p N€ ``|¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8ÆþÀ8¥Œ8á89a89)‘>€K8BK€a8H‰q/ƒ@žX<_<8z=?€B ð8c™ä; b<_ è‘i ìKÿÄ€^8Bÿÿ/‚^@ždHD```8<8 Kÿf9,A‚ÿœ~=?)ÿP}=Kx€I8BIKÿÿ¬€^Ãóx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!`£ëx€»¡ÿô|¦N€ ``|¦¿aÿì|œ#x|@&BŸ8€|½+xè¦A”!ÿ€˜| ¦| xN€!|~yA‚€=?<_<¿<ß) p€B tƒãx¤ëx8¥–ø8Æú$8á89<‘!8Aÿ=Œ€Bùè?i€b„‘wˆH}õ/ƒ@žl•ãx!8/‰@žüH$`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z€a8•ãx^Óx“¡88BZH„<8c”ÜKÿ¾98a88<8¡@Kÿº /ƒ@œ€]Œ•ãx;À8"HØ€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!“Á8€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!;À€A@“Á<"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!<ŸcÛx“Á@€„hH|9,a8@‚(N€]Œ•ãx;À8 "„‘7ˆKÿþ„€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!ƒa8;À“Á8cÛxHÉ/ƒÿÿ@ž€]Œ•ãx8¡"Kÿÿœ:<€€I0|€@T€ ßH8>ß}#Kx€–H{m,aƒ9)‘>@žƒ¾H````Hyq/ƒÿÿAž>|}xH<<_<=?8–€Bû8cФ; ÿÿb<_û‘iû Kÿ´M>`8 ÿÿ/€@ž€^Ãóx€| ¦| xN€!8!P£ëx€»¡ÿô|¦N€ |@&|¦¿ÿà8À|{x8àBŸ9 8è¦A”!ÿ<_;Âù¼Œ¡8aŒ8D8<@Åóx98Kÿ«M/ƒAœ´€aŒ€<¿Æóx8¥{˜HtÝ/ƒ@ž´!Œ/‰Až8€I8Bÿÿ/‚I@ž$€aŒ€C€| ¦| xN€!``!/‰Až8€I8Bÿÿ/‚I@ž$€a€C€| ¦| xN€!``!8/‰Až€I8Bÿÿ/‚I@žô€a8;ÀHÌ`€[?Ÿƒ¼î„8B[=9)‘=€{@Hw}/ƒÿÿ@ž4?ß???_8]>ú$€I!<ú/‰Yú @žØHHu!/ƒa €bHn%|}y@‚TM€<_8MNšãx; €BòÔ:À˜ãx"<_òÌ<_‘"òЀ^8Bÿÿ/‚^@ž H|€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!£ëx8€8 KÿŸA€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<_šãx˜ãx8M€BòÔ"H@`HgÁ“»4<Ÿ€{8€„õØHn­|yy@‚4<_šãx˜ãx8P€BòÔ"<_òÌ<_‘"òÐH(`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<8€€cò8Hlµ|zy@‚<<_8Q:Ëx˜ãx€BòÔ"<_òÌ<_‘"òÐH°```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€\Óx/€@Ä<ŸCÓx€„ó€Hh|~y@‚<<_8S=?:Ëx€BòÔ~ø»xb<_òÌ‘iòÐH ```€{Hk.|}x@’0M<_:Ëx~ø»x:À€BòÔ"H˜```8`Hh-ƒ|vx@Ž0<_8S=?:Ëx€BòÔ~ø»xb<_òÌ‘iòÐKÿý„€YÃóx~ijx8BY“¶“6 €¡8HjA|}y@‚8N<_:Ëx~ø»x; €BòÔ"<_8S‘"òÐ<_òÌKÿý$€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```<ŸCÓx€„õ€HfE|~y@‚0<_ƒç48T=?:Ëx€BòÔb<_òÌ‘iòÐH`8`Hf©-ƒ|vx@ŽN <_ƒç4€BòÔH@€[8Ãóx~ijx"9)‘"€8 Hiå|}y@‚0N<_ƒç4€BòÔ":Ëx<_; 8T‘"òÐKÿþ¤€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<ŸCÓx€„ó Hdý|~y@‚0<_ƒç48U=?:Ëx€BòÔb<_òÌ‘iòÐH8€Hhá|}y@‚8M€<_ƒç4:ËxN; :À€BòÔ8U"<_‘"òÐKÿý˜€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<8€€cô˜Kÿ£m|wy@‚0<_ƒç48V=?:Ëx€BòÔb<_òÌ‘iòÐH8€xç4€C8Bÿÿ/‚C@ž€C€| ¦| xN€!<Ÿ~ã»x€„ôðHc­|~y@‚0<_8W=?:Ëx€BòÔ~ø»xb<_òÌ‘iòÐHÈ8`Hd-ƒ|vx@Ž N H,€YÃóx~ijx8BY“6 Hga|}y@‚0N<_:Ëx~ø»x; €BòÔ8W"<_‘"òÐH$€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`Hc!|~y@‚0<_8X=?:Ëx€BòÔ~ø»xb<_òÌ‘iòÐHœ;8<Äóx€I8BI€8 €còDHfE|}y@‚@M€<_:ËxN~ø»x; €BòÔ:À8X"<_‘"òÐ<_òÌKÿø €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€[,"9)ÿÿ/‰‘"@ž€{,€C€| ¦| xN€!“»,€{HeY,A‚:Ëx~ø»x|~xHÀ<_8Y=?:Ëx€BòÔ~ø»xb<_òÌ‘iòÐH„€^Ãóx€| ¦| xN€!``A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<;À8c‚àKÿ¡Å!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`!œ/‰Až8€I8Bÿÿ/‚I@ž$€aœ€C€| ¦| xN€!``! /‰AžH€I8Bÿÿ/‚I@ž4€a €C€| ¦| xN€!H`;À```8!€Ãóxa€ºÁÿØ|¦}q }p N€ ```|¦¿Aÿè||xBŸ|ƒ#x|¤+xè¦;À”!ÿ <ß<¿8ÆåÐ8¥g¤Ha)/ƒAž?_€|,€\ƒzÚ8BƒØ\Až8<Ÿ€„æüH^u|~y@‚,<_8@=?€Bæ0b<_æ(‘iæ,Hx`8€Hb]|}y@‚D<_8@=?€Bæ0b<_æ(‘iæ,€^8Bÿÿ/‚^@ž0H``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€[8B[<,€I8Bÿÿ/‚I@ž €|,€C€| ¦| xN€!`“|,ƒzÚ€|0ƒØAž$<Ÿ€„æüH]5|~y@‚,<_8C=?€Bæ0b<_æ(‘iæ,H8`8€Ha|}y@‚4<_8C=?€Bæ0b<_æ(‘iæ,KÿþÀ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€[8B[<0€I8Bÿÿ/‚I@ž €|0€C€| ¦| xN€!`“|0€|4/ƒAžHZ±84:Ú€I}>Kx8BIH0€^Ãóx€| ¦| xN€!`<;À8cvhKÿœå€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€»Aÿè|¦N€ ``|¦¿ÿð|}xBŸ|ƒ#x|¤+xè¦;À”!ÿ°<ß<¿8Æâd8¥d4H]¹/ƒAžÀ€]8`8B]H[½|~y@‚4<_8;=?€BâÀb<_⸑iâ¼H@```=8=<Äóx€I8BI€8 +ä´€I8BIkä´‘~€câ0H^Á||y@‚H<_8;=?€BâÀb<_⸑iâ¼€^8Bÿÿ/‚^@ž´H```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€],"9)ÿÿ/‰‘"@ž€},€C€| ¦| xN€!“,=?)× }>Kx€I8BIH4€^Ãóx€| ¦| xN€!``<;À8cs KÿšÅ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8!PÃóx€»ÿð|¦N€ ``|¦¿¡ÿô|}xBŸ|ƒ#x|¤+xè¦;À”!ÿ°<ß<¿8ÆàH8¥bH[™/ƒAž`€€]/„8B]A88`H\Ñ,@‚È<_8G=?€Bà b<_à˜‘iàœHÌ<߀}8 €ÆÔøHW1€/€A9€8`H`| ¦9`ÿÿ8 9€8À8€``€ý|G2€‹@ž0^}'R€ /€@œŒ€ /€Aœ€```/‹AœTŒð@œD>}g"|GJ|H.B" |!.‘K‘+‘ €" ‘+€ý9Œ8„|G2|¾+xbH<``€B€ ‚@$I€]}"2|BR€ ``8¥8ÆBÿ8lž`@L=^L}i| .|IR €ë€Ë | Q.‘â € +‘"`}H[ ,A‚ |~xH<<_8Z=?€Bà b<_à˜‘iàœ<;À8cq,Kÿ˜ ``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8!PÃóx€»¡ÿô|¦N€ ``|@&|¦¿ÿà8€|}xBŸè¦A”!ÿ €C#8BC€ | ¦| xN€!,A€ôÀ]|bð.HZ||y@‚,<_8d=?€BÝØb<_ÝБiÝÔHè`€]|^€bHYÕ.|{x@’XM<_8dM;@; À&WÞ€€BÝØ;"<_ÝÐ<_‘"ÝÔ€\8Bÿÿ/‚\@ž¨H€€]|^€bHYe-ƒ|zx@ŽHÀ&WÞ`<_8d; ;M €BÝØ"<_‘"ÝÔ<_ÝÐKÿÿ˜```€]|^€b HY-|yx@Š8À&WÞ@<_8e;€BÝØ"<_ÝÐ<_‘"ÝÔKÿÿ@`€]|^€bHXµ|xyÀ&@‚(<_8e=?€BÝØb<_ÝБiÝÔKÿþü8`HU=,@‚(<_8d=?€BÝØb<_ÝБiÝÔKÿþÈ|~x“ƒ “c“C“#“HD<_8€8 €BÒ\€bKÿŠ <_8g=?€BÝØb<_ÝБiÝÔHø€\ƒãx€| ¦| xN€!```A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!AŽ0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!AŠ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!Ø A‚<€X8Bÿÿ/‚X@ž(€XÃx€| ¦| xN€!```<;À8cn˜Kÿ”5€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!`Ãóxa€»ÿà|¦}r }q }p N€ ```|@&|¦¿Aÿè|š#x|{xBŸè¦A”!ÿ €C8BC€D8BD<Ÿ€c€„Ü$HRe|~y@‚,<_8£=?€BÙøb<_Ùð‘iÙôHh`8`HRÍ.|}x@’@<_8£=?€BÙøb<_Ùð‘iÙô€^8Bÿÿ/‚^@žìHÌ`€ZÃóx¤ëx8BZ“] HUé||yA‚ÿ¤€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[~Ûx8B[Hd€^Ãóx€| ¦| xN€!`A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cjìKÿ‘å€[8ÿÿ/€@ž €[cÛx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!8!`Ãóx€a»Aÿè|¦}p N€ `|¦¿ÿð|}xBŸè¦”!ÿ°<_€BËð#Tc‰8 Až(€I8BIƒÃT€CHp```€8/€Až8 |~x|xHD8`HP]|~yA‚Ü=?ÄóxiÛ$€K8BK<_€BËä)Û$‘> €bHS¥||y@‚<<_8ý=?€B×b<_׈‘i׌€^8Bÿÿ/‚^@ž¬H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!ƒãx8€8 Kÿ„Ù€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<_8ý=?€B×b<_׈‘i׌H€^Ãóx€| ¦| xN€!<;À8ch¤Kÿ±€]``8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!PÃóx€»ÿð|¦N€ |¦¿ÿà|zx|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8ÆÆ@8¥d|8á88HPy;À/ƒAžÜ€Za8?<ŸƒØÉì8BZ€K8BK>€„×à€a89)‘>HM­|{y@‚4<_8§Ýóx€BÕŒ"<_Õ„<_‘"ÕˆHÌ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`??CÓx€™ÖHM5|~y@‚<_}Ûx8¨€BÕŒ"H48`HM­.|}x@’@<_8¨=?€BÕŒb<_Õ„‘iÕˆ€^8Bÿÿ/‚^@žŒHd`€[Ãóx¤ëx8B[“} HPÉ||yA‚ÿ¤€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`CÓxdÛxHR)|~y@‚4<_}Ûx8©€BÕŒ"``<_Õ„<_‘"ÕˆH €™ÖHKÉ.|}x@’(<_8©=?€BÕŒb<_Õ„‘iÕˆKÿþ¼€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8`HL.|~xA’0!8£ëxÄóx€I8BI€8 HOU||y@‚(<_8©=?€BÕŒb<_Õ„‘iÕˆHÔ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8Éì}Ûx€I}>Kx8BIHÈ€^Ãóx€| ¦| xN€!```A’€;À.€]8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``A’@€^8Bÿÿ/‚^@ž,€^Ãóx}Ûx€| ¦| xN€!H``}Ûx```<;À8cfÈKÿŠÅ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!pÃóx€a»ÿà|¦}p N€ |¦¿aÿì||xBŸ|ƒ#x|¤+xè¦;`”!ÿ <ß<¿8ÆÏì8¥Q´HK9/ƒAž <<_ƒ¢Ä 9)‘<€]8B]€|4HLi|~y@‚@<_<8a=?€BÐ@8ca¤b<_Ð8‘iÐ9)ÿÿ/‰‘>@ž€^Ãóx€| ¦| xN€!‚ÝÐ HH?¿}ÑL€K8BK>9)ÿÿ/‰‘>@ž€^Ãóx€| ¦| xN€!‚ÝÑL8`H@é|~y@‚<_Ãx8W€Bδ"HÌ€\8B\“ž €X8BX“!8€I8BI€8€V8BV’ÞHD½.|wxA’8<Ÿ€¡<€„ÏðHB/ƒAœ <Äóx~å»x€cÎ,HBÅ|}y@‚<_Ãx8W€Bδ"H €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!€a<»ëxH?u/ƒa@@œ<_Ãx8X€Bδ"HtAžD€]8B]<€I8Bÿÿ/‚I@ž€|€C€| ¦| xN€!“|<Ÿƒãx€„ÏDH>}|~y@‚,<_Ãx8Z€Bδ"<_ά<_‘"ΰH¼8`H>å.|wxA’@€]Ãóx~ä»x8B]“· !8€I8BI€8HB%|zy@‚,<_Ãx8Z€Bδ"<_ά<_‘"ΰHä€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€]Ãx8B]H¼``<_/ž8O€Bδ"<_ά<_‘"ΰAžàƒZÃ:à¹ëx.VÓx`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`A’0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!<; 8c`8Kÿ}¥€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž<€a<€C€| ¦| xN€!H ¹ëx‚ÚÃ~Ú³xKÿþ```8!€£ëx€aºÁÿØ|¦}p N€ |¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8Ƴ8¥Q,8á88H=);À/ƒAž<;a8<ŸcÛx9)‘;€K8BK€„¸H:q|~y@‚(<_8=?€BÂKx8BIHh€^Ãóx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cSìKÿyå€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!pÃóx€a»aÿì|¦}p N€ |¦¿Aÿè||xBŸ|ƒ#x|¤+xè¦;À”!ÿ <ß<¿8Æ¿@8¥AH:‰/ƒAž0€@€\/€8B\Až88`H8|}yA‚ø=?¤ëxi°€K8BK<_€B³ä)°‘= €bH;É|~y@‚PÀ&<_8;`€B¿"<_¿ˆ<_‘"¿Œ`€]8Bÿÿ/‚]@žHð``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`Ãóx8€8 Kÿlå€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<_8=?€B¿b<_¿ˆ‘i¿ŒH°```8`H7M|}y@‚4<_8=?€B¿b<_¿ˆ‘i¿ŒHp```H;Q|{yÀ&A‚t<Ÿ€¼ €„ÁpH8•/ƒAœ\<Ÿ€¼cÛx€„ÁÐH8y/ƒAœ@<Ÿ€¼TcÛx€„À¼H8]/ƒAœ$<¤ëxeÛx€c´8H9!|zy@‚,`<_8=?€B¿b<_¿ˆ‘i¿ŒKÿþ`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€[^Óx8Bÿÿ/‚[@žŒ€[cÛx€| ¦| xN€!Hp€]£ëx€| ¦| xN€!`Ø A‚<€[8Bÿÿ/‚[@ž(€[cÛx€| ¦| xN€!```<;À8cQdKÿv%€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€»Aÿè|¦N€ ``|¦¿ÿà||x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ <ß<¿8Æ»°8¥=pH6ñ/ƒAž˜<<_<8€ƒÂ°\9)‘<€^€c¼À8B^Kÿs‰|}y@‚0<_8 Ýóx€B»ü"<_»ô<_‘"»øHÈ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<Ÿ£ëx€„¼ H3Å|{y@‚,<_8€B»ü"<_»ô<_‘"»øHX`<Ÿƒãx€„¼lH3…|yyÀ&@‚XM€<_8N;@;€B»ü"<_»ô<_‘"»ø€[8Bÿÿ/‚[@žTH4```<Ÿƒãx€„¼pH3.|zx@’8M<_8;€B»ü"<_»ô<_‘"»øKÿÿ˜``8€H6í-ƒ|xxAŽD€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!8`H3-.|zx@’(<_8=?€B»üb<_»ô‘i»øKÿÿ“# “8`H2í,@‚8M€<_8À&€B»ü; ;"<_‘"»ø<_»ôKÿþÌ|~x“c “CHЀ[cÛx€| ¦| xN€!`Ø A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```A’0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!AŽ0€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!<;À8cMôKÿrU€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóxa€»ÿà|¦}q }p N€ ```|¦¿Áÿø|~xBŸ8 è¦”!ÿ°<_<Ÿ€B¬h#9)‘#€b€„» €bH3y|}y@‚@<_8x=?€B·0b<_·(‘i·,€^8Bÿÿ/‚^@ž¼Hœ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëx8€8 Kÿd¥€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<_8x=?€B·0b<_·(‘i·,H €^Ãóx€| ¦| xN€!`<8cIlKÿoy€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€\8Bÿÿ/‚\@ž@€\ƒãx€| ¦| xN€!H$=?€C<Ÿ)«¨8„I”€¢ €iH,å8!`8`ÿÿ€»Aÿè|¦N€ ``|¦½¡ÿ´|zx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿp<ß<¿8Æ´„8¥6@H/Á/ƒAžH,<_88=Ëx€B´Ì"<_´Ä<_‘"´ÈH|:<_8`ƒÂ©,9)‘:€^8B^H.e|yy@‚,<_86Ýóx€B´Ì"<_´Ä<_‘"´ÈH$€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`‚ú/—@x;>¿=ß>?=¿;€```€•µh#ËxH,I|{yA¢ÿ€Z(|bà.H0.|}x@²h~&V€€Q´Ì;À:À:`9àM:€M~@&VR€€8@8’8M´Ä´È€[8Bÿÿ/‚[@žHä``€Z(|Bâ€bH/•-ƒ|~x@®8~@&VR`€Q´Ì:À:`9à:€M ~&V`’A8€H¼€Z(|Bâ€bH/E-|vx@ª8~&V@€Q´Ì:`9à:€~@&VR@€’8Ht``€Z(|Bâ€b H.õ|sy~@&@¢8~&’A8€Q´Ì9à:€€8@9M´Ä´ÈKÿÿ```€Z(|Bâ€bH.¥|oy~&@¢(’8€Q´Ì:€€8@9M´Ä´ÈKÿþ¸`8`H+-|ty|&8@¢€Q´Ì€8@8M´Ä´ÈKÿþ„“´ “Ô8`’Ô’t‘ôH*é.|}x@²Ëx=Ëx8BYHl€[cÛx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!~X A‚8€S8Bÿÿ/‚S@ž$€S~c›x=Ëx€| ¦| xN€!H=Ëx~ A‚0€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!€8| A‚4€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`<;À8cGXKÿh¥€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`8!Ãóxa€¹¡ÿ´|¦}r }q }p N€ ``|@&|¦½¡ÿ´8À|wx8àBŸ9 8è¦A”!ÿ`<_=;Ÿk²˜¼¡À8a¼8À<‘a8Åóx9€„¯D9)‘>H%u|}y@‚ì<_8ÙóxÜóx€B®4Ûóx"<_®,<_‘"®0ú¢”}ú{xHÄ: <_~|›x~›£x,€B®4~Ú³x: :8 } &"<_M€}À&‘"®0HH} &U­`<_~|›x~›£x~Ú³xM €B®4:@}À&UÎ`"<_:: 8 ‘"®0<_®,H}À&UÎ@<_~|›x~›£x~Ú³x} &U­@€B®4"Kÿÿ¸} &U­`<_~|›x~›£x~Ú³xM €B®4:@:}À&UÎ`: 8 "<_‘"®0Kÿÿ„}À&UÎ@<_~|›x~›£x~Ú³x} &U­@€B®4:: 8 "<_‘"®0KÿÿD<_}®kx~|›x~›£x€B®4~Ú³x: 8 "<_‘"®0Kÿÿ=?<_~|›x~›£x)®4~Ú³x€ 9  ®0<_‘"®,H|``8`H$.|xx@’€M<_8}À&U΀€B®4ÙóxÜóxÛóxÚóxM: :@} &U­€"<_:: Ïóx®,<_‘"®0€]8Bÿÿ/‚]@ž €H X``€¡<£ëxÃxH&|yy@‚\M<_8}À&€B®4ÙóxÜóxÛóxÚóxM€: :@} &"<_:: Ïóx‘"®0<_®,Kÿÿt€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<_<Ÿ€a<ƒ¢¢ð€„°˜¥ëxH"ù/ƒ@œ <_ÜóxÛóx8€B®4bHD<Ÿ€a<¥ëx€„¯TH"Á/ƒ@œ<<_ÜóxÛóx8€B®4b```<_=?®,‘i®0Kÿü$<Ÿ~ã»x€„¯HH!Q|}y@‚ <_ÜóxÛóx8€B®4bKÿÿ¼8`H!Å.|xx@’HM<_Üóx}À&U΀€B®4ÛóxÚóx: :@M:: } &U­€"Hð€Y8BY“# H%¡-ƒ|ux@Ž} &U­`<_Üóx€B®4H<Ÿ€¡8€„¯°H"Í/ƒAœ€<~£«xH'y/ƒ@œ<: <_ÜóxÛóx,€B®4Úóx:@:} &"M}À&HT£ëxÃx~¥«xH#I|sy@‚X} &<_Üóx€B®4U­À>}² U­@>"›ãxšãx}®kx:@:: <_8OÓx‘"®0<_®,Kÿü¼€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!ƒÚ¢”€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8`H ‘|ty@‚0<_8~|›xÛóx€B®4"<_‘"®0<_®,Kÿù €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!~c›xHI.|xxA’Úóx:: ÏóxHH<_8~|›x~›£x€B®4"<_‘"®0<_®,Kÿù ``Ïóx:: ~Ú³xÃxH"|vyÀ&@¢pH­/ƒAž8WÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>8€B®4Îóx: :@:: Íóx"<_®,<_‘"®0~›£x~|›xHL`€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!?Ÿ~óx€œ°¨H‰-|rx@ª,}À&UÎ@<_Mˆ€B®4} &U­@H0``€w H!-|}y@¢4} &<_M€€B®4}À&"~Ú³x<_: 8 ‘"®0H„;Á@~C“x¤ëxÅóxH!A/ƒA¼÷È€@ @|@€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€@/€Ažd<Ÿ~óx€„°°Hu-ƒ|ux@®H} &U­`<_~Ú³x:@8 M €B®4}À&UÎ`"<_‘"®0H ```€wHý-|rxAŠÅóx~£«x~D“xH A/ƒ@¼8<_,8 ~Ú³x€B®4}À&"<_} &‘"®0<_®,Kÿýô€@ @|@€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!€@/€Až0<Ÿ~ƒ£x€„®ÐHA|}y@¢HM<_~Ú³x}À&€B®4: :@8 M€} &"<_‘"®0Hp```8`H-ƒ|uxA®õô€W£ëx~¤«x8BW’õ Hå-|rxAªö€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€R8Bÿÿ/‚R@žü€R~C“x€| ¦| xN€!Kÿûì```€œ°¨~óxH|}y@¢@M<_~Ú³x}À&€B®4: :@8 M€} &"<_‘"®0HH`<Ÿ~óx€„°°HÅ-ƒ|uxA®õH€wH‘-|rxAªõ|€w$H}|py} &A¢õ¨8`H)|qy}À&A¢õÄ70<~$‹x€I8BI€0“±’±’Q’ 78€I8BI€8 €c­ HM|~y@¢DM<_~Ú³xM€: :@} &€B®4:8 "<_‘"®0H\``€Q8Bÿÿ/‚Q@ž€Q~#‹x€| ¦| xN€!€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!<Ÿ~ƒ£x€„®ÐH}-ƒ|ux@®P} &U­`<_~Ú³xÏóx:@M €B®4:: }À&UÎ`8"<_‘"®0Hœ``8`H½-|rx@ª0}À&UÎ@<_~Ú³xÏóx:} &U­@€B®4"HD€^~£«x~D“x8B^“Ò Hé|py} &@¢<}À&<_~Ú³xÏóx€B®4"<_: 8‘"®0<_®,Kÿù¸`€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!€P8Bÿÿ/‚P@žøÈ€P~ƒxÏóx:: €| ¦| xN€!Kÿø¬€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€T~ž£x~|›x~›£x8BTHH€]£ëx€| ¦| xN€!```A’0€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!AŽ0€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!AŠ0€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!}¸ A‚<€P8Bÿÿ/‚P@ž(€P~ƒx€| ¦| xN€!```}Ø A‚<€Q8Bÿÿ/‚Q@ž(€Q~#‹x€| ¦| xN€!```<;À8c@ôKÿV…!9)ÿÿ/‰‘>@ž €^Ãóx€| ¦| xN€!`€Y08`‚Â?=ß>=¿9à¾:à```€v€‘›¤H™|~yA‚¤€Y,|Bº€bHa.|}x@²4M€Pšl;€€‘íšdšh€^8Bÿÿ/‚^@žôHØ8`HÝ-ƒ||xAŽ “£ „ãxÃóxHA.|}x@²€PšlKÿÿ¨``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`£ëxH.Aœ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`@’@9€Y,#Ëx~ijx€ |W€â€¢€Â | ¦| xN€!|zyA‚T€S8Bÿÿ/‚S@ž$€S~c›x€| ¦| xN€!``#ËxDÓxH |{yA‚4€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!<ŸÃx€„›H¥.|}xA’<ŸcÛx€„œÔH‰|~yA‚´8`H-ƒ||x@®,€PšlSÓxrÛx€8@ÇMšdšhKÿýô``“à 8`€Z8BZ“\€[8B[“|H¹|~yA‚x“ž £ëxÄóxH!||y@¢8M€€PšlSÓxrÛx;€€8@ÇMšdšhKÿýx```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\AžSÓxrÛxH$€\ƒãxSÓxrÛx€| ¦| xN€!:µ:÷”¨@žüt€XÃxÃx8BXHÌ<_;€8¾=?€Bšl-œb<_šd‘išhH€M€<_8ÇSÓxrÛx€Bšl;€"<_‘"šh<_šdHL<_8Ç=?SÓx€BšlrÛxb<_šd‘išhH €^Ãóx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽÔ€\8Bÿÿ/‚\@žÀ€\ƒãxÃx€| ¦| xN€!H°<_Ãx8¾€Bšl"H<_Ãx8€Bšl"<_šd<_‘"šhHp<_8Æ=?Ãx€BšlSÓxb<_šd‘išhHD<_8ÇÃxSÓx€BšlrÛx"<_‘"šh<_šdHÃx```<;À8c-PKÿMU€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!Ãóxa€¹¡ÿ´|¦}q }p N€ ```|¦¿!ÿä|{x|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8ƃ48¥!L8á88H I;À/ƒAžl;a8<_€b†¼9)‘;€K8BK#9)‘#{0K<€J8BJ#9)ÿÿ/‰‘#@ž$€C€| ¦| xN€!```€[0<Ÿ€„“\ƒB<€zH -|~y@‚4<_8¯=?€B’\b<_’T‘i’XH```8`H .|}x@’@<_8¯=?€B’\b<_’T‘i’X€^8Bÿÿ/‚^@žÅ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!PÃóx€»ÿð|¦N€ ```|¦¿ÿð||xBŸ|ƒ#x|¤+xè¦;À”!ÿ°<ß<¿8Æ„d8¥Hÿ™/ƒAžЀ\<Ÿƒãx8B\€„…àHüõ|~y@‚,<_8·=?€B„ b<_„˜‘i„œHH`8€HÝ|}y@‚D<_8·=?€B„ b<_„˜‘i„œ€^8Bÿÿ/‚^@žHÀ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxHûÝ|`y@‚D<_8·=?€B„ b<_„˜‘i„œ€]8Bÿÿ/‚]@ž€H\``€]|x8Bÿÿ/‚]@žl€]£ëx€| ¦| xN€!HP€^Ãóx€| ¦| xN€!H$€]£ëx€| ¦| xN€!``<;À8cTKÿ<•€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!PÃóx€»ÿð|¦N€ ``|¦¾áÿÜ|wx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8Æ‚48¥àHýa/ƒAžX€W?Ÿ8`ƒÜvÌ8BW>9)‘>Hü1|xy@‚8<_8²Ýóx€B‚l"<_‚d<_‘"‚hƒ\vÌHT``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`~ã»xHùÝ|yyA‚ ÚóxH0<_8³Ãx€B‚l"<_‚d<_‘"‚hKÿÿ„ºëx#ËxHþY|}yÀ&@¢lHùi/ƒAžÀWÞ€>Ð WÞ€><_8³;€€B‚l;À;`MM"<_‚d<_‘"‚h€Y8Bÿÿ/‚Y@žÈH¬`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`<ŸÃx€„ƒHùE-ƒ||x@®HM <_8´N ºëx;À€B‚l;`"<_‘"‚h<_‚dKÿÿd```<Ÿ£ëx€„„Høå.|~x@²(M<_ºëx;`€B‚lbHì``8€HüÍ-|{xAŠl€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8`Hù .|~xA’,€]8`8B]“~“¾ Høå-|{x@ª8<_8´ºëx€B‚l"<_‚d<_‘"‚hKÿþt```“à dÛxƒãxHü|~y@¢ €bH÷}|}y@‚D<_8°=?€B{ b<_{‘i{€^8Bÿÿ/‚^@žÀH ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëx8€8 Kÿ(¥€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<_8°=?€B{ b<_{‘i{H €^Ãóx€| ¦| xN€!`<8c\Kÿ3y€\8Bÿÿ/‚\@ž$€\ƒãx€| ¦| xN€!``€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`8`€»aÿì|¦N€ ```|@&|¦¾ÿÀ|zxBŸè¦A”!ÿ€<_ƒÂm|#9)‘#€^8B^# i0K<€J8BJ>9)ÿÿ/‰‘>@ž$€^Ãóx€| ¦| xN€!``€Z 8`"0‚‰X.€ |R~ÉPHîQ|yyA¢ýH<Ÿ~ƒ£x€„{dHî9-ƒ|xx@®<~&V`<_; N €ByM ~À&VÖ`"HT```: €I(|Bò€bHñÁ.|}x@²D<_,8•€By~&"<_M~À&‘"y<_yKÿýø```~óxHñm-|ux@ª <_,€By~À&b~&Ht8vHñ=|qy~&@¢@<_/’8•€By~À&VÖà"<_y<_‘"yKÿýx```8`Hí­|ry~À&@¢0<_€Byb8•<_=?y‘iyKÿý4``“² ’²Ãx~D“x’2HðÝ.|}x@²0~&V€<_: : M€By"Hà``€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!8`HìÅ-|ux@ª(~À&VÖ@<_Mˆ€By~&V@"H<“£ ~¤«x#ËxHð|}y@¢LM€<_; ~À&€ByN~&";: :@<_8•‘"y<_yKÿûð`€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€]8Bÿÿ/‚]@ž8€]£ëx;: : :@€| ¦| xN€!H``;: : :@;œ|¸P;Þ€à@žú`~c›xHêi,A‚~~›x|}xH´<_8–;€By"<_y<_‘"yKÿú|<_:@8“: €By-: ;~À&VÖ@"<_Mˆ~&V@‘"y<_yH €Y#Ëx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!AŠ0€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!~ A‚@€Q8Bÿÿ/‚Q@ž,€Q~#‹x~~›x€| ¦| xN€!H``~~›x~Ø A‚0€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!<; 8c €Kÿ*-``€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!8!€£ëxa€ºÿÀ|¦}r }q }p N€ ```|¦¿¡ÿô|~xBŸè¦8”!ÿ ``€C88BCH`/ƒ@|€^Ãóx88€| ¦| xN€!/ƒÿþ@žÿØ<_<8$=?€Bo8c; ÿÿb<_oˆ‘ioŒKÿ(É`€^8Bÿÿ/‚^@ž0H``ƒ¾KÿÿÜ€^Ãóx€| ¦| xN€!8!`£ëx€»¡ÿô|¦N€ ``|¦¿!ÿä|~x|@&BŸ|™#x; ÿÿè¦A”!ÿ€€ €C/€8BCAž00Dÿÿ|!.A’@€„/„Aœ4€„@œ(€C€ | ¦| xN€!|zxH``;@<_>,€Bbì‰Ažœ€I€~ ;ž;~ €ž €¾$€€Â9B€â"8~ƒ¾(|Zb ºèP‘a0€I8Bÿÿ/‚I@ž €~0€C€| ¦| xN€!`€00},H},‹H@ž<Ÿ£ëx€„kÄHâY|zy@‚0<_8Æ=?€BjÐb<_jÈ‘ijÌH@``8€Hæ=|{y@‚D<_8Æ=?€BjÐb<_jÈ‘ijÌ€Z8Bÿÿ/‚Z@žôHØ``€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!},H},```€K8BK>,€I8Bÿÿ/‚I@ž €~,€C€| ¦| xN€!`€,,€~;`~ Kþ¾=H8€ZCÓx€| ¦| xN€!<;`ÿþ8cÿ¼Kÿ"```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!`cÛx€»Aÿè|¦N€ ```|¦¿¡ÿô|}xBŸè¦”!ÿ€c`€]`=ƒ9)‘=Aœl€} /ƒAžð€]`$€`9} 8€½` 9]"€Â€â 8]`8‘a@A €bHâM|}y@‚<<_8h=?€Beìb<_eä‘ieè€^8Bÿÿ/‚^@ž0H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!£ëx8€8 Kÿ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<_8h=?€Beìb<_eä‘ieèH ```/†@ž HH`€I/‚Aœ€I€‚@H€|BЂ@\9)BÿÈ`}~[x|æ;x}d[x8 Kþ¼ÑžAžt8`HÝ|~yA‚Ø=?Äóxihü€K8BK<_€BZœ)hü‘> €bHàÉ|}y@‚0<_8r=?€Beìb<_eä‘ieèKÿþ|``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëx8€8 Kÿ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<_8r=?€Beìb<_eä‘ieèH €^Ãóx€| ¦| xN€!`8<8¡@8a8HÜõ<8cû4Hà)€<€¡@|~x€a8Hß/ž@ž <_ƒÂZLÃóx;ÀHâÙ€\8Bÿÿ/‚\@žD€\ƒãx€| ¦| xN€!H(`/…@þ<|©¦|‰#xKÿýð```8!`Ãóx€»ÿð|¦N€ ``|¦¿¡ÿô|}xBŸè¦”!ÿ €€C#€9)‘#Aœ,€C€| ¦| xN€!/ƒÿþAž@=€€]€|xAœ;ÀÿÿH```8Hx`<_8+8<8¡@€BbP8a8"<_‘"bL<_bHHÛ…<8c÷ÄHÞ¹€<€¡@|~x€a8HÝ¥/ž@ž <_ƒÂV°Ãóx;ÀHái=8 ÿÿ/€@ž€]£ëx€| ¦| xN€!8!`Ãóx€»¡ÿô|¦N€ |¦¿ÿð/„BŸ||x|#x覔!ÿ €C€(8BÄPC¾@/…@€c„|ƒ"H×-/ÝóxAÀ€œ(€|T€02T„ 6|„PHÜI,@‚ 8`HÙÙ|~yA‚è=?ÄóxicØ€K8BK<_€BU\)cØ‘> €bHÝ!|}y@‚H<_8Ý=?€Bab<_a‘ia €^8Bÿÿ/‚^@žÔH¸```€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!£ëx8€8 KÿI€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<_8Ý=?€Bab<_a‘ia H8`€(Ýóx|T<(Hl€^Ãóx€| ¦| xN€!8<8¡@8a8HÙ%<8cö´HÜY€<€¡@|~x€a8HÛE/ž@ž <_ƒÂUpÃóx; Hß `€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!`£ëx€»ÿð|¦N€ ```|¦¿Aÿè||xBŸ|#x覔!ÿ?_€S„#9)‘#€D8BD@ž8`H×¥|~yA‚ä=?Äóxiap€K8BK<_€BRô)ap‘> €bHÚí|{y@‚D<_87=?€B^ b<_^˜‘i^œ€^8Bÿÿ/‚^@žHð``€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!cÛx8€8 Kÿ €[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<_87=?€B^ b<_^˜‘i^œHx`€„€(„@$„€cHØÙ,@‚8`HÖi|~yA‚È=?Äóxiah€K8BK<_€BRì)ah‘> €bHÙ±|{y@‚(<_8;=?€B^ b<_^˜‘i^œKÿþÄ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!cÛx8€8 Kÿ ù€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<_8;=?€B^ b<_^˜‘i^œHX`€|œ(`œ€½/…@„¥€|€HÒEHp€^Ãóx€| ¦| xN€!`8<8¡@8a8HÕµ<8côtHØé€<€¡@|~x€a8H×Õ/ž@ž ƒÚS`ÃóxHÛ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!p8`€»Aÿè|¦N€ ```|¦¿ÿð|ƒ#xBŸ|¤+x; è¦”!ÿ <ß<¿8ÆKà8¥ñ8á89<“¡<9!@9ADHÕé;À/ƒAžüa<=?€K8BKƒÉZlƒ¡€Ý <Ÿ<¿€BK,8„äT8¥Û¬€é €bHÌéKÿÿ0€|€C€| ¦| xN€!``€8;À!8€I 8Bÿÿ\Kÿÿ$€\ƒãx€| ¦| xN€!``€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!/ž@œ@€\8Bÿÿ/‚\@ž(€\ƒãx;€€| ¦| xN€!H `;€8!`ƒãx€»ÿð|¦N€ `|¦¿aÿì|#xBŸ8€|¾+x覔!ÿ€˜| ¦| xN€!||yA‚(<_<¿<ßÄóxƒbH`;À£ëx8¥âð8ÆDü8á8“|“Á8€[8B[Hι/ƒAž¨€\=?8B\a8€K8BKƒ©SlƒÁ8/@žp<_<Ÿ€BH8„á°€bHË)<_<8ª=?€BT8cêp;Àÿÿb<_Sø‘iSüKÿ Ù`€\8Bÿÿ/‚\@žàH¼``žØAž$€~Až¤ëxHÓ/ƒAž0ƒÁ8€^8B^<€I8Bÿÿ/‚I@žXH4<_>€Ý <Ÿ<¿€BHœ8„áÄ8¥Ù€é €bHÊYKÿÿ0€|€C€| ¦| xN€!``€8;ÀKÿÿ4€\ƒãx€| ¦| xN€!``€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!/ž@œ@€\8Bÿÿ/‚\@ž(€\ƒãx;€€| ¦| xN€!H `;€8!pƒãx€»aÿì|¦N€ `|¦¿aÿì|{xBŸ|œ#x覔!ÿ #9)‘#=?€D8BDƒÉQ/ž@¾,<_<Ÿ€BF8„ß0€bHÉHœ```<_€BEà„Až €džAžÄóxHÑA/ƒAž8<Ÿƒãx€„S$Hɉ|~yA‚p8€HÍ™|`y@‚ÀH€``<_<€Þ <Ÿ<¿€BF8„ßD8¥è €é €bHÈy<_8®=?€BQ€b<_Qx‘iQ|H´<_8¯=?€BQ€b<_Qx‘iQ|H<_8¯=?€BQ€b<_Qx‘iQ|€^8Bÿÿ/‚^@ž\H<`€^|x8Bÿÿ/‚^@žL€^Ãóx€| ¦| xN€!H0€^Ãóx€| ¦| xN€!`<; 8cè(Kÿ u€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!`£ëx€»aÿì|¦N€ ```|¦¿aÿì||xBŸ|ƒ#x|¤+xè¦8”!ÿ<_<ß<¿€BSä8Æ@$8¥ÛP8á89<8AKx8BIHL€^Ãóx€| ¦| xN€!H €]£ëx€| ¦| xN€!`<;À8cåüKÿÕ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!pÃóx€»aÿì|¦N€ ``|@&|¦¿ÿà|zx|˜#xBŸè¦A”!ÿ??ƒ™?¨€C8BC<9)‘<€cHÃU|{y@‚,<_8¶=?€BKHb<_K@‘iKDHÈ`cÛxHÇÝ.|}x@’PHÂí/ƒAž(<_8¶=?€BKHb<_K@‘iKD€[8Bÿÿ/‚[@žKx8BIHh€[cÛx€| ¦| xN€!A’<€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```<;À8cßxKþþ5€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!`Ãóx€a»!ÿä|¦}p N€ |¦¾¡ÿÔ|zx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆC¬8¥ÅPH¾Ñ/ƒAžˆ€Z??8`ƒy8<8BZ;9)‘;HÀ|~y@‚,<_8h|Ûx€BCÜ"<_CÔ<_‘"CØHŒ€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!Üóx>ÿ?>ß: jH``¼ëx€š(ƒãx8¡8H¿Ñ/ƒAœŒ€8Tþ/€8AžD<ŸCÓx€„ElH»e|~yA‚„8€H¿u.|}x@²8€XCÜ€’¶CÔCØ€^8Bÿÿ/‚^@žÀH```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<_ƒÂCT/ž@¾$<_<Ÿ€B8l8„ÑŒ€bH¹ýHl`€8<Až €}ƒðAžÄóxHÂ5/ƒAž€[8Bÿÿ/‚[@žhH@=?€]€Þ <Ÿ)8x8„ÚÜ€¢ €iH¹‘€XCÜ€’¶CÔCØ@’¬HÔ€[cÛx€| ¦| xN€!```€\»ëx8B\= €I8Bÿÿ/‚I@ž€} €C€| ¦| xN€!“› €z0H½©|~yA‚ ƒãxÄóxH¿U|}y@¢8CÜ8l€ICÔWCØKÿþ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@žý°€\ƒãx€| ¦| xN€!Kÿý”98<€I}>Kx8BIHÈ€^Ãóx€| ¦| xN€!Hœ<_8i=?€BCÜb<_CÔ‘iCØHx<_8j=?€BCÜb<_CÔ‘iCØHT<_8l=?€BCÜb<_CÔ‘iCØH0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cÛ8Kþùy€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`8!€Ãóx€aº¡ÿÔ|¦}p N€ |¦¾ÿÐ; BŸ†8|wxè¦|˜#x|Û3x”!ÿ€|ú;x|¹+x>߃–3P€C8BC“¡8“¡<“¡@€D8BD<9)‘<@œô|ƒ#x<Ÿ€„A8H·%|~y@‚, &<_›ãx;@8Q€B>ðbHô``#ËxHºÍ,a8@‚P &<_8Q;@€B>ð"<_>è<_‘">ì€^8Bÿÿ/‚^@žHL```cÛxHºm,að"<_>èKÿÿŒ8`H¶á|zy &A‚@€8ÃóxDÓx €Aðb<_>è‘i>ìKÿÿ €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!ƒa8“¡8HT€d<Ÿ€„?øHµ5,a<@‚8 &<_›ãx;@8S€B>ðb<_=?>è‘i>ìHÈ`#ËxH¸Í,a@A‚ÿ¼8`Hµy|~yA‚ÿ¬€@Äóx “¡@€að"<_>èKÿýÐ``€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!“¡<€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€\[Óx8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<Ÿ€w<€„?¨H³å/ƒa8@ž8>ß>¿>Ÿ8U6>ð€I!@>è/‰U>ì@žøH(`<ŸcÛx€„@ÌH³•/ƒa@Ažÿ´8`H´!/ƒaä“<¤ëxH±å|~y@‚< &<_¤ëx;@€B3l€bH³a€V>ð8V">è‘5>ìHx`H²€^|}x8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```,@‚ &;@H <8cÖlKþòe8a@888¡ð8V,">è &‘5>ìHØ€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!“@€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!“8€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!“<€[~Ûx8B[H<€^Ãóx€| ¦| xN€!ƒv3P``!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``!² W½@>ƒœ*=!¿~ƒx€•7dH—I.|}x@’HM=aŸdÛxk x‘c £ëx€T70"9)‘"€70H™é|ry@‚xM=a}² U­@>ƒœ*=!U­€>}° U­€>Kx8BIH€€^ÃóxH €]£ëx€| ¦| xN€!ƒœ*Ý/ƒ@œ€[Ä€8s"H t€¸è??<_ÿÿ==?;Ù‡˜8B^€9KÉh?Ÿ“©ÃðKÉh Ãóx‘\ĈH?é/ƒAœŒ€|Ĉ8€ƒ¾„H@Q|~yA‚t<Ÿ£ëxÅóx8„\ÌH:•€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ$;Ù‡˜€zÄp<Ÿ8„]ÅóxH>/ƒ@œ€[Ä€8"H ˜<_ÿÿ=_€¸è=???8BY 9jÉl“ÉÃø=?ÿþ;™†xJÉl<_ÿÿ9)I8BeÐ?¿‘+=?ÿÿƒãxK <_ÿÿ9)c`8Bb ‘+ =?ÿÿK<_ÿþ9)Uà8BIà‘+=?ÿÿK<_ÿþ9)Tà8BJà‘+K ‘}ÄŒH>­/ƒAœŒ€}ÄŒ8€ƒ¼„H?|~yA‚t<Ÿ£ëxÅóx8„\ÌH9Y€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ$;¹†x€zÄp<Ÿ8„]¥ëxH<Å/ƒ@œ€[Ä€8¥"H \<_ÿþ=_€¸è=???8BNÐ9jÉ“©Ãè=?ÿÿ;Ù~øJÉ<_9)y 8Bcp?Ÿ‘+ÃóxK ‘|ÄH=¹/ƒAœŒ€|Ä8€ƒ¾„H>!|~yA‚t<Ÿ£ëxÅóx8„\ÌH8e€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ$;¹~ø€zÄp<Ÿ8„](¥ëxH;Ñ/ƒ@œ€[Ä€8±"H h<_=€¸è??=?8Bk 9KÉœ;ÙnX“©Ãô?ŸKÉœ<_Ãóx8B…€J ‘\Ä”H<Ñ/ƒAœŒ€|Ä”8€ƒ¾„H=9|~yA‚t<Ÿ£ëxÅóx8„\ÌH7}€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ$;¹nX€zÄp<Ÿ8„]0¥ëxH:é/ƒ@œ€[Ä€8¼"H€ƒ˜¸è<_;Âlà<_“ž Ãóx“¢ÃìH</ƒAœ €zÄp<ŸÅóx8„]ÿ<_ÿþ==?;·jh8BMð8 ɤ??“ÉÃüKɤ“ £ëxĘH;¥/ƒAœ€yĘ8€ƒ½„H< |~yA‚x<Ÿ£ëxÅóx8„\ÌH6Q€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ(;·jh€zÄp<Ÿ;šÄp8„]P¥ëxH9¹/ƒ@œ€[Ä€8r"HP€¸è<_;Âi¨<_ Ãóx“¢ÄH:á/ƒAœ €zÄp<ŸÅóx8„]\H9e/ƒ@œ€[Ä€8T"Hü?¿<_8€€}ÆÔ“ÂÄKþt…|~y@‚``€[Ä€8"HÄ€ÆÔ€zÄpÅóxH8¥/ƒ@œ$€[Ä€8"<_Äx<_‘"Ä|Hè€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!>ß8€€vÆ Kþsñ|~y@‚€[Ä€8"H8€zÄp€–Æ ÅóxH8/ƒ@œ€[Ä€8"Kÿÿt€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!?¿8€€}ÅØKþsu|~y@‚€[Ä€8"H¼€|€ÅØÅóxH7/ƒ@œ€[Ä€8"Kÿþø€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!=?8`iÆ(€K8BK<_)Æ(‘"ÈTH7q|`y@‚€[Ä€82"H(<_8`ƒÂ¹<<_ÈX<_>“ÂÈ\9)‘>H7-,@‚€[Ä€8‹"Hä<_8?Ÿ;ÿÿƒ¢¸à<_:à|ÆtbÈ`<_<`Í=Èl<_`ce“¢Èd<_9)“¢Èp<_‘==?ƒ"¹8“©Èh=?“©Èt=?€K8BK“ È|<_=?’âÈ€“©È„<_=?“"Ȉ“)ÈŒ<_=?€Æt}Y“¢È<_9k’éÈ”=?Èx<_‘}’éÈœ’âȘ<_9J“¢È <_“¢È¤‘Y<_“"ȨH6|`y@‚€[Ä€8Í"HÐ><_Y8`}Ȭ<_9)9J9k‘>=?“ÂȰ<_“©È´=?“¢È¸<_“©È¼=?“¢ÈÀ<_“©ÈÄ=?“¢ÈÈ<_“)ÈÌ‘Y‘}“"ÈÐ<_“¢ÈÔH5},@‚€[Ä€8}"H4<_=?È"i€iÈØH6ñ|`y@‚€[Ä€8~"H=<_8`ÈÜ<_9)“¢Èà‘=H5,@‚€[Ä€8ÿ"HÌ}<_=?bÈä<_’éÈì8`<Æt“Èð9k<_‘}“¢Èè€I8BI<_€ÆtÈôH4­,@‚€[Ä€8"Hd=<_?bÈø<_8`9)“¢Èü‘=8È8€I8BI=?€È8|Æt É=?€K8BK<_“©É=?“¢É <_“©É}€Æt9kÉ‘}H4|`yA‚P=<_<`É`cB@<_9)“¢É‘=H3á|`yA‚ <`{<_`cÈjÉH3Å|`y@‚€[Ä€8´"H|^}<_=?8`ÿÿÉ <_“ÉÉ(9k9J“¢É$‘}‘^H3u|`y@‚€[Ä€8µ"H,ƒ–Æ €zÄp<_É,„ãxH/e|~y@‚8<_„ãx€B¸ü€bH0é€[Ä€8¶=?b<_Äx‘iÄ|Hx<Ÿ€„ÆlH/||y@‚8€[Ä€8¶=?b<_Äx‘iÄ|€^8Bÿÿ/‚^@ž4H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!}<_=?8`“‚É0<_“©É4=?9k“¢É8<_“©É<‘}“¢É@=?<_“©ÉD“¢ÉHH2I,@‚$€[Ä€8K"<_Äx<_‘"Ä|Hy<_]=?8!pbÉL<_“)ÉP=?9k“¢É\9J<_‘y“©ÉX‘]“¢ÉT8È8€I8BI<_€È8`ºÁÿØÉ`€|¦N€ €^Ãóx€| ¦| xN€!8!p<€8c]pºÁÿØ|¦Kþn¸`?Ÿƒ¼Žü8Žü/AžñP|xKÿðø`|@&|¦¾áÿÜ||xBŸ|#xè¦A”!ÿ``#|ƒ#x9)‘<€D8BD<Ÿ€„´ W@><_;@€B´¼"<_8º;À‘"´¸<_´´KÿÿLƒØµì€z´°ÄóxH+=-|zx@Š0&W@<_Äóx;À€B©8€bH,±<_€B´¼Kÿþì8`H+|~y&@‚<_€B´¼KÿþÌ“~ “^8`H+u.|{x@’0M<_8º;@€B´¼"<_´´<_‘"´¸Kÿþœ’ã “ÃdÛx#ËxH.©-|zx@Š$Mˆ<_:à&W@€B´¼"Kÿþø€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!CÓxH-]|{xH)u/ƒAž(<_€B´¼b8º<_=?´´‘i´¸Kÿüà€Z~Ûx8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!H€Y#Ëx€| ¦| xN€!``A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!AŽ0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!AŠ0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€! A‚<€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```<;Àÿÿ8cMÀKþiµ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!pÃóxa€ºáÿÜ|¦}r }q }p N€ ```|@&|¦¾ÁÿØ|zxBŸè¦A”!ÿ?ƒ˜£¬€C8`8BZ<9)‘<H)9|{y@‚0<_8¨=?›ãx€B¯L–ãxb<_¯D‘i¯HHT€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<_<ƒ¢± €c¯<¤ëxH'=|~y@‚d<_¤ëx–ãx€B£È€bH(½<_8©=?€B¯Lb<_¯D‘i¯HHÈ<_8¬=?€B¯Lb<_¯D‘i¯HHP<Ÿ€„¯ÔH&É.|}x@’\M<_8©M–ãx:à€B¯L; "<_¯D<_‘"¯H€^8Bÿÿ/‚^@ž´H˜```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€zH* |~y@‚4M<_–ãxM€:à; €B¯L8ª"<_‘"¯HHô€z8cH)É-ƒ|wx@ŽH#Í.|}xA’ü,“à ¤ëx#ËxH'1|~yA‚ €Y8Bÿÿ/‚Y@ž$€Y#Ëx€| ¦| xN€!``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@žþ€€^Ãóx€| ¦| xN€!Kÿþd€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€[ÜóxcÛx8B[H```<_8¬=?€B¯Lb<_¯D‘i¯HHp<_8¬=?€B¯Lb<_¯D‘i¯HH €^Ãóx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!AŠ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!<8cHtKþbIcÛx;`€C8Bÿÿ/‚C@ž€C€| ¦| xN€!`€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!8!pcÛxa€ºÁÿØ|¦}r }q }p N€ ```|¦¿!ÿä||x|@&BŸ|ƒ#x|¤+xè¦; A”!ÿ<ß<¿8Ƙ 8¥6l8á8“¡8“¡<“¡@“¡DH"];À/ƒAž <A8<Ÿ9)‘<€J8BJ| €„¨|€K0"<€iH™/ƒa<@ž9)‘>z0K<€J8BJ>9)ÿÿ/‰‘>@ž €^Ãóx€| ¦| xN€!`€8€Z0: ÿÿ€ðƒ"}1 U)`>U)À>}2 U)@>"H0N<_~W“xM€~ܳx~{›xM€B”:@;"8@8“AH<_‘"”<_” Hl`8`H =-ƒ|rx@ŽpM <_8‡N ÜóxÛóx€B”;9à×óx"<_” <_‘"”8@} &U)`AH‘!P€]8Bÿÿ/‚]@ž LH 0`€A8£ëx~D“x"9)‘"€8 H !.|xx@’T|&T€<_ÜóxÛóx9àM€B”×óxP8‡"8@AH<_‘"”<_” Kÿÿl`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`ÃxH |}xHµ/ƒAžP9à<_ÜóxÛóx,€B”×óx|&MP8‡"8@AH<_‘"”<_” H 0€Xµëx8Bÿÿ/‚X@ž(€XÃx€| ¦| xN€!```8`H |vy@‚D<_ƒœˆt8Š€B”›ãx—ãxb`<_=?” ‘i”H ````ƒÜˆt€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!‚:/‘AÛóx×óxH 8@=?Ûóx×óxAH<_:€9à‘!L>AT=ß=¿;À€y€•LHÉ-ƒ|rxAŽÔ€Z(|Bò€bH .|xx@²@|&T€€M”9àP8Œ"€AL‘.”” 9 ~ܳx- ‘!HHˆ8`Hý|}y@¢4,-”|&P8Œ€I!LN” ” Kÿÿ¸``“ ~C“x¤ëxH 5.|xxA²úX€R8Bÿÿ/‚R@ž$€R~C“x€| ¦| xN€!``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ÃxH/ƒa€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!°Ãóxa€¹¡ÿ´|¦}r }q }p N€ ``|@&|¦¿Aÿè||x|›#xBŸè¦A”!ÿ #9)‘#=?<€D8BDƒ©…<€c‚ؤëxHûM|~y@‚D<_¤ëx€Bwd€bHüÑ<_8v=?€B‚èb<_‚à‘i‚äH¬``<Ÿ€„ƒDHúù.|}x@’<<_8v=?€B‚èb<_‚à‘i‚ä€^8Bÿÿ/‚^@ž(H€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`Hû|~y@‚4<_8v=?€B‚èb<_‚à‘i‚äHÄ```€\£ëxÄóx8B\“ž €[8B[“~Hþ9|zyA‚ÿ(€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^]Óx8Bÿÿ/‚^@ž|€^Ãóx€| ¦| xN€!H`€^Ãóx€| ¦| xN€!`A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<; 8c Kþ:u€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`£ëx€a»Aÿè|¦}p N€ `|¦¾ÿÐ;ÀBŸè¦”!þð<_=_=>ÿJ„Ì???k„Ð?_??Ÿ?¿‚÷„ ƒ„¤<ß<ÿƒ{„°ƒ9„¨==?ƒZ„¬ƒœ„´€Æ„À€ç„Ä„È)„Ôƒ½„¼“ÁÈ“Á¼“ÁÀ“Áㄸ,<_¡0‘A¤‘a¨“aˆÁ˜áœ“Á‘ ‘!¬’áÌ“|“!€“A„“Œ“¡”;ÂqT=_=<_|{xJ„Øk„Ü808a,€B„àÅóx8À8à9¼9 ‘A°‘a´A¸Kþ0y/ƒAœ/Ð8ˆ8AŒ€a,€0<¿Æóx88A<8A”@8˜AD8AœH8 AL8A¤P8¨AT8A¬X8°A\8¥`8A´8¸8áÌ9|9!€Adh9A„Hù‘/ƒ@ž¨!,/‰Až0€I8Bÿÿ/‚I@ž€a,€C€| ¦| xN€!!0/‰Až0€I8Bÿÿ/‚I@ž€a0€C€| ¦| xN€!!¼/‰Až.¼€I8Bÿÿ/‚I@¾.¨€a¼;ÀÿÿH.€``€[aÌ?_<8€8B[€K8BK!|€I8BIa€€K8BK!„€I8BIaˆ€K8BK!Œ€I8BIa€K8BK!”€I8BIa˜€K8BK!œ€I8BIa €K8BKA¤ƒÚt€€J8BJ!¨€I8BIa¬€K8BK!°€I8BIa´€K8BKA¸€J8BJ>€c‚D9)‘>Kþ4u,aÀ@‚H€&>ß?>ÿ8º€V€ Ùóx; "€‘8€``!È/‰@žH4€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`ƒ!À<Ÿ;À€„‚x“ÁÀ#ËxHô‰,aÀA‚Ü<Ÿ#Ëx€„€xHôm|}y€&A‚p8`ÿÿHø9/ƒaÄAž\8`Hôå/ƒaÈAžH!Œ8`€I8BI€AÈ€Œ !Ä€AÈ‘"“ÁÄHô¥/ƒaÄ@ž,`>ß?>ÿ8»6€ €I€X€Kÿþð“£ €È€AÄ“ÁÈ€aÀ€ÄH÷Ñ|}y@‚4`€&>ß?>ÿ8»€V€ ; "€‘8€Kÿþ˜€AÀ"9)ÿÿ/‰‘"@ž€aÀ€C€| ¦| xN€!“ÁÀ€AÄ"9)ÿÿ/‰‘"@ž€aÄ€C€| ¦| xN€!“ÁÄ€]8Bÿÿ/‚]@ž0€]£ëx€| ¦| xN€!H```€I8Bÿÿ/‚I@ž €aÈ€C€| ¦| xN€!`!À8È/‰Až0€I8Bÿÿ/‚I@ž€aÀ€C€| ¦| xN€!!Ä8À/‰Až0€I8Bÿÿ/‚I@ž€aÄ€C€| ¦| xN€!˜ 8ÄA‚4€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<8cKþ2ù8aÈ8À8¡ÄKþ.É/ƒ@œ@ƒZt€9 €V€ 8¼‘!Ø, “AÜ€&"€‘8€!ÀH$``€AÈ"9)ÿÿ/‰‘"@ž€aÈ€C€| ¦| xN€!;À€AÀ“ÁÈ"9)ÿÿ/‰‘"@ž$€aÀ€C€| ¦| xN€!``“ÁÀ€AÄ"9)ÿÿ/‰‘"@ž(€aÄ€C€| ¦| xN€!```“ÁÄ8`HòI|~y@‚0€&ƒZt€<_8¾€B€ “AÜb8@AØH¨`€[$"9)ÿÿ/‰‘"@ž€{$€C€| ¦| xN€!“Û$>ÿ?ƒ×À€x€ÄóxHðI||y &@‚<_Äóx€Btœ€bHñÉ`¸ “È@‚HƒZt€<_¼ëx8¿€B€ “AÜb8@AØ=?<_‘i€!À€H"l``<Ÿƒãx€„€`HïÅ,aÀA‚¸€AÈ"9)ÿÿ/‰‘"@ž €aÈ€C€| ¦| xN€!`88`ÈHð,aÄA‚h€[8B[“c !Ì€I8BI€Ì€AÄ!|€I8BI€|€AÄ€aÀ€Ä€¡¼Hò1|}y@‚8`€&ƒZt€<_8¿€B€ “AÜb8@AØKÿþì``€AÀ"9)ÿÿ/‰‘"@ž€aÀ€C€| ¦| xN€!;À€AÄ“ÁÀ"9)ÿÿ/‰‘"@ž$€aÄ€C€| ¦| xN€!``“ÁÄ€["9)ÿÿ/‰‘"@ž(€{€C€| ¦| xN€!```“»<Ÿ£ëx€„‚pHî,aÈ@‚4€&ƒZt€<_8À€B€ “AÜb8@AØKÿýì``€["9)ÿÿ/‰‘"@ž€{€C€| ¦| xN€!€È;€a̓ȀK8BK; €I8Bÿÿ/‚I@ž€{ €C€| ¦| xN€!€Ìa´ €K8BK;T€I8Bÿÿ/‚I@ž$€{T€C€| ¦| xN€!``ƒÁ€t€Àx @|€A´Ýóx/€[TxAžT<_€Btä€b €bHË!|}y@‚HN<_8p;`€BNì"<_Nä<_‘"Nè€^8Bÿÿ/‚^@ž¸Hœ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëx8€8 KýüE€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<_8p=?€BNìb<_Nä‘iNèHP```/€AžÌ<_<ƒ¢PD€cNܤëxHÅõ|~y@‚<<_¤ëx€BCh€bHÇy<_8r=?€BNìb<_Nä‘iNèHä<Ÿ€„PHÅ©.|{xA’¬€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```8`HÅý|~y@‚4<_8r=?€BNìb<_Nä‘iNèH0```=?cÛxÄóxiR(€K8BK)R(‘> HÉ|}y@‚(<_8r=?€BNìb<_Nä‘iNèKÿþ€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€]8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``8=?<)CL}>Kx€I8BIH`€^Ãóx€| ¦| xN€!A’4€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`<;À8cê Kþå€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€a»aÿì|¦}p N€ |@&|¦¿Aÿè8À|{x9 BŸ8è¦A”!ÿ<_;ÂJŒŒ¡8aŒ8<8Åóx8á89Kx8BIHh€^Ãóx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cßÌKýûE€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!pÃóx€a»aÿì|¦}p N€ |@&|¦¾ÿÀ8À|tx8àBŸ9 8è¦A”!ÿ`<_=;Â2hkE´¼¡À8a¼8À8‘aLÅóx98Kýò /ƒAœ(”€a¼€À<¿Æóx8áL8¥Î(H»™/ƒ@ž°!¼/‰Až4€I8Bÿÿ/‚I@ž €a¼€C€| ¦| xN€!`!À/‰Až8€I8Bÿÿ/‚I@ž$€aÀ€C€| ¦| xN€!``!8/‰Až'è€I8Bÿÿ/‚I@ž'Ô€a8;ÀH'¬`€TaL>¿<ŸƒU5D8BT€K8BK:€„C9)‘:€tH¸%|}y@‚L &<_SÓx[ÓxUÓxM€€B@ä:À;ÀN;WÓx8¼"<_‘"@àH`8€H»í|~y@‚TM<_8¼SÓx[Óx€B@äUÓx;€WÓx"<_@Ü<_‘"@à€]8Bÿÿ/‚]@ž&àH#X€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`Hºí|~y@‚T &<_SÓx[ÓxUÓxM€€B@ä:À;ÀN;WÓx8½"<_‘"@à<_@ÜH#X`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`<Ÿ€t €„DH¼||y@‚\ &<_Óóx8¾[ÓxM€€B@äUÓx:ÀN;À;WÓx"<_‘"@à<_@ÜH"À```8`H¶­|}y@‚@ &<_8¾[ÓxUÓx€B@äÓóx;WÓx"<_‘"@à<_@ÜH" “ =<_¤ëx‚5H~ƒx+C|€I8BIkC|‘}H¹µ|vy@‚@M<_8¾[ÓxUÓx€B@äÓóx;€WÓx"<_‘"@à<_@ÜKÿýÈ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€tH´‘|wy~ &A‚ ÓóxH@=?<_8ÀÓóx‘!X€B@ä"`€AX@Ü<_‘"@àH `sÛx~ã»xH¸ù|}y@¢@H´ /ƒAž”=?<_8À‘!X€B@ä"€AX@Ü<_‘"@àH Ä`<_ƒÂ@\/ž@¾$<_<Ÿ€B5t8„Δ€bH³mHl`€5DAž €}ƒðAžÄóxH»¥/ƒAž€Z8Bÿÿ/‚Z@ž¨HŒ=?€]€Þ <Ÿ)5€8„×䀢 €iH³=?<_;€8À‘!X€B@ä;À; .;MM~@&VR€"€AX@Ü<_‘"@à€]8Bÿÿ/‚]@ž H ì€ZCÓx€| ¦| xN€!<Ÿ£ëxºëx€„AŒH³1|}yA‚x8`H³Á.||x@²DM<_;ÀM; ;~@&VR€€B@ä8Á"<_AX<_‘"@àH耡8£ëx„ãxHµå-ƒ|~x@®H~@&VR`=?<_8Á; M ‘!X€B@ä;"<_‘"@à€AX@ÜKÿÿ`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`~c›xÄóxH·©|{yA‚|€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€/€~R VR@><_sÛx; €B@ä;8Ã"<_AX<_‘"@àH|N=?<_8ÅsÛx‘!X€B@ä;€"€AX@Ü<_‘"@àHtN <_sÛxM ;€; €B@ä8Å"<_AX<_‘"@àH MH0N =?<_sÛx;€‘!X€B@ä8Å"HHM=?<_sÛx; ‘!X€B@ä8Å"H =?<_8ÅsÛx‘!X€B@ä"`€AX@Ü<_‘"@àH°N<_8Ç~@&VR@€B@äsÛx;€;"<_AX<_‘"@à!X @ÜH~P VR€>=?<_sÛx‘!X;€8Ç€B@ä"€AX@Ü<_‘"@àHTN=?<_8ÇsÛx‘!X€B@ä;€"€AX@Ü<_‘"@àHL€]£ëx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŠ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!~X A‚0€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!A’0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!~8 A‚0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!8a@8H8¡D; H¨‘€AXƒ"@Ü>_~óx€’A°H§9.||x@’0<_/8É=?€B@äb<_@Ü‘i@à@ž$Hx8€H«|~yA‚ÿÈ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/@ž H´!@/‰Až0€I8Bÿÿ/‚I@ž€a@€C€| ¦| xN€!!H/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!!D/‰Až0€I8Bÿÿ/‚I@ž€aD€C€| ¦| xN€!@’ Hø;€€a@€H€¡D~Û³x;,:À &H©5‚µ5D8<_;À“"@ÜD@HW½ >± W½`>~·«xW½€>° W½€>H8`H©M-ƒ|~x@Ž M H$~c›xÄóx8¡?>_ƒÑB<€r@ÔÄóxH˜­|}y@‚H &<_Äóx5Ëx:ÀM€€B5`;N€bHš<_;À8Ó€B@äbH¸>߀–BH˜U||y@‚,M<_5Ëx;€8Ó€B@ä"<_‘"@àHÄ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`H˜‘|xy &A‚4=?ƒãxÃxiDp€K8BK)Dp‘8 H›Ý|~y@‚,<_8Ó5Ëx€B@ä"<_‘"@à<_@ÜHЀ\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€aLH—/ƒa<@œD;€<_5Ëx:À,€B@ä;À;8Ô &"<_M€N‘"@àHxAž°<Ÿ~ƒ£x€„CH–¡.|vx@’ &W½€H`8€Hš|~y@‚D &W½ >± W½`><_5Ëx;À€B@ä;8Õ"<_‘"@à<_@ÜHÔ€V8Bÿÿ/‚V@ž¼€V~óx€| ¦| xN€!H ƒÑB<€r@ÔÄóxH•õ|}y@‚X &<_Äóx5Ëx:ÀM€€B5`;N€bH—a<_;À8×€B@äb<_=?@Ü‘i@àH8€–BH•‘||y@‚4M<_5Ëx;€8×€B@ä"<_‘"@à<_@ÜKÿÝЀ]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`H•Å|xy &A‚4=?ƒãxÃxiDt€K8BK)Dt‘8 H™|~y@‚,<_8×5Ëx€B@ä"<_‘"@à<_@ÜH€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!55D5Ëx€I}>Kx8BIHp€];£ëx;À:À,€ &| ¦| xM€NN€!H˜‚µ5D~Û³x~·«xH;‚õ5D~Û³x,~õ»x &€\8Bÿÿ/‚\@ž¬€\ƒãx€| ¦| xN€!H€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!A’0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!¸ A‚<€X8Bÿÿ/‚X@ž(€XÃx€| ¦| xN€!```<;À8cÜ KýÓÕ!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€U8Bÿÿ/‚U@ž €U~£«x€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!!¼/‰Až8€I8Bÿÿ/‚I@ž$€a¼€C€| ¦| xN€!``!À/‰Až˜€I8Bÿÿ/‚I@ž„€aÀ€C€| ¦| xN€!Hh`;ÀH\;:À;À, &M€NH,;€5Ëx;À;/œ &W½àMœKÿüø`@ŠüÄKÿüì``8! Ãóxa€ºÿÀ|¦}r }q }p N€ ``|¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ <ß<¿8Æ88¥˜ÐH’Q/ƒAž¨€[=?<8B[ƒ©ü€cL¤ëxH¥|~y@‚<<_¤ëx€B Ø€bH‘)<_8ß=?€B\b<_T‘iXH<Ÿ€„ŒHY.|}x@’<<_8ß=?€B\b<_T‘iX€^8Bÿÿ/‚^@žˆH`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H}|~y@‚4<_8ß=?€B\b<_T‘iXH$```; £ëxÄóx€I8BI€  ;€I8BI€H’‰||yA‚ÿ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`=?) ¼€I}>Kx8BIHh€^Ãóx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8c³ÿ8æ€YD/‹"<‘8@Až0€K8Bÿÿ/‚K@ž€a@€C€| ¦| xN€!!D8@/‰Až0€I8Bÿÿ/‚I@ž€aD€C€| ¦| xN€!<_<;@ƒ¢`€c8“AD¤ëxH‰m.|~x@’<_¤ëx€BÀ€bHŠí“Á@@’(€YDƒ»¤8ç;@"¹ëx<‘8@H€ÃóxH‰y€A@a<"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€<“A@,A‚ <8c°LKýÉé8aD8@8¡HKýŹ/ƒ@œ,€YD;@ƒ»¤8ç."¹ëx<‘8@Hè€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!“AD€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!“A@€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“AH``ƒÜ@/ž“ÁKx €I8BIHhN<_;@8ì€BD"<_<<_‘"@H<<_8ì=?€BDb<_<‘i@HNƒ»¤;@¹ëx`!@/‰Až8€I8Bÿÿ/‚I@ž$€a@€C€| ¦| xN€!``!D/‰Až8€I8Bÿÿ/‚I@ž$€aD€C€| ¦| xN€!``!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``A’0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!<;À8c°dKýÀÅ!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`!¬/‰Až8€I8Bÿÿ/‚I@ž$€a¬€C€| ¦| xN€!``!°/‰AžH€I8Bÿÿ/‚I@ž4€a°€C€| ¦| xN€!H`;À```8!Ãóx€aºáÿÜ|¦}p N€ |¦¿!ÿä|{x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8Æöø8¥¡´8á89<9!@H€U/ƒAžL;<_<Ÿƒ¢ùÌ9)‘;€]€„t8B]€{H}|~y@‚4<_8õ¹ëx€Bl"<_d<_‘"hH|``€a8H=.||x@’PM<_8õ¹ëx;@€Bl"<_d<_‘"h€^8Bÿÿ/‚^@žpHL``8`H}-|zx@Š0<_8õ¹ëx€Bl"<_d<_‘"hKÿÿ¨`“ƒ DÓxÃóxH€Õ|yy@‚ÿ>ß?8Œ7÷€I÷V÷!ÿ>ß?87÷€I÷V÷Kÿþô€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!ƒÁ8“@“8H,€I8Bÿÿ/‚I@ž€a<€C€| ¦| xN€!!@8ß>ÿ?8`Hla/ƒa@AžD=+ú0€I8BI<_€Bëxkú0!@‘i €b€@Ho¡/ƒa8@ž$7÷8€I!8÷V÷H¸`€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€a8;À8€8 “Á@Ký Ý€A8"9)ÿÿ/‰‘"@ž$€a8€C€| ¦| xN€!``“Á87÷8€IÉóx÷V÷H!8```/‰Až<€I8Bÿÿ/‚I@ž(€a8€C€| ¦| xN€!```!ÿ?€C#8B9)C‘#ƒ×ñ4€xðŒÄóxHi|}y@‚H<_Äóx€Bå€bHj…<_8a=?€Bðœb<_ð”‘ið˜H ```€{Hl||yÀ&@‚`M€<_8aN;@; M€Bðœ:À"<_ð”<_‘"ð˜€]8Bÿÿ/‚]@ž ÄH ¨```€{ Hl.|zx@’0M<_; M:À8a€Bðœ"<_‘"ð˜HÔ€{HkÝ-ƒ|yx@Ž M <_:À8a€Bðœ"H „8`Hhm-|vx@Š0<_8a=?€Bðœb<_ð”‘ið˜Kÿÿ8``“ƒ ~ijx£ëx€["9)‘"€“V“6Hk…||yÀ&@‚8M€<_;@N; 8a€Bðœ"<_‘"ð˜Hü``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`ƒãxHf].|zx@’0M<_; M:À8`€Bðœ"<_‘"ð˜HÀ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`CÓxHj­-ƒ|yx@ŽDHe½/ƒ@ž<_<Ÿ€Bäð8„|€bHcýM <_:À8`€Bðœ"H”Hi]|}xHeu,À&A‚0<_:À8`=?€Bðœ-b<_ð”‘ið˜Hl€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!“» CÓxHiå|}y@‚lHdù/ƒ@ž<_<Ÿ€Bäð8„|€bHc9WÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>; €Bðœ:À8`"<_‘"ð˜HX``Hhq||xHd‰/ƒAžÑ WÞ`><_;€; €Bðœ:À8`M "<_‘"ð˜H˜€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!“›CÓxHhñ|iyA‚H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bäð8„|€bHb)HHcÁ/ƒAž¸<_; :À8`€Bðœ-Mˆ"<_‘"ð˜HH€ZCÓx€| ¦| xN€!€[€ €Aœd;€ ‚@œl)(B|H.ƒ×ñ4€xðŒÄóxHcµ-|vx@Š$<_Äóx€Bå€bHe5<_€BðœH €{Hga||yÀ&@‚(<_€Bðœb8g<_=?ð”‘ið˜H`€{ Hg)-ƒ|yx@Ž N H€{Hg |}y@‚0N<_8g;@€Bðœ"<_ð”<_‘"ð˜Hp8`Hc‘.|zx@’(<_8g=?€Bðœb<_ð”‘ið˜Kÿú\“ƒ DÓx~óx€["9)‘"€“:“ºHf±||y@‚0M€<_; 8g€Bðœ"<_ð”<_‘"ð˜H €V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!ƒãxHa-ƒ|yx@Ž8N <_;@M :À8f€Bðœ"<_‘"ð˜<_ð”H4€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!#ËxHeé.|}xA’œHdÙ|~xH`ñ.A’D<_;@;€:À€Bðœ.8fÀ&WÞ€"<_M‘"ð˜<_ð”KÿøÄ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!“Û #ËxHeQ-|vx@ŠTH`a/ƒ@ž<_<Ÿ€Bäð8„|€bH^¡M<_8f:À€Bðœ"<_ð”<_‘"ð˜HtHcñ|~xH` /ƒAž(<_8f=?€Bðœb<_ð”‘ið˜H<€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!“Û#ËxHd…|iyA‚H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bäð8„|€bH]½HH_U/ƒAžd<_;@8f=?€Bðœ-:Àb<_ð”‘ið˜H|€Y#Ëx€| ¦| xN€!€{Hc].|zx@’pH@<_8€8 €Bå €bKý•%<_8i=?€Bðœb<_ð”‘ið˜Hp<_; :À8j€Bðœ-Mˆ"<_‘"ð˜H@€{ HbÝ||yÀ&@‚8M<_; M€:À8j€Bðœ"<_‘"ð˜<_ð”Hl€{Hb•|}y@‚0M<_; M€:À8j€Bðœ"<_‘"ð˜Kÿü¼8`H_-|vx@Š0Mˆ<_; 8j€Bðœ"<_ð”<_‘"ð˜KÿõÜ“C |dx;€I8BI€“ƒ“£<€cðHb-|`y@‚(<_8j=?€Bðœb<_ð”‘ið˜Hð€V|x8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!Hü€]£ëx€| ¦| xN€!Ø A‚<€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```A’0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!AŽ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<;À8cœKýÕ€[8Bÿÿ/‚[@žP€[cÛx€| ¦| xN€!H4€Z8Bÿÿ/‚Z@žø€Kÿød€Y8Bÿÿ/‚Y@žüØKÿü¼8!pÃóxa€ºÁÿØ|¦}r }q }p N€ ``|¦¾aÿÌ|#x|@&BŸ8€|¾+xè¦A”!ÿp€˜| ¦| xN€!|zyA‚ `=?<_£ëx=ƒi×Ì€Bã„Äóx<¿<ß;€8¥€œ8á88ÆÕ9Ÿ>ÿ>ß: ƒ€A€„Ø„9)‘>HNµ|xy@‚ü<_8]ÚóxÙóx€B×t"<_×l<_‘"×pƒœËÔ›ãx—ãxH ´M <_~>‹x}À&UÎ`€B×t9à:"Hð}À&U΀<_~>‹x~œ£x~»«xM€B×t~W“x:`M9à:8a"<_‘"×pH´UΠ>}Ñ UÎ`><_UÎÀ>}Ò UÎ@>Äóx€BËð~>‹x~œ£x~»«x~W“x:`:€bHOa<_8a€B×t"<_‘"×p<_×lHPM Ht<_~>‹x~œ£x~»«x€B×t~W“x8a"<_‘"×pH}À&UÎ`<_~>‹x~œ£x~»«x€B×t~W“x9à8a"<_‘"×pHàUÎÀ>}Ò UÎ@><_~>‹x~œ£x~»«x€B×t~W“x:8a"<_‘"×pH¤M<_~>‹xM€~œ£x~»«x€B×t~W“x:`:8a"<_‘"×pHh`8`HMM.|}x@’p}À&U΀<_8]ÙóxÚóxM€B×t:`ÜóxM9àÛóx:×óx"<_×l<_‘"×p€X8Bÿÿ/‚X@ž ¬H „`HQ-ƒ|sx@Ž$M <_ÙóxÚóx€B×tHœ``<Ÿ€¡8€„ØäHN5/ƒAœ€<~c›xHRá/ƒ@œ8:<_ÙóxÚóx-€B×tÜóxÛóx9à}À&UÎ@"HPÃx¤ëx~e›xHNµ|yy@‚TM<_ÙóxÚóx€B×t`}À&UÎ@"ÜóxÛóx9à:<_8]wÛx‘"×p<_×lKÿþð€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~óx€„؈HJ}|xy@‚,<_8^=?Úóx€B×tb<_×l‘i×pKÿûÌ8`HJå.|}x@’}À&U΀<_Úóx€B×tH<€YÃx¤ëx8BY“= €¡}Ñ UÎ`>"ÜóxUÎÀ>}Ò UÎ@><_Ûóx:`9à:×óx8^‘"×pHT€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8`HJ™|qy@‚(<_8_€B×t"<_‘"×p<_×lKÿúl€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!CÓxHHY|xyA‚ÜóxÛóx×óxH8<_8`~>‹x€B×t"<_‘"×p<_×lKÿùø~W“x~»«x~œ£xÃxHLÅ.|}x@²HHGÕ/ƒAžT}À&U΀<_~>‹x:`9àM€B×t:M"HÀ``HG±-ƒ|sxA®ù”€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!~c›xHL1.|tx@’\HGA/ƒ@ž<_<Ÿ€BËÈ8„tT€bHE}À&U΀<_~>‹x; 9à€B×t:UÎÀ>}Ò UÎ@>"H€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!~c›xHK™.|ux@’`HF©/ƒ@ž<_<Ÿ€BËÈ8„tT€bHDé}À&U΀<_~>‹x~œ£x; €B×t9à:UÎÀ>}Ò UÎ@>"Ht€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!~c›xHJý.|rx@’pHF /ƒ@ž<_<Ÿ€BËÈ8„tT€bHDM}À&U΀<_~>‹x~œ£x~»«x€B×t; 9à:UÎÀ>}Ò UÎ@>"HÔ```€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!~c›xHJQ|iyA¢H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€BËÈ8„tT€bHC‰HHE!/ƒA¾0:<_~>‹x~œ£x,€B×t~»«x~W“x; 9à}À&"NM<_8`‘"×p<_×lKÿøü€S~c›x€| ¦| xN€!<Ÿ~#‹x€„ØHE!.|}xA²öÌ<_<ƒÂÙÈ€c×dÄóxHDý|oy}À&A‚öð<Ÿ€„×ÐHDå-ƒ|sxA®÷@€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!8`HEE|oy}À&A¢÷l€V~c›x}ä{x8BV’Ï €U8BU’¯€T8BT’€R8BR’OHHm-|pxAªö°€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!8`HD-ƒ|sxA®öp€T8`8BT’“ €U8BU’’³HDI|oy}À&A¢öp’o £ëx}ä{xHG­|~yA¢ö”€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!€^8Bÿÿ/‚^@žú¤€^Ãóx€| ¦| xN€!Kÿúˆ€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€Q~=‹x~>‹x8BQH€XÃx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!}Ø A‚<€O8Bÿÿ/‚O@ž(€O}ã{x€| ¦| xN€!```AŠ0€P8Bÿÿ/‚P@ž€P~ƒx€| ¦| xN€!<; 8ctàKý‚Õ!9)‘>H?M|ty@‚4<_8e€BÆd"<_Æ\<_‘"Æ`‚ýºÄ~ø»x~ú»xH˜€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<Ÿ~£«x€„ÇHH=U|yy@‚,<_8f~ž£x€BÆd"<_Æ\<_‘"Æ`Kÿÿ„M <_8f:@€BÆd"<_Æ\<_‘"Æ`H(M<_~Ú³xMxÛx—ãx€BÆd:`:@8g"<_‘"Æ`H€M <_~Ú³xxÛx—ãx€BÆd:@8g"<_‘"Æ`HP<_8g~Ú³xxÛx€BÆd—ãx"<_‘"Æ`<_Æ\HM€<_~Ú³xxÛx—ãx€BÆd:`8g"<_‘"Æ`Hð```8`H<½.|}x@’`M<_8fMÚóxØóx€BÆd:`:@×óx"<_Æ\<_‘"Æ`€Y8Bÿÿ/‚Y@ž H``€¡8#Ëx¤ëxH>Å-ƒ|sx@ŽHM <_8fÚóxØóx€BÆd:@×óx"<_‘"Æ`<_Æ\Kÿÿ```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`~c›xH:|yy@‚DM<_8fÚóxØóx€BÆd:@×óx"<_‘"Æ`<_Æ\H@``€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`ÚóxØóx×óxH—ãxxÛx~Ú³x#ËxH>±.|}x@²DH9Á/ƒAž8M<_:`M:@8f€BÆd"<_‘"Æ`HÌ``H9¡-ƒ|sxA®üÔ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`~c›xH>|vyÀ&@‚PH9-/ƒ@ž<_<Ÿ€Bº¸8„cD€bH7mWÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>€BÆdH”`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`~c›xH=|{yÀ&@‚pH8/ƒ@ž<_<Ÿ€Bº¸8„cD€bH6ÝWÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>~Ú³x€BÆd"; <_:@8f‘"Æ`H|``€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`~c›xH<Ý||yÀ&@‚`H7í/ƒ@ž<_<Ÿ€Bº¸8„cD€bH6-WÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>~Ú³x€BÆdxÛx; :@"HÈ€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`~c›xH<=|iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bº¸8„cD€bH5uH```H7/ƒA¾H<_:@~Ú³xxÛx€BÆd-—ãx; N"<_8f‘"Æ`<_Æ\Kÿûh€S~c›x€| ¦| xN€!```<Ÿ~ƒ£x€„ÇH7.|}xA²ú8`H7‘-ƒ|sxA®ú(€[8`8B[“s €\8B\““H7]-|rxAªú$’c ~D“x£ëxH:Á|~yA¢ú<€]8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`€^8Bÿÿ/‚^@žûÀ€^Ãóx€| ¦| xN€!Kÿû¤€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!€T~£x~ž£x8BTHÔ€Y#Ëx€| ¦| xN€!`A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!AŠ@€R8Bÿÿ/‚R@ž,€R~C“x~ž£x€| ¦| xN€!H``~ž£x<; 8ccôKýv!8/‰Až4€I8Bÿÿ/‚I@ž €a8€C€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€U8Bÿÿ/‚U@ž €U~£«x€| ¦| xN€!`!¬/‰Až8€I8Bÿÿ/‚I@ž$€a¬€C€| ¦| xN€!``!°/‰Ažh€I8Bÿÿ/‚I@žT€a°€C€| ¦| xN€!H8`; H,``€S8Bÿÿ/‚S@žüKÿûè``8!£ëxa€ºAÿÈ|¦}r }q }p N€ ``|@&|¦¾ÿÀ8À|vx8àBŸ9 8è¦A”!ÿp<_=;«Ük¾0¬¡°8a¬8°<‘a8Åóx9€„»49)‘>H1e|zy@‚Ü<_8mÛóxØóx€Bº$"<_º<_‘"º ƒ<®„7Ëx<ËxH dM <_~>‹x:€Bº$"HPM<_~>‹xM~|›x~·«x€Bº$~Y“x:€:8q"<_‘"º H MˆHM€<_~>‹x~|›x~·«x€Bº$~Y“x:€8q"<_‘"º Hä```8`H1.|}x@’`M<_8mMØóxÛóx€Bº$:€Üóx:×óxÙóx"<_º<_‘"º €Z8Bÿÿ/‚Z@žÈH¬H4ñ-ƒ|tx@Ž$M <_ØóxÛóx€Bº$HŒ``<Ÿ€¡8€„»”H2/ƒAœ€<~ƒ£xH6Á/ƒ@œ,<_:ØóxÛóx€Bº$-Üóx×óx"H@CÓx¤ëx~…£xH2¡|xy@‚DM<_ØóxÛóx€Bº$"Üóx×óx:<_8m~ù»x‘"º <_ºKÿÿ€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€T8Bÿÿ/‚T@ž€T~ƒ£x€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~óx€„»8H.y|zy@‚,<_8n=?Ûóx€Bº$b<_º‘iº Kÿý8`H.á.|}x@’(M<_ÛóxMÜóx×óx€Bº$"HL€XCÓx¤ëx8BX“ €¡‹x€Bº$"<_‘"º <_ºKÿûP~Y“x~·«x~|›xCÓxH0Í.|}x@²@H+Ý/ƒAž¨M<_~>‹xM:€:€Bº$"Hx```H+Á-ƒ|txA®úô€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!~ƒ£xH0A.|sx@’HH+Q/ƒ@ž<_<Ÿ€B®x8„W€bH)‘M<_~>‹x; :€Bº$"HØ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!~ƒ£xH/½.|ux@’PH*Í/ƒ@ž<_<Ÿ€B®x8„W€bH) M<_~>‹x~|›x; €Bº$:"HP`€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!~ƒ£xH/1.|rx@’PH*A/ƒ@ž<_<Ÿ€B®x8„W€bH(M<_~>‹x~|›x~·«x€Bº$; :"HÀ€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!~ƒ£xH.¥|iyA¢L€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€B®x8„W€bH'ÝH`H)q/ƒA¾€<_:~>‹x~|›x€Bº$-~·«x~Y“x; N"<_8p‘"º <_ºKÿù|€T~ƒ£x€| ¦| xN€!<Ÿ~#‹x€„ºÀH)}.|}xA²øl8`H* -|pxAªø”€U£ëx~ƒx8BU’° H-a|~yA¢øx€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€P8Bÿÿ/‚P@ž€P~ƒx€| ¦| xN€!€^8Bÿÿ/‚^@žüP€^Ãóx€| ¦| xN€!Kÿü4€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€Q~=‹x~>‹x8BQH¼€ZCÓx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€T8Bÿÿ/‚T@ž€T~ƒ£x€| ¦| xN€!AŠ0€P8Bÿÿ/‚P@ž€P~ƒx€| ¦| xN€!<; 8cWØKýhÕ!|òx @|8I/€^DAž08 ÝóxÔóxÕóxÑóxÓóxH Ð```8`H%|ry@‚D<_8îÝóxÔóx€B¬lÕóxÑóxÓóx"<_‘"¬h<_¬dH h``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€a@H#=|vyA‚Ôóx:ÕóxÑóxÓóxHP<_8ïÔóxÕóx€B¬l~]“xÑóxÓóx"<_‘"¬h<_¬dH ДãxUÓxqÛx3Ëx:~óxH'‰.|~x@²\H"™/ƒAž ,M<_8ïM; €B¬l"<_¬d<_‘"¬h€V8Bÿÿ/‚V@ž ÀH œ``H"a-ƒ|}x@®$<_-8ï€B¬l"HL``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxH&½||yÀ&@‚`H!Í/ƒ@ž<_<Ÿ€B À8„IL€bH WÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>8ï€B¬l;ÀbHp``€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`£ëxH&|zyÀ&@‚PH!-/ƒ@ž<_<Ÿ€B À8„IL€bHmWÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>”ãx€B¬lH”€U8Bÿÿ/‚U@ž €U~£«x€| ¦| xN€!`£ëxH%|{yÀ&@‚pH /ƒ@ž<_<Ÿ€B À8„IL€bHÝWÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>”ãx€B¬lUÓx"<_;À8ï‘"¬h<_¬dKÿýÔ€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`£ëxH$Ý|yyÀ&@‚pHí/ƒ@ž<_<Ÿ€B À8„IL€bH-WÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>”ãx€B¬lUÓxqÛx;À8ï"<_‘"¬hKÿÿL`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`£ëxH$-|iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€B À8„IL€bHeH```Hñ/ƒA¾ È<_;À”ãxUÓx€B¬l-qÛx3Ëx8ïN"<_‘"¬hKÿþt€]£ëx€| ¦| xN€!`€ Ì€a8|`x1 ÿÿ|I/‚AD|@xAž0DÓx8¡DH#%/ƒAœ\€D|øTþD``/€@žû|€ Ì€a<|`x1 ÿÿ|I/‚AD|@xAžx„ãx8¡DH"Í/ƒ@¼D<_; ”ãxUÓx€B¬l-qÛx3Ëx;À8ðN M "<_‘"¬hKÿýˆ€D8@/€@8@AD|@x`.A’”ãxUÓxqÛx3ËxKÿúÜ€ Ì€a8|`x1 ÿÿ|I/‚AD|@xAžp„ãx8¡DH"/ƒ@¼@M<_”ãxUÓxqÛxM €B¬l3Ëx;À; 8ò"<_‘"¬hKÿüØ€D8@/€A8@AD|@x/€@ž”ãxqÛxH€8cÛxH"ù.|~x@² MH„ãxH|}y@¢DMMˆ<_”ãxUÓxqÛx€B¬l3Ëx; 8ó"<_‘"¬hKÿü@``€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!a8€K8BK<9)ÿÿ/‰‘<@ž€\ƒãx€| ¦| xN€!‚8±ëx€ Ì€a<|`x1 ÿÿ|I/‚AD|@xAž`DÓx8¡DH i/ƒ@¼@<_; UÓx3Ëx€B¬l-;À8õN M "<_‘"¬hKÿû,`€DTþD/€@žUÓx3ËxH€<#ËxH!Y.|~x@² MHDÓxH}|}y@¢4MMˆ<_UÓx3Ëx; €B¬l8ö"<_‘"¬hKÿú¨€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!a<€K8BK:9)ÿÿ/‰‘:@ž€ZCÓx€| ¦| xN€!‚¡<³ëx<Ÿ~C“x€„­H¹.|~x@²4M<_; M8ø€B¬lb<_=?¬d‘i¬hKÿ÷œ8`H-ƒ|}x@®8<_-8ø€B¬l"<_¬d<_‘"¬hKÿ÷````€T8`8BT’ €U8BU’½€Q8BQ’=€S8BS’}H-|px@ª0<_8ø=?€B¬lb<_¬d‘i¬hKÿöÜ``“£ ~ƒxÃóxHÅ|}y@¢,M€<_; 8ø€B¬l"Kÿÿ0```€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€P8Bÿÿ/‚P@ž€P~ƒx€| ¦| xN€!€]:8Bÿÿ/‚]@žõØ€]£ëx€| ¦| xN€!Kÿõ¼€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!~C“xHµ/ƒÿÿ@ž,<_8ù~]“x€B¬l"<_¬d<_‘"¬hH/ƒOÝèB|&Tÿþ/DAš 8 Ì~]“x€I}>Kx8BIHì€R~^“x~]“x8BRHÔ€V~óx€| ¦| xN€!``A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŠ8€P8Bÿÿ/‚P@ž$€P~ƒx~]“x€| ¦| xN€!H~]“x<;À8cJLKýX‰`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€U8Bÿÿ/‚U@ž €U~£«x€| ¦| xN€!`€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@žL€a@€C€| ¦| xN€!H0```€]8Bÿÿ/‚]@žö€Kÿö```8!Ãóxa€ºÿÀ|¦}r }q }p N€ ``|¦½¡ÿ´|yx|@&BŸ|ƒ#x|¤+xè¦;À; A”!ÿ <ß<¿8ÆŽl8¥+Œ8áX“ÁX“Á<“Á@“ÁH“ÁLHu/ƒAž,€YaX>¿<Ÿƒuü8BY€K8BK;€„ŸÀ9) ‘;€y HM/ƒa<@ž@<_?¿8?_Ax=œœ€I`!x œ”!@Zœ˜/‰@žØH8`Hý/ƒa@Ažÿ´€<= <€c‘+ž”€I8BIkž”€A@‘b“Á<€@H5/ƒa=ÿ=?;@:ÁD’|‘ထ!t|RxApAl<_~Q“x’Ah~M“x‚‚‘4~N“x~S“x`~ã»xH=.aL@²0HM/ƒAž|=?€Oœœ;À8‘!x"H¤`!p€I8Bÿÿ/‚I@ž€I€ap€| ¦| xN€!€AL<Ÿ8€„Ÿ L|CxApHU,a@A‚88€Ha,aŸ88;|Ü€I!<|Ô/‰X|Ø@žH,``8`HôÍ/ƒaŸ8>€B|Ü"<_|Ô‘"|ØHœ<_>Ÿ8?€B|Ü"<_|Ô‘"|ØHx<_>Ÿ8@€B|Ü"<_|Ô‘"|ØHT<_>Ÿ8A€B|Ü"<_|Ô‘"|ØH0<_>Ÿ‚ùq<8<€B|Ü~õ»x~ö»x"<_|Ô‘"|Ø!Ÿ8<×óx€B|ÜÕóxÖóx"<_|Ô‘"|ØKÿÿ„€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!;`€AD“a<"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!€^“aD8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!‚á8<Ÿ“a8€„~~ã»xHï¹/ƒaŸ8=Õóx€B|ÜÖóx"<_|Ô‘"|ØKÿþ@€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!“aDÕóxÖóx`€a8Hó=/ƒa<@¾ HîM|~y@‚ÐH```HîQ/ƒaDAž°€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€aD8Ÿ8=€B|Ü"<_|Ô‘"|ØKÿûð€aD€C€| ¦| xN€!``<Ÿ;Á@8~£«x€„~ÅóxDHðÕ/ƒA¼úì€@ @|/€@Až4~óxHïÍa@Hëå/ƒ@¾úà€@8Kÿýp```<ŸÅóx~£«x€„~°Hðq/ƒA¼úЀ@ @|/€@Až(~óxHïia@Hë/ƒ@¾úÄ€@Ÿ8C€B|Ü"<_|Ô‘"|ØKÿúÌ€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!;`“Á8HÔ€I8Bÿÿ/‚I@ž €a<€C€| ¦| xN€!`!D8Kx8BIHð```ƒ¹q<·ëxµëx¶ëx!D/‰Až8€I8Bÿÿ/‚I@ž$€aD€C€| ¦| xN€!``!ÿ8„8mÜ€I!8mÔ/‰YmØ@žìH8`Há /ƒa@AžÿÀ€]8B]!@“© €a8€@Häa/ƒa “©|@€K8Bÿÿ/‚K@ž€|@€C€| ¦| xN€!“Ü@€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!“A@€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!“A<€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!;À“A8H ```8`HÝ]|zy&A‚@=?DÓxipè€K8BK<_€Bb0)pè‘: €bHà¡/ƒa@@ž<_€BmÜHˆ€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€a@8€8 Kýý€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!&W€“Á@<_;@€BmÜb8ˆ<_=?mÔ‘imØ``!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``!¿ƒuUT†Ø€C8BC€F8BF;9)‘;Až$$€0f|—J| P€D€Ad<Ÿ€„b„HÙ|}y@‚0<_83=?€B`ôb<_`ì‘i`ðH``8`HÙ}.||x@’PM<_83M; :À€B`ô"<_`ì<_‘"`ð€]8Bÿÿ/‚]@ž,H`€[8B[“c HÝQ-ƒ|yx@Ž4M <_83:À€B`ô"<_`ì<_‘"`ðKÿÿœ`8`HÜ -|vxAŠp<Ÿ#Ëx~ųx€„b0HÚM/ƒAœT€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`£ëx„ãx%ËxHÚå-|vx@Š,`<_83=?€B`ôb<_`ì‘i`ðKÿþô€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!>_ƒ²`l/@ž <_<Ÿ€BU„8„bHÖ%Hd–ØAž €vAž¤ëxHÞe/ƒAž€^8Bÿÿ/‚^@žhHL=?€V€Ý <Ÿ)U8„÷ô€¢ €iHÕÁ<_83=?€B`ôb<_`ì‘i`ðH\€^Ãóx€| ¦| xN€!€ 64~Þ³xT:}4.8€V TB:|™.:‘$ €Z48BZ4$€|J€E8BEH¼€]£ëx€| ¦| xN€!A’0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<; 8cÿÔKýå€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!€£ëxa€ºAÿÈ|¦}r }q }p N€ ```|¦¾ÿÀ,BŸ|xx|—#xè¦:À”!ÿp``€Cƒ£8BCA:ÀTµþ; >>Ÿ>_: ¢:¤H``Ýóx™è|&Tïþ/8Aš„|Yê8,|^pÞ”})€I‚¸|&Tïþ/8@š4€ —|@&TBïþ/A8@šÿ˜/–~À³x’Á8Ažø<_<ƒ‚[Œ€cYD„ãxHÑ|zyA‚ €Z€B4/‚Až € /€AžÄóxHÓ5||xHhÃóxHÔ¥|{y@¢`&;€HX```CÓxdÛxHÖ¹€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!,`&@¢,€TYP€’2YHYL€Z8Bÿÿ/‚Z@žH€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!<Ÿƒãx€„[àHÏù|zyA‚<€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8`HÓ||y`&A¢ÿXCÓx„ãx8¡8HÓá/ƒA¼ÿ@€8Tþ8€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\8Bÿÿ/‚\@ž$€\ƒãx€| ¦| xN€!€8H €8`/€Až``;>Kÿý€``/•~ «x’¡8Ažô<_<ƒ¢[Œ€cYD¤ëxHÎÝ|zyA‚D€Z€B4/‚Až € /€AžÄóxHÑ||xHdÃóxHÒ|}y@¢`&;€Hð``CÓx¤ëxHÔ™€]||x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!,`&A‚ €Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!<Ÿƒãx€„[àHÎ|zyA‚ €\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8`HÑ¥||y`&A‚CÓx„ãx8¡8HÑé/ƒ@¼ €TYP€’YHYLKÿýD``€8|øTþ8€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\8Bÿÿ/‚\@ž$€\ƒãx€| ¦| xN€!€8H€8```/€@žûlH\;ÀÿÿHT<_„ãx€BMÌ€bHÎ}<_8¢=?€BYPb<_YH‘iYLHÐ<_8¢=?€BYPb<_YH‘iYLH€<_¤ëx€BMÌ€bHÎ!<_8¤=?€BYPb<_YH‘iYLHt<_8¤=?€BYPb<_YH‘iYLH$€ZCÓx€| ¦| xN€!x A‚0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8@8¡D8a_8ƒ›R¼€rR”T„ãxHÁù|}yÀ&@‚<_„ãx€BG€bHÃyØ “¡P@‚X!¼ƒZG8€IR =?“A¨“A¤‘!¸"€A´“A “Aœ“Ax“A˜“A”“AR˜€A°‘"RœIÓxKÿø(£ëxHÁÑ€AP|~x"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!/ž;€“P@ž$ƒZG<_A¸IÓx“A¨“A¤“A H Œ<_8bñèA¸Ký8aL8T8¡PKüýí/ƒ@œ(ƒZG€A¼8“A¨“A¤"R €I“A H(HÅ/ƒaX@ž(ƒZG€A¼8“A¨“A¤"R €I“A Hô€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<Ÿ~£«x‚ÁX“X€„S$HÀI/ƒaX@ž4€A¼8"R €I!´ R˜!°IRœ!X/‰@ž\H„HÆI|}yA‚ÿÈ€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!9Áp¤ëx“X}ÃsxHÁH|€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!ƒ›R¼€rR”8X„ãxH¿u|}yÀ&@‚<_„ãx€BG€bHÀõØ “¡XA‚t£ëxH¿¡€AX|~x"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!/ž8XAž?œ€A¸8bñèKý8aX8\8¡`Küûá/ƒ@œ(ƒZG€A¼8“A¨“A¤"R €I“A H9Áp<Ÿ8„BL}ÃsxHÀ€AÀ€bR<_ƒ¢Sø¤ëxH¾‰|{y€&@‚<_¤ëx€BG€bHÀ ˜ “adA‚¤<ŸcÛx€„SÄH¾M/ƒahAžˆ€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!; 8`“¡dH¾¡/ƒadAž<=?iV@€K8BK)V@€Ad‘" €ah€dHÁé/ƒal@žHƒZG€A¼8“A¨“A¤"R €I“A !´“Aœ“Ax“A˜ R˜!°IRœBÓxH>8€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“¡h€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“¡d€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“¡l€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!“¡X€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!“¡\€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!“¡`€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!; €AT“¡L"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“¡T€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!“¡P;€<Ÿ€aH€„UÔHÁ-/ƒah@žX=?<_8‘!°=?A¼€BR ‘!´:G‘!¨"€A´R˜€A¨A¤€A°‘"Rœ!P/‰@žPHx8`H»Å/ƒadAžP€h=;` <€cG+T €I8BIkT €Ad‘b“ah€dH¾ù/ƒal@žL:G<_8A¼€BR ‘!¨=?‘!°=?‘!´"€A¨A¤€A´R˜€A°‘"RœKÿÿL€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!ƒºG“ad€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<Ÿ€Al8~ã»x€„SôlA¨Hº/ƒaXAžL8`Hº/ƒa\Až8!¨€I8BI!\€A¨I €aX€\H½Ù/ƒa`@žH=?<_“¡¤8 ‘!°=?A¼€BR ‘!´"``€A´R˜€A°‘"RœKÿþ0€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!;`€A\“aX"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!€]“a\8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<Ÿ€A`€a¨“a`€„SlA¤H¸µ/ƒaLAž8€H¼Á/ƒaT@ž<<_=?8!‘!°A¼"R <_A´€I!´ R˜!°IRœKÿý$€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!“aL€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“aTHø```€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!h8P/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!d8h/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!!l8d/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!X8l/‰Až0€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!!\8X/‰Až0€I8Bÿÿ/‚I@ž€a\€C€| ¦| xN€!!`8\/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!L8`/‰Až0€I8Bÿÿ/‚I@ž€aL€C€| ¦| xN€!!T8L/‰Až0€I8Bÿÿ/‚I@ž€aT€C€| ¦| xN€!<_; €BGP“¡T€bH¶/ƒ@ž0ƒZG<_A¸“A IÓx‘!œ‘!x‘!˜‘!”‘!Kÿì<_8bñèA¸Küö}8aP8h8¡dKüòM/ƒ@œ(ƒZG€A¼8"“A “Aœ"R €I“AxH4H¹ý/ƒal@ž@ƒZG€A¼8#“A “Aœ"R €I“Ax!´“A˜ R˜!°IRœBÓxH5”!¤€I8Bÿÿ/‚I@ž€I€a¤€| ¦| xN€!€Al“¡lA¤€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!“¡P€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“¡h€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“¡d?€a¤€›SœH³í/ƒaXAžø8`ÿÿH·¹/ƒa\Ažä8`H´e/ƒa`AžÐ=?; iSÔ€K8BK€A`)SÔ‘" €\€A`“¡\€aX€`H·™/ƒaLAž„€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!“¡X€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€aL“¡`H¶]|~xH²u|}yA‚LƒZG<_€BR “A “AœIÓx“Ax€<_“A˜“A”“AA¸“AŒ<_Rœ8$Hˆ€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!€›Sœ€a¤“¡LH²e/ƒaTAžô8`ÿÿH¶1/ƒalAžà8`H²Ý/ƒaPAžÌ=?iTt€K8BK€AP)Tt‘" €l€AP“¡l€aT€PH¶/ƒahAž„€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“¡T€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€ah“¡PH´Ù|{xH°ñ/ƒAžLƒZG<_€BR “A “AœIÓx“Ax€<_“A˜“A”“AA¸“AŒ<_Rœ8%H€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!€a<8hH·!/ƒ@žLƒZG<_€BR “A “AœIÓx“Ax€<_“A˜“A”“AA¸“AŒ<_Rœ8&Ht<Ÿ8„: H­å8€|rx<€cVKüïÁ/ƒad@ždƒZG<_€BR “A “AœIÓx“Ax€“A˜<_“A”“A“AŒA¸<_Rœ8'<_‘!ˆ‘!„‘!€‘!|R˜H1ƒºG€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€Ad<Ÿ: €„Tx’!d|CxA H¯µ/ƒa\Až˜<Ÿ€„S@H¯/ƒaXAž€€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!8`’!\H¯õ/ƒa`Až8!H€I8BI€H€A` €aX€`H³A/ƒaL@žX“¡œ“¡x<_“¡˜“¡”€BR €<_“¡“¡Œ“¡ˆA¸“¡„“¡€“¡|<_Rœ8(<_R˜H/À€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!: €A`’!X"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€]’!`8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€AL: ’!L|CxAœH´Q,@‚L“¡x“¡˜<_“¡”“¡€BR €<_“¡Œ“¡ˆ“¡„A¸“¡€“¡|<_Rœ8)Hx9¡ p|dx}£kxH¯/’@žl<€<€cUøH²¹/ƒalAžD8`H®%/ƒaTAž0€l<_€BGP ’Al€b€TH±y/ƒaP@žH“¡x“¡˜<_“¡”“¡€BR €<_“¡Œ“¡ˆ“¡„A¸“¡€“¡|<_RœH¼€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€aP8€8 ’ATKüâ•€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!“¡x’AP<_“¡˜“¡”“¡“¡Œ“¡ˆ“¡„€BR "<_“¡€“¡|A¸<_‘"Rœ8+<_R˜H-@<ŸÃxÇóxhÛx8„B´‰ãx~C“x}¥kx}ÊsxH«/ƒ@œ€<€<€cVDH±!/ƒahAžD8`H¬/ƒadAž0€h<_€BGP ’!h€b€dH¯á/ƒa\@žX=?<_“¡x“¡˜‘!°=?A¼8l€BR ‘!´"<_¬8/“¡”A¸€A°‘"Rœ!´ R˜HX€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€a\8€8 ’!dKüàí€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!<_8l’!\“¡x“¡˜“¡”"R A¼<_¬8/A°<_A´<_A¸€I!´ R˜!°IRœHŒ=?)G\‘!x€I8BI=9)ÿÿ/‰‘=@ž€]£ëx€| ¦| xN€!<Ÿ~óx€„SàHªA/ƒaXAž`8€H®M/ƒa`AžL€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!€a`’!XH©…/ƒaL@žT=?<_“¡˜8l‘!°=?A¼€BR ‘!´"<_¬81“¡”A¸€A°‘"Rœ!´ R˜H€€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!<_=?’!`“¡˜ƒÂFôéG: >€aLH­‘/ƒal@¾H¨¡|}y@‚|H 8H¨±/ƒaTAžh€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!€aT’!lH­)||y &@‚H¨9/ƒ@ž€~8ï€H¦…¸ “PA‚!˜€I8Bÿÿ/‚I@ž€I€a˜€| ¦| xN€!€AP€aT’!PA˜H¬µ||y &@‚H§Å/ƒ@ž€~8ï€H¦¸ “hA‚ !¤€I8Bÿÿ/‚I@ž€I€a¤€| ¦| xN€!€Ah€aT’!hA¤H¬A|iyA¢<€I8Bÿÿ/‚I@ž€I€| ¦| xN€!€~8ï€H¥…HH§/ƒA¾¤Hô€aT€C€| ¦| xN€!€a˜;€“TH­©,A‚|dx}£kxH¨µ<Ÿ€a¤€„S$H§E/ƒad@žd<_=?84‘!°A¼"R <_A´€I!´ R˜!°IRœ!\/‰@žtHœ€AT"9)ÿÿ/‰‘"@žÿhKÿÿLH­|}yA‚ÿ˜€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!¤ëx}Ãsx“dH§íH$€I8Bÿÿ/‚I@ž€a\€C€| ¦| xN€!!X’!\/‰Až0€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!!`’!X/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!l’!`/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!P’!l/‰Až0€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!h’!P/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!T’!h/‰Až0€I8Bÿÿ/‚I@ž€aT€C€| ¦| xN€!!d’!T/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!<_<8ƒbR¼€cR”ddÛxH¤™|}y€&@‚€odÛxH¦!˜ “¡\A‚€£ëxH¤Í€A\|}x"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!/8\Ažp<_9!l8bñèA¸‘!¬Küå1€¡¬8aX8`Küá/ƒAœ0<Ÿ}Ãsx8„BpH¥I€axH¤a/ƒAœ<@ž ƒxHÄ=?ƒ GX€X8BX€Ax"9)ÿÿ/‰‘"@ž !x€I}#Kx€| ¦| xN€!€AÀ€bR<_ƒ‚Sø„ãxH£m|}y`&@‚€o„ãxH¤õx “¡PA‚Ø<Ÿ£ëx€„SÄH£9/ƒahAž¼€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!; 8`“¡PH£/ƒaTAžp=?iVH€K8BK)VH€AT‘" €ah€TH¦Õ/ƒadAž8€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“¡h€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“¡T€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“¡d€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!; €A`“¡X"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!“¡`€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“¡l“x<Ÿ~C“x}¥kx}Æsx8„B H Q/ƒ@œø<€<€cVDH¦Y/ƒa\AžH8`H¡Å/ƒaPAž4€\<_;À€BGP “Á\€b€PH¥/ƒah@žD:G<_8lA¼€BR ‘!”=?‘!°=?‘!´"<_¬8AA¸H €AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€ah8€8 “ÁPKüÖ5€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!:G<_8l“ÁhA¼¬8A‘!”"R <_A°<_A´<_A¸€I!´ R˜!°IRœHØ€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!<Ÿ~ƒ£x“¡L€„SäHŸ/ƒaTAž`8€H£©/ƒadAžL€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€ad“¡THžá/ƒaX@žD:G<_8lA¼€BR ‘!”=?‘!°=?‘!´"<_¬8BA¸H ì€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€ZG“¡d: =ÿA”<_‚Fô€aXH£/ƒa`@¾Hž|}y@‚ˆHHž!/ƒalAž 4€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€al’!`H¢™||y &@‚H©/ƒ@ž€p8ï€H›õ¸ “\A‚ È!˜€I8Bÿÿ/‚I@ž€I€a˜€| ¦| xN€!€A\€al’!\A˜H¢%||y &@‚H5/ƒ@ž€p8ï€H›¸ “PA‚ T!”€I8Bÿÿ/‚I@ž€I€a”€| ¦| xN€!€AP€al’!PA”H¡±|iyA¢<€I8Bÿÿ/‚I@ž€I€| ¦| xN€!€p8ï€HšõHHœ/ƒA¾ˆ<_=?‘!°|IxA¼H ¼€al€C€| ¦| xN€!€a˜’!lH£ ,A‚ ¸|dx}£kxHž!”€I€B4/‚Až@€ /€Až4}#Kx8€Hžé||xHp€Al"9)ÿÿ/‰‘"@žÿ˜Kÿÿ|8`;€H 9|}yA‚@€a”¤ëxH¢e€]||x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!/œ“hAž 8ƒãxHŸa|xxH›y|}y@‚ €Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“¡h!”€I€B4/‚Až$€ /€Až}#Kx8€Hñ||xHT8`;€HŸ]|}yA‚@€a”¤ëxH¡‰€]||x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!/œ“LAž ”ƒãxHž…|{xHš|}y@‚ |€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!“¡L!”€I€B4/‚Až$€ /€Až}#Kx8€H||xHT8`;€Hž|}yA‚@€a”¤ëxH ­€]||x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!/œ“TAž ðƒãxH©||xH™Á|}y@‚ Ø€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!<ŸÃx“¡TgÛx8„BŒˆãx~C“x}¥kxH˜å/ƒ@œû8<€<€cVDHží/ƒadAžD8`HšY/ƒa`Až0€d<_€BGP “¡d€b€`H­/ƒa\@ž<=?<_8l‘!°=?A¼€BR ‘!´=?‘!¸"¬8IH €A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€a\8€8 “¡`KüÎÕ€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!<_=?“¡\8l‘!°A¼"R ¬<_8IA´<_A¸€I!´ R˜!°IRœH€€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!<Ÿ€aH“¡X€„UÄHå/ƒaP@žH<_=?8K‘!°A¼"R <_A´€I!´ R˜!°IRœ!L/‰@žìH8`H˜/ƒalAžÿ¬€P= <€cG+T˜€I8BIkT˜€Al‘b“¡P€lH›Å/ƒahAžÿd€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“¡l!¨€I8Bÿÿ/‚I@ž€I€a¨€| ¦| xN€!€Ah“¡hA¨€a¨H–Á/ƒa`@ž H ´€I8Bÿÿ/‚I@ž€aL€C€| ¦| xN€!!T8L/‰Až0€I8Bÿÿ/‚I@ž€aT€C€| ¦| xN€!!d8T/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!!`8d/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!\8`/‰Až0€I8Bÿÿ/‚I@ž€a\€C€| ¦| xN€!!X8\/‰Až0€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!!P8X/‰Až0€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!l8P/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!h8l/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!<_; €BGP“¡h€bH•-/ƒAž¬<_8bñèA¸KüÕÕ8aL8T8¡dKüÑ¥/ƒ@œ08l€A¼¬8L"R €I!´ R˜!°IRœHh<Ÿ€aH€„RðHš/ƒa`Až`8`H”í/ƒa\AžL€`= <€cG+T˜€I8BIkT˜€A\‘b“¡`€\H˜%/ƒaX@ž08l€A¼¬8M"R €I!´ R˜!°IRœHÄ€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!“¡\!¨€I8Bÿÿ/‚I@ž€I€a¨€| ¦| xN€!€AX“¡XA¨€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!“¡L€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“¡T€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“¡dKÿû˜€ZG=?8l‘!¸¬A”H˜:G<_A¼‘!”|IxH€ZG=?‘!¼A”€IR =?8l‘!°=?‘!´"<_¬81A¸H@€ZG=?8l‘!¼A”€IR =?‘!°=?‘!´"<_¬82A¸€A´R˜€A°‘"RœHð!¼8l€IR :G‘!”=?‘!¸"¬85Hx€A¼85"R €ZGA”€I!´ R˜!°IRœH˜€A¼87"R €ZGA”€I!´ R˜!°IRœHl!¼“x89€IR :G‘!”"€A´R˜€A°‘"RœH<=?<_‘!¼A°€IR =?8l‘!´=?‘!¸"¬8BHà=?<_8l‘!¼A°€IR =?‘!´=?‘!¸"¬8CH¨=?<_8l‘!¼A°€IR =?‘!´=?‘!¸"¬8DHp=?<_8l‘!¼A°€IR =?‘!´=?‘!¸"¬8EH8=?<_8l‘!¼A°€IR =?‘!´=?‘!¸"¬8F€A´R˜€A°‘"RœH=?8l‘!¸¬!P/‰Až0€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!l8P/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!h8l/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!`8h/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!\8`/‰Až0€I8Bÿÿ/‚I@ž€a\€C€| ¦| xN€!!X8\/‰Až0€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!!L8X/‰Až0€I8Bÿÿ/‚I@ž€aL€C€| ¦| xN€!!T8L/‰Až0€I8Bÿÿ/‚I@ž€aT€C€| ¦| xN€!!d8T/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!€A¸8d8bñèKüÎာ8aP8¡hKüʱ/ƒ@œDƒZG€A¼8N“A“AŒ"R €I!´“Aˆ“A„“A€“A| R˜!°IRœHh~C“xHŒ€aP€l€¡hKüÃ!ƒZG!¼8P“A“AŒ€IR "€A´“Aˆ“A„“A€“A|R˜€A°‘"RœH=?<_8T‘!´€BR "€A´R˜<_‘"RœHÔ=?<_8W‘!´€BR "€A´R˜<_‘"RœH¨=?<_8X‘!´€BR "€A´R˜<_‘"RœH|=?<_8Y‘!´€BR "€A´R˜<_‘"RœHP=?<_8R‘!´:G€BR ‘!"€A´R˜€AAŒ<_‘"Rœ!Œ‘!ˆ‘!„‘!€‘!|!T/‰@žtHœ€ZGAAŒAˆA„A€A|€a`HA/ƒa\@¾€Ý <Ÿ<¿€Bôh8„8¥Ÿ4€é €bHv…<_ƒ¼ô,8É€Bÿ̳ëx"HX€Y#Ëx€| ¦| xN€!```€Z "0ƒ)Ÿ>¿>_: ß`: €Zi(8B}߃Öå¼8BZ>9)‘>Hnu,a8@‚HN<_8çØóxÕóx€Bñ\×óxÙóx"<_‘"ñX<_ñTH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`ƒ8“¡8Hmé,a8@‚?>€]ñ\€’PñTñXHä€?>8ô=ñ\€IñTQñXH„€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!’a8Ãx€Z "(}) Hc¹/ƒ@œÀ?¿>?>8õ=ñ\€IñTQñX```!@/‰Až8€I8Bÿÿ/‚I@ž$€a@€C€| ¦| xN€!``!8’a@/‰Až4€I8Bÿÿ/‚I@ž €a8€C€| ¦| xN€!`<_;À€B帓Á8€bHc-,aÿ<_£ëx; ƒ7ÔL€Bà=<¿<ßÄóx8¥È8á|8ÆÑØ9LZ“:09!P9AT€Y8BY“:4``€Y8BY“:8€Y8BY“:<<_“¡H“¡|“¡`“¡d“¡h“¡l“¡p“¡t“¡xƒ¹€ãè<_kãì€Bãð;½T8X‘aX“¹A\8A\8Aß8Ëx8BZ!|€I8BIa\€K8BKƒÖßd€Yƒ¡|/ž8BY@ž$<_<Ÿ€BÔ|8„mœ€bHVMHd`€}žAžÄóxH^‘/ƒAžƒ¡|€\€À@ž¸Hh<_=€Þ <Ÿ<¿€BÔˆ8„m°8¥vÄ€é €bHUé““Œ<_8½€BßìÃxÃx"<_“ˆ‘"ßè<_ßäH3P=$€I8BIa\€K8Bÿÿ/‚K@ž€a\€C€| ¦| xN€!ƒ¡|€$\€]8B]:0€I8Bÿÿ/‚I@ž €z0€C€| ¦| xN€!`€|0!|i<€K8BK:4€I8Bÿÿ/‚I@ž €z4€C€| ¦| xN€!`€A|€<4€ALZ €P€AXZ$!\€I8BIz8€K8Bÿÿ/‚K@ž(€z8€C€| ¦| xN€!```€\<Ÿ8€A|€„àÈ€b€d€¡h“Á`€pßTHM9/ƒal@ž$‚÷ÔL€Aœ8Ý’á"ßì€I’áŒKÿþ¼€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“Ád€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“Áh€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!‚al:@“ÁlH``€aX|kHM/ƒapAžœ€P€aX|`HLý/ƒatAž€8`HI©/ƒaxAžl€p9` !t€Ax‘"‘at‘apHM¹/ƒaHAž<<Ÿ€¡|€„á˜HJý/ƒAœ$>€x€¡H€pßTHKÁ/ƒa`@ž$““Œ8á!œ€Ißì"“ˆH$p€Ax"9)ÿÿ/‰‘"@ž€ax€C€| ¦| xN€!;À€AH“Áx"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁH€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!8‚a``~c›x€S€| ¦| xN€!/ƒÿÿ|rx@ž$‚÷ÔL€Aœ8â’á"ßì€I’áŒKÿü\/ƒAô<_<ƒÂጀcßÜÄóxHGm||y &@‚<_Äóx€BÔh€bHHí¸ “dA‚¤<Ÿƒãx€„à HG1/ƒahAžˆ€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!;À8`“ÁdHG…/ƒalAž<=?iâÄ€K8BK)âÄ€Al‘" €ah€lHJÍ/ƒap@ž$‚÷ÔL€Aœ8ä’á"ßì€I’áŒKÿûP€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“Áh€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!€ap8€8 “ÁlKü{Ù€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!‚÷ÔL“Áp8ä€Aœ’á’ጒáˆ"ßì€I!” ßä!˜IßèH"€```|i¦93€AX|H.|P|I.€S!X|H€| PsAP|HZ"‰P@(€| | P€S€P|BBs}HX.!L|HZŠH@œ € | | P €S€L|A.9Bÿd€A|€/€Až €aLHHµ/ƒatAžd€aPHH¡/ƒaxAžP8`HEM/ƒaHAž<€t;À !x€AH‘"“Át“Áx€pßT€HHH•/ƒa`@ž$‚÷ÔL€Aœ8ò’á"ßì€I’áŒKÿù€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!€]“ÁH8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!ƒ`“Á`Hô``€B<ƒ‚€‚,<€I4/‚Až € /€AžƒãxHF|}xHT|ƒ#x; HGq|~yA‚@ƒãxÄóxHI€^|}x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/“¡dAžƒÖßd/ž@ž <_<Ÿ€BÔ|8„mœ€bHB]Hh€ÔLAž €}žAžÄóxHJ™/ƒAž€Y8Bÿÿ/‚Y@ždHH=?€]€Þ <Ÿ)Ôˆ8„v쀢 €iHAõ‚÷ÔL€Aœ8ô’á"ßì€I’áŒKÿ÷d€Y#Ëx€| ¦| xN€!/’8ƒ!dd@€<_: >?9ÀâÔLs€ |Kr€‚„Ažp€A|"<ƒ‰€\€B4/‚Až € /€AžƒãxHDm|}xHT|ƒ#x; HEÙ|~yA‚@ƒãxÄóxHH€^|}x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/“¡hAž(ƒÖßd/ž@¾,<_<Ÿ€BÔ|8„mœ€bH@ÅH```€ÔLAž €}ƒðAžÄóxHHõ/ƒAž€Y8Bÿÿ/‚Y@žHH,=?€]€Þ <Ÿ)Ôˆ8„v쀢 €iH@QHŒ€Y#Ëx€| ¦| xN€!8ƒ!hhƒÙ/ž@¾ 8`HAu/ƒalAžh1âÈ€I8BI<_€BÔ@€âÈ!l €b€lHD¹/ƒapAž,€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!€ap8€8 “ÁlKüv€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!‚÷ÔL“Áp8ù€Aœ’á’ጒáˆ"ßì€I!” ßä!˜IßèHÀ```s˜x@žx|Kr€b HC/ƒatAž€S|Br€bHC/ƒaxAžT8`H@-/ƒaHAž`€t;À !x€AH‘"“Át“ÁxHD=/ƒa`Až0<Ÿ%Ëx€„á˜HA/ƒAœ€pßT€H€¡`HBI/ƒadAžü€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁH€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€X“Á`8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!ƒd“Ád€XÃx€| ¦| xN€!/ƒÿÿ@¾H```8|NZÃx}æ{x'Ëx€¢€‚ € | ¦| xN€!/ƒÿþ@žÿ¤‘á‘áŒ8þ!œ€Ißì"‘áˆHü‚÷ÔL€Aœ8’á"ßì€I’áŒKÿò°```ƒx/›@ЃØ;€€€þ|N€‚ „8|ˆ#xA|è;xB€ŠAœ| x€T€Þ;¾€B> †}j| J|H}(J|¤XP}P|„P|çHP@ž „8@ž€A|"<€ I¸ “hA‚¤<Ÿƒãx€„à HÙ/ƒaHAžT€Ax"9)ÿÿ/‰‘"@ž€ax€C€| ¦| xN€!€aH8xH=Í|}xH9å|~yA‚(‚÷ÔL<_8€Bßì’á’áŒb’áˆH¬€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁH“ºÃx; €X€| ¦| xN€!z,~c›x€S€| ¦| xN€!<ß8 z(€ÆÔŒ€“šH8-ƒš/œ@L;À>ß: €A|€–á$"<€iH9/ƒa`AžÈ€Z,|U€bH=E/ƒadAž¬8`H9ñ/ƒahAž˜€d;` “ad€a`€hH=I/ƒalAžp€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!“a`€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!€al“ahH9-.Aø€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“al@’;½;Þ:µœð@žþÈ“º <Ÿ€A|€„àl"<€iH8=/ƒap@žH<_=?8'‘!˜Aœ"ßì<_A”€I!” ßä!˜Ißè!t/‰@žTH|H;I|}xH7a|~y@‚ÿ¬€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!“ÁpHh€I8Bÿÿ/‚I@ž€at€C€| ¦| xN€!!x8t/‰Až0€I8Bÿÿ/‚I@ž€ax€C€| ¦| xN€!!H8x/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!!d8H/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!!`8d/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!h8`/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!l8h/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!p8l/‰Až0€I8Bÿÿ/‚I@ž€ap€C€| ¦| xN€!<_<;`ƒ‚à€cßà“ap„ãxH5•|}yÀ&@‚<_„ãx€BÔh€bH7Ø “¡tA‚p£ëxH5Á€At|~x"9)ÿÿ/‰‘"@ž€at€C€| ¦| xN€!/ž“atAžð<8cÐKüv58ax8H8¡dKür/ƒ@œ$‚÷ÔL€Aœ8(’á"ßì€I’áŒKÿ鬀Ax"9)ÿÿ/‰‘"@ž€ax€C€| ¦| xN€!“ax€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“aH€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“ad; €A|<Ÿ€„à "<€iH4%/ƒa`AžPƒ×ÔL€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/€A`8`AAØHÀ=?ah8+€Ißì‘!œ=?‘!˜=?/‹‘!”"`€A”ßä€A˜‘"ßèAž0€K8Bÿÿ/‚K@ž€ah€C€| ¦| xN€!!l8h/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!p8l/‰Až0€I8Bÿÿ/‚I@ž€ap€C€| ¦| xN€!!t8p/‰Až0€I8Bÿÿ/‚I@ž€at€C€| ¦| xN€!!x8t/‰Až0€I8Bÿÿ/‚I@ž€ax€C€| ¦| xN€!!H8x/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!!d8H/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!!`8d/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!<_<;`ƒ‚à€cßà“a`„ãxH1}|}yÀ&@‚<_„ãx€BÔh€bH2ýØ “¡hA‚p£ëxH1©€Ah|~x"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!/ž“ahAž Ø<8cÐKür8al8p8¡tKümí/ƒ@œ$‚÷ÔL€Aœ8,’á"ßì€I’áŒKÿ唀Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“al€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!“ap€At"9)ÿÿ/‰‘"@ž€at€C€| ¦| xN€!‚÷ÔL;À“at’á’ጒáˆH‚÷ÔL;À’ጒáˆHìH4Ù/ƒax@ž0“ÁŒ<_8/€Bßì"<_“Áˆßä<_‘"ßèH  €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€Ax8xAŒ€A\‚ð@ž “ÁˆHT€A|<Ÿ€„àø"<€iH/Y/ƒaH@žL=?“Áˆ<_‘!˜=?Aœ€Bßì‘!”"€A”82ßä€A˜‘"ßè!t/‰@žüH$8`H//ƒadAž8!\€I8BI€\€Ad €aH€dH2é/ƒa`@ž(<_=?“ÁˆAœ€Bßì‘!˜=?‘!”Kÿÿp€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!; €Ad“¡H"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€^“¡d8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€A`“¡`Aˆ€z H1Í/ƒahAžd€zH1¹/ƒalAžP8`H.e/ƒ|bxapAž8€h€aŒ€ˆ !l€Ap‘"“¡h“¡l€¡pH.©/ƒ@œ<<_=?83‘!˜Aœ"ßì<_A”€I!” ßä!˜IßèKÿþ8€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!“¡pHô€I8Bÿÿ/‚I@ž€at€C€| ¦| xN€!!x8t/‰Až0€I8Bÿÿ/‚I@ž€ax€C€| ¦| xN€!!H8x/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!!d8H/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!!`8d/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!h8`/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!l8h/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!p8l/‰Až0€I8Bÿÿ/‚I@ž€ap€C€| ¦| xN€!<_;À€BÔH“Áp€bH+m/ƒAžä<8cÐKül8at8x8¡HKügé/ƒ@œ(€Aœ84"ßì€I!” ßä!˜IßèHœ€At"9)ÿÿ/‰‘"@ž€at€C€| ¦| xN€!“Át€Ax"9)ÿÿ/‰‘"@ž€ax€C€| ¦| xN€!“Áx€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁHƒš/œ@; >ß;`€A|€–á$"<€iH)õ/ƒadAžp€Z,|BÚ€bH-¹/ƒa`AžT8`H*e/ƒahAž@€`;À “Á`€ad€hH-½/ƒalAž€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“Ád€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!€al“ÁhH)¡.A €Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!8l@’ЀZ,|BÚ€b H,­/ƒapAžl€Z,|BÚ€bH,‘/ƒatAžP8`H)=/ƒaxAž<€p;À<Ÿ !t€Ax‘"“Áp“Át€A|€„àø"<€iH(Y/ƒaHAžø€Z,|BÚ€bH,/ƒa`AžÜ8`H(É/ƒadAžÈ€` “Á`€aH€dH,%/ƒahAž¤€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁH€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€h€¡x€aŒ“ÁdH(¡/ƒAœ$€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“Áh€Ax"9)ÿÿ/‰‘"@ž€ax€C€| ¦| xN€!“Áx;½;{œè@žüü€aŒH'y/ƒ@œ(<_8:=?€Bßìb<_ßä‘ißèH¬@ž ;ÀH°<_<ƒÂጀcßÜÄóxH&©||y &@‚<_Äóx€BÔh€bH()¸ “lA‚p<Ÿƒãx€„àLH&m/ƒapAžT€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!€ap; 8€“¡lH*=/ƒat@ž(<_8;=?€Bßìb<_ßä‘ißèHÌ€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!“¡p€Z<"9)ÿÿ/‰‘"@ž€z<€C€| ¦| xN€!€t8`<“¡tH&/ƒa`AžT!Œ€a€I8BI€AŒ!`I z<€K8BK€<€A`€`H)E/ƒaH@ž(<_8<=?€Bßìb<_ßä‘ißèHÔ€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!“¡`€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!;À“¡HHt‚÷ÔL€Aœ8÷’á"ßì€I’áŒKÿÙ4‚÷ÔL€Aœ8ù’á"ßì€I’áŒKÿÙ““Œ8ü!œ€Ißì"“ˆH ““Œ8û!œ€Ißì"“ˆ€A”ßä€A˜‘"ßèHÔ<_€BÔ €bH#Å‚÷ÔL!œ8’á€Ißì"€A”’ጒáˆßä€A˜‘"ßèH‚÷ÔL<_8"€Bßì’á’áŒb’áˆ<_=?ßä‘ißèH\<_87=?€Bßìb<_ßä‘ißèH8<_88=?€Bßìb<_ßä‘ißèH‚÷ÔL’á’ጒáˆ!`/‰Až8€I8Bÿÿ/‚I@ž$€a`€C€| ¦| xN€!``!d/‰Až8€I8Bÿÿ/‚I@ž$€ad€C€| ¦| xN€!``!h/‰Až8€I8Bÿÿ/‚I@ž$€ah€C€| ¦| xN€!``!l/‰Až8€I8Bÿÿ/‚I@ž$€al€C€| ¦| xN€!``!p/‰Až8€I8Bÿÿ/‚I@ž$€ap€C€| ¦| xN€!``!t/‰Až8€I8Bÿÿ/‚I@ž$€at€C€| ¦| xN€!``!x/‰Až8€I8Bÿÿ/‚I@ž$€ax€C€| ¦| xN€!``!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``<;Àÿÿ8cìKüb5€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`!€I8Bÿÿ/‚I@ž€I€a€| ¦| xN€!!Œ€I8Bÿÿ/‚I@ž€I€aŒ€| ¦| xN€!!ˆ€I8Bÿÿ/‚I@ž€I€aˆ€| ¦| xN€!€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€A|"9)ÿÿ/‰‘"@ž€a|€C€| ¦| xN€!€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!/ž@œl€Z8Bÿÿ/‚Z@ž(€ZCÓx;@€| ¦| xN€!H8`;@H,€A`"9)ÿÿ/‰‘"@žÍÿ????_?‚÷©ø?Ÿ?¿ƒ©üƒ9ª=_=ƒZªƒ{ªƒœª ƒ½ª:—ìJªkªL¡P8aL8P’ᤓ\“!`“Ad“ah“l“¡p‘At‘ax“Á|“Á„“Áˆ“ÁŒ“Á“Á˜“Áœ“Á “ÁX~ųx9|KüV/ƒ@œHÀ8h8Al€aL€P<¿~Ƴx88pA<8á¤@8At8x8¥Fd9\9!`ADH9AdHá/ƒ@ž¨!L/‰Až0€I8Bÿÿ/‚I@ž€aL€C€| ¦| xN€!!P/‰Až0€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!|/‰@žHŽè€I8Bÿÿ/‚IAžHŽÐ€a|;ÀHލ4ad>ƒ³šD9)‘4€K8BK!h€I8BIal€K8BK!p€I8BIat€K8BKAx€J8BJ=9) ‘=t0K<€J8BJ=9)ÿÿ/‰‘=@ž€]£ëx€| ¦| xN€!€T0€al‚¢° W½€>“a¬“a¨<_8ïoÛxpÛx€B¥ä:@qÛx"<_‘"¥à<_¥ÜH…(`!´€I8Bÿÿ/‚I@ž€I€a´€| ¦| xN€!€Aˆ;À<Ÿ“Áˆ€„¦èA´€uHÅ,aˆA‚o88`HQ,aŒA‚oh!´€I8BI!Œa´‘i €aˆ€ŒH,aA‚ox€Aˆ"9)ÿÿ/‰‘"@ž(€aˆ€C€| ¦| xN€!```“Áˆ€AŒ"9)ÿÿ/‰‘"@ž(€aŒ€C€| ¦| xN€!```“ÁŒ!°€I8Bÿÿ/‚I@ž(€I€a°€| ¦| xN€!```€A< ÿ8€“Á`¥ÿÿ|CxA°HÕ,aˆA‚nÔ!°€I€B4/‚Až$€ /€Až}#Kx8€H½|}xHT8`; H)||yA‚@€a°„ãxHU€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!,“¡ŒA‚nˆ€¡ˆ€a¸¤ëxH /ƒAœn´€AŒ"9)ÿÿ/‰‘"@ž(€aŒ€C€| ¦| xN€!```; €Aˆ“¡Œ"9)ÿÿ/‰‘"@ž$€aˆ€C€| ¦| xN€!``“¡ˆKÿüÜ€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!8„H,a@‚TN‚sšD<_8ò:@€B¥ä’a¬’a¨~o›x~p›x~q›x"<_‘"¥à<_¥ÜHà```ƒÓšD€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€€A/€A¬8@€A@ü=?=“Á¨:À‚ š@=?=ÿÍóx: ü‘aÐ:à‘!Ì9À;€``€u€§H),aˆA‚m4€T(|Bâ€bHí,aŒA‚mP8`H™,a„A‚mt€Œ;À “ÁŒ€aˆ€„Hñ,aA‚m„€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!“Áˆ€A„"9)ÿÿ/‰‘"@ž(€a„€C€| ¦| xN€!```€a“Á„HÉ/ƒa”Aœm4€A"9)ÿÿ/‰‘"@ž$€a€C€| ¦| xN€!``€”“Á/€@žd€h4(}¾kx|jx||J\H.1`ÿÿ|Kƒ#ƒc ƒ/‚A”AžÜ!¸€c€I€B4/‚AžD€ /€Až8|dx}#KxHí|~xHt€Aˆ"9)ÿÿ/‰‘"@žHt`;ÀH=|}yA‚D€a¸¤ëxHi€]|~x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/ž“ÁŒ@ž@=?<_‘!À=?AÄ€B¥ä‘!¼aÀ€’)¥Ü!Œ ¥à/‰@ž HLÃóxHe/ƒaˆAžÿ´€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!€aˆ’áŒHÝ|}yÀ&@‚(Hí/ƒ@ž<_<Ÿ€Bš88„BÄ€bH-Ø “¡„A‚ÿ<£ëxH™a”H±|~y@‚ÿ$€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!€aˆ“Á„‚A”HI|}yÀ&@‚(HY/ƒ@ž<_<Ÿ€Bš88„BÄ€bH™Ø “¡A‚þ¨£ëxHa”H|~y@‚þ€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!“Á€aˆƒÁ”Hµ|iyA‚H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bš88„BÄ€bHíKÿþH…/ƒ@žýøKÿýx€aˆ€C€| ¦| xN€!šð’áˆOÜàB|&Tÿþ/”@šˆHp``€I8Bÿÿ/‚I@ž €aŒ€C€| ¦| xN€!`!„’áŒ/‰Až4€I8Bÿÿ/‚I@ž €a„€C€| ¦| xN€!`!’á„/‰Až4€I8Bÿÿ/‚I@ž €a€C€| ¦| xN€!`!ˆ’á/‰Až4€I8Bÿÿ/‚I@ž €aˆ€C€| ¦| xN€!`€p’áˆH,a”A‚{ <8cFpKüPÁ8aŒ8„8¡KüL‘/ƒ@¼ø!Ä:@óšD8ýa¼.€I¥ä}ð{x}ñ{x"€AÀ ¥Ü‘"¥àH{`™OÝèB|&Tÿþ”€”/€@ž š@œ|’zP~Z“x™ð|&T÷þ/”Ašè|ò4(PÙóxHà```€d|jx1`ÿÿ|K/‚A”Až¸€T€£~¤«x~ƒ£xfÛxÃx€| ¦| xN€!,aˆA‚gÄ!¨€I8Bÿÿ/‚I@ž€I€a¨€| ¦| xN€!€Aˆ€ad8ˆ|DxA¨Hi/ƒaŒAž\!¨€I8Bÿÿ/‚I@ž€I€a¨€| ¦| xN€!€AŒCÓx; “¡ŒA¨HÕ/ƒaŒ@¾ØHœ=?<_a„8 ‘!À=?AÄ€B¥ä‘!¼/‹"`€A¼¥Ü€AÀ‘"¥àAž0€K8Bÿÿ/‚K@ž€a„€C€| ¦| xN€!!’á„/‰Až0€I8Bÿÿ/‚I@ž€a€C€| ¦| xN€!!ˆ’á/‰Až0€I8Bÿÿ/‚I@ž€aˆ€C€| ¦| xN€!!Œ’áˆ/‰Až0€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!€p’áŒH ,a”A‚f<8cFpKüM½8a„88¡ˆKüI/ƒ@¼ ô!Ä:@óšD8 a¼.€I¥ä}ð{x}ñ{x"€AÀ ¥Ü‘"¥àHx\<_:@óšD8€B¥ä.}ð{x}ñ{x"<_‘"¥à<_¥ÜHx$!Ì€a¨€‰¨XH ,|dxa„A‚et€aŒH,aA‚e˜€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!“¡Œ€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!cÛx“¡„HQ,|dxaˆA‚eP€aH 9,aŒA‚et€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!“¡€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!€aŒ“¡ˆH=a”H U/ƒ@že,€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!;À#ËxƒA”“ÁŒHi,a„A‚e€AЀa¨€‚¨`H m,|dxaA‚e,€a„Hõ,aˆA‚eP€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!“Á„€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!Ãx“ÁH ¹,|dxaŒA‚e€aˆH ¡,a„A‚e,€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!“Áˆ€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!€a„“ÁŒH ¥a”H½|~y &@‚dà€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!€AÌ€a¨“Á„ƒ!”€‚¨XHé,aA‚dÄH 9a”HQ|~y@‚dè€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!€AЀa¨“Áƒa”€‚¨`H,aˆA‚dÔH Ña”Hé|~y@‚dø€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!4(ƒ”“ÁˆH4(``a¬})â€i€K€B4/‚Až$€ /€Až|dx}c[xH A|~xHX;ÀH ±|}yA‚H€a¬¤ëxH Ý€]|~x8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``/ž“ÁŒ@žD<_=?=8‘!ÀAÄ‘a¼"¥ä€I!À ¥ÜI¥à!Œ/‰@žè€AŒ"9)ÿÿ/‰‘"@ž €aŒ€C€| ¦| xN€!`;Á”€aX€˜; Åóx“¡ŒHßÉ/ƒAœ>´€”!X @|”€I8Bÿÿ/‚I@ž(€aX€C€| ¦| xN€!```“¡X€A˜"9)ÿÿ/‰‘"@ž(€a˜€C€| ¦| xN€!```€”“¡˜/€Ažô€P€B4/‚Až$€ /€Až~ƒx8€HÝ|}xHT8`; HÞ‰||yA‚@~ƒx„ãxHീ\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ˆAž=°€O€B4/‚Až$€ /€Až}ã{x$ËxHÜ‘|}xHT#Ëx; HÝý||yA‚@}ã{x„ãxHà)€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až=H€]€B4/‚Až$€ /€Až£ëx8€HÜ||xHT8`;€HÝq|{yA‚@£ëxdÛxH߀[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“Až<à€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!€aˆ€Åóx; “¡ HÝ9/ƒAœ<´€”!ˆ @|”€I8Bÿÿ/‚I@ž€aˆ€C€| ¦| xN€!“¡ˆ€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!€”“¡/€Až|€P€B4/‚Až$€ /€Až~ƒx8€HÚ¥|}xHT8`; HÜ||yA‚@~ƒx„ãxHÞ=€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡œAž;È€O€B4/‚Až$€ /€Až}ã{x$ËxHÚ|}xHT#Ëx; HÛ…||yA‚@}ã{x„ãxHݱ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡„Až;`€]€B4/‚Až$€ /€Až£ëx8€HÙ||xHT8`;€HÚù|{yA‚@£ëxdÛxHÝ%€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ŒAž:ø€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!’á„€P€B4/‚Až$€ /€Až~ƒx8€HØÍ|}xHT8`; HÚ9||yA‚@~ƒx„ãxHÜe€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡XAž:\€O€B4/‚Až$€ /€Až}ã{x$ËxHØA|}xHT#Ëx; HÙ­||yA‚@}ã{x„ãxHÛÙ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až9ô€]€B4/‚Až$€ /€Až£ëx8€H×µ||xHT8`;€HÙ!|{yA‚@£ëxdÛxHÛM€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ Až9Œ€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!; 8`“¡˜HÕQ/ƒaˆAž9d€œ !Œ€Aˆ‘"€X€Aˆ! €Aˆ‘"“¡ “¡œ“¡Œ“¡X€O€B4/‚Až$€ /€Až}ã{xÃxHÖ¡|}xHTÃx; HØ ||yA‚@}ã{x„ãxHÚ9€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡Až8À€]€B4/‚Až$€ /€Až£ëx8€HÖ||xHT8`;€H×|{yA‚@£ëxdÛxHÙ­€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“„Až8X€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!’ს„ƒaˆ€]€B4/‚Až(€ /€Až£ëxeÛx8€ÿÿHÕ‰|}xHT8`ÿÿHÖ¹||yA‚L£ëxeÛx„ãxHÓá€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/@¼(<_85€B¥ä"<_¥Ü‘.¥àH>x`€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!; €Aˆ“¡„"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!“¡ˆH¨€O€B4/‚Až$€ /€Až}ã{xÃxHÔ-|}xHTÃx; HÕ™||yA‚@}ã{x„ãxH×Å€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až6˜€]€B4/‚Až$€ /€Až£ëx8€HÓ¡||xHT8`;€HÕ |{yA‚@£ëxdÛxH×9€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“œAž60€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!<Ÿ€aœ; €„¦€“¡˜HЕ/ƒaŒAž6€Aœ"9)ÿÿ/‰‘"@ž€aœ€C€| ¦| xN€!“¡œ€O€B4/‚Až$€ /€Až}ã{x$ËxHÒ|}xHT#Ëx; HÓù||yA‚@}ã{x„ãxHÖ%€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡XAž5d£ëx8€8 HÖù/ƒa Až5l€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!; 8`“¡XHÐ /ƒ|bxaAž5@€ €mšp “¡ €HÓe/ƒaˆAž5@€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!8`“¡HÏ/ƒa„Až5€ˆ “¡ˆ€aŒ€„HÒù/ƒa˜Až5€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!“¡Œ€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!“¡„€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!“¡˜Hà€I8Bÿÿ/‚I@ž€a€C€| ¦| xN€!!œ’á/‰Až0€I8Bÿÿ/‚I@ž€aœ€C€| ¦| xN€!!„’áœ/‰Až0€I8Bÿÿ/‚I@ž€a„€C€| ¦| xN€!!˜’á„/‰Až0€I8Bÿÿ/‚I@ž€a˜€C€| ¦| xN€!!Œ’á˜/‰Až0€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!! ’áŒ/‰Až0€I8Bÿÿ/‚I@ž€a €C€| ¦| xN€!!ˆ’á /‰Až0€I8Bÿÿ/‚I@ž€aˆ€C€| ¦| xN€!<_’ሀBš€€bHÌå/ƒa”Až8ˆ<8cFpKü 8a8œ8¡„Kü ]/ƒAœ2È€O€B4/‚Až$€ /€Až}ã{xÃxHÎ|}xHTÃx; HÏù||yA‚@}ã{x„ãxHÒ%€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až2`€]€B4/‚Až$€ /€Až£ëx8€HÎ||xHT8`;€HÏm|{yA‚@£ëxdÛxHÑ™€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ŒAž1ø€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!’ᘀO€B4/‚Až$€ /€Až}ã{x$ËxHÍA|}xHT#Ëx; Hέ||yA‚@}ã{x„ãxHÐÙ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až1\€]€B4/‚Až$€ /€Až£ëx8€H̵||xHT8`;€HÎ!|{yA‚@£ëxdÛxHÐM€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ˆAž0ô€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!€aŒ€ˆ; €¡È“¡ HÍé/ƒAœ0È€€!Œ @|€€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!“¡Œ€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!€€“¡ˆ/€Až œ€O€B4/‚Až$€ /€Až}ã{xÃxHËU|}xHTÃx; HÌÁ||yA‚@}ã{x„ãxHÎí€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až/Ü€]€B4/‚Až$€ /€Až£ëx8€HÊÉ||xHT8`;€HÌ5|{yA‚@£ëxdÛxHÎa€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ Až/t€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!’ᘀO€B4/‚Až$€ /€Až}ã{x$ËxHÊ |}xHT#Ëx; HËu||yA‚@}ã{x„ãxHÍ¡€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ŒAž.Ø€]€B4/‚Až$€ /€Až£ëx8€HÉ}||xHT8`;€HÊé|{yA‚@£ëxdÛxHÍ€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ˆAž.p€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!€a €ˆ; €¡È“¡ŒHʱ/ƒAœ.D€€!  @|€€I8Bÿÿ/‚I@ž€a €C€| ¦| xN€!“¡ €Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!€€“¡ˆ/€Ažd€O€B4/‚Až$€ /€Až}ã{xÃxHÈ|}xHTÃx; Hɉ||yA‚@}ã{x„ãxH˵€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až-X€]€B4/‚Až$€ /€Až£ëx8€HÇ‘||xHT8`;€HÈý|{yA‚@£ëxdÛxHË)€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ŒAž,ð€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!’ᘀO€B4/‚Až$€ /€Až}ã{x$ËxHÆÑ|}xHT#Ëx; HÈ=||yA‚@}ã{x„ãxHÊi€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až,T€]€B4/‚Až$€ /€Až£ëx8€HÆE||xHT8`;€HDZ|{yA‚@£ëxdÛxHÉÝ€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ˆAž+ì€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!’á €O€B4/‚Až$€ /€Až}ã{xÃxHÅ…|}xHTÃx; HÆñ||yA‚@}ã{x„ãxHÉ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až+P€]€B4/‚Až$€ /€Až£ëx8€HÄù||xHT8`;€HÆe|{yA‚@£ëxdÛxHÈ‘€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ Až*è€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!’ᘀO€B4/‚Až$€ /€Až}ã{x$ËxHÄ9|}xHT#Ëx; HÅ¥||yA‚@}ã{x„ãxHÇÑ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až*L€]€B4/‚Až$€ /€Až£ëx8€Hí||xHT8`;€HÅ|{yA‚@£ëxdÛxHÇE€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“XAž)ä€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!; 8`“¡˜HÁI/ƒ|bxa˜Až)¸€Œ8` !ˆ€A˜‘"€ €A˜!X€A˜‘"“¡Œ“¡ˆ“¡ “¡XHÁÕ/ƒaŒAž)Œ€C €˜“¡˜€O€B4/‚Až$€ /€Až}ã{xÃxHÂq|}xHTÃx; HÃÝ||yA‚@}ã{x„ãxHÆ €\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ˆAž)€]ƒaŒ€B4/‚Až(€ /€Až£ëxeÛx8€HÂ|}xHT8`HÃM||yA‚L£ëxeÛx„ãxHÀu€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/@¼,€AÄaÀ80"¥ä€I!¼K¥à ¥ÜH+`€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!; €AŒ“¡ˆ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!“¡ŒH€O€B4/‚Až$€ /€Až}ã{xÃxHÀ½|}xHTÃx; HÂ)||yA‚@}ã{x„ãxHÄU€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až'ˆ£ëx8€8 HÅ)/ƒaXAž'€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!; 8`“¡ H¾=/ƒ|bxa˜Až'd€X=?ƒiš¸ “¡XcÛx€˜HÁ/ƒaŒAž'\€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!“¡˜€O€B4/‚Až$€ /€Až}ã{x$ËxH¿e|}xHT#Ëx; HÀÑ||yA‚@}ã{x„ãxHÂý€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ˆAž&À£ëx8€8 HÃÑ/ƒa Až&È€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!; 8`“¡ˆH¼å/ƒ|bxaXAž&œ€ cÛx “¡ €XHÀ=/ƒa˜Až&œ€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!8`“¡XH½U/ƒaˆAž&x# €Œ €Aˆ€˜" “¡˜“¡Œ€O€B4/‚Až$€ /€Až}ã{xÃxH½Ý|}xHTÃx; H¿I||yA‚@}ã{x„ãxHÁu€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až%ì€]ƒaˆ€B4/‚Až(€ /€Až£ëxeÛx8€H½‰|}xHT8`H¾¹||yA‚L£ëxeÛx„ãxH»á€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/@¼(€AÄaÀ82"¥ä€I!¼K¥à ¥ÜH&t€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!; €Aˆ“¡ "9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!“¡ˆ€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!; €Aœ“¡"9)ÿÿ/‰‘"@ž€aœ€C€| ¦| xN€!“¡œ€A„"9)ÿÿ/‰‘"@ž$€a„€C€| ¦| xN€!``“¡„˜È|&Tïþ/€Aš\€O€B4/‚Až$€ /€Až}ã{x$ËxH»q|}xHX#Ëx; H¼Ý||yA‚D}ã{x„ãxH¿ €\|}x8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`/“¡œAž# €]€B4/‚Až$€ /€Až£ëx8€Hºá||xHX8`;€H¼M|{yA‚D£ëxdÛxH¾y€[||x8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`/œ“XAž#4€Aœ"9)ÿÿ/‰‘"@ž €aœ€C€| ¦| xN€!`’ᜀO€B4/‚Až$€ /€Až}ã{xÃxHº|}xH`Ãx; H»…||yA‚L}ã{x„ãxH½±€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/“¡ Až"ˆ€]ƒaX€B4/‚Až(€ /€Až£ëxeÛx8€H¹¹|}xH`8`Hºé||yA‚X£ëxeÛx„ãxH¸€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/@¼,<_89€B¥ä"<_¥Ü‘.¥àH"œ``€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!; €AX“¡ "9)ÿÿ/‰‘"@ž$€aX€C€| ¦| xN€!``“¡X€O€B4/‚Až$€ /€Až}ã{x$ËxH¸I|}xH`#Ëx; H¹µ||yA‚L}ã{x„ãxH»á€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/“¡Až Ü€]€B4/‚Až$€ /€Až£ëx8€H·±||xHX8`;€H¹|{yA‚D£ëxdÛxH»I€[||x8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`/œ“ˆAž p€A"9)ÿÿ/‰‘"@ž €a€C€| ¦| xN€!`’á€O€B4/‚Až$€ /€Až}ã{xÃxH¶é|}xH`Ãx; H¸U||yA‚L}ã{x„ãxHº€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/“¡ŒAžÄ€]ƒaˆ€B4/‚Až(€ /€Až£ëxeÛx8€H¶‰|}xH`8`H·¹||yA‚X£ëxeÛx„ãxH´á€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/@¼,<_8:€B¥ä"<_¥Ü‘.¥àHl``€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!; €Aˆ“¡Œ"9)ÿÿ/‰‘"@ž$€aˆ€C€| ¦| xN€!``“¡ˆ;9–È@ž½„8˜< ÿ}ã{x`¥ÿÿH´á/ƒ@¼(<_8;=?€B¥äb<_¥Ü‘i¥àH¤}ã{xH²-/ƒa„@¾4<_8<=?€B¥äb<_¥Ü‘i¥àHl``€a„H¶­/ƒa˜@ž@H±½/ƒA¾@<_8<=?€B¥äb<_¥Ü‘i¥àH ```€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`8‚!˜˜€Q€B4/‚Až(€ /€Až~#‹x8€H´|}xHX`8`; Hµi||yA‚@~#‹x„ãxH·•€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡œAž£ëxH·1/ƒÿÿ|}x@žD<_=?=8>‘!ÀAÄ‘a¼"¥ä€I!À ¥ÜI¥àH0```€Aœ"9)ÿÿ/‰‘"@ž€aœ€C€| ¦| xN€!k  @|8@/€Aœ”AžþD€Q€B4/‚Až(€ /€Až€³šD~#‹x8€H³ |}xH`8`H´9|~yA‚X€³šD~#‹xÄóxH±a€^|}x8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```/@œý¬<_=?=8?‘!ÀAÄ‘a¼"¥ä€I!À ¥ÜI¥à``!X/‰Až8€I8Bÿÿ/‚I@ž$€aX€C€| ¦| xN€!``! 8X/‰Až0€I8Bÿÿ/‚I@ž€a €C€| ¦| xN€!!8 /‰Až0€I8Bÿÿ/‚I@ž€a€C€| ¦| xN€!!ˆ8/‰Až0€I8Bÿÿ/‚I@ž€aˆ€C€| ¦| xN€!!Œ8ˆ/‰Až0€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!!˜8Œ/‰Až0€I8Bÿÿ/‚I@ž€a˜€C€| ¦| xN€!!œ8˜/‰Až0€I8Bÿÿ/‚I@ž€aœ€C€| ¦| xN€!<_;À€Bš€“Áœ€bH®M/ƒa€Ažð<8cFpKûîõ8aX8 8¡KûêÅ/ƒAœŒ€AX"9)ÿÿ/‰‘"@ž$€aX€C€| ¦| xN€!``“ÁX€A "9)ÿÿ/‰‘"@ž(€a €C€| ¦| xN€!```“Á €A"9)ÿÿ/‰‘"@ž(€a€C€| ¦| xN€!```€a„“ÁKÿú¬€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!8„Kÿ­¬€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!<Ÿ€a|€„§¬H´,a” &@€8WÞ€>Ð WÞ€><_8C:@€B¥ä"<_¥Ü<_‘"¥àHL@‚<Ÿ€a|€„§°H´),a”À&@€8Wœ€> Wœ€><_8C:@€B¥ä"<_¥Ü<_‘"¥àHô@‚¨<Ÿ€a|€„§\H³Ñ/ƒa”@œ8W½€>° W½€><_8D:@€B¥ä"<_¥Ü<_‘"¥àH @žT<Ÿ€a|€„§DH³}/ƒa”@œ8WÞ€>Ð WÞ€><_8D:@€B¥ä"<_¥Ü<_‘"¥àHL€”/€Až<Ÿ~ƒ£x€„¦ÐH«!,aˆ@‚0N<_8E:@€B¥ä"<_¥Ü<_‘"¥àHø8`H«,aŒ@‚0N<_8E:@€B¥ä"<_¥Ü<_‘"¥àH¸!¬€I8BI!Œa¬‘i €aˆ€Œ€¡|H­,a˜@‚0N<_8E:@€B¥ä"<_¥Ü<_‘"¥àHT€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!;À€AŒ“Áˆ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!“ÁŒ€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!“Á˜!¬€I}>Kx8BIHÜ``N‚sšD<_8ð:@€B¥ä’a¬’a¨~o›x~p›x~q›x"<_‘"¥à<_¥ÜHPN‚sšD<_8ð:@€B¥ä’a¬’a¨~o›x~p›x~q›x"<_‘"¥à<_¥ÜH N‚sšD<_8ð:@€B¥ä’a¬’a¨~o›x~p›x~q›x"<_‘"¥à<_¥ÜHÈN‚sšD<_8ñ:@€B¥ä’a¬’a¨~o›x~p›x~q›x"<_‘"¥à<_¥ÜH„N‚sšD<_8ñ:@€B¥ä’a¬’a¨~o›x~p›x~q›x"<_‘"¥à<_¥ÜH@‚sšD<_:@8ñ€B¥ä.’a¬’a¨~o›x~p›x~q›x"<_‘"¥à<_¥ÜHüN<_óšD8ô:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHÄN<_óšD8ô:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHŒN<_óšD8ô:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHTN<_óšD8ô:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜH<_:@óšD8ô€B¥ä.}ð{x}ñ{x"<_‘"¥à<_¥ÜHäN<_8}¯kx}°kx€B¥ä:@}±kx"<_‘"¥à<_¥ÜH¬NóšD:@}ð{x}ñ{xH”N<_8ÏóxÐóx€B¥ä:@Ñóx"<_‘"¥à<_¥ÜH\N<_8ÏóxÐóx€B¥ä:@Ñóx"<_‘"¥à<_¥ÜH$N<_8ÏóxÐóx€B¥ä:@Ñóx"<_‘"¥à<_¥ÜHìN<_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜH´<_:@óšD8€B¥ä.}ð{x}ñ{x"<_‘"¥à<_¥ÜH|N<_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHDN<_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜH N<_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHÔN<_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHœN<_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHd<_:@óšD8€B¥ä.}ð{x}ñ{x"<_‘"¥à<_¥ÜH,N<_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHôW½€>° W½€><_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜH´N<_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜH|W½€>° W½€><_óšD8:@€B¥ä}ð{x}ñ{x"<_‘"¥à<_¥ÜHKx‘!l‘!h8BIH@ƒÚ 4€P|òx1 ÿÿ|I/‚A`Až°>ß>¿ƒ¶(€uĤëxH„™||y@‚P<_¤ëx“Ál“Áh€B PÛóx€bH†<_8O=?€BÔb<_Ì‘iÐH¬``<Ÿ€„0H„9.|{x@’D~@&VR€“Ál<_; :`M€BÔ:€: &W€M"“ÁhH@€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!ƒÖ(€uÄÄóxHƒ±|}y&@‚`M<_Äóx~@&€B P:`:€€bH…!<_€BÔb8O<_=?Ì‘iÐ: €Z 4-•AhAlHŒ<Ÿ€„ìHƒ=||y@‚8M<_8O~@&€BÔ:`:€"<_‘"Ð<_ÌKÿÿ¤€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!ƒÁL€^€B4/‚Až$€ /€AžÃóx8€H… |}xH\8`H†y|xy@‚&; HLÃóxÃxHˆ™€X|}x8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!,&@‚@: 4: <_:`:€-€BÔ‘!l~@&VR@Mˆ"al‘ahHTƒÁL€^€B4/‚Až$€ /€AžÃóx8€H„5|sxH\8`H…¥|wy@‚~@&:`HLÃóx~ä»xH‡Å€W|sx8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!,~@&@‚4: 4<_: :€€BÔ-•‘!lM "al‘ahHŒ8`HÑ-|tx@Š,Mˆ€Z 4: Al<_€BÔal"‘ahHP€ATƒãx~„£x"9)‘"€T“´’t H„ñ|}y&@‚8M€€Z 4:`: ~@&Al<_€BÔ`al"‘ahHä€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€T8Bÿÿ/‚T@ž€T~ƒ£x€| ¦| xN€!ƒÖ(€uÄÄóxH€)|sy~@&@‚,M<_Äóx:€€B P€bH¡<_€BÔH¤<Ÿ€„\Hé||y@‚0M<_8P:€€BÔ"<_Ì<_‘"ÐKÿüX€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!‚áL€W€B4/‚Až$€ /€Až~ã»x8€H½|txH\8`Hƒ-|~y@‚M:€HH~ã»xÄóxH…M€^|tx8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!-@Š0: 4: <_:`-•€BÔ‘!l~@&VR`"H\‚áL€W€B4/‚Až$€ /€Až~ã»x8€H€ý|sxH\8`H‚m|~y@‚~@&:`HL~ã»xÄóxH„€^|sx8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!,~@&@‚$: 4<_: €BÔ-•‘!l"H¤8`H~©-ƒ|ux@Ž8€Z 48PAl<_€BÔal"<_Ì<_‘ah‘"ÐKÿóä€Y8ƒãx~¤«x"9)‘"€8’•’u H½-|tx@ŠD~@&VR@€Z 4:`Al<_€BÔ"<_al8P‘"Ð<_‘ahÌKÿól€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!ƒL€\€B4/‚Až$€ /€Ažƒãx8€H-|sxH`8`H€|~y@‚~@&:`HP`ƒãxÄóxH‚¹€^|sx8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!,~@&@‚(<_€BÔb8P<_=?Ì‘iÐKÿøÜ8`H|Ñ||y@‚<_€BÔKÿø¨€YcÛx„ãx8BY“¼’œ’|“< H€|vy@‚X~@&: 4<_; :`:€M€€BÔ: &‘!lMal"‘ah<_8O‘"Ð<_ÌKÿñ´€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!ƒÚ 4€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~óx€„¬H{|}y&@‚4M“Áh<_:`~@&€BÔ:€: M€"’ÁlH8`H{]-|tx@Š0~@&VR@“Áh’Ál<_:`Mˆ€BÔ: "HÐHa|sy~@&@‚$M€“Áh’Ál<_: €BÔ"H <Ÿ€¡P€„ H|…/ƒAœ4<Ÿ€¡H~c›x€„LH|i/ƒAœ€\~c›xH/ƒ@œ$“Áh’Ál<_: €BÔ-•"H8£ëx~„£x~e›xH|ý|wy@‚ß<8€ƒ6ê8BW€K8BK!<€I8BIa@€K8BK9€cøÄ9)‘9Kû¬…|uy@‚L<_8c>Ëx4Ëx€Bö00Ëx2Ëx1Ëx3Ëx"<_‘"ö,<_ö(H à```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€@€È@ž˜<Ÿ~ã»x€„÷Hl™|~y@‚@<_8e4Ëx0Ëx€Bö0~¾«x2Ëx1Ëx3Ëx"<_‘"ö,<_ö(H D€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!“Á@```70i<€K8BK99)ÿÿ/‰‘9@ž€Y#Ëx€| ¦| xN€!a<€W0ƒÖê+ƒ"<9)‘+€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``<Ÿ€aD‚<€„÷pHkq|xy@‚˜HD<_8i=?€Bö0b<_ö(‘iö,HÀ<_8j=?€Bö0b<_ö(‘iö,Hœ>ö08m€Iö(\ö,H„<_8r=?€Bö0b<_ö(‘iö,H````8€Hní/ƒaH@ž`<_8hÐóxÒóx€Bö0ÑóxÓóx"<_ö(<_‘"ö,```€X~¾«x8Bÿÿ/‚X@ž \H 8`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€aHHiÍ|xy@‚<<_ÐóxÒóx8h€Bö0~¾«x~ƒx~ƒx"<_‘"ö,<_ö(HÜ€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!8ÐóxÒóxÑóxHÓóxÃxHmý/ƒaH@¾ Hi /ƒ@žÐH```Hi/ƒaLAž°€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!€aL8HHm…|}yÀ&@‚(Hh•/ƒ@ž<_<Ÿ€Bê„8„“€bHfÕØ “¡HA‚4€P8Bÿÿ/‚P@ž$€P~ƒx€| ¦| xN€!``€aL8‚HHHm|}yÀ&@‚4Hh/ƒ@ž(<_<Ÿ€Bê„8„“€bHfQ```Ø “¡HA‚¤€R8Bÿÿ/‚R@ž$€R~C“x€| ¦| xN€!``€aL8‚AHHHlq|iyA¢H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bê„8„“€bHe©HHgA/ƒA¾ X<_8h=?€Bö0b<_ö(‘iö,Kÿý€aL€C€| ¦| xN€!``8~ƒxLHjÅ|~xHfÝ|}y@¢ûô€WÅóx~ã»x$Ëx8À8à€| ¦| xN€!/ƒaHA¾ûÀ€Q8Bÿÿ/‚Q@ž€Q~#‹x€| ¦| xN€!€ê‚!H“¡H”AžÐ<Ÿ~£«x€„öhHfÑ/ƒaLA¾ûˆ|dx~ƒ£xHhy/ƒÿÿ|~xA¾ûp€AL"9)ÿÿ/‰‘"@ž$€aL€C€| ¦| xN€!``/ž“¡L@žX~ƒ£x~$‹xHl}/ƒaHAž`€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€H“ÁH<~C“xHl /ƒÿÿ||x@¾ÀH``?ßaL?Ÿ?¿8l€^ö0/‹"ö(‘<ö,Až0€K8Bÿÿ/‚K@ž€aL€C€| ¦| xN€!!H8L/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!<_8€BêŒH€bHe¥/ƒA¾ú¼<8c— Kû¦Q8aL8H8¡PKû¢!/ƒA¼ú€aD~ƒxHl/ƒ@œûd>ö08n€Iö(\ö,Kÿúl<_8q=?€Bö0b<_ö(‘iö,KÿúH`;`;@``€R€B4/‚Až$€ /€Až~C“xdÛxHfí|~xHTcÛx;ÀHhY|}yA‚@~C“x¤ëxHj…€]|~x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!/ž“ÁLA¾ù(8`HdÁ/ƒaHA¾ù€Q;À8BQ!H’) €L€AH“ÁLHhÉ/ƒaPA¾øÜ<Ÿ€¡<€„÷üHf /ƒA¼øÄ€aP€8Hj¹/ƒA¼ø°€a@€H€¡PHfÁ/ƒaLA¾ø”€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁH€AP"9)ÿÿ/‰‘"@ž(€aP€C€| ¦| xN€!```“ÁP€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!‚aL€ê“ÁL“AžÄ€R€B4/‚Až0€ /€Až$~C“xDÓx~e›xHeU|}xH\``CÓxHf}|~yA‚L~C“xÄóx~e›xHc¥€^|}x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/@¼,<_8u=?€Bö0b<_ ö(‘bö,Kÿ÷¨`;Z;{›à@žýd/š@žL``€aD~ƒxHiy/ƒ@œøP<_8x=?€Bö0b<_ö(‘iö,Kÿ÷L``œÐ@ø< ÿDÓx~C“x`¥ÿÿHcÉ/ƒ@œø<_8z=?€Bö0b<_ö(‘iö,Kÿöü€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!6ê~¾«x€I}=Kx8BIHô€XÃx~¾«x€| ¦| xN€!`!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``!L/‰Až8€I8Bÿÿ/‚I@ž$€aL€C€| ¦| xN€!``!P/‰Až8€I8Bÿÿ/‚I@ž$€aP€C€| ¦| xN€!``<; 8c—ÈKû¡e!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€P8Bÿÿ/‚P@ž €P~ƒx€| ¦| xN€!`€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!!¼/‰Až8€I8Bÿÿ/‚I@ž$€a¼€C€| ¦| xN€!``!À/‰Ažx€I8Bÿÿ/‚I@žd€aÀ€C€| ¦| xN€!HH`; H<``€AL"9)ÿÿ/‰‘"@žõÜKÿõ¸`/ƒAø|Kÿû8`8! £ëx€ºÿÀ|¦N€ ``|¦½¡ÿ¤ÛÁÿðÛáÿøBŸ|vx8Àè¦8à8”!þ9 <_?_??Ÿ?¿=_=ƒZ訃{謃œè°ƒ½è´;ÂÖ´Jè¸k輌¡8aŒ8t“AL“aP“T“¡X‘A\‘a`xdlpÅóx9dKû•1/ƒ@œH„$8X€aŒ€<¿8A\8Æóx8`8¥†dA<8áx@9L9!P9ATH^•/ƒ@ž¬!Œ/‰Až0€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!!/‰Až0€I8Bÿÿ/‚I@ž€a€C€| ¦| xN€!!d/‰@žHƒ\€I8Bÿÿ/‚IAžHƒD€ad;ÀHƒ`6ax>¿ƒµØ¼9)‘6€K8BK!L€I8BIaP€K8BK!T€I8BIaX€K8BK!\€I8BIa`€K8BK=9)‘=v0K<€J8BJ=9)ÿÿ/‰‘=@ž€]£ëx€| ¦| xN€!ƒT€V0€êx! | ‚‚àC0<_Œ’áˆË‰d``Ȉüð(ÿàü øHÿa|byA°} &‘!ìA¢¾¨8h€X|xØHýù/ƒA¼¾ì€h!°Tþh€I8Bÿÿ/‚I@ž€I€a°€| ¦| xN€!‚h, &@‚¤ÃxHÿ]/ƒÿÿA¾¾ül`€’á”`È!ü!ð(ü ì?$Hþ±,atA¢¿0€\€¡ØHýY/ƒA¼¿ˆ€h!tTþh€I8Bÿÿ/‚I@ž€at€C€| ¦| xN€!ƒ¡h’t/AžX€A¼€ؼ|@x1 ÿÿ|I/‚AHAž¨€aLHù/ƒahA¼¿lAž\<Ÿ}Ãsx€„äøHø},alA¢¿À<_<ƒ¢æ°€cäL¤ëxHøY|byA¬} &‘!èA‚À<Ÿ€„ääHø9|byA¤} &‘!äA¢ÀX!¬€I8Bÿÿ/‚I@ž€I€a¬€| ¦| xN€!€aÐHûÍ|byA } &‘!àA¢Àd8`Høq|byA°} &‘!ìA¢À 68|Dx€a¤€I8BI€A°€8 !¼€I8BI€A a°K‘+Hû•,atA¢Àœ!¤€I8Bÿÿ/‚I@ž€I€a¤€| ¦| xN€!!°€I8Bÿÿ/‚I@ž€I€a°€| ¦| xN€!8`H÷¡|byA¬} &‘!èA¢Àx€t:à|Dx ’át€alHúñ|}yA¢À´€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!’ál!¬€I8Bÿÿ/‚I@ž€I€a¬€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!HtcÛxHõÍ|byA¤} &‘!ä@¢d‘!ì‘!è<_8Ó‘!Ü‘!à€Bä\ ÃxOÓx—ãx-Ëx"8@“aÀA¬A°A Aœ<_‘"äX<_äTH,~ò»x€a¤Hú|wy &@¢tHõ!/ƒA¾¨“¡ì“¡è<_8Ó“¡Ü“¡à€Bä\ ÃxOÓx—ãx-Ëx"8@“aÀA¬A°A Aœ<_‘"äX<_äTH¬``€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!cÛx~ä»xHû,atA¢¿9)ÿÿ/‰‘>@ž€^Ãóx€| ¦| xN€!€ЀAÔ“¡¨€|&Tïþ/hAšd<_!ÐaÌ€BÙ| ZA¨€AÔ|PÌ!¨€I8BI=9)ÿÿ/‰‘=@ž€]£ëx€| ¦| xN€!€a¨Hìå/ƒaHA¼¼¨@ž ’´HD<Ÿ~óx€„å$Hì=|byA } &‘!àA¢¼ì€aÐHð|byA°} &‘!ìA¢½08`Hì¥,atA¢½t!¼€a €I8BI!ta¼‘i €A°atK€P8BP!t’ €tHïÑ|}yA¢½|! €I8Bÿÿ/‚I@ž€I€a €| ¦| xN€!€At"9)ÿÿ/‰‘"@ž€at€C€| ¦| xN€!8“¡´t€P8Bÿÿ/‚P@ž €P“¡´~ƒx€| ¦| xN€!<Ÿ}Ãsx€„äøHêý,alA¢½$>_>ƒ²æ°€päL¤ëxHêÙ|byA°} &‘!ìA‚½\<Ÿ€„ääHê¹|byA } &‘!àA¢½°!°€I8Bÿÿ/‚I@ž€I€a°€| ¦| xN€!}ã{xHîM,atA¢½À€aÐHî9|byA¬} &‘!èA¢¾8`HêÝ|byA°} &‘!ìA¢¾868|Dx€a €I8BI€8€A° 8€Ata¬!°‘iItHî,atA¢¾4! €I8Bÿÿ/‚I@ž€I€a €| ¦| xN€!!°€I8Bÿÿ/‚I@ž€I€a°€| ¦| xN€!ƒ²æ°€päL¤ëxHéi|byA¬} &‘!èA‚¾<Ÿ€„ætHéI|byA } &‘!àA¢¾X!¬€I8Bÿÿ/‚I@ž€I€a¬€| ¦| xN€!}£kxHìÝ|byA°} &‘!ìA¢¾`€aÌHìÁ|byA¬} &‘!èA¢¾˜8`Hée|byAœ} &‘!ÜA¢¾È€W€a €œ8BW!°€Aœ‘"a¬’â ‘bHì¡|byA°} &‘!ìA¢¾À! €I8Bÿÿ/‚I@ž€I€a €| ¦| xN€!!œ€I8Bÿÿ/‚I@ž€I€aœ€| ¦| xN€!8`Hè¥|byA¬} &‘!èA¢¾€t!°:@8`‘" a´€K8BK€A¬‘b’AtHèY|byA } &‘!àA¢¾˜!¬‘" € €alHë±|}yA¢¾Ð€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!’Al! €I8Bÿÿ/‚I@ž€I€a €| ¦| xN€!€]8Bÿÿ/‚]@žñX€]£ëx€| ¦| xN€!Kÿñ_‚rRô8BW~{›x€K8BK39)‘3€W0€/€Ažà<Ÿ~ã»x€„aHÕÑ|~y@‚¨<_~q›x~v›x8€B^”"H<_8=?€B^”b<_^Œ‘i^H¬W½€>° W½€><_8!=?€B^”VÓx: b<_^Œ‘i^Ht<_8!VÓx€B^”"<_^Œ<_‘"^HL`8`HÕ½||y &@‚LN<_8~q›x: €B^”~v›x"<_^Œ<_‘"^€^8Bÿÿ/‚^@žÌH¬€¡<Ãóx„ãxH×Ù|zy@‚8N<_8~q›x: €B^”~v›x"<_‘"^<_^ŒKÿÿ €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€\8Bÿÿ/‚\AžqÛx^ÓxvÛxH¬€\ƒãx^ÓxqÛxvÛx€| ¦| xN€!H„b<€K8BK39)ÿÿ/‰‘3@ž €S~c›x€| ¦| xN€!`€W08`‚b=ÿ=ß; 9 ƒÓ€W,>|BÊ€‚€I4/‚Až$€ /€AžÃóxHÕ1||xHX`|ƒ#xHÖ|}yA‚PÃóx¤ëxHØÉ€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`, &@¢(;€€O^”/œ€‘®^Œ &W½à^H|<_ƒÂ^ /ž@¾$<_<Ÿ€BS$8„ìD€bHÑ]Hl`€RôœAž €|žAžÄóxHÙ•/ƒAž€[8Bÿÿ/‚[@žXH<=?€\€Þ <Ÿ)S08„õ”€¢ €iHÐñ€O^”€‘®^Œ^HÔ€[cÛx€| ¦| xN€!€›ãx/€Až€W,|BÊ€b HÕE.|uxA’Ô€W,|BÊ€bHÕ)|~yA‚„8`HÑÙ||y &A¢û„€[<„ãx8B[’¼“Ü“| €c^HÕ%|zyA‚d€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`<ŸCÓx€„aHÐ…|~yA‚8`HÑ||y &A¢ú䀡<Ãóx„ãxHÓy.|uxA²û€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`~#‹x~¤«xHÕy|~yA‚Œ€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€Q8Bÿÿ/‚QAžÑóxVÓxH$€Q~#‹xVÓxÑóx€| ¦| xN€!;;9”À@žüT~#‹xHÕM/ƒÿÿ@ž4;€<_8"=?,€B^” &b<_^Œ‘i^HL/ƒ@€Q~>‹x8BQHx8`HÏ‘||y &A‚<=?„ãxia€€K8BK<_€BRè)a€‘< €bHÒÕ|~y@‚P<_8$=?€B^”b<_^Œ‘i^HÀ &W½€<_8;€€B^”"<_^ŒH€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!Ãóx8€8 Kûõ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<_8$;€€B^”, &"<_^Œ<_‘"^: .HÀ<_8 =?€B^”b<_^Œ‘i^HÜN<_8: €B^”"<_^Œ<_‘"^Hx<_8!VÓx€B^”"<_^Œ<_‘"^H¸<_8!VÓx€B^”"<_^Œ<_‘"^H`€^Ãóx€| ¦| xN€!`¸ A‚<€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```A’0€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!<;À8cKû ¥!ÿƒwF9)‘:€J8BJaL€K8BK;9)‘;ƒÚ€š,€^€B4/‚Až(€ /€AžÃóxHËõ|}xH\``|ƒ#x; HÍY||yA‚@Ãóx„ãxHÏ…€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!,“¡\@‚X}&=!߃ÖQ4/ž@ž$<_<Ÿ€BFL8„ßl€bHÇíHp`€FAž €}žAžÄóxHÐ%/ƒAž €[xÛx8Bÿÿ/‚[@ž´HŒ=?€]€Þ <Ÿ)FX8„è¼€¢ €iHÇ}9 ² W½@>HÄ}/ƒ@ž(H0```HÄ,a`@¢TM}&U@=!<_=a8“iˆ˜€BQ¼9@" ˆˆ“kˆŒ<_8Б"Q¸<_Q´H#ˆ`€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!€a`8\HÈ¥||y &@‚(Hõ/ƒ@ž<_<Ÿ€BF8„bHÁõ¸ “\A‚d=!)ˆ”€I8Bÿÿ/‚I@ž,€I=a€kˆ”€| ¦| xN€!```!\Kx8BIHü}&U€H$}&<_=aM€€BQ¼‘«ˆŒH$}&U >} U`>=!<_‘©ˆŒ€BQ¼":@<_9@8ß‘"Q¸Hð}&U`=a<_9@8ß‘«ˆŒ€BQ¼bHÄ}&=!<_9@8ß‘©ˆŒ€BQ¼bH }&=a<_:@9@M€‘«ˆŒ€BQ¼8à"<_‘"Q¸Hp}&U€H$}&<_=aM€€BQ¼‘«ˆŒH$}&U >} U`>=!<_‘©ˆŒ€BQ¼":@<_9@8ä‘"Q¸H }&U`=a<_9@8è‘«ˆŒ€BQ¼bHà° W½€><_8°ëx€B$L~~›x~•£x"~ V€><_8~~›x€B$L~•£x"~ V€>HN<_8~~›x~•£x€B$L"~ V`><_V€>~ V€>8€B$L~~›x9à"ÿ8ƒW¬8B[€I8BIa<€K8BK:9)‘:<€{Hš­/ƒÿÿ|yx@ž€<_8NQÓxRÓx€B$L^ÓxMÓx9àUÓxNÓx"<_$D8~ V€>"ÍóxÕóx8° W½€><_ƒ×¬8°ëx€B$LÍóxÕóxÎóx"° W½€>ÿ=???ƒ—ꌀC8BC“¡8“¡<“¡@“¡D€D8BD€\ƒÉø€€yö8BÄóx\Hne|{y@‚Œ|&<_Äóx“X™ãxN€Bꨓãx”ãx`€bHoÍ€AX!`8…;ÀAT‘!\<_€Bö,"8@ALAH€ATAP<_‘"ö(<_ö$H#@```<Ÿ€„öHmÉ,a8@‚|N<_8…™ãx“ãx€Bö,”ãx;À"<_“X“T“Pö$|&<_‘"ö(8@`ALAH\€[8Bÿÿ/‚[@ž"°H"ˆ``€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€8ÃxHnÉ/ƒÿÿ|~x@ž|9 8@“X8…, AH<_™ãx€Bö,“ãx”ãx} &;ÀN‘!`"“T|@&“PA\8@AL<_‘"ö(<_ö$H!ð```€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!/ž“¡8AžØ€uÃxHr]|{y@‚D|&“X<_™ãx“ãxN€Bö,”ãx`"“T\H ```Hk‘,a8@‚d|&“X<_™ãx“ãxN€Bö,”ãx;À`"8@\8†“T“PALAH<_‘"ö(<_ö$Kÿþ(`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€a8Ho­.|}x@’Hj½/ƒ@ž<_<Ÿ€Bê€8„“ €bHhý|&T€<_ƒ7ꌀBö,`3Ëx4Ëx"“!X\“!T``8@8†’P;ÀALAH<_‘"ö(<_ö$H `ƒ×ꌀ^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€a8HnÝ.|zx@’€Hií/ƒ@ž<_<Ÿ€Bê€8„“ €bHh-|&T€“ÁX<_ÓóxÔóx€Bö,¹ëx`"8@“ÁT;À\8†’aPALAH<_‘"ö(Hð`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€a8Hn.||x@’€Hi-/ƒ@ž<_<Ÿ€Bê€8„“ €bHgm|&T€“ÁX<_Ôóx¹ëx€Bö,SÓx`"8@“ÁT;À\8†’PALAH<_‘"ö(H„`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€a8Hm]|iyA‚H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bê€8„“ €bHf•HHh-/ƒAž!D9 ‚÷êŒ8@¹ëxSÓx, AH<_”ãx’áX€Bö,;À8†} &N‘!`"’áT|@&’áPA\8@AL<_‘"ö(H\€a8€C€| ¦| xN€!ƒu 88/›AžP<_€yöƒÂ÷ÌÄóxHgý|{y@‚x|&<_Äóx¹ëxSÓxN€Bꨔãx`€b\Hie‚÷êŒ<_8ˆ;À€Bö,’áX’áT"8@’áPALAH<_‘"ö(<_ö$Hà<Ÿ€„öLHgu,a8@‚@|&‚÷êŒ<_¹ëxSÓx”ãxN€Bö,;À’áX`’áT"\HÔ€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<ŸÃx€„ø Hfñ|{yA‚@<ŸÃx€„ø¨HfÙ.|~x@’L<_‚÷ꌀBö,’áXH<8`Hj,a?>_>8‹1ö,€Iö$Rö(€^8Bÿÿ/‚^@ž8H8`Hdñ/ƒa8Ažÿ¸€Z<8BZ!8“I €A8“€?>_>8‹1ö,€Iö$Rö(Hx€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!‚÷ꌃÁ@¹ëxSÓx”ãx“a@“a8’áX’áT’áPH`€^Ãóx€| ¦| xN€!!߀yö8ƒÖ÷Ì@ÄóxHbU|{y@‚l|&<_Äóx¹ëxSÓxN€Bꨔãx`€b\Hc½‚÷ꌀQö,8Œ;À’áX"8@’áT’áPö$ALAH‘2ö(HD<Ÿ€„ö`HaÙ|~y@‚X|&‚÷ꌀQö,¹ëxSÓx”ãx;ÀN`’áX"8@\8Œ’áT’áPALAHö$‘2ö(Kÿô€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!ÃóxHa©€^|{x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!,@‚D|&‚÷êŒ8@¹ëxSÓx”ãxN;ÀALAH’áX`’áT\’áPH0<8c’ÀKú¡å8a<888¡@Kúµ/ƒ@œh9 ‚÷êŒ8@8Œ¹ëx, AH€Qö,SÓx’áX”ãx;À} &N‘!`"’áT|@&’áPö$‘2ö(A\8@ALH¨ƒÖ÷Ì€yöÄóxH`9|{y@‚p|&<_Äóx¹ëxSÓxN€Bꨔãx`€b\Ha¡‚÷ꌀQö,8;À’áX"8@’áT’áPö$ALAH‘2ö(H(`<Ÿ€„ö\H_¹.|~x@’L‚÷ꌀQö,’áXHÄ`€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8`H`|{y@‚P|&‚÷ꌀQö,¹ëxSÓx”ãx\’áX"8@`8’áT’áPALAHö$‘2ö(Hl€XÃóxdÛx8BX“ Hc,aD@‚P‚÷ꌀQö,’áX|&¹ëxSÓx”ãx\"8@`8’áT’áPALAHö$‘2ö(Kÿñ8€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!;`ƒÁD€A8“aD"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!“a8€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!“a<€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!‚÷ꌹëxSÓx”ãx“a@’áX’áT’áPH˜`>ŸÃx€”ø H]e|vy@‚<>?aD>_>8€Qö,/‹"ö$‘2ö(@žPHx``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`ƒU .A’xHè€K8Bÿÿ/‚K@ž€aD€C€| ¦| xN€!!<8D/‰Až0€I8Bÿÿ/‚I@ž€a<€C€| ¦| xN€!!88¿>ß>Ÿ; ÃxHG=|sy@¢THBQ/ƒAžÔ€VÎP8²;€Óóx/œ"ÎH`&W{à‘5ÎL€X8Bÿÿ/‚X@žìHÐ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€S€B4/‚Až$€ /€Až~c›x8€HD||xHd8`HEý|}y@¢`&;€Hp`~c›x¤ëxHH€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxHE |~xHA%/ƒA¾6ÎP8³€IÎHUÎLKÿþè€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€ZÂÉ.3€I4/‚Až,€ /€Až ~c›x8€HC…||xHl``8`HDí|}y@¢`&;€Hp`~c›x¤ëxHG €]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxHCý|~xH@/ƒA¾6ÎP8´€IÎHUÎLKÿýØ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z|BÊ“Â3€I4/‚Až(€ /€Až~c›x8€HBq||xHh`8`HCÝ|}y@¢`&;€Hp`~c›x¤ëxHEù€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxHBí|~xH?/ƒA¾6ÎP8µ€IÎHUÎLKÿüÈ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z|BÊ“Â3€I4/‚Až(€ /€Až~c›x8€HAa||xHh`8`HBÍ|}y@¢`&;€Hp`~c›x¤ëxHDé€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxHAÝ|~xH=õ/ƒA¾6ÎP8¶€IÎHUÎLKÿû¸€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z|BÊ“ 3€I4/‚Až(€ /€Až~c›x8€H@Q||xHh`8`HA½|}y@¢`&;€Hp`~c›x¤ëxHCÙ€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxH@Í|}xH<å/ƒA¾6ÎP8·€IÎHUÎLKÿú¨€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z:÷~~›x|BÊ;9“¢Kÿú€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!Óóx;À’úHl€XÃx€| ¦| xN€!W{ >p W{à>Až4€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<;Àÿÿ8cq¤Kú}u€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!/ž@œ@€Z8Bÿÿ/‚Z@ž(€ZCÓx;@€| ¦| xN€!H `;@8!°CÓx€ºaÿÌ|¦N€ `|@&|¦¾AÿÈ||x|ƒ#x|¤+xBŸ;Àè¦A”!ÿ <_?¿=<߀BÆÀƒ½Æ¸<¿kƼ8Æ´ø8¥eÐA\8X8A\8á|“Áx‘aX8A<“Á|“ÁL“ÁP“Ád“Áh“Ál“Áp“¡T“Át9L9!P9ATH<Ù;Àÿÿ/ƒAžÌ€\a|?¶¤8B\€K8BK!L€I8BIaP€K8BK!T€I8BI=?aX€K8BKA\€J8BJƒ©Á¸€HƒÁ|/8BH@ž(<_<Ÿ€B¶Ô8„Oô€bH8áHˆ``€~Až¤ëxHA!/ƒAž8ƒÁ|€^8B^<<€I8Bÿÿ/‚I@ž H|``<_>€Ý <Ÿ<¿€B¶à8„P8¥eÌ€é €bH8Yƒ;¶¤<_;@;; €BÂD.8“!MM"<_“!Œ“!ˆ‘"Â@HØ€|<€C€| ¦| xN€!``€|aL<€K8BK<8€I8Bÿÿ/‚I@ž$€|8€C€| ¦| xN€!``€L€aX8H;µa`H7Í,À&A‚Pƒ;¶¤<_;@;; €BÂD.8 “!MM"<_“!Œ“!ˆ‘"Â@<_ÂÐ WÞ€>“¡<_WÞÀ>Ò WÞ@>WÞ >Ñ WÞ`>€BÂD¹ëx;;@8"“¡Œ<_; “!ˆ‘"Â@Kÿÿ€`<8€€cÄØKúvI,ad@‚HNƒ;¶¤<_;M; ;@M€€BÂD8“!“!Œ"<_“!ˆ‘"Â@Kÿþ¬ƒ»¶¤€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!ƒ!d<Ÿ;À€„°“Ád#ËxH6],|dxad@‚8N“¡Œ“¡MM€<_;; ;@€BÂD"€AŒHH€aPH7Ñ/ƒÿÿa`@žP“¡<_;@;€BÂD.MM"¢ëx“¡Œ; Aˆ<_8‘"Â@<_Â;À€“Ä“Ád|xPH4Y/ƒad@ž4>Ÿ>ÿ>ß84ÂD€I!dÂ_>¿8ƒRÂ`€uÂ8hDÓxH2…|}yÀ&@‚<_DÓx€B¶À€bH4Ø “¡d@‚\WÞ€>Ð WÞ€>ƒ{¶¤€TÂDWÞÀ>Ò WÞ@>8WÞ >Ñ WÞ`>;; ;@“a"“aŒ“aˆÂ<‘7Â@HP£ëxH2Y€Ada`"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€`;À“Ád,@‚0Nƒ{¶¤;; M;@M€“a“aŒ“aˆHÔ?8x]Ð WÞ€>“¡Œ“¡WÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>;€BÂD; ;@8"€AŒAˆ<_‘"Â@Kÿõ |&Tÿþ/€H@ž“¡ƒ»¶¤HÀ8€A|€b$H1-/ƒÿÿ@žDM“¡Œ“¡M<_;; ;@€BÂD8 "€AŒAˆ<_‘"Â@Kÿõ$/ƒ;ÀA;À/ž“Á`Ažp€A|ƒ¢$=€I4/‚Až$€ /€Až£ëx8€ÿÿH,ù|xxH\8`ÿÿH.i|~y@‚M;HH£ëxÄóxH0‰€^|xx8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!-@Š@ƒ{¶¤<_;@; 8!€BÂD-š“aN "<_“aŒ“aˆ‘"Â@Kÿô4ƒÛ¶¤€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<ŸÃx€„ÃôH)µ.|}x@’,M““ÁŒM<_;;@€BÂD"Ht<ŸÃx€„ÔH)q-ƒ|zx@Ž$M ““ÁŒ<_;€BÂD"H8£ëxDÓxH.Ù,at@‚4M““ÁŒ<_;€BÂD"<_8"“Áˆ‘"Â@Hˆ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\ "9)ÿÿ/‰‘"@ž€| €C€| ¦| xN€!€t8@“ AtHœ8`H,5,ap@‚HN“¡Œ“¡MM€<_;; ;@€BÂD8$"€AŒAˆ<_‘"Â@KÿòD€\ "9)ÿÿ/‰‘"@ž€| €C€| ¦| xN€!€p“¡“Áp €A|<Ÿ€„Âà€b$H'±,axA‚@8`H(=,ahA‚,€\8B\“ƒ €ax€hH+•,ad@‚DNƒ{¶¤<_;M; ;@M€€BÂD8%“aŒ"<_“aˆ‘"Â@H´€Ax"9)ÿÿ/‰‘"@ž€ax€C€| ¦| xN€!;À€Ah“Áx"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“Áh€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“Ádƒ»¶¤€]8B]<0€I8Bÿÿ/‚I@ž€|0€C€| ¦| xN€!“¼0€]8B]<,€I8Bÿÿ/‚I@ž€|,€C€| ¦| xN€!“¼,<Ÿ8¡H€aT€„Ä8H*1/ƒ@œD“¡Œ<_;@;€BÂD.; 8(MM"€AŒAˆ<_‘"Â@H4ƒaH,|&TþÀ&/€HAž,WÞ€>Ð WÞ€>8`H&/ƒalAžX!L<€I8BI€L€Al !T€I8BI€T€Al€cÁ´€lH)A|zy@‚DNM“¡Œ<_;M; €BÂD;@8)"€AŒAˆ<_‘"Â@Hd€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“al€\,"9)ÿÿ/‰‘"@ž€|,€C€| ¦| xN€!;À“¡Œ“¡ˆ“\,HÐ<Ÿ€aT8¡`€„ðH(/ƒ@œD“¡Œ<_;@;€BÂD.; 8*MM"€AŒAˆ<_‘"Â@H€`.|@&TBŸþ/‚A`Ažœ<8€€cÁ¨H'ù|{y@‚@M“¡Œ<_;M; €BÂD;@8+"€AŒAˆ<_‘"Â@H €\0"9)ÿÿ/‰‘"@ž€|0€C€| ¦| xN€!;À“¡Œ“¡ˆ“|0HÀ<Ÿ€aT8¡H€„ÄÜH'}/ƒ@œD“¡Œ<_;@;€BÂD.; 8,MM"€AŒAˆ<_‘"Â@H€ƒaH!;| Ù/€H@ž;À“¡Œ“¡ˆH<<Ÿ€aL€„ÅHH(]|~y@‚LN“¡Œ<_;M; M€€BÂD;@8-"€AŒAˆ<_‘"Â@<_Âÿ<Ÿ#Ëxƒ·–ô8BY€K8BK=€„£`9)‘=HÕ|xy@‚¬<_ºëx8D€B¢”"Hx<_ºëx8K€B¢”"H<_ºëx8L€B¢”"<_¢Œ<_‘"¢H<_ºëx8M€B¢”"KÿÿØ<_ºëx8N€B¢”"KÿÿÀ<_ºëx8O€B¢”"Kÿÿ¨``8€H=|~y@‚TN<_8Dºëx;€€B¢”"<_¢Œ<_‘"¢€X8Bÿÿ/‚X@žôHÐ```€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€a8H]/ƒÿÿ@ž4<_ºëx8E€B¢”"<_¢Œ<_‘"¢H|``yKùò=,@‚$<_ºëx8F€B¢”"KÿÿÀ``y€a8H‰|xy@‚<_ºëx8J€B¢”"KÿÿŒºëx;`>¿>ß>ŸÃxH |}yÀ&@¢@H/ƒAžWÞ€>Ð WÞ€>€V¢”8J;€"¢Œ‘5¢Kÿþˆ``€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€]€B4/‚Až$€ /€Až£ëx8€Hm||xHd8`HÝ|~y@¢N;€HP`£ëxÄóxHù€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢”8Kºëx€I¢ŒU¢Kÿýœ```ƒãxHÍ|~xHå/ƒ@¾ü¬€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€YÂÙ.=€I4/‚Až,€ /€Až £ëx8€HU||xHl``8`H½|~y@¢N;€HP`£ëxÄóxHÙ€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢”8Lºëx€I¢ŒU¢Kÿü|```ƒãxH­|~xHÅ/ƒ@¾û¤€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Y|BÚ“Â=€I4/‚Až(€ /€Až£ëx8€H1||xHh`8`H|~y@¢N;€HP`£ëxÄóxH¹€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢”8Mºëx€I¢ŒU¢Kÿû\```ƒãxH|~xH¥/ƒ@¾ú¬€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Y|BÚ“Â=€I4/‚Až(€ /€Až£ëx8€H||xHh`8`H}|~y@¢N;€HP`£ëxÄóxH™€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢”8Nºëx€I¢ŒU¢Kÿú<```ƒãxHm|~xH…/ƒ@¾ù¤€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Y|BÚ“ =€I4/‚Až(€ /€Až£ëx8€Hñ||xHh`8`H]|~y@¢N;€HP`£ëxÄóxHy€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢”8Oºëx€I¢ŒU¢Kÿù```ƒãxHM|~xHe/ƒ@¾øœ€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Y8ÿÿºëx|BÚ“Â9})Ú;{ KÿùÌ€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!<Ÿ#Ëx€„¤¼HA.||x@’(<_8R=?€B¢”b<_¢Œ‘i¢H`8`H©|xy@‚(<_8R=?€B¢”b<_¢Œ‘i¢H€¡<ƒãxÃxHí|~y@‚(<_8R=?€B¢”b<_¢Œ‘i¢Kÿ÷¼€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!7–ô€I}>Kx8BIHd€XÃx€| ¦| xN€!``A’0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<;À8cFPKúPÅ!/‚a@žA’@8H4``/“Až„TB8;€ÿÿ|S"B1Š}i”‘b‘‚H\‹Á¤ÃóxH9/ƒ@ž /ž-@ž@<Ÿ<¡#Ëx8„8ð8¥€¤H ‘/ƒAž <<Ÿ%Ëx€cˆÌ8„8°8c°H ­|AÒˆb£/ Aš/ƒ ;À@ž;À/œAœdAš/ƒ ;À@ž;À88à`€¤|A®/‚Až }Hð``8Gˆ |Gx9)/€-Ažÿì``?imunable to malloc %d subheadersunable to open file %s for writingimsubit2pygr.cnestedlist.NLMSASliceIteratorgenerate letters (nodes) in this LPO slicepygr.cnestedlist.NLMSANodeinterface to a node in NLMSA storage of LPO alignmentedgesidiposnlmsaSlicegetSeqPosgetEdgeSeqsnodeEdgespygr.cnestedlist.NLMSASliceLettersgraph interface to letter graph within this regionitemsiteritemspygr.cnestedlist.NLMSASlicelettersstartstopnlmsaSequencenlmsaseqkeysmatchIntervalsfindSeqEndsgenerateSeqEndsgroupByIntervalsconservationFilterfilterIvalConservationgroupBySequencesclip_interval_listsplitregionsrawIvalspygr.cnestedlist.NLMSAtoplevel interface to NLMSA storage of an LPO alignmentpathstemseqsseqlistseqDictcurrentUnionlpoListmaxLPOcoordmaxleninlmsais_bidirectionalpairwiseModein_memory_mode_persistent_id_ignoreShadowAttr__doc___saveLocalBuildinverseDBclose__reduce____getstate____setstate__read_indexesread_attrsaddToSeqlistnewSequencenextIDinitLPOinit_pairwise_modeaddAnnotationadd_aligned_intervalsreadMAFfilesreadAxtNetbuildFilessave_seq_dictbuildseqIntervalpygr.cnestedlist.IntervalFileDBIteratormergeSeqpygr.cnestedlist.NLMSASequencesequence interface to NLMSA storage of an LPO alignmentlengthnbuildis_lpois_unionoffsetnamefilestemnlmsaLettersbuildListforceLoadbuildInMemorypygr.cnestedlist.IntervalFileDBopenfind_overlapfind_overlap_listcheck_nonemptypygr.cnestedlist.IntervalDBIteratorpygr.cnestedlist.IntervalDBsave_tuplesrunBuildMethodbuildFromUnsortedFilewrite_binariesadvanceStartStopdump_textfiletextfile_to_binariescnestedlist.pyxraise: arg 3 must be a traceback or Noneinstance exception may not have a separate valueraise: exception must be an old-style class or instancefunction takes at most %d positional arguments (%d given)required keyword argument '%s' is missing__import__OOOOdivO|Opygr.cnestedlist.IntervalDB.write_binariespygr.cnestedlist.IntervalDB.check_nonemptyendpygr.cnestedlist.IntervalDB.find_overlap_listpygr.cnestedlist.IntervalDB.find_overlapfilenamenOipygr.cnestedlist.IntervalDB.buildFromUnsortedFilebuildInPlace|Opygr.cnestedlist.IntervalDB.runBuildMethodnsize|OOpygr.cnestedlist.IntervalDB.__cinit__dbiiOMissing type objectArgument '%s' has incorrect type (expected %s, got %s)pygr.cnestedlist.IntervalDBIterator.__cinit__pygr.cnestedlist.IntervalDBIterator.__next__pygr.cnestedlist.IntervalFileDB.check_nonemptypygr.cnestedlist.IntervalFileDB.find_overlap_listpygr.cnestedlist.IntervalFileDB.find_overlapOpygr.cnestedlist.IntervalFileDB.openmodepygr.cnestedlist.IntervalFileDB.__cinit__pygr.cnestedlist.__iadd__pygr.cnestedlist.NLMSASequence.__iadd__pygr.cnestedlist.NLMSASequence.__len__pygr.cnestedlist.buildInMemorypygr.cnestedlist.NLMSASequence.buildInMemorypygr.cnestedlist.NLMSASequence.buildFilespygr.cnestedlist.NLMSASequence.closepygr.cnestedlist.NLMSASequence.forceLoadpygr.cnestedlist.IntervalFileDBIterator.mergeSeqpygr.cnestedlist.IntervalFileDBIterator.__next__pygr.cnestedlist.NLMSA.__iadd__pygr.cnestedlist.NLMSA.__invert__apygr.cnestedlist.NLMSA.addAnnotationpygr.cnestedlist.NLMSA.nextIDpygr.cnestedlist.NLMSA.newSequencestatepygr.cnestedlist.NLMSA.__setstate__pygr.cnestedlist.NLMSA.__getstate__pygr.cnestedlist.NLMSA.__reduce__pygr.cnestedlist.NLMSA.__iter__pygr.cnestedlist.NLMSASlice.__setitem__Subscript deletion not supported by %spygr.cnestedlist.NLMSASlice.rawIvalsminAlignedpygr.cnestedlist.NLMSASlice.splitpygr.cnestedlist.NLMSASlice.generateSeqEndspygr.cnestedlist.NLMSASlice.findSeqEndspygr.cnestedlist.NLMSASlice.iteritemspygr.cnestedlist.NLMSASlice.letters.__get__pygr.cnestedlist.NLMSASlice.__iter__pygr.cnestedlist.NLMSASliceLetters.iteritemspygr.cnestedlist.NLMSASliceLetters.itemspygr.cnestedlist.NLMSASliceLetters.__iter__pygr.cnestedlist.NLMSANode.__getitem__pygr.cnestedlist.NLMSANode.__iter__pygr.cnestedlist.IntervalFileDBIterator.loadAllpygr.cnestedlist.IntervalFileDBIterator.nextBlockpygr.cnestedlist.IntervalFileDBIterator.restartpygr.cnestedlist.IntervalDBIterator.cnextpygr.cnestedlist.NLMSASequence.saveIntervalpygr.cnestedlist.IntervalFileDBIterator.cnextpygr.cnestedlist.IntervalFileDBIterator.extendpygr.cnestedlist.IntervalFileDBIterator.copyistartistopiOiipygr.cnestedlist.advanceStartStoppygr.cnestedlist.NLMSASliceIterator.__cinit__pygr.cnestedlist.NLMSASliceLetters.__cinit__nodepygr.cnestedlist.NLMSASliceLetters.__getitem__nspygr.cnestedlist.NLMSA.addToSeqlistCannot convert %s to %spygr.cnestedlist.NLMSA.save_nbuildpygr.cnestedlist.NLMSA.closepygr.cnestedlist.NLMSA.initLPOpygr.cnestedlist.get_seq_intervalpygr.cnestedlist.NLMSASlice.get_seq_intervalprefixDictbuildpathO|OOOpygr.cnestedlist.textfile_to_binariescnestedlist__builtin____builtins__IntervalDB__pyx_vtable__IntervalDBIteratorIntervalFileDBNLMSASequenceIntervalFileDBIteratorNLMSANLMSASliceNLMSASliceLettersNLMSANodeNLMSASliceIteratorpygr.cnestedlistpygr.cnestedlist.NLMSANode.__cmp__pygr.cnestedlist.NLMSANode.edges.__get__pygr.cnestedlist.getSeqPospygr.cnestedlist.NLMSANode.getSeqPospygr.cnestedlist.NLMSASlice.__cmp__pygr.cnestedlist.NLMSASlice.__repr__pygr.cnestedlist.NLMSASlice.__hash__pygr.cnestedlist.NLMSASlice.matchIntervalspygr.cnestedlist.NLMSASlice.__getitem__mafFilesaxtFilesmaxOpenFilesnPadmaxinttrypathbidirectionalbidirectionalRuleuse_virtual_lpoalignedIvals|OOOOOOOOOOOOOOOOOpygr.cnestedlist.__init__pygr.cnestedlist.NLMSA.__init__pygr.cnestedlist.NLMSA.init_pairwise_modepygr.cnestedlist.NLMSA.edgespygr.cnestedlist.NLMSA.add_aligned_intervalssaveSeqDictpygr.cnestedlist.NLMSA.buildFilespygr.cnestedlist.NLMSA.save_seq_dictpygr.cnestedlist.buildpygr.cnestedlist.NLMSA.buildiseqiiipygr.cnestedlist.NLMSA.seqIntervalpygr.cnestedlist.NLMSA.__setitem__pygr.cnestedlist.__getitem__pygr.cnestedlist.NLMSASequence.__getitem__unpack sequence of wrong sizepygr.cnestedlist.NLMSASliceIterator.__next__iO|iipygr.cnestedlist.NLMSANode.__cinit__mergeAllpygr.cnestedlist.NLMSASlice.edgespygr.cnestedlist.NLMSASlice.itemspygr.cnestedlist.NLMSASlice.keyslOOOpygr.cnestedlist.NLMSASlice.clip_interval_listpygr.cnestedlist.read_indexespygr.cnestedlist.NLMSA.read_indexespygr.cnestedlist.read_attrspygr.cnestedlist.NLMSA.read_attrspygr.cnestedlist.__setitem__pygr.cnestedlist.NLMSASequence.__setitem__pygr.cnestedlist.NLMSA.add_seqidmap_to_unionpygr.cnestedlist.NLMSASlice.findSeqBoundsoutfilenamepygr.cnestedlist.dump_textfileotherpygr.cnestedlist.NLMSANode.getEdgeSeqspygr.cnestedlist.nodeEdgespygr.cnestedlist.NLMSANode.nodeEdgesOii|iiOpygr.cnestedlist.__cinit__pygr.cnestedlist.NLMSASlice.__cinit__maxgapmaxinsertmininsertfilterSeqsfilterListmergeMostmaxsizeivalMethod|iiiOOOOOOpygr.cnestedlist.groupByIntervalspygr.cnestedlist.NLMSASlice.groupByIntervalsmpIdentityMinminAlignSizemaxAlignSizeOO|OOOpygr.cnestedlist.NLMSASlice.conservationFilterseqIntervalsfilterFunO|OOpygr.cnestedlist.filterIvalConservationpygr.cnestedlist.NLMSASlice.filterIvalConservationsourceOnlyindelCutseqGroupspMinAlignedseqMethodO|OOOOOOpygr.cnestedlist.groupBySequencespygr.cnestedlist.NLMSASlice.groupBySequencesdummyArgpygr.cnestedlist.NLMSASlice.regionsOOpygr.cnestedlist.readMAFfilespygr.cnestedlist.NLMSA.readMAFfilespygr.cnestedlist.readAxtNetpygr.cnestedlist.NLMSA.readAxtNetpygr.cnestedlist.NLMSA.__getitem__nbufferii|OOiOpygr.cnestedlist.IntervalFileDBIterator.__cinit__nlOOO|OOOpygr.cnestedlist.NLMSASequence.__init__pygr.cnestedlist.IntervalDB.save_tuples%2s %63s %d %d %2s %d %s *** WARNING: Unknown sequence %s ignored... - *** WARNING: Incorrectly formated alignment line ignored: %s %s%d %63s %d %d %63s %d %d %2s %dpygr/apps/maf2nclist.csrc_seqdest_seq *** WARNING: Unknown sequence %s, %s ignored... +C0€ÿÿÿ?Dh´³è³Ü³ÌEû?hh€hÐCÊ0³¼d@?”$f ´¸cc ´¨Eû?°f fðA°b<aìaˆ×`?è €a°get this node's edges as list of tuples (ival1,ival2,edge)?ð ?ô?ü @Pbä@»b¤@ Épb|get all outgoing edges from this nodereturn dict of sequences that traverse edge from self -> otherreturn seqpos for this seq at this nodeCð?°Cðgp@, d@µ`dd„µPEû@PdÀe>0d(dfÐ?ü@„8`dX@Œ60list of tuples (node,{target_node:edge})iPe@˜@_€à  ¶u0u$$µøEûapb@40fdeØexÚà@´2Àe interface to individual LPO letters in this interval@¼ @Ä?ð@Ì0@Ü4@ä8?èãPtà@„ô`t¨@Œ.P@è t\@ð&°s˜A(ps`A  `s8AànA0¥ðADÄ A\Öph°Ap`h€A„ hAŒ\0g˜A”gdreturn list of raw numeric intervals in this sliceget LPO region(s) corresponding to this interval Same group-by rules apply here as for the split() method.Use groupByIntervals() and groupBySequences() methods to divide this slice into subslices using indel rules etc.truncate list of 1:1 intervals using start,endmerge groups of sequences using "vertical" group-by rules: - seqGroups: a list of one or more lists of sequences to group. Each group will be analyzed separately, as follows: - sourceOnly: output intervals will be reported giving only the corresponding interval on the source sequence; redundant output intervals (mapping to the same source interval) are culled. Has the effect of giving a single interval traversal of each group. - indelCut: for sourceOnly mode, do not merge separate intervals as reported by seqIntervals (in other words, that the groupByIntervals analysis separated due to an indel). - minAligned: the minimum #sequences that must be aligned to the source sequence for masking the output. Regions below this threshold are masked out; no intervals will be reported in these regions. - pMinAligned: the minimum fraction of sequences (out of the total in the group) that must be aligned to the source sequence for masking the output. - seqMethod: you may supply your own function for grouping. Called as seqMethod(bounds,seqs,**kwargs), where bounds is a sorted list of (ipos,isStart,i,ns,isIndel,(start,end,targetStart,targetEnd)) seqs is a list of sequences in the group. Must return a list of (sourceIval,targetIval). See the docs. merge alignment intervals using "horizontal" group-by rules: - maxgap (=0): longest gap allowed within a region - maxinsert (=0): longest insert allowed within a region - mininsert (=0): should be 0, to prevent cycles within a region use negative values to allow some overlap / cycles. - maxsize: upper bound on maximum size for interval merging - mergeMost: merge, but with limits (10000,10000,-10,50000) - mergeAll: merge everything without any limits - filterSeqs (=None): dict of sequences to apply these rules to; other sequences alignment will be ignored if filterSeqs not None. Slower than the filterList option. - filterList (=None): list of sequence intervals to mask the result set by. Note: a single sequence should not be represented by more than one interval in filterList, as only one interval for each sequence will be used as the clipping region. Significantly faster than filterSeqs. - ivalMethod: a function to process the list of intervals for each sequence (it can merge or split them in any way it wants) - pAlignedMin: a fractional minimum alignment threshold e.g. (0.9) - pIdentityMin: a fractional minimum identity threshold e.g. (0.9) get list of tuples (ival1,ival2,edge)get maximum interval of seq aligned in this intervalget all 1:1 match intervals in this region of alignment as list of tuples. if seq argument not None, only match intervals for that sequence will be included. No clipping is performed.get list of intervals aligned to this slice according to groupBy optionsget list of tuples (ival2,edge) aligned to this sliceget list of tuples (srcIval,destIval,edge) aligned in this sliceC07à C0c°A XUÐ|@|| ¶ EûA¸Y[àw€v:°T Að AüBB BB$$B,(B80B@4BH8B\<Bl@B|DBŒHB LB¨PB¸TBÄr{ìBÌþÐBØû@BèøBø0{¨C=ð{hCk°{4C$ì{C0êzØC8vðz¸C@kàzt?èpCTå@z4Cdv€zC|iyèCŒ–€y¼C˜yàyxC¤£pyHC´¦€yC¼µ`xÐget specified interval in the target sequencebuild nestedlist databases from saved mappings and initialize for usesave seqDict to a worldbase-aware pickle filebuild nestedlist databases on-disk, and .seqDict index if desiredread alignment from a set of axtnet filesread alignment from a set of MAF filesadd alignedIvals to this alignmentsave alignment of sequence interval --> an annotation objectturn on use of virtual LPO mapping (i.e. no actual LPO is present!)create LPOs for this alignmentget a unique nlmsaID and advance countercreate a new nestedlist index for sequence seqadd an NLMSASequence to our seqlist, and set its idread pickled attribute dictionary from file and apply to selfopen all nestedlist indexes in this LPO database for immediate useclose our shelve index filesÄ »0^ðã@àÐCÈ4Qð¶ô¶Ì¶À¶°EûSPSÐAðÜð}˜ì€CðÚ0}¸merge intervals into single interval per sequence orientationCüDJ€€Ü€´€¨·ŒEûDMPN°¨~¸ø€I?ð DTD\DdDlDx @ä$D€(Dˆ8D”<D¤@D°Ø€pBÄÔ €0C˜ÇðøD¼À build nested list from saved unsorted alignment datafree memory and close files associated with this sequence indexforce database to be initialized, if not already open¿ÀðLð¿ÀQ`µ@DÌ HÀ·à·¸·¬·œû‚4±PDì¯àDô¬ E¤@E¢0BÄBPE(`(Fà¸Ì¸¤¸˜¸ˆEûGðH@> ž`¸x›ELF¹¨¹€¹t¹dû„“0Eh0… Et‘@„ØE„‰ „¤Dô…àE}ÀE{0EœwÀBÄ?load unsorted binary data, and build nested listbuild either in-place or using older build methodbuild in-memory NLMSA from list of alignment tuplesrbrwb###mafa ºü©¸»©¨»©”»©ˆ » ©t»©h »©X»©L »©@ » ©0 »$© »(© »,¨ô»0¨è »4¨Ø»8¨È»<¨¼ »@¨¬»D¨¤»H¨»L¨„ »P¨x »T¨h »X¨\ »\¨P »`¨D »d¨4»h¨$»l¨»p¨ »t§ô»x§à»|§Ø»€§Ì »„§Ä»ˆ§¸ »Œ§ »§»”§„ »˜§t»œ§d» §`»¤§T »¨§@»¬§8»°§4»´§ »¸§ »¼§»À¦ü»Ä¦ô»È¦ð»Ì¦Ø»Ð¦Ì »Ô¦À »Ø¦¨»Ü¦¤»à¦œ»ä¦ »è¦ˆ»ì¦| »ð¦h»ô¦T»ø¦P»ü¦L¼¦@ ¼¦8¼¦0¼ ¦$ ¼¦¼¦¼¦¼¥ô ¼ ¥ì¼$¥à ¼(¥Ø¼,¥Ð¼0¥È¼4¥À¼8¥¸¼<¥°¼@¥  ¼D¥˜¼H¥Œ ¼L¥„¼P¥x ¼T¥l ¼X¥\ ¼\¥P ¼`¥D ¼d¥8 ¼h¥4¼l¥,¼p¥ ¼t¥¼x¥¼|¤ü ¼€¤ð ¼„¤ä ¼ˆ¤Ü¼Œ¤Ø¼¤Ð¼”¤Ä ¼˜¤¼¼œ¤° ¼ ¤¤ ¼¤¤ ¼¨¤” ¼¬¤„ ¼°¤x ¼´¤h ¼¸¤`¼¼¤T ¼À¤H ¼Ä¤@¼È¤4 ¼Ì¤ ¼Ð¤¼Ô…D¼Ø¤¼Ü¤ ¼à…@¼ä£ü ¼è£ì ¼ì£à ¼ð£Ð ¼ô£À¼ø£°¼ü£¨½£˜½£Œ ½£|½ £t½£d½£X ½£T½£H ½ £@½$£4 ½(£( ½,£ ½0£½4£ ½8£ ½<¢ø½@¢ì ½D¢à ½H¢Ô ½L¢Ì½P¢¸½T¢°½X¢¤ ½\¢œ½`¢”½d¢Œ½h¢ˆ½l¢| ½p¢l ½t¢d½x¢`½|¢X½€…H½„¢L ½ˆ¢D½Œ¢4½¢,½”¢½˜¡ð#½œ¡à½ ¡Ä½¤¡ "½¨¡½¬¡T9½°¡<½´¡&½¸ ô½¼ Ð$½À ¨%½Ä ,z½È !½ÌŸà(½ÐŸÐ½ÔŸ´½ØŸ¤½ÜŸˆ½àŸT2½äŸL½èŸ,½ìŸ½ðžð½ôž¼1½øžˆ3½üžx¾žT"¾žH ¾žD¾ ž,¾ž'¾ø ¾Ð(¾œÈ¾ œŒ:¾$œT7¾(œ(,¾,œ¾0›ˆ€¾4›p¾8›X¾<›8 ¾@›'¾DšØ6¾HšÐ¾Lš´¾Pš¨ ¾Tš¤¾Xšœ¾\šHS¾`š*¾dš ¾h™ø¾l™ä¾p˜ B¾t˜€¾x˜x¾|˜l ¾€—45¾„—¾ˆ•„‘¾Œ•l¾•T¾”•@¾˜•<¾œ•+¾ •¾¤”„„¾¨”l¾¬”P¾°”L...Saving NLMSA binary index: bad format in file %sYou must supply sequence database(s) for the following prefixes, by passing them in the prefixDict optional dictionary argument: %s.idDictYou must provide a seqDict for this NLMSA!bad format in %serror or EOF reading %serror writing file %sWarning: Because one or more of the sequence databases in the seqDict have no worldbase ID, there is no host-independent way to save it to a textfile for transfer to another machine. Therefore, when loading this textfile on the destination machine, you will have to provide a dictionary for these sequence database(s) as the prefixDict argument to textfile_to_binaries() on the destination machine.error writing to file %sWarning: Because your seqDict has no worldbase ID, there is no host-independent way to save it to a textfile for transfer to another machine. Therefore, when loading this textfile on the destination machine, you will have to provide the seqDict argument to textfile_to_binaries() on the destination machine..seqIDdict.txtthis mapping is not invertibleNote: the NLMSA.seqDict was not saved to a file. This is not necessary if you intend to save the NLMSA to worldbase. But if you wish to open this NLMSA independently of worldbase, you should call NLMSA.save_seq_dict() to save the seqDict info to a file, or in the future pass the saveSeqDict=True option to NLMSA.build().Index files saved.empty alignment!%d %s %d %d axtNet block too long! Increase max size%s is not correct axtNet file name. Correct name is (chrid.)source.target.net.axt..axt..net.axtProcessing axtnet file: os.pathNon-alignment text lines ignored: prefix %s, count %dMAF block too long! Increase max size%s: not a MAF file? Bad format.unable to open file %sProcessing MAF file: Sequence too long for 32 bit int: %s, %d Something is probably wrong with creation / reading of this sequence. Check the input!you cannot iterate over NLMSAsSorry! Query interval spans multiple LPOs!key must be a sequence interval or python slice objectUsage only nlmsa[s1]+=s2 allowed. nlmsa[s1]=s2 forbidden! Because you are aligning a pair of sequence intervals, the pairwiseMode=True option is automatically being applied. To avoid this message in the future, pass the pairwiseMode=True option to the NLMSA constructor. See the NLMSA documentation for more details. this alignment is already using an LPO!.attrDictunable to find sequence %s in seqDict!corrupted NLMSAIndex??? .NLMSAindexcan't pickle NLMSA.in_memory_modeunknown mode %smaxLPOcoord and pairwiseMode options incompatible!key must be a sequence interval of this sequencewrite_padded_binary failed???not opened in write modeunable to open in write mode: .buildNLMSASequence: seq must have name or id attributehey! write some code here!seq not in nodeseq not in this alignmentout of boundsno LPO in nlmsaSlice.seqBounds? Debug!seq not aligned in this intervalthis NLMSA is read-only! Currently, you cannot add new alignment intervals to an NLMSA after calling its build() method.sequence mapped to non-LPO target??this interval is not aligned!empty IntervalFileDB, not searchable!src is None! Debug!!Iterator has no database! Please provide a db argument.out of memoryempty IntervalDB, not searchable!IntervalMap file corrupted?unable to open unable to allocate IntervalMap[%d]could not open file %sxmlrpcwrite_binarieswriteworldbasewarnwtypestarget_starttargetDBsysstripstringstopstartswithstartsplitLPOintervalssplitsourcePathsourceOnlysourceDBsortsetrlimitsequenceseqlistseqdbseqIntervalseqInfoDictseqDictseqBoundsseqsave_tuplessave_seq_dictsaveSeqrunBuildMethodresourcereopenReadOnlyremoverelativeSliceread_seq_dictread_indexesread_attrsreadMAFfilesreadAxtNetrawIvalsrUpygrprune_self_mappingsprefixDictpicklepathstempathForwardpathpairwiseModepMinAlignedpIdentityMinpAlignedMinosorientationopen_shelveopenonDemandoffsetnsnonamenodeEdgesnlmsa_utilsnlmsaSlicenlmsaSequencenextIDnewSequencenamenmsaSlicemininsertminAlignedminAlignSizemergeSeqmergeAllmemorymaxinsertmaxgapmaxAlignSizemappingloggerloadlengthkeysjoiniteritemsitemsis_unionis_lpois_bidirectionaliposinverseDBinitLPOinfoindelCutimidgroupBySequencesgroupByIntervalsgetSeqIDgetSeqgetIDcoordsgetIDgetgenerate_nlmsa_edgesforceLoadfilterSeqsfilterIvalConservationendedgesdumpdoSliceconservedSegmentconservationFiltercmpcloseclip_interval_listclassutilchrcheck_nonemptycache_referencecacheHintbuildInMemorybuildFromUnsortedFilebuildFilesbuildbasenameappendadvanceStartStopadd_aligned_intervalsaddToSeqlistaddAllabsoluteSlice_persistent_id_cache_max__init____iadd____getstate____class__StringTypeSeqPrefixUnionDictSeqPathSeqCacheOwnerSeq2SeqEdgeRLIMIT_NOFILEPrefixUnionDictNLMSAindexNLMSA_UNION_InternalNLMSA_LPO_InternalNLMSASequenceNLMSASeqDictLetterEdgeFloatTypeEmptySliceErrorEmptySliceEmptyAlignmentErrorDictQueueClassicUnpicklerBuildMSASliceAttributeErrorE¬_ÐEÀh0ª<EÐ… ªconvert pathstem.txt textfile to NLMSA binary filesdump NLMSA binary files to a text fileSEQID %s %d %d %dPREFIXUNION %s %sunknownPATHSTEM %s %d %d %d %d %sNoneNLMSASequence %sSEQID %s %d %d %d PREFIXUNION %s %s PATHSTEM %s %d %d %d %d %s EèDˆG @¼Gl@¼GlGÌGØHGÌHT@¼GlHˆ@¼Gl@¼GlDˆDˆIüL@äDlLˆM”@ä?ô?üPäPì?ü?üQ¸@äGÌB R°R¼@ä@äAðIüB U@ULUXB8UhUpUxU€B\UU¤B,B¸U´U´VW PäPì?ô?üPäPìX@X@@¼GlX¸B AðZZHQ¸@¼@Ä?ðDx@ä[[[[([4[@[LX@[T@ä[À[Ä[Ô[ä\,[Ä\<\,\¬\¸\ÄM”\Ð\Ü]HU@UpULU@¼GlHˆQ¸^$A”^hDˆ@äIüDlDTX¸àà                                                                                                                                                                                       à @%p``@­°@­¨@­¤@­ @­œ@­˜@­”@­Œ@­ˆ@­„@­€@­|@­x@­p@­l@­d@­`@­X@­P@­L@­H@­D@­@@­<@­8@­0@­,@­(@­ @­@­@­@­@­@­@­@¬ü@¬ø@¬ô@¬ð@¬ì@¬è@¬à@¬Ü@¬Ø@¬Ô@¬Ð@¬Ì@¬Ä@¬¼@¬¸@¬°@¬¨@¬¤@¬ @¬˜@¬@¬ˆ@¬„@¬€@¬|@¬t@¬p@¬l@¬d@¬\@¬T@¬P@¬L@¬H@¬D@¬@@¬<@¬8@¬4@¬0@¬,@¬(@¬$@¬ @¬@¬@¬@¬ @¬@«ü@«ø@«ô@«ð@«è@«ä@«Ü@«Ô@«Ì@«È@«Ä@«À@«¸@«°@«¨@« @«œ@«”@«Œ@«ˆ@«€@«x@«t@«l@«h@«`@«\@«X@«P@«L@«D@«<@«8@«0@«,@«$@« @«@«@«@©ô@©ì@©è@©ä@©Ü@©Ø@©Ì@©È@”4@”, @”$@” @”@” @”@“ü @“ô@“ì @“ä@“Ü @“Ô@“Ì @“Ä@“¼ @“´@“¬ @“¤@“œ @“”@“Œ @“„@“| @“t@“l @“d@“\ @“T@“L @“D@“< @“4@“, @“$@“ @“@“ @“@’ü @’ô@’ì @’ä@’Ü @’Ô@’Ì @’Ä@’¼ @’´@’¬ @’¤@’œ @’”@’Œ @’„@’| @’t@’l @’d@’\ @’T@’L @’D@’< @’4@’, @’$@’ @’@’ @’@‘ü @‘ô@‘ì @‘ä@‘Ü @‘Ô@‘Ì @‘Ä@‘¼ @‘´@‘¬ @‘¤@‘œ @‘”@‘Œ @‘„@‘| @‘t@‘l @‘d@‘\ @‘T@‘L @‘D@‘< @‘4@‘, @‘$@‘ @‘@‘ @‘@ü @ô@ì @ä@Ü @Ô@Ì @Ä@¼ @´@¬ @¤@œ @”@Œ @„@| @t@l @d@\ @T@L @D@< @4@, @$@ @@ @@ü @ô@ì @ä@Ü @Ô@Ì @Ä@¼ @´@¬ @¤@œ @”@Œ @„@| @t@l @d@\ @T@L @D@< @4@, @$@ @@ @@Žü @Žô@Žì @Žä@ŽÜ @ŽÔ@ŽÌ @ŽÄ@޼ @Ž´@ެ @ޤ@Žœ @Ž”@ŽŒ @Ž„@Ž| @Žt@Žl @Žd@Ž\ @ŽT@ŽL @ŽD@Ž< @Ž4@Ž, @Ž$@Ž @Ž@Ž @Ž@ü @ô@ì @ä@Ü @Ô@Ì @Ä@¼ @´@¬ @¤@œ @”@Œ @„@| @t@l @d@\ @T@L @D@< @4@, @$@ @@ @@Œü @Œô@Œì @Œä@ŒÜ @ŒÔ@ŒÌ @ŒÄ@Œ¼ @Œ´@Œ¬ @Œ¤@Œœ @Œ”@ŒŒ @Œ„@Œ| @Œt@Œl @Œd@Œ\ @ŒT@ŒL @ŒD@Œ< @Œ4@Œ, @Œ$@Œ @Œ@Œ @Œ@‹ü @‹ô@‹ì @‹ä@‹Ü @‹Ô@‹Ì @‹Ä@‹¼ @‹´@‹¬ @‹¤@‹œ @‹”@‹Œ @‹„@‹| @‹t@‹l @‹d@‹\ @‹T@‹L @‹D@‹< @‹4@‹, @‹$@‹ @‹@‹ @‹@Šü @Šô@Šì @Šä@ŠÜ @ŠÔ@ŠÌ @ŠÄ@м @Š´@Ь @Ф@Šœ @Š”@ŠŒ @Š„@Š| @Št@Šl @Šd@Š\ @ŠT@ŠL @ŠD@Š< @Š4@Š, @Š$@Š @Š@Š @Š@‰ü @‰ô@‰ì @‰ä@‰Ü @‰Ô@‰Ì @‰Ä@‰¼ @‰´@‰¬ @‰¤@‰œ @‰”@‰Œ @‰„@‰| @‰t@‰l @‰d@‰\ @‰T@‰L @‰D@‰< @‰4@‰, @‰$@‰ @‰@‰ @‰@ˆü @ˆô@ˆì @ˆä@ˆÜ @ˆÔ@ˆÌ @ˆÄ@ˆ¼ @ˆ´@ˆ¬ @ˆ¤@ˆœ @ˆ”@ˆŒ @ˆ„@ˆ| @ˆt@ˆl @ˆd@ˆ\ @ˆT@ˆL @ˆD@ˆ< @ˆ4@ˆ, @ˆ$@ˆ @ˆ@ˆ @ˆ@‡ü @‡ô@‡ì @‡ä@‡Ü @‡Ô@‡Ì @‡Ä@‡¼ @‡´@‡¬ @‡¤@‡œ @‡”@‡Œ @‡„@‡| @‡t@‡l @‡d@‡\ @‡T@‡L @‡D@‡< @‡4@‡, @‡$@‡ @‡@‡ @‡@†ü @†ô@†ì @†ä@†Ü @†Ô@†Ì @†Ä@†¼ @†´@†¬ @†¤@†œ @†”@†Œ @†„@†| @†t@†l @†d@†\ @†T@†L @†D@†< @†4@†, @†$@† @†@† @†@…ü @…ô@…ì @…ä@…Ü @…Ô@…Ì @…Ä@…¼ @…´@…¬ @…¤@…œ @…”@…Œ @…„@…| @…t@…l @…d@…\ @„ˆ@„„@„x@„t@„h@„d@„X@„T@„H@„D@„@@„8@„4@„0@„(@„$@„ @„@„@ƒð@ƒÈ@ƒ¤ @ƒŒ @ƒˆ @ƒ„ @ƒl@ƒ`@ƒ0@ƒ @ƒ@ƒ@‚ô@‚ð@‚ä @‚Ì @‚È @‚Ä @‚¬@‚ @‚x@‚t@‚h@‚d@‚X@‚T@‚H@‚D@‚8@‚4@‚@è@Ä @¬ @¨ @¤ @Œ@€@8@€À@€´@€°@€¬@€¨@Ü@Ø@Ô@Ì@È@Ä@¼@¸@´@¬@¨@€@l@X@D@0@@@~ô@~à@~Ì@~¸@~”@~Œ@~p@~l@~X@~T@~P@~H @~0@~,@~(@~@~@}¤@}œ@}˜@}t@}L@}H@}D@}8@}4@}( @} @} @} @|ð@|ä@|œ@|l@|$@|@|@x¼@x´@x°@x¬@x¤@x @xœ@x”@x@xŒ@x„@x€@x|@xt@xp@xl@xd@x`@x\@xT@xP@xL@xD@x@@x4@x0@x,@x$@x @x@x@x@x @x@x@wü@wô@wð@wì@wä@wà@wÜ@wÔ@wÐ@wÌ@wÄ@wÀ@w´@w°@w¤@w @w”@w@wŒ@w„@w€@wX@wD@w0@w@w@vô@và@vÌ@v¸@v¤@v@v|@vh@vT@v@@v,@v@uô@uì@uÐ@uÌ@uÄ@u¸@u´@u°@u¨ @u@uŒ@uˆ@up@ud@u<@u0@u,@u(@u$@gP@gH@gD@g@@g8@g4@g0@g(@g$@g @g@g@g@g@g@fø@fô@fè@fä@fà@fØ@fÔ@fÐ@fÈ@fÄ@fÀ@f¸@f´@f°@f¨@f¤@f @f˜@f”@fˆ@f„@f€@fx@ft@fp@fh@fd@f<@f(@f@f@eì@eØ@e„@e|@ex@eT@e4@e0@e,@e$@e@e@e @dô@dð@dì@dè @dä@dà@dÐ@dÄ@dœ@dˆ@d<@d8@d4@d,@d(@d@cÜ@c¸@c´@c¬@c @cœ@c˜@c @cx@ct@cp @cX@cL@c$@c@c@c @bh@b`@b\@bX@bP@bL@bH@b@@b<@b@b@aì@a”@aŒ@aˆ@ad@aD@a@@a<@a4@a(@a$@a @a @a@`ü@`ø @`ð@`à@`Ô@`¤@`| @`x@`t@`h@`d@``@`X @`@ @`< @`8 @` @`@­ü@­ø@­ô@­ð@­ì@­è@­ä@­à@­Ü@­Ø@­Ô@­Ð@­Ì@­È@­Ä@­À@¯@¯@¯@¯ @¯@¯@¯@®ü@®ø@®ô@®ð@®ì@®è@®ä@®à@®Ü@®Ø@®Ô@®Ð@®Ì@®È@®Ä@®À@®¼@®¸@®´@®°@®¬@®¨@®¤@® @®œ@®˜@®”@®@®Œ@®ˆ@®„@®€@®|@®x@®t@®p@®l@®h@®d@®`@®\@®X@®T@®P@®L@®H@®D@®@@®<@®8@®4@®0@®,@®(@®$@® @®@®@®@®@® @®@®@®@¯(@¯$@¯ @¯@ E` Ð   Wd ð €d ð ’f “< ¢€. ðD ðD øD üD D ÀD ÄD ÈD ÌD ÐD ÔD D °$ ð Æ@ Ï@ Ü@ å€ € € -€ F€ X€ â€w€‡€´€ê€ú€ €€-€>€O€l€‰€§€½€æ€ö€€€'€<€n€‡€Ú@ ä€ðÀ ðñ€ 8ÿÀ à `€ 8À €à Àà 8€2€N$HN 8. @D @D! @D# PD% TD' dD+ „O$ @h@w@†€—€§$HN ˆ. DE DG DI  DK ¤DM ´DQ Ô¨$E Á@DÐ@Dß$HN Ø. àDV àDX àDZ ðD\ ôD^ Db $à$V àø@U@U$HN (. 0D 0D‘ 0D’ @D” hD– lD• pD— tD• xD” |D˜ €D— „D” ˆD˜ ŒD— D‘ ”$ 01@Ž:@ŽD@ŽT@ _À 0`à  a$pN  .  D5  D7 ¨D5 ¬D7 ¼D;`b$5  |@4…@6À  €78žÀ ÀŸà €78®À ¯à`°àx±$ØNx.€D@€DD€D@„DDˆDEDFœDGÀDDÄDKÌDO²$@€Ì@? Ù@?ä@?î@?÷@A@A  @A À€à$ˆN.DUDYDUDYDZ D[,D\PDYTDa\$U/@T <@TG@TR@T[@Vd€u€’€À@V Ë@VÔÀÕà`Ö$PN`.`Dt`DvhDtlDvpDttDv€DzÐ×$t`÷€€(€Ë€Ü€v8êÀŒëàÐì$ˆNè.ðD}ðDøD}üDDDƒí$}ð @|@~"@~2Àð3à¨4$¸N¨.°D‡°DˆÀD‰ÐD‹Ô5$‡°U@†`$(NØ.àDâàDåäDæèDâðDåDâ DæDéPDë\Dì|Dîa$âàs@á€@á@á˜@á¥@á±@ã¾@ä Ë€XàÀàáà¨â$ÈN¨.°Dô°Dö¸Dô¼DöÔD÷ØDù€Dû„DùŒDûDü¨D¼ã$ô°÷@ò@ò@ó @õ -€>€[€‰À°Š€÷8˜Àä™à0š€÷8¨À@©à€ªàÔ«$$NÔ.àDàD ìDðD D D D DD4DH¬$àÈ@Ú@æ@ô@@@ @.€_Àà`à`a$€N`.`Dœ`DžpDœxDœ„DžˆDŸŒD ”D¢œD£´D¢ÈD¦Ðb$œ`}@›‡@›@››@›¨@±@½À`¾àè¿$ˆNè.ðD«ðD¯øD«üD¯D°°D² D³,D´@DµDD±PD¹pDº|D»D¼”D¸ D¿¬DÀÀDÁÌD¿ØDÂàDÄðDÅøD¿DÉ À$«ðÙ@©ã@©ì@©÷@ª @ª@¬ Àð!€¯8/À 0àp1€¯8?À„@à°A€°8OÀÄPà Qà4R$DN4.@DÍ@DÏHDÍLDÏ\DÍ`DÏdDÓpDÚxDÓ|DÚŒDÛDܘDàœDç¬Dà°DϼDêÐS$Í@m@Ìw@Ì€@Ì‹@̘@Ρ@Ϊ@ηÀ@¸àè¹$¨Nè.ðD4ðD<D4D< D=4D>DDCLDDlDFtDG0DH<DIHDHLDITDJ`DOhDP|DS„DTÐDUðDVüDUDVDWDX DY(D]PD`DaD^D_ D`DiDj Dk$Dj(Dl,Dm0Dl4Dn8Dm<Dn@DoHDqPDpTDrXDslDtxDs|Dt€Du„DvŒD|°D~¸D€àº$4ðÔ@2å@2õ@3 €58€&€7€U€$€€œ€5<§€5@±€5D¾€5HÈ€6LÔ@8æ@9÷@:€$Àð%€FL3À€4àÐ5€FLCÀàDà0E€SLSÀœTàÐU€]LcÀXdà e€]LsÀ´tàuàv$N.D…D†D‡(D‰,DŠ8DŒ<DTDŽlDtw$…“@„£$ŒNŒ.D—DŸ°D—´DŸ¼D ÐD¡àD£èD¥D¦D§$D¦(D§,D¨4D¬<D°dD±pD²„D³”DµœD¶°D¸ÌDµìD»üD¾D¿DÀ$DÁ4DÃ<DÄPDÆlDÃŒDÈ”DØDÈœDäDʨDͰDμDÏÐDÐàDÑèDÓDÕDÒHDÚTDÞpDßxDâ Dã¨DæÄDçÌDµøDÃDé¤$—º@•Ë@•Ü@–ì@–ù@˜€˜8 €˜<€˜@€˜D,€˜H6@˜B€™tN€š\W€›La€œTr@À€à$$”N$.0Dî0DöTDî\DödDøxDû¬DüÈDýØDÿàD D D D (D 0D <D PD TD XD dD lD €D ˜D ¼D ØD èD øD!D!D!(D!0D!@D !XD"!|D!˜D$! D!¤D$!¨D!°D&!´D)!¼D*!ÔD+!àD-!èD+!ðD."D0"D4"DD-"`D7"lD;"|D<"„D?" D@"¨DC"øDD#D #(D#0DG#@‚$î0Ÿ@í­@í¿@íÏ@ïØ€ï8à€ï<ë€ï@õ€ïD€ïH @ï€ðt$€ðt0€ðt@€ñ\I€òTS€óLd@ôq€’À0“à#T”$$N#T.#`Dg#`Dj#`Dg#dDj#hDk#lDD#pDk#tDD#„Dk#ˆDD#ŒDE#DF#œDG#ÀDD#ÄDK#ÌDl#ôDm#øDl#üDm$Dp$•$g#`²@e¿@eÊ@eÖ@eà@fò@f@h À#` @k @kÀ#p@A 'À#p(à#t)à#t*@k 3@k=À#„>@A GÀ#„Hà#ˆIà#ˆJ@k S@k]À#Œ^@A gÀ#Œhà#ôià#ôjà$k$¨N$.$D$D$D$D$<D$TDY$XDZ$pD[$|D\$ DY$¤D!$°D $ÔD#$ØD $äD $èD $ôD $øD$üD%D#%,D'%4D+%DD/%`D,%dD-%hD0%lD1%xDY%|D2%€DY%„D2%ˆDY%ŒDZ%D[%œD\%ÀDY%ÄD6%ÐD7%ÜD9&D:&˜Dæ&œD:&¤Då&¨Dæ&´Dé&àDë&ìDì' D<' D:'(D;',D='0D<'4D@'<DA'LDB'PDC'XDA'\DC'`DD'pDF'tDD'xDE'€DF'ŒDG'°DD'´DK'¼DF'ôDJ'øl$$ƒ@Ž@›@¦@²@½@È@Ú@ è ¸ÿ ¼  À  Ä #@ 0€ A@ O@ a@ x@ „@ @ œÀ$ @V ¦À$X §à$° ¨@# µ@# Ã@# ÕÀ$Ô Ö@ ã@ ñÀ$Ô òà$Ø óà$Ø ô@#!@#!@#!!À$ä!"@!/@!=À$ä!>à%,!?à%,!@@2!KÀ%|!L@V !UÀ%|!Và%€!Wà%€!X@2!cÀ%„!d@V !mÀ%„!nà%ˆ!oà%ˆ!p@2!{À%Œ!|@V !…À%Œ!†à%Ð!‡à%Ð!ˆ€78!–À%ä!—à&0!˜€78!¦À&L!§à&!¨@:!´@:!ÁÀ&œ!Â@ä !ÏÀ&œ!Ðà&¤!Ñà&¤!Ò@:!Þ@:!ëÀ&¨!ì@ä !ùÀ&¨!úà' !ûà' !ü@F"@F "À'p"@A"@A ""À'p"#à't"$à't"%@F".@F "8À'x"9@A"B@A "KÀ'x"Là'ô"Mà'ô"Nà( "O$üN( "P ¯¼.(Dð(D÷(Dð(D÷($Dð((D÷(PDú(lDý(Dþ(”Dý(˜Dþ(¤Dý(¨Dþ(°Dÿ(¼D(ÄD(ØD(äDž(ìDŸ)D )D¢)D£)$D¢)8D¥)@D )DD )PD )TD )dD )hD )lD)pD)|Dž)€D)ŒDž)œDŸ)¤D )¬D¢)´D£)ÄD¢)ØD)àD)ðD*D *D*0D*8D*@D*TD*`DÓ*pDÚ*xDÓ*|DÚ*ŒDÛ*DÜ*˜Dà*œDç*¬Dà*°DÏ*¼D*ÐD *àD!*ìDÏ*ðD!*øDÏ+DÓ+DÚ+DÓ+DÚ+,DÛ+0DÜ+8Dà+<Dç+LDà+PDÏ+\D!+pD+tD"+„D$+ŒD%+ D&+°D'+¸D*+ÜD++üDÏ,D.,0"^$ð("y@î"ƒ@î "Œ@î"˜@î"£@ï"µ@ï"Ã@ï"Ô@ñ"Ý@ñ"é@ñ"ô€ò@#@ó# @ó#$€ô8#2( õ¯¼#BÀ(#C@#L@#XÀ(ì#Yà)D#Z@#dÀ)€#e@#n@#zÀ)€#{à)Œ#|à)Œ#}@#‡À)œ#ˆ@#‘@#À)œ#žà)à#Ÿà)à# @Î#©@Î#²À*p#³à*Ð#´@!#¾À*ð#¿@Î#È@Î#Ñ@Î#ÞÀ*ð#ßà*ø#àà*ø#á@!#ëÀ+#ì@Î#õ@Î#þ@Î$ À+$ à+p$ à+p$@Î$@Î$ À,$!à,0$"à,L$#$<N,L.,PDg,PD‘,XDg,\D‘,dDg,hD‘,„D’,D‘,œDt,¤Dq,¨Dt,ÀDu,ðDx- Dt-$D-4D-8D-<D‚-@Dƒ-DD‡-€D‰.0DŠ.4D‰.8D‹.<DŠ.@D‹.DD.HD.tD“.°D”.¼D“.ÀD•.ÐD˜.ØD™.ìD›.ðDŸ.ôD›.üDœ/D /DŸ/ D /D/D¤/D¥/0D¦/PD¤/TD§/XD¤/`D­/dDª/hD­/pD®/D¯/”D­/˜D°/œD­/ Dµ/¤D¶/ÀD·/ÐDµ/ìD½/øDÁ0DÂ0DÁ0DÃ0DÄ0@Dg0DDÄ0HDÇ0`DÊ0dDÌ0hDÊ0lDÇ0pDÊ0tDÌ0€DË0ˆDÎ0ŒDÃ0DÎ0˜DÏ0œDÃ0 DÓ0¤D”0ÀD–0ÄD•0ÈD—0ÌD•0ÐD”0ÔD˜0ØD—0ÜD”0àD˜0äD—0èDÚ0ð$$$g,P$F@e$P@e$Y@f$e@f$v€$†@h$–@h $£@h$¯@i$ÁÀ,P$Â@ $ÍÀ,X$Îà,\$Ï@ $ÚÀ,d$Ûà,h$Ü@ $çÀ,„$èà,¤$逃8$÷À-X$øà-€$ù€‡8%À-ˆ%à-Ð% €‡8%À-ä%à.0%@ %$À0À%%à0ð%&à1%'$ÄN1.1 Dà1 D‘1(Dà1,D‘1DDà1HD‘1LD’1`D‘1lDë1tDí1ŒDï1œDð1 Dñ1ÀDô1ðDö2Dù2D÷2 Dð2Dþ20Dÿ28D2°Dà2´D2¸D2ÀD2ÄD2ÈD2ÌD2ÔD2äD 2ðD2ôD 3D3D.3`D3lD3ÐD3ÔD3ØD3àD3äD3ðD3ôD4 D48D4<D4@D4HD4LD4TD4pD4D4˜D4ÐD4ØD!4äD#5D"5 D$5D%5D(50D)54D+5ŒD”5 D–5¤D•5¨D—5¬D•5°D”5´D˜5¸D—5¼D”5ÀD˜5ÄD—5ÈD15Ð%($à1 %B@Þ%L@Þ%U@ß%a@ß%r@á%{@á %‰@á%•@á%£@ã%µÀ1 %¶@ %ÁÀ1(%Âà1,%Ã@ %ÎÀ1D%Ïà1H%Ð@ %ÛÀ1L%Üà1t%Ý€ÿ8%ëÀ2L%ìà2°%í€ÿ8%ûÀ2´%üà2¸%ý€8& À3 & à3`& €8&À3€&à3Ð&€)8&+À5H&,à5Œ&-@ &8À5 &9à5Ð&:à5è&;$ÈN5è.5ðD¢5ðD¥6D¢6 D¢6,D¥60D¦64D¬6tD¾6„D®6ÈD¯6ÌD³6ØDD6äD´6èDD6ìDE6ôDF7DG7DD7 DK7(Dµ7TD¹7`Dº7lD¹7pD»7”D¼7œD»7 D¼7¨D½7¬Dk7´DD7¸Dk7¼DD7ÌDk7ÐDD7ÔDE7àDF7ìDG8DD8DK8Dl8DD½8LD¾8TD¿8|DÀ8€DÃ8”DÄ8œD¸8¤DÆ8àDÇ8ðD8ôDË9\D‘9`D’9pD”9˜D–9œD•9 D—9¤D•9¨D”9¬D˜9°D—9´D”9¸D˜9¼D—9ÀD‘9ÄDÏ9ÌDÐ9ÐDÏ9ÔDÐ9ØDÔ9à&<$¢5ð&R@&^@&k@&v@ž&€@ž&‰@Ÿ&›@Ÿ &©@ &´  ¨&À ¡¬&Ò ¡°&ä@£&ï@£&û@¤'€'@¤'!@¤'*@¤':@ 'F@¡'X@¡ 'jÀ5ð'k€¦8'yÀ6H'zà6t'{€¾8'‰À6„'Šà6È'‹@A '”@A 'À6ä'žà6è'Ÿ@A '¨@A '±À6ì'²à7T'³@h'¼À7´'½@k'Æ@k 'ÐÀ7¸'Ñ@A 'ÚÀ7¸'Ûà7¼'Üà7¼'Ý@k'æ@k 'ðÀ7Ì'ñ@A 'úÀ7Ì'ûà7Ð'üà7Ð'ý@k(@k (À7Ô(@A (À7Ô(à8D(à8D(à8L(@~(*À8ô(+à9\(,@ (7À9`(8à9Ì(9à9ü(:$ N9ü.:DT:DW:DT:DT:@DW:XDX:\D^:¤D`:°Da:´Df:ÀDg:àDo; Dp;(Do;,Dq;LDs;PDq;TDs;\Dr;`Dq;dDr;lDs;pDt;Dw;àDz;ðDx;ôDz;øDm;üD}<@D~D—>D”>D˜> D—>D‘>D>DŽ> D>$DŽ>(Ds>4D>xD’>€(;$T:(V@M(b@M(o@M(z@N(…@N(@O(¢@O(°@P(Ç QØ(Ó QÜ(Þ Qà(ë Rä(ö Rè) Sì) Sð)&@U)1@U)=@V)F@V)R@V )b@V)l@Q)x@Q)ƒ@Q)@R)œÀ:)€XH)«À:p)¬à:¤)­@€)¹@€)ÆÀ<`)Ç@ä )ÔÀ<`)Õà*F€sH*TÀ>4*Uà>x*Và>œ*W$œN>œ*X *id>œ*jd> *“d> *¦f*§<*¶€*Äh*ý ´+$ ³è+M ³Ü+u ³Ì+œh€+ÖhÐ, C,HÊ0,ƒ ³¼,¹d@,îf --N ´¸-lc-Œc -« ´¨-Éf -úfð.(A°.Yb<.†aì.³aˆ.à×`/  €/@a°/LP/~bä/²»/æb¤0Ép0Nb|0‚Cð0²?°0ægp1d@1K µ`1qd1™d„1À µP1ædÀ2e2U>02d(2Äd2ùfÐ3-8`3ddX3603ØiP4e4J_€4{à4­  4à ¶4ÿu05 u$5@$5s µø5’ap5Äb@5ó406&fd6TeØ6‚ex6°Úà6Ý2À7e 7!ãP7Qtà7ƒô`7³t¨7å.P8 8Ht\8y&°8²s˜8í(p9#s`9[ `9•s89Ñà: n:I¥ð:†Ä :ÇÖp;h°;?`;|h€;» ;ëh<\0| >5 ¶ >OY>|[>¦à>Ów€>üv?%:°?RT ?zr?¤{ì?ÐþÐ?ÿû@@0ø@a0@’{¨@Å=ð@ô{hA%k°AV{4A‰ìA¹{AëêBzØBCvðBoz¸BkàBÔztC pC7å@Ciz4Cv€C×zDiDDyèDw–€D¦y¼D×yàEyxE7£pEiyHE¦€EÇyEóµ`F#xÐFUÄ F…»0F·^ðFàã@GàÐG<QðGy ¶ôG¤ ¶ÌGÑ ¶ÀGý ¶°H(SPHfSÐH¡AðHàÜðI}˜IYì€I’Ú0IÑ}¸JJ€JF€ÜJh€´JŒ€¨J¯ ·ŒJÑMPKN°K8¨Ki~¸Kšø€KÐILØL7€pLpÔ L£€0LØÇðMøMJÀ M…¿ÀMºðMóLðN-Q`N^µ@N”HÀNÉ ·àNì ·¸O ·¬O5 ·œOX‚4OбPO»¯àOP)¤@Pi¢0P¦BPPÚFàQ ¸ÌQ: ¸¤Qc ¸˜Q‹ ¸ˆQ²GðQìH@R#> R^ž`R™ ¸xRÏ›SFS5 ¹¨ST ¹€Su ¹tS• ¹dS´„Sâ“0T0TE… T}‘@T¶„ØTñ‰ U1„¤Us…àUª}ÀUæ{0VwÀVX?Vˆ º@V¼…@VÆ…DVÐ ºDVü ºHW4 ºLW` ºPW…HWœ ºTWà ºXWò…LWþ…PX …XX º\XI º`Xt ºdX¨…\Xº ºüXÒ©¸XÝ »Xô©¨Y »Y©”Y& »Y9©ˆYD » Ya©tYm »Y©hY »Y¦©XY± »YÄ©LYÏ »Yã©@Yî » Z©0Z »$Z'© Z3 »(ZO© Z[ »,Zy¨ôZ… »0Z™¨èZ¥ »4Z¾¨ØZÊ »8Zá¨ÈZí »<[¨¼[  »@[$¨¬[/ »D[@¨¤[L »H[h¨[t »L[ˆ¨„[“ »P[¦¨x[² »T[Ȩh[Ô »X[æ¨\[ò »\\¨P\ »`\$¨D\/ »d\G¨4\S »h\j¨$\u »l\…¨\‘ »p\§¨ \³ »t\Ò§ô\Þ »x\ø§à] »|]§Ø] »€]0§Ì]< »„]K§Ä]W »ˆ]k§¸]w »Œ]–§ ]¢ »]¹§]Å »”]ا„]ã »˜]ü§t^ »œ^§d^) » ^6§`^B »¤^U§T^a »¨^}§@^ˆ »¬^—§8^¡ »°^®§4^¹ »´^Õ§ ^à »¸^ú§ _ »¼_§_! »À_/¦ü_; »Ä_J¦ô_U »È_b¦ð_m »Ì_¦Ø_˜ »Ð_¬¦Ì_· »Ô_ʦÀ_Õ »Ø_ó¦¨_ÿ »Ü` ¦¤` »à`'¦œ`2 »ä`G¦`R »è`b¦ˆ`m »ì`¦|`Š »ð`¤¦h`¯ »ô`ɦT`Ô »ø`à¦P`ë »ü`÷¦La ¼a¦@a ¼a-¦8a9 ¼aJ¦0aV ¼ ai¦$au ¼aƒ¦aŽ ¼a¨¦a´ ¼aĦaÏ ¼aá¥ôaí ¼ aü¥ìb ¼$b¥àb% ¼(b3¥Øb? ¼,bM¥ÐbX ¼0bh¥Èbt ¼4b‚¥ÀbŽ ¼8bž¥¸bª ¼<b»¥°bÆ ¼@bÜ¥ bç ¼Db÷¥˜c ¼Hc¥Œc  ¼Lc0¥„c< ¼PcN¥xcY ¼Tck¥lcv ¼XcŒ¥\c— ¼\c«¥Pc¶ ¼`cÉ¥DcÔ ¼dcæ¥8cñ ¼hcü¥4d ¼ld¥,d! ¼pd6¥ dB ¼tdR¥d^ ¼xdu¥d€ ¼|d”¤üdŸ ¼€d´¤ðd¿ ¼„dÒ¤ädÝ ¼ˆdí¤Üdù ¼Œe¤Øe ¼e ¤Ðe, ¼”e>¤ÄeJ ¼˜eX¤¼ec ¼œex¤°e„ ¼ e™¤¤e¤ ¼¤e°¤ e¼ ¼¨eѤ”eÜ ¼¬eò¤„eý ¼°f¤xf ¼´f3¤hf? ¼¸fM¤`fX ¼¼fm¤Tfx ¼ÀfФHf– ¼Äf¦¤@f² ¼ÈfƤ4fÒ ¼Ìfï¤ fû ¼Ðg ¤g ¼Ôg  ¼Øg,¤g8 ¼ÜgJ¤gU ¼àga ¼ägu£üg ¼èg—£ìg£ ¼ìg·£àgà ¼ðgÙ£Ðgå ¼ôgü£Àh ¼øh£°h* ¼üh:£¨hF ½h^£˜hj ½h|£Œhˆ ½h £|hª ½ h»£thÇ ½hÞ£dhê ½hÿ£Xi  ½i£Ti$ ½i7£HiB ½ iS£@i_ ½$it£4i€ ½(i•£(i  ½,i¯£ i» ½0iÌ£iØ ½4iê£ iõ ½8j£j ½<j"¢øj- ½@j?¢ìjK ½Dj_¢àjj ½Hj~¢Ôj‰ ½Lj˜¢Ìj£ ½Pj¾¢¸jÊ ½TjÙ¢°jä ½Xjø¢¤k ½\k¢œk ½`k-¢”k9 ½dkH¢ŒkT ½hka¢ˆkm ½lk¢|k‹ ½pk¡¢lk¬ ½tk»¢dkÆ ½xkÑ¢`kÝ ½|kë¢Xk÷ ½€l ½„l¢Ll" ½ˆl1¢Dl= ½ŒlU¢4la ½lq¢,l} ½”lˆ¢l’ ½˜l¡ðl§ ½œl²¡àl¼ ½ lÇ¡ÄlÑ ½¤lÝ¡ lè ½¨lô¡lÿ ½¬m ¡Tm ½°m"¡<m- ½´m9¡mD ½¸mP ôm[ ½¼mg Ðmr ½Àm~ ¨m‰ ½Äm• ,m  ½Èm¬ m· ½ÌmßàmÎ ½ÐmÚŸÐmå ½ÔmñŸ´mü ½ØnŸ¤n ½ÜnŸˆn* ½àn6ŸTnA ½änNŸLnZ ½èngŸ,ns ½ìn€ŸnŒ ½ðn™žðn¥ ½ôn²ž¼n¾ ½ønËžˆn× ½ünäžxnð ¾nýžTo  ¾ožHo" ¾o/žDo; ¾ oHž,oT ¾oažom ¾ozøo† ¾o“ÐoŸ ¾o¬œÈo¸ ¾ oÅœŒoÑ ¾$oÞœToê ¾(o÷œ(p ¾,pœp ¾0p)›ˆp5 ¾4pB›ppN ¾8p[›Xpg ¾<pt›8p€ ¾@p›p™ ¾Dp¦šØp² ¾Hp¿šÐpË ¾LpØš´pä ¾Ppñš¨pý ¾Tq š¤q ¾Xq#šœq/ ¾\q<šHqH ¾`qUšqa ¾dqnš qz ¾hq‡™øq“ ¾lq ™äq¬ ¾pq¹˜ qÅ ¾tqÒ˜€qÞ ¾xqë˜xq÷ ¾|r˜lr ¾€r—4r) ¾„r6—rB ¾ˆrO•„r[ ¾Œrh•lrt ¾r•Tr ¾”rš•@r¦ ¾˜r³•<r¿ ¾œrÌ•rØ ¾ rå•rñ ¾¤rþ”„s  ¾¨s”ls# ¾¬s0”Ps< ¾°sI”LsU©Èsd_Ðs’h0s½ª<sê… tªtPªdt\ªxthªŒttª”t€ª°tŒª¸t˜ªÌt¤ªàt°ªôt¼«.> D^> Da>´Dg>ÀDi>ätÍ$^> u@^u"€u.€u=€uS€u€u¹€uÈ€zo€z€z€z©€zº€zÓ€zä€zÿ€{€{+€{<€{S€{d€{|€{€{ž€{¯€{À€{Ø€{é€|€|€|1€|B€|^€|o€| €|±€|Í€|Þ€|õ€}€}!€}<€}X€}i€}z€}‹€}§€}À}Û€}ì€~€~€~-€~>€~V€~r€~‚€~’€~¢€~²€~€~Ò€~ñ€€2€C€S€c€s€€ €°€À€€)€€™€ €€*€:€…E€†S€†°€‡8€‡S€‡e€‡{€‡€‡£€‡³€‡Í€‡æ€‡ø€ˆ€ˆ"€ˆ<€ˆN€ˆk€ˆ}€ˆš€ˆ¬€ˆÌ€ˆç€‰€‰€‰;€‰_€‰r€‰“€‰¦€‰É€‰Ú€‰ë€‰ü€Š €Š€Š/€Š@€ŠQ€Šb€Šs$\N>üŠt ºh.?D ?D¤?D ?D¤?$D¨?DD¥?HD©?LD¥?PD©?XDª?\D°?`D±?dD²?lD¸?pD¾?tD»?xD¸?|D¾?€DÄ?DÆ?Њ‰$ ?Š¿@ ŠÓ@ Šå@ Š÷@¡‹& £ºh‹€‹<€‹pÀ?‹qà?è‹r$èN?è‹s?ð.?ðD›?ðD ?ôD›?øD @D@D¨@ Dª@(‹¯$›?ð‹ñ@› Œ€Œ€]€p€ƒ€–€©€¼€ŽÖ€Žø€€Š€H€[€n€€”€§€º€Í€‘u€’€’€’'€’8€’I€’Z€’k€’|€’€’ €’³€’Ó€’ò€“Ç€“ö€” €”h€”‡€”š€”¹€”Ï€”þ€–¤€–·€–怗€—2€—E€—X€—k€—~€—ž€—¾€—Þ€—ö€˜!€˜2€˜C€˜V€˜g€˜}€˜˜€˜í$LN@<˜î@@.@@Dö@@Dö@dDþ@hDú@tDþ@xDú@|Dþ@„Dÿ@ˆD @°D @¸D @¼D @ÀD @ÌD @ØD @äD @ðD @ôD !A ™1$ö@@™z@ö™@ö™¥@ö™¸@ö™Ñ@ö™í@öš€š$øNA8šA@.A@D }A@D †ALD }APD …AXD ‚A`D †AdD ‚AhD †ApD ŒAtD ’A€D –A D ›A¤D £A°D ¥AØšX$ }A@š¥@ }š»@ šÏ@ €šàÀA@šáàAðšâ$°NAð.AðD ¼AðD ¿BD ÅBD ÇB4šã$ ¼Að›(@ ¼›<$\NBL›= ºl.BPD :BPD >B`D :BhD >BtD BB”D ?B˜D CBœD ?B D CB¨D DB¬D JB°D LB´D JB¸D LB¼D MBÌD OC›R$ :BP›Œ@ :› @ :›²@ :›Ä@ ;›Ó& =ºl›ë€œ ÀBPœ àC(œ $ØNC(.C0D C0DC@DCLDCPDClœ $ C0œF@ œZ@œk€ œ…ÀC0œ†àC„œ‡$TNC„.CD ÒCD ÕC¤D ÛC°D ÝCÔœˆ$ ÒCœÉ@ ÒœÝ$\NCì.CðD!ßCðD!áDD!âD D!çDD!éD,œÞ$!ßCð@!ß*@!à;ÀCð<àDD=$TNDD>DP.DPD#†DPD#ŽD`D#DlD#‹DpD#DtD#‹DxD#D€D#D„D#‘D D#“D¬D#•D¸D#šDÄD#ŸDàD#DäD#§DèD#¨DìD#ªEq$#†DPª@#†À@#†Ô@#†è@#‡ù€ž €žõ€Ÿ€Ÿ€Ÿo€ ô€¡€¡€¡-€¡@€¡Q€¡È€£e€¥ž€¥±€¥Ä€¥×€¥ê€¥û€¦ €¦f€¦ø€§ €§€§1€§D€§U€§f€§w€§Š@#ˆ§™@#‰ §¨ÀDP§©àE(§ª$ØNE(§«E0.E0D2 E0D2¥E8D2 E<D2¢ELD2¥E`D2¦EpD2¥EtD2¦E|D2¥E€D2ªED2¬E˜D2­E°D2¬E´D2­E¸D2¬E¼D2­EÈD2¬EÐD2­Eà§Ý$2 E0¨@2 ¨+@2 ¨@@2 ¨Z@2¡¨k€¨~€¨˜€©ÀE0©àEô©$ÄNEô.FD@ÚFD@ÝFDF$D@ÞF(DŽF,DŠF0DŽF8DF<D•F@D–FDD—FLDœFPD@àF€D@áF”D@âF˜D@áF¤D@âF¬D@äF°D@åFÈ©$@ÚF©=@@Ú©F€@Ü8©R€@Ü<©]€@Ü@©gÀF©hàF°©i$ÜNFÜ.FàDAxFàDA|FôDA}GDçGDæG DçGDéGDAGPDA€GdDAGhDA€GtDAG|DAƒG€DA„G¸DA…GЩj$AxFà©©@Ax©²€ªâ€ªõ€«€«p€«ƒ€«”€A{8« €A{<««€A{@«µÀFô«¶àG€«·$NGä.GðDA‡GðDAŠHDA‹HDAŽH,«¸$A‡Gð«ø@A‡¬@A‡ ¬ @A‡¬@Aˆ¬€¬2€¬M€¬^ÀGð¬_àH<¬`$LNH<.H@DAH@DA”HXDA“H`DA”HdDA•HhDA”HlDA•HxDA—H¨¬a$AH@¬ž@A¬§$€NHÀ.HÀDBHÀDB HÔD UHäDB!HèD VHìD THðD VHøD WHüD \IDB#I0DB$IDDB%IHDB$ITDB%I\DB'I`DB(Ix¬¨$BHÀ¬ã@B¬ì€B8¬ø€B<­€B@­ ÀHÔ­àI`­$ÌNIŒ.IDB«IDB­I˜DB«IœDB­I¬DB®I¼DB°IÄ­ ºèDB±IÈDB°IÐDB±IÔDB°IØDB±IÜDB²IèDB³JDB´JDBµJ DB¶J0DB·J@DB¸JPDBºJ`­A$B«I­w@B«­‚@B«­‹@B«­”€­§€­Ã@B­ ­ÌÀI­ÍàJt­Î$äNJt.J€DB¼J€DBÀJ”D&jJ¤DBÁJ¨D&kJ¬D&iJ°D&kJ¸D&lJ¼D&qJÄDBÃJðDBÄKDBÅKDBÄKDBÅKDBÇK DBÈK`DBÉK DBÊKàDBËL DBÌL`DBÍL DBÎLàDBÏMDBÐM0­Ï$B¼J€® @B¼®€B¿8®€B¿<®)€B¿@®3ÀJ”®4àK ®5$ÄNMD.MPDBÒMPDBÕMlDBÖMxDBØMDBÙMœDBÛM´DBÜMÀDBÞMØDBßMäDBáMüDBâNDBäN DBåN,DBçNDDBèNPDBêNhDBëNtDBîN®6$BÒMP®q@BÒ®z@BÒ®…@BÒ®@BÓ®˜ÀMP®™àN¤®š$TNN¤.N°DBðN°DBôNÌDBóNÔDBôNØDBõNÜDBôNàDBõNìDBöO$DB÷O(DBøO,DB÷O0DBøO<DBùOtDBúOxDBûO|DBúO€DBûOŒDBüOÄDBýOÈDBþOÌDBýOÐDBþOÜDBÿPDCPDCPDCP DCP,DCPdDCPhDCPlDCPpDCP|DCP´DCP¸DCP¼DCPÀDCPÌDCQDC QDC Q DC QDC QDC QH®›$BðN°®Ó@Bð®Ü@Bò®åÀN°®æàQ`®ç$°NQ`.Q`DC Q`DCQlDC QtDCQ|DCQˆDCQ¨DCQ¬DCQ°DCQØ®è$C Q`¯@C ¯(@C ¯3@C¯<@C¯EÀQ`¯FàQð¯G$NQð.QðDC½QðDCÁRDCÂRD RD RD R$D R(D R,D R4D R8DCÄRpDCÅR„DCÆRˆDCÅR”DCÆRœDCÈR DCÉRàDCÊSDCËS0¯H$C½Qð¯‹@C½¯”€CÀ8¯ €CÀ<¯«€CÀ@¯µÀR¯¶àR ¯·$TNSD.SPDCÍSPDCÐSlDCÑSxDCÓSDCÔSœDC×S¸¯¸$CÍSP¯ü@CͰ@CͰ@CͰ@Cΰ#ÀSP°$àS̰%$|NSÌ.SÐDCÙSÐDCÝSìDCÜSôDCÝSøDCÞSüDCÝTDCÞT DCßTDDCàTHDCáTLDCàTPDCáT\DCãTˆ°&$CÙSаg@CÙ°p$ÐNT .T DDbT DDdT¨DDbT¬DDdT¼DDeTÌDDgTÔ°q ºðDDhTØDDgTàDDhTäDDgTèDDhTìDDiTøDDjUDDkU DDlU0DDmU@DDnUPDDoU`DDpUpDDqU€DDrUDDsU DDuU°°š$DbT °È@Db°Ó@Db°Ü@Db°å@Dd °îÀT °ïàUİð$$NUÄ.UÐDDwUÐDDyUäDDzV0DD{VpDD|V°DD}VðDD~W0DDWpDD€W°DDWðDD‚X0DDƒXpDD„X°DD…XèDD†XìDD…XðDD†XôDD…XøDD†YDD…Y °ñ$DwUб#@Dw±,$@NY.YDDˆYDD‹Y,DDŒY8DDŽYPDDY\DD‘YtDD’Y€DD”Y˜DD•Y¤DD—Y¼DD˜YÈDDšYàDD›YìDDZDDžZDD Z(DD¡Z4DD£ZLDD¤ZXDD¦ZpDD§Z|DD©Z”DDªZ DD¬Z¸DD­ZÄDD°Zà±-$DˆY±`@Dˆ±i@Dˆ±t@Dˆ±~@D‰±‡ÀY±ˆàZô±‰$äNZô.[DD²[DD¶[DDµ[$DD¶[(DD·[,DD¶[0DD·[<DD¸[tDD¹[xDDº[|DD¹[€DDº[ŒDD»[ÄDD¼[ÈDD½[ÌDD¼[ÐDD½[ÜDD¾\DD¿\DDÀ\DD¿\ DDÀ\,DDÁ\dDDÂ\hDDÃ\lDDÂ\pDDÃ\|DDÄ\´DDÅ\¸DDÆ\¼DDÅ\ÀDDÆ\ÌDDÇ]DDÈ]DDÉ] DDÈ]DDÉ]DDÊ]TDDË]XDDÌ]\DDË]`DDÌ]lDDÍ]¤DDÎ]¨DDÏ]¬DDÎ]°DDÏ]¼DDÐ]ôDDÑ]øDDÒ]üDDÑ^DDÒ^ DDÓ^DDDÔ^HDDÕ^LDDÔ^PDDÕ^\DDÖ^”DD×^˜DDØ^œDD×^ DDØ^¬DDÚ^رŠ$D²[±º@D²±Ã@D´±ÌÀ[±Íà^ð±Î$ðN^ð.^ðDDÛ^ðDDÝ^üDDÛ_DDÝ_ DDÞ_DDß_8DDÞ_<DDß_@DDá_h±Ï$DÛ^ð±þ@DÛ²@DÛ²@Dܲ@Dݲ$À^ð²%à_€²&$N_€._€DE£_€DE§_”Dv_¤DE¨_¨Dw_¬Ds_°Dw_¸Dz_¼D}_ÀDƒ_ÈD„_ÌD‡_ÔDŠ_ØD_àDEª`DE«`$DE¬`(DE«`4DE¬`<DE®`@DE¯`€DE°`ÀDE±aDE²a8DE³aP²'$E£_€²^@E£²g€E¦8²s€E¦<²~€E¦@²ˆÀ_”²‰à`@²Š$äNad.apDEµapDE¸aŒDE¹a˜DE»a°DE¼a¼DE¾aÔDE¿aàDEÁaøDEÂbDEÅb ²‹$Eµap²Ã@Eµ²Ì@Eµ²×@Eµ²á@E¶²êÀap²ëàb4²ì$ÄNb4.b@DEÇb@DEËb\DEÊbdDEËbhDEÌblDEËbpDEÌb|DEÍb´DEÎb¸DEÏb¼DEÎbÀDEÏbÌDEÐcDEÑcDEÒc DEÑcDEÒcDEÓcTDEÔcXDEÕc\DEÔc`DEÕclDE×c˜²í$EÇb@³"@Edz+$pNc°.c°DEØc°DEÚc¼DEØcÄDEÚcÌDEÛcØDEÜcøDEÛcüDEÜdDEÞd(³,$EØc°³`@Eسi@Eسt@EÙ³}@EÚ³†Àc°³‡àd@³ˆ$Nd@.d@DF”d@DF–dTDF—d”DF˜d˜DF—dœDF˜d DF—d¤DF˜d°DF—d¸³‰$F”d@³Ç@F”³Ð€´P$|Nd¼.dÀDFšdÀDFdÔDFždèDF¡dü´Q$FšdÀ´@Fš´™@Fš ´¤@Fš´®@F›´·ÀdÀ´¸àe ´¹$LNe .eDF£eDF§e(DF¦e0DF§e4DF¨e8DF§e<DF¨eHDFªex´º$F£e´ö@F£´ÿ$€Ne.eDF«eDF­eœDF«e¤DF­e¬DF®e¸DF¯eØDF®eÜDF¯eàDF±fµ$F«eµ;@F«µD@F«µO@F¬µX@F­µaÀeµbàf µc$Nf .f DGCf DGEf4DGFftDGGfxDGFf|DGGf€DGFf„DGGfDGFf˜µd$GCf µš@GCµ£$|Nfœ.f DGIf DGLf´DGMfÈDGPfܵ¤$GIf µÛ@GIµä@GI µï@GIµù@GJ¶Àf ¶àfì¶$LNfì.fðDGRfðDGVgDGUgDGVgDGWgDGVgDGWg(DGYgX¶$GRfð¶9@GR¶B$€Ngp.gpDGZgpDG\g|DGZg„DG\gŒDG]g˜DG^g¸DG]g¼DG^gÀDG`gè¶C$GZgp¶v@GZ¶@GZ¶Š@G[¶“@G\¶œÀgp¶àh¶ž$Nh.hDGühDGþhDGÿhTDHhXDGÿh\DHh`DGÿhdDHhpDGÿhx¶Ÿ$Güh¶Þ@Gü¶ç€· $|Nh|.h€DHh€DHh”DHh¨DH h¼·¡$Hh€·á@H·ê@H ·õ@H·ÿ@H¸Àh€¸ àh̸ $LNhÌ.hÐDH hÐDHhèDHhðDHhôDHhøDHhüDHiDHi8¸ $H hиH@H ¸Q$€NiP¸RiP.iPDIòiPDIóiXDIòi\DIóidDIòihDIói€DIôiDIõi¤DI÷i¸DIøiÈDIûjDIüjDJ+j0DIþj@DJjPDJjTDJjpDJ j„DJ jDJjÀDJjðDJkDJkDJ/kDJ(kDJ/k(DJ(kDDJkPDJ+kpDJ,k DJ-kÐDJ/kìDJ-kðDJ/kôDJ-küDJ/lDJ-lDJ/lDJ-lDJ/l ¸_$IòiP¸r@Iò¸~@Iò¸‹@Iò¸•$ôNlD¸–lP.lPDJ9lPDJ>lXDJ9l\DJ>ldDJ9lhDJ>lDJ?l”DJ@lœDJAl¤DJCl¬DJDl°DJElÀDJGlÈDJHlØDJGlÜDJHlàDJKlðDJNmDJUm DJXm,DJZmPDJYm\DJ]m€DJ^m„DJ_mŒDJ`mDJbmœDJcm¤DJbm¨DJcm¬DJem°DJfmÀDJgmÈDJhmÐDJjmèDJmnDJenDJrn$DJsn(DJrn0DJsn4DJyn@DJznXDJ|npDJ{nDJn DJ€n¤DJn¨DJ„n´DJ‡nÐDJˆoDJ‰oPDJŠoTDJŒoDJo”DJYoèDJZoôDJ{pDJep@DJpP¸©$J9lP¸Â@J2¸Ð@J3¸Þ@J4¸ð@J5¸ÿ@J6¹@J7¹@J8¹-@J:¹6@J:¹C@J:¹P@J;¹Y€¹j€¹{@J<¹†€¹“ÀlP¹”àpt¹•$$Npt¹–p€.p€DJÃp€DJÄpœDJÅp DJÄp¨DJÅp¬DJÆp´DJÇpÄDJÉpÐDJÊpàDJËpðDJÌqDJÍq@DJÎq€DJÏqÀDJÑqÄDJÏqÈDJÐqÌDJÑqÔDJÔqàDJÕr DJÖr`DJØr°¹ª$JÃp€¹Ä@JùÒ@Jùá@Jùí@JĹý€º€º/€¼B€¼U€¼h€¼{€¼Ž€¼¬€¼Ð€¿=€¿N€ÀD€ÀW€Àx€À–€À©€ÀÇ€Àã€Âh€Â³Àp€Â´àrĵ$DNrĶrÐ.rÐDJõrÐDJýrìDJõrðDJürüÂÄ ºÔDJýsDJÿsDKs0DKs8DKs`ÂÍ ºÐDKslDK sDK s”DK s°DKsÔDKtDKt@DKtpÂÖ$JõrÐÂê@JõÂö@JõÃ@JöÃ@J÷Ã+@JøÃ9@JùÃL@JúÃ^@JûÃjÀrÐÃkàt”Ãl$ÄNt”Ãmt .t DK9t DKBtÄà ºÜDKCtÐDKDtØDKEtàDKFtìDKGtøDKHuDKIuDKJu@DKKuLDKLu€Ã‘ ºØDK\uÄDK]uÐDKcuäDKduðDKeuøDKgvDKhv DKivPDKjv€DKkv°DKlvðDKmwDKlwDKmwDKlw DKmw$DKlw,DKmw4DKlw@DKmwHDKgwxDKmwß$K9t Ã¹@K9ÃÉ@K:ÃÛ@K;Ãî@K<Ä@K=Ä@K>Ä'@K?Ä8@K@ÄJ€Ä]€Ä|Àt Ä}àw´Ä~$Nw´Ä«.wÀDTwÀD_wÐDTwØDUwàDTwäD^wèÄ” ¾ÀD_wìD^wôD_wøDUxD^x D_xD`x Dax$D`x(Dax0Dbx<DexLÄž ºàDfxˆDgx¼DkxØDlxàDmxìD|yDny4Dpy8D}ytDqyDry¼DsyÌDtyøDyzD|z8D}zTD~zpDz€D‚z°DƒzàD…{ħ$TwÀÄæ@TÄú@TÅ @TÅ€U8Å5€V<ÅG@XÅV@Z Åe@[Åt@\Ń&]«Å›€Å¹ÀwÀźà{(Å»$hN{(ż ºp.{0D"{0D){@D"{HD){PD"{TD){XD*{tD+{xD*{€D+{ˆD-{”D.{ D6{ÀD7{ÔD;|D8|D;|D<|D>|D<|D=|$D>|(DI|`D?|€D@|¬DA|¼DB|ðDI}DK}0DN}@DO}pDQ} ÅÑ$"{0Æ@"Æ$@"Æ6@"ÆH@#Æ[@$Æj@&Æy@'ƈ& (ºpÆ €Æ¾À{0Æ¿à}¸ÆÀ$ˆN}¸ÆÁ« .}ÀD·}ÀDË}ØD·}àDË}äD·}èDË}ðDÌ~DÍ~DÐ~DÍ~$DÌ~(DÍ~0DÐ~4DÍ~8DÐ~@Dë~lDî~|Dï~¤Dð~ÜDò D8DÑ`D¼DÒàDÓ€DÖ€@DÝ€pD×€tDÝ€xDÞ€¨Dä€àDå€äDè€ìDLDìTDí˜DëÐDî‚Dï‚Dð‚(Dñ‚<Dò‚PDó‚dDô‚hDõ‚lDö‚pD÷‚tDý‚xDþ‚°D‚´D‚ÈDƒDƒ0Dëƒ`DƒxD ƒ|Dƒ„D ƒˆDƒ˜Dƒ°D„D„0D„pD„°D„ðD… D…0D…`Dë…D…°ÆÖ$·}ÀÇ@·Ç,@·Ç>@·ÇP€¸HÇd€¹LÇv@ºLJ€»PÇš€¼TÇ­€¾XÇÄ@¿ÇÕ@ÀÇä@ÁÇó@ÂÈ@ÃÈ@ÅÈ"@ÆÈ1@ÇÈ@@ÈÈO@ÉÈ^&Ê« Èv€È”À}ÀÈ•à…ØÈ–$N…ØÈ—«,.…àDˆ…àD…øDˆ†D†Dˆ†D†D‘†4D”†8D‘†@D”†HD•†€D¬†¸D–†ÐD—‡Dš‡0D›‡pDœ‡„D‡¸Dž‡¼D£‡ÀDŸ‡ÈD ‡ÔD£‡ØD®ˆD¤ˆ D¬ˆTD­ˆpD®ˆ¤D¯ˆÀD²ˆÐD´‰È¬$ˆ…àÈé@ˆÈý@ˆÉ@ˆÉ!€‰8É5€Š<ÉG@‹ÉV@ŒÉe@Ét@ŽɃ&«,É›€É¹À…àɺà‰ É»$@N‰ ɼ«8.‰ D ‰ D‰(D ‰,D‰4D ‰8D‰@D ‰DD ‰HD‰LD ‰TD‰\D ‰dD ‰hD‰lD‰€D‰¨D‰àDŠ D ŠPD!ŠTD$ŠXD Š`D!ŠhD$ŠtD%аDyŠèD&‹D'‹0D*‹`D+‹ D/‹¬D0‹´D1‹ÌD2ŒD4ŒD5ŒHD6ŒtD7Œ„D8Œ°D>ŒàDT DW<D[DD\PD]`D_dD]hD_xD^€D_ˆD`¼DaèDbøDcŽ$DiŽHDlŽLDoŽPDpŽDqŽÄDrDs,DtXDv„Dy Dz¸D|ðDD€@DpD‚ DƒàD…‘$ÉÑ$ ‰ Ê@ Ê+  ŒÊ=  ÊO€ 8Êf€ <Êv€ @Ê‹@Ê¢@ʳ@ÊÂ@ÊÑ@Êà@Êñ@Ë&«8Ë€Ë6À‰ Ë7à‘<Ë8$N‘<Ë9«D.‘@Dæ‘@Dî‘PDæ‘XDî‘`Dæ‘dDí‘hËN ¾¼Dî‘lDí‘tDî‘xDí‘„DDï‘”Dð‘˜DDð‘¤Dñ‘°D‘àD‘ðDò’Dó’Dø’`Dù’ Dý’¤D’ÀD’àD“ËX$æ‘@Ë—@æË«@æ˽@æËÏ€ç8Ëê@èËù@êÌ @ëÌ&ì«DÌ3€ÌQÀ‘@ÌRà“(ÌS$èN“(ÌT«L.“0D@Ñ“0D@Ò“HD@Ñ“LD@Ò“\D@Ó“lDý“tDû“xÌi ¾´D@Ó“|Dü“„Ìs ¾¸Dû“ˆDý“ŒDð“Dý“”Dü“˜Dý“œDð“¬Dý“°Dû“´Dý“¸Dü“¼Dý“ÀDþ“ÌDÿ“ôD”0D”pD”°D”´D”¼D”ÄD”ÔD”äD ”èD”ìD ”ôD •(D•0D•dDK•¬D•ÐD•èD–D– D–HD–TD–\D–`D–dD–hD–lD–˜D!–œD$–¤D%–°D$–´D%–¸D&–¼D'–ìD(—D)—@D*—lD+—˜D4—ÐD5˜D:˜,D;˜<D=˜@D;˜DD<˜LD=˜PD>˜ŒD?˜¸D@˜ÈDA˜ôDK™DL™0DN™pDP™„DQ™DR™ÐDSšDTš0DUš`DVšDWšÐD@Ô›D@Õ› D@Ø›dÌ}$@Ñ“0̰@@ÑÌ»@@ÑÌÄ@@ÑÌÍ@@ÒÌÖÀ“0Ì×€@Ô8Ìè€@Ô<ÌùÀ“tÌú€î@Í€ïDÍ%€ðHÍ:@ñÍQ@òÍd@óÍs€ôLÍ@÷Í’@øÍ¡@ùͰÀ“tͱà“|Ͳà“|ͳ€@Ô8ÍÄ€@Ô<ÍÕÀ“„ÍÖ€î@Íí€ïD΀ðHÎ@ñÎ-@òÎ@@óÎO€ôLÎ]@÷În@øÎ}@ùÎŒÀ“„Îà›ÎŽà›Îà›„Î$TN›„Α«X.›DAk›DAm› DAk›¤DAm›´DAn›ÄDAp›ÌΦ ºäDAq›ÐD;›ÔDAp›ÜDAq›àD7›äD;›èDApœDAqœD7œ DAqœD;œD<œ(D>œ,D<œ0D=œ8D>œHDIÛœPDIÜœXDIßœ€DAœœDEœ¨DBœ¬DHœ°DKœ¸DNœÀDOœÐDIáœðD>DU<DXLDAdDOˆDP DX°DYÐDAržDAsžDAvžDÎÜ$Ak›Ï@AkÏ"@AkÏ+@AkÏ4@AmÏ=À›Ï>€58ÏR€6<Ïd€7@Ïw@8φ@9Ï—À›ÔϘà›ÜÏ™€58Ï­€6<Ï¿€7@ÏÒ@8Ïá@9ÏòÀ›äÏóàœÏô€58Ѐ6<Ѐ7@Ð-@8Ð<@9ÐMÀœ ÐNàœÐO€58Ðc€6<Ðu€7@Ј@8З@9ШÀœЩ@>з@>ÐÂÀœPÐÃàœœÐÄ@>ÐÒ@>ÐÝÀœðÐÞàÐßàžÐààž\Ðá$ÌNž\.ž`D§ž`D±ž„D´žˆD±žŒD´ž”D¸ž¤D¹ž¬DºžðDן@D»Ÿ`D¼Ÿ°D½ D¾ @DàtD¿ xDÀ |DÁ €D „DàˆDÏ DР¨D× ÌDØ ðDÙ¡ DÚ¡PDÛ¡€DÝ¡ÀDà¡ÐDâ¡üÐâ$§ž`Ñ#@§Ñ7@¨ÑH@©ÑW@«Ñf@¬Ñu@­Ñ„@®Ñ“@¯Ñ¢@°ѱÀž`Ѳà¢$ѳ$ÄN¢$Ñ´ ºt.¢0D ¢0D ¢@D ¢HD ¢PD ¢TD ¢XD ¢tD ¢xD ¢|D ¢€D ¢ˆD !¢ŒD "¢œD $¢ D "¢¤D $¢´D #¢¼D $¢ÄD 0¢ôD %£D &£<D '£LD (£xD -£ D 0£¼D 2£ÔD 5£ðD 7¤ ÑÉ$ ¢0Ò @ Ò @ Ò2@ ÒD@ ÒS@ Òb@ Òq& ºtÒ‰€Ò§À¢0Ò¨à¤8Ò©$N¤8Òª«h.¤@D ¬¤@D À¤XD ¬¤`D À¤dD ¬¤hD À¤pD Á¤”D ¤˜D ŤœD ¤¤D Á¤¨D ¤°D Ť´D ¤¸D ŤÀD à¤ìD ã¤üD ä¥$D å¥\D 楌D 祤D õ¥ÐD ƦD ¦\D Ǧ€D Ȧ°D ˦àD Ò§D ̧D Ò§D Ó§HD Ù§€D Ú§„D ݧŒD ¨D á¨D â¨XD à¨D ã¨ÀD ä¨ÔD å¨èD æ¨üD ç©D è©$D é©(D ê©,D ë©0D ì©4D ò©8D ó©pD õ©tD ö©ˆD ÷©ÀD ø©ðD ઠD ýª8D ª<D ýªDD ªHD ªXD ªpD ªÀD ªðD «0D «pD «°D «àD «ðD ¬ D à¬PD ¬pÒ¿$ ¬¤@Ó@ ¬Ó@ ¬Ó+@ ¬Ó=€ ­XÓQ€ ®\Óc@ ¯Ót€ °`Ó‡€ ±dÓš€ ³hÓ±@ ´ÓÂ@ µÓÑ@ ¶Óà@ ·Óï@ ¸Ô@ ºÔ@ »Ô@ ¼Ô-@ ½Ô<@ ¾ÔK& ¿«hÔc€ÔÀ¤@Ԃଘԃ$XN¬˜Ô„«t.¬ D }¬ D …¬¸D }¬ÀD …¬ÄD }¬ÈD …¬ÐD †¬ôD ‰¬øD †­D ‰­D Š­@D ¡­xD ‹­D Œ­ÀD ­ðD ®0D ‘®DD ’®xD “®|D ˜®€D ”®ˆD •®”D ˜®˜D £®ÈD ™®àD ¡¯D ¢¯0D £¯dD ¤¯€D §¯D ©¯ÀÔ™$ }¬ ÔÚ@ }Ôî@ }Õ@ }Õ€ ~8Õ&€ <Õ8@ €ÕG@ ÕV@ ‚Õe@ ƒÕt& „«tÕŒ€ÕªÀ¬ Õ«à¯àÕ¬$@N¯àÕ­«€.¯àD L¯àD V¯ðD L¯øD M°D V°D L°D V° D M° D V°$D W°0D X°4D W°8D X°@D [°LD t°`D [°dD t°pD [°xD t°ˆD w°ŒD \°°D ]°ÄD o°ÈD w°äD x±D z±0ÕÂ$ L¯àÕû@ LÖ@ LÖ!@ LÖ3€ M8ÖJ€ N<Öb@ OÖq€Ö“@ QÖ¤& U«€Ö¼€ÖÚÀ¯àÖÛà±HÖÜ$hN±HÖÝ«ˆ.±PDB±PDB±hDB±lDB±|DB±ŒD $±”Öò ¾ÔD %±˜Öü ¾ØD &±œD $±¤D %±¨D &±¬D $±ÄD %±ÈD &±ÌD '±ØD (±äD )±ôD *²D +²D *² D +²(D ,²,D -²pD /²€D 0²ˆD 1²ÐD ?³D 2³D 4³ D 2³(D 3³4D 4³<D 5³HD 6³tD 7³ D ?³ÔD @³ìD B´ D D´@D E´DD F´pD G´ DB´ÐDB´ØDBµ×$B±P×>@B×I@B×R@B×[@B×dÀ±P×e€ 8×|€ <×@ מ€ @׬@ ×»@ !×Ê@ "×ÙÀ±”×Úà´Ð×Ûàµ4×Ü$äNµ4.µ@D)µ@D)µLD)µPD)µlD)µtD)µxD)µ|D)µ€D)µ„D)µŒD)µ˜D)%µ¤D)4µÄD)%µÈD)4µÔD)%µØD)4µàD)%µäD)4µìD)5µðD)–µøD)›µüD)&¶D)+¶@D)'¶DD)+¶HD)(¶PD)+¶TD)6¶`D)7¶lD)8¶œD)9¶ÐD):·D)9·D):· D)A·8D):·@D)A·DD)B·|D)C·¨D)D·¬D)G·´D)H·ØD)I·ÜD)M·ðD)N¸D)O¸$D)P¸TD)Q¸dD)R¸hD)S¸œD)T¸ÐD)U¹D)T¹D)U¹D)V¹0D)W¹4D)]¹<D)^¹TD)_¹hD)`¹xD)a¹|D)b¹ŒD)c¹ D)d¹ÔD)eºD)fº0D)gºdD)fºhD)gºlD)hºœD)iºÐD)nºüD)o»D)p»,D)q»8D)r»@D)s»|D)t»°D)u»äD)x¼D)€¼@D)¼\D)‚¼pD)ƒ¼„D)„¼˜D)ˆ¼œD)м D)„¼¤D)…¼¬D)†¼´D)‡¼ÀD)ˆ¼ÌD)‰¼ÐD)мÔD)‹½D)Œ½0D)½dD)½”D)½˜D)½œD)‘½ÐD)”½ÔD)‘½àD)”½äD)‘½ìD)”½ðD)›¾D)œ¾,D)¾dD)ž¾œD)Ÿ¾ÌD)¢¾àD)£¿D)¤¿@D)¥¿pD)§¿œ×Ý$)µ@Ø@)Ø-@)Ø@@)ØQ@)Øc@)Ør€)8Ø€€)<ØŽ€)@Øœ@)Ø­@)ؼÀµ@ؽ࿼ؾ$ |N¿¼.¿ÀD(õ¿ÀD(û¿ÜD(ú¿äD(ù¿èD(û¿ìD(ù¿ðD(û¿øD(ü¿üD)ÀD) À,D)À0D) À<D)ÀDD) ÀTD) À`D)ÀˆØ¿$(õ¿ÀØü@(õÙ@(öÙ!@(øÙ2À¿ÀÙ3àÀ Ù4$àNÀ Ù5 ºx.À D'lÀ D'wÀ¬D'lÀ°D'wÀ´D'lÀ¸D'wÀÀD'mÀÄD'lÀÈD'wÀÔD'lÀÜD'wÀäD'tÀìD'mÀðD'qÀôD'sÀøD'wÀüD'xÁD'yÁ0D'zÁpD'{Á°D'~ÁàD'ÁäD'~ÁìD'ÁôD'ÂD'ŸÂ(D'Â,D'ŸÂ0D'Â4D'ŸÂ8D'‚Â@D'ƒÂPD'ŠÂ€D'…ˆD'„ÂŒD'ŠÂD'…”D'ŠÂ˜D'‹Â¨D'ŒÂ¼D'ŽÂÀD'ŒÂÄD'ÂÐD'ŽÂÜD'Ã$D'ÃPD'‘ÄD'”ôD'‘øD'”üD'•ÃÄD'–ÃôD'™ÃøD'ŸÄD'¢Ä@D'ŸÄDD'¢ÄHD'ŸÄLD'¢ÄPD'£ÄXD'¤Ä`D'¥ÄlD'¦Ä¨D'©ÄÜD'ªÅD'«ÅDD'¬Å”D'¸ÅœD'¹ÅàD'ºÆ D'»Æ`D'¼ÆD'¿Æ D'ÀÆàD'ÁÇD'ÂÇ@D'ÃÇ€D'ÅÇÄÙK$'lÀ ÙŒ@'lÙ  'lŒÙ² 'lÙÄ€'m8ÙÙ@'nÙê@'oÙù€'q<Ú€'s@Ú€'tDÚ#@'uÚ2& 'vºxÚJ€ÚhÀÀ ÚiàÇäÚj$DNÇäÚk º|.ÇðD&ÞÇðD&éÇüD&ÞÈD&ßÈD&ÞÈD&éÈD&ÞÈD&éÈ$D&ÞÈ,D&éÈ4D&ßÈ<D&éÈ@D&êÈTD&ëÈtD&ìȬD&íÈäD&ðÉD&ñÉD&ðÉD&óÉ$D&öÉ4D&÷É8D&øÉ@D&ùÉPD&ûÉTD&ùÉXD&ûÉhD&úÉpD&ûÉxD'[ÉÀD&üÉØD&ýÊD&þÊD&ÿÊ@D'Ê`D'ÊdD' ÊhD' ʰD'ÊàD'Ë0D'Ë`D'ËdD'ËhD'ËpD'ËÀD'ÌD'Ì@D' ÌDD'ÌLD'ÌTD'ÌXD' Ì\D'!Ì D'"ÌÌD'#ÌøD')Í0D'*ÍtD'+ÍœD'-Í D'+ͨD',Í´D'-ͼD'.ÍôD'/Î D'0ÎLD'3ÎxD'4μD'5ÏD'6Ï,D'9ÏXD':ÏœD'?ÏÈD'@Ð D'AÐ(D'CÐ,D'AÐ4D'BÐ<D'CÐ@D'DÐxD'EФD'FÐÐD'IÐüD'JÑ8D'LÑ<D'JÑDD'KÑPD'LÑXD'MѤD'NÑÐD'OÒD'SÒD'[ÒPD'\ÒpD']Ò D'^ÒÐD'aÒàD'bÓ D'cÓPD'dÓ€D'eÓ°D'fÓàD'gÔ D'iÔpÚ$&ÞÇðÚ¿@&ÞÚÓ &ÞœÚå &Þ Ú÷€&ß8Û @&àÛ @&áÛ8@&âÛJ@&ãÛY@&åÛh@&æÛw@&çÛ†& &èº|Ûž€Û¼ÀÇðÛ½àÔ”Û¾$ ¤NÔ”Û¿ º€.Ô D&–Ô D&œÔ°D&–Ô¸D&œÔÀD&–ÔÄD&œÔÈD&¡ÔäD& ÔèD&ÔìD&¡ÔðD&ÔôD&¡ÔøD&ÔüD&¡ÕD&¤ÕD&¥Õ@D&ÓÕpD&¦ÕD&§ÕÀD&ªÕðD&«ÕüD&¬Ö0D&²Ö8D&³Ö<D&¶ÖDD&·Ö€D&¸ÖÀD&¹ÖðD&¼× D&½×,D&¾×`D&Ä×dD&Å×hD&È×pD&Ë×tD&Ð×|D&Ó×”D&Õ×°D&Ø×ÀD&Ú×ðÛÕ$&–Ô Ü@&–Ü"@&–Ü4@&–ÜF@&—ÜU@&™Üd@&šÜs& &›º€Ü‹€Ü©ÀԠܪàØÜ«$hNØܬ º„.ØD&vØD&{Ø D&vØ(D&{Ø0D&vØ4D&{Ø8D&|ØTD&}ØXD&|Ø\D&}ØdD&~Ø D&€Ø¤D&‚بD&~ذD&ؼD&€ØÄD&ØÔD&‚ØÜD&‹Ù D&ƒÙ0D&„Ù`D&…ÙD&ˆÙ”D&‹Ù°D&ÙÐD&ÙàD&’ÚÜÂ$&vØÜÿ@&vÝ@&vÝ%@&vÝ7@&wÝF@&xÝU@&yÝd& &zº„Ý|€ÝšÀØÝ›àÚ(Ýœ$NÚ(Ý ºˆ.Ú0D LÚ0D VÚ@D LÚHD VÚPD LÚTD VÚXD ZÚtD WÚxD [Ú|D WÚ€D [ÚˆD \ÚŒD eÚÀD nÚÔD oÚØD pÛD qÛD rÛ$D sÛ,D wÛ8D {ÛPD ÛXD €Û`D †Û D Û¨D ’ÛÀD “ÛÄD –ÛÐD ™ÛÔD oÛðD ¡ÜD ¢ÜD ¨ÜPD «ÜTD ´ÜˆD ·Ü D ¹ÜÐݲ$ LÚ0Ý÷@ LÞ @ LÞ@ LÞ/@ MÞ@@ NÞQ@ O Þb@ P Þt@ QÞƒ@ RÞ’@ SÞ¡& UºˆÞ¹€Þ×ÀÚ0ÞØàÜèÞÙ$¸NÜè.ÜðD ÊÜðD ×ÜüD ÊÝD ÔÝD ×ÝD ÔÝ D ×Ý(D ÛÝ8D ÜÝ@D ÝÝ€D úÝØD ÞÝðD ßÞPD àÞ D áÞàD æßD âßD ãßD äß D åß$D æß(D òß0D óßHD úßlD ûßD üßÀD ýßðD þà D à`D àpD àœÞÚ$ ÊÜðß@ Êß3@ ËßD@ ÌßS@ Îßb@ Ïßq@ Ð߀@ Ñß@ Òßž@ Óß­ÀÜðß®ààÄ߯$ÔNàÄ.àÐD2àÐD2àøD2 áD2#áD2$áPD24á„D2%á D2'á¤D2%á¬D2&á´D2'á¸D2(áÄD2)áðD2*â D2-âPD24âdD25â€D27â°D2:âÄD2;âðD2=ãß°$2àÐßã@2ß÷@2à @2à@2à(@2à7@2àFÀàÐàGàã<àH$lNã<.ã@D:ã@D: ã\D: ãdD: ãhD: ãlD: ãpD: ãxD:ã|D:ãˆD:ã D:ã¬D:ãÀD:ãÐD:ãÔD:ãØD:ãèD:ãðD:ãøD:)ä(D:ä@D: älD:!ä|D:"ä¨D:)äÌD:+ääD:.åD:0å(àI$:ã@à~@:à’@:à¡@: à°@: à¿Àã@àÀàå@àÁ$Nå@à«”.å@D2Aå@D2IåXD2Aå`D2BådD2AåhD2IåpD2Bå„D2IåˆD2Jå˜D2KåœD2Lå D2Oå¤D2Lå¨D2Jå¬D2Kå´D2LåÀD2OåÄD2LåÌD2OåÔD2PæD2Uæ@D2VæpD2mæ¤D2WæÀD2YæÄD2WæÌD2XæÔD2YæØD2ZæäD2[çD2\ç@D2_çpD2`ç´D2açìD2bèD2cè,D2eè0D2cè8D2dèDD2eèLD2fè|D2gè¨D2hèÔD2jéD2méD2né@D2oé€D2péÐD2séàD2têD2uê@D2wêpàØ$2Aå@á@2Aá$@2Aá6@2AáH€2B8áX@2Cál@2Dá{@2EáŠ@2Fá™@2Gá¨&2H«”áÀ€áÞÀå@áßàêáà$PNêáá ºŒ.êD/’êD/—ê D/’ê¨D/—ê°D/’ê´D/—ê¸D/˜êÔD/™êØD/˜êàD/™êèD/œêôD/­ëD/œë D/­ëD/œëD/­ë,D/ë@D/¢ëpD/¥ëtD/¢ë|D/¥ë„D/°ëD/±ëÀD/³ëðá÷$/’êâ(@/’â<@/’âN@/’â`@/“âw@/”â†@/•â•& /–ºŒâ­€âËÀêâÌàìâÍ$xNìâΫœ.ìD.îìD.ýì D.îì(D.ýì0D.îì4D.ûì@âä ¿¨D.üìDâï ¿¬D.ýìHD.ûìPD.üìTD.ýìXD.ûìhD.üìlD.ýìpD.þì|D.ÿì€D/ì„D/ìˆD/ìŒD.þìD.ÿì˜D/ì¤D/ì´D/ì¸D/ì¼D/ìÄD/íD/ í`D/ íD/íÀD/íÜD/íìD/íðD/îD/î D/î$D/î(D/î0D/îpD/îtD/î D/î¸D/ŒîôD/ïD/ïD/ïDD/ïŒD/ ï D/!ïÌD/$ïÜD/%ðD/&ð8D/'ðdD/*ðD/+ðÄD/,ðìD/-ñD/5ñHD/6ñ|D/8ñ€D/6ñŒD/7ñ”D/8ñ˜D/9ñÈD/:ñôD/;ò<D/<òhD/Aò˜D/BòœD/Aò D/Bò¤D/Cò¨D/Dò¼D/EòèD/IòðD/JóD/Kó0D/Pó4D/Qó\D/RóhD/SólD/TóxD/Uó|D/VóŒD/Wó”D/Xó D/Yó¤D/Zó´D/[óÌD/\ôD/]ô,D/^ôXD/cô„D/_ôˆD/côŒD/dô´D/eô¸D/fôÄD/gôôD/môøD/nõ8D/oõLD/sõPD/oõXD/põ`D/qõdD/rõtD/sõ|D/tõ°D/uõÜD/vöD/yö4D/öPD/€öTD/öXD/€ötD/öÀD/ƒöðD/†÷D/‡÷0D/ˆ÷`D/‰÷D/Š÷ÀD/‹÷ðD/Œø D/Žøpâú$.îìã0@.îãD@.îãV@.îãh€.ï8ãz€.ð<ã‘@.ñã¥@.òã·@.óãÏ@.ôãã@.õãò@.öä@.÷ä€.ø@ä@.ùä-&.ú«œäE€äcÀìädàøäe$ €Nøäf«¨.øD,•øD,œø¨D,•ø°D,–ø´D,•ø¸D,œøÀD,–øÔD,œøØD,øèD,žøìD,ŸøðD,øøD,žùD,Ÿù D, ù@D,©ùtD,¡ùD,¢ù¨D,£ùàD,¤úD,¦ú@D,©ú\D,ªú€D,¬ú°D,¯úÀD,°úðD,²û ä|$,•øä³@,•äÇ@,•äÙ@,•äë€,–8äÿ@,—å@,˜å@,™å,@,šå;&,›«¨åS€åqÀøåràû@ås$°Nû@åt º.û@D,aû@D,hûPD,aûXD,hû`D,aûdD,hûhD,mû„D,iûˆD,mûŒD,iûD,mû˜D,nûœD,oû¬D,qû°D,oû´D,qûÄD,pûÌD,qûÔD,ŠüD,rü0D,sü`D,tüpD,uü D,{üÐD,|ýD,}ý D,~ý8D,ýTD,€ýpD,ý´D,‚ýàD,ŠþD,‹þ0D,þpD,þ€D,’þ°åŠ$,aû@åÁ@,aåÕ@,aåç@,aåù@,bæ@,dæ@,eæ&@,fæ5& ,gºæM€ækÀû@ælàþÈæm$ˆNþÈæn º”.þÐD,+þÐD,3þèD,+þðD,3þôD,+þøD,3ÿD,4ÿD,5ÿ D,8ÿ$D,5ÿ,D,4ÿ0D,5ÿ8D,8ÿ<D,5ÿ@D,8ÿHD,9ÿ€D,>ÿ°D,?ÿðD,T<D,@`D,A°D,BÄD,CðD,D(D,E,D,H0D,JtD,IxD,J|D,T„D,U D,VàD,WD,X@D,[PD,\€D,^°æ„$,+þÐæ¹@,+æÍ@,+æß@,+æñ@,,ç @,-ç@,.ç(@,/ç7@,0çF@,1çU& ,2º”çm€ç‹ÀþÐçŒàÔç$NÔ.àD1ÓàD1ÖðD1ÓôD1ÖD1Õ D1ÖD1×$D1Ü(D1×,D1Ü8D1×<D1ÜLD1ßPD1á|çŽ$1ÓàçÁ@1ÓçÕ$´N”. DEà DEá¨DEà¬DEáÄDòÈDõÌDòÐDóØDôäDõðDöüDøDöDøD÷Dø$DTDùpDú Dû°DüàDD D,D`DDEåÀDEéàçÖ$Eà è@Eàè@Eàè%@Eàè.@ðè=@ñèLÀÈèMàÀèN$XNøèO º˜.D D "D  D "$D (D "0D /PD #xD $|D '€D $„D #ˆD $D 'œD (ÐD -D .D /0D 0DD Q D 1ÀD 2D 3`D 4°D 5ðD 6 D 7 $D @ (D 8 ,D 9 0D : 4D @ 8D A €D C „D D àD E D F @D . pD J €D Q ˜D R °D S àD T D U @D V €D W ´D X ðD [ D \ 0D ^ `èe$ èž@ è²@ èÄ@ èÖ@ èç@ èø@ é@ é@ é%@ é4@ éC@ éR@ éa@ ép@ é& !º˜é—€éµÀé¶à ˆé·$ˆN ˆé¸«°. D„ D– œD„  D– ¤D„ ¨D– °D† ´D„ ¸D– ÄD• ÈéÎ ¿DD– ÌD• ÐD„ ÔD– ÜD† äD• èD– ìD— D˜ $D™ `Dš  D ÐDž ÔD£ ØD¦ ÜD£ äD èDž ðD£ üD¦D£D¦ DDDØPDæœDéìDóDô`Dõ˜DöÈD§DpD¨D©Dª0D«`D°D³ÐD¶$D·XD¸°D¹¼DºÀD»èD¼D½LD¾¸D¿äDÀDÁ<DÆlDǨDÌÔDÎ@DÏHDÐTD°DÓÀDÖìD×0DØpDÙŒDÚœDÛÈDÜôDÝDÞ`DßtDàÀDáÐDâüDä(Då4DæDç¤Dé¨Dç°Dè¸Dé¼DêÌDëøDì$Dò`Dó°DôÌDõàDöôD÷D D÷Dø Dù$Dú(Dû,Dü0Dø4Dý8DþHDPD DÌD øD `D  D¤D ¬D ´D¸DD,DXD”DÀDÜD D!0D"`D#D$ÐD%D( D)`D*D+ÀD,ðD- D.PD/€D0°D1ðD3 4éÙ$„ ê@„ê# „¼ê5 „ÀêG€…8ê`€†<êu@‡ê‘@ˆê¦@‰ê·@ŠêË@‹êã@Œêò@ë@Žë@ë@ë.€‘@ë<@’ëK@“ëZ&”«°ër€ëÀ ë‘à \ë’$ÌN \ë“ ºœ. `Dx `D… xDx €D… „Dx ˆD… D† ¬D‡ °D† ¸DŠ ÀD ÌDŽ àD!D’!D!D’!D“!`D˜!D™!”Dœ!àD!ôDÔ"(Dž"@DŸ"TD¡"XD¢"€D£"°D¤"àD¥"ðD¦# D­#$D®#\D³#D´#¤D¹#ÐDº#ìD»$D¼$@DÂ$DD½$HD¾$TD¿$XDÀ$dDÂ$hDÃ$tDÅ$xDÆ$ÀDÇ$ðDÈ% D™%`DÍ%pD¤%ˆDº%¸DÂ%èDÔ&DÕ&,DÖ&\Dœ&”D­&¬D³&ÔD¹'DÖ'0D×'@DÚ'PDÛ'€DÜ'°DÝ'àDÞ(Dà(@ë©$x `ëé@xëý@xì@xì!@yì2@zìF@{ìW@|ìl@}ì€@~ì@ìž@€ì­@ì¼@‚ìË& „ºœìã€íÀ `íà(dí$N(dí«¸.(pD+(pD6(ˆD+(D,(”D+(˜D6( D,(´D6(¸D7(ÈD8(ÌD9(ÐD7(ØD8(àD9(ìD<(øD=) D>)@DA)DD>)LDA)PDB)Dj)ÄDC)àDE)äDC)ìDD)øDE*DF* DG*@DH*pDI*ˆDM*ÀDN+DO+<DP+hDT+ˆDU+DV+ DX+¤DV+¨DX+¸DW+ÀDX+ÈDY+üDZ,(D[,8D\,dDb,ˆDj,ðDk-DH-DDl-dDm-Dp- Dq-ÐDr.Dt.0í$+(píV@+íj@+í|@+펀,8í @-í±@/íÅ@0íÔ@1íã@2íò@3î&5«¸î€î7À(pî8à.Pî9$àN.Pî: º ..PD.PD.\D.`D.dD.hD.pD.tD.xD.„D.ŒD.”D.œD. D .´D .ÔD /D /PD/€D/„D/ŒD/”D/ÐD0D0 D08D0pD0 D 0ÐD0ðD1$D1@D 1tD!1D$1 D%1àD&2D'2PD)2”îP$.PîŠ@îž Œî° î€8î×@îæ@îõ@ï@ï& º ï+€ïIÀ.PïJà2´ïK$dN2´.2ÀDEë2ÀDÏ2ÐDEë2ÔDÎ2àDÏ2ìDÐ3 DÒ3$DÐ3,DÑ34DÒ38DÛ3hDÓ3€DÛ3°DÝ3ÐDà3àDEí4 ïL$Eë2ÀïŠ@Eëï“@Eëï@Ëï¬@Ìï»À2Ðï¼à2Ôï½@ËïÌ@ÌïÛÀ2àïÜà4 ïÝ$dN4$.40D®40D³4LD²4PD³4\D´4D¿4ÀDµ4àD¶5DÀ5@D·5`D¿5”DÀ5°DÁ5ÐDÄ5àDÆ6 ïÞ$®40ð@®ð+@¯ð:@°ðI@±ðXÀ40ðYà6$ðZ$ôN6$ð[ º¤.60D ø60D ý6@D ø6HD ý6PD ø6TD ý6XD þ6tD ÿ6xD þ6€D ÿ6ˆD 6ÀD 6ðD 7D 7@D 7pD 7D 7ÄD 7àD 8D 8D 8@ðp$ ø60ð±@ øðÅ@ øð×@ øðé@ ùðø@ úñ@ ûñ& üº¤ñ.€ñLÀ60ñMà8XñN$(N8XñO º¨.8`D °8`D ¹8xD °8€D ¹8„D °8ˆD ¹8D º8¬D ¼8°D ¿8´D ¼8¸D º8¼D ¼8ÄD ¿8ÐD ê9D À9D Å9@D Ç9„D È9ŒD É9˜D ê9äD Ì:D Ï:0D Ð:D Ñ:ÐD Ò:äD Ó;D Ô;$D Ø;(D Ô;,D Ö;4D Õ;8D Ø;<D Ù;€D Û;„D Ü;ÐD Ý<D Þ<0D à<`D ã<ŒD ê<¤D ë<¼D ì<ìD í=D î=XD ñ=hD ò= D ó=ÐD õ>ñd$ °8`ñ¡@ °ñµ@ °ñÇ@ °ñÙ@ ±ñê@ ²ñþ@ ³ò @ ´ò@ µò+@ ¶ò:@ ·òI& ¸º¨òa€òÀ8`ò€à>(ò$ÈN>(.>0D x>0D }>@D x>DD |>PD }>\D ~>D €>”D ~>œD >¨D €>°D ‰>àD ?D ‰?4D ‹?PD Ž?`D ?Œò‚$ x>0òÂ@ xòÖ@ yòå@ zòô@ {óÀ>0óà?¤ó$tN?¤.?°D#+?°D#/?ÐD#1?ÔD#/?ØD#0?àD#1?ìD#2?øD#4?üD#2@D#4@D#3@D#4@ D#=@PD#5@pD#6@ D#7@°D#8@àD#=AD#?A D#BA,D#CA`D#EAŒó$#+?°ó@@#+óT@#+óg@#-óv@#.ó…À?°ó†àA¤ó‡$ôNA¤.A°D!ìA°D!üAÔD!ûAÜD!ýAèD"AôD"B D"B@D"BDD"BHD"BPD"$B€D"B°D" BàD" BäD" CD"CD" C D"C$D"C,D"C8D"SCtD"C€D"HCØD"CðD"DD"DD"D`D"DD"DÀD"DÐD"ED"!ED"$E D"!ED"$E0D"%E<D"&ED"'EðD"(F D")FpD"*F°D"+F´D"0F¸D",FÀD"0FÄD"1GD"2G,D"3GXD"4GD"6G”D"7GðD"8HD"9HHD"<HD" H¤D"<H¨D" H¬D"@H´D"HøD"HIDD"II\D"JIŒD"KI¼D"LIìD"MJ4D"NJhD"QJ€D"RJ°D"SJàD"UK óˆ$!ìA°ó¿@!ìóÓ@!íóä@!îóõ@!ïô @!ðô@!ñô)@!òô8@!óôG@!õôV@!öôe@!øôt@!ùôƒ@!úô’ÀA°ô“àK4ô”$ „NK4ô•K@.K@D §K@D ²KXD §K\D ¬K`D ²KlD ¬KpD ·K€D ¸KˆD ÃK°D ¸K´D ÃKÀD ¸KÈD ÃKØD ÆKàD ½LD ÆLD ÈL ôÓ$ §K@õ@ §õ-€ ©8õA@ ªõP@ «õ_ÀK@õ`àL8õa$øNL8õbL@.L@D #L@D -L\D #L`D -LlD )LpD -LtD )LxD -L€D 5L„D 6LŒD 7L”D 8L˜D <L D =L¬D CLÐD GLÔD FLØD GLÜD HLèD KM€D LM„D MMŒD QND RND TND RND TN(D SN0D TN8D tNhD UN€D VN¬D WN¼D XNèD ]OD `OD ]OD dO D gO$D hO0D nOdD tOlD vOD yO°D {OØõ¢$ #L@õè@ #õþ@ #ö@ $ö&€ö7@ %öF@ &öU@ 'öd@ (ösÀL@ötàOøöu$¸NOøövP.PDNPDXP DNP$DSP(DTP<DUPHDXPTD[PXD^P\DaP`DbPlDgP DcP¤DgP¨DjP´DkP¸DlPÀDmPÌDnQDrQDsQDtQ`DQDuQ°DvQÜD|R D}R,D~R`D„RhD‡RlD„RpD‡RtDR|D’R”D•R°D–RàD—SD™S<ö´$NPöø@N÷@N÷#@N÷6@N÷J@N÷^@O÷m@Q÷|@R÷‹ÀP÷ŒàST÷$TNST÷ŽS`.S`DkS`DsS|DoS„DsSˆDoSŒDsS”DvS˜DwSœDS¤D‚SèD‰TDˆTD‰TDT DTDIêT DT(DIêT,DT0DIêTDDIëTHDIìTTDIëT\DIìT`DIíThDIïTxD¡TD¢T”D¤T¼÷Æ$kS`ø@kø@mø)€ø<ÀS`ø=€IèHøK€IèLøY€IèPøf@IéøqÀT øràT(øs€IèHø€IèLø€IèPøœ@Iéø§ÀT,ø¨àT0ø©€IèHø·€IèLøÅ€IèPøÒ@IéøÝÀTDøÞàTøßàTÔøà$tNTÔøáTà.TàD'ÇTàD'ÑTèD'ÇTìD'ÍUD'ÇUD'ÍU D'ÑUD'ÒUD'ÓU(D'ÕU,D'ÓU0D'ÕU@D'ÔUHD'ÕUPD(U€D'ÖU˜D'×UÄD'ØUÔD'ÙVD'àV0D'âV@D'ãVDD'äVLD'åVPD'íV`D'ìVdD'íVhD'îVpD'áVtD'üV€D'øV„D'üV”D'ýVœD'þV¬D(V°D'þV´D(VÄD'ÿVÌD(VÔD(WD(W@D(WPD(W€D(W¤DIêWÀDIëWÐDIìWÜDIëWäDIìWèDIíWðDIïXD(X D'áX@D(X`ù$'ÇTàù[@'Çùq@'Çù…@'Ç ù–@'Çù±@'ÇùÈ@'Éù×@'Ëùæ@'ÌùõÀTàùö€Iè8ú€Iè<ú€Iè@ú@Iéú*ÀWÀú+àX ú,àXxú-$˜NXxú.X€.X€D ÊX€D ÒXœD ÎX¤D ÒX¨D ÎX¬D ÒX´D ÓX¸D ÚXàD ÙXäD ÚXèD àYD ÓYDIêYD ÓY DIêY$D ÓY(DIêY<DIëY@DIìYLDIëYTDIìYXDIíY`DIïYpD óY€D õY¨új$ ÊX€ú¬@ ÊúÂ@ ÊúÙ@ ÌúèÀX€úé€Iè8ú÷€Iè<û€Iè@û@IéûÀYûàY û€Iè8û-€Iè<û;€Iè@ûH@IéûSÀY$ûTàY(ûU€Iè8ûc€Iè<ûq€Iè@û~@Iéû‰ÀY<ûŠàY€û‹àYÀûŒ$@NYÀûYÀ.YÀD¬YÀD¾YÈD¬YÌD´YäD·YèD´YìD·YðD´YôDºYøD¾YüDÁZDÂZDÉZDÌZ$DÐZ<DÑZDDÒZTDÔZXDÒZ\DÔZlDÓZtDÔZ|DíZ¬DÕZÐDÖZüD×[ DØ[8Dá[`DÞ[hDá[lDí[xDIê[DIë[ DIì[¬DIë[´DIì[¸DIí[ÀDIï[ÐDò[àDô\ ûÊ$¬YÀü @¬ü#@¬ü8@­üN@®üd@¯ü}@°üŒ@²ü›@³üªÀYÀü«€Iè8ü¹€Iè<üÇ€Iè@üÔ@IéüßÀ[üàà[àüáà\$üâ$dN\$üã\0.\0D ÷\0D \PD ý\\D þ\hD \tD \xD \ˆD \ŒD \D \ D \¨D \°D @\àD ]D ],D ]<D ]hD ]D ]”D ] D ]¬D ]´D ]ÄD ]ÈD ]ÌD ]ÜD ]äD ]ìD ^ D ^LD ^\D ^ˆD )^°D &^´D )^¸D /^ÀD 2^ÄD 3^ÈD 4^ÐD @^äDIê_DIë_DIì_DIë_$DIì_(DIí_0DIï_@D E_PD F_€D H_¬ý$ ÷\0ý_@ ÷ýu@ ÷ýŠ@ øý£@ ûý²@ üýÁÀ\0ý€Iè8ýЀIè<ýÞ€Iè@ýë@IéýöÀ_ý÷à_Pýøà_Äýù$”N_Äýú«À._ÐD a_ÐD n_ØD a_ÜD n_àD c_äD a_èD n_ôD c` D n`D o`(D p`,D o`0D p`<DIÛ`DDIÜ`LDIß`pD s`D t`˜D …` D „`¨D …`¬DIá`ÀD p`ìD uaD va D xa$D va(D xa8D wa@D xaHD ªa€D ya˜D zaÄD {aÔD |bD „b0D …b<D †bDD ƒbLD ‘bdD ’b€D “bˆD ‘bD œb D bÐD žbäD  c D Ÿc$D  c(D ªc0D «cPD ­cD °c D …cØD ’cðD “côD ²d þ$ a_ÐþD@ aþV@ aþh@ aþz€ b8þ€ c<þ¨€ d@þ½€ eDþÑ@ gþà@ iþï@ jþþ@ lÿ & m«Àÿ%€ÿCÀ_ÐÿD@ pÿRÀ`DÿSà`ÿT@ pÿbÀ`Àÿcà`ìÿdàd8ÿe$hNd8ÿf«Ô.d@DGðd@DGòdPDGðdTDGòddDGódtDGõd|D ¹d€DGõdŒD ¶dD ¹d”DGõd¤D ¶d¨DGõd¬D ¹d¸D ºdÄD ¼dÈD ºdÌD »dÔD ¼däDIÛdìDIÜdôD ¼e D ÉeD ¼eD Ée D ¼e(D Ée8D Ìe@DIße`D ¿e€D ÀeŒDIáe°D ÀeàD ÁfD ÄfD ÁfD Äf D Ìf D Íf@DGöfpDG÷fxDGúf´ÿ|$Gðd@ÿ·@GðÿÂ@GðÿË@GðÿÔ@GòÿÝÀd@ÿÞ€ ¶8ÿù@ ·Àd€ àdŒ € ¶8%@ ·4Àd5àd¤6€ ¶8Q@ ·`Àd¨aàd¬b€ ¶8}@ ·ŒÀd¸@ ¼›Àdìœàe @ ¼«Àe`¬àe€­@ ¼»Àe°¼àeà½àfp¾àfÌ¿$ŒNfÌÀ«Ü.fÐDFˆfÐDFŠfàDFˆfäDFŠfôDF‹gDFg D dgDFgD ag D dg$DFg4D ag8DFg<D dgHD egTD ggXD eg\D fgdD ggtDIÛg|DIÜg„D ggœD og D gg¤D og°D gg¸D ogÈD rgÐDIßgðD hhD ih$DIáh@D ihpD jhD rh D shÀDFŽhðDFhøDF’i4Õ$FˆfÐ@Fˆ@Fˆ#@Fˆ,@FŠ5ÀfÐ6€ a8Q@ b`Àgaàgb€ a8}@ bŒÀg àg4Ž€ a8©@ b¸Àg8¹àg<º€ a8Õ@ bäÀgHå@ góÀg|ôàgœõ@ gÀgðàh@ gÀh@àhpàhðàiL$|NiL.iPD “iPD —ipD ™i|D ˜i€D ™iŒDIÛiDIÜi˜DIßiÀD šiìD ›jDIáj D ™jLD šjpD ›j”D ¤j´D œjÐD ¤kD ¦k D ©k0D ªk`D ¬kŒ$ “iP[@ “o@ “ƒ@ ”’@ •¡@ –°ÀiP±@ ™¿ÀiÀàiìÁ@ ™ÏÀj ÐàjLÑàk¤Ò$TNk¤Ó«ä.k°D.Äk°D.ÍkÀD.ÄkÈD.ÅkÐD.ÄkÔD.ÌkØé ¿¤D.ÍkÜD.ÌkäD.ÍkèD.ÅkøD.ÌküD.ÍlD.ÎlD.ÏlD.ÎlD.Ñl D.Ïl$D.Ðl0D.Ñl@DIÛlHDIÜlPDIßlpD.ÔlœD.Õl´DIálÐD.ÑlüD.Ôm D.ÕmDD.ámdD.Öm€D.×m°D.âmèD.ØnD.Ùn,D.Ün4D.ÞnpD.ánˆD.ân¤D.ãnÀD.ænÐD.çoD.èo0D.êo`ô$.Äk°+@.Ä?@.ÄQ@.Äc€.Å8v€.Æ<ˆ@.Ç—@.Ȧ@.ɵ&.Ë«äÍ€ëÀk°ì@.Ñú@.ÑÀlHàlœ@.Ñ@.Ñ ÀlÐ!àlü"àox#$ÈNox$o€.o€D2¯o€D2µo¨D2´o°D2µo¼D2¸oÈD2ºpD2»pD2¼pD2Ñp@D2¿p`DJÛphDJÜppDJßpD2Àp¸DJápÐD2ÀpøD2ÄqD2ÁqD2ÄqD2Çq D2Èq0D2ÍqDD2ÑqtD2ÒqŒDIêqÀDIëqÐDIìqÜDIëqäDIìqèDIíqðDIïrD2ÕrD2Ör@D2×rlT$2¯o€Š@2¯ @2¯¸@2°Ì@2±Û@2²êÀo€ë@2¿ùÀphúàp¸û@2¿ ÀpÐ àpø €Iè8€Iè<'€Iè@4@Ié?ÀqÀ@àrAàrˆB$NrˆC º¬.rD+ørD+ÿr¨D+ør°D+ÿr´D+ør¸D+ÿrÀD,rÜD,ràD,rèD,rðD,rüD,s0D,s8D,sDD,spD, sDJÛs˜DJÜs DJßsÀD, sèDJátD, t(D,t@D, tHD,tLD,t`D,t D,tÐD,uD,u,D,uhD,uœD,uÈD,uôD,v D, v$D,"v`D,%vpD,&v D,(vÐY$+ør‰@+ø@+ø¯@+øÁ@+ùÕ@+úä@+ûó@+ü@+ý& +þº¬)€GÀrH@, VÀs˜WàsèX@, fÀtgàt(hàvði$`Nvðj º°.vðD/·vðD/¿wD/·wD/¿wD/·wD/¿w D/Àw<D/Áw@D/ÅwDD/ÁwHD/ÀwLD/ÂwTD/Åw`D/Æw”D/ÌwäD/ÍwüD/ÎxD/ÍxD/Îx D/ÑxD/Òx(D/êxLD/ÓxpD/Ôx DJÛx¨DJÜx°DJßxÐD/ÕxøDJáyD/Ôy4D/ëyDD/ÕyLD/ÚypD/ÖytD/ÚyxD/Ûy€D/Üy°D/ßy´D/àyÄD/áyðD/âz D/çzPD/êzhD/Ìz„D/Ñz¨D/ßzÌD/ëzðD/ì{D/ï{,D/ð{`D/ñ{D/ó{À€$/·vð²@/·Æ@/·Ø@/·ê@/¸þ@/¹@/º#@/»2€/¼8@@/½O& /¾º°g€…Àvð†@/Ô”Àx¨•àxø–@/Ô¤Ày¥ày4¦à{à§$ðN{à¨{à.{àD’{àD—{èD’{ìD¡{ðD’{ôD’| D|D›|D—|(D˜|,D™|0Dœ|4D|@D¡|LD¢|PD£|Dï|ÌD¤|ðD¥}D¦}<D§}PD­}TD§}\D¨}`D©}hDª}pD«}tD¬}xD­}|D®}°D¯}ÜD°~D±~4D²~8D¶~@D·~D¸~¤D¹~´D»~¸D¹~¼Dº~ÀD»~ÄD¼D½4D¾`DÆDÓÄDÆÈDÓÌDÆÐDÓÔDÇàDÈüDÉ€DÊ€DÉ€DÊ€DË€ DÌ€4DÍ€hD΀œDÓ€ÌDÔDÓDÔ DÕ@DÔDDÕLDÙ€DJ½„DÕˆDÙŒDJ½DÕ”DJ½˜DJ¾ DJ¿¬DÙ´DJ¿¸DÙÄDÚàDÛäDÚèDÛìDÜ‚ DÝ‚4DÞ‚@Dß‚|Dà‚°Dá‚äDèƒDïƒ,DðƒPDñƒDòƒÐDó„Dô„PD÷„dDø„Dù„ÀDï„ðDû…ã$’{à$@’:@’N@’f@’{@’@“£@”²@•Á@–Ѐ—8Þ€˜<쀙@ú@š À{à @Ù À„ àˆ @Ù $À %à” &@Ù 2À˜ 3à´ 4@Ù @À¸ AàÄ Bà… C$ 8N… D«ð.… D=o… D=Ÿ…,D=o…4D=œ…P Z ¿¸D=…T e ¿¼D=ž…X p ¿ÀD=œ…\D=Ÿ…`D=…dD=Ÿ…hD=p…lD=ž…pD=Ÿ…tD=p…„D=œ…ˆD=…ŒD=ž…D=Ÿ…”D= …¬D=³…°D= …¸D=¡…ÄD=¢…ÔD=£…äD=¶…ôD=³…øD=¶…üD=³†D=¶†D=³† D=·†D=¶†D=·†D=¸†D=¾†0D=¿†DD=ȆpD=ņtD=Ȇ|D=Ɇ°D=̆¼D=͆ÈD=̆ÌD=͆ÐD=ΆÔD=φìD@³‡D=Ї4D=Ò‡8D@´‡tD=Ó‡ D=Ô‡ÌD=Õ‡ÜD=ÖˆD=߈@D=àˆhD=߈lD=àˆpD=áˆtD=â‰D=㉌D=å‰D=æŠ@D=çŠlD=èŠ|D=éЍD=ø‹D=ï‹D=õ‹ D=ø‹D=õ‹D=ò‹D=û‹ D=ï‹$D=ø‹(D=û‹,D=ü‹dD=û‹hD=ü‹lD=ý‹pD=þŒ D=ÿŒ¸D>Œ¼D>XD>„D>”D>ÀD> ŽD> Ž”D> Ž D> ޤD> ލD>ެD>D>HD>ÈD>hD>”D>ÐD>‘TD>‘XD>‘dD>‘pD>‘tD>‘|D>‘€D> ‘üD>!’(D>"’`D>'’ŒD>(“D>,“@D>-“ÐD>4”D>5”4D>4”8D>5”<D>6”@D>7”TD>6”XD>7”\D>8”lD>9”„D>;”ˆD>9”ŒD>;”D>9””D>:” D>;”¤D>:”¨D>;”¬D>:”°D>;”¸D><•0D>=•hD>>•xD>?•¤D>E– D>F– D>E–$D>F–(D>I–<D>J–ÔD>L–ØD>J–ÜD>K–ìD>L–ôD>K–øD>L–üD>M—ŒD>N—¸D>O˜HD>R˜xD>U˜°D>V™8D>W™´D>Y™¸D>W™ÀD>Y™ÈD>ZšLD>[š„D>\š´D>cšÀD>d›LD>i›|D>jœD>oœ,D>pœŒD>qœÈD>rœäD>sD>tˆD>uŒD>xD>t”D>xœD>u D>v°D>x¸D>yž8D>zždD>{žD>€ž¼D>ŸD>‚ŸTD>ƒŸpD>„ŸœD>…  D>‰ D>… D>‰ D>†  D>‡ 0D>‰ 8D>Š ÈD>‹ ôD>Œ¡ D>‘¡LD>’¡ÌD>—¡øD>˜¢D>—¢ D>˜¢D>™¢D>š¢ D>›£0D>¡£\D>¢£lD>¡£pD>¢£tD>££xD>¤£ðD>¥¤„D>«¤¼D>¬¥XD>­¥ðD>®¦D>¯¦°D>°¦´D>³¦¸D>¯¦¼D>³¦ÄD>°¦ÌD>³¦ÐD>°¦ÔD>±¦àD>³¦ðD>´§pD>µ§¨D>»§ÔD>¼¨D>ͨTD>½¨lD>Á¨pD>½¨xD>¾¨€D>¿¨„D>À¨D>Á¨”D>¨ D>èÌD>ĨøD>Í©,D>ΩDD>ЩtD>Ñ©€D>Щ„D>Ñ©ˆD>Õ©”D>Û©ÄD>Õ©ÈD>Û©äD>Ö©ìD>שüD>ت(D>âªTD>ܪ`D>ݪ˜D>ÞªÐD>è« D>䫤D>è«°D>䫼D>è«ÀD>å«ÈD>æ«ÌD>å«ÐD>è«ÔD>å¬D>è¬ D>æ¬D>ç¬D>å¬D>ï¬ D>ð¬4D>ï¬8D>ð¬<D>ñ¬ÀD>ò­HD>ó­LD>õ­xD>÷­ˆD>ø®$D>ù®PD>ú®\D>û®ÐD>ü¯D?¯D?¯„D? ¯°D? ¯ðD? °D? ° D? °D?°D?°0D?°DD?°HD?°\D?°ˆD?°˜D?°ÄD?±4D?±\D?±`D?±dD?±hD?±„D? ±˜D?"±œD?#±°D?$±ÜD?%±ìD?&²D?,²ˆD?-²œD?4² D?5²¸D?4²¼D?5²ÀD?6²ÄD?7²ØD?8²ðD?9²üD?:³(D?;³4D?<³TD?=³lD?>³€D?@³„D?>³ˆD?@³D?A³ D?B³ÌD?C³øD?L´8D?M´LD?O´PD?M´TD?N´hD?O´xD?N´|D?O´€D?P´”D?Q´ÀD?R´ÜD?UµD?Xµ@D?YµXD?ZµlD?\µpD?]µŒD?^µ¸D?_µÌD?`µèD?a¶D?d¶€D? ¶D?h¶ D?i·$D?j·4D?i·8D?j·<D?k·@D?l·àD?m¸lD?o¸pD?m¸xD?o¸|D?m¸€D?o¸„D?p¹D?q¹@D?r¹PD?s¹|D?y¹ìD?zºlD?{º|D?zº€D?{º„D?~º˜D?» D?„»PD?…»ØD?†»ìD?ˆ»ðD?†»üD?‡¼D?ˆ¼D?‰¼ˆD?мÀD?‹¼ìD?Œ½DJ½½(D?“½0DJ½½4D?“½8DJ½½<DJ¾½HD?“½XDJ¿½pD?“½tDJ¿½xD?“½ˆD?”½ØD?•½ðD?–¾(D?—¾¼D?˜¿<D?œ¿@D?˜¿HD?™¿PD?œ¿TD?™¿XD?š¿dD?œ¿pD?¿èD?žÀD?ŸÀLD?¢ÀxD?¥ÀˆD?¦À¤D?¥À¨D?¦À¬D?§À°D?¨ÀÌD?©ÀäD?«ÀèD?¬ÁD?­Á<D?®ÁLD?¯ÁxD?µÁàD?¶ D?µÂD?¶ÂD?· D?¸Â<D?¹ÂTD?»ÂXD?¼ÂtD?½¬D?¾¼D?¿ÂèD@;ÃTD@VàD?ÅÃäD?ÆÃøD?ÇÄD?ÈÄ$D?ÉÄ4D?ÊÄ8D?ÏÄ<D?ÊÄ@D?ËÄDD?ÊÄHD?ÏÄLD@•Ä´D?ÐÄÌD?ÑÅ`D?ÒÅŒD?ÕŸD?ÖÅÐD?×ÅäD?ØÅôD?ÙÅüD?ØÆD?ÜÆD?ÝÆ„D?ÞÆØD?àÆÜD?ÞÆäD?àÆèD?ÞÆìD?àÆðD?áÇ<D?âÇtD?ãÇðD?äÈD?¢ÈHD?èÈXD?éÈŒD?êÉD?ëÉHD?îÉtD?ïÉüD?ðÊ€D?ñʬD?ôÊØD?õÊÜD?ôÊàD?õÊôD?öË D?ùË0D?öË4D?ùË8D?úˬD?û˸D?ú˼D?ûËÀD?þËÄD?ÿÌ@D@ÌxD@ÌøD@ÍtD@ͬD@ÍØD@ ÍÜD@ ÍàD@ÍèD@ ÍôD@ ÍüD@ ÎD@ ÎD@ ÎŒD@θD@ÎäD@ÏD@ψD@ϨD@ÏÀD@Ð@D@%ЄD@&МD@%РD@&ФD@)ШD@*иD@/ÐðD@0Ñ D@1Ñ D@3Ñ$D@1Ñ,D@2Ñ8D@3Ñ@D@4ÑTD@5Ñ€D@6ѬD@7ÑÄD@9ÑüD@:ÒD@;Ò D@<Ò4D@>Ò8D@?ÒTD@@Ò€D@AÒD@BÒ¼D@HÓD@IÓ<D@JÓPD@KÓˆDJ½ÓÀD@PÓÌDJ½ÓÔDJ¾ÓÜD@QÓèD@RÔD@SÔ,D@TÔPD@UÔhD@VÔ D@WÔ¼D@XÔèD@YÕD@[ÕD@\ÕD@]ÕDD@^Õ|D@aÕ¨D@bÕÀD@aÕÄD@bÕÈD@cÕÜD@dÖLD@eÖÄD@gÖÈD@h×HD@i×tD@jׄD@k×°D@rØ D@sØ|D@tØàD@uØäD@xØèD@uØôD@vÙD@xÙ D@yÙ|D@zÙ¨D@ÙÔD@€ÙôD@ÚXD@ƒÚ\D@ÚdD@ƒÚhD@ÚlD@‚ÚxD@ƒÚ|D@„ÚÔD@…Û D@†Û8D@‰ÛdD@ŠÛŒD@‹ÜD@ŒÜ,D?ÜìD?ÝPD?ÝÈD?Þ8D?Þ˜D?"ßD?,߀D?7ßìD?;àdD?<àÌD?=á8D?@á¨D?Lâ(D?Oâ”D?QãD?Xã„D?YäD?\ä€D?^äôD?_ådD?§åØD?¨æPD?«æ¸D?·ç$D?¸çœD?»èD?ÅèpD?ÆèèD?ÈéPD?Õé¸D?Öê$D?×ê8D@)ê¤D@/êøD@0ëHD@3ë¤D@6ëøD@:ìHD@>ì¤D@HíD@Ií,D@PíˆDJ¿íŒD@Pí˜DJ¿í¬D@Pí¸D@QîD@Sî|D@Xî¤D@[ïD@•ï\D@–ï”D@—ïÐD@˜ðD@™ð@D@šðLD@™ðPD@šðTD@žð`D@ŸðhD@¡ðpD@£ð€D@¢ð„D@¥ðˆD@¢ðŒD@£ðD@¤ð”D@¬ð D@³ð¼D@´ðÈD@·ñ(D@ºñ8D@»ñpD@¼ñ°D@½ñðD@¾ò0D@¿òpD@Àò°D@ÁòðD@Âó0D@ÃópD@Äó°D@ÅóðD@Æô0D@ÇôpD@Èô°D@ÉôðD@Êõ0D@Ëõ`D@ÌõD@ÍõÀD@•õôD@Ïö  {$=o…  ³@=o Å@=o ×@=o é€=p8 €=q< €=r@ /€=sD G@=t  X€=uH h€=vL ~€=wP ‘€=xT ¦€=yX Å€=z\ à€={` ö@=| €=}t &€=~ t ;€=t O€=€t h€=t ‚@=‚ ž€=ƒ ¸ ¯€=„ ´ È€=… ° à€=† ¬ ø€=‡ ¨ €=ˆ ¤ %€=‰   :€=Š œ J€=‹ ˜ ^€=Œ ” t€=  ˆ€=Ž Œ ¥€= ˆ ¾€= „ Ѐ=‘ € à@=’ ï€=“l ý€ € B@=• Q@=– `@=— o@=˜ €@=™ &=›«ð §€ ÅÀ…  Æ@>Ç  ×€>Èp ì€>Èh€>Èd@>É-À¨T.à¨l/@>Ç @€>ÈpU€>Èhk€>Èd~@>É–À©,—ଠ˜@?“¤À½(¥à½0¦@?“²À½4³à½8´@?“ÀÀ½<Áà½XÂ@?“ÎÀ½pÏà½tÐ@?“ÜÀ½xÝ཈Þ@@ï€@d€@h€@p-@@‘EÀÄ´FàÄÌG@@PSÀÓÀTàÓÌU@@PaÀÓÔbàÓèc@@PoÀíŒpàí˜q@@P}Àí¬~àí¸@@€@d¥€@h»€@pÎ@@‘æÀï\çàð è@@ù€@d€@h$€@p7@@‘OÀõôPàö QàöHR$q(NöH.öPDH™öPDH¨öXDH™ö\DH¨ö`DH™öhDH¨ötDI×ö|DH¨ö„DI×öŒDH¨öDI×ö”DH¨ö˜DH©öœDH¨ö DH©ö¨DHªö¬DH«ö°DHªö¸DH«öÀDH¬öÈDH«öÌDH¬öÔDH­öØDK÷DK÷DK÷$DK÷0DK÷@DH¯÷PDH°÷hDH´÷”DH³÷œDH²÷ S ¿ÄDH´÷¤DH±÷¬DH³÷°DH²÷´DHµ÷¼DH±÷ÀDH³÷ÄDH´÷ÈDH²÷ÌDHµ÷ÐDH¶÷ÜDK&÷àDK'÷ìDK)÷ôDK1øDK*ø DK1øDH¶ø<DH·øDDH¹øtDH¸øxDH¹ø|DH¸ø€DH¹ø„DHºø”DH¾øÀDH½øÈDH¼øÌˆ ¿ÈDH»øÐDH¾øÔDH½øØDH¼øÜDH»øäDH½øèDH¾øìDH¿øðDH¼øôDH¿øøDK&ùDHÀù DK&ùDK'ùDK)ùDK1ù0DK*ù4DK1ù<DHÀùdDHÁùlDHÄùœDHÃù ¸ ¿ÌDHÍù¤DHÂù¨DHÍù¬DHÄù°DHÃù´DHÂù¸DHÅù¼DHÍùÀDHÄùÄDHÌùÈDHÅùÌDHÌùÐDHÃùÔñ ºìDHÅùØDHÇùÜDHÎùàDHÌùäDHÆùèDHÇùìDHÆùðDHÇùôDHÉùøDHÆùüDHÈúDHÉúDHÈúDHÉú DHËúDHÈúDHÊúDHËúDHÊú DHËú$DHÊú(DHÍú,DHÃú0DHÎú4DK&ú@DHÏúHDK&úLDK'úPDK)úXDK1úlDK*úpDK1úxDHÏú DHÐú¨DHÓúØDHÒúÜ+ ¿ðDHÖúàDHÑúäDHÖúèDHÓúìDHÒúðDHÑúôDHÔúøDHÖúüDHÓûDHÕûSYÐDHÔûDHÕû DHÒûDHÔûDH×ûDHÕûDHÖû DHÒû$DH×û(DK&û4DHØû<DK&û@DK'ûDDK)ûLDK1û`DK*ûdDK1ûlDHØû”DHÙûœDHÜûÌa€DHÛûÐÅ ¿üDHÞûÔDHÚûÜDHÜûàDHÛûäDHÞûèDHÚûìDHÛûðò ºôDHÜûôDHÝûøDHßûüDHÝüDHÞüDHÛü DHßüDK&üDHàü$DK&ü(DK'ü,DK)ü4DK1üHDK*üLDK1üTDHàü|DHáü„DHãü´DHâüÀDHãüÄDHäüÈDHâüÌDHäüÐDHåüÜDHéýDHèý DHçý  ÀDHæýDHéýDHèýDHçý L ºøDHæý(DHèý,DHéý0DHêý4DHçý8DHêý<DK&ýHDHëýPDK&ýTDK'ýXDK)ý`DK1ýtDK*ýxDK1ý€DHëý¨DHìý°DHîýäDHíýðDHîýôDHïýøDHíýüDHïþDHðþ DHôþ8DHñþ<DHôþ@DHñþHDHôþLDHõþpDHöþ¨DHùþÔDHúþüDHûÿ$DHþÿPDHÿÿxDIÿ DIÿÌDIÿÐDIÿÔDIÿäDIÿðDI  DIDI DIDI  DI $DI (DI ,DI4DIPDITDIXDI"\DI`DIdDI#hDIlDIpDIty ¾ÌDI=xDI|DI€DI„ƒ ¾ÄDI=ˆDIŒDI ¾ÐDI”DI˜DI(œDI DI¤— ¾ÈDI(¨DI¬DI°DI"¸¡ ¾ÜDI¼DI"ÈDI#̬ ¾àDI%з ¾äDI#ÔDI%ØDI)Ü ¾èDI-àÍ ¾ìDI)äDI-èDI1ìØ ¾ðDI4ðã ¾ôDIôDI$øDI(üDI1DIDI9DI4 DI6î ¾üDIDI5ù ¾øDI9DI6 DI5$DI8( ¿DI;,DI80DI:4 ¿DI;<DI<@ ¿DI=HDI@dDI>h% ¿ DITlDIZpDIBtDI>xDIA|0 ¿DI@€DIV„DIXˆDI@ŒDIC; ¿DIA”DIG˜F ¿DICœDII Q ¿DIG¤DIK¨\ ¿ DII¬DIO°g ¿$DIK´DIQ¸r ¿(DIO¼DIUÀ} ¿,DIQÄDIWȈ ¿0DIUÌDIVÐDIXÔDIWØDIYÜ“ ¿4DIZäDI]DI[ž ¿8DI]DI[ DI]DI`,DI^0© ¿<DId4DI^8DIa<´ ¿@DI`@DIaDDI`HDIdLDIihDIelDImp¿ ¿LDIetDInxÊ ¿PDIm|DIs€DIq„DInˆDIiŒDIjÕ ¿HDIi”DIj˜DIqœDIr¨à ¿TDIs´DIvÐDItÔë ¿XDIzØDItÜDIwàö ¿\DI„äDIvèDIwìDIvðDIzôDI{ ¿`DI| DI{DI  ¿hDI|DI$ ¿lDI(DIƒ," ¿pDI0DI}4- ¿dDIƒ8DI~<DI}@DI‚DDI}HDI‚LDI„PDI‡\DI…`8 ¿tDI‰dDI…hDI‰lDIˆpC ¿xDI‡tDIˆxDI‡|DI‰€DIŒŒDIŠN ¿|DIŒ”DIŠ˜DIŒœDI‘¸DI¼DIÀY ¿€DI’Äd ¿ˆDI“ÈDIÌDIÐo ¿„DI’ÔDIØDI‘ÜDIàDIäDI‘èDI“ìDI–DJ½ DI”z ¿ŒDJ½DJ¾ DJ¿(DI–<DI—\DIËŒDI˜¤DI›ÐDI™Ô… ¿DIœØ ¿”DI«ÜDI™àDIžä› ¿˜DIœèDI ì¦ ¿œDI©ðDIžôDI¢ø± ¿ DI üDI©DI¢DI¦DIª DI¦DIªDI«DI°DDI¬HDI´LDI±P¼ ¿°DIÎTDI¬XDI»\DI±`DI¹dDI°hDI»lDIºpDIµtÇ ¿´DI°xDI¹|DIº€DIµ„DI¼ˆDI½˜DIΠDI½¨DIάDI˸DIÎÐDIÍÔDIÎØDIÍÜDIÎàDIÍèDKðÒ$H™öPé@Hšø@H›@Hœ@H%@Hž4@HŸC@H R@H¡a@H¢p@H£€@H¤@H¥ @H¦°ÀöP±@H¶½À÷à¾@K#Ì@K$ÚÀ÷àÛàø<Üàø<Ý@HÀéÀùê@K#ø@K$Àùàù àù  @HÀÀù@K#$@K$2Àù3àùd4àùd5@HÏAÀú@B@K#P@K$^Àú@_àúH`àúHa@HÏmÀúLn@K#|@K$ŠÀúL‹àú Œàú @HØ™Àû4š@K#¨@K$¶Àû4·àû<¸àû<¹@HØÅÀû@Æ@K#Ô@K$âÀû@ãàû”äàû”å@HàñÀüò@K#@K$Àüàü$àü$@HàÀü(@K#,@K$:Àü(;àü|<àü|=@HëIÀýHJ@K#X@K$fÀýHgàýPhàýPi@HëuÀýTv@K#„@K$’ÀýT“àý¨”àý¨•@I–¡À ¢à£@I–¯À°à<±à ²$¼N .D#HD#P8D#RDD#PHD#QPD#R\D#y˜D#S°D#T¼DJ½ÀD#TÄDJ½ÈDJ¾ÔDJ¿àD#TèDJ¿ìD#TøD#UDJ½D#UDJ½DJ¾$DJ¿4D#U@DJ¿PD#UTDJ¿XD#U`D#y€D#V D#WÀD#[ÄD#WÌD#XØD#YÜD#XàD#[äD#\8DJ½<DJ¾HDJ¿\D#\dDJ¿hD#\tD#]€D#^ D#_¤D#b¨D#cèD#dìD#gðD#h (D#i TD#j €D#k ¼D#y ðD#z D#{ @D#| pD#}  D#~ àD# ðD#‚ D#„ L³$#Hé@#Hý@#H@#I!@#J0@#K?@#LN@#M]@#Nl@#O{À|@#TˆÀÀ‰àÄŠ@#T–ÀÈ—àè˜@#T¤Àì¥àø¦@#U²À³à´@#UÀÀÁà@Â@#UÎÀPÏàTÐ@#UÜÀXÝà`Þ@#\êÀ<ëàdì@#\øÀhùàtúà tû$dN t. €DGb €D"Û ¤D"Ø ¬D"Þ °D"Ø ´D"Û ¼D"Þ ÈD"ß D"ä 0DJ½ 4D"ä 8DJ½ <DJ¾ HDJ¿ PD"ä XDJ¿ \D"ä hD#  ŒD"å °D# üD"æ D"ç PD"è D"é àD"ê D"ð$D"ê,D"ë<D"ìDD"íHD"ëLD"ðPD"ñD"òÀD"óðD"ø D"útD"û|D"ü„D"ÿÀD#ðD# D#D# D# $D#(D#0D#4D#@D#DD# PD# TD# dD# hD#|D#°D#àD#D#<D#`D# „D#¨D#ÀD#ðD# D# PD##dD#$D#%ÀD#&ðDGdü$Gb €6@Gb?@GbI@"ÐZ@"Òo@"Ö~@"×À ¤Ž@"äšÀ 4›à 8œ@"ä¨À <©à Xª@"ä¶À \·à h¸à¹$ÄNDº¬.PD"YPD"ghD"YpD"ZtD"YxD"g€D"Z”D"_˜D"`œD"a D"g¤D"h´D"i¸D"m¼D"hÀD"iÈD"mÔD"zD"mD"zD"mD"z D"n0D"oDD"pTD"q`D"rxD"s´D"tðD"sôD"tøD"u D"”<D"•@D"uDD"•HD"z`D"{D"z”D"{œD"|ÐD"{ÔD"|ÜD"D"|D"D"|D" D"€(D"PD"‚\D"ƒ”D"„ÌD"†ÐD"„ÔD"…äD"†ìD"‡D"ˆ@D"‰PD"Š|D"– D"•¤D"–¨D"—°D"¸D"š¼DJ½ÄD"ÈD"šÌDJ½ÐD"šÔDJ½ØD"šÜDJ½àDJ¾äD"žðD"ŸD" 4D"¡HD"¢\D"£pD"§tD"©xD"£|D"¤ˆD"¥”D"¦ D"§¬D"¨°D"©´D"ªÄD"«ðD"•0D"µ4D"¶HD"¸\D"·dD"¸pDJ¿ÀD"ÈDJ¿ÌD"ØD"žäD"© D"¹4D"ºdD"¹hD"ºlD"¹tD"ºxD"»|D"¼°D"ÁàD" D"Ã`D"Ä D"ÅÐD"ÆD"ÉD"Ê@D"–tD"—„D"Y”D"̰Ð$"YP@"Y@"Y.@"Y@€"Z8R@"\c@"^r€"_<€€"`@Ž€"aDœ@"c«@"dº&"f¬Ò€ðÀPñ@"ýÀÄþàÈÿ@" ÀÐ àÔ @"ÀØàÜ@"'Àà(àð)@"5ÀÀ6àÈ7@"CÀÌDàØEàÔF$ „NÔ.àDåàDëDíDëDì Dí,DîpDï|DJ½€Dï„DJ½ˆDJ¾”DJ¿œDï°DðàD $Dñ@DòTDöXDò`DólDôpDótDöxD÷¬DøØDùDúHD |D  D àD  D  D  PD  |G$åà@å“@å¨@æ·@çÆ@èÕ@éä@êóÀàô@ïÀ€à„@ïÀˆà°à œ$¼N œ.  DJ  DP ÄDO ÈDJ½ ÔDP ØDJ½ ÜDJ¾ èDJ¿ ðDP!DQ!0Df!lDR!DT!”DR!œDS!¤DT!¨DU!¸DV!ðDW" DX"`DY" DZ"¤D]"¨D^"ðDf#$Dg#@Dh#pDi# Dl#°Dn#Ü$J  K@J_@Kn@L}@MŒ@N›À  œ@P¨À Ô©à Øª@P¶À Ü·à!¸à$¹$`N$.$D)$D0$$D/$(DJ½$4D0$8DJ½$<DJ¾$HDJ¿$PD0$dD1$D?$ÄD2$àD4$äD2$ìD3$ôD4$øD5%D6%0D7%`DA%˜D8%°D?%äD@&DA&4DB&PDE&`DG&Œº$)$ô@)@*€)@+8@,G@-V@.fÀ$g@0sÀ$4tà$8u@0À$<‚à$dƒà&¬„$¬N&¬…¬ .&°D&°D.&ÀD&ÈD-&ÜD.&àD-&èD.&ìD-&øD.&üD/' D0'D1'D/'D0'$D4'0D7'<D8'PD='€D9'„D='ˆD9'D='”D>'˜D]'ÔDn(Do(LDp(|D(¨D(àD )D¥)TD¨)”D?)àD¼*DD@*`DB*dD@*lDA*xDB*€DC*àDD+DE+@DF+¤DP+àDQ,0DV,`DW,dDX,°DY,ÈD¼- DZ- D[-`D]-dD^-|D_-°D`-àDa-ôDc. De.,Di.4Dl.HDm.dDn. Do.¼Dp.ØDq.ðDr.ôDw.øDs/Dw/Dx/0Dy/\Dz/ˆD/´D€/ÈD/ÌD€/ÔD/ØD‚/ôDƒ0D„0(D…08D†0dDˆ0 D‹0¬DJ½0°D‹0´DJ½0¸DJ¾0ÄDŒ0ÌD1DŽ1<D1PD1lD‘1€D—1ˆD‘1ŒD’1˜D“1œD”1¤D’1¨D—1¬D˜1¸D™1äDš2DŸ2@D 2XD¡2lD¥2pD¡2tD¢2|D£2€D¤2ŒD¥2D¦2¤D¨2¨D©2¼Dª2èD«3DW3pDµ3€DX3˜D`3´Dl3ìD4D‚4LDƒ4€DJ¿4ÀD‹4ÈDJ¿4ÐD‹4ÜDŽ5D—5,DŸ5XD¼5ˆD½5 D¾5ÐD¿6DÀ6@DÁ6€DÄ6DÅ6ÀDÆ6ðDÇ7 DÈ7PDÉ7€DË7°›$&°Ú@î@@€8$@5@N@b@ s@!ˆ@"@#¬@$»@%Ê@&Ù@'è€)<ö@*@+&,¬ ,€JÀ&°K@‹WÀ0°Xà0´Y@‹eÀ0¸fà0Ìg@‹sÀ4Àtà4Èu@‹À4Ђà4܃à7Ø„$(N7Ø.7àDÉ7àDÎ8DÐ8DJ½8DÏ8DÐ8(DJ½8,DJ¾88DJ¿8@DÐ8TDÑ8€Dâ8¸DÒ8ÐDÓ9DÔ9@DØ9DDÔ9LDÕ9TDÖ9XD×9dDØ9hDÙ9tDÚ9 Dâ9ÔDã9ðDå: Dè:0Dé:`Dë:Œ…$É7àÁ@ÉÕ@Éæ@Êõ@Ë @Ì @Í "À7à #@Ð /À8 0à8 1@Ð =À8, >à8T ?à:¬ @$ÌN:¬ A¬.:°D)ª:°D)±:¸D)ª:¼D)Ì:ÌD)Ñ:ÐD)Ò:ÔD)Æ:ØD)Ñ:ÜD)Ç:àD)È:äD)Ò:èD)É:ìD)Ê:ðD)Ë:ôD)Í:øD)Æ:üD)Ç;D)Î;D)Ï;D)Ê; D)È;D)Ð;D)Ó;D)É;D)Ë; D)Î;$D)Ï;(D)Ð;,D)Ó;0D)Í;4D)Ã;8D)¼;<D)À;@D)Â;DD)Ì;HD)ª;LD)×;PD)ª;TD)Ñ;XD)Ò;\D)Ê;`D)Î;dD)Ï;hD)Ì;lD)Ð;pD)Ó;tD)Æ;xD)Ç;|D)È;€D)É;„D)Ë;ˆD)Í;ŒD)×;D)Ô;”D)Õ;˜D)Ö;œD)ª; D)Ô;¤D)Õ;¨D)×;¬D)Ö;´D)×;¸D)Ô;ÌD)Õ;ÐD)Ö;ÔD)×;ØD)Ø;äD)Ù<|D)Ú<´D)Û<ìD)Þ= D)ß=$D)ñ=(D)÷=,D)Þ=4D)ß=<D)à=HD)á=XD)â=hD)ã=xD)ä=ˆD)å=˜D)æ=¨D)ç=¸D)è=ÈD)é=ØD)ê=èD)ñ=ìD)ê=ðD)ë=üD)ì> D)í>D)î>,D)ï><D)ñ>LD)÷>PD)ñ>TD)÷>\D*> D)ø>°D)ù>àD)ý>äD)ú>èD)ý>ìD)ú>ðD)ý>ôD)þ?D)ÿ?$D*?8D*?LD*?PD*?TD*?`D*?lD*?xD*?|D*?´D*?¸D* ?ÄD* ?ÈD* @ D* @@D* @tD*@°D*@àD*@äD*@ìD*A D*A$D*A,D*A`D*AdD*AlD*A D*A¬D*BD*B4D*B8D*B<D*BtD*"B´D*#BðD*$C D*(C$DJ½C(D*(C,DJ½C0DJ¾C<DJ¿CHD*(C`D*)C°D**CÌD*+DD**DD*+D D*,DD*-D(D*.D,D*/D<D*0DHD*1DXD*2DdD*3D°D*4DäD*3DèD*4DìD*5E$D*6E`D*:EdD*;E°D*<EàD*=EäD*@EèD*=EìD*<EðD*@EôD*AFD*BF0D*EF4D*BF8D*EF<D*FFHD*JF€D*GF”D*JF˜D*KFœD*GF D*JF¤D*KF¨D*NF¬D*OFðD*TG D*PG$D*QG(D*TG,D*PG0D*TG4D*UG<D*TG@D*UGDD*VGHD*WG`D*XG”D*YGÈD*ZGøD*dGüD*eH\D*hH`D*eHdD*hHhD*iH¤D*lH¬D*mHäD*nID*oI@D*pIpD*tItD*qIxD*pI|D*tI€D*uIŒD*vI¼D*yIÀD*|IÄD*vIÈD*|IÌD*}JD*~JD*‚JD*‡JD*ˆJ(D*‡J,D*ˆJ0D*‰J4D*ŠJ@D*‹JpD*‘JxD*’JD*‘J”D*’J˜D*“JœD*–J¨D*—J¼D*–JÀD*—JÄD*˜JÈD*œJÔD*K,D*¢K4D*£KHD*¢KLD*£KPD*¦KTD*§K`D*«KD*¨K D*¬K¤D*¨K¨D*«K¬D*¬K°D*­K´D*®KÈD*°KÜD*¯KäD*°KðD*±L,D*²L\D*±L`D*²LdD*±LlD*²LpD*³LtD*´L¤D*³L¨D*´L¬D*ºLàD*¾LìD*¿M D*ÀMPD*ÆMTD*ÇMÀD*ÈMØD*ÇMÜD*ÈMàD*ËMäD*ÌMøD*ËMüD*ÌND*ÍNDJ½NDJ¾NDJ¿N D*ÍN4D*ÎNHD*ÏNdD*ÐN”D*ÏN˜D*ÐNœD*ÑN¬D*ÒN¼D*ÓNÈD*ÔNØD*ÕNäD*ÖOD*×OPD*ØO„D*ÙO´D*àO¸D*áOÔD*âOèD*ãOøD*äPD*åPDD*æPxD*åP|D*æP€D*çP°D*êPàD*çPèD*êPìD*ëQD*ìQ4D*íQdD*ðQ¨D*ñRD*òR D*ñR$D*òR(D*ûR,D*øR4D*õR8D*ûR@D*üRLD*ûRPD*üRTD*ÿR\D+R|D+R´D+RèD+RìD+RðD+SD+S$D+S(D+S@D+STD+ SXD+S\D+ShD+ StD+ S„D+ SD+ S¼D+ SìD+T D+T`D+TpD+TtD+TxD+T|D+T˜D+TÌD+UD+U0D+ULD+U`D+UpD+U|D+ UŒD+!U˜D+"UÔD+#VD+$V<D+*V|D++VŒD+*VD++V”D+.V D+/VÜD+4WD+5W$D+6W8D+7WHD+8WdD+9W D+:WÔD+9WØD+:WÜD+;X D+<X@D+=XpD+DXxD+EX”D+FXÈD+GXüD+FYD+GYD+JY0D+GY8D+JY<D+KYpD+LYˆD+MY˜D+NY°D+OYÈD+PYøD+OZD+PZD+OZD+PZ D+QZ0D+RZdD+SZ”D+TZÈD+YZüD+Z[D+Y[D+Z[D+][D+^[XD+_[pD+a[tD+_[xD+`[„D+a[D+b[¸D+c[ìD+b[ðD+c[ôD+d\ D+g\PD+d\XD+g\\D+h\pD+p\¤D+q]D+r]D+q] D+r]$D+u](D+v]<D+u]@D+v]DD+y]PD+z]ŒD+]¸D+€]ÔD+]èD+‚]øD+ƒ^D+„^dD+…^˜D+„^œD+…^ D+†^ÐD+‡_D+ˆ_4D+_<D+•_@D+’_HD+_LD+•_PD+–_dD+—_˜D+˜_ÌD+—_ÐD+˜_ÔD+›`D+˜`D+›` D+œ`@D+`XD+ž`hD+Ÿ`€D+ `˜D+¡`ÈD+ `ÐD+¡`ÔD+ `ØD+¡`ÜD+¢aD+£a4D+¢a8D+£a<D+¤ahD+¥aœD+«aÌD+¥aÔD+¨aØD+¥aÜD+«aàD+¬aìD+«aðD+¬aôD+¯aøD+°b4D+±bLD+³bPD+±bTD+²b`D+³blD+´b¨D+µbÜD+´bàD+µbäD+¶cD+¹c@D+¶cHD+¹cLD+ºc`D+»c¨D+¼cÜD+ÂdD+ÃdxD+Äd„D+ÃdˆD+ÄdŒD+Åd D+ÆdÀD+ÇeD+Ée D+ÊeTD+Ëe„D+ÊeˆD+ËeŒD+Êe”D+Ëe˜D+ÌeœD+ÍeÌD+ÌeÔD+ÍeØD+ÕfD+ÖfPD+×fD+ØfÐD+ÙgD+Ûg$D+Üg0D+ÝgpD+Þg D+ßgÐD+àhD+áh0D+âh`D+ãhD+ähÀD+åhðD+æi D+çiPD+èi€D+éi°D+êiàD+ëjD+ìj@D+íjpD+îj D+ïjÐD+ðkD+ñk0D+òkpD+ôkÀ W$)ª:° Š@)ª ž )ª, ° )ª0 €)«Ì Ù€)¬| ì€)­€!€)®„!€)¯ˆ!0€)°Œ!K€)±!`€)²”!s€)³˜!ˆ€)´œ!ž€)µ !º€)¶¤!Õ€)·¨!õ€)¸¬"€)¹°"-€)º´"E€)»¸"`€)¼¼"u@)½"€)¾Ü"¡@)¿"°€)ÀÀ"¾@)Á"Í€)ÂÄ"Û€)ÃÈ"é€)Äx"÷&)Ŭ#€#.À:°#/@*(#;ÀC(#<@J¼#JÀC(#KàC,#LàC,#M@*(#YÀC0#Z@J¼#hÀC0#iàC`#jàC`#k@*Í#wÀN#x@J¼#†ÀN#‡àN4#ˆàN4#‰àkØ#Š$1(NkØ#‹ º´.kàD/÷kàD/þkøD/÷lD/þlD/÷lD/þlD0l,D/ÿl0D0l4D/ÿl8D0l@D0lDD0lTD0lXD0l\D0llD0ltD0l|D0$l´D0lÐD0 mD0 mD0 m@D0mpD0mxDJ½m|D0m€DJ½m„DJ¾mDJ¿m˜D0m¬D0mÐD0mèD0n D0n`D0ndD0nlD0n|D0n„D0n´D0nàD0o D0o@D0!oDD0oHD0!oLD0$odD0%o|D0'o°D0*oÀD0,oð#¡$/÷kà#Þ@/÷#ò@/÷$@/÷$@/ø$%@/ú$4@/û$C@/ü$R& /ýº´$j€$ˆÀkà$‰@0$•Àm|$–àm€$—@0$£Àm„$¤àm¬$¥àp$¦$0Np$§ º¸.pD1äpD1ípD1äp D1íp$D1äp(D1åp0D1äp4D1íp@D1äpHD1ípPD1æpXD1åp\D1íp`D1îpxD1ïp˜D1ðpÐD1ñqD1òqPD1õq€D1öq„DJ½qˆD1õqŒD1öq”DJ½q˜DJ¾q¤DJ¿q¬D1öqÀD1÷qðD2 r0D1ørPD1ùr€D2 r¸D1úrÐD1ûrÜD1üràD1ýrôD1þs@D1ÿspD2s D2sàD2tD2 tDD2 t`D2 t°D2 tàD2uD2u D2u`D2u D2uÐD2vD2vT$½$1äp$í@1ä% 1äŒ% 1ä%%€1å8%8€1æ<%M@1ç%\@1è%k@1é%z@1ê%‰@1ë%˜& 1캸%°€%ÎÀp%Ï@1ö%ÛÀqˆ%ÜàqŒ%Ý@1ö%éÀq˜%êàqÀ%ëàv|%ì$lNv|%í¬\.v€D2{v€D2‚v˜D2{v D2|v¤D2{v¨D2‚v°D2|vÄD2‚vÈD2ƒvØD2„vÜDJ½vàD2ƒväD2…vìD2„vðD2…vüDJ½wDJ¾w DJ¿wD2…w(D2†wPD2•wˆD2‡w D2ˆwÐD2‰xD2xD2‰xD2Šx$D2‹x(D2Œx8D2x@D2ŽxLD2x€D2x°D2’xàD2•xüD2–y D2˜yPD2›y`D2œyD2žyÀ&$2{v€&C@2{&W@2{&i@2{&{€2|8&–@2}&¥@2~&´@2&Ã@2€&Ò&2¬\&ê€'Àv€' @2…'Àvà'àvä'@2…'#Àw'$àw('%àyà'&$`Nyà''¬d.yàD7ŠyàD7œyìD7ŠyðD7œyôD7ŠyøD7œzD7ŒzD7ŠzD7œzD7›zD7œzD7›z D7Šz$D7œz,D7Œz4D7›z8D7œz<D7zPD7žztD7Ÿz°D7 zðD7£{ D7¤{$D7¥{(D7¬{,D7¥{0D7£{4D7¤{<D7©{HD7¬{LD7©{PD7¬{XD7­{°D8ò{øD7®|D7¯|@D7²|pD7³|ÐD7¸}D7¹}pD7º}¼D7»}ÀD7¾}ÄD7»}ÔD7¼}äD7¾}ìD7¿~4D7À~`D7Æ~ŒD7È~äD7É~ìD7Ê~ôD7Í0DJÛ8DJÜ@DJß`D7ΈDJá D7ÍÄD86€D7΀(D7Ó€@D7Ï€HD7Ó€LD7Ô€\D7Õ€°D7ÖD7×@D7ØpD7Ù„D7Ú°D7ßàD7àäD7ßèD7àìD7áðD7â‚ D7ã‚ D7ä‚0D7å‚€D7æ‚ÀD7ç‚ÄD7î‚ÈD7ç‚ÐD7è‚àD7é‚äD7ê‚èD7è‚ìD7î‚ðD7ïƒD7ðƒ0D7ñƒ@D7óƒDD7ôƒ D7õƒÐD7ù„D7ú„D7ù„D7ú„ D7û„D7ü„,D7ý„@D7þ„TD7ÿ„dD8„°D8„´D8„¸D8„¼D8„ÌD8„ÐD8„ÔD8„ØD8„ÜD8 „ôD8 … D8 …4D8 …8D8…LD8…€D8…°D8…ÌD8…àD8…ôD8†D8†D8!†D8†$D8†4D8†8D8†<D8†@D8!†DD8"† D8#†ÐD8$†äD8&†èD8'†üD8(‡0D8)‡`D8-‡D7Ó‡ÐD7؈D7áˆ8D7îˆ|D7ðˆ°D7ûˆäD7ü‰D8‰\D8 ‰„D8 ‰¨D8‰àD8Š$D8ŠdD8#ФD8&ŠÜD86‹D87‹(D88‹XD89‹ˆD8:‹¼D8;‹ìD8<Œ D8=Œ,D8<Œ0D8=Œ4D8AŒ<D8GŒ\D8AŒ`D8GŒ|D8BŒ„D8CŒ”D8DŒÀD8NŒìD8HŒøD8I0D8JhD8ó D8T¨D8P¬D8T¸D8PÌD8TÐD8RÔD8QØD8TÜD8QàD8TäD8RèD8SìD8TüD8[ŽD8\Ž,D8]ŽD8^Ž D8_ŽÌD8`ŽØDJ½ŽÜD8`ŽàDJ½ŽäDJ¾ŽðDJ¿D8` DJ¿D8`DJ¿D8`$D8aPD8bD8c¼D8dD8fD8d D8e0D8f8D8gtD8h D8iÌD8jÜD8k‘D8q‘PD8r‘¨D8w‘ØD8x’8D8}’dD8~’´D8’ðD8€’ôD8ƒ’øD8€“D8“D8ƒ“D8„“hD8…“”D8‹“ÀD8Œ“äD8”,D8¨”tD8Ž”ŒD8”ÄD8”ôD8‘• D8’•hD8“•¸D8”•äD8•–@D8––lD8—–˜D8˜–¬D8œ–°D8™–¸D8š–ÄD8œ–ÈD8—D8ž—,D8Ÿ—XD8ª—D8«—˜D8¨—¤D8©—¼D8——ðD8ª˜D8«˜PD8¬˜|D8­˜¬D8®˜ÜD8¯˜èD8®˜ìD8¯˜ðD8³˜øD8¹™D8³™D8¹™4D8´™<D8µ™LD8¶™xD8À™¤D8º™°D8»™èD8¼š D8ÆšpD8štD8Æš€D8šœD8Äš D8Ú¤D8Æš¨D8Ú¬D8Æš°D8Äš´D8Åš¸D8ÍšÀDJ½šÄD8ÍšÈDJ½šÌDJ¾šØDJ¿šäD8ÍšìDJ¿šøD8ÍšüDJ¿›D8Í› D8Λ$D8Ï›`D8ЛŒD8Ñ› D8Ó›¤D8Ñ›¬D8Ò›¼D8Ó›ÄD8Ô›øD8Õœ$D8ÖœPD8Ùœ|D8ÚœÐD8ÛœÔD8ÜD8ÝPD8â€DJ½„DJ¾DJ¿œD8â¤DJ¿°D8â´DJ¿¼D8âÄD8ãìD8äž,D8åžXD8æžlD8èžpD8æžxD8瞈D8èžD8éžÄD8êžðD8ëŸD8ïŸHD8òŸdD8óŸœD8ôŸôD8õ  D8ö PD8÷ €D8ø ÀD8û ÐD8ü¡D8ý¡@D8þ¡pD8ÿ¡ D9¡ÐD9¢D9¢0D9¢`D9¢ D8ò¢èD8¨£D8ô£0D9£@'=$7Šyà'r@7Š'† 7м'˜ 7ŠÀ'ª€7‹L'Ä€7Œ8'Ù@7'í@7Ž(@7(@7(+@7‘(A@7’(P@7“(_@7”(n@7•(}@7–(Œ€7—<(š@7˜(©@7™(¸&7š¬d(Ѐ(îÀyà(ï@7Í(ýÀ8(þàˆ(ÿ@7Í) À )àÄ)@80) €81@)5€81H)K€81D)^@82)vÀ€)wà€()x@80)‰€81@)ž€81H)´€81D)Ç@82)ßÀ‹)àà )á@80)ò€81@*€81H*€81D*0@82*HÀ¨*IàŽ*J@8`*VÀŽÜ*WàŽà*X@8`*dÀŽä*eà *f@8`*rÀ*sà*t@8`*€À*à$*‚@8¢*“€8£D*¨€8£H*¾€8£@*Ñ@8¤*éÀ”t*êà”Œ*ë@8¢*ü€8£D+€8£H+'€8£@+:@8¤+RÀ—+Sà—ð+T@8¢+e€8£D+z€8£H+€8£@+£@8¤+»À˜+¼àšÀ+½@8Í+ÉÀšÄ+ÊàšÈ+Ë@8Í+×ÀšÌ+Øàšì+Ù@8Í+åÀšø+æàšü+ç@8Í+óÀ›+ôà› +õ@8â,À„,à¤,@8â,À°,à´,@8â,À¼,àÄ,@8¢,0€8£D,E€8£H,[€8£@,n@8¤,†À£,‡à£0,ˆà£h,‰$)ˆN£h,Š º¼.£pD9 £pD9£ˆD9 £D9£”D9 £˜D9£ D9£¼D9£ÀDJ½£ÄD9£ÈD9£ÐDJ½£ÔDJ¾£àDJ¿£èD9£üD9¤ D9"¤XD9¤pD9¤ D9¤àD9¤äD9¤ìD9¤øD9¥D9¥D9¥D9¥$D9¥PD9¥€D9¥°D9"¥ÌD9#¥ðD9%¦ D9(¦0D9*¦`, $9 £p,Ø@9 ,ì@9 ,þ@9 -@9 -@9 -.@9 -=@9-L& 9º¼-d€-‚À£p-ƒ@9-À£Ä-à£È-‘@9-À£Ô-žà£ü-Ÿà¦€- $N¦€-¡ ºÀ.¦€D9.¦€D99¦ŒD9.¦D99¦”D9.¦˜D99¦ D9/¦¤D9.¦¨D99¦´D9.¦¼D99¦ÄD96¦ÌD9/¦ÐD94¦ÔD95¦ØD99¦ÜD9:¦ðD9;§D9<§HD9=§€D9@§°D9B§´D9@§¼D9B§ÄD9E§ÐD9F§àD9E§äD9F§èD9G§ìD9H¨D9J¨$D9I¨,D9J¨8D9K¨D9L¨ÀD9K¨ÌD9L¨ÐD9M¨ÔD9N©D9U©@D9Y©dD9U©hD9Y©xD9U©|D9Y©ˆD9Z©¸D9Y©¼D9Z©ÄD9]©øDJ½©üD9ZªD9]ªDJ½ªD9Zª DJ½ªDJ¾ªDJ¿ª$D9]ª8D9^ªdD9_ªlD9^ªpD9_ªtD9`ª D9_ª¤D9`ª¨D9aª°D9bª¼D9cªüD9d«0D9e«dD9l« D9m«¤D9l«¨D9m«¬D9p«°D9q¬D9v¬0D9s¬4D9r¬8D9s¬<D9v¬@D9x¬D9y¬˜D9x¬œD9y¬ D9z¬¤D9}¬àD9~­D9€­D9­D9€­D9­ D9€­$D9­8D9‚­PD9ƒ­hD9„­¤D9…­àD9„­èD9…­ìD9†­üD9‡®0D9ˆ®`D9‰®dD9‹®lD9Ž® D9‹®¤D9Ž®¨D9®ÔD9¯D9‘¯D9¯ D9‘¯,D9’¯XD9‘¯\D9’¯dD9“¯lDJ½¯pD9“¯tDJ½¯xDJ¾¯„DJ¿¯D9“¯¤D9”¯°D9•¯ÔD9–°D9—°D9˜°(D9™°4D9š°hD9›°œD9œ°ÌD9›°ØD9œ°ÜD9°àD9ž±D9±D9ž±D9¥±@D9¦±\D9§±pD9¨±¸D9©±äD9ª²D9¯²`D9±²dD9¯²hD9±²lD9²€D9…²¨D9²²ÐD9´²àD9µ³ D9¶³`D9·³ D9¸³ÐD9»³àD9¼´ D9½´PD9¾´€D9¿´°D9À´ðD9µ@-·$9.¦€-ç@9.-û 9.¬.  9.°.€9/8.4@90.J@91.\@92.k€93<.y€94@.‡€95D.•€96H.£@97.²& 98ºÀ.Ê€.èÀ¦€.é@9].õÀ©ü.ö@J¼/À©ü/àª/àª/@9]/Àª/@J¼/"Àª/#ઠ/$ઠ/%@9]/1Àª/2@J¼/@Àª/Aàª8/Bàª8/C@9“/OÀ¯p/Pà¯t/Q@9“/]À¯x/^௤/_àµ`/`$àNµ`/a¬l.µ`D9Ƶ`D9ѵxD9Ƶ€D9ѵ„D9ƵˆD9ѵD9Òµ¸D9Óµ¼D9ÖµÀD9ÓµÄD9ÒµÈD9ÓµÐD9ÖµÔD9ÓµØD9ÖµàD9×¶ D9ù¶`D9ض€D9Ù¶ÀD9Û¶ÄD9Ü·D9Ý·@D9Þ·pD9ã· DJ½·¤D9ã·¨DJ½·¬DJ¾·¸DJ¿·ÀD9ã·ÔD9ä·øD9å¸<D9æ¸hD9縨D9è¸ÜD9é¹D9ï¹D9é¹ D9ì¹(D9ë¹,D9ê¹0D9ï¹4D9ð¹dD9ñ¹D9ù¹ÀD9ú¹àD9ûº(D9üº`D9ýºD:º D:ºÐD:»/w$9Ƶ`/­@9Æ/Á@9Æ/Ó@9Æ/å€9Ç8/ø€9È<0 €9É@0!@9Ê04@9Ë0C@9Ì0R@9Í0a@9Î0p@9Ï0&9Ьl0—€0µÀµ`0¶@9ã0ÂÀ·¤0Ãà·¨0Ä@9ã0ÐÀ·¬0Ñà·Ô0Òà»(0Ó$ÈN»(.»0DDã»0DDä»DDDã»HDDä»\D05»`DJ½»lD06»pD0:»|D07»€D0:»ŒDJ½»DJ¾»œDJ¿»¤D0:»¸D0;»àD0<¼ D0=¼PD0>¼ D0?¼ÐD0@¼ÜD0A¼ôD0B½ D0C½@D0D½LD0E½„D0F½ÄD0G½ÔD0I¾D0N¾D0O¾,D0P¾`D0Q¾dD0R¾D0S¾ÔD0T¾ÜD0U¾ôD0V¿ D0W¿$D0X¿4D0Y¿`D0Z¿ŒD0[¿˜D0\¿°D0]¿ÈD0^ÀD0_ÀD0`À@D0cÀxD0eÀ°D0fÀÄD0gÀðD0rÁD0Á4D0sÁ@D0uÁDD0sÁHD0uÁXD0tÁ`D0uÁhD0vÁxD0wÁ°D0xÁÀD0yÁðD0~ÂD0eÂD0~Â8D0ÂPD0€€D0°D0ƒÂÄD0„ÂÐD0…ÃD0†Ã0DDèÃ`DDìÃ0Ô$Dã»01 @Dã1@Dã1@Dã1'@0016@011E@021T€0381b@041qÀ»`1r@0:1~À»l1à»p1€@0:1ŒÀ»1໸1ŽàÃ`1$€Nð.ðD(¦ðD(¨øD(¦üD(¬ÃÔD(¨ÃØD(±ÃÜD(¬ÃàD(ªÃèD(«ÃìD(­ÃðD(±ÃüD(ÉÄ8D(³ÄPD(²ÄTD(³ÄXD(´Ä€D(³Ä„D(´ĈD(µÄŒD(¶ĨD(·ÄÄD(¸ÄØD(¹ÄäD(¾ÄèD(ºÄìD(»ÄøD(¼ÅD(½ÅD(¾Å D(¿ÅHD(ÀÅxD(¿Å|D(ÁÅ€D(ÉňD(ÊÅ´D(ÉŸD(ÊÅÀD(ËÅôD(ÊÅøD(ËÆD(ÎÆ4DJ½Æ8D(ËÆ<D(ÎÆ@DJ½ÆDD(ËÆHDJ½ÆLDJ¾ÆTDJ¿Æ`D(ÎÆtD(ÏÆ€D(ÐƈD(ÏÆŒD(ÐÆD(ÑƼD(ÐÆÀD(ÑÆÄD(ÒÆÈD(ÓÆÔD(ÔÇD(ÕÇ<D(ÖÇpD(ÝǼD(ÞÇÐD(àÇäD(ßÇìD(àÇøD(áÈ0D(âÈ`D(áÈdD(âÈhD(áÈpD(âÈtD(ãÈxD(äÈ´D(éÈàD(êÉ D(ëÉ`D(ìÉ D(ïɰD(ðÉàD(òÊ 1$(¦ð1Ï@(¦1ã@(¦1ô@(§2€(¨82@(©2 €(ª<2.€(«@2<Àð2=@(Î2IÀÆ82J@J¼2XÀÆ82YàÆ<2ZàÆ<2[@(Î2gÀÆD2h@J¼2vÀÆD2wàÆH2xàÆH2y@(Î2…ÀÆL2†@J¼2”ÀÆL2•àÆt2–àÆt2—àÊ$2˜$tNÊ$.Ê0D àÊ0D îÊTDJ½ÊXD èÊ\D ëÊ`D èÊdD ëÊhD èÊlD ëÊpD îÊtDJ½ÊxDJ¾Ê„DJ¿ÊŒD îÊ D ïÊÐD!RËD ðË@D ñË€D ò˰D óËðD ûËôD ôËüD õÌ D öÌD ÷ÌD õÌD ûÌD üÌ`D ýÌD þÌÀD ÿÍDJ§Í0DJ¨ÍDDJ¢ÍPD!ÍlD!Í„D!ÍÈD!ÍôDJ§ÍøDJ¨ÎDJ¢ÎD!Î8D!ÎpD!μD!ÎèDJ°ÎìDJ±ÎüDJ¢Ï$DJµÏ@D!ÏLD! ÏxD! ÏD! Ï”D!Ï D!ϤD!ϰD!ÏÀDJ½ÏÄDJ¾ÏÐDJ¿ÏÜD!ÏðD!ÏüD!Ð4D!ÐPD!ÐŒD!ÐÄD!"ÐÈD!ÐÐD!ÐàD!ÐäD!ÐèD!ÐìD!"ÐðD!#Ñ(D!$ÑTD!%Ñ€D!&ÑÈDJ§ÑôD!(ÒD!)Ò\D!*ÒˆDJ§ÒŒDJ¨Ò DJ¢Ò¬D!+ÒÈD!,ÒðD!-Ó(D!.ÓTDJ°ÓXDJ±ÓhDJ¢ÓDJµÓ¬D!/Ó¸D!0ÓèD!=ÔD!4ÔD!5Ô0D!=ÔTD!>Ô€D!?ÔÈD!@ÕD!AÕDD!IÕHD!BÕLD!CÕ\D!DÕ`D!EÕdD!CÕhD!IÕlD!JÕ¤D!RÕØD!SÕðD!TÖ0D!UÖ`D!VÖD!WÖÀD!ZÖÐD! ×D!0×D!\×02™$ àÊ02Ú@ à2î@ á2ý@ â3 @ ã3@ ä3*@ å39@ æ3HÀÊ03I@ î3UÀÊX3VàÊ\3W@ î3cÀÊx3dàÊ 3e@J¯ 3qÀÎì3ràÏL3s@!3ÀÏÄ3€àÏð3@J¯ 3ÀÓX3ŽàÓ¸3à×X3$ (N×X3‘¬|.×`DG6×`DG8×xDG6×|DG8׌DG9לDG<פDG;רD!p׬D!n×°DG<×´DG;׸D!p×¼D!a×ÈD!p×ÌDG;×ÜDG<×àD!o×äD!p×èD!a×ìD!p×ðDG<×ôD!n×øD!o×üDG<ØD!nØD!oØDG<Ø D!pØD!qØD!tØ D!sØ$D!qØ(D!rØ0D!tØ@D!sØDD!tØHDIÛØLD!sØPDIÛØXDIÜØ\DIߨ€D!wØ D!xجDIáØÈD!tØôD!xÙD!yÙ0D!|Ù8D!}ÙPD!~Ù€D!Ù„D!~ÙˆD!ÙD!…Ù”D!†Ù DJ½Ù¤D!†Ù¨DJ½Ù¬DJ¾Ù¸DJ¿ÙÀD!†ÙÔD!¾ÙøD!‡Ú@D!ÐÚD!ˆÚ¨D!‰ÚèD!ŠÛ(D!‹Û`D!“ÛdD!ŒÛlD!Û|D!ŽÛ€D!Û„D!ÛˆD!“ÛŒD!”ÛÌD!•ÛøD!–Ü$D!—ÜlDJ§ܘDJ¨ܬDJ¢ܸD!˜ÜÔD!™ÜüD!šÝ<DJ§ÝhD!›ÝlDJ§ÝpDJ¨Ý|DJ¢݈D!œݤD!ÝÀD!žÞ DJ°Þ8D!ŸÞ<DJ°Þ@DJ±ÞLDJ¢ÞtDJµÞD! ÞœD!»ÞÐD!¡ÞôD!§ßD!ªßD!­ß D!°ß(D!±ßPD!²ß\D!±ß`D!²ßdD!µßlD!¶߀D!ÏߤD!¶ߨD!Ï߬D!¶ß°D!·ßÐD!¸ßðD!¹àD!»àD!¼à(D!½à`D!¾àD!¿à D!ÀàÐD!ÁàÔD!ÅáD!°á D!Ðá4D!ÑáLD!Òá|D!Óá°D!ÔáàD!ÕâD!×â0D!Øâ4D!Ùâ`D!ÚâDG=âÀDG>âÈD!¡ãDGAã 3§$G6×`3Ù@G63ä@G63í@G63ö@G83ÿÀ×`4€!`84€!a<4.€!b@4C€!cD4W@!d4h@!e4|@!f4‹@!h4š@!i4©@!j4¸@!k4Ç@!l4ÖÀ׬4×à×´4Ø€!`84ë€!a<5€!b@5€!cD5/@!d5@@!e5T@!f5c@!h5r@!i5@!j5@!k5Ÿ@!l5®À×¼5¯à×Ü5°€!`85À!a<5Þ€!b@5ó€!cD6@!d6@!e6,@!f6;@!h6J@!i6Y@!j6h@!k6w@!l6†À×ä6‡à×ô6ˆ€!`86›€!a<6¶€!b@6Ë€!cD6ß@!d6ð@!e7@!f7@!h7"@!i71@!j7@@!k7O@!l7^À×ø7_àØ7`€!`87s€!a<7Ž€!b@7£€!cD7·@!d7È@!e7Ü@!f7ë@!h7ú@!i8 @!j8@!k8'@!l86ÀØ87àØ 88€!`88K€!a<8f€!b@8{€!cD8@!d8 @!e8´@!f8Ã@!h8Ò@!i8á@!j8ð@!k8ÿ@!l9ÀØ9@!t9ÀØL9àØP9@!t9-ÀØX9.àØ 9/@!t9=ÀØÈ9>àØô9?@!†9KÀÙ¤9LàÙ¨9M@!†9YÀÙ¬9ZàÙÔ9[@J¯ 9gÀÞ89hàÞ<9i@J¯ 9uÀÞ@9vàÞœ9wàâÀ9x€!`89‹€!a<9¦€!b@9»€!cD9Ï@!d9à@!e9ô@!f:@!h:@!i:!@!j:0@!k:?@!l:NÀã:Oàã :PàãH:Q$ èNãH:R¬.ãPDÿãPDã\Dÿã`DãdDÿãhDãpDãtDÿãxDã„DãˆDãŒDãDÿã”DãœDã¤Dã¨Dã¬DãÀDãäDä Dä`DäDä”Dä˜D!äœDä¤Dä¨Dä°Dä¼D!äÀDäÄD!äÌDRåDHåDXå@DJ¿åŒDYå¤DJ¿å¼DYåÄDeåðDhæ$Doæ`Dræ”D"æÐDç4D#çPD$ç€D%ç˜D&çàD'èHD(ètD)è D*èÌD/èøD0é8D1édD3éhD1épD2éxD3é|D4éàD5ê D6ê8D;êdD<ê˜DAêÄDCëDDë DEë,DHëpDIë€DJ§ë¬DJ¨ëÀDJ¢ëÌDJëìDKìDJ§ìDDJ¨ìXDJ¢ìdDNì„DOì´DJ§ìàDJ¨ìôDJ¢íDRí DSí`DJ°íŒDJ±íœDJ¢íÄDJµíàDVíìDWî<DXîTDYîpDJ½îtDYîxDJ½î|DJ¾îˆDZî”D[î¬D\îØD]îìDeîðD]îøD^ïD_ïD`ïDaïDbï Dcï$Ddï0Deï4DfïDDgïpDhïœDiï°Doï´Diï¸DjïÀDkïÄDmïÐDlïÔDoïØDpïèDrïìDsðDtð,DuðXDwðˆDzð´DðÌD‚ððDƒñ D„ñPD…ñD†ñÀD‰ñÐDŠòD‹ò@DŒòpDò DŽòÐDóDó0D‘ó`D’óD“óÐDWôD•ô0:h$ÿãP:ž@ÿ:² ÿ¼:Ä ÿÀ:Ö€8:í€<;@;@;3@;D@;Y@;n@;Œ@;›@ ;ª@ ;¹@ ;È@ ;×@ ;æ&¬;þ€<ÀãP<@Y<)ÀåŒ<*àå¤<+@Y<7Àå¼<8àåÄ<9@J¯ D?4D@pDA°DDàDEäDKèDNìDKôDDøDEDK DNDKDNDPDudD…€D‰ÄDOD˜XDPpDQ DR¸DSôDTLDUxDV¤DWÐD\üD]<D^tD`xD^€D_ˆD`ŒDaØDbDc0Dh\DiDn¼DpDqDr$Du`DvpDJ§œDJ¨°DJ¢¼DwØDxôDJ§ DJ¨4DJ¢@D{\D|€DJ§¬DJ¨ÀDJ¢ÌDèD€ DJ° 8DJ± HDJ¢ pDJµ Dƒ œD„ àD… øD† D‡ (D‰ ,D‡ 4Dˆ <D‰ @DŠ LD‹ xDŒ ¤DŽ ÔD‘ D˜ D™ 0Dš `D› Dœ ÀDŸ ÐD  D¡ @D¢ pD£  D¤ ÐD¥ D¦ 0D§ `D¨ D© ÐD„D«0=õ$- >*@->> -¬>P -°>b€.8>y€/<>Ž@0>ª@1>¿@2>Ð@3>å@4>ú@5?@6?'@7?6@8?E@9?T@:?c&;¬˜?{€?™À ?š@J¯ ?¦À 8?§à œ?¨àX?©$ ¸NX?ª¬ .`Dº`DËxDº€D»„DºˆDËD½¨D»¬D¼°DË´DÌÈDÍÌDÔÐDÌØDÍàDÎìDÏüD× DÔD×DÔ DØ$DÔ(D×,DØ0DÙ4Dá`Dâ°DçàDéTDê\DëhDo DîÀDïðDJ§ DJ¨4DJ¢@DðdDñDJ§ÀDJ¨ÔDJ¢àDôDõ DJ§PDJ¨dDJ¢pDø”DùÐDJ§DJ¨DJ¢ DüDDý€DJ°°DJ±ÀDJ¢èDJµDDTDpD„DˆDD”D¨D ÀD ÈD ÜD àD èD ìD @D`D|DD”DœD DðD D D @D!D"¼D'èD(øD)$D/,D0@D/DD0LD1PD2 D4¬D7ÀD8àD9 D:LD?xD@ˆDA´DG¼DHDIPDQTDIXDJ`DKdDLpDMtDN€DO„DPDQ”DRÐDTÔDUDV<DWhDZœD]ÈD^D_D^D_D`Df8DoPDppDq DrÐDs Dv DwPDx€Dy°DzàD{D|@D}pD~ DàD€?À$º`@@º@@º@)@º@;€»8@O€¼<@a€½@@q@¾@‡@¿@Ÿ@À@µ@Á@Î@Â@å@Ã@ô€ÄDA@ÅA@ÆA @ÇA/@ÈA>@ÉAO&ʬ Ag€A…À`A†@J¯ A’À°A“àA”à(A•$ÈN(A–¬°.0D,¶0D,ÌHD,¶PD,·TD,ÌXD,¶\D,ÌdD,·xD,Â|D,ÀD,Å„D,ƈD,ÌŒD,͘D,ΜD,Ï D,Û¤D,ϨD,ͬD,δD,×ÀD,ÛÄD,×ÈD,ÛÐD,é D,ÛD,éD,Ü D,Ý4D,Þ8D,Ý<D,á@D,ÞHD,ßXD,àdD,áhD,â|D,ã°D,â´D,ã¸D,äàD,åäD,éðD,ê D,é $D,ê ,D,í `D,ê dD,í hD,ê lD,í pD,î xD,í |D,î €D,ï „D,ð D,ñ àD,ò!@D,ó!TD,ô!XD,ö!\D,÷!`D,ó!dD,÷!hD,ô!pD,õ!€D,ö!ˆD,÷!ŒD,ø!ØD,ù"D,ú"0D,û"4D,ü"8D,ý"lD,þ" D-"àD-# D- #¨D-#¬D- #°D- #´D- #àD-$D-$D-$D-$D-$ D-$$D-$(D-$,D-$<D-$PD-$€D-$ˆD-$ŒD-$D-$”D-$¤D-$àD-$äD-$èD-$øD-% D-%D-%0D-%dD-% D-%¤D-%¨D-%¸DJ§%ðD-%ôDJ§%øDJ¨&DJ¢&D-&0D- &8DJ§&pD-!&tD-"&xDJ§&|DJ¨&ŒDJ¢&˜D-#&°D-$&¸D-%&ðDJ§&ôD-&&øD-%&üDJ§'DJ¨'DJ¢'D-''@D-('HDJ§'€D-)'„D-*'ˆDJ§'ŒDJ¨'œDJ¢'¨D-+'ÀD-,'ÈD--(DJ°(D-.(D--( DJ°(DJ±(DJ¢(DDJµ(`D-/(lD-0(œD-3(ÄD-0(ÈD-3(ÌD-4(ÜD-6(àD-4(èD-5(ðD-6(øD-7) D-8)HD-=)€D-9)„D-:)ˆD-=)ŒD->)œD-@) D->)¤D-?)¬D-@)´D-A)ÈD-B*D-G*@D-D*DD-C*HD-D*LD-G*PD-H*\D-I*lD-J*„D-K*ˆD-J*ŒD-K*˜D-L*ÐD-K*ÔD-L*ØD-M*àD-N*ôD-P+D-O+D-P+D-Q+4D-R+dD-Q+pD-R+tD-S+xD-T+¨D-S+¬D-T+°D-Z+àD-[+ôD-]+øD-[,D-\,D-],D-^,$D-_,`D-^,hD-_,lD-`,|D-a,´D-f,àD-b,äD-f,èD-c,ìD-f,ðD-g,øD-k-0D-l-LD-m-\D-l-`D-m-dD-n-hD-o-€D-0-D-r-°D-t-ÈD-v-ÌD-w-äD-x.D-y.D-v.D-}. D-v.$D-}.0D-v.4D-}.LD-~.|D-}.€D-~.„D-.¸D-~.¼D-.ÀD-€.ôD-.øD-€.üD-ƒ/0D-€/4D-ƒ/8D-€/<D-ƒ/@D-„/HD-ƒ/LD-„/PD-…/TD-†/`D-‡/xD-ˆ/”D-‰/¨D-‹/¬D-‰/¸D-Š/¼D-‹/ÀD-Œ/ÔD-0D-Ž0D-0@D-Ž0LD-0TD-œ0dD-0xD-£0|D-§0€D-0„D-ž0ŒD-Ÿ0D- 0œD-¡0 D-¢0¬D-£0°D-¤0ÀD-¥0ÈD-¦0ÔD-§0ØD-¨0ðD-©1 D-«1PD-®1TD-ª1XD-«1\D-®1`D-¯1pD-±1tD-¯1xD-°1„D-±1D-²1¤D-³1àD-²1äD-³1èD-´1üD-µ24D-¸28D-¹2TD-º2hD-¾2lD-º2pD-»2xD-¼2|D-½2ˆD-¾2ŒD-¿2 D-À2ÔD-Á3D-Ã38D-3tD-+3”D-63ÌD-@3ðD-H4D-I44D-P4lD-_4D-k4°D-n4ÔD-r5D-†5DD-‡5xD-ˆ5¤D-§5ÐD-±6D-³60D-¸6dD-¾6ŒD-Ã6´D-Ì6ÀD-Í7D-Ì7D-Í7 D-Î7@D-Í7DD-Î7LD-Ï7ˆD-Ð7ÀD-Ñ8D-Ò8@D-Ó8LD-Ò8PD-Ó8TD-×8\D-Ý8|D-×8€D-Ý8œD-Ø8¤D-Ù8¸D-Ú8ìD-Ù8ðD-Ú8ôD-ä9 D-Ú9$D-ä9(D-Þ90D-ß9hD-à9 D-ê9äD-æ9èD-è9üD-ç:D-ê:D-ç:D-è: D-é:D-ð:D-ñ:4D-ò:\D-ó:pD-ô:°D-õ:ðD-ö;0D-÷;pD-ù; D-ü;°D-ý;àD-þ<D-ÿ<@D.D. >D.>D.>D. >D.>$D.>4D.>8D.><D.>@D.>LD.>PD.">TD.>\D.>`D.>hD.">lD.>pD.">xD.#>ÀD.)>ðD.%>øD.$>üD.)?D.%?D.)?D.7?0D.)?4D.7?8D.)?<D.7?@D.*?PD.+?dD.,?hD..?lD.+?pD./?tD.,?|D.-?ŒD..?˜D./?œD.0?°D.1?àD.0?äD.1?èD.P@D.3@D.2@D.P@D.3@$D.P@(D.7@@D.8@pD.7@tD.8@|D.;@°D.8@´D.;@¸D.8@¼D.;@ÀD.<@ÈD.;@ÌD.<@ÐD.=@ÔD.>@àD.?A D.@A$D.?A(D.@A4D.AAdD.BA˜D.sAàD.vBD.zB(D.}BLD.PBpD.BœD.QB¬D.RBÀD.SBÌD.TBÔD.UCD.VCPD.UCTD.VCXD.WC„D.VCˆD.WCŒD.XC´D.\C¸D.YC¼D.\CÀD.]CØD.^CìD._DD.^D D._D$D.`D`D.bD D.cD¨D.bD¬D.cD°D.dD´D.gDÐD.hDàDJ§ED.hEDJ§EDJ¨E,DJ¢E8D.iEPD.jEXDJ§ED.lE”D.kE˜D.lEœDJ§E DJ¨E°DJ¢E¼D.mEàD.nEèDJ°F D.pF$D.oF(D.pF,DJ°F0DJ±F<DJ¢FdDJµF€D.qFŒD.rF°D.sFÐD.rFØD.sFÜD.rFèD.sFìD.tFøD.uGD.tGD.uG D.vGD.wG(D.zG@D.{G\D.|GhD.{GlD.|GpD.}GtD.~GŒD.‚G˜D.†GÔD.HD.H@D.HDD.HLD.‘H€D.H„D.‘HŒD.’HÄD.‘HÐD.“HÔD.’HØD.“HÜD.—HàD.ID.—ID.I D.˜I(D.™I<D.šIpD.™ItD.šIxD.¤I¤D.šI¨D.¤I¬D.žI´D.ŸIìD. J$D.¦J`D.¨JpD.§JtD.ªJxD.§J|D.¨J€D.©J„D.°JŒD.±J°D.³JÀD.´KD.µK@D.¶K€D.¹KD.ºKÀD.»KðD.¼L D.½LPD.¾L€D.rL°D.ÀLÐD¡$. =ðDÖ@. Dê@. Dü@. E@. E$@.E9@.EJ@.E[@.El@.E{€.DE‰€.<E—€.@E¥€.8E³& .ºÈEË€EéÀ=ðEê@.‰Eû€.ŠHF€.ŠLF&€.ŠPF9@.‹FQÀBœFRàB¬FS@J¦F_ÀEF`àEFa@J¦FmÀEFnàEPFo@J¦F{ÀEF|àE”F}@J¦F‰ÀE FŠàEàF‹@J¯ F—ÀF F˜àF$F™@J¯ F¥ÀF0F¦àFŒF§@.‰F¸€.ŠHFÍ€.ŠLFã€.ŠPFö@.‹GÀHGàJŒGàLðG$NLð.LðDCLðDCMDCMDCMD($M D(M$D("M(D(M,D($M0D(!M8D(%M<D(&MHD(*MTD(-M`D(.M|D(/MÄD(0MôD(/MüD(0ND(1N(D(2NxD(7N¨D(2N¬D(3N°D(4N´D(7N¸DJ§NäDJ¨NôDJ¢OD(8OD(9O D(:O8DJ§OhD(:OlD(;OpDJ§OtDJ¨O„DJ¢OD(<O¨D(=O°D(>OÈDJ§OøD(>OüD(?PDJ§PDJ¨PDJ¢P D(@P8D(AP@D(BPXDJ°PˆD(BPŒD(CPDJ°P”DJ±P DJ¢PÈDJµPäD(DPðD(EQ D(HQ<D(KQ@D(EQHD(HQLD(KQPD(NQTD(KQXD(NQtD(RQD(UQ D(VQ¼D(WQØD(XR D(ZRD(\RD(XRD(YRD(ZR(D([R,D(\R0D(]R\D(^RD(dR¼D(_RÄD(`RÈD(dRÌD(oRøD(dRüD(oSD(dSD(oSD(eSD(fS$D(gS0D(hS8D(iSPD(jS„D(kS¸D(oSôD(pT D(oT$D(pT,D(qT`D(pTdD(qTlD(tT DJ½T¤D(qT¨D(tT¬DJ½T°D(qT´DJ½T¸DJ¾TÀDJ¿TÌD(tTàD(uUD(vU D(uUD(vUD(wU@D(vUDD(wULD(xUXD(yUdD(zU˜D({UÈD(|UÔD(}UÜD(~V D(€VD(VDD(‚VxD(ŠVÀD(‹VÔD(VØD(‹VÜD(VìD(ŒVôD(VüD(ŽWD(WHD(WXD(‘W”D(˜WÀD(™XD(šX@D(›X€D(œXÀD(ŸXÐD( YD(¡Y0DCY`D(EYˆDCY°G$CLðGR@CG[@CGd@CGm€(DG„@(G“@(G¢€(8G°€(!<G¾€("@GÌ@(#GÛÀM GÜ@J¦GèÀNäGéàOGê@J¦GöÀOhG÷àOlGø@J¦HÀOtHàO¨H@J¦HÀOøHàOüH@J¦H ÀPH!àP8H"@J¯ H.ÀPˆH/àPŒH0@J¯ H<ÀP”H=àPðH>@(tHJÀT¤HK@J¼HYÀT¤HZàT¨H[àT¨H\@(tHhÀT°Hi@J¼HwÀT°HxàT´HyàT´Hz@(tH†ÀT¸H‡@J¼H•ÀT¸H–àTàH—àTàH˜àY`H™€(DH°@(H¿@(H΀(8HÜ€(!<Hê€("@Hø@(#IÀYˆIàY°I $ àNYÐ.YÐD5 YÐD5ZD5Z D5ZD5ZD5Z$D5Z0D5Z<D5Z@D5ZDD5ZLD5ZPD5!Z`D5"Z D5hZäD5#[D5$[ D5%[D5&[PD5'[dD5([€D5)[°D5*[ôD5+\ D5,\LD5-\xDJÛ\€DJÜ\ˆDJß\¤D5.\ÈDJá\àD5-]D5.](D53]@D5/]HD53]LD56]TD5:]dD5=]€DJ•]¼D5>]ÀDJ•]ÄD5>]ÈDJ•]ÌDJ–]àDJ˜]ìDJ™]ôDJ›^DJœ^DJ›^DJœ^D5>^DD5?^€D5@^¬DJÛ^°DJÜ^¸DJß^àD5A_DJá_ D5@_DD5A_xD5F_D5I_˜D5B_œD5I_ D5F_¤D5I_¨D5F_¬D5I_°D5R_ÀD5a_ÄD5R_ÈD5U_ÌD5X_ÔD5[_ÜD5^_èD5a_øD5h`D5i` D5j`PD5k`€D5l`°D5o`ÀD5p`ðD5qa D5saLI $5 YÐIL@5 Ib@5 Is@5 I@5 I¡@5 I¾@5 IÖ@5Iî€J@5J@5J!@5J0@5J?@5JNÀYÐJO@5-J]À\€J^à\ÈJ_@5-JmÀ\àJnà]Jo@5>JzÀ]¼J{à]ÀJ|@5>J‡À]ÄJˆà]ÈJ‰@5>J”À]ÌJ•@J˜JžÀ]ìJŸà^DJ à^DJ¡@5@J¯À^°J°à_J±@5@J¿À_ JÀà_DJÁàatJÂ$¤Nat.a€DÍa€DðaˆDÍaŒDða DÍa¤DÕa¨DÛa´DÕa¸DðaÀDaÈDßaôDàbDßbDàbDãb DæbDãbDæbDçb4Dæb8Dçb<Dëb@DìbPDëbTDìbXDñb\DðbdDñbhDòblDJ½bpDòbtDJ½bxDJ¾b„DJ•bŒDJ–b¨DJ˜b¸DJ™bÀDJ›bàDJœbìDJ›bðDJœbôDócD c8DôcPDõc|Döc”D÷cÀDøcÔDùcìDúcøDûd$Dýd`DþdpDd€DdˆDdŒDdDJ½d”Dd˜DJ½dœDJ¾d¨DJ•d°DJ–dÌDJ˜dÜDJ™däDJ›eDJœe DJ›eDJœeDe<DeHDetDeŒDe¸D eÌD fD fD f<Df€DàfŒDJ¿f”Dòf¨DõfÌDJ¿fðDgDg(D gLD!gdDIêg˜DIëg¨DIìg´DIëg¼DIìgÀDIígÈDIïgØD%gäD'hJÃ$Ía€K@ÍK@ÍK)@ÍK<@ÎKP@ÏKe@ÐKx@ÑK‡€Ò8K•@ÓK¤@ÔK³Àa€K´@òKÀÀbpKÁàbtKÂ@òKÎÀbxKÏàbŒKÐ@J˜KÙÀb¸KÚàcKÛ@KçÀd”Kèàd˜Ké@KõÀdœKöàd°K÷@J˜LÀdÜLàe<L@òLÀf”Làf¨L@LÀfðLàgL€Iè<L,€Iè@L:€IèDLG@IéLRÀg˜LSàgäLTàh(LU$¨Nh(LV¬¸.h0D:4h0D:eh8D:4h<D:eh@D:5hDD:4hHD:ehPD:4hTD:dhXD:eh\D:dhdD:ehhD:dhxD:5h|D:Wh€D:Xh„D:YhˆD:[hŒD:]hD:^h”D:_h˜D:`hœD:ah D:eh¤D:fh°D:zh´D:fh¼D:ghÈD:}hØD:hÜD:zhàD:häD:zhèD:hðD:‚hôD:ƒipD:„i D:…i¤D:„i¨D:‹i°D:ŒjPD:‘j€D:Žj„D:jˆD:‘jŒD:Žj”D:‘j˜D:’kD:—k0D:”k4D:“k8D:—k<D:”kDD:—kHD:˜k°D:kàD:™kèD:škìD:kðD:žlD:Ÿl D: l4D:¡l8D:£l<D: l@D:¡lDD:¢lTD:£l`D:¤ldD:¥lØD:¦m D:§m<D:¦m@D:§mHD:¨mpD:©mtD:¬m|D:°mÜDJ½màD:°mäDJ½mèDJ¾møDJ¿nD:°nD:±n|D:²n˜D:³nÌD:²nÐD:³nÔD:´näD:µnôD:¶oD:·oD:¸oLD:¹o|D:¸o€D:¹o„D:ºo°D:Áo´D:»o¸D:Áo¼D:ÏpD:Âp$D:ÃpPD:ÄpTD:ÇpXD:Ëp¤D:ÏpÀD:ÐpìD:ÏpðD:ÐpøD:Ñq,D:Ðq0D:Ñq8D:ÔqlDJ½qpD:ÑqtD:ÔqxDJ½q|D:Ñq€DJ½q„DJ¾qŒDJ¿q˜D:Ôq¬D:Õr D:ÖrD:ÕrD:ÖrD:×rHD:ÖrLD:×rTD:ØrxD:ÙrˆD:ßrÄD:àrøD:æs$D:ás,D:âs0D:æs4D:íshD:çsxD:ès„D:és´D:ès¼D:ésÀD:ísÌD:ðsøDJ½süD:ítDJ½tDJ¾tDJ¿tD:ðt0D:ñt<D:òtDD:ñtHD:òtLD:ótxD:òt|D:ót„D:ôtˆD:õt”D:øtÐDJ½täD:ûtìDJ½tôDJ¾tüDJ¿uD:ûuD:üu(D:ýuDD:þuxD:ýu|D:þu€D:ÿuD;u¤D;u°D;v D;v@D;vtD;v¨D;vÜD;wD; wDD; wxD; w|D; w€D;w°D;wèD;8xHD;xXD;xlD;xpD;xtD;xxD;x|D;x„D;x”D;x D;x¤D;yD; y0D;y4D; y8D;%ydD;!yhD;"ylD;%ypD;"yxD;!y|D;%y€D;&yD;'y¤D;(y´D;)yÀD;*zD;+zPD;*zTD;+zXD;,z„D;+zˆD;,zŒD;1z´D;-z¸D;1z¼D;.zÀD;1zÄD;-zÈD;1zÌD;2zÜD;3{(D;4{\D;8{ D;9{ÌD;8{ÐD;9{ØD;:| D;9|D;:|D;;|LD;:|PD;;|XD;<|ŒD;;|D;<|˜D;=|ÌD;<|ÐD;=|ØD;>} D;=}D;>}D;?}LD;>}PD;?}XD;@}ŒD;?}D;@}˜D;C}ÌD;@}ÐD;C}ÔD;@}ØD;C}ÜD;D}äD;E~D;F~(D;G~dD;H~°D;I~àD;J~äD;I~èD;K~ìD;L D;MTD;TˆD;U¤D;V¸D;WÌD;ZÐD;WÔD;XäD;YðD;ZüD;[€D;\€D;]€LD;^€|D;]€€D;^€„D;_€àD;cD;_D;cD;d,D;e@D;fTD;ghD;htD;i€D;j„D;kœD;lÐD;m‚D;l‚D;m‚D;n‚dD;r‚”D;n‚˜D;r‚ D;s‚ôD;vƒD;sƒD;vƒD;wƒ€D;xƒ°D;|ƒ´D;yƒ¸D;|ƒ¼D;yƒÀD;|ƒÄD;xƒÈD;|ƒÌD;}ƒÜD;~ƒôD;„$D;~„(D;„,D;€„<D;„LD;‚„XD;ƒ„ÄD;„„øD;ƒ„üD;„…D;……,D;„…0D;……4D;†…\D;‡…`D;Š…hD;†…lD;Š…pD;‹…ÄD;…ÔD;…ÜD;‘…øD;’† D;”†D;’†D;“†D;”† D;•†|D;–†¬D;•†¸D;–†¼D;—†ÀD;˜†ðD;—†ôD;˜†øD;¡‡DD;¢‡lD;£‡tD;¤‡D;¥‡¤D;§‡¨D;¥‡°D;¦‡´D;§‡¸D;¨ˆ$D;©ˆTD;¨ˆ`D;©ˆdD;ªˆhD;«ˆ˜D;ªˆ D;«ˆ¤D;±ˆðD;²‰D;¶‰4D;·‰PD;¸‰dD;¹‰”D;¸‰˜D;¹‰œD;º‰üD;¼ŠLD;½ŠTD;¼ŠXD;½Š\D;¾Š`D;ÁŠpD;Š€DJ§аD;Š´DJ§ЏDJ¨ŠÈDJ¢ŠÔD;ÊàD;ÄŠìD;Å‹DJ§‹ D;Æ‹$D;Å‹(DJ§‹,DJ¨‹<DJ¢‹HD;Ç‹TD;È‹`D;É‹DJ°‹”D;Ê‹˜D;É‹œDJ°‹ DJ±‹¬DJ¢‹ÔDJµ‹äD;Ì‹ôD;ÏŒ D;ÌŒD;ÏŒD;ÐŒ$D;ÔŒ0D;ÛŒ€D;ÌŒD;ÕŒ¬D;ÖŒ¸D;׌èD;ÖŒðD;׌ôD;ÛŒüD;Ü(D;Û,D;Ü0D;ÝdD;ÜhD;ÝlD;Þ D;ݤD;Þ¨D;ßÜD;ÞàD;ßäD;àŽD;ߎD;àŽ D;áŽTD;àŽXD;áŽ\D;âŽD;᎔D;⎘D;åŽÌDJ½ŽÐD;âŽÔD;åŽØDJ½ŽÜD;âŽàDJ½ŽäDJ¾ŽìDJ¿ŽøD;åD;æD;çD;æD;ç D;èLD;çPD;èXD;é\D;ê`D;édD;êlD;épD;êtD;íŒD;ðœD;ñ¬D;ô¸D;õÌDJ½D;ùDJ½DJ¾DJ¿$D;ù0D;ú<D;ûXD;üŒD;ûD;ü”D;ý¤D;þ¸D;ÿÄD<ÜD<‘D<‘DD<‘xD<‘¬D<‘°D<‘´D<‘äD<’D<’4D<’<D<’XD<’lD<’pD<’tD<’xD<’|D<’€D<’„D<’ÜD<“ D<“D<“D<“ D<“PD<“\D<“`D<“¤D—pD³äD==³èD=@³ìD==³ðD=>³ôD=?³øD=F´D=G´ D=I´€D=J´ÀD=KµD=Lµ@D=Mµ€D=NµÀD=O¶D=P¶@D=Q¶€D=R¶ÀD=U¶ÐD=V·D=W·0D=X·`D=Y·D=Z·ÀD=[·ðD=\¸ D=]¸PD=^¸€D=_¸°D=`¸àD=a¹D=b¹@D=c¹pD=d¹ D=e¹ÐD=fºD=gº0D=hº`D=iºD<ݺÄD=kºàLl$:4h0L@:4L¯@:4LÁ@:4LÓ€:5HLê€:6<M@:=M@:>M4€:?pML€:@ pM`€:ApMz@:BM“@:CM©@:DM¼@:EMÕ@:FMì@:GN€:H¨N€:I¤N*€:J N;€:KœNR@:LNl€:M˜N}€:N”N€:ON €:PŒN³€:QˆNÊ€:R„N߀:S€Nô€:T|O @:UO@:VO'€OH€:WLOV€:XPOd€:YTOr@:ZOƒ€:[XO‘€:]\OŸ€:^`O­€:_dO¼€:`hOË€:alOÚ@:bOê&:c¬¸P€P Àh0P!@:°P-ÀmàP.@J¼P<ÀmàP=àmäP>àmäP?@:°PKÀmèPL@J¼PZÀmèP[ànP\ànP]@:ÔPiÀqpPj@J¼PxÀqpPyàqtPzàqtP{@:ÔP‡Àq|Pˆ@J¼P–Àq|P—àq€P˜àq€P™@:ÔP¥Àq„P¦@J¼P´Àq„Pµàq¬P¶àq¬P·@:ðPÃÀsüPÄ@J¼PÒÀsüPÓàtPÔàtPÕ@:ðPáÀtPâ@J¼PðÀtPñàt0Pòàt0Pó@:ûPÿÀtäQ@J¼QÀtäQàtìQàtìQ@:ûQÀtôQ@J¼Q,ÀtôQ-àuQ.àuQ/@J¦Q;ÀаQ<àŠ´Q=@J¦QIÀЏQJàŠàQK@J¦QWÀ‹ QXà‹$QY@J¦QeÀ‹,Qfà‹TQg@J¯ QsÀ‹”Qtà‹˜Qu@J¯ QÀ‹ Q‚à‹ôQƒ@;åQÀŽÐQ@J¼QžÀŽÐQŸàŽÔQ àŽÔQ¡@;åQ­ÀŽÜQ®@J¼Q¼ÀŽÜQ½àŽàQ¾àŽàQ¿@;åQËÀŽäQÌ@J¼QÚÀŽäQÛàQÜàQÝ@;ùQéÀQê@J¼QøÀQùàQúàQû@;ùRÀR@J¼RÀRà0Rà0R@J¦R%À•@R&à•DR'@J¦R3À•HR4à•pR5@J¦RAÀ•°RBà•´RC@J¦ROÀ•¼RPà•äRQ@J¯ R]À–$R^à–(R_@J¯ RkÀ–0Rlà–€Rm@J”RvÀ–ÐRwà—Rx@J”RÀ— R‚@J˜R‹À— RŒà—pRà—pRŽ@J”R—À—ÈR˜@J˜R¡À—üR¢à˜LR£à˜LR¤@J”R­À˜¤R®@J˜R·À˜ØR¸à™(R¹à™(Rº@=RË€=@Rà€=DRö€=8S @=S!À§pS"à§€S#@J¦S/À©ØS0à©ÜS1@J¦S=À©àS>àªS?@J¦SKÀªTSLàªXSM@J¦SYÀªdSZઘS[@J¦SgÀªØShàªÜSi@J¦SuÀªèSvà«Sw@J¦SƒÀ«\S„à«`S…@J¦S‘À«lS’à« S“@J¯ SŸÀ«àS à«äS¡@J¯ S­À«ðS®à¬LS¯@=SÀ€=@SÕ€=DSë€=8Sþ@=TÀ¯ìTà´TàºøT$RÈNºøT¬Ä.»D#®»D#»»D#®» D#¯»$D#®»(D#»»0D#¯»DD#»»HD#¼»XD#½»\D#¾»`D#Á»dD#¾»hD#¼»lD#½»tD#Á»€D#À»„D#Á»ˆDIÛ»ŒD#À»DIÛ»˜DIÜ»œDIß»ÀD#Ä»äD#Å»üDIá¼D#Á¼@D#ż\D#Ƽ€D#ɼŒD#ʼÐD#нD#ѽD#Ò½D#®½0D#Ó½@D#Ô½dD#Ó½hD#Ô½lD#Õ½pD#×½D#Ú½˜D#Û½°D$;½øD$!¾D#ܾ@D#ݾ€D#ß¾„D#à¾ÀD#á¾ðD#â¿ D#ç¿PD#è¿|D#ì¿ÐD#í¿àDJ•¿øDJ–ÀDJ˜À$DJ™À,DJ›À4DJœÀ@DJ›ÀDDJœÀHD#îÀpD#ïÀxD#ðÀ°D#ñÀðD#òÁ D#óÁ8D#ôÁHD#õÁ€D#öÁ°D#÷Á¼D#ùÁèD#÷ÁìD#ùÁðD#üÁôD#ý D#þÂPD#ÿÂD$”D$ÂÐD$ÂüD$Ã(D$ ÃTD$ ÀD$ ÃÐD#ÒÄD$Ä D$Ä$D$Ä,D$Ä0D$ÄPD$ÄTD$ÄXD$Ä\D$Ä`D$ÄdD$ÄpD$ÄD$ĘD$:ĸD$ÄÀD$ÄÐD$ÄðD$ÅD$!ÅD$"ÅD$#ÅDD$$ÅpD$)ÅœD$*ÅÈD$+ÅàD$ÆD$4Æ4D#íÆLD#òÆpD$Æ”D$*ƸD$;ÆèD$<ÇD$=Ç0D#ÚÇhD#çÇ€D#üǬD$ ÇÔD$)ÈD$=È0D$>È@D$AÈPD$BÈ€D$CȰD$DÈàD$EÉD$GÉ@T0$#®»Tj@#®T~@#®T@#®T¢€#¯8T¸@#°TÉ@#±TÝ@#²Tî@#³U@#´U@#µU€#·<U-@#¸U<@#¹UK&#º¬ÄUc€UÀ»U‚@#ÁU@#ÁU›À»ŒUœà»U@#ÁU«@#ÁU¶À»˜U·à»äU¸@#ÁUÆ@#ÁUÑÀ¼UÒà¼@UÓ@J˜UÜÀÀ$UÝàÀpUÞàÉdUß$dNÉdUà ºÌ.ÉpD$KÉpD$[ɈD$KÉD$SÉ”D$[ɘD$KÉœD$[ɤD$SÉ´D$WɸD$XɼD$[ÉÀD$\ÉÌD$`ÉÐD$\ÉØD$`ÉàD$fÉìD$gÊ@D$hÊpD$iÊtD$lÊxD$mÊÀD$nÊðD$oÊôD$sÊøD$rÊüD$sËD$rËD$sËD$KËD$vË0D$wËDD$vËHD$wËLD$xËPD$yË`D${ËpD$‚ËxD$ƒ˘D$‚ËœD$ƒË D$„ˤD$†ËÄD$ŠËàD$‹ËüD$ŠÌD$‹ÌD$ŒÌDJéÌ(D$Ì,DJéÌ0D$Ì4DJéÌ8D$Ì<DJéÌDDJêÌTDJìÌlDJíÌpDJïÌxDJð̈DJïÌŒDJðÌD$ÌÀD$ŽÍDJ•Í@D$“ÍDDJ•ÍHD$“ÍLDJ•ÍTDJ–ÍhDJ™Í€DJ˜Í„DJ™͈DJ›ÍDJœÍœDJ›Í DJœͤD$“ÍÐD$”ÍÜD$•ÎD$–Î@D$—ÎDD$–ÎHD$—ÎTD$˜΄D$—ΈD$˜ÎŒD$™ÎÀD$˜ÎÄD$™ÎÈD$œÎÐDJéÎèD$ÎìDJéÎðD$ÎôDJéÎøD$ÎüDJéÏDJêÏDJìÏ(DJíÏ,DJïÏ4DJðÏDDJïÏHDJðÏLD$ÏtD$žÏ D$¡ÏÔD$¨Ð D$©Ð`D$¨ÐdD$©ÐhD$¬РD$©ФD$¬ШD$©ЬD$¬аD$­иD$¬мD$­ÐÀD$®ÐÄD$¯ÐÐD$°ÐèD$±Ñ$D$²ÑdD$sѰD$½ÑÀD$¾ÑÈD$½ÑÌD$¾ÑÐD$¿ÑÔDJéÒD$ÀÒDJéÒ D$ÀÒ$DJéÒ(DJêÒ<DJìÒTDJíÒXDJïÒ`DJðÒpDJïÒtDJðÒxD$ÀÒ D$ÁÒÔD$ÇÓ D$ÈÓPD$ÊÓ€D$ÍÓ„D$ÉÓˆD$ÊÓŒD$ÍÓD$ÏÓàD$ÐÓèD$ÏÓìD$ÐÓðD$ÑÓôD$ÔÔ D$ÕÔ4D$ÙÔpD$ÕÔtD$ÙÔxD$ÚÔˆD$ÛÔœD$ÜÔ°D$âÔ´D$àÔ¸D$ÜÔ¼D$ÝÔÀD$ÞÔÐD$ßÔØD$âÔàD$àÔäD$áÔèD$âÔìD$ãÕD$äÕ0D$éÕ`DJ½ÕdD$åÕhD$æÕlD$éÕpDJ½ÕtD$æÕxDJ½Õ|DJ¾Õ„DJ¿ÕD$éÕ D$êÕ¨D$ëÕÄD$ìÖD$ëÖD$ìÖD$ëÖ D$ìÖD$íÖ D$ñÖ$D$íÖ(D$îÖ0D$ïÖ4D$ðÖ@D$ñÖHD$òÖ\D$óÖD$ôÖÀD$óÖÌD$ôÖÐD$õÖÜD$÷×D$ú×LD$÷×PD$ú×TD$x×dD$Œ×”D$¯×ÄD$Ô×ìD$ÚØD$âØ4D$éØXD$ñØ€D$ôØD$üØÀD%ØÐD%ÙD%ÙPD%ÙD%ÙÀD%ÙÐD% ÚD% Ú0D% Ú`D% ÚD%ÚÀUö$$KÉpV.@$KVB@$KVT@$KVf@$LVw@$MV—@$NV¨@$OV½@$PVÓ@$QVç@$RVö€$S8W@$TW€$U<W!@$VW2€$W@W@€$XDWN@$YW]& $ZºÌWu€W“ÀÉpW”@$WŸÀÌ(W @JèW©ÀÌ(WªàÌ,W«àÌ,W¬@$W·ÀÌ0W¸@JèWÁÀÌ0WÂàÌ4WÃàÌ4WÄ@$WÏÀÌ8WÐ@JèWÙÀÌ8WÚàÌ<WÛàÌ<WÜ@$WçÀÌDWè@JèWñÀÌDWò@JìWûÀÌlWüàÌÀWýàÌÀWþàÌÀWÿ@$“X ÀÍ@X @J”XÀÍ@XàÍDXàÍDX@$“X"ÀÍHX#@J”X,ÀÍHX-àÍLX.àÍLX/@$“X:ÀÍTX;@J”XDÀÍTXE@J˜XNÀÍ€XOàÍÐXPàÍÐXQàÍÐXR@$X]ÀÎèX^@JèXgÀÎèXhàÎìXiàÎìXj@$XuÀÎðXv@JèXÀÎðX€àÎôXàÎôX‚@$XÀÎøXŽ@JèX—ÀÎøX˜àÎüX™àÎüXš@$X¥ÀÏX¦@JèX¯ÀÏX°@JìX¹ÀÏ(XºàÏtX»àÏtX¼àÏtX½@$ÀXÈÀÒXÉ@JèXÒÀÒXÓàÒXÔàÒXÕ@$ÀXàÀÒ Xá@JèXêÀÒ XëàÒ$XìàÒ$Xí@$ÀXøÀÒ(Xù@JèYÀÒ(Y@JìY ÀÒTY àÒ YàÒ YàÒ Y@$éYÀÕdY@J¼Y+ÀÕdY,àÕhY-àÕhY.@$éY:ÀÕtY;@J¼YIÀÕtYJàÕxYKàÕxYL@$éYXÀÕ|YY@J¼YgÀÕ|YhàÕ YiàÕ YjàÚàYk$pNÚàYl¬Ì.ÚàDE“ÚàDE•ÚøDE“ÚüDE•Û DE–ÛDE™Û$DE˜Û(D ?Û,D Û0DE™Û4DE˜Û8D =Û<D ?Û@DE˜Û\DE™Û`D ?ÛdDE™ÛlDEšÛxDE›ÛDEœÛ D <Û¤D 8Û¨D Û¬D 1Û°D 2Û´D 3Û¸D 4Û¼D 5ÛÀD 6ÛÄD 7ÛÈDEœÛÌD <ÛÐD >ÛÔD =ÛØD >ÛÜDEœÛàD <ÛäD ?ÛèD =ÛìDEœÛðD >ÛôD ?ÛøD @ÜD JÜD DÜD @ÜD AÜ$D BÜ4D JÜDD IÜHD JÜLDIÛÜPD IÜTDIÛÜ\DIÜÜ`DIßÜ€D NÜ DIáܰD JÜÜD OÝD PÝ$D QÝTD WÝ`D XÝlD YÝ D \ݨD ]ݼD ^ÝðD aÝüD dÞD gÞ D jÞD kÞ$D lÞ`D rÞdD lÞhD rÞlD ­ÞÈD sÞàD tÞôD ußD vßD wß(D xßdD wßhD xßlD yß D xߤD yߨD z߸DJ§ßðD zßôDJ§ßøDJ¨àDJ¢àD {à0D |à<D }àTDJ§à„D }àˆD ~àŒDJ§àDJ¨à DJ¢à¬D àÄD €á DJ°á8D ‚á<D á@D ‚áDDJ°áHDJ±áTDJ¢á|DJµá˜D ƒá¤D „áÐD ‡áèD „áìD ‡áôD ŠáøD ‹â D Œâ D â4D â8D â<D Žâ@D âLD âPD ‘âTD ’âdD “â|D ”âØD •ã D ”ãD •ãD –ãDD ›ãpD —ãtD ˜ãxD ›ã|D œãŒD ã D žã´D Ÿã¼D  ãÈD ¡ãÌD ¢ãÐD £ä D ¤äTD ­äD ®äÀD ­äÄD ®äÌD ¯åD ®åD ¯å D ²å@DJ½åDD ¯åHD ²åLDJ½åPD ¯åTDJ½åXDJ¾å`DJ¿ålD ²å€D ³åŒD ´å”D ³å˜D ´åœD µåÐD ´åÔD µåØD ¶åÜD ·åèD ¹æ D ºæTD ¹æXD ºæ\D »æŒD Çæ¼D »æÀD ÇæÄD ÈæÌD ÎæØD ÑæÜD ÒæàD ÑæäD ÒæèD ÑæìD ÒæôD ×çD Øç D ßç,D âç@D ãçTD äçhD åç|D æç„D ççD èç”D éç˜D êç¨D ëç¼D ìçÐD íè D îèhD ïè„D ðèœD úè D ðè¤D ñè¨D òè´D óèÀD ôèÌD õèØD öèÜD ÷èàD øèäD ùèèD úèìD ûèüD ýéD ûéD üéD ýé D þé$D ÿéTD þé`D ÿédDé˜DéÌDêDê,Dê0D ê@DêXDêtDêˆDêŒDêDê”Dê Dê¤Dê¨Dê¸DêÐDëDëDDëHDëLDë|Dë¨Dë¬Dë°Dë´D#ëøD$ìDJ½ìD$ìDJ½ì DJ¾ìDJ¿ì$D$ì8D%ìDD&ì`D'ì”D&ì˜D'ìœD(ì¬D)ìÀD*ìÌD+íD,í8D-íhD,ítD-íxD.í|D/í¬D.í°D/í´D8íøD;î D>î$D?î4DBî<DEîLDKî`DLîlDOîtDRî„D5îD[î˜D\îœD]î¨D^î¼D_îÐD`îäDbîèD`îìDaîðDbîüDcïDdïDeï<DfïlDeïpDfïtDgïœDhï Dnï°DJ•ï¼DJ–ïØDJ˜ïèDJ™ïìDJ˜ïðDJ™ïôDJ›ïüDJœðDJ›ð DJœðDnð8DoðDDJÛðHDJÜðPDJßðlDpð”DJáð¬DoðÐDpððDuñDrñ DqñDrñDuñDxñ0Dyñ4Dxñ8Dyñ@D|ñHDJ•ñTDJ–ñpDJ˜ñ€DJ™ñ„DJ˜ñˆDJ™ñŒDJ›ñ”DJœñ DJ›ñ¤DJœñ¨D|ñÐD}ñÜDJÛñàDJÜñèDJßòD~ò8DJáòPD~òxD€òDò”D€ò˜D„òœD…ò¨D†ò¼DˆòÌD‡òÔDˆòàD‰òøDŠó(D‰ó4DŠó8D‹ó<DŒólD‹ópDŒótD–ó´D—ó¼D˜óÔD™óðDšôDœôDšô D›ôDœôDô Džô$DŸô4D ôLD¡ôhD¢ôœD£ôÌD¢ôÐD£ôÔD¤ôüD¥õD®õD©õ0D®õ„D±õ°D²õ´D¶õ¼DÀõÄDÁõÔDËõäDÌõìDãõøDâõüDE“öDÖöDÜöDãö DÙöDßöDÖöDÜöDÙö Dßö$DÖö(DÜö,Dãö0Dåö4Déö<DêöPDñöhD½öxDuöˆDö˜Dö¤DJ½ö¨Dö¬DJ½ö°DJ¾ö¼DJ¿öÈDöÜDöèD÷D÷8D÷<D÷@D÷PD÷dD÷pD ÷¬D ÷àD øD øD ø D ø$D øTD øXD ø\DøŒDø¨DøÄDøØDùDù DùDùLDù€Dù„D.ùˆDùŒD!ù¤D'ù¼D!ùÄD'ùÈD$ùÌD'ùÔD-ùØD.ùÜD/ùðD0úD1ú,D2ú@D3úDD2úHD3úLD4úPD5úhD6úœD7úÌD6úÐD7úÔD8úàD:ûD;ûD.ûDBû,DFû0DMûˆDGû˜DHû¬DMûäDNüDMüDNüDOüPDNüTDOü\DPüDOü”DPüœDQüÐDPüÔDQüÜDRýDQýDRýDSýPDRýTDSý\DTýDSý”DTýœDWýÐDJ½ýÔDTýØDWýÜDJ½ýàDTýäDJ½ýèDJ¾ýðDJ¿ýüDWþDXþDYþ$DXþ(DYþ,DZþXDYþ\DZþ`D[þdD\þpD^þ¨D_þÜD`ÿDhÿHDiÿlDŠÿœDjÿ Dkÿ¤Djÿ¬DŠÿ°Dhÿ¸Doÿ¼DhÿÀDoÿØDhÿÜDoÿøDp(Do,Dp4DqhDplDqtDr¨Dq¬Dr´DsèDrìDsôDt(Ds,Dt4DuhDtlDutDv¨Du¬Dv´DyèDJ½ìDvðDyôDJ½øDvüDJ½DJ¾DJ¿Dy(Dz4D{<Dz@D{DD|pD{tD|xD}|D~ˆD€ÀDôD‚(DŠtDˆDŽÄDðDôDüD”D˜D°pD™€Dš”D›¤Dœ°DìDž D$Dž(DŸTDžXDŸ\D „D¡ˆD ŒD¤D¥¤D¦¸D§ÐD«ÔD§ÜD¨àD©ìDªðD«ôD¬<D°tD± D°¤D±¬D²àD±äD²ìD³ D²$D³,D´`D³dD´lDµ D´¤Dµ¬D¶àDµäD¶ìD· D¶$D·,Dº`D·dDºhD·lDºpD»xD¼€D½ŒD¾ÈD¿üDÀ 0DÊ dDË hDÌ |DÍ œDÎ ¸DÏ ÌDÐ ÐDÏ ÔDÐ ØDÑ ÜDÒ ôDÓ (DÔ XDÓ \DÔ `DÕ lD× ¤DØ ¨DÙ ÄDÚ àDÛ ôDÝ øDß üDÛ DÜ DÝ DÞ Dß Dà 8Dá TDâ hDã pDä tDå ŒDæ ÀDç ðDæ üDç Dè Dé @DË tDð „Dñ ¸Dô ÄDJ½ ÈDô ÌDJ½ ÐDJ¾ ÜDJ¿ èDô üDõ Dö $D÷ TDö XD÷ \Dö `D÷ dDø ˜Dù ÌDú üDþDúDûDþ DÿD Dÿ$D0D<DLDXDDÄD|Dˆ D˜@D `DòDó D7ÔDÔDç,DPD`D DàD D`D DàD D`DpD DÐDD0D `D!D"ÀD#ðD$ DEPDEžXD „˜DE¡ÀY$E“ÚàY´@E“Y¿@E“YÈ@E“YÑ@E•YÚÀÚàYÛ€ |Yî€ LZ€ PZ€ TZ&€ XZ;€ \ZM@ Z^@ Zo@ Zˆ@ ZŸ@ !Zµ@ "ZÊ@ #Zà@ $Zõ@ &[ @ '[!@ *[9@ +[N€ ,[f€ -Œ[~€ .ˆ[’@ /[¡@ 0[°€ 1`[¾€ 2d[Ì€ 3h[Ú€ 4l[è€ 5p[ö€ 6t\€ 7x\€ 8H\ @ 9\0ÀÛ,\1àÛ4\2€ |\E€ L\Y€ P\l€ T\}€ X\’€ \\¤@ \µ@ \Æ@ \ß@ \ö@ !] @ "]!@ #]7@ $]L@ &]d@ ']x@ *]@ +]¥€ ,]½€ -Œ]Õ€ .ˆ]é@ /]ø@ 0^€ 1`^€ 2d^#€ 3h^1€ 4l^?€ 5p^M€ 6t^[€ 7x^i€ 8H^w@ 9^‡ÀÛ<^ˆàÛ\^‰€ |^œ€ L^°€ P^À T^Ô€ X^é€ \^û@ _ @ _@ _6@ _M@ !_c@ "_x@ #_Ž@ $_£@ &_»@ '_Ï@ *_ç@ +_ü€ ,`€ -Œ`,€ .ˆ`@@ /`O@ 0`^€ 1``l€ 2d`z€ 3h`ˆ€ 4l`–€ 5p`¤€ 6t`²€ 7x`À€ 8H`Î@ 9`ÞÀÛd`ßàÛl`à€ |`ó€ La€ Pa€ Ta+€ Xa@€ \aR@ ac@ at@ a@ a¤@ !aº@ "aÏ@ #aå@ $aú@ &b@ 'b&@ *b>@ +bS€ ,bk€ -Œbƒ€ .ˆb—@ /b¦@ 0bµ€ 1`bÀ 2dbÑ€ 3hb߀ 4lbí€ 5pbû€ 6tc € 7xc€ 8Hc%@ 9c5ÀÛ¤c6àÛÌc7€ |cJ€ Lc^€ Pcq€ Tc‚€ Xc—€ \c©@ cº@ cË@ cä@ cû@ !d@ "d&@ #d<@ $dQ@ &di@ 'd}@ *d•@ +dª€ ,d€ -ŒdÚ€ .ˆdî@ /dý@ 0e € 1`e€ 2de(€ 3he6€ 4leD€ 5peR€ 6te`€ 7xen€ 8He|@ 9eŒÀÛÐeàÛàeŽ€ |e¡€ Leµ€ PeÈ€ TeÙ€ Xeî€ \f@ f@ f"@ f;@ fR@ !fh@ "f}@ #f“@ $f¨@ &fÀ@ 'fÔ@ *fì@ +g€ ,g€ -Œg1€ .ˆgE@ /gT@ 0gc€ 1`gq€ 2dg€ 3hg€ 4lg›€ 5pg©€ 6tg·€ 7xgÅ€ 8HgÓ@ 9gãÀÛägäàÛðgå€ |gø€ Lh € Ph€ Th0€ XhE€ \hW@ hh@ hy@ h’@ h©@ !h¿@ "hÔ@ #hê@ $hÿ@ &i@ 'i+@ *iC@ +iX€ ,ip€ -Œiˆ€ .ˆiœ@ /i«@ 0iº€ 1`iÈ€ 2diÖ€ 3hiä€ 4liò€ 5pj€ 6tj€ 7xj€ 8Hj*@ 9j:ÀÛôj;@ JjIÀÜPjJàÜTjK@ JjYÀÜ\jZàÜ j[@ JjiÀܰjjàÜÜjk@J¦jwÀßðjxàßôjy@J¦j…Àßøj†àà0j‡@J¦j“Àà„j”ààˆj•@J¦j¡Ààj¢ààÄj£@J¯ j¯Àá8j°àá<j±@J¯ j½ÀáHj¾àá¤j¿@ ²jËÀåDjÌ@J¼jÚÀåDjÛàåHjÜàåHjÝ@ ²jéÀåPjê@J¼jøÀåPjùàåTjúàåTjû@ ²kÀåXk@J¼kÀåXkàå€kàå€k@$k%Àìk&@J¼k4Àìk5àìk6àìk7@$kCÀì kD@J¼kRÀì kSàì8kTàì8kU@nk`@nkiÀï¼kj@J”ksÀï¼kt@J˜k}Àïèk~àð8kàð8k€àð8k@okÀðHkàð”k‘@okŸÀð¬k àðÐk¡@|kªÀñTk«@J”k´ÀñTkµ@J˜k¾Àñ€k¿àñÐkÀàñÐkÁàñÐkÂ@}kÐÀñàkÑàò8kÒ@}kàÀòPkáàòxkâ@kîÀö¨kï@J¼kýÀö¨kþàö¬kÿàö¬l@l Àö°l @J¼lÀö°làöÜlàöÜl@Wl*ÀýÔl+@J¼l9ÀýÔl:àýØl;àýØl<@WlHÀýàlI@J¼lWÀýàlXàýälYàýälZ@WlfÀýèlg@J¼luÀýèlvàþlwàþlx@yl„Àìl…@J¼l“Àìl”àðl•àðl–@yl¢Àøl£@J¼l±Àøl²àül³àül´@ylÀÀlÁ@J¼lÏÀlÐà(lÑà(lÒ@ôlÞÀ Èlß@J¼líÀ Èlîà Ìlïà Ìlð@ôlüÀ Ðlý@J¼m À Ðm à üm à ümàPm€ |m"€ Lm6€ PmI€ TmZ€ Xmo€ \m@ m’@ m£@ m¼@ mÓ@ !mé@ "mþ@ #n@ $n)@ &nA@ 'nU@ *nm@ +n‚€ ,nš€ -Œn²€ .ˆnÆ@ /nÕ@ 0nä€ 1`nò€ 2do€ 3ho€ 4lo€ 5po*€ 6to8€ 7xoF€ 8HoT@ 9odÀ˜oeàÀofààog$:Nàoh¬è.àDäàDìDèðDäôDDäDDDD D$D(D,D0D4D8D<D@DDDHDLDPDTDXD\D`DädDlDtDxD|D€D„DˆDŒDD”Dî˜DœD D¤D¨D ¬D °D ´D¸D¼DÔD,DdDœD!ÐD"ÔD(ØD!àD"èD#ôD$D%D&$D'4D0DD3PD4dD5D8”D5˜D8œD9DED<DB DED?D<DBDE DF|DG¬DH°DG´DNÀDOÔDNØDOÜDRðDSPDT€DX„DUˆDTDX”DZD[DZ D[D\D_pD` Da¤Dd¨Da¬Dd°D`´Dd¸DeÌDfàDgðDhüDiDjTDk”DlÐDpÔDmÜDpàDlèDpìDJ•üDJ–DJ˜0DJ™4DJ˜8DJ™<DJ›DDJœPDJ›TDJœXDq€DrŒDs¤DtäDsèDtìDv(D|`D}ÀD‚ðD~ôDƒøD~üDD‚DDƒ D†PD‡hDˆ„D‰˜DŠœD‰ DФD‹¨DŒÀDôDŽ0D4DŽ8DHD€D„DˆD£D—”D£˜D— D£¨Dš°D´D ¸D¤¼D£ÀD¤ÄDJ•ÈD¨ÌDJ•ÐDJ–ìD´ DJ™ DJ˜ $DJ™ (DJ› 0DJœ <DJ› @DJœ DD¨ pD¸ ¤D¨ ¨D¸ ¬D© ¸Dª ÌDJ§ üDª!DJ§!DJ¨!DJ¢! D«!8D¬!DD­!\DJ§!ŒD­!D®!”DJ§!˜DJ¨!¨DJ¢!´D¯!ÌD°!ØD±!ðDJ°"$D²"(DJ°",DJ±"8DJ¢"`DJµ"|D´"ŒDÌ"¤D´"¨DÌ"¬DÍ"¸DÌ"¼DÍ"ÀD¸"ÐD¹#D¸#D¹#Dº#@D¹#DDº#HD»#€Dº#„D»#ˆD¾#ÀD»#ÄD¾#ÈD¿#ÌD¾#ÐD¿#ÔDÀ#ØDÁ#äDÎ$4DÐ$HDØ$TDÛ$\Dä$hDå$tDä$xDå$|Dè$€Dñ$ Dò$°Dñ$´Dò$¸Dõ$¼Dö$ðD÷% Dü%$Dø%(Dü%0D÷%4Dü%8Dý%HDþ%xD%|Dÿ%€Dþ%ˆD%ŒDü% D%¨Dü%¬D%ÄDü%ÈD%àD&D&D&D&LD&PD&TD&ˆD&ŒD&D &ÄD&ÈD &ÌD &ÐD &ÔD &ØD &ÜD &èD'8D'pD'D'¤D'ØD(D( D(D($D(8D(lD (œD( D (¤D!(¸D%(ìD"(ðD!(ôD%(øD&)D')(D()<D))pD*) D))¤D*)¨D+)¼D,)ÐD-*D.*4D-*8D.*<D/*TD3*„D/*ŒD0*D3*”D4*¨D5*¼D9*ìD5*ôD6*øD9*üD:+D;+$D<+XD;+\DJ•+pDC+tDJ•+|DJ–+˜DJ™+¬DJ˜+°DJ™+´DJ›+¼DJœ+ÈDJ›+ÌDJœ+ÐDC,D_,<DD,LDE,hDF,œDE, DF,¤DG,´DH,ÈDI,ÜDJ,ðDK-DQ- DU-DO-DK-DL-DM-,DN-<DO-LDP-PDO-TDP-\DQ-dDR-hDS-lDT-pDU-tDV-„DW-ŒDX-DY-ØDZ. D[.@D_.€D`.°D_.´D`.¸Da.ðD`.ôDa.øDb/0Da/4Db/8Dc/pDb/tDc/xDd/°Dc/´Dd/¸Dg/ðDd/ôDg/üDh0Dg0Dh0Di0 Dj0Dk00Dl0DDm0XDn0lDo0€Dp0”Dt0œDz0 Dt0¤Dp0¨Dq0¬Dr0¼Ds0ÌDt0ØDu0ÜDt0àDu0èDv0ðDw0ôDx0øDz0üD{1 D|1DJé1D}1 DJé1(D}1,DJé14DJê1LDJì1dDJí1hDJï1pDJð1€DJï1„DJð1ˆD}1°D~1ðD2$D~2(D2,D€2dD2¤Dƒ2ðDŠ3D‹3dDŒ3°D3àDŒ3äD3ìDŽ4,D4pD‘4xD4|D‘4€D’4ˆD•4ÀD–5DJ§50D–54DJ§5<DJ¨5LDJ¢5XD—5pD˜5 D™5àDJ§6D™6Dš6DJ§6DJ¨6,DJ¢68D›6PDœ6€DJ°6°Dž6´D6¸Dž6¼DJ°6ÀDJ±6ÌDJ¢6ôDJµ7DŸ7D 7@D£7`D 7hD£7pD¤7|D£7€D¤7„D§7ˆD¨7ÐD©8Dª8PD«8TDª8XD«8\D¬8`D­8 D®8ÔD¯9D®9 D¯9D°9PD±9\D²9dD³9pD´9tDµ9°D¶9ðD·:0D¸:pD¹: D¸:¤D¹:¬Dº:ðD»;0D¼;`D»;dD¼;lD½;°D¾;ðD¿< D¾<,D¿<0D¾<4D¿<8DÀ0DJ–>LDJ˜>`DJ™>dDJ˜>hDJ™>lDJ›>tDJœ>€DJ›>„DJœ>ˆDÕ>°DJ•>¼DJ–>ØDJ˜>ðDJ™>ôDJ˜>øDJ™>üDJ›?DJœ?DJ›?DJœ?DÖ?@D×?LDJ•?„DJ–? DJ˜?ÀDJ™?ÄDJ˜?ÈDJ™?ÌDJ›?ÔDJœ?àDJ›?äDJœ?èDØ@DJ•@DJ–@8DJ˜@PDJ™@TDJ˜@XDJ™@\DJ›@dDJœ@pDJ›@tDJœ@xDÙ@ DÚ@¬DÛ@àDÚ@èDÛ@ðDÜADÝA4DÞApDÝAtDÞAxDßAŒDàAÄDJ•AÈDJ–AäDJ˜BDJ™BDJ˜BDJ™B DJ›BDJœB DJ›B$DJœB(DãBPDJ•B\DJ–BxDJ˜BDJ™B”DJ˜B˜DJ™BœDJ›B¤DJœB°DJ›B´DJœB¸DäBàDåBìDJ•C$DJ–C@DJ˜C`DJ™CdDJ˜ChDJ™ClDJ›CtDJœC€DJ›C„DJœCˆDæC°DJ•C¼DJ–CØDJ˜CðDJ™CôDJ˜CøDJ™CüDJ›DDJœDDJ›DDJœDDçD@DèDLDéD€DèDˆDéDDêD DëDÔDìEDëEDìEDíE,DñE`DíEdDîEhDñElDòE|DóE„DòEˆDóEŒDôEDõE DôE¤DõE¨DöE¬D÷E¼DöEÀD÷EÄDøEÈDùEØDøEÜDùEàDJ•EäDJ–FDJ˜FDJ™FDJ˜FDJ™F DJ›F(DJœF4DJ›F8DJœF<DúFdDJ•FpDJ–FŒDJ˜F DJ™F¤DJ˜F¨DJ™F¬DJ›F´DJœFÀDJ›FÄDJœFÈDûFðDüFüDJ•G0DJ–GLDJ˜G`DJ™GdDJ˜GhDJ™GlDJ›GtDJœG€DJ›G„DJœGˆDýG°DJ•G¼DJ–GØDJ˜GìDJ™GðDJ˜GôDJ™GøDJ›HDJœH DJ›HDJœHDþH<DÿHHDHxDÿH€DHˆDH˜DHÌDHüDIDI DIDI4DIdDIhDIlDJ•ItDJ–IDJ˜I¤DJ™I¨DJ˜I¬DJ™I°DJ›I¸DJœIÄDJ›IÈDJœIÌDIôDJ•JDJ–JDJ˜J0DJ™J4DJ˜J8DJ™J<DJ›JDDJœJPDJ›JTDJœJXDJ€D JŒDJ•JÀDJ–JÜDJ˜JðDJ™JôDJ˜JøDJ™JüDJ›KDJœKDJ›KDJœKD K@DJ•KLDJ–KhDJ˜K|DJ™K€DJ˜K„DJ™KˆDJ›KDJœKœDJ›K DJœK¤D KÌD KØD LD LD LDL(DL\DLŒDL˜DLœDL¨DLÀDMDM DMDMDM DM$DJ•M(DJ–MDDJ˜MXDJ™M\DJ˜M`DJ™MdDJ›MlDJœMxDJ›M|DJœM€D"M°DJ•M¼DJ–MØDJ˜MìDJ™MðDJ˜MôDJ™MøDJ›NDJœN DJ›NDJœND#N@D$NLDJ•N„DJ–N DJ˜N´DJ™N¸DJ˜N¼DJ™NÀDJ›NÈDJœNÔDJ›NØDJœNÜD%ODJéOD&O DJéO$DJêO<DJìOTDJíO\DJïOdDJðOtDJïOxDJðO|D&O°D'OàD(PD'PD(PDJ•PTDJ–PpDJ˜P„DJ™PˆDJ˜PŒDJ™PDJ›P˜DJœP¤DJ›P¨DJœP¬D+PàDJ•PìDJ–QDJ˜QDJ™Q DJ˜Q$DJ™Q(DJ›Q0DJœQ<DJ›Q@DJœQDD,QpD-Q|DJ•Q´DJ–QÐDJ˜QäDJ™QèDJ˜QìDJ™QðDJ›QøDJœRDJ›RDJœR D.R@DJéRLD/RPDJéRTDJêRlDJìR„DJíRŒDJïR”DJðR¤DJïR¨DJðR¬D/RàD0SD1S@D0SDDJ•SPDJ–SlDJ˜S€DJ™S„DJ˜SˆDJ™SŒDJ›S”DJœS DJ›S¤DJœS¨D9SÐD‰T DJ•T DJ–T<DJ˜TPDJ™TTDJ˜TXDJ™T\DJ›TdDJœTpDJ›TtDJœTxD:T D;T¬D<TäDJ•TèDJ–UDJ˜UDJ™UDJ˜U DJ™U$DJ›U,DJœU8DJ›U<DJœU@D<UpD=U|D>U¸D?UðD@UôDJ•UøDJ–VDJ˜V(DJ™V,DJ˜V0DJ™V4DJ›V<DJœVHDJ›VLDJœVPDCV€DJ•VŒDJ–V¨DJ˜V¼DJ™VÀDJ˜VÄDJ™VÈDJ›VÐDJœVÜDJ›VàDJœVäDDWDJ•WDJ–W8DJ˜WLDJ™WPDJ˜WTDJ™WXDJ›W`DJœWlDJ›WpDJœWtDEW DFW¬DGWàDFWìDGWðDFWôDGWøDHXDIXDHX DIXDJXTDKXDJX”DKX˜DJ•X DJ–X¼DJ˜XÐDJ™XÔDJ˜XØDJ™XÜDJ›XäDJœXðDJ›XôDJœXøDLY DJ•Y,DJ–YHDJ˜Y\DJ™Y`DJ˜YdDJ™YhDJ›YpDJœY|DJ›Y€DJœY„DMY¬DJ•Y¸DJ–YÔDJ˜YèDJ™YìDJ˜YðDJ™YôDJ›YüDJœZDJ›Z DJœZDNZ8DOZDDPZtDOZ€DPZˆDQZ”DRZ˜DQZœDRZ¨DSZØDU[DS[ DU[DJ•[DJ–[4DJ˜[HDJ™[LDJ˜[PDJ™[TDJ›[\DJœ[hDJ›[lDJœ[pDV[˜DJ•[¤DJ–[ÀDJ˜[ÔDJ™[ØDJ˜[ÜDJ™[àDJ›[èDJœ[ôDJ›[øDJœ[üDW\$DJ•\0DJ–\LDJ˜\`DJ™\dDJ˜\hDJ™\lDJ›\tDJœ\€DJ›\„DJœ\ˆDX\°DY\¼DJ•\ðDJ–] DJ˜] DJ™]$DJ˜](DJ™],DJ›]4DJœ]@DJ›]DDJœ]HDZ]pDJ•]|DJ–]˜DJ˜]¬DJ™]°DJ˜]´DJ™]¸DJ›]ÀDJœ]ÌDJ›]ÐDJœ]ÔD[]üDJ•^DJ–^$DJ˜^8DJ™^<DJ˜^@DJ™^DDJ›^LDJœ^XDJ›^\DJœ^`D\^ˆD]^”D^^ÈD]^ÌD^^ÐD_^àD`^èDa^ôDb_Df_ Dc_Dd_De_DJ•_DJ–_8DJ˜_LDJ™_PDJ˜_TDJ™_XDJ›_`DJœ_lDJ›_pDJœ_tDg_œDJ•_¨DJ–_ÄDJ˜_ØDJ™_ÜDJ˜_àDJ™_äDJ›_ìDJœ_øDJ›_üDJœ`Dh`(Di`4Dj`hDJé`pDJê`ŒDJì`¤DJí`¬DJï`´DJð`ÄDJï`ÈDJð`ÌDj`ôDka DlaTDkaXDla\DJ•aDJ–a¬DJ˜aÀDJ™aÄDJ˜aÈDJ™aÌDJ›aÔDJœaàDJ›aäDJœaèDpbDJ•bDJ–b8DJ˜bLDJ™bPDJ˜bTDJ™bXDJ›b`DJœblDJ›bpDJœbtDqbœDrb¨DsbØDrbàDsbäDrbèDsbìDtbüDJ•c0DJ–cLDJ˜c`DJ™cdDJ˜chDJ™clDJ›ctDJœc€DJ›c„DJœcˆDuc°Dvc¼DwcØDxd DwdDxdDyd(D{d,Dyd0Dzd4D{d8D|dLD}d|D|d€D}d„D~d”DdœD€d Dd¸D‚dìDƒe D‰eXDŠe„D‰eˆDŠeŒD‹eÀDŠeÄD‹eÈDŒeüD‹fDŒfDf8DŒf<Df@DŽftDfxDŽf|Df°DŽf´Df¸D’fìDfðD’fôD“gD’gD“gD”g D•gDJ•g0DJ–gLDJ˜g`DJ™gdDJ˜ghDJ™glDJ›gtDJœg€DJ›g„DJœgˆD–g°DJ•g¼DJ–gØDJ˜gìDJ™gðDJ˜gôDJ™gøDJ›hDJœh DJ›hDJœhD—h<D˜hHDJ•h|DJ–h˜DJ˜h¬DJ™h°DJ˜h´DJ™h¸DJ›hÀDJœhÌDJ›hÐDJœhÔD™hüDJ•iDJ–i$DJ˜i8DJ™i<DJ˜i@DJ™iDDJ›iLDJœiXDJ›i\DJœi`DšiˆD›i”DœiÄD›iÌDœiÐD›iÔDœiØDiäDžièDiìDžiøDŸj(D jXDŸj\D j`DJ•jhDJ–j„DJ˜j˜DJ™jœDJ˜j DJ™j¤DJ›j¬DJœj¸DJ›j¼DJœjÀD¡jèDJ•jôDJ–kDJ˜k$DJ™k(DJ˜k,DJ™k0DJ›k8DJœkDDJ›kHDJœkLD¢ktD£k€DJ•k´DJ–kÐDJ˜käDJ™kèDJ˜kìDJ™kðDJ›køDJœlDJ›lDJœl D¤l4DJ•l@DJ–l\DJ˜lpDJ™ltDJ˜lxDJ™l|DJ›l„DJœlDJ›l”DJœl˜D¥lÀD¦lÌD§lüD¦mD§mD¦m D§mD¨mD©m D¨m$D©m0Dªm`D¬mDªm”D¬m˜DJ•m DJ–m¼DJ˜mÐDJ™mÔDJ˜mØDJ™mÜDJ›mäDJœmðDJ›môDJœmøD­n DJ•n,DJ–nHDJ˜n\DJ™n`DJ˜ndDJ™nhDJ›npDJœn|DJ›n€DJœn„D®n¬D¯n¸DJ•nìDJ–oDJ˜oDJ™o DJ˜o$DJ™o(DJ›o0DJœo<DJ›o@DJœoDD°olDJ•oxDJ–o”DJ˜o¨DJ™o¬DJ˜o°DJ™o´DJ›o¼DJœoÈDJ›oÌDJœoÐD±oøD²pDJ•p8DJ–pTDJ˜phDJ™plDJ˜ppDJ™ptDJ›p|DJœpˆDJ›pŒDJœpD³p¸DJ•pÄDJ–pàDJ˜pôDJ™pøDJ˜püDJ™qDJ›qDJœqDJ›qDJœqD´qDDµqPDJ•q„DJ–q DJ˜q´DJ™q¸DJ˜q¼DJ™qÀDJ›qÈDJœqÔDJ›qØDJœqÜD¶rDJ•rDJ–r,DJ˜r@DJ™rDDJ˜rHDJ™rLDJ›rTDJœr`DJ›rdDJœrhD·rD¸rœD¹rÐD¸rÔD¹rØDºrìDÂrðDºrôD»røD¼sD½sD¾sD¿s DÀs$DÁs(DÂs,DÃs<DÄsHDJ•sLDJ–shDJ˜s|DJ™s€DJ˜s„DJ™sˆDJ›sDJœsœDJ›s DJœs¤DÅsÌDJésØDÆsÜDJésàDJêsøDJìtDJítDJït DJðt0DJït4DJðt8DÆt`DÇtDÈtÄDÇtÈDÈtÌDJ•uDJ–uDJ˜u0DJ™u4DJ˜u8DJ™u<DJ›uDDJœuPDJ›uTDJœuXDÌu€DÍuŒDÎu¨DÏuÜDÎuàDÏuäDÐuøDÒuüDÐvDÑvDÒv DÓv$DJ•vXDJ–vtDJ˜vˆDJ™vŒDJ˜vDJ™v”DJ›vœDJœv¨DJ›v¬DJœv°DÔvØDÕväDÖwD×w4DÖw8D×w<DØwPDÚwTDØwXDÙw\DÚw`DÛwtDÜw¤DÛw¨DÜw¬DÝw¼DÞwÈDàwØDßwÜDJ•wàDJ–wüDJ˜xDJ™xDJ˜xDJ™xDJ›x$DJœx0DJ›x4DJœx8Dáx`DJéxlDâxpDJéxtDJêxŒDJìx¤DJíx¬DJïx´DJðxÄDJïxÈDJðxÌDâxôDãy DäyTDãyXDäy\DçyŒDèyÀDçyÄDèyÈDéyøDòz4Dóz@DòzDDózHDJ•zLDJ–zhDJ˜z|DJ™z€DJ˜z„DJ™zˆDJ›zDJœzœDJ›z DJœz¤DözÐDJ•zÜDJ–zøDJ˜{ DJ™{DJ˜{DJ™{DJ›{ DJœ{,DJ›{0DJœ{4D÷{`Dø{lDJ•{¤DJ–{ÀDJ˜{ÔDJ™{ØDJ˜{ÜDJ™{àDJ›{èDJœ{ôDJ›{øDJœ{üDù|0DJé|<Dú|@DJé|DDJê|\DJì|tDJí||DJï|„DJð|”DJï|˜DJð|œDú|ÐDû}Dü}4Dû}8Dü}<DJ•}tDJ–}DJ˜}¤DJ™}¨DJ˜}¬DJ™}°DJ›}¸DJœ}ÄDJ›}ÈDJœ}ÌDÿ~DJ•~ DJ–~(DJ˜~<DJ™~@DJ˜~DDJ™~HDJ›~PDJœ~\DJ›~`DJœ~dD~D~œDJ•~ÔDJ–~ðDJ˜DJ™DJ˜ DJ™DJ›DJœ$DJ›(DJœ,D`DJélDpDJétDJêŒDJì¤DJí¬DJï´DJðÄDJïÈDJðÌD€D€0D€dD€hD€lDÒ€¤D €´D€ðD4D8D<D@DDD€D°D´D¸DJ•¼DJ–ØDJ˜ðDJ™ôDJ˜øDJ™üDJ›‚DJœ‚DJ›‚DJœ‚D‚@D‚LD‚ D‚ÐD‚ÜD‚àD‚äD‚èD‚ìDJé‚ðDJêƒ DJìƒ$DJíƒ,DJïƒ4DJðƒDDJïƒHDJðƒLDƒ€D&ƒÀD'„D&„D'„ D(„@D'„DD(„LD)„€D(„„D)„ŒD*„ÀD)„ÄD*„ÌD+…D*…D+… D,…@D+…DD,…LD/…€D,…„D/…ˆD,…ŒD/…D0…˜D/…œD0… D1…¤D2…°D3…ÈD4†D5†DD;†ŒD>†ÈDA†ôDB‡HDC‡LDD‡ DE‡¤DF‡ôDG‡øDKˆHDLˆTDMˆœDNˆÜDOˆìDPˆøDQ‰@DR‰tDQ‰xDR‰|DS‰¬DY‰àDdŠDeŠHDhŠŒDpŠÐDq‹Dr‹TD†‹œD‡‹ÔDˆŒ D‹ŒDDŽŒxDõŒ´D ŒìDD<DtD¬D àD%ŽD&ŽTD'ŽŒD*ŽÄD+ŽüD.0D3lD4¬D9äD:$Dh\DjpDk¬DläDm‘Dn‘PDo‘€Dz‘´DÕ‘ìDÖ’DØ’4DÙ’XDÛ’|DÞ’ Dã’ÄDä’èDæ“ Dç“0Dé“TDì“xDñ“œDú“ÀDû“äDý”Dþ”,D”PD”tD”˜D”¼D ”àD •D •(D•LD"•pD#•”D%•¸D+•ÜD,–D.–$DC–HDD–lDE–DG–´DL–ØDM–üDN— DP—DDV—hDW—ŒDX—°DZ—ÔD[—øD\˜D^˜@Dg˜dDh˜ˆDp˜°Dq˜ÔDs˜øDu™Dv™@Dx™dD{™ˆD}™¬D€™ÐD•™ôD–šD—š<D™š`Dšš„Dœš¨D¡šÌD¢šðD¤›D¥›8D§›\D­›€D®›¤D°›ÈD±›ìD³œD´œ4D¶œXD·œ|D¹œ DœÄDÅœèDÌDÍ4DÏXDÒ|DÔ DÕÄD×èDÚž DÜž0DážTDöžxD÷žœDùžÀDÿžäDŸDŸ,D2ŸPD[ŸxD`ŸDaŸÐDb Dc PDd De ÐDf¡Dg¡@Dh¡€Di¡ÀDl¡ÐDm¢Dn¢@Do¢pDp¢ Dq¢ÐDr£Ds£0Dt£`Du£Dv£ÀDw£ðDx¤ Dy¤PDz¤€D{¤°D|¤àD}¥D~¥PD ¥ DÒ¥¼D€¥Ðo~$äào¿@äoÓ äLoå äPo÷€å¤p €æ\p$€ç`p<€èdpU€éhpn€êlp†€ëppœ€ìtp³€íxpÌ€î|pá@ïpò@ðq@ñq@òq'@óq=@ôqX@õqq@öq†@÷q™@øq²@ùqÉ@úqÝ€û¸qö€ü´r€ý°r€þ¬r3€ÿ¨rH@rY@rq@r‚@r‘€€rŸ€„r­€ˆr»€ŒrÉ€r×€ ”rå€ ˜ró€ œs@ s€  s@s1€Xs@&¬èsX€svÀàsw@J”s€Àüs@J˜sŠÀ0s‹à€sŒà€s@¨s˜ÀÈs™@J”s¢ÀÈs£àÌs¤àÌs¥@¨s°ÀÐs±@J”sºÀÐs»à s¼à s½@¨sÈÀ sÉ@J”sÒÀ sÓ@J˜sÜÀ sÝà psÞà psßà psà@J¦sìÀ üsíà!sî@J¦súÀ!sûà!8sü@J¦tÀ!Œt à!t @J¦tÀ!˜tà!Ìt@J¯ t$À"$t%à"(t&@J¯ t2À",t3à"Œt4@Ct?À+pt@@J”tIÀ+ptJà+ttKà+ttL@CtWÀ+|tX@J”taÀ+|tb@J˜tkÀ+¬tlà,tmà,tnà,to@}tx@}tƒÀ1t„@JètÀ1tŽà1 tà1 t@}t™@}t¤À1(t¥@Jèt®À1(t¯à1,t°à1,t±@}tº@}tÅÀ14tÆ@JètÏÀ14tÐ@JìtÙÀ1dtÚà1°tÛà1°tÜà1°tÝ@J¦téÀ50têà54të@J¦t÷À5<tøà5ptù@J¦uÀ6uà6u@J¦uÀ6uà6Pu@J¯ u!À6°u"à6´u#@J¯ u/À6Àu0à7u1@J”u:À>0u;@J˜uDÀ>`uEà>°uFà>°uG@J”uPÀ>¼uQ@J˜uZÀ>ðu[à?@u\à?@u]@J”ufÀ?„ug@J˜upÀ?Àuqà@urà@us@J”u|À@u}@J˜u†À@Pu‡à@ uˆà@ u‰@J”u’ÀAÈu“@J˜uœÀBuàBPužàBPuŸ@J”u¨ÀB\u©@J˜u²ÀBu³àBàu´àBàuµ@J”u¾ÀC$u¿@J˜uÈÀC`uÉàC°uÊàC°uË@J”uÔÀC¼uÕ@J˜uÞÀCðußàD@uààD@uá@J”uêÀEäuë@J˜uôÀFuõàFduöàFdu÷@J”vÀFpv@J˜v ÀF v àFðv àFðv @J”vÀG0v@J˜v ÀG`v!àG°v"àG°v#@J”v,ÀG¼v-@J˜v6ÀGìv7àH<v8àH<v9@J”vBÀItvC@J˜vLÀI¤vMàIôvNàIôvO@J”vXÀJvY@J˜vbÀJ0vcàJ€vdàJ€ve@J”vnÀJÀvo@J˜vxÀJðvyàK@vzàK@v{@J”v„ÀKLv…@J˜vŽÀK|vàKÌvàKÌv‘@J”všÀM(v›@J˜v¤ÀMXv¥àM°v¦àM°v§@J”v°ÀM¼v±@J˜vºÀMìv»àN@v¼àN@v½@J”vÆÀN„vÇ@J˜vÐÀN´vÑàOvÒàOvÓ@&vÜÀOvÝ@JèvæÀOvçàO vèàO vé@&vòÀO$vó@JèvüÀO$vý@JìwÀOTwàO°wàO°w àO°w @J”wÀPTw@J˜wÀP„wàPàwàPàw @J”w)ÀPìw*@J˜w3ÀQw4àQpw5àQpw6@J”w?ÀQ´w@@J˜wIÀQäwJàR@wKàR@wL@/wUÀRLwV@Jèw_ÀRLw`àRPwaàRPwb@/wkÀRTwl@JèwuÀRTwv@JìwÀR„w€àRàwàRàw‚àRàwƒ@J”wŒÀSPw@J˜w–ÀS€w—àSÐw˜àSÐw™@J”w¢ÀT w£@J˜w¬ÀTPw­àT w®àT w¯@<w¸ÀTèw¹@J”wÂÀTèwÃ@J˜wÌÀUwÍàUpwÎàUpwÏàUpwÐ@J”wÙÀUøwÚ@J˜wãÀV(wäàV€wåàV€wæ@J”wïÀVŒwð@J˜wùÀV¼wúàWwûàWwü@J”xÀWx@J˜xÀWLxàW xàW x@J”xÀX x@J˜x%ÀXÐx&àY x'àY x(@J”x1ÀY,x2@J˜x;ÀY\x<àY¬x=àY¬x>@J”xGÀY¸xH@J˜xQÀYèxRàZ8xSàZ8xT@J”x]À[x^@J˜xgÀ[Hxhà[˜xià[˜xj@J”xsÀ[¤xt@J˜x}À[Ôx~à\$xà\$x€@J”x‰À\0xŠ@J˜x“À\`x”à\°x•à\°x–@J”xŸÀ\ðx @J˜x©À] xªà]px«à]px¬@J”xµÀ]|x¶@J˜x¿À]¬xÀà]üxÁà]üxÂ@J”xËÀ^xÌ@J˜xÕÀ^8xÖà^ˆx×à^ˆxØ@J”xáÀ_xâ@J˜xëÀ_Lxìà_œxíà_œxî@J”x÷À_¨xø@J˜yÀ_Øyà`(yà`(y@jy @jyÀ`py@Jèy À`py!@Jìy*À`¤y+à`ôy,à`ôy-à`ôy.@J”y7Àay8@J˜yAÀaÀyBàbyCàbyD@J”yMÀbyN@J˜yWÀbLyXàbœyYàbœyZ@J”ycÀc0yd@J˜ymÀc`ynàc°yoàc°yp@J”yyÀg0yz@J˜yƒÀg`y„àg°y…àg°y†@J”yÀg¼y@J˜y™Àgìyšàh<y›àh<yœ@J”y¥Àh|y¦@J˜y¯Àh¬y°àhüy±àhüy²@J”y»Àiy¼@J˜yÅÀi8yÆàiˆyÇàiˆyÈ@J”yÑÀjhyÒ@J˜yÛÀj˜yÜàjèyÝàjèyÞ@J”yçÀjôyè@J˜yñÀk$yòàktyóàktyô@J”yýÀk´yþ@J˜zÀkäzàl4z àl4z @J”zÀl@z@J˜zÀlpzàlÀzàlÀz @J”z)Àm z*@J˜z3ÀmÐz4àn z5àn z6@J”z?Àn,z@@J˜zIÀn\zJàn¬zKàn¬zL@J”zUÀnìzV@J˜z_Àoz`àolzaàolzb@J”zkÀoxzl@J˜zuÀo¨zvàoøzwàoøzx@J”zÀp8z‚@J˜z‹ÀphzŒàp¸zàp¸zŽ@J”z—ÀpÄz˜@J˜z¡Àpôz¢àqDz£àqDz¤@J”z­Àq„z®@J˜z·Àq´z¸àrz¹àrzº@J”zÃÀrzÄ@J˜zÍÀr@zÎàrzÏàrzÐ@J”zÙÀsLzÚ@J˜zãÀs|zäàsÌzåàsÌzæ@ÆzïÀsØzð@JèzùÀsØzúàsÜzûàsÜzü@Æ{Àsà{@Jè{Àsà{@Jì{Àt{àt`{àt`{àt`{@J”{&Àu{'@J˜{0Àu0{1àu€{2àu€{3@J”{<ÀvX{=@J˜{FÀvˆ{GàvØ{HàvØ{I@J”{RÀwà{S@J˜{\Àx{]àx`{^àx`{_@â{hÀxl{i@Jè{rÀxl{sàxp{tàxp{u@â{~Àxt{@Jè{ˆÀxt{‰@Jì{’Àx¤{“àxô{”àxô{•àxô{–@J”{ŸÀzL{ @J˜{©Àz|{ªàzÐ{«àzÐ{¬@J”{µÀzÜ{¶@J˜{¿À{ {Àà{`{Áà{`{Â@J”{ËÀ{¤{Ì@J˜{ÕÀ{Ô{Öà|0{×à|0{Ø@ú{áÀ|<{â@Jè{ëÀ|<{ìà|@{íà|@{î@ú{÷À|D{ø@Jè|À|D|@Jì| À|t| à|Ð| à|Ð|à|Ð|@J”|À}t|@J˜|"À}¤|#à~|$à~|%@J”|.À~ |/@J˜|8À~<|9à~|:à~|;@J”|DÀ~Ô|E@J˜|NÀ|Oà`|Pà`|Q@|ZÀl|[@Jè|dÀl|eàp|fàp|g@|pÀt|q@Jè|zÀt|{@Jì|„À¤|…à€|†à€|‡à€|ˆ@J”|‘À¼|’@J˜|›Àð|œà‚@|à‚@|ž@Jè|§À‚ð|¨@Jì|±Àƒ$|²àƒ€|³àƒ€|´à¥ð|µ$‘N¥ð|¶­.¥ðDƒ¥ðD™¥üDƒ¦D™¦Dƒ¦D™¦D„¦Dƒ¦D™¦$D–¦(D—¦,D˜¦0D–¦4D™¦8D—¦<D˜¦@Dƒ¦DD™¦LD‰¦TD–¦XD—¦\D˜¦`D„¦dD…¦hD™¦lDš¦€D›¦¸Dœ¦ðD§(D §`D¡§dD¨§hD §pD¡§xD¢§„D£§”D¤§¤D¥§´D«§ÄD¨§ÈD«§ÌD¨§ÐD«§ÔD¨§ÜD¬§àD«§äD¬§ìD­§ðDJ•§ôDJ–¨DJ˜¨0DJ™¨8DJ›¨@DJœ¨LDJ›¨PDJœ¨TD­¨€D®¨°DJ•¨´DJ–¨ÐDJ˜¨äDJ™¨ìDJ›©DJœ© DJ›©DJœ©D®©@DP©œD¯©ÀD°ª0D±ª`D²ªD³ªðD´ªüD¶«@D¿«HDÀ«\D¿«`DÀ«hDÁ«lDJ•«pDJ–«ŒDJ˜« DJ™«¨DJ›«°DJœ«¼DJ›«ÀDJœ«ÄDÁ«ìD¬4DJ•¬8DJ–¬TDJ˜¬hDJ™¬pDJ›¬„DJœ¬DJ›¬”DJœ¬˜D¬ÀDíDÄ­hDÅ­”DÆ­ÀDÇ®(DÈ®@DÊ®€DË®DÓ®´DÔ®ÈDÓ®ÌDÔ®ÐD×®ÔDJ½®ØD×®ÜDJ½®àDJ¾®ìDJ¿®ôD×®üDJ¿¯DׯDJ¿¯ DׯDد@DÙ¯˜DÚ¯ÄDJ½¯ÈDJ¾¯ÔDJ¿¯äDÚ¯ôDJ¿¯üDÚ°DP°$DÛ°<Dܰ„Dݰ°DJ•°´DJ–°ÐDJ˜°äDJ™°ìDJ›±DJœ± DJ›±DJœ±Dݱ<DÞ±„DJ•±ˆDJ–±¤DJ˜±¸DJ™±ÀDJ›±ÔDJœ±àDJ›±äDJœ±èDÞ²Dß²LDಈD沌DಔDá² DⲤD㲨DᲬDæ²°Dç²ôDè³ Dé³LDJ½³PDJ¾³\DJ¿³lDé³tDJ¿³xD鳄Dê³Dë³ÐDì³üDJ•´DJ–´DJ˜´0DJ™´8DJ›´LDJœ´XDJ›´\DJœ´`Dì´ˆDí´¼DJ•´ÀDJ–´ÜDJ˜´ðDJ™´øDJ›µ DJœµDJ›µDJœµ DíµHDîµtDïµ¼DõµÀDïµÈDðµÔDñµØDòµÜDðµàDõµäDö¶4D÷¶`Dø¶ŒDJ•¶DJ–¶¬DJ˜¶ÀDJ™¶ÈDJ›¶àDJœ¶ìDJ›¶ðDJœ¶ôDø·Dù·LDú·hD·lDú·tDü·|Dý·€Dþ·„Dû·ˆD·ŒD·ìD¸D¸DD ¸tD ¸ÀD ¹D ¹0D¹HD¹dD¹˜D¹èDºDº@DºlDºœDº¨Dº¬Dº°Dº´D#ºÔDJ•»DJ–»8DJ˜»LDJ™»TDJ›»hDJœ»tDJ›»xDJœ»|D$»¤DJ•»èDJ–¼DJ˜¼DJ™¼ DJ›¼4DJœ¼@DJ›¼DDJœ¼HD%¼pD&¼´DJ•¼¸DJ–¼ÔDJ˜¼èDJ™¼ðDJ›½DJœ½DJ›½DJœ½D&½@D'½tD(½¨D)½¬D.½°D*½¸D.½¼D/¾D0¾@D1¾lD6¾˜D7¾ÜD9¾àD7¾ìD8¾ôD9¾øD:¿4D;¿`D<¿ŒD>¿D<¿˜D=¿ D>¿¨D?¿ôD@À DHÀ€DGÀŒDHÀœDPÀ¤DQÀÀDRÁDSÁ@DTÁ€DUÁ°DVÁàDYÁðDZÂ0D[Â`D\ÂD]ÂÀD^ÂðD_à D`ÃPDaÀDbðDcÃàDdÄ DfÄp|Ì$ƒ¥ð}@ƒ}# ƒÌ}5 ƒÐ}G€„T}Y€…L}i€†P}„€‡H}Ÿ€ˆX}º€‰\}Ï€Šl}個h}õ@Œ~@~"€Ž`~0@~?@~N@‘~]@’~l@“~{@”~Š&•­~¢€~ÀÀ¥ð~Á@­~ÊÀ§ô~Ë@J˜~ÔÀ¨0~Õ਀~Ö਀~×@®~àÀ¨´~á@J˜~êÀ¨ä~ëà©@~ìà©@~í@Á~öÀ«p~÷@J˜À« à«ìà«ì@ À¬8 @J˜À¬hà¬Àà¬À@×%À®Ø&à®Ü'@×3À®à4à®ü5@×AÀ¯Bà¯C@×OÀ¯ Pà¯Q@Ú]À¯È^à¯ô_@ÚkÀ¯ülà°m@ÝvÀ°´w@J˜€À°äà±<‚à±<ƒ@ÞŒÀ±ˆ@J˜–À±¸—ಘಙ@é¥À³P¦à³t§@é³À³x´à³„µ@ì¾À´¿@J˜ÈÀ´0Éà´ˆÊà´ˆË@íÔÀ´ÀÕ@J˜ÞÀ´ðßàµHààµHá@øêÀ¶ë@J˜ôÀ¶Àõà·öà·÷@J˜€À»L€à»¤€@J˜€ À¼€ à¼p€ @&€À¼¸€@J˜€ À¼è€!à½@€"à½@€#àĘ€$$¨NĘ€%­(.Ä DiÄ D‚ĨDiĬD‚Ä´DiĸD‚ÄÀDjÄÄDiÄÈD‚ÄÌD€ÄÐDÄÔD€ÄØD‚ÄÜDÄàDiÄäD‚ÄìD}ÄôD€ÄøDÄüDjÅDmÅDzÅD{Å D‚ÅDƒÅ$D„ÅPD…ňD†ÅÀD‰ÅðDŠÅôDÅøD–ÅüDÆD‰ÆDŠÆD‹ÆDŒÆ,D“Æ<D–Æ@D“ÆDD–ÆLD—Æ DÆÐDžÆÜDŸÇ0D Ç`D§ÇpD¨Ç„D¬ǰD©Ç´D­ǸD¬ǼD©ÇÀD¬ÇÄD­ÇÌD±ÈD®ÈD±È DËÈ DÔÈDDèÈhD È€D²ȰD5ÉD³É D´ÉPDµɘD·ÉàD¸ÉèD·ÉìD¸ÉðD¹ÉôD¼ÊD½Ê DJ§ÊPD½ÊTDJ§Ê\DJ¨ÊlDJ¢ÊxD¾ÊD¿ÊœDJ§ÊÐDÁÊÔDÀÊØDÁÊÜDJ§ÊàDJ¨ÊðDJ¢ÊüDÂË DÃË,DJ°Ë`DÅËdDÄËhDÅËlDJ°ËpDJ±Ë|DJ¢ˤDJµËÀDÆËÌDÇËðDÊÌDÇÌDÊÌDËÌ0DÌÌdDÒÌDÍÌ”DÎ̘DÒÌœDÓ̤DÔÌÀDÕÌØDØÍDÕÍDØÍDÚÍDÛÍ4DÜÍdDÝÍhDÜÍlDþÍpDÚÍDáÍ”DÚ͘DáͨDÚͬDá͸DâÍèDáÍìDâÍôDåÎ(DâÎ,DåÎ0DâÎ4DåÎ8DæÎ@DçÎHDèÎTDëÎlDþΘDJ•ÎÐDJ–ÎìDJ˜ÏDJ™ÏDJ˜ÏDJ™Ï DJ›ÏDJœÏ DJ›Ï$DJœÏ(DÏPDÏ\DÏpDÏtDÏxDÏ€DψDÏ”DϘD ϨD ÏÀD ÏÔD ÏðD Ð$DÐdDÐDДDИDМDJéФDJêÐÀDJìÐàDJíÐèDJïÐðDJðÑDJïÑDJðÑDÑ0DÑ`DÿÑdD$ÑpD%Ñ€D)ÑÀD*ÑÈD0ÒD2Ò4D5ÒPD6ÒpD7Ò°D8ÒðD9Ó0D<Ó@D=Ó€D>Ó°D?ÓàD@ÔDAÔ@DBÔpDCÔ DDÔÐDEÕDFÕ0DGÕ`DHÕDIÕÐDÇÖ DÿÖ@DKÖP€;$iÄ €‚@i€– i¼€¨ iÀ€º€jD€Õ€k<€ð€l@€m8@n.@o?@pS@qh@r…@s@t®@uÁ@vØ@wç@xö€zH‚€{L‚€}P‚ @~‚1&­(‚I€‚gÀÄ ‚h@J¦‚tÀÊP‚uàÊT‚v@J¦‚‚ÀÊ\‚ƒàÊ‚„@J¦‚ÀÊЂ‘àÊÔ‚’@J¦‚žÀÊà‚ŸàË ‚ @J¯ ‚¬ÀË`‚­àËd‚®@J¯ ‚ºÀËp‚»àËÌ‚¼@J”‚ÅÀÎЂÆ@J˜‚ÏÀÏ‚ÐàÏP‚ÑàÏP‚Ò@Jè‚ÛÀФ‚Ü@Jì‚åÀÐà‚æàÑ0‚çàÑ0‚èàÖh‚é$ÈNÖh‚ê­8.ÖpDOÖpD„ÖˆDOÖŒD„Ö”DPÖ˜DOÖœD„Ö D~Ö¨DÖ¬D€Ö°DÖ´D‚Ö¸DƒÖ¼D~ÖÀDÖÄD€ÖÈDÖÌD„ÖÐD‚ÖÔDƒÖØDOÖÜD„ÖäDvÖìD~ÖðDÖôD€ÖøDÖüD‚×Dƒ×DP×DW× Dt×Du×D„×D…×0D†×xD‡×°Dˆ×èD‹Ø DŒØ$D“Ø(D‹Ø0DŒØ8DØDDŽØTDØdDØtD‘Ø„D’Ø”D¡ؤD¤ذD¥ØÄD©ØðD¦ØôD©ØøD¦ÙDªÙD©Ù DªÙD«ÙD¬Ù D­Ù°D®Ù¼D¯ÙìD¶ÙðD·ÚD¼ÚÀD½Û`DÂÛDÎÜ`DãÜÀDçÝ DëÝ„DôÝØDõÞ,DøÞ€DûÞØDß$D4ß„D5ߨD6à0D7àxDDà´DGáDMáXDNáœDOáèDPâ8D]âtD`â¸DsãDtãXD}ã¬D‚ä DƒähD„äÐD…å8D†å D‡æDˆæpD‰æÜDŒç<D™çœDšçðD²èDD³è¨D¶èüD½éXD¾éÀDÁê(DÍêDÐëD×ëtDØëàDÛìHDßì¼DãíDæílDçíàDôîTDúîÐDûï0Dï¤DðDðlDðÐDñ0D ñ°DòDòxDòÔD$ó0D%ó”D&óìD(ôDD)ô”D*ôäD1õ4D4õˆD5õØD7ö(D8öxD9öÈD@÷DC÷XDJ÷°DMøD_ø`D`ø¼Ddù0DeùDfúDoú\DqúÔDJ¿û@DrûHDJ¿ûPDrûTDJ¿ûdDrûtDsû¸DuüDvühD}ü¸D€ýDƒýpD–ýÐD—þ4Dšþ”DžÿD¢ÿ\D¥ÿ¬D¦D¶D·ðD½dD¾ÈDÀ,DÁDÄðDÉpDäÐDæHDç¨DèDïXDú¸DJ¿Dû$DJ¿,Dû0DJ¿DDûPDüDþäDÿ@D”DàDJ¿4D <DJ¿DD HDJ¿XD hD ¨D üD PD ˜D ØD $D  xD# ÌD7 (DA ”DB ðDG \DL ÔDQ LDT ÈDU$D]Db DJ¿xDc€DJ¿ˆDcŒDJ¿œDc¬DdðDfHDg DnøDqPDt¨DzDÂpDÄ|DňDƘDÉDÎ,DÏ<D×hDÙˆDÚDÙ”DÚ˜DפDÛôDÞpDß Dã¤Dà¨Dã¬Dà°Dã´DäÌDçØDëðDèôDëøDô,DõHDö\D÷hDøpDùˆDú¼DûìDúðDûôDüD8Dý<D@DüDDHD\DD”D ˜DJ•œDJ–¸DJ˜ÌDJ™ÐDJ˜ÔDJ™ØDJ›àDJœìDJ›ðDJœôD  D ,D#\D `D#dD hD lD pD#tD$€D ˜DœD  D°D ´DÀDðDôDüD0D4D<DpDtDxD|D€DˆDŒDD”D D$D((D*¤D+¬D*°D+´D,¼D/ D4PD1TD0XD4\D1dD4hDJ•xDJ–”DJ˜°DJ™´DJ˜¸DJ™¼DJ›ÄDJœÐDJ›ÔDJœØD5D6 D7(D8DDBHDDLD8PD9TD;`D:hD;lD<pD=|D>„D?D@”DA DB¤DD¨DE¸DGÀDHÔDIDJTDM€DJ• DJ–¼DJ˜ÐDJ™ÔDJ˜ØDJ™ÜDJ›äDJœðDJ›ôDJœøDN DO,DP@DQ\DR`D[dDRhDQlD]pDRtDS€DTˆDUDVœDW DX¬DY°DZ¼D[ÀD\ÄD]ÈD^ØD`àDaøDb0DcdDf Dc¤Df¨Dg°DjàDmDjDp DsPDttDu„Dv´DyàDzôDyøDzüD} D~ D $D€ ,D 8D‚ @Dƒ PD„ hD… „D†  D‡ ¼Dˆ ØD‰ ìDŠ!D‹!<DŠ!@D‹!DDŒ!pD‹!xDŒ!|D!ˆDŽ!¼D™!ðDš"D›"$Dœ"TD¡"„D¢"D¦"ÄD¨#LD©#TD¨#XD©#\Dª#dD­#ÐD®$D¯$D²$D¯$D²$D®$D²$D³$,D´$DDJ§$tD´$xDJ§$|DJ¨$”DJ¢$ Dµ$¼D¶%D·%(D¸%XDJ§%\D¸%`DJ§%dDJ¨%pDJ¢%|D¹%œDº%ðDJ§&DJ¨&0DJ¢&<D½&TD¾&`D¿&xDJ§&¨D¿&¬DJ§&°DJ¨&ÀDJ¢&ÌDÁ&äDÂ&ðDJ§'DÄ' DÃ'$DÄ'(DJ§',DJ¨'<DJ¢'HDÅ'hDÆ'ÀDJ°'ìDJ±'üDJ¢($DJµ(@DÉ(PDÊ(¼DÍ(ØDÎ(ìDJ•(ðDJ–)DJ˜)$DJ™),DJ›)PDJœ)`DÏ)ŒDÐ*DÑ*(D[*XDJ•*pDJ–*DJ˜*¤DJ™*¨DJ˜*¬DJ™*°DJ›*¸DJœ*ÄDJ›*ÈDJœ*ÌD×*ôDØ+DÙ+DJ§+DDÙ+HDJ§+PDJ¨+hDJ¢+tDÚ+DÛ+ðDÜ,DJ§,8DÝ,<DJ§,@DJ¨,XDJ¢,dDÞ,„Dß,àDà,øDá-(DJ§-,Dá-0DJ§-4DJ¨-LDJ¢-XDâ-xDã-ÐDä-äDJ§.Då.DJ§.DJ¨.,DJ¢.8Dæ.PDç.\Dè.xDJ§.¨Dè.¬Dé.°DJ§.´DJ¨.ÀDJ¢.ÌDê.ìDë/PDJ°/€DJ±/DJ¢/¸DJµ/àDî/ìDï0dDò0|Dï0„Dò0ŒDó0˜Dò0œDó0 Dô0¤Dõ0¸D÷0ÄDú0ÔDû0ðDü1Dý1 Dþ1PD1`D1|D1D1ÀD1ÜD1ôD2(D2,D20D2\D 2xD 2¨D 2¬D 2°D 2´D2ÈD2ÐD2ÔD2ðD3 D3D3D3 D3$D3,D34D38D3<D3DD3HD3TD3XD3hD3˜D3ÈD3ôD3øD3üD$4D%4$DJ½4(D%4,DJ½40D%44DJ½48DJ¾4DDJ¿4PD%4dD&4pD'4”D(4ÈD'4ÌD(4ÐD)4èD*4üD+5D15D05D+5D,5(D-54D.5@D05LD15PD25lD35œD45ÌDJ½5ÐD35ÔD45ÜDJ½5àDJ¾5ìDJ¿5øD46 D56D66<D76lD66pD76tD66xD76|D86ˆD96œD:6¸D@6¼D:6ÄD;6ÌD<6ÔD=6ÜD>6èD?6ìD@6ðDA7DB70DC7`DD7tDJ7|DE7€DF7ŒDG7œDI7¨DJ7¬DK7ÄDM7ÈDK7ÐDL7ÔDM7ØDN7äDO8DP8DDV8pD[8øD\9pD_9œD`9¸Da9ÔDb9ØDa9ÜDb9äDc:Dd: De:0Df:`Dg:tDh:xDg:|Dh:„Dj:°Dh:´Dj:¸Dk:ÀDl:ÔDk:ØDl:ÜDo:àDp:ôDq:øDr;DJ½;Dr;DJ½; DJ¾;,Ds;@Dt;`Du;Dv;¬Dw;ÈD};ÌDw;ÔDx;àDy;ìD{;üDz<D}< D~<DPD–>|D—>”D˜>¤DJ§>ÔD˜>ØDJ§>àDJ¨>øDJ¢?D™? Dš?€D›?˜DJ§?ÈDœ?ÌDJ§?ÐDJ¨?èDJ¢?ôD@Dž@pDŸ@ˆD @¸DJ§@¼D @ÀDJ§@ÄDJ¨@ÜDJ¢@èD¡AD¢A`D£AtDJ§A¤D¤A¨DJ§A¬DJ¨A¼DJ¢AÈD¥AàD¦AìD§BD¨B8DJ§B<D§B@D¨BDDJ§BHDJ¨BTDJ¢B`D©B€DªBàDJ°CDJ±C DJ¢CHDJµCpD­C€D®CôD±DD®DD±DD²D(D¶D\D·DxD¸DD¹D¨DºDØD½DèD¾ED¿EDÀEHDÁEdDÂE|DÃE°DÂE´DÃE¸DÄEäDÅFDÉF0DÅF4DÆF8DÉF<DÍFPDÊFTDÍFXDÎFhDÕF”DÖFœDÕF DÖF¬DÕF°DÖF´DÜF¸DÙF¼DÜFÄDÙFÈDÜFÌDÙFÐDÜFÜDÝFìDäGDåG,DæG8DçG\DèGxDéGŒDïGDéG”DêG DëG¬DìG¸DíGÄDïGÌDðGÜDñH DòH@DñHDDòHHDúHxDûH”DJ½H˜DûHœDJ½H DJ¾H¬DüHÀDýHàDþIDÿI$DI@DI\DI`DIhDItDI€DI„DIˆDI”DI˜DIœDI¬D IÜD J DJ½JDJ¾JD J0D JPD J€DJœDJ¸DJÔDJØDJàDJèDJôDJøDJüDKDKDKHDKxDK”DK˜DKœD K DK¤DK¨DK¬DK¼DKÄD KÈD!KàD#KèD$KüD%L0D&L`D(LD-LÀD.LÐD5MD6M(D5M,D6M0D7M4D8MHD9MxD:M|D9M€D@M„DAM˜D@MœDAM DBM¸DCMÈDDMÌDEMüDFNDGNDFN DGNDHN(DIN,DJN\DKNdDLNhDKNlDLNxDMNˆDNNŒDPN¼DQNÀDPNÄDQNÌDRNÜDSNàDTO DUO(DVO@DWODDVOHDWOPDXO|D]OøD^P D_P<DbPHDcPdDJ½PhDcPlDJ½PpDJ¾P|DdPDeP°DfPàDgPüDhQDnQDhQDiQ$DjQ0DkQ@DlQLDnQXDoQtDpQ¤DqQØDpQÜDqQàDrQøDtRDuRDvRHDwRxDzR¤D{R´D‚RìD…S(DˆS\DStDS”D‘SðD’T0D“TpD”T°D•UD–UPD—U D˜UðD›VDœVPDVDžVÐDŸWD W@D¡WpD¢W D£WÐD¤XD¥X0D¦X`D§XD¨XÀD©XðDªY D«YPD¬Y€D­Y°D®YàD¯ZD°Z@D±ZpD²Z D³ZÐD´[DÊ[XDï[tD®[D[ðD¶\ƒ$OÖpƒA@OƒU OŒƒg Oƒy€Pxƒ”€QLƒ­€RPƒÄ€STƒÜ€TXƒõ€U\„€V`„'€Wd„<€XÔ„L@Y„]@Z „r€[Є„@\„Ÿ€]Ì„·€^È„Ê@_„Ü@`?„ @a…@b…4@c…K@d …_@e…u@f…ˆ€gÄ…œ@h…³@i…Ç€jÀ…Þ€k¼…ö€l¸† @m †!€n´†>@o†X@p†g€qh†u@r†„@s†“€tl†¡€up†¯€vt†½@w†Ì@x†Û€yH†é@z†ù@{‡ @|‡&}­8‡3€‡QÀÖp‡R@r‡^Àû@‡_àûH‡`@r‡lÀûP‡màûT‡n@r‡zÀûd‡{àût‡|@û‡ˆÀ‡‰à$‡Š@û‡–À,‡—à0‡˜@û‡¤ÀD‡¥àP‡¦@ ‡²À4‡³à<‡´@ ‡ÀÀD‡ÁàH‡Â@ ‡ÎÀX‡Ïàh‡Ð@c‡ÜÀx‡Ýà€‡Þ@c‡êÀˆ‡ëàŒ‡ì@c‡øÀœ‡ùଇú@ ˆÀœˆ@J”ˆ Àœˆ@J˜ˆÀÌˆà ˆà ˆà ˆ@J”ˆ$Àxˆ%@J˜ˆ.À°ˆ/àˆ0àˆ1@J”ˆ:À ˆ;@J˜ˆDÀЈEà ˆFà ˆG@J¦ˆSÀ&ˆTà&TˆU@J¦ˆaÀ&¨ˆbà&¬ˆc@J¦ˆoÀ&°ˆpà&äˆq@J¯ ˆ}À'ìˆ~à(Pˆ@J˜ˆˆÀ)$ˆ‰à)ŒˆŠ@J”ˆ“À*pˆ”@J˜ˆÀ*¤ˆžà*ôˆŸà*ôˆ @J¦ˆ¬À.ˆ­à.ˆ®@J¦ˆºÀ.ˆ»à.Pˆ¼@J¯ ˆÈÀ/€ˆÉà/ìˆÊ@%ˆÖÀ4(ˆ×@J¼ˆåÀ4(ˆæà4,ˆçà4,ˆè@%ˆôÀ40ˆõ@J¼‰À40‰à44‰à44‰@%‰À48‰@J¼‰!À48‰"à4d‰#à4d‰$@4‰0À5Љ1@J¼‰?À5Љ@à5Ô‰Aà5Ô‰B@4‰NÀ5à‰O@J¼‰]À5à‰^à6 ‰_à6 ‰`@r‰lÀ;‰mà;‰n@r‰zÀ; ‰{à;@‰|@J¦‰ˆÀA¤‰‰àA¨‰Š@J¦‰–ÀA¬‰—àAà‰˜@J¯ ‰¤ÀC‰¥àC€‰¦@û‰²ÀH˜‰³àHœ‰´@û‰ÀÀH ‰ÁàHÀ‰Â@ ‰ÎÀJ‰ÏàJ0‰Ð@c‰ÜÀPh‰ÝàPl‰Þ@c‰êÀPp‰ëàP‰ìà\0‰í$…ÀN\0‰î­X.\0D7\0DH\<D7\@DH\DD7\HDH\PD9\TD7\XDH\dDG\hDH\lDG\pD7\tDH\|D9\„DG\ˆDH\ŒDI\ DJ\ÄDK\üDL]4DO]`DP]dDQ]hDO]pDR]xDP]|DT]ˆDW]”DX]˜DY]¤D‚]ØD‘^D’^4DZ^`D·^¤D[^¼D\_D]_4Df_€Dg_Dh_ÀDk_ÄDh_ÈDk_ÌDl`Dq`@Dr`DDu`€DJ•`ˆDu`ŒDJ•`”DJ–`¬DJ˜`ÀDJ™`ÈDJ›`ÐDJœ`ÜDJ›`àDJœ`äDuaDva@DJÛaHDJÜaPDJßapDwa˜DJáa°DvaÔDwaèD}bDxbD}bD€bDb,D‚bDDƒbXD‰b\DƒbdD…blD†bpD„btD‰bxDŠbˆD‹bÀDbðD‘cD’cD“c8D”cpD•c D–c´D—càDrd D d0D¢dpD£dxD«dŒD¬d D®d¤D¬d¨D®d¸D­dÀD®dÈD€eD¯e$D°ePD±e`D²eŒD¶e¸DeÄD‰eìDfD•f<D·fdD¸f€D¹fÀDºfðD½gD¾g@D¿gpDÀg DÁgÐDÂhDÃh0DÄh`DÅh DÇhðŠ$7\0Š<@7ŠP 7¼Šb 7ÀŠt€88Š‹€9<Š @:б@;ŠÅ@<ŠÝ@=Šî@>‹@?‹@A‹$@B‹3@C‹B@E‹S&F­X‹k€‹‰À\0‹Š@u‹•@u‹žÀ`ˆ‹Ÿà`Œ‹ @u‹«@u‹´À`”‹µ@J˜‹¾À`À‹¿àa‹Ààa‹Á@v‹ÏÀaH‹Ðàa˜‹Ñ@v‹ßÀa°‹ààaÔ‹áài‹â$ àNi‹ã­`.iD2ÛiD2þi,D2Ûi0D2þi4D2Ûi8D2þi@D2ÛiHD2þiLD2ÜiPD2þiTD2úi`D2ÜidD2ÝihD2ôilD2÷ipD2þitD2ÿi„D3iˆD3iŒD2ÿi”D3iœD3i¨D3i¸D3 iÄDJ•iÌDJ–ièDJ˜jDJ™jDJ˜jDJ™j DJ›jDJœj DJ›j$DJœj(D3 jPD3 j°DJÛj¸DJÜjÀDJßjàD3 kDJák$D3 kHD3 k¬D3 kÐD3kÔD3kàD3käD3kèD3 kìD3 kðD3kôD3køD3küD3lD3lpD3#lxD3l|D3#l€D3$làD3%mPD3&m€D3%mˆD3&mŒD3'mÔD3(nD3)nD3+n`D3,nhD3+nlD3,npD3-n„D30n D31oDJ§o0D31o4DJ§o<DJ¨oLDJ¢oXD32opD33o|D34oÀDJ§oÈD35oÌD34oÐD35oÔDJ§oØDJ¨oèDJ¢oôD36pD37pD38p`DJ°phD39plD38ppD39ptDJ°pxDJ±p„DJ¢p¬DJµpÐD3:pÜD3;qD3>q0D3;q4D3>q8D3;q<D3>q@D3?qD3Cq”D3?q D3Cq¤D3JqÐD3CqÔD3JqØD3CqÜD3JqàD3DqðD3ErD3Fr@D3ErDD3FrHD3hrLD3JrTD3Kr€D3Jr„D3KrŒD3NrÀD3KrÄD3NrÈD3KrÌD3NrÐD3OrØD3NrÜD3OràD3PräD3QrðD3RsHD3SsD3Ts¼D3XsÀD3TsÈD3XsÌD3TsÐD3VsÜD3UsäD3XsèD3YtD3ZtdD3[t´D3]t¸D3[t¼D3]tÄD3^uD3_u@D3`uPD3au|D3muÀD3puìD3svD3tvD3{v@D3xvLD3{vPD3xv\D3{v`D3~vdD3€wD3wD3‚w(D3…w`D3Šw˜DJ½wœD3Šw DJ½w¤DJ¾w°DJ¿w¼D3ŠwÐD3‹wØD3ŒwôD3x$D3Œx(D3x,D3Œx4D3x8D3ŽxHD3x\D3‘x`D3xdD3xhD3‘xlD3’x|D3“x°D3”xÜD3—yD3˜yD3›y$D3œy4D3›y8D3œy<D3Ÿy@D3¢y`D3¥y|D3¦y˜D3§y¬D3©y°D3§y¸D3¨y¼D3©yÀD3ªyØD3«zD3ªzD3«zD3¬zD3­zXD3³z D3´z¼D3³zÀD3´zÈD3µzÌD3·zìD3ºzôD3½{D3À{0D3Á{LD3Â{`D3Ä{dD3Å{œD3Æ{ÈD3Ç{ØD3È| D3Ç|D3È|D3Î|PD3Ò|pD3Ó|xD3Ò||D3Ó|€D3Ö|„D3×|ˆD3Ö|D3×|”D3Ø|˜D3Ú|¼D3Ý|ÄD3à|üD3Ý}D3á}D3à}D3á} D3ä}D3ç}4D3ê}PD3ë}dD3í}xD3ì}€D3í}ŒD3î}¤D3ï}ÔD3î}ØD3ï}ÜD3î}äD3ï}èD3ð}ìD3ñ~ D3ô~pD3õ~|D3ô~€D3õ~„D3ü~ˆD3ý~¨D3ü~¬D3ý~°D3þ~´D3ÿ~ÈD4~ÜD4~ôD4,D4 4D4<D4 @D4 TD4 €D4 ¬DJÛ´DJܼDJßàD4 €DJဠD4 €DD4 €D4€¨D4€¬D4€°D4€´D4€ÈD4€ÔD4€ØD4€ÜD4€àD4€äD4€èD4€ìD4€ðD4€ôD4 €üD4#D4 D4#D4  D4#D4D4, D424D43\D42`D43hD46lD47ˆD46ŒD47D48”D4:ÀD4=ÌD4>èD4?üD4@‚D4A‚ D4B‚D4C‚0D4D‚dD4E‚D4F‚¬D4G‚àD4F‚äD4G‚èD4HƒD4IƒDDJÛƒLDJ܃TDJ߃pD4Jƒ”DJჴD4IƒØD4J„$D4K„DD4L„LD4O„PD4K„TD4L„XD4O„\D4R„pD4X„tD4[„xD4X„|D4a„€D4X„„D4[„ˆD4^„ŒD4d„D4X„”D4^„˜D4a„ D4^„¤D4d„¨D4m„¸D4j„¼D4m„ÀD4n„ÄD4m„ÈD4n„ÌD4q„ÐD4t„ØD4q„ÜD4t„àD4q„äD4t„èD4z„ðD4}„øD4z„üD4}…D4z…D4}…D4‚… D4……D4Ž…D4ˆ…D4‹… D4Ž…$D4,…,D4‚…4D4……8D4ˆ…<D4Ž…@D4‘…`D4,…dD4‘…hD4,…pD4•…tD4˜…¤D4ž…´D4Ÿ…¼D4ž…ÀD4Ÿ…ÄD4 …ÈD4¨…ØD4ª…ìD4®†4D4¯†XD4®†\D4¯†`D4°†dDJ½†hD4°†lDJ½†pDJ¾†|D4±†ˆD4²†¸D4³†äDJ½†èD4³†ìDJ½†ðDJ¾†üDJ¿‡D4³‡D4´‡D4µ‡0D4¶‡DD4¸‡HD4¹‡dD4º‡˜D4¹‡œD4º‡ D4»‡ÌD4º‡ÔD4»‡ØD4¼‡èD4½ˆD4¾ˆD4ÁˆD4½ˆ D4Áˆ$D4ˆ<D4ÈhD4Ĉ|D4ň„D4ƈˆD4LjœD4ȈÐD4ɉD4­‰0D4Љ@D4щLD4Ò‰`D4щdD4Ò‰hD4Ó‰lD4Ô‰ˆD4Õ‰´D4Ö‰ÔD4׉ôD4ØŠD4ÙŠ4D4ÞŠ8D4áŠ<D4ÚŠDD4ÛŠLD4ÜŠTD4àŠ\D4ÞŠ`D4ߊdD4áŠhD4⊌D4ãЏD4äŠðD4ЋD4ë‹,D4î‹LD4ñ‹hD4ò‹„D4ó‹ÔD4ôŒD4óŒ D4ôŒD4öŒ<D4ôŒ@D4öŒDD3‹ŒhD3ŒD3ŽŒÄD3‘ŒèD3— D3¦LD3©tD3À¨D3ÁÈD3ÄèD3êŽ D3íŽ(D3þŽ`D3ÿŽ€D4 ލD4 ŽÌD4=ŽôD4>D4BLD4ChD4EˆDJ¿¼D4°ÀDJ¿ÈD4°ÌDJ¿ÐD4°ØDJ¿àD4°ìD4± D4³XD4µˆD4¸¸D4»èD4¼‘D4Á‘(D4Æ‘@D4Ó‘|D4Ö‘ÀD4בäD4Ø’D4á’,D4÷’dD4ù’€D4ú’ÐD4û“ D4ü“pD4ý“ÀD4þ”D4ÿ”@D5”PD5”€D5”ÀD5•D5•@D5•€D5•°D5 •àD3;– D4Ж<D5 –P‹ù$2ÛiŒ0@2ÛŒD@2ÛŒV@2ÛŒh€2ÜHŒ€2ÝLŒ”@2ጥ€2âPŒ½€2䈈ŒÑ€2æTŒê@2ç€2舀2él+@2êC€b€…€2눘˜€2숴€2íHˆË€2îXꀎ €Ž.€2M€2ðˆ”Že€2ñˆŽ{€2òˆŒŽ’@2óŽ¡€2ô\ޝ@2õŽÀ€Žâ@2öŽñ€2÷`Žÿ€2ùd €2úh@2û *€2üˆˆ8&2ý­`P€nÀio@3 z@3 ƒÀiÌ„@J”ÀiÌŽ@J˜—Àj˜àjP™àjPšàjP›@3 ©Àj¸ªàk«@3 ¹Àk$ºàkH»@J¦ÇÀo0Èào4É@J¦ÕÀo<Öàop×@J¦ãÀoÈäàoÌå@J¦ñÀoØòàpó@J¯ ÿÀphàpl@J¯  ÀpxàpÜ@3ŠÀwœ@J¼*Àwœ+àw ,àw -@3Š9Àw¤:@J¼HÀw¤IàwÐJàwÐK@4 Y@4 dÀ´eà€f@4 t@4 À€ €à€D@4I@4IšÀƒL›àƒ”œ@4Iª@4IµÀƒ´¶àƒØ·@4°ÃÀ†hÄà†lÅ@4°ÑÀ†pÒà†ˆÓ@4³ßÀ†èà@J¼îÀ†èïà†ìðà†ìñ@4³ýÀ†ðþ@J¼‘ À†ð‘ à‡‘à‡‘@4°‘À¼‘àÀ‘@4°‘)ÀÈ‘*àÌ‘+@4°‘7ÀБ8àØ‘9@4°‘EÀà‘Fàì‘Gà–x‘H$-hN–x‘I­l.–€D5w–€D5›–œD5w– D5›–¤D5w–¨D5x–¬D5›–°D5w–´D5›–¸D5w–ÀD5›–ÄD5x–ÔD5y–ØD5’–ÜD5—–àD5˜–äD5›–èD5—D5Ä—(D5ЗtD5Ô—¸D5Õ—äD5í˜8D5ó˜€D5ù˜ØD6™(D6™pD6_™ D6`™ìD6aš D6dš0D6zš\D6šŒD6ƒšÄD6‹›D6‘›DD6–›xD6¨›ÌD6³œD6Çœ\D6ØœD6éœÔD7LD7M<D7O„D7P¤D7QÐD7ZüD7jž4D7kžLD5œžˆD5žŒD5ŸžD5¨ž”D5Ÿž˜D5œžœD5ž¤D5žž°D5¥žÀD5¨žÌD5«žÐD7rŸDD5¯Ÿ`D5µŸhD5¯ŸlD5µŸpD5¶ŸÀD5·ŸØD5¸ D5· D5¸ D5¹ PD5º €D5» ôD5½¡@D5¾¡HD5½¡LD5¾¡PD5¿¡XD5¡°D5áÄDJ§¢D5âDJ§¢D5â DJ§¢DJ¨¢ DJ¢¢,D5Ä¢PD5Å¢\DJ§¢D5Ç¢”D5Æ¢˜DJ§¢œD5Ç¢ DJ§¢¤DJ¨¢´DJ¢¢ÀD5È¢àD5É¢ìDJ°£ D5Ë£$D5Ê£(DJ°£,D5Ë£0DJ°£4DJ±£@DJ¢£hDJµ£D5Ì£œD5Í£ÜD5ФD5ѤD5Ô¤D5ѤD5Ô¤D5Õ¤4D5Ö¤HD5פ€D5Ö¤„D5פˆD5ܤ”D5ߤÀD5â¤ØD5ã¤èD5ê¥D5ç¥D5ê¥D5ç¥$D5ê¥(D5í¥,D5î¥DD5ó¥pD5ô¥ŒD5ù¥¸D5õ¥¼D5ö¥ÀD5ù¥ÄD5û¦8D5ü¦@D5ý¦LD6¦ D6¦ÌDJ½¦ÐD6¦ÔDJ½¦ØDJ¾¦äDJ¿¦ðD6§D6§D6§0D6§`D6§dD6§hD6§pD6§tD6 §„D6 §œD6 § D6 §¨D6 §¬D6 §°D6 §ÄD6§üD6¨0D6¨4D6¨8D6¨dD6¨lD6¨pD6W¨¨D6¨ÀD6¨ÜD6¨ìD6©D6©$D6©@D6©\D6©tD6©¨D6©¬D6©°D6©ÀD6©ÄD6©ÈD6©ÐD6©ØD6 ©ìD6!ªD6"ªHD6!ªLD6"ªPD6!ªXD6"ª\D6#ªlD6$ªœD6#ª D6$ª¤D6%ªàD6&ªäD6'ªüD6)«D6*«(D6+«\D6,«ŒD6+«˜D6,«œD63«ÐD64¬D65¬PD66¬TD65¬XD66¬dD67¬D66¬”D67¬œD68¬¤D69¬ÀD6:¬ÜD6;¬ôD6<­(D6;­,D6<­0D6=­@D6?­DD6=­HD6>­PD6?­XD6@­lD6A­˜D6B­ÈD6A­ÌD6B­ÐD6A­ØD6B­ÜD6C­ìD6D®D6C® D6D®$D6E®`D6F®dD6G®|D6I®D6J®¨D6K®ÜD6L¯ D6K¯D6L¯D6M¯`D6N¯”D6W¯ÈD6X¯ôD6W¯øD6X°D6Y°4D6X°8D6Y°@D6Z°|D6^°¬D6_°¸D6`°ÐD6a°ðD6b± D6d±D6e±0D6f±hD6g±xD6h±¤D6q±ôD6r²D6q² D6r²D6s²DJ•²DJ–²8DJ˜²PDJ™²XDJ›²`DJœ²tD6w² DJ•³DJ–³DJ˜³4DJ™³<DJ›³DDJœ³XD6x³„D6y³àD6z³ôD6{´D6|´ D6€´D6{´D6|´D6}´(D6€´4D6´8D6‚´PD6ƒ´€D6‚´„D6ƒ´ˆD6„´œD6…´ÐDJ•´ÔDJ–´ðDJ˜µDJ™µDJ›µDJœµ,D6еXD6‹µÀD6ŒµÔD6¶ DJ•¶DJ–¶8DJ˜¶PDJ™¶XDJ›¶`DJœ¶tD6¶ D6‘·D6’·D6“·LD6–·\D6—·lD6š·xD6›·ŒD6š·D6›·”D6ž·˜D6¡·¸D6¤·ÔD6¥·ðD6¦¸D6§¸D6¦¸ D6§¸D6¨¸D6§¸D6¨¸D6©¸8D6ª¸lD6©¸xD6ª¸€D6«¸„D6¬¸ÀD6«¸ÌD6¬¸ÔD6³¹D6´¹,D6·¹0D6º¹dD6·¹hD6»¹lD6º¹pD6»¹tD6¾¹xD6Á¹˜D6Ĺ´D6ŹÐD6ǹÔD6ŹØD6ƹèD6ǺD6ȺD6ɺPD6ʺ`D6˺ŒD6κðD6ϺüD6λD6Ï»D6Ö»D6×»(D6Ö»,D6×»0D6Ø»4D6Ù»hD6Ú»”D6Û»˜D6ỜD6ä»°D6ç»´D6è»ÐD6ç»ÔD6è»ØD6é»ÜD6ê¼D6ì¼<D6ë¼@D6ì¼DD6ö¼LD6ò¼PD6õ¼TD6ö¼XD6ù¼\D6ú¼dD6ù¼hD6ú¼lD6ý¼pD7¼xD6ý¼|D7¼€D6ý¼„D7¼ˆD7¼D7 ¼˜D7¼œD7 ¼ D7¼¤D7 ¼¨D7¼¬D7¼°D7¼´D7¼¼D7¼ÀD7¼ÄD7¼ÌD7¼ÐD7¼ÔD7¼ØD7¼ÜD7¼àD7¼äD7¼èD7¼ðD7¼øD7½ D7#½D7$½ D7#½$D7$½(D7'½,D7*½4D7'½8D7*½LD70½hD73½pD70½tD73½ˆD6á½ D79½°D7<½´D79½ÈD7<½ÌD79½ÜD7<½àD79½äD7<½èD79½ìD7<½ðD7?¾D7D¾D7F¾$D7I¾PD7J¾`D7K¾tD7J¾xD7K¾|D7L¾€D7M¾œD7N¾¸D7O¾ÐD7P¾äD7Q¾øD7R¿ D7S¿D7Z¿D7X¿D7R¿D7S¿$D7T¿,D7U¿4D7X¿<D7Y¿@D7Z¿DD7[¿TD7\¿ˆD7]¿´D7I¿àD7d¿ðD7gÀD7jÀ,D7kÀLD7lÀ`D7mÀ˜D7oÀÈD7mÀÌD7oÀÐD7mÀÔD7oÀØD7rÀðD7sÁ D7tÁPD7uÁD7vÁÐD7wÂD7xÂPD7{Â`D7|ÂD7}ÂÀD7~ÂðD7à D7€ÃPD7ÀD7‚ðD7ƒÃàD7„ÄD5ÍÄPD7†Äp‘_$5w–€‘”@5w‘¨@5w‘º@5w‘Ì€5x8‘ã€5y<’@5z’@5{’%@5}’6€5~@’I@5’i€5D’€5‚p’œ€5ƒ°’¸€5„’΀5…€ð’á€5†X’ø@5‡“€“0€5ˆð“L€5‰@ð“c@5Š“|@5‹““@5Œ“©@5 “»@5Ž“Ó@5“ä@5“ó@5‘”€5’H”@5“”!@5””0€5–L”>€5—P”L€5˜T”Z€5™ü”h&5š­l”€€”žÀ–€”Ÿ@J¦”«À¢”¬à¢”­@J¦”¹À¢”ºà¢ ”»@J¦”ÇÀ¢”Èà¢P”É@J¦”ÕÀ¢”Ö࢔”×@J¦”ãÀ¢œ”äࢠ”å@J¦”ñÀ¢¤”òà¢à”ó@J¯ ”ÿÀ£ •à£$•@J¯ • À£,•à£0•@J¯ •À£4•ࣜ•@6•)À¦Ð•*@J¼•8À¦Ð•9à¦Ô•:à¦Ô•;@6•GÀ¦Ø•H@J¼•VÀ¦Ø•Wà§•Xà§•Y@J˜•bÀ²P•cಠ•d@J˜•mÀ³4•nೄ•o@J˜•xÀµ•yàµX•z@J˜•ƒÀ¶P•„à¶ •…àÄ”•†$.NÄ”.Ä D0‹Ä D0”ĬD0‹İD0¤ÄÌD0§ÄÐDJ½ÄÔD0¤ÄØD0ÄÜD0”ÄèD0—ÄìD0˜ÄðD0™ÄôD0žÄøD0¤ÅD0§ÅDJ½Å D0¤ÅDJ½ÅD0¤ÅDJ½ÅDJ¾Å DJ¿Å,D0§Å4DJ¿Å@D0§ÅDDJ¿ÅPD0§ÅXD0¨ŰD1¼Æ D0©Æ@D0ªÆpD0«ÇD0¬Ç0D0«Ç4D0¬Ç8D0¯Ç<D0°ÇD0±ÈDJ§È0DJ¨ÈDDJ¢ÈPD0²ÈpD0³ÈÐDJ§ÉDJ¨ÉDJ¢É D0¶É@D0·ÉDJ§ÉÀDJ¨ÉÔDJ¢ÉàD0ºÊD0»ÊPDJ°Ê€DJ±ÊDJ¢ʸDJµÊÔD0¾ÊäD0¿ËHD0ÃË`D0¿ËdD0ÃËlD0ÄËtDJ½ËxD0ÄË|DJ½Ë€DJ¾ˈDJ¿Ë”D0ÄËœDJ¿˨D0ÄˬDJ¿Ë´D0ÄËÀD0ÅÌD0ÆÌXD0ÇÌ„D0ÈÌœD0ÉÌÐD0ÊÌäD0ËÍPD0ØÍTD0ËÍXD0ÌÍ`D0ÍÍhD0ÎÍpD0ÏÍxD0ÐÍ„D0ÑÍŒD0Ò͘D0ÓÍ D0ÔͬD0ÕͰD0ÔÍ´D0ÕͼD0ØÍÀD0ÙÍÄD0ÚÎ8D0ÛÎlD0ãÎÀD0äÎØD0ûÏD0åÏ,D0æÏ@D0òÏDD0æÏHD0çÏPD0èÏXD0éÏ`D0êÏlD0ëÏxD0ìÏ€D0íÏŒD0îÏ”D0ïϘD0îÏœD0ïϤD0ñϨD0òϬD0óÏèD0õÐD0ôÐD0õÐ D0óÐ0D0õÐ4D0ûÐDD0üÐ\D0ýДD0üИD0ýРD0þÐÔD0ýÐØD0þÐàD1ÑDJ½ÑD0þÑD1Ñ D0þÑ$DJ½Ñ(DJ¾Ñ0DJ¿Ñ<D1ÑDDJ¿ÑPD1ÑTDJ¿Ñ\D1ÑhD1Ñ D1ÒD1Ò4D1Ò<D1Ò@D1ÒDD1ÒlD1Ò´D1ÒÀD1 Ó<DJ½Ó@DJ¾ÓLDJ¿ÓXD1 Ó`DJ¿ÓlD1 ÓpDJ¿ÓxD1 Ó„D1 ÓÀD1 ÓðD1 ÔD1 ÔxD1Ô|D1 Ô„D1ÔŒD1ÔD1ÔìD1ÕD1ÕDD1ÕHD1ÕLD1ÕPD1ÕTD1Õ„D1Õ¸D1'ÖD1/Ö,D1'Ö0D1/Ö@D1'ÖDD1/ÖPD1(Ö`D1NÖD1/Ö D10ÖÌD1/ÖÐD10ÖØD11× D10×D11×D12×LD11×PD12×XD16׌DJ½×D12×”D16טDJ½לD12× DJ½פDJ¾׬DJ¿׸D16×¼DJ¿×ÀD16×ÄDJ¿×ÌD16×ÐDJ¿×ÜD16×èD17Ø D18Ø$D17Ø(D18Ø,D19ØTD1:ؘD1;ؤD1<ÙD1=Ù,D1?Ù@D1>ÙHD1?ÙTD1@Ù´D1AÙäD1@ÙìD1AÙðD1BÙøD1CÚ(D1OÚ„DJ½ÚˆD1OÚŒDJ½ÚDJ¾Ú˜DJ¿Ú¤D1OÚ¬DJ¿Ú¸D1OÚ¼DJ¿ÚÈD1OÚÔD1PÛD1QÛpD1RÛœDJ•Û DJ–Û¼DJ˜ÛÐDJ™ÛØDJ›ÛìDJœÛøDJ›ÛüDJœÜD1RÜ(D1SÜ|D1TÜ”D1UܰD1VÜÄD1WÝD1XÝ\D1YÝ´D1_ݼD1bÝÀD1ZÝÄD1gÝÈD1ZÝÌD1[ÝÐD1\ÝØD1]ÝÜD1^ÝàD1\ÝäD1^ÝèD1_ÝìD1`ÝøD1bÝüD1cÞD1dÞD1gÞD1hÞdD1iÞ˜D1rßDJ½ßD1rßDJ½ßDJ¾ß$DJ¿ß0D1rßPD1s߀D1tßœD1ußÌD1tßÐD1ußÔD1vßäD1wßôD1xàD1yàD1xàD1yàD1zàD1{à„D1|à¸D1{à¼D1|àÀD1}àìD1|àðD1}àôD1‚á D1„á”D1…áœD1†áàD1‡áøD1ˆâD1‰âlD1ŠâœD1‹â¬D1ŒâàD1‹âäD1ŒâèD1’ã@D1”ã˜D1•ãœD1–ã¨D1™ãÌD1šäDJ§ä<DJ¨äPDJ¢ä\D1›ätD1œäØDJ§åD1žåD1å D1žåDJ§åDJ¨å$DJ¢å0D1ŸåHD1 å¬D1¡åØDJ°åÜD1¢åàD1¡åèDJ°åìDJ±åøDJ¢æ DJµæ<D1£æLD1¤æ”D1¥æ¬D1¤æ´D1¥æ¼D1¦æÈD1§æìD1¨ç<D1®ç@D1¨çDD1©çLD1ªçTD1«ç\D1®çhD1¯çÈD1²çüD1µè`D1¹èD1¼è¼D1½èàD1¾é D1¿éPD1ÀéD1ÁéÐD1ÂêD1ÃêPD1ÄêD1Çê D1ÈêÐD1ÉëD1Êë0D1Ëë`D1ÌëD1ÍëÀD1ÎëðD0¿ì D1¤ì<D1Ðì`•‡$0‹Ä •½@0‹•Ñ@0‹•â@0Œ•ô@0–@0Ž–€0X–,€0T–<€0‘P–R@0’–a@0“–p€0”8–~@0•–@0––œ€0—<–ª€0˜@–¸€0™D–Æ€0šL–Ô€0›H–â@0œ–ôÀÄ –õ@0§—ÀÄÔ—àÄØ—@0§—ÀÅ —àÅ—@0§—ÀÅ—àÅ—@0§—+ÀÅ—,àÅ4—-@0§—9ÀÅ@—:àÅD—;@0§—GÀÅP—HàÅX—I@J¯ —UÀÊ€—VàÊä—W@0Ä—cÀËx—dàË|—e@0Ä—qÀË€—ràËœ—s@0Ä—À˨—€àˬ—@0Ä—ÀË´—ŽàËÀ—@1—›ÀÑ—œàÑ—@1—©ÀÑ(—ªàÑD—«@1—·ÀÑP—¸àÑT—¹@1—ÅÀÑ\—ÆàÑh—Ç@1 —ÓÀÓ@—ÔàÓ`—Õ@1 —áÀÓl—âàÓp—ã@1 —ïÀÓx—ðàÓ„—ñ@16—ýÀ×—þà×”—ÿ@16˜ Àל˜ à× ˜ @16˜Àפ˜à×¼˜@16˜'À×À˜(à×Ę)@16˜5À×̘6à×И7@16˜CÀ×ܘDà×è˜E@1O˜QÀÚˆ˜RàÚŒ˜S@1O˜_ÀÚ˜`àÚ¬˜a@1O˜mÀÚ¸˜nàÚ¼˜o@1O˜{ÀÚȘ|àÚÔ˜}@1R˜†ÀÛ ˜‡@J˜˜ÀÛИ‘àÜ(˜’àÜ(˜“@1r˜ŸÀߘ @J¼˜®Àߘ¯àߘ°àߘ±@1r˜½Àߘ¾@J¼˜ÌÀߘÍàßP˜ÎàßP˜Ï@J¦˜ÛÀä<˜Üàät˜Ý@J¦˜éÀå˜êàå˜ë@J¦˜÷Àå˜øàåH˜ù@J¯ ™ÀåÜ™àåà™@J¯ ™Àåì™àæL™à쀙$'àN쀙­x.ì€DC¯ì€DC±ìDC¯ì”DC±ì¤DC²ì´DCµì¼DC´ìÀDÞìÄDCµìÌDC´ìÐDÞìÔDÛìØDÚìÜDÝìàDÞìäDC´ìôDCµìøDÞìüDCµí DÞíDC¶íDÞí DÜí(DÚí,DÛí0DÜí4DÝí8DC¶í<DÚí@DÛíDDÜíHDÝíLDC¶íPDÞíXDßídDàípDäí€Dáí„Dâí”Däí¤Dãí¨Däí¬DIÛí°Dãí´DIÛí¼DIÜíÀDIßíàDåîDIÛîDIßîDIáî0Däî\DIÜîtDIßîDèî¬Déî¸Dìî¼DIáîðDåïDèïPDìïhDïï€Dðï„DñïDôïÀDõïÌDöïôDüðDýð@DðDDðHDðPDðTD ðhD ð D ð¨Dð°DAðäDñDJ•ñ0DJ–ñLDJ˜ñ`DJ™ñhDJ›ñ€DJœñŒDJ›ñDJœñ”DñÀDñÐDòDò0DJ•ò8DJ–òTDJ˜òpDJ™òxDJ›òDJœòœDJ›ò DJœò¤DòÐDòàDóDó@DJ•óLDJ–óhDJ˜ó€DJ™óˆDJ›ó DJœó¬DJ›ó°DJœó´D"óàD#óðD$ô D%ôPDJ•ô\DJ–ôxDJ˜ôDJ™ô˜DJ›ô°DJœô¼DJ›ôÀDJœôÄD(ôðD)õD*õ0D+õ`DJ•õlDJ–õˆDJ˜õ DJ™õ¨DJ›õÀDJœõÌDJ›õÐDJœõÔD.öD/öD0ö@D1öpD4ötD1ö|D4ö€D1ö„D6öŒD9ö¸DAöÈDBöàDC÷ DF÷0DG÷`DH÷DI÷ÀDJ÷ðDC·ø DC¸ø(DC»ød™,$C¯ì€™k@C¯™v@C¯™@C¯™ˆ@C±™‘À쀙’€ÊH™¦€ËL™¸€ÌP™Ë€ÍT™Þ€ÎX™ô€Ï\š @К@Ñš0@Òš?@ÓšP@Õša@Öšr@ךÀìÄš‚àìÌšƒ€ÊHš—€ËLš©€ÌPš¼€ÍTšÏ€ÎXšå€Ï\šü@Л @Ñ›!@Ò›0@Ó›A@Õ›R@Ö›c@×›rÀìÔ›sàìô›t€ÊH›ˆ€ËL›š€ÌP›­€ÍT›À€ÎX›Ö€Ï\›í@Лþ@Ñœ@Òœ!@Óœ2@ÕœC@ÖœT@לcÀìüœdàí œe€ÊHœy€ËLœ‹€ÌPœž€ÍTœ±€ÎXœÇ€Ï\œÞ@Мï@Ñ@Ò@Ó#@Õ4@ÖE@×TÀíUàíV€ÊHj€ËL|€ÌP€ÍT¢€ÎX¸€Ï\Ï@Ðà@Ñô@Òž@Óž@Õž%@Öž6@מEÀí žFàí<žG€ÊHž[€ËLžm€ÌPž€€ÍTž“€ÎXž©€Ï\žÀ@ОÑ@Ñžå@Òžô@ÓŸ@ÕŸ@ÖŸ'@ן6Àí@Ÿ7àíPŸ8€ÊHŸL€ËLŸ^€ÌPŸq€ÍTŸ„€ÎXŸš€Ï\Ÿ±@ПÂ@ÑŸÖ@ÒŸå@ÓŸö@Õ @Ö @× 'ÀíX (@ä 6@ä AÀí° Bàí´ C@ä Q@ä \Àí¼ ]àî ^@å l@å wÀî xàî0 y@ä ‡@ä ’Àî0 “àî\ ”@å ¢@å ­Àît ®à¯@å ½@å ÈÀîð Éàï Ê@J˜ ÓÀñ` ÔàñÀ Õ@J˜ ÞÀòp ßàòРà@J˜ éÀó€ êàóà ë@J˜ ôÀô õàôð ö@J˜ ÿÀõ ¡àö¡àø ¡àø|¡$ üNø|¡­”.ø€D%ø€D%.øD%ø˜D%ø D%ø¤D%-ø°D%+ø´D%,ø¸D%.ø¼D%-øÀD%+øÄD%.øÈD%,øÌD%.øÐD%-øØD%.øÜD%#øèD%,øìD%.øðD%øøD%øüD%ùD%ùD%ùD% ù D%!ùD%+ùD%"ùD%.ùD%/ù8D%0ù<D%9ù@D%/ùHD%0ùPD%1ù\D%2ùlD%3ù|D%:ùŒD%4ùD%5ù D%:ù°D%9ù´D%:ù¸DIÛù¼D%9ùÀDIÛùÈDIÜùÌDIßùðD%=úD%>úDIáú@D%:úlD%>ú°D%?úÐD%BúÔD%?úØD%BúÜD%CúèD%Dû D%Gû$D%Dû(D%Gû,D%HûD%Kû”D%Nû˜D%HûœD%Nû D%Oû¬D%SûÜD%PûäD%SûèD%PûìD%SûðD%TûøD%SûüD%TüD%UüD%VütD%\ü|D%]üÜD%^ý D%býD%_ýD%býD%_ýD%bý D%cýlD%dýÌD%eýüD%dþD%eþD%fþD%gþ D%hþPD%kþdD%lþtD%kþxD%lþ|D%oþ€D%pþÜD%qÿ D%vÿD%rÿD%vÿD%rÿD%vÿ D%qÿ$D%vÿ(D%„ÿPD%vÿTD%„ÿXD%vÿ\D%„ÿ`D%wÿhD%xÿ€D%yÿ°D%xÿ´D%yÿ¸D%zÿÌD%|ÿÐD%zÿØD%{ÿÜD%|ÿàD%}ÿôD%~(D%€XD%\D%€`D%lD%„tD%… D%„¤D%…¬D%ˆàDJ½äD%…èD%ˆìDJ½ðD%…ôDJ½øDJ¾DJ¿ D%ˆ D%‰„D%ŠŒD%‰D%Š”D%‹ÀD%ŠÄD%‹ÌD%ŒD% D%dD%ˆD%ŒD%D%”D%˜D% D%‘¸D%’èD%‘ìD%’ðD%“D%•D%“D%”D%•D%–,D%—`D%˜D%¸”D%™˜D%˜œD%¸ D%ÀD%žìD%ðD%žøD%¡,DJ½0D%ž4DJ½<DJ¾DDJ¿PD%¡dD%¢¨D%£°D%¢´D%£¸D%¤äD%£èD%¤ìD%¥ôD%¦üD%§TDJ½XDJ¾dDJ¿tD%§€DJ¿ˆD%§”D%¨¼D%©äD%«èD%©ðD%ªD%«D%¬DD%­pD%®œD%¯¬D%°ØD%¸D%¹4D%¸8D%¹<D%ºlD%İD%Ç´D%È$D%É,D%È0D%É4D%ÌDD%ÏHD%ÌLD%ÏPD%РD%ѰD%дD%ѸD%Ô¼DJ•ÄDJ–àDJ˜ôDJ™üDJ› DJœ DJ› DJœ $D%Ô LD%Õ D%Ú ÀD%Û D%Ü @D%Ý ˆD%Þ ´D%ß àD%à D%á D%à D%á D%å (D%æ €D%ç °D%è ´D%ç ¼D%í ÀD%î àD%ï ôD%ð D%ñ D%ò \D%ó D%ò ”D%ó ˜D%ô ÈD%ü D%ý D%þ <D& @D& LD& |D& €D& ÜD& ðD& ôD& øD& D& D& D& $D& 0D& <D& LD&XD&¬D&àD&D&$D&€D&D&”D&˜D&œD&ðD& D&4D&D& œD& D& ¤D&#¸D&$D&)DD&*D&-œD&* D&-¤D&.¬D&-°D&.´D&1¸D&2D&3@D&7DD&4HD&3LD&7PD&8`D&9pD&:|D&;ÜD&< D&;D&<D&= D&>XD&DD&E¨D&LÐD&MD&NPD&OD&PÐD&QD&RPD&S€D&T°D&UàD&XðD&Y D&ZPD&[€D&\°D&]àD&^D&_@D&`pD&a D&bÐD&d¡$%ø€¡V@%¡j@%¡|@%¡Ž€%|¡¡€%L¡¸€%P¡Ê€%T¡Ý€%X¡ô€%\¢ @%¢€%¢4€%Œ¢K€%ˆ¢`@%¢o€%`¢}€%d¢‹€%h¢™€% l¢§€%!p¢µ€%"t¢Ã€%#x¢Ñ@%$¢à@%%¢ï@%&¢ÿ€%'H£@%(£ &%*­”£8€£VÀø€£W@%:£eÀù¼£fàùÀ£g@%:£uÀùÈ£vàú£w@%:£…Àú@£†àúl£‡@%ˆ£“À䣔@J¼£¢À䣣à裤à裥@%ˆ£±Àð£²@J¼£ÀÀð£Áàô£Âàô£Ã@%ˆ£ÏÀø£Ð@J¼£ÞÀø£ßà £àà £á@%¡£íÀ0£î@J¼£üÀ0£ýà4£þà4£ÿ@%¡¤ À<¤ @J¼¤À<¤àd¤àd¤@%§¤)ÀX¤*à€¤+@%§¤7Àˆ¤8à”¤9@%Ô¤BÀĤC@J˜¤LÀô¤Mà L¤Nà L¤Oà(¤P$¨N(¤Q­°.0D]0Dj<D]@DjDD]HDjPD^TD]XDjdD]lDjtD_|D^€Dj„Dk˜Dl¼DmDn@DqpDrtDsxDv|Ds„DqˆDrDsœDv Ds¤Dv¬D¦ÐD¬èD²D¸(D¾@Dw`DÕœDxÀDyðD| D}`D€dDD™”D›ÐDœØDäD  DJ•PDJ–lDJ˜€DJ™ˆDJ› DJœ¬DJ›°DJœ´D¥àD¦D§(D¨`DJ•hDJ–„DJ˜ DJ™¨DJ›ÀDJœÌDJ›ÐDJœÔD«D¬0D­HD®€DJ•ŒDJ–¨DJ˜ÀDJ™ÈDJ›àDJœìDJ›ðDJœôD± D²PD³hD´ DJ•¬DJ–ÈDJ˜àDJ™èDJ› DJœ DJ› DJœ D· @D¸ pD¹ ˆDº ÀDJ• ÌDJ– èDJ˜!DJ™!DJ›! DJœ!,DJ›!0DJœ!4D½!`D¾!D¿!¨DÀ!àDÃ!äDÀ!ìDÃ!ôDÈ"DË"4DÌ"tDÍ"¨DÎ"äDÏ#DÐ#<DÒ#hDÕ#€DÖ# DØ#ÐDÛ#àDÜ$ DÝ$PDÞ$€Dß$°Dà$ðDâ%4¤f$]0¤¢@]¤¶ ]œ¤È ] ¤Ú€^8¤ê€_<¤ÿ@a¥@b¥@c¥.@d¥=@e¥N@f¥_@h¥n&i­°¥†€¥¤À0¥¥@J˜¥®À€¥¯à॰@J˜¥¹À ¥ºà¥»@J˜¥ÄÀÀ¥Åà ¥Æ@J˜¥ÏÀà¥Ðà @¥Ñ@J˜¥ÚÀ!¥Ûà!`¥Üà%T¥Ý$ $N%T¥Þ( 'ºÐ¥í( (ºÔ¥ü( )ºØ¦( *ºÜ¦&( +ºà¦7( кä¦u( ׺覮( åºì¦ð( íºð§!( ôºô§W( ûºø§Œ& þºD§À& ÿº@§ü& ºP¨4& ºX¨k& ºH¨«& ºT¨Ú& ºL©& º\©I& º`©|& ºd©¸& …D©Ê& £|©Ü&¢©î&§8ª&¡ðª&…@ª$&¡àª6&¡ÄªH&§dªZ&§Øªm&¡ ª€&¦Àª“&¡ª¦&¡Tª¹&¡<ªÌ&¤¼ªß&¡ªò&¤ä«&¥ì«&§«+& ¤«>&!©¸«Q&"¤Ø«d&#¤ð«w&$©X«Š&% ô«&& Ð«°&'¥l«Ã&(¦«Ö&)¨D«é&*§„«ü&+¦|¬&,¨¬¬"&-¦P¬5&. ¨¬H&/£(¬[&0¦ˆ¬n&1§t¬&2¤T¬”&3¦h¬§&4¥x¬º&5¦T¬Í&6£ ¬à&7¨¼¬ó&8¦ô­&9¥Ð­&: ,­,&;¦œ­?&<¤¤­R&=¨$­e&>£H­x&?¢l­‹&@ ­ž&A¢Ô­±&B¦­Ä&C¢°­×&D¢œ­ê&E¥à­ý&F¥8®&G¥˜®#&H¥Œ®6&I¥D®I&J¦Ì®\&K¤”®o&L¤„®‚&M¥\®•&N¥ ®¨&O¦Ø®»&P£°®Î&Q§ ®á&R§@®ô&S¢d¯&T§ ¯&U©L¯-&V¥°¯@&W¢ø¯S&X¢à¯f&Y¥P¯y&Z¤x¯Œ&[¦@¯Ÿ&\©ˆ¯²&]¢Ì¯Å&^Ÿà¯Ø&_§4¯ë&`¥¯þ&aŸÐ°&b§à°$&cŸ´°7&dŸ¤°J&eŸˆ°]&f¦°p&g¤ü°ƒ&h¦L°–&i¦ð°©&j©@°¼&k¨„°Ï&l¤`°â&m¥,°õ&nŸT±&o¤Ð±&p¥È±0&q¥„±D&r¢`±X&sŸL±l&t…H±€&uŸ,±”&vŸ±¨&w§ ±¼&x¢4±Ð&y¤ ±ä&z£¨±ø&{£X² &|žð² &}ž¼²4&~¥ ²H&¥ô²\&€¨\²p&£t²„&‚£Œ²˜&ƒ£²¬&„¨È²À&…©0²Ô&†£²è&‡¢ì²ü&ˆ¢|³&‰žˆ³$&Š£À³8&‹£Ð³L&Œ£à³`&£ì³t&Ž£ü³ˆ&£ ³œ&¨³°&‘¨³Ä&’¦0³Ø&“§ô³ì&”§Ä´&•¢,´&–žx´(&—§T´<&˜©”´P&™¨x´d&š¨h´x&›žT´Œ&œ¤H´ &£@´´&ž¦$´È&Ÿ¨P´Ü& žH´ð&¡¤µ&¢¨èµ&£¢Œµ,&¤žDµ@&¥ž,µT&¦© µh&§žµ|&¨¤Äµ&©¨ µ¤&ª¤@µ¸&«øµÌ&¬¥Àµà&­¦µô&®¤h¶&¯¥¶&°Ð¶0&±¥¸¶D&²¦8¶X&³œÈ¶l&´©¨¶€&µ£T¶”&¶œŒ¶¨&·¨¤¶¼&¸©h¶Ð&¹œT¶ä&º¢¸¶ø&»œ(· &¼œ· &½¦¨·4&¾£4·H&¿›ˆ·\&À…X·p&Á›p·„&›X·˜&Ã…P·¬&Ä›8·À&Å›·Ô&Æ¢X·è&ǚطü&ȧ`¸&É…L¸$&Ê¢”¸8&˚иL&Ìš´¸`&Íš¨¸t&Χ̸ˆ&Ïš¤¸œ&Кœ¸°&ÑšH¸Ä&Òš¸Ø&Ó£˜¸ì&Ô§¸¹&Õ¢D¹&Öš ¹(&רô¹<&Ø©t¹P&Ù™ø¹d&Ú¢ˆ¹x&Û¦ü¹Œ&ܙ习&Ý£d¹´&Þ˜ ¹È&ß§¹Ü&à˜€¹ð&á˜xº&⤰º&ã˜lº,&ä¤4º@&媰ºT&æ¨4ºh&窌º|&è—4º&馤º¤&êªôº¸&ë—ºÌ&ì•„ºà&íªàºô&îªÌ»&視»&ð•l»0&ñ•T»D&òª”»X&ó•@»l&ô•<»€&õ¥Ø»”&ö•»¨&÷¤»¼&ø¢L»Ð&ù¥4»ä&ú•»ø&ûªx¼ &ü”„¼ &ý¨Ø¼4&þªd¼H&ÿ¢¤¼\&© ¼p&”l¼„&”P¼˜&”L¼¬&e ¼À&a°¼Ô&¤Ü¼è&¤ ¼ü(  ºü½(  »½7(  »½W(  »½p(  » ½“( »½­( »½Ì( »½å( »½ÿ( » ¾( »$¾8( »(¾Z( »,¾~( »0¾˜( »4¾·( »8¾Ô( »<¾ï( »@¿ ( »D¿#( »H¿E( »L¿_( »P¿x( »T¿”(  »X¿¬( !»\¿Ä( "»`¿Þ( #»d¿ü( $»hÀ( %»lÀ/( &»pÀK( '»tÀp( (»xÀ( )»|À¦( *»€À¾( +»„ÀÓ( ,»ˆÀí( -»ŒÁ( .»Á/( /»”ÁH( 0»˜Ág( 1»œÁ…( 2» Á˜( 3»¤Á±( 4»¨ÁÓ( 5»¬Áè( 6»°Áû( 7»´Â( 8»¸Â=( 9»¼ÂT( :»ÀÂh( ;»ÄÂ}( <»ÈÂ( =»Ì¶( >»ÐÂÐ( ?»ÔÂé( @»Øà ( A»Üà ( B»àÃ5( C»äÃP( D»èÃf( E»ìÃ~( F»ðÞ( G»ôþ( H»øÃÐ( I»üÃâ( J¼Ãú( K¼Ä( L¼Ä%( M¼ Ä>( N¼ÄR( O¼Är( P¼Ĉ( Q¼Ä ( R¼ ĵ( S¼$ÄÎ( T¼(Äâ( U¼,Äö( V¼0Å ( W¼4Å ( X¼8Å6( Y¼<ÅM( Z¼@Åi( [¼DÅ( \¼HŘ( ]¼LÅ®( ^¼PÅÆ( _¼TÅÞ( `¼XÅú( a¼\Æ( b¼`Æ-( c¼dÆE( d¼hÆV( e¼lÆj( f¼pÆ…( g¼tÆ›( h¼xƸ( i¼|ÆÒ( j¼€Æí( k¼„Ç( l¼ˆÇ( m¼ŒÇ.( n¼ÇD( o¼”Ç\( p¼˜Çp( q¼œÇ‹( r¼ Ǧ( s¼¤Ǹ( t¼¨ÇÓ( u¼¬Çï( v¼°È ( w¼´È&( x¼¸È:( y¼¼ÈU( z¼ÀÈm( {¼Äȃ( |¼ÈÈ( }¼ÌÈÀ( ~¼ÐÈÔ( ¼ÔÈå( €¼ØÈ÷( ¼ÜÉ( ‚¼àÉ!( ƒ¼äÉ;( „¼èÉW( …¼ìÉq( †¼ðÉ( ‡¼ôɪ( ˆ¼øÉÇ( ‰¼üÉÝ( нÉû( ‹½Ê( Œ½Ê1( ½ ÊH( ޽Êe( ½Ê€( ½Ê“( ‘½ʬ( ’½ ÊÃ( “½$ÊÞ( ”½(Êù( •½,Ë( –½0Ë%( —½4Ë=( ˜½8ËV( ™½<Ëj( š½@Ë‚( ›½DËœ( œ½H˶( ½LËË( ž½PËì( Ÿ½TÌ(  ½XÌ( ¡½\Ì/( ¢½`ÌE( £½dÌZ( ¤½hÌm( ¥½lÌ…( ¦½pÌ¡( §½t̶( ¨½xÌÇ( ©½|ÌÛ( ª½€Ìí( «½„Í( ¬½ˆÍ( ­½ŒÍ9( ®½ÍO( °½”Í`( ±½˜Íq( ²½œÍ‚( ³½ Í“( ´½¤Í¥( µ½¨Í·( ¶½¬ÍÉ( ·½°ÍÛ( ¸½´Íí( ¹½¸Íÿ( º½¼Î( »½ÀÎ#( ¼½ÄÎ5( ½½ÈÎG( ¾½ÌÎY( ¿½ÐÎk( À½ÔÎ}( Á½ØÎ( ½ÜΡ( ýàγ( ĽäÎÆ( ŽèÎÙ( ƽìÎì( ǽðÎÿ( ȽôÏ( ɽøÏ%( ʽüÏ8( ˾ÏK( ̾Ï^( ;Ïq( ξ Ï„( Ͼϗ( оϪ( ѾϽ( Ò¾ÏÐ( Ó¾ Ïã( Ô¾$Ïö( Õ¾(Ð ( Ö¾,Ð( ×¾0Ð/( ؾ4ÐB( Ù¾8ÐU( Ú¾<Ðh( Û¾@Ð{( ܾDÐŽ( ݾHС( Þ¾Lд( ß¾PÐÇ( à¾TÐÚ( á¾XÐí( â¾\Ñ( ã¾`Ñ( ä¾dÑ&( å¾hÑ9( æ¾lÑL( ç¾pÑ_( è¾tÑr( é¾xÑ…( ê¾|ј( 뾀ѫ( 쾄Ѿ( í¾ˆÑÑ( Ñä( ï¾Ñ÷( ð¾”Ò ( ñ¾˜Ò( ò¾œÒ0( ó¾ ÒC( ô¾¤ÒV( õ¾¨Òi( ö¾¬Ò|( ÷¾°Ò&ù…\Ò©( ë¾´Ò¹( 쾸ÒÉ( í¾¼ÒÙ( î¾ÀÒé( ï¾ÄÒû€Ó€Ó:€ÓZ€Óy€Ó™€Ó¸€ÓØ€Óø€Ô€Ô7€ÔW€Ôv€Ô–€Ô¶€ÔÖ€Ôõ€Õ€Õ4€ÕS€Õr€Õ‘€Õ±€ÕЀÕð€Ö€Ö0€ÖP€Öo€ÖŽ€Ö®€ÖÍ€Öì€× €×+€×K€×k€׊€ת€×Ê€×ê€Ø €Ø)€ØH€Øh€؇€ئ€ØÇ€Øæ€Ù€Ù&€ÙE€Ùe€Ù…€Ù¥€ÙÅ€Ùä€Ú€Ú"€ÚA€Ú`€Ú€Úž€Ú¾€ÚÞ€Úþ€Û€Û>€Û^€Û~€Ûž€Û¾€ÛÝ€Ûý€Ü€Ü;€ÜZ€Üz€Üš€ܺ€ÜÙ€Üø€Ý€Ý7€ÝV€Ýv€Ý–€ݶ€ÝÖ€Ýö€Þ€Þ5€ÞU€Þt€Þ“€Þ³€ÞÓ€Þò€ß€ß1€ßP€ßo€ߎ€ß­€ßÌ€ßë€à €à+€àK€àk€àŠ€à©€àÉ€àé€á €á)€áH€ág€ᆀ᥀áÄ€áä€â€â#€âB€âa€â€â¡€âÁ€âá€ã€ã!€ã@€ã`€ã€㞀ã¾€ãÝ€ãü€ä€ä;€ä[€äz€䚀亀äÙ€äø€å€å6€åV€åu€å•€å´€åÓ€å󀿀æ3€æR€ær€æ‘€æ°€æÏ€æï€ç€ç.€çN€çm€猀ç­€çÍ€çì€è €è+€èK€èk€è‹€è«€èË€èë€é €é,€éK€ék€é‹€骀éÊ€éê€ê €ê)€êH€êg€ꆀꥀêÅ€êä€ë€ë"€ëA€ëa€ë€ë¡€ëÁ€ëà€ì€ì €ì@€ì`€ì€잀ì¾€ìÞ€ìÿ€í€í?€í^€í~€힀í¾€íÝ€íý€î€î=€î\€î|€î½€îÝ€îý€ï€ï=€ï]€ï}€ï€ï¼€ïÛ€ïû€ð€ð9€ðX€ðw€ð—€ð¸€ðØ€ðø€ñ€ñ8€ñX€ñx€ñ—€ñ·€ñ×€ñö€ò€ò8€ò^€ò§( ð¾Èò¹( ñ¾ÌòÉ( ò¾ÐòÙ( ó¾Ôòé( ô¾Øòú( õ¾Üó ( ö¾àó( ÷¾äó-( ø¾èó>( ù¾ìóO( ú¾ðó`( û¾ôóq( ü¾øó‚( ý¾üó“( þ¿ó¤( ÿ¿óµ( ¿óÆ( ¿ ó×( ¿óè( ¿óù( ¿ô ( ¿ô( ¿ ô,( ¿$ô=( ¿(ôN(  ¿,ô_(  ¿0ôp(  ¿4ô(  ¿8ô’(  ¿<ô£( ¿@ô´( ¿DôÅ( ¿HôÖ( ¿Lôç( ¿Pôø( ¿Tõ ( ¿Xõ( ¿\õ+( ¿`õ<( ¿dõM( ¿hõ^( ¿lõo( ¿põ€( ¿tõ‘( ¿xõ¢( ¿|õ³( ¿€õÄ( ¿„õÕ(  ¿ˆõæ( !¿Œõ÷( "¿ö( #¿”ö( $¿˜ö*( %¿œö;( &¿ öL( '¿¤ö]( (¿¨ön( )¿¬ö( *¿°ö( +¿´ö¡( ,¿¸ö²( -¿¼öÃ( .¿ÀöÔ&\… ÷&儨÷W& „¤÷¡& K}¸÷ê& ¯dXø+&þtàøe&˜t¨øŸ&,t\øØ&s˜ù&*s`ù[&ws8ùŸ&ãnùä&Nh°ú)&¹h€úp&ƒhúª&6g˜úæ& gdû#&"Xbäû_&#­b¤û&$Jb|ûÙ&&u€pü&&•€0üW&&Ýøü™&+÷{ìüÍ&,µ{¨ý&. {hýA&.Ã{4ý|&.í{ý¶&/‘zØýë&/¶z¸þ!&/öztþb&2@z4þž&2zzþâ&2Úyèÿ&5vy¼ÿV&7‰yxÿ&9 yHÿË&9-yÿÿ&9ÅxÐ9&:3ª<n&=nªª&@ç„à& @ó¹¨& A¹€.& A,¹tU& A2¹d{( Ai¿Ä¸€Ø€ø€€8€X€x€˜€¸€Ù€ù€€;€]€}€ž€¿€߀ÿ€€?€_€€Ÿ€¿€߀ÿ€€?€_€€Ÿ€¿€߀ÿ€€?€_€€Ÿ€¿€߀þ& A™¸x<& A¸Ìj& Aɸ¤š& AÖ¸˜É& Aܸˆ÷&B*‚41& B3·à[& B_·¸‡& Bl·¬²& Br·œÜ( B©¿È € 3€ R&C ¨ ‹&C(~¸ Ä&C7€Ü í&Cc€´ &Cp€¨ B& Cv·Œ k( C­¿Ì ¬€ Ë€ ë&Cå}˜ -& Cê¶ô _& D¶Ì “& D#¶À Æ& D)¶° ø( D`¿ð (€ G&Dîw€ x&Ev ©&E|@ Ê&EG| í&ET|  & EZ¶  0( E‘¿ü e€ …€ ¥&Eïfd Û&FeØ&F exG& F¶m&F=u0•&FJu$¼& FPµøâ&F³d(&F¹d\& F¾µ`‰&Fêd¸&F÷d„æ& FýµP( G4ÀG€g€†€¥€Ä€ã&Gfb<&GmaìM&Gtaˆ‚& Gy´¸§&G¥cÎ&G²c ô& G¸´¨& H³¼W& H´…& HD³èµ& HQ³Üä& HW³Ì&H©È)&IЫB A9u Aã° Byç C} D0\ EaŠ FW½ G÷ G¿) H^d€ƒ€¢€Á€à€ÿ€d%Td%`Gd%`^f_<n€.%`D%`D%`|$%`—@¥@³€Ý€ì€û$ N%l.%pD %pD%pü$ %p@ $@ 2$ N%|.%€D%€D%ˆD%ŒD%œD%°D%´D%¸D%ÀD%ÌD%ÔD%àD%ðD!&3$%€D@S@c@l€w€†€•€¯€Å€.@7@BÀ%€Cà&D$œN&.& D$& D*& D%&$D&&(D'&,D(&0D*&4D)&8D,&<E$$& Z@#e@#r@#~@#Š@#˜@#¥€¶€Ñ€\$$N&D.&PD2&PD2&˜D6&¤D7&¬D9&ÌD:&ÔD9&ØD:&ÜD;&à]„&ðDÛ&ðr„'$D;'$D<',D@'tD'€D'„D'ˆD'D'œD@'¤D'ÀD'ÌD'ÐDA'ÜDB'øDC(DJ(,DK(8DL(<DO(PDP(XDT(€DU(œDV(¼DX(ØD](øD`)De)Df)DDg)`Dh)xDj)°Dl)ÀD')ÈDp)ÌD&)ÐD%)ÔD))ØD&)ÜD*)àD%)äD()èD))ìD*)ðDe)ôD))øDq)üDe*Dq* De*Dq*De*Df*$Ds*HDu*TDv*\D8*`Dy*xDz*€D*ˆDh*œD|*À‰$2&Pž@/©@/²@/Â@/Î@0Þ@0 ò@0@0 18% 1<@@3I€Y€j€{€€â€y€Š€·€î€þ€€ €1€B€S€p€€«€Á€ê€ú€ €€+€@€r€‹€3Hš€3L¥@3±@3À€3PÐ@3ß@3í€4¤ø€€%€5€¤0€5\>€5dM€5T\@1s@1ŽÀ&P@;š€@»€Û€÷€ À&ð à'$ @ À'€ à'¤ !@ *À'À +à'Ü ,@l  :À)È ;à)Ì <@l  JÀ)Ð Kà)ô L@l  ZÀ)ø [à)ü \@ eÀ*ˆ fà*œ gà*à h$N*à.*àD*àD+4D‡+pDˆ+ˆ i„+ŒDæ+Œ ~„+¨D‰+¨D‹+èDŒ+øD,DŽ,D,$DŽ,(D,,D,4D,@D,LD,PD,TD,\D,hD,pD,|D,€D‘,ŒD,˜D,¤D,¨D,¬D,´D,ÄD,ÌD,ØD,ÜD”,ìD•,ôD”,øD“,üD”-D•-D—-(D˜-0Dš-8D›-TDŸ-pD -ŒD£-°D¤-ÈD¥-ÌD¤-ÐD¥-ÔD¤-ØD¥-ÜD¤-àD§-äD¨-üD©.D¨.D©.D¨. D©.D¬.D®.HD¯.\D°.lD%.|D±.€D*.ŒD%.D².”D%.˜D².œD±. D&.¨D*.¬D).°D'.´D(.¸D¶.ÀD·.ÄD¸.ÈDº.ÐD».ÜD¼.èD½.ôD®/D/D®/ D¿/,DÀ/0D*/@DÀ/DDÂ/HDÀ/LD%/XD*/\D&/`D'/dD(/hD)/lD‡/€DÉ/„DÊ/ŒD®/˜Dš/ÈD›0Dš0HDÎ0Œ •$*à ¨ ~…Ø ³@~ Ã@~  Ï@ Ý@ ë …ì ø …ð!  €…ô!@‚ !&€‚T!5€‚L!B€‚P!R€‚H!`€‚X!k€‚\!w@‚!„@ƒ!@ƒ!œ@ƒ!¬@ƒ!»€ƒ…h!Ë@„!Ý€…h!è@†!÷@†"€†h"€†¨"&€†`"5€†è"C€†("R€"^À*à"_@ˆ"jÀ+Œ"kà+¨"l@"uÀ,@"và,Œ"w@"€À,˜"à,ì"‚€›h"À-h"‘à-p"’@± "Ÿ€"¾@± "Ê@±"ÕÀ.|"Öà.€"×@± "ä@± "ð@±"ûÀ.Œ"üà.”"ý@± # @± #@±#!À.˜#"à.œ##@± #0@± #<@±#GÀ.¨#Hà.À#I@À #V@À #b@À#mÀ/@#nà/D#o@À #|@À #ˆ@À#“À/X#”à/€#•€šh#£À/È#¤à0#¥€›h#³À0#´à0H#µ€šh#ÃÀ0H#Äà0Œ#Åà0¬#Æ$ÌN0¬#Çd0¬0C`JƒTu‚”¨t×|ØuX4`È^}øŒd¸·`êc@N1 a,P|:‘$¢´5ðÄ€Ø#` Ý%€ïð @öP0`I   ƒ&P ’*à]ðpà| ðŒà¢°° 0Äð×° è& ð ¨%p ÷%`  à%0<(P@d`-þJþaþoþ{þˆþžþ´þÀþÐþæþóþþþ'þ5þOþ_þnþ}þyþŽþ¥þÄþÚþéþûþŠþ þþ7þLþaþtþþ…þ’þ¦þ³þÇþØþæþöþþþþ(þ=þOþ]þnþ‚þ•þ¬þÁþÏþáþòþ þ þ .þ @þ Uþ fþ xþ þ ¢þ ±þ Æþ Úþ ïþ þ þ ,þ >þ Lþ _þ tþ þ ¨þ ·þ Êþ Üþ îþ þ þ þ -þ ;þ  Kþ [þ kþ ¯µ½ÅÌÓäëñ  , {" Ÿ): 5 ¼ Ä Ì = Ô¯¸fP¯´f P¯°fP¯¬eØPfffff eÉfff$ff"ff%fffeÃeäeÅeñeÛeÇeîeùe¾eÁeóf eþeæf+eöeÂf(eáeÈeòeèeïeúe½eûeµeýff f#eËe¸eÝeÆeôeéeÞeõeêeëeàfff'e¼feçff eÙeåeÄe¶e÷eðfeÚeºf)f!feÀe»eüeÊeìf eãe¹eøf&fff*fffff eÉfff$ff"ff%fffeÃeäeÅeñeÛeÇeîeùe¾eÁeóf eþeæf+eöeÂf(eáeÈeòeèeïeúe½eûeµeýff f#eËe¸eÝeÆeôeéeÞeõeêeëeàfff'e¼feçff eÙeåeÄe¶e÷eðfeÚeºf)f!feÀe»eüeÊeìf eãe¹eøf&fff*eÐfe×e°eÏfeØeífeÜfeÒeÑe·eÔeÎf eÕeÓeßeÖee­e¿eÿeÍeÌffeâe‡f__dyld_func_lookupdyld_stub_binding_helper__mh_bundle_header_C_int_max_build_nested_list_build_nested_list_inplace_find_file_intervals_find_file_start_find_index_start_find_intervals_find_overlap_start_find_suboverlap_start_free_interval_dbfile_free_interval_iterator_imstart_qsort_cmp_interval_iterator_alloc_interval_map_alloc_read_binary_files_read_imdiv_read_intervals_read_subheader_block_read_sublist_reorient_intervals_repack_subheaders_reset_interval_iterator_save_text_file_sublist_qsort_cmp_target_qsort_cmp_text_file_to_binaries_write_binary_files_write_binary_index_write_padded_binary_PyErr_SetString_PyExc_MemoryError_PyExc_ValueError___sF_calloc_fclose_fgets_fopen_fprintf$LDBL128_fread_free_fscanf$LDBL128_fseeko_fwrite_memcpy_memmove_qsort_sprintf$LDBL128_sscanf$LDBL128___pyx_type_4pygr_11cnestedlist_IntervalDB___pyx_type_4pygr_11cnestedlist_IntervalDBIterator___pyx_type_4pygr_11cnestedlist_IntervalFileDB___pyx_type_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_type_4pygr_11cnestedlist_NLMSA___pyx_type_4pygr_11cnestedlist_NLMSANode___pyx_type_4pygr_11cnestedlist_NLMSASequence___pyx_type_4pygr_11cnestedlist_NLMSASlice___pyx_type_4pygr_11cnestedlist_NLMSASliceIterator___pyx_type_4pygr_11cnestedlist_NLMSASliceLetters_initcnestedlist_PyArg_ParseTupleAndKeywords_PyCObject_FromVoidPtr_PyClass_Type_PyCode_New_PyDict_Copy_PyDict_DelItemString_PyDict_GetItemString_PyDict_New_PyDict_SetItem_PyDict_SetItemString_PyDict_Type_PyDict_Update_PyErr_ExceptionMatches_PyErr_Fetch_PyErr_Format_PyErr_NormalizeException_PyErr_Occurred_PyErr_Restore_PyErr_SetNone_PyErr_SetObject_PyErr_WriteUnraisable_PyEval_CallObjectWithKeywords_PyExc_AssertionError_PyExc_IOError_PyExc_IndexError_PyExc_KeyError_PyExc_NameError_PyExc_NotImplementedError_PyExc_OverflowError_PyExc_StopIteration_PyExc_SystemError_PyExc_TypeError_PyFile_Type_PyFloat_FromDouble_PyFrame_New_PyImport_AddModule_PyInstance_Type_PyInt_AsLong_PyInt_FromLong_PyInt_Type_PyIter_Next_PyList_New_PyList_Type_PyLong_FromLongLong_PyModule_GetDict_PyNumber_Add_PyNumber_Divide_PyNumber_Remainder_PyNumber_Subtract_PyObject_CallFunction_PyObject_CallObject_PyObject_Cmp_PyObject_DelItem_PyObject_GC_Del_PyObject_GetAttr_PyObject_GetAttrString_PyObject_GetItem_PyObject_GetIter_PyObject_IsInstance_PyObject_IsTrue_PyObject_SetAttr_PyObject_SetAttrString_PyObject_SetItem_PyObject_Size_PySequence_Contains_PySequence_DelItem_PySequence_DelSlice_PySequence_GetItem_PySequence_GetSlice_PySequence_SetItem_PySequence_Tuple_PySlice_Type_PyString_AsString_PyString_FromString_PyString_FromStringAndSize_PyString_InternInPlace_PyString_Type_PyThreadState_Get_PyTraceBack_Here_PyTraceBack_Type_PyTuple_GetSlice_PyTuple_New_PyTuple_Type_PyType_IsSubtype_PyType_Ready_Py_InitModule4__Py_NoneStruct__Py_TrueStruct__Py_ZeroStruct_memset_readMAFrecord_read_axtnet_realloc_seqidmap_qsort_cmp_strcmp_strcpy_strdup_strncmp_findseqID_save_interval_seqnameID_qsort_cmp__DefaultRuneLocale___maskrune_isalpha_strcat_strlendyld__mach_header/Users/administrator/Desktop/pygr-0.8.0/pygr/intervaldb.cgcc2_compiled.:t(0,1)=(0,1)read_intervals:F(0,2)n:P(0,3)ifile:P(0,4)i:r(0,3)int:t(0,3)=r(0,3);-2147483648;2147483647;:t(0,2)=*(0,5):t(0,4)=*(0,6)IntervalMap:t(0,5)=(0,7)FILE:t(0,6)=(0,8):T(0,7)=s24start:(0,3),0,32;end:(0,3),32,32;target_id:(0,3),64,32;target_start:(0,3),96,32;target_end:(0,3),128,32;sublist:(0,3),160,32;;__sFILE:T(0,8)=s88_p:(0,9),0,32;_r:(0,3),32,32;_w:(0,3),64,32;_flags:(0,10),96,16;_file:(0,10),112,16;_bf:(0,11),128,64;_lbfsize:(0,3),192,32;_cookie:(0,12),224,32;_close:(0,13),256,32;_read:(0,14),288,32;_seek:(0,15),320,32;_write:(0,16),352,32;_ub:(0,11),384,64;_extra:(0,17),448,32;_ur:(0,3),480,32;_ubuf:(0,18),512,24;_nbuf:(0,19),536,8;_lb:(0,11),544,64;_blksize:(0,3),608,32;_offset:(0,20),640,64;;:t(0,9)=*(0,22)short int:t(0,10)=@s16;r(0,10);-32768;32767;__sbuf:T(0,11)=s8_base:(0,9),0,32;_size:(0,3),32,32;;:t(0,12)=*(0,1):t(0,13)=*(0,23):t(0,14)=*(0,24):t(0,15)=*(0,25):t(0,16)=*(0,26):t(0,17)=*(0,27):t(0,18)=ar(0,28);0;2;(0,22):t(0,19)=ar(0,28);0;0;(0,22)__darwin_off_t:t(0,21)=(0,29)fpos_t:t(0,20)=(0,21)unsigned char:t(0,22)=@s8;r(0,22);0;255;:t(0,23)=f(0,3):t(0,24)=f(0,3):t(0,25)=f(0,20):t(0,26)=f(0,3):t(0,27)=xs__sFILEX:long unsigned int:t(0,28)=r(0,28);0;037777777777;__int64_t:t(0,29)=(0,30)long long int:t(0,30)=@s64;r(0,30);01000000000000000000000;0777777777777777777777;im:r(0,2)void:t(0,1)errstr:(0,31)errstr:(0,31):t(0,31)=ar(0,28);0;1023;(0,32)char:t(0,32)=r(0,32);0;127;imstart_qsort_cmp:F(0,3)void_a:P(0,33)void_b:P(0,33):t(0,33)=*(0,34):t(0,34)=k(0,1)sublist_qsort_cmp:F(0,3)void_a:P(0,33)void_b:P(0,33)target_qsort_cmp:F(0,3)void_a:P(0,33)void_b:P(0,33)reorient_intervals:F(0,1)n:P(0,3)im:P(0,2)ori_sign:P(0,3)tmp:r(0,3)interval_map_alloc:F(0,2)n:P(0,3)im:r(0,2)errstr:(0,31)errstr:(0,31)find_overlap_start:F(0,3)start:P(0,3)end:P(0,3)im:P(0,2)n:P(0,3)l:r(0,3)mid:r(0,3)r:r(0,3)find_index_start:F(0,3)start:P(0,3)end:P(0,3)im:P(0,35)n:P(0,3)l:r(0,3):t(0,35)=*(0,36)IntervalIndex:t(0,36)=(0,37):T(0,37)=s8start:(0,3),0,32;end:(0,3),32,32;;mid:r(0,3)r:r(0,3)interval_iterator_alloc:F(0,38):t(0,38)=*(0,39)IntervalIterator:t(0,39)=(0,40)IntervalIterator_S:T(0,40)=s32i:(0,3),0,32;n:(0,3),32,32;nii:(0,3),64,32;ntop:(0,3),96,32;i_div:(0,3),128,32;im:(0,2),160,32;up:(0,41),192,32;down:(0,41),224,32;;:t(0,41)=*(0,40)errstr:(0,31)free_interval_iterator:F(0,3)it:P(0,38)it2:r(0,38)it_next:r(0,38)reset_interval_iterator:F(0,38)it:P(0,38)read_imdiv:F(0,3)ifile:P(0,4)imdiv:P(0,2)div:P(0,3)i_div:P(0,3)ntop:P(0,3)block:r(0,3)ipos:r(0,42)off_t:t(0,42)=(0,21)read_sublist:F(0,2)ifile:P(0,4)subheader:P(0,43)im:P(0,2)ipos:r(0,42):t(0,43)=*(0,44)SublistHeader:t(0,44)=(0,45):T(0,45)=s8start:(0,3),0,32;len:(0,3),32,32;;errstr:(0,31)errstr:(0,31)read_subheader_block:F(0,3)subheader:P(0,43)isub:P(0,3)nblock:P(0,3)nsubheader:P(0,3)ifile:P(0,4)ipos:r(0,42)start:r(0,46)long int:t(0,46)=r(0,46);-2147483648;2147483647;write_padded_binary:F(0,3)im:P(0,2)n:P(0,3)div:P(0,3)ifile:P(0,4)i:r(0,3)npad:r(0,3)repack_subheaders:F(0,3)im:P(0,2)n:P(0,3)div:P(0,3)subheader:P(0,43)nlists:P(0,3)j:r(0,3)errstr:(0,31)errstr:(0,31)errstr:(0,31)write_binary_index:F(0,3)im:P(0,2)n:P(0,3)div:P(0,3)ifile:P(0,4)i:r(0,3)j:r(0,3)nsave:r(0,3)read_binary_files:F(0,47)filestem:P(0,48)err_msg:P(0,48)subheader_nblock:P(0,3)n:(0,3):t(0,47)=*(0,49):t(0,48)=*(0,32)IntervalDBFile:t(0,49)=(0,50):T(0,50)=s48n:(0,3),0,32;ntop:(0,3),32,32;nlists:(0,3),64,32;div:(0,3),96,32;nii:(0,3),128,32;ii:(0,35),160,32;subheader:(0,43),192,32;subheader_file:(0,51)=xsSubheaderFile:,224,128;ifile_idb:(0,4),352,32;;:T(0,52)=s16subheader:(0,43),0,32;nblock:(0,3),32,32;start:(0,3),64,32;ifile:(0,4),96,32;;SubheaderFile:t(0,51)=(0,52)ntop:(0,3)div:(0,3)nlists:(0,3)nii:(0,3)path:(0,53)subheader:r(0,43)idb_file:r(0,47)ifile:r(0,4):t(0,53)=ar(0,28);0;2047;(0,32)errstr:(0,31)errstr:(0,31)errstr:(0,31)errstr:(0,31)errstr:(0,31)free_interval_dbfile:F(0,3)db_file:P(0,47)save_text_file:F(0,3)filestem:P(0,48)basestem:P(0,48)err_msg:P(0,48)ofile:P(0,4)i:r(0,3)n:(0,3)ntop:(0,3)div:(0,3)nlists:(0,3)nii:(0,3)npad:r(0,3)path:(0,53)im:(0,5)ii:(0,36)subheader:(0,44)ifile:r(0,4)text_file_to_binaries:F(0,3)infile:P(0,4)buildpath:P(0,48)err_msg:P(0,48)i:r(0,3)n:(0,3)ntop:(0,3)div:(0,3)nlists:(0,3)nii:(0,3)npad:r(0,3)path:(0,53)line:(0,54)filestem:(0,53)im:(0,5)ii:(0,36)subheader:(0,44)ifile:r(0,4):t(0,54)=ar(0,28);0;32767;(0,32)find_suboverlap_start:F(0,3)start:P(0,3)end:P(0,3)isub:P(0,3)im:P(0,2)subheader:P(0,43)nlists:P(0,3)i:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)find_file_start:F(0,3)it:P(0,38)start:P(0,3)end:P(0,3)isub:P(0,3)ii:P(0,35)nii:P(0,3)subheader:P(0,43)nlists:P(0,3)subheader_file:p(0,55)ntop:p(0,3)div:p(0,3)ifile:p(0,4)i_div:r(0,3):t(0,55)=*(0,51)offset:r(0,3)offset_div:r(0,3)subheader_file:r(0,55)ntop:r(0,3)div:r(0,3)ifile:r(0,4)r:r(0,3)ifile:r(0,4)nblock:r(0,3)subheader:r(0,43)ipos:r(0,42)start:r(0,46)ifile:r(0,4)nblock:r(0,3)subheader:r(0,43)ipos:r(0,42)start:r(0,46)im:r(0,35)r:r(0,3)im:r(0,35)r:r(0,3)im:r(0,35)r:r(0,3)errstr:(0,31)errstr:(0,31)ntop:r(0,3)i_div:r(0,3)ipos:r(0,42)ntop:r(0,3)i_div:r(0,3)ipos:r(0,42)n:r(0,3)im:r(0,2)l:r(0,3)r:r(0,3)n:r(0,3)im:r(0,2)l:r(0,3)r:r(0,3)_err_msg.7580write_binary_files:F(0,48)im:P(0,2)n:P(0,3)ntop:P(0,3)div:P(0,3)subheader:P(0,43)nlists:P(0,3)filestem:P(0,48)i:r(0,3)npad:r(0,3)nii:r(0,3)path:(0,53)ifile:r(0,4)ifile_subheader:r(0,4)sh_tmp:(0,44)err_msg:V(0,31)i:r(0,3)npad:r(0,3)im:r(0,2)i:r(0,3)npad:r(0,3)im:r(0,2)i:r(0,3)npad:r(0,3)i:r(0,3)j:r(0,3)im:r(0,2)i:r(0,3)j:r(0,3)nsave:r(0,3)im:r(0,2)i:r(0,3)j:r(0,3)nsave:r(0,3)i:r(0,3)j:r(0,3)build_nested_list_inplace:F(0,43)im:P(0,2)n:P(0,3)p_n:P(0,56)p_nlists:P(0,56):t(0,56)=*(0,3)isublist:r(0,3)total:r(0,3)temp:r(0,3)subheader:r(0,43)tmp:r(0,3)tmp:r(0,3)tmp:r(0,3)errstr:(0,31)errstr:(0,31)errstr:(0,31)tmp:r(0,3)build_nested_list:F(0,43)im:P(0,2)n:P(0,3)p_n:P(0,56)p_nlists:P(0,56)i:r(0,3)parent:r(0,3)nsub:r(0,3)nlists:r(0,3)subheader:r(0,43)tmp:r(0,3)tmp:r(0,3)tmp:r(0,3)errstr:(0,31)errstr:(0,31)errstr:(0,31)errstr:(0,31)errstr:(0,31)tmp:r(0,3)find_intervals:F(0,3)it0:P(0,38)start:P(0,3)end:P(0,3)im:P(0,2)n:P(0,3)subheader:P(0,43)nlists:P(0,3)buf:P(0,2)nbuf:p(0,3)p_nreturn:p(0,56)it_return:p(0,57)it:r(0,38)it2:r(0,38)ibuf:r(0,3):t(0,57)=*(0,38)j:r(0,3)k:r(0,3)ori_sign:r(0,3)nbuf:r(0,3)p_nreturn:r(0,56)it_return:r(0,57)errstr:(0,31)errstr:(0,31)l:r(0,3)r:r(0,3)l:r(0,3)r:r(0,3)i:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)it2:r(0,38)tmp:r(0,3)find_file_intervals:F(0,3)it0:P(0,38)start:P(0,3)end:P(0,3)ii:P(0,35)nii:P(0,3)subheader:P(0,43)nlists:P(0,3)subheader_file:P(0,55)ntop:p(0,3)div:p(0,3)ifile:p(0,4)buf:p(0,2)nbuf:p(0,3)p_nreturn:p(0,56)it_return:p(0,57)it:r(0,38)it2:r(0,38)k:r(0,3)ibuf:r(0,3)ori_sign:r(0,3)ov:r(0,3)ntop:r(0,3)div:r(0,3)ifile:r(0,4)nbuf:r(0,3)errstr:(0,31)ntop:r(0,3)imdiv:r(0,2)ipos:r(0,42)ntop:r(0,3)imdiv:r(0,2)ipos:r(0,42)ntop:r(0,3)imdiv:r(0,2)ipos:r(0,42)it2:r(0,38)tmp:r(0,3)errstr:(0,31)C_int_max:G(0,3)/Users/administrator/Desktop/pygr-0.8.0/pygr/cnestedlist.cgcc2_compiled.:t(0,1)=(0,1)___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASliceIterator___pyx_tp_as_number_NLMSASliceIterator___pyx_tp_as_sequence_NLMSASliceIterator___pyx_tp_as_mapping_NLMSASliceIterator___pyx_tp_as_buffer_NLMSASliceIterator___pyx_tp_traverse_4pygr_11cnestedlist_NLMSASliceIterator___pyx_tp_clear_4pygr_11cnestedlist_NLMSASliceIterator___pyx_f_4pygr_11cnestedlist_18NLMSASliceIterator___iter_____pyx_f_4pygr_11cnestedlist_18NLMSASliceIterator___next_____pyx_methods_4pygr_11cnestedlist_NLMSASliceIterator___pyx_tp_new_4pygr_11cnestedlist_NLMSASliceIterator___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSANode___pyx_f_4pygr_11cnestedlist_9NLMSANode___cmp_____pyx_tp_as_number_NLMSANode___pyx_tp_as_sequence_NLMSANode___pyx_tp_as_mapping_NLMSANode___pyx_tp_as_buffer_NLMSANode___pyx_tp_traverse_4pygr_11cnestedlist_NLMSANode___pyx_tp_clear_4pygr_11cnestedlist_NLMSANode___pyx_f_4pygr_11cnestedlist_9NLMSANode___iter_____pyx_methods_4pygr_11cnestedlist_NLMSANode___pyx_members_4pygr_11cnestedlist_NLMSANode___pyx_getsets_4pygr_11cnestedlist_NLMSANode___pyx_tp_new_4pygr_11cnestedlist_NLMSANode___pyx_getprop_4pygr_11cnestedlist_9NLMSANode_edges___pyx_k250___pyx_f_4pygr_11cnestedlist_9NLMSANode_getSeqPos___pyx_doc_4pygr_11cnestedlist_9NLMSANode_getSeqPos___pyx_f_4pygr_11cnestedlist_9NLMSANode_getEdgeSeqs___pyx_doc_4pygr_11cnestedlist_9NLMSANode_getEdgeSeqs___pyx_f_4pygr_11cnestedlist_9NLMSANode_nodeEdges___pyx_doc_4pygr_11cnestedlist_9NLMSANode_nodeEdges___pyx_f_4pygr_11cnestedlist_9NLMSANode___len_____pyx_f_4pygr_11cnestedlist_9NLMSANode___getitem_____pyx_sq_item_4pygr_11cnestedlist_NLMSANode___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASliceLetters___pyx_tp_as_number_NLMSASliceLetters___pyx_tp_as_sequence_NLMSASliceLetters___pyx_tp_as_mapping_NLMSASliceLetters___pyx_tp_as_buffer_NLMSASliceLetters___pyx_tp_traverse_4pygr_11cnestedlist_NLMSASliceLetters___pyx_tp_clear_4pygr_11cnestedlist_NLMSASliceLetters___pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters___iter_____pyx_methods_4pygr_11cnestedlist_NLMSASliceLetters___pyx_members_4pygr_11cnestedlist_NLMSASliceLetters___pyx_tp_new_4pygr_11cnestedlist_NLMSASliceLetters___pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters_items___pyx_doc_4pygr_11cnestedlist_17NLMSASliceLetters_items___pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters_iteritems___pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters___getitem_____pyx_sq_item_4pygr_11cnestedlist_NLMSASliceLetters___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASlice___pyx_f_4pygr_11cnestedlist_10NLMSASlice___cmp_____pyx_f_4pygr_11cnestedlist_10NLMSASlice___repr_____pyx_tp_as_number_NLMSASlice___pyx_tp_as_sequence_NLMSASlice___pyx_tp_as_mapping_NLMSASlice___pyx_f_4pygr_11cnestedlist_10NLMSASlice___hash_____pyx_tp_as_buffer_NLMSASlice___pyx_tp_traverse_4pygr_11cnestedlist_NLMSASlice___pyx_tp_clear_4pygr_11cnestedlist_NLMSASlice___pyx_f_4pygr_11cnestedlist_10NLMSASlice___iter_____pyx_methods_4pygr_11cnestedlist_NLMSASlice___pyx_members_4pygr_11cnestedlist_NLMSASlice___pyx_getsets_4pygr_11cnestedlist_NLMSASlice___pyx_tp_new_4pygr_11cnestedlist_NLMSASlice___pyx_getprop_4pygr_11cnestedlist_10NLMSASlice_letters___pyx_k249___pyx_f_4pygr_11cnestedlist_10NLMSASlice_edges___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_edges___pyx_f_4pygr_11cnestedlist_10NLMSASlice_items___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_items___pyx_f_4pygr_11cnestedlist_10NLMSASlice_iteritems___pyx_f_4pygr_11cnestedlist_10NLMSASlice_keys___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_keys___pyx_f_4pygr_11cnestedlist_10NLMSASlice_matchIntervals___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_matchIntervals___pyx_f_4pygr_11cnestedlist_10NLMSASlice_findSeqEnds___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_findSeqEnds___pyx_f_4pygr_11cnestedlist_10NLMSASlice_generateSeqEnds___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_generateSeqEnds___pyx_f_4pygr_11cnestedlist_10NLMSASlice_groupByIntervals___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_groupByIntervals___pyx_f_4pygr_11cnestedlist_10NLMSASlice_conservationFilter___pyx_f_4pygr_11cnestedlist_10NLMSASlice_filterIvalConservation___pyx_f_4pygr_11cnestedlist_10NLMSASlice_groupBySequences___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_groupBySequences___pyx_f_4pygr_11cnestedlist_10NLMSASlice_clip_interval_list___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_clip_interval_list___pyx_f_4pygr_11cnestedlist_10NLMSASlice_split___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_split___pyx_f_4pygr_11cnestedlist_10NLMSASlice_regions___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_regions___pyx_f_4pygr_11cnestedlist_10NLMSASlice_rawIvals___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_rawIvals___pyx_f_4pygr_11cnestedlist_10NLMSASlice___len_____pyx_f_4pygr_11cnestedlist_10NLMSASlice___getitem_____pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSASlice___pyx_sq_item_4pygr_11cnestedlist_NLMSASlice___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSA___pyx_tp_as_number_NLMSA___pyx_tp_as_sequence_NLMSA___pyx_tp_as_mapping_NLMSA___pyx_tp_as_buffer_NLMSA___pyx_tp_traverse_4pygr_11cnestedlist_NLMSA___pyx_tp_clear_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA___iter_____pyx_methods_4pygr_11cnestedlist_NLMSA___pyx_members_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA___init_____pyx_tp_new_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA_close___pyx_doc_4pygr_11cnestedlist_5NLMSA_close___pyx_f_4pygr_11cnestedlist_5NLMSA___reduce_____pyx_f_4pygr_11cnestedlist_5NLMSA___getstate_____pyx_f_4pygr_11cnestedlist_5NLMSA___setstate_____pyx_f_4pygr_11cnestedlist_5NLMSA_read_indexes___pyx_doc_4pygr_11cnestedlist_5NLMSA_read_indexes___pyx_f_4pygr_11cnestedlist_5NLMSA_read_attrs___pyx_doc_4pygr_11cnestedlist_5NLMSA_read_attrs___pyx_f_4pygr_11cnestedlist_5NLMSA_addToSeqlist___pyx_doc_4pygr_11cnestedlist_5NLMSA_addToSeqlist___pyx_f_4pygr_11cnestedlist_5NLMSA_newSequence___pyx_doc_4pygr_11cnestedlist_5NLMSA_newSequence___pyx_f_4pygr_11cnestedlist_5NLMSA_nextID___pyx_doc_4pygr_11cnestedlist_5NLMSA_nextID___pyx_f_4pygr_11cnestedlist_5NLMSA_initLPO___pyx_doc_4pygr_11cnestedlist_5NLMSA_initLPO___pyx_f_4pygr_11cnestedlist_5NLMSA_init_pairwise_mode___pyx_doc_4pygr_11cnestedlist_5NLMSA_init_pairwise_mode___pyx_f_4pygr_11cnestedlist_5NLMSA_edges___pyx_f_4pygr_11cnestedlist_5NLMSA_addAnnotation___pyx_doc_4pygr_11cnestedlist_5NLMSA_addAnnotation___pyx_f_4pygr_11cnestedlist_5NLMSA_add_aligned_intervals___pyx_doc_4pygr_11cnestedlist_5NLMSA_add_aligned_intervals___pyx_f_4pygr_11cnestedlist_5NLMSA_readMAFfiles___pyx_doc_4pygr_11cnestedlist_5NLMSA_readMAFfiles___pyx_f_4pygr_11cnestedlist_5NLMSA_readAxtNet___pyx_doc_4pygr_11cnestedlist_5NLMSA_readAxtNet___pyx_f_4pygr_11cnestedlist_5NLMSA_buildFiles___pyx_doc_4pygr_11cnestedlist_5NLMSA_buildFiles___pyx_f_4pygr_11cnestedlist_5NLMSA_save_seq_dict___pyx_doc_4pygr_11cnestedlist_5NLMSA_save_seq_dict___pyx_f_4pygr_11cnestedlist_5NLMSA_build___pyx_doc_4pygr_11cnestedlist_5NLMSA_build___pyx_f_4pygr_11cnestedlist_5NLMSA_seqInterval___pyx_doc_4pygr_11cnestedlist_5NLMSA_seqInterval___pyx_f_4pygr_11cnestedlist_5NLMSA___getitem_____pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSA___pyx_sq_item_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA___invert_____pyx_f_4pygr_11cnestedlist_5NLMSA___iadd_____pyx_tp_dealloc_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_tp_as_number_IntervalFileDBIterator___pyx_tp_as_sequence_IntervalFileDBIterator___pyx_tp_as_mapping_IntervalFileDBIterator___pyx_tp_as_buffer_IntervalFileDBIterator___pyx_tp_traverse_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_tp_clear_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator___iter_____pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator___next_____pyx_methods_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_tp_new_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_mergeSeq___pyx_doc_4pygr_11cnestedlist_22IntervalFileDBIterator_mergeSeq___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASequence___pyx_tp_as_number_NLMSASequence___pyx_tp_as_sequence_NLMSASequence___pyx_tp_as_mapping_NLMSASequence___pyx_tp_as_buffer_NLMSASequence___pyx_tp_traverse_4pygr_11cnestedlist_NLMSASequence___pyx_tp_clear_4pygr_11cnestedlist_NLMSASequence___pyx_methods_4pygr_11cnestedlist_NLMSASequence___pyx_members_4pygr_11cnestedlist_NLMSASequence___pyx_f_4pygr_11cnestedlist_13NLMSASequence___init_____pyx_tp_new_4pygr_11cnestedlist_NLMSASequence___pyx_f_4pygr_11cnestedlist_13NLMSASequence_forceLoad___pyx_doc_4pygr_11cnestedlist_13NLMSASequence_forceLoad___pyx_f_4pygr_11cnestedlist_13NLMSASequence_close___pyx_doc_4pygr_11cnestedlist_13NLMSASequence_close___pyx_f_4pygr_11cnestedlist_13NLMSASequence_buildFiles___pyx_doc_4pygr_11cnestedlist_13NLMSASequence_buildFiles___pyx_f_4pygr_11cnestedlist_13NLMSASequence_buildInMemory___pyx_f_4pygr_11cnestedlist_13NLMSASequence___len_____pyx_f_4pygr_11cnestedlist_13NLMSASequence___getitem_____pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSASequence___pyx_sq_item_4pygr_11cnestedlist_NLMSASequence___pyx_f_4pygr_11cnestedlist_13NLMSASequence___iadd_____pyx_tp_dealloc_4pygr_11cnestedlist_IntervalFileDB___pyx_tp_as_number_IntervalFileDB___pyx_tp_as_sequence_IntervalFileDB___pyx_tp_as_mapping_IntervalFileDB___pyx_tp_as_buffer_IntervalFileDB___pyx_methods_4pygr_11cnestedlist_IntervalFileDB___pyx_tp_new_4pygr_11cnestedlist_IntervalFileDB___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_open___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_find_overlap___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_find_overlap_list___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_check_nonempty___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_close___pyx_tp_dealloc_4pygr_11cnestedlist_IntervalDBIterator___pyx_tp_as_number_IntervalDBIterator___pyx_tp_as_sequence_IntervalDBIterator___pyx_tp_as_mapping_IntervalDBIterator___pyx_tp_as_buffer_IntervalDBIterator___pyx_tp_traverse_4pygr_11cnestedlist_IntervalDBIterator___pyx_tp_clear_4pygr_11cnestedlist_IntervalDBIterator___pyx_f_4pygr_11cnestedlist_18IntervalDBIterator___iter_____pyx_f_4pygr_11cnestedlist_18IntervalDBIterator___next_____pyx_methods_4pygr_11cnestedlist_IntervalDBIterator___pyx_tp_new_4pygr_11cnestedlist_IntervalDBIterator___pyx_tp_dealloc_4pygr_11cnestedlist_IntervalDB___pyx_tp_as_number_IntervalDB___pyx_tp_as_sequence_IntervalDB___pyx_tp_as_mapping_IntervalDB___pyx_tp_as_buffer_IntervalDB___pyx_methods_4pygr_11cnestedlist_IntervalDB___pyx_tp_new_4pygr_11cnestedlist_IntervalDB___pyx_f_4pygr_11cnestedlist_10IntervalDB_save_tuples___pyx_doc_4pygr_11cnestedlist_10IntervalDB_save_tuples___pyx_f_4pygr_11cnestedlist_10IntervalDB_runBuildMethod___pyx_doc_4pygr_11cnestedlist_10IntervalDB_runBuildMethod___pyx_f_4pygr_11cnestedlist_10IntervalDB_buildFromUnsortedFile___pyx_doc_4pygr_11cnestedlist_10IntervalDB_buildFromUnsortedFile___pyx_f_4pygr_11cnestedlist_10IntervalDB_find_overlap___pyx_f_4pygr_11cnestedlist_10IntervalDB_find_overlap_list___pyx_f_4pygr_11cnestedlist_10IntervalDB_check_nonempty___pyx_f_4pygr_11cnestedlist_10IntervalDB_write_binaries___pyx_f_4pygr_11cnestedlist_10IntervalDB_close___pyx_ptype_4pygr_11cnestedlist_IntervalDBIterator___pyx_k6___pyx_k1___pyx_ptype_4pygr_11cnestedlist_IntervalDB___pyx_ptype_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_ptype_4pygr_11cnestedlist_NLMSASlice___pyx_ptype_4pygr_11cnestedlist_IntervalFileDB___pyx_k105___pyx_ptype_4pygr_11cnestedlist_NLMSA___pyx_ptype_4pygr_11cnestedlist_NLMSASequence___pyx_k190___pyx_k184___pyx_k181___pyx_ptype_4pygr_11cnestedlist_NLMSASliceLetters___pyx_ptype_4pygr_11cnestedlist_NLMSANode___pyx_ptype_4pygr_11cnestedlist_NLMSASliceIterator___pyx_string_tab___pyx_n_AttributeError___pyx_k22___pyx_n_BuildMSASlice___pyx_k169___pyx_n_ClassicUnpickler___pyx_k141___pyx_n_DictQueue___pyx_k81___pyx_n_EmptyAlignmentError___pyx_k205___pyx_n_EmptySlice___pyx_k173___pyx_n_EmptySliceError___pyx_k25___pyx_n_FloatType___pyx_k74___pyx_n_LetterEdge___pyx_k95___pyx_n_NLMSASeqDict___pyx_k122___pyx_n_NLMSASequence___pyx_k245___pyx_n_NLMSA_LPO_Internal___pyx_k155___pyx_n_NLMSA_UNION_Internal___pyx_k204___pyx_n_NLMSAindex___pyx_k151___pyx_n_PrefixUnionDict___pyx_k242___pyx_n_RLIMIT_NOFILE___pyx_k121___pyx_n_Seq2SeqEdge___pyx_k44___pyx_n_SeqCacheOwner___pyx_k33___pyx_n_SeqPath___pyx_k172___pyx_n_SeqPrefixUnionDict___pyx_k133___pyx_n_StringType___pyx_k96___pyx_n___class_____pyx_k142___pyx_n___getstate_____pyx_k143___pyx_n___iadd_____pyx_k117___pyx_n___init_____pyx_k148___pyx_n__cache_max___pyx_k30___pyx_n__persistent_id___pyx_k219___pyx_n_absoluteSlice___pyx_k50___pyx_n_addAll___pyx_k134___pyx_n_addToSeqlist___pyx_k158___pyx_n_add_aligned_intervals___pyx_k136___pyx_n_advanceStartStop___pyx_k87___pyx_n_append___pyx_k10___pyx_n_basename___pyx_k195___pyx_n_build___pyx_k137___pyx_n_buildFiles___pyx_k201___pyx_n_buildFromUnsortedFile___pyx_k108___pyx_n_buildInMemory___pyx_k212___pyx_n_cacheHint___pyx_k31___pyx_n_cache_reference___pyx_k38___pyx_n_check_nonempty___pyx_k9___pyx_n_chr___pyx_k189___pyx_n_classutil___pyx_k140___pyx_n_clip_interval_list___pyx_k71___pyx_n_close___pyx_k4___pyx_n_cmp___pyx_k84___pyx_n_conservationFilter___pyx_k73___pyx_n_conservedSegment___pyx_k70___pyx_n_doSlice___pyx_k20___pyx_n_dump___pyx_k208___pyx_n_edges___pyx_k45___pyx_n_end___pyx_k94___pyx_n_filterIvalConservation___pyx_k68___pyx_n_filterSeqs___pyx_k63___pyx_n_forceLoad___pyx_k12___pyx_n_generate_nlmsa_edges___pyx_k178___pyx_n_get___pyx_k222___pyx_n_getID___pyx_k48___pyx_n_getIDcoords___pyx_k55___pyx_n_getSeq___pyx_k37___pyx_n_getSeqID___pyx_k32___pyx_n_groupByIntervals___pyx_k40___pyx_n_groupBySequences___pyx_k42___pyx_n_id___pyx_k34___pyx_n_im___pyx_k93___pyx_n_indelCut___pyx_k80___pyx_n_info___pyx_k167___pyx_n_initLPO___pyx_k135___pyx_n_inverseDB___pyx_k147___pyx_n_ipos___pyx_k91___pyx_n_is_bidirectional___pyx_k162___pyx_n_is_lpo___pyx_k29___pyx_n_is_union___pyx_k116___pyx_n_items___pyx_k19___pyx_n_iteritems___pyx_k58___pyx_n_join___pyx_k234___pyx_n_keys___pyx_k46___pyx_n_length___pyx_k101___pyx_n_load___pyx_k161___pyx_n_logger___pyx_k166___pyx_n_mapping___pyx_k75___pyx_n_maxAlignSize___pyx_k67___pyx_n_maxgap___pyx_k60___pyx_n_maxinsert___pyx_k61___pyx_n_memory___pyx_k102___pyx_n_mergeAll___pyx_k41___pyx_n_mergeSeq___pyx_k28___pyx_n_minAlignSize___pyx_k66___pyx_n_minAligned___pyx_k78___pyx_n_mininsert___pyx_k62___pyx_n_msaSlice___pyx_k59___pyx_n_n___pyx_k238___pyx_n_name___pyx_k98___pyx_n_newSequence___pyx_k115___pyx_n_nextID___pyx_k164___pyx_n_nlmsaSequence___pyx_k85___pyx_n_nlmsaSlice___pyx_k92___pyx_n_nlmsa_utils___pyx_k24___pyx_n_nodeEdges___pyx_k18___pyx_n_noname___pyx_k251___pyx_n_ns___pyx_k23___pyx_n_offset___pyx_k100___pyx_n_onDemand___pyx_k157___pyx_n_open___pyx_k16___pyx_n_open_shelve___pyx_k215___pyx_n_orientation___pyx_k49___pyx_n_os___pyx_k110___pyx_n_pAlignedMin___pyx_k64___pyx_n_pIdentityMin___pyx_k65___pyx_n_pMinAligned___pyx_k79___pyx_n_pairwiseMode___pyx_k163___pyx_n_path___pyx_k97___pyx_n_pathForward___pyx_k39___pyx_n_pathstem___pyx_k145___pyx_n_pickle___pyx_k159___pyx_n_prefixDict___pyx_k217___pyx_n_prune_self_mappings___pyx_k252___pyx_n_pygr___pyx_k236___pyx_n_r___pyx_n_rU___pyx_k150___pyx_n_rawIvals___pyx_k21___pyx_n_rb___pyx_n_readAxtNet___pyx_k131___pyx_n_readMAFfiles___pyx_k130___pyx_n_read_attrs___pyx_k129___pyx_n_read_indexes___pyx_k128___pyx_n_read_seq_dict___pyx_k127___pyx_n_relativeSlice___pyx_k69___pyx_n_remove___pyx_k111___pyx_n_reopenReadOnly___pyx_k200___pyx_n_resource___pyx_k119___pyx_n_runBuildMethod___pyx_k2___pyx_n_saveSeq___pyx_k118___pyx_n_save_seq_dict___pyx_k210___pyx_n_save_tuples___pyx_k112___pyx_n_seq___pyx_k170___pyx_n_seqBounds___pyx_k51___pyx_n_seqDict___pyx_k146___pyx_n_seqInfoDict___pyx_k179___pyx_n_seqInterval___pyx_k36___pyx_n_seqdb___pyx_k132___pyx_n_seqlist___pyx_k123___pyx_n_sequence___pyx_k43___pyx_n_setrlimit___pyx_k120___pyx_n_sort___pyx_k76___pyx_n_sourceDB___pyx_k124___pyx_n_sourceOnly___pyx_k77___pyx_n_sourcePath___pyx_k54___pyx_n_split___pyx_k82___pyx_n_splitLPOintervals___pyx_k175___pyx_n_start___pyx_k56___pyx_n_startswith___pyx_k244___pyx_n_stop___pyx_k57___pyx_n_string___pyx_k191___pyx_n_strip___pyx_k152___pyx_n_sys___pyx_k207___pyx_n_targetDB___pyx_k125___pyx_n_target_start___pyx_k52___pyx_n_types___pyx_k72___pyx_n_w___pyx_k103___pyx_n_warn___pyx_k187___pyx_n_wb___pyx_n_worldbase___pyx_k237___pyx_n_write___pyx_k202___pyx_n_write_binaries___pyx_k109___pyx_n_xmlrpc___pyx_k138___pyx_k3p___pyx_k3___pyx_k5p___pyx_k5___pyx_k7p___pyx_k7___pyx_k8p___pyx_k8___pyx_k11p___pyx_k11___pyx_k13p___pyx_k13___pyx_k14p___pyx_k14___pyx_k15p___pyx_k15___pyx_k17p___pyx_k17___pyx_k26p___pyx_k26___pyx_k27p___pyx_k27___pyx_k35p___pyx_k35___pyx_k47p___pyx_k47___pyx_k53p___pyx_k53___pyx_k83p___pyx_k83___pyx_k86p___pyx_k86___pyx_k88p___pyx_k88___pyx_k89p___pyx_k89___pyx_k90p___pyx_k90___pyx_k99p___pyx_k99___pyx_k104p___pyx_k104___pyx_k106p___pyx_k106___pyx_k107p___pyx_k107___pyx_k113p___pyx_k113___pyx_k114p___pyx_k114___pyx_k126p___pyx_k126___pyx_k139p___pyx_k139___pyx_k144p___pyx_k144___pyx_k149p___pyx_k149___pyx_k153p___pyx_k153___pyx_k154p___pyx_k154___pyx_k156p___pyx_k156___pyx_k160p___pyx_k160___pyx_k165p___pyx_k165___pyx_k168p___pyx_k168___pyx_k171p___pyx_k171___pyx_k174p___pyx_k174___pyx_k176p___pyx_k176___pyx_k177p___pyx_k177___pyx_k180p___pyx_k180___pyx_k182p___pyx_k182___pyx_k183p___pyx_k183___pyx_k185p___pyx_k185___pyx_k186p___pyx_k186___pyx_k188p___pyx_k188___pyx_k192p___pyx_k192___pyx_k193p___pyx_k193___pyx_k194p___pyx_k194___pyx_k196p___pyx_k196___pyx_k197p___pyx_k197___pyx_k198p___pyx_k198___pyx_k199p___pyx_k199___pyx_k203p___pyx_k203___pyx_k206p___pyx_k206___pyx_k209p___pyx_k209___pyx_k211p___pyx_k211___pyx_k213p___pyx_k213___pyx_k214p___pyx_k214___pyx_k216p___pyx_k216___pyx_k221p___pyx_k221___pyx_k224p___pyx_k224___pyx_k225p___pyx_k225___pyx_k229p___pyx_k229___pyx_k230p___pyx_k230___pyx_k232p___pyx_k232___pyx_k233p___pyx_k233___pyx_k235p___pyx_k235___pyx_k239p___pyx_k239___pyx_k241p___pyx_k241___pyx_k246p___pyx_k246___pyx_k247p___pyx_k247___pyx_k248p___pyx_k248___pyx_methods___pyx_f_4pygr_11cnestedlist_advanceStartStop___pyx_f_4pygr_11cnestedlist_dump_textfile___pyx_doc_4pygr_11cnestedlist_dump_textfile___pyx_f_4pygr_11cnestedlist_textfile_to_binaries___pyx_doc_4pygr_11cnestedlist_textfile_to_binaries___pyx_k243___pyx_k240___pyx_k220___pyx_k231___pyx_k218___pyx_k228___pyx_k227___pyx_k226___pyx_k223___pyx_filenames__pyx_f_4pygr_11cnestedlist_18IntervalDBIterator___iter__:f(0,2)__pyx_v_self:P(0,2)void:t(0,1):t(0,2)=*(0,3)PyObject:t(0,3)=(0,4)_object:T(0,4)=s8ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;;int:t(0,5)=r(0,5);-2147483648;2147483647;:t(0,6)=*(0,7)_typeobject:T(0,7)=s192ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ob_size:(0,5),64,32;tp_name:(0,8),96,32;tp_basicsize:(0,5),128,32;tp_itemsize:(0,5),160,32;tp_dealloc:(0,9),192,32;tp_print:(0,11),224,32;tp_getattr:(0,13),256,32;tp_setattr:(0,15),288,32;tp_compare:(0,17),320,32;tp_repr:(0,19),352,32;tp_as_number:(0,21),384,32;tp_as_sequence:(0,22),416,32;tp_as_mapping:(0,23),448,32;tp_hash:(0,24),480,32;tp_call:(0,26),512,32;tp_str:(0,19),544,32;tp_getattro:(0,28),576,32;tp_setattro:(0,30),608,32;tp_as_buffer:(0,32),640,32;tp_flags:(0,33),672,32;tp_doc:(0,8),704,32;tp_traverse:(0,34),736,32;tp_clear:(0,36),768,32;tp_richcompare:(0,38),800,32;tp_weaklistoffset:(0,33),832,32;tp_iter:(0,40),864,32;tp_iternext:(0,41),896,32;tp_methods:(0,42),928,32;tp_members:(0,43),960,32;tp_getset:(0,44),992,32;tp_base:(0,6),1024,32;tp_dict:(0,2),1056,32;tp_descr_get:(0,45),1088,32;tp_descr_set:(0,46),1120,32;tp_dictoffset:(0,33),1152,32;tp_init:(0,47),1184,32;tp_alloc:(0,48),1216,32;tp_new:(0,50),1248,32;tp_free:(0,52),1280,32;tp_is_gc:(0,36),1312,32;tp_bases:(0,2),1344,32;tp_mro:(0,2),1376,32;tp_cache:(0,2),1408,32;tp_subclasses:(0,2),1440,32;tp_weaklist:(0,2),1472,32;tp_del:(0,9),1504,32;;:t(0,8)=*(0,54):t(0,10)=*(0,55)destructor:t(0,9)=(0,10):t(0,12)=*(0,56)printfunc:t(0,11)=(0,12):t(0,14)=*(0,57)getattrfunc:t(0,13)=(0,14):t(0,16)=*(0,58)setattrfunc:t(0,15)=(0,16):t(0,18)=*(0,59)cmpfunc:t(0,17)=(0,18):t(0,20)=*(0,60)reprfunc:t(0,19)=(0,20):t(0,21)=*(0,61):t(0,22)=*(0,62):t(0,23)=*(0,63):t(0,25)=*(0,64)hashfunc:t(0,24)=(0,25):t(0,27)=*(0,65)ternaryfunc:t(0,26)=(0,27):t(0,29)=*(0,66)getattrofunc:t(0,28)=(0,29):t(0,31)=*(0,67)setattrofunc:t(0,30)=(0,31):t(0,32)=*(0,68)long int:t(0,33)=r(0,33);-2147483648;2147483647;:t(0,35)=*(0,69)traverseproc:t(0,34)=(0,35):t(0,37)=*(0,70)inquiry:t(0,36)=(0,37):t(0,39)=*(0,71)richcmpfunc:t(0,38)=(0,39)getiterfunc:t(0,40)=(0,20)iternextfunc:t(0,41)=(0,20):t(0,42)=*(0,72):t(0,43)=*(0,73):t(0,44)=*(0,74)descrgetfunc:t(0,45)=(0,27)descrsetfunc:t(0,46)=(0,31)initproc:t(0,47)=(0,31):t(0,49)=*(0,75)allocfunc:t(0,48)=(0,49):t(0,51)=*(0,76)newfunc:t(0,50)=(0,51):t(0,53)=*(0,77)freefunc:t(0,52)=(0,53)char:t(0,54)=r(0,54);0;127;:t(0,55)=f(0,1):t(0,56)=f(0,5):t(0,57)=f(0,2):t(0,58)=f(0,5):t(0,59)=f(0,5):t(0,60)=f(0,2)PyNumberMethods:t(0,61)=(0,78)PySequenceMethods:t(0,62)=(0,79)PyMappingMethods:t(0,63)=(0,80):t(0,64)=f(0,33):t(0,65)=f(0,2):t(0,66)=f(0,2):t(0,67)=f(0,5)PyBufferProcs:t(0,68)=(0,81):t(0,69)=f(0,5):t(0,70)=f(0,5):t(0,71)=f(0,2)PyMethodDef:T(0,72)=s16ml_name:(0,8),0,32;ml_meth:(0,82),32,32;ml_flags:(0,5),64,32;ml_doc:(0,8),96,32;;PyMemberDef:T(0,73)=s20name:(0,8),0,32;type:(0,5),32,32;offset:(0,5),64,32;flags:(0,5),96,32;doc:(0,8),128,32;;PyGetSetDef:T(0,74)=s20name:(0,8),0,32;get:(0,83),32,32;set:(0,85),64,32;doc:(0,8),96,32;closure:(0,87),128,32;;:t(0,75)=f(0,2):t(0,76)=f(0,2):t(0,77)=f(0,1):T(0,78)=s152nb_add:(0,88),0,32;nb_subtract:(0,88),32,32;nb_multiply:(0,88),64,32;nb_divide:(0,88),96,32;nb_remainder:(0,88),128,32;nb_divmod:(0,88),160,32;nb_power:(0,26),192,32;nb_negative:(0,89),224,32;nb_positive:(0,89),256,32;nb_absolute:(0,89),288,32;nb_nonzero:(0,36),320,32;nb_invert:(0,89),352,32;nb_lshift:(0,88),384,32;nb_rshift:(0,88),416,32;nb_and:(0,88),448,32;nb_xor:(0,88),480,32;nb_or:(0,88),512,32;nb_coerce:(0,90),544,32;nb_int:(0,89),576,32;nb_long:(0,89),608,32;nb_float:(0,89),640,32;nb_oct:(0,89),672,32;nb_hex:(0,89),704,32;nb_inplace_add:(0,88),736,32;nb_inplace_subtract:(0,88),768,32;nb_inplace_multiply:(0,88),800,32;nb_inplace_divide:(0,88),832,32;nb_inplace_remainder:(0,88),864,32;nb_inplace_power:(0,26),896,32;nb_inplace_lshift:(0,88),928,32;nb_inplace_rshift:(0,88),960,32;nb_inplace_and:(0,88),992,32;nb_inplace_xor:(0,88),1024,32;nb_inplace_or:(0,88),1056,32;nb_floor_divide:(0,88),1088,32;nb_true_divide:(0,88),1120,32;nb_inplace_floor_divide:(0,88),1152,32;nb_inplace_true_divide:(0,88),1184,32;;:T(0,79)=s40sq_length:(0,36),0,32;sq_concat:(0,88),32,32;sq_repeat:(0,92),64,32;sq_item:(0,92),96,32;sq_slice:(0,94),128,32;sq_ass_item:(0,96),160,32;sq_ass_slice:(0,98),192,32;sq_contains:(0,100),224,32;sq_inplace_concat:(0,88),256,32;sq_inplace_repeat:(0,92),288,32;;:T(0,80)=s12mp_length:(0,36),0,32;mp_subscript:(0,88),32,32;mp_ass_subscript:(0,101),64,32;;:T(0,81)=s16bf_getreadbuffer:(0,102),0,32;bf_getwritebuffer:(0,104),32,32;bf_getsegcount:(0,105),64,32;bf_getcharbuffer:(0,107),96,32;;PyCFunction:t(0,82)=(0,29):t(0,84)=*(0,109)getter:t(0,83)=(0,84):t(0,86)=*(0,110)setter:t(0,85)=(0,86):t(0,87)=*(0,1)binaryfunc:t(0,88)=(0,29)unaryfunc:t(0,89)=(0,20):t(0,91)=*(0,111)coercion:t(0,90)=(0,91):t(0,93)=*(0,112)intargfunc:t(0,92)=(0,93):t(0,95)=*(0,113)intintargfunc:t(0,94)=(0,95):t(0,97)=*(0,114)intobjargproc:t(0,96)=(0,97):t(0,99)=*(0,115)intintobjargproc:t(0,98)=(0,99)objobjproc:t(0,100)=(0,18)objobjargproc:t(0,101)=(0,31):t(0,103)=*(0,116)getreadbufferproc:t(0,102)=(0,103)getwritebufferproc:t(0,104)=(0,103):t(0,106)=*(0,117)getsegcountproc:t(0,105)=(0,106):t(0,108)=*(0,118)getcharbufferproc:t(0,107)=(0,108):t(0,109)=f(0,2):t(0,110)=f(0,5):t(0,111)=f(0,5):t(0,112)=f(0,2):t(0,113)=f(0,2):t(0,114)=f(0,5):t(0,115)=f(0,5):t(0,116)=f(0,5):t(0,117)=f(0,5):t(0,118)=f(0,5)___pyx_argnames.8634__pyx_f_4pygr_11cnestedlist_10IntervalDB_close:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_argnames:V(0,119):t(0,119)=ar(0,120);0;0;(0,8)long unsigned int:t(0,120)=r(0,120);0;037777777777;___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_reset__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_reset:f(0,5)__pyx_v_self:P(0,121):t(0,121)=*(0,122)__pyx_obj_4pygr_11cnestedlist_IntervalFileDBIterator:T(0,122)=s52ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,123),64,32;it:(0,124),96,32;it_alloc:(0,124),128,32;im_buf:(0,125),160,32;ihit:(0,5),192,32;nhit:(0,5),224,32;start:(0,5),256,32;end:(0,5),288,32;nbuf:(0,5),320,32;db:(0,126),352,32;idb:(0,127),384,32;;:t(0,123)=*(0,128):t(0,124)=*(0,129):t(0,125)=*(0,130):t(0,126)=*(0,131):t(0,127)=*(0,132)__pyx_vtabstruct_4pygr_11cnestedlist_IntervalFileDBIterator:T(0,128)=s36restart:(0,133),0,32;reset:(0,134),32,32;cnext:(0,135),64,32;extend:(0,136),96,32;saveInterval:(0,137),128,32;nextBlock:(0,135),160,32;getIntervalMap:(0,138),192,32;loadAll:(0,134),224,32;copy:(0,139),256,32;;IntervalIterator:t(0,129)=(0,140)IntervalMap:t(0,130)=(0,141)__pyx_obj_4pygr_11cnestedlist_IntervalFileDB:T(0,131)=s12ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;db:(0,142),64,32;;__pyx_obj_4pygr_11cnestedlist_IntervalDB:T(0,132)=s28ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;n:(0,5),64,32;ntop:(0,5),96,32;nlists:(0,5),128,32;im:(0,125),160,32;subheader:(0,143),192,32;;:t(0,133)=*(0,144):t(0,134)=*(0,145):t(0,135)=*(0,146):t(0,136)=*(0,147):t(0,137)=*(0,148):t(0,138)=*(0,149):t(0,139)=*(0,150)IntervalIterator_S:T(0,140)=s32i:(0,5),0,32;n:(0,5),32,32;nii:(0,5),64,32;ntop:(0,5),96,32;i_div:(0,5),128,32;im:(0,125),160,32;up:(0,151),192,32;down:(0,151),224,32;;:T(0,141)=s24start:(0,5),0,32;end:(0,5),32,32;target_id:(0,5),64,32;target_start:(0,5),96,32;target_end:(0,5),128,32;sublist:(0,5),160,32;;:t(0,142)=*(0,152):t(0,143)=*(0,153):t(0,144)=f(0,5):t(0,145)=f(0,5):t(0,146)=f(0,5):t(0,147)=f(0,5):t(0,148)=f(0,5):t(0,149)=f(0,125):t(0,150)=f(0,5):t(0,151)=*(0,140)IntervalDBFile:t(0,152)=(0,154)SublistHeader:t(0,153)=(0,155):T(0,154)=s48n:(0,5),0,32;ntop:(0,5),32,32;nlists:(0,5),64,32;div:(0,5),96,32;nii:(0,5),128,32;ii:(0,156),160,32;subheader:(0,143),192,32;subheader_file:(0,157)=xsSubheaderFile:,224,128;ifile_idb:(0,159),352,32;;:T(0,155)=s8start:(0,5),0,32;len:(0,5),32,32;;:t(0,156)=*(0,160):T(0,158)=s16subheader:(0,143),0,32;nblock:(0,5),32,32;start:(0,5),64,32;ifile:(0,159),96,32;;SubheaderFile:t(0,157)=(0,158):t(0,159)=*(0,161)IntervalIndex:t(0,160)=(0,162)FILE:t(0,161)=(0,163):T(0,162)=s8start:(0,5),0,32;end:(0,5),32,32;;__sFILE:T(0,163)=s88_p:(0,164),0,32;_r:(0,5),32,32;_w:(0,5),64,32;_flags:(0,165),96,16;_file:(0,165),112,16;_bf:(0,166),128,64;_lbfsize:(0,5),192,32;_cookie:(0,87),224,32;_close:(0,167),256,32;_read:(0,168),288,32;_seek:(0,169),320,32;_write:(0,170),352,32;_ub:(0,166),384,64;_extra:(0,171),448,32;_ur:(0,5),480,32;_ubuf:(0,172),512,24;_nbuf:(0,173),536,8;_lb:(0,166),544,64;_blksize:(0,5),608,32;_offset:(0,174),640,64;;:t(0,164)=*(0,176)short int:t(0,165)=@s16;r(0,165);-32768;32767;__sbuf:T(0,166)=s8_base:(0,164),0,32;_size:(0,5),32,32;;:t(0,167)=*(0,177):t(0,168)=*(0,178):t(0,169)=*(0,179):t(0,170)=*(0,180):t(0,171)=*(0,181):t(0,172)=ar(0,120);0;2;(0,176):t(0,173)=ar(0,120);0;0;(0,176)__darwin_off_t:t(0,175)=(0,182)fpos_t:t(0,174)=(0,175)unsigned char:t(0,176)=@s8;r(0,176);0;255;:t(0,177)=f(0,5):t(0,178)=f(0,5):t(0,179)=f(0,174):t(0,180)=f(0,5):t(0,181)=xs__sFILEX:__int64_t:t(0,182)=(0,183)long long int:t(0,183)=@s64;r(0,183);01000000000000000000000;0777777777777777777777;___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_saveInterval__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_saveInterval:f(0,5)__pyx_v_self:P(0,121)__pyx_v_start:P(0,5)__pyx_v_end:P(0,5)__pyx_v_target_id:P(0,5)__pyx_v_target_start:P(0,5)__pyx_v_target_end:P(0,5)int:t(0,5)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_getIntervalMap__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_getIntervalMap:f(0,125)__pyx_v_self:P(0,121)__pyx_v_im:r(0,125)__pyx_r:r(0,125)__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator___iter__:f(0,2)__pyx_v_self:P(0,2)___pyx_argnames.9657__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_close:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_argnames:V(0,184):t(0,184)=ar(0,120);0;0;(0,8)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___len__:f(0,185)__pyx_v_self:P(0,2)__pyx_r:r(0,185)Py_ssize_t:t(0,185)=(0,5)__pyx_f_4pygr_11cnestedlist_18NLMSASliceIterator___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_f_4pygr_11cnestedlist_9NLMSANode___len__:f(0,185)__pyx_v_self:P(0,2)__pyx_r:r(0,185)___pyx_f_4pygr_11cnestedlist_9NLMSANode_check_edge__pyx_f_4pygr_11cnestedlist_9NLMSANode_check_edge:f(0,5)__pyx_v_self:P(0,186)__pyx_v_iseq:P(0,5)__pyx_v_ipos:P(0,5)__pyx_v_i:r(0,5):t(0,186)=*(0,187)__pyx_obj_4pygr_11cnestedlist_NLMSANode:T(0,187)=s36ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,188),64,32;id:(0,5),96,32;ipos:(0,5),128,32;istart:(0,5),160,32;istop:(0,5),192,32;n:(0,5),224,32;nlmsaSlice:(0,189),256,32;;:t(0,188)=*(0,190):t(0,189)=*(0,191)__pyx_vtabstruct_4pygr_11cnestedlist_NLMSANode:T(0,190)=s4check_edge:(0,192),0,32;;__pyx_obj_4pygr_11cnestedlist_NLMSASlice:T(0,191)=s64ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,193),64,32;start:(0,5),96,32;stop:(0,5),128,32;id:(0,5),160,32;n:(0,5),192,32;nseqBounds:(0,5),224,32;nrealseq:(0,5),256,32;offset:(0,5),288,32;im:(0,125),320,32;seqBounds:(0,125),352,32;nlmsaSequence:(0,194),384,32;nlmsa:(0,195),416,32;seq:(0,2),448,32;weakestLink:(0,2),480,32;;:t(0,192)=*(0,196):t(0,193)=*(0,197):t(0,194)=*(0,198):t(0,195)=*(0,199):t(0,196)=f(0,5)__pyx_vtabstruct_4pygr_11cnestedlist_NLMSASlice:T(0,197)=s8findSeqBounds:(0,200),0,32;get_seq_interval:(0,201),32,32;;__pyx_obj_4pygr_11cnestedlist_NLMSASequence:T(0,198)=s68ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,202),64,32;id:(0,5),96,32;length:(0,5),128,32;nbuild:(0,5),160,32;is_lpo:(0,5),192,32;is_union:(0,5),224,32;offset:(0,2),256,32;seq:(0,2),288,32;name:(0,2),320,32;db:(0,126),352,32;idb:(0,127),384,32;build_ifile:(0,159),416,32;filestem:(0,2),448,32;nlmsaLetters:(0,195),480,32;buildList:(0,2),512,32;;__pyx_obj_4pygr_11cnestedlist_NLMSA:T(0,199)=s88ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,203),64,32;pathstem:(0,2),96,32;seqs:(0,2),128,32;seqlist:(0,2),160,32;seqDict:(0,2),192,32;currentUnion:(0,194),224,32;do_build:(0,5),256,32;lpoList:(0,2),288,32;maxLPOcoord:(0,2),320,32;lpo_id:(0,5),352,32;maxlen:(0,5),384,32;inlmsa:(0,5),416,32;is_bidirectional:(0,5),448,32;pairwiseMode:(0,5),480,32;in_memory_mode:(0,5),512,32;_persistent_id:(0,2),544,32;_ignoreShadowAttr:(0,2),576,32;__doc__:(0,2),608,32;_saveLocalBuild:(0,2),640,32;inverseDB:(0,2),672,32;;:t(0,200)=*(0,204):t(0,201)=*(0,205):t(0,202)=*(0,206):t(0,203)=*(0,207):t(0,204)=f(0,5):t(0,205)=f(0,2)__pyx_vtabstruct_4pygr_11cnestedlist_NLMSASequence:T(0,206)=s4saveInterval:(0,208),0,32;;__pyx_vtabstruct_4pygr_11cnestedlist_NLMSA:T(0,207)=s12free_seqidmap:(0,209),0,32;save_nbuild:(0,210),32,32;add_seqidmap_to_union:(0,211),64,32;;:t(0,208)=*(0,212):t(0,209)=*(0,213):t(0,210)=*(0,214):t(0,211)=*(0,215):t(0,212)=f(0,5):t(0,213)=f(0,1):t(0,214)=f(0,1):t(0,215)=f(0,194)__pyx_r:r(0,5)__pyx_1:r(0,5)___pyx_f_4pygr_11cnestedlist_5NLMSA_free_seqidmap__pyx_f_4pygr_11cnestedlist_5NLMSA_free_seqidmap:f(0,1)__pyx_v_self:P(0,195)__pyx_v_nseq0:P(0,5)__pyx_v_seqidmap:P(0,216)__pyx_v_i:r(0,5):t(0,216)=*(0,217)SeqIDMap:t(0,217)=(0,218):T(0,218)=s20id:(0,8),0,32;length:(0,5),32,32;ns_id:(0,5),64,32;offset:(0,5),96,32;nlmsa_id:(0,5),128,32;;__pyx_tp_dealloc_4pygr_11cnestedlist_IntervalDB:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_IntervalDBIterator:f(0,1)o:P(0,2)__pyx_obj_4pygr_11cnestedlist_IntervalDBIterator:T(0,219)=s24616ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,220),64,32;it:(0,124),96,32;it_alloc:(0,124),128,32;im_buf:(0,221),160,196608;ihit:(0,5),196768,32;nhit:(0,5),196800,32;start:(0,5),196832,32;end:(0,5),196864,32;db:(0,127),196896,32;;:t(0,220)=*(0,222):t(0,221)=ar(0,120);0;1023;(0,130)__pyx_vtabstruct_4pygr_11cnestedlist_IntervalDBIterator:T(0,222)=s4cnext:(0,223),0,32;;:t(0,223)=*(0,224):t(0,224)=f(0,5)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_IntervalDBIterator:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5):t(0,226)=*(0,227)visitproc:t(0,225)=(0,226):t(0,227)=f(0,5)__pyx_tp_clear_4pygr_11cnestedlist_IntervalDBIterator:f(0,5)o:P(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_IntervalFileDB:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)___pyx_vtabptr_4pygr_11cnestedlist_NLMSASequence__pyx_tp_new_4pygr_11cnestedlist_NLMSASequence:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2):t(0,228)=*(0,229)PyTypeObject:t(0,229)=(0,7)o:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASequence:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_NLMSASequence:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSASequence:f(0,5)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSASequence:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_IntervalFileDBIterator:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_IntervalFileDBIterator:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_IntervalFileDBIterator:f(0,5)o:P(0,2)___pyx_vtabptr_4pygr_11cnestedlist_NLMSA__pyx_tp_new_4pygr_11cnestedlist_NLMSA:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSA:f(0,1)o:P(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_NLMSA:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSA:f(0,5)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSA:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASlice:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_NLMSASlice:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSASlice:f(0,5)o:P(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSASlice:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASliceLetters:f(0,1)o:P(0,2)__pyx_obj_4pygr_11cnestedlist_NLMSASliceLetters:T(0,230)=s12ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;nlmsaSlice:(0,189),64,32;;__pyx_tp_traverse_4pygr_11cnestedlist_NLMSASliceLetters:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSASliceLetters:f(0,5)o:P(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSASliceLetters:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSANode:f(0,1)o:P(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_NLMSANode:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSANode:f(0,5)o:P(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSANode:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASliceIterator:f(0,1)o:P(0,2)__pyx_obj_4pygr_11cnestedlist_NLMSASliceIterator:T(0,231)=s24ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ipos:(0,5),64,32;istart:(0,5),96,32;istop:(0,5),128,32;nlmsaSlice:(0,189),160,32;;__pyx_tp_traverse_4pygr_11cnestedlist_NLMSASliceIterator:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSASliceIterator:f(0,5)o:P(0,2)___Pyx_Raise__Pyx_Raise:f(0,1)type:P(0,2)value:P(0,2)tb:P(0,2)___Pyx_GetStarArgs__Pyx_GetStarArgs:f(0,5)args:P(0,232)kwds:P(0,232)kwd_list:P(0,233)nargs:P(0,185)args2:P(0,232)kwds2:P(0,232)rqd_kwds:P(0,8)x:r(0,2)args1:r(0,2)kwds1:r(0,2)i:r(0,5):t(0,232)=*(0,2):t(0,233)=*(0,8)p:r(0,233)char:t(0,54)___Pyx_GetException__Pyx_GetException:f(0,5)type:P(0,232)value:P(0,232)tb:P(0,232)tstate:r(0,234):t(0,234)=*(0,235)PyThreadState:t(0,235)=(0,236)_ts:T(0,236)=s84next:(0,237),0,32;interp:(0,238),32,32;frame:(0,239),64,32;recursion_depth:(0,5),96,32;tracing:(0,5),128,32;use_tracing:(0,5),160,32;c_profilefunc:(0,240),192,32;c_tracefunc:(0,240),224,32;c_profileobj:(0,2),256,32;c_traceobj:(0,2),288,32;curexc_type:(0,2),320,32;curexc_value:(0,2),352,32;curexc_traceback:(0,2),384,32;exc_type:(0,2),416,32;exc_value:(0,2),448,32;exc_traceback:(0,2),480,32;dict:(0,2),512,32;tick_counter:(0,5),544,32;gilstate_counter:(0,5),576,32;async_exc:(0,2),608,32;thread_id:(0,33),640,32;;:t(0,237)=*(0,236):t(0,238)=*(0,242):t(0,239)=*(0,243):t(0,241)=*(0,244)Py_tracefunc:t(0,240)=(0,241)PyInterpreterState:t(0,242)=(0,245)_frame:T(0,243)=s336ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ob_size:(0,5),64,32;f_back:(0,239),96,32;f_code:(0,246),128,32;f_builtins:(0,2),160,32;f_globals:(0,2),192,32;f_locals:(0,2),224,32;f_valuestack:(0,232),256,32;f_stacktop:(0,232),288,32;f_trace:(0,2),320,32;f_exc_type:(0,2),352,32;f_exc_value:(0,2),384,32;f_exc_traceback:(0,2),416,32;f_tstate:(0,234),448,32;f_lasti:(0,5),480,32;f_lineno:(0,5),512,32;f_restricted:(0,5),544,32;f_iblock:(0,5),576,32;f_blockstack:(0,247),608,1920;f_nlocals:(0,5),2528,32;f_ncells:(0,5),2560,32;f_nfreevars:(0,5),2592,32;f_stacksize:(0,5),2624,32;f_localsplus:(0,248),2656,32;;:t(0,244)=f(0,5)_is:T(0,245)=s36next:(0,249),0,32;tstate_head:(0,237),32,32;modules:(0,2),64,32;sysdict:(0,2),96,32;builtins:(0,2),128,32;codec_search_path:(0,2),160,32;codec_search_cache:(0,2),192,32;codec_error_registry:(0,2),224,32;dlopenflags:(0,5),256,32;;:t(0,246)=*(0,250):t(0,247)=ar(0,120);0;19;(0,251):t(0,248)=ar(0,120);0;0;(0,2):t(0,249)=*(0,245)PyCodeObject:t(0,250)=(0,252)PyTryBlock:t(0,251)=(0,253):T(0,252)=s64ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;co_argcount:(0,5),64,32;co_nlocals:(0,5),96,32;co_stacksize:(0,5),128,32;co_flags:(0,5),160,32;co_code:(0,2),192,32;co_consts:(0,2),224,32;co_names:(0,2),256,32;co_varnames:(0,2),288,32;co_freevars:(0,2),320,32;co_cellvars:(0,2),352,32;co_filename:(0,2),384,32;co_name:(0,2),416,32;co_firstlineno:(0,5),448,32;co_lnotab:(0,2),480,32;;:T(0,253)=s12b_type:(0,5),0,32;b_handler:(0,5),32,32;b_level:(0,5),64,32;;___Pyx_Import___pyx_b___pyx_m__Pyx_Import:f(0,2)name:P(0,2)from_list:P(0,2)__import__:r(0,2)empty_list:r(0,2)module:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)list:r(0,2)___Pyx_AddTraceback___pyx_filename___pyx_lineno__Pyx_AddTraceback:f(0,1)funcname:P(0,8)py_srcfile:r(0,2)py_funcname:r(0,2)py_globals:r(0,2)empty_tuple:r(0,2)empty_string:r(0,2)py_code:r(0,246)py_frame:r(0,254):t(0,254)=*(0,255)PyFrameObject:t(0,255)=(0,243)___pyx_argnames.8556___pyx_d4___pyx_f__pyx_f_4pygr_11cnestedlist_10IntervalDB_write_binaries:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_filestem:(0,2)__pyx_v_div:(0,2)__pyx_r:r(0,2)__pyx_2:r(0,8)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,256):t(0,256)=ar(0,120);0;2;(0,8)___pyx_argnames.8499__pyx_f_4pygr_11cnestedlist_10IntervalDB_check_nonempty:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_msg:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,257):t(0,257)=ar(0,120);0;0;(0,8)___pyx_argnames.8400__pyx_f_4pygr_11cnestedlist_10IntervalDB_find_overlap_list:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_i:r(0,5)__pyx_v_nhit:(0,5)__pyx_v_it:(0,124)__pyx_v_im_buf:(0,221)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,124)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)__pyx_argnames:V(0,258):t(0,258)=ar(0,120);0;2;(0,8)___pyx_argnames.8335__pyx_f_4pygr_11cnestedlist_10IntervalDB_find_overlap:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,259):t(0,259)=ar(0,120);0;2;(0,8)___pyx_argnames.8239__pyx_f_4pygr_11cnestedlist_10IntervalDB_buildFromUnsortedFile:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_filename:(0,2)__pyx_v_n:(0,5)__pyx_v_kwargs:(0,2)__pyx_v_ifile:r(0,159)__pyx_v_i:r(0,5)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_5:r(0,125)__pyx_6:r(0,2)__pyx_argnames:V(0,260):t(0,260)=ar(0,120);0;2;(0,8)___pyx_argnames.8186___pyx_d3__pyx_f_4pygr_11cnestedlist_10IntervalDB_runBuildMethod:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_buildInPlace:(0,2)__pyx_r:r(0,2)__pyx_2:r(0,143)__pyx_3:r(0,143)__pyx_argnames:V(0,261):t(0,261)=ar(0,120);0;1;(0,8)___pyx_argnames.7966___pyx_d1___pyx_d2__pyx_tp_new_4pygr_11cnestedlist_IntervalDB:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_kwds:(0,2)__pyx_args:(0,2)__pyx_v_filename:(0,2)__pyx_v_nsize:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_ifile:r(0,159)__pyx_v_msg:r(0,2)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_kwds:(0,2)__pyx_args:(0,2)__pyx_v_filename:(0,2)__pyx_v_nsize:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_ifile:r(0,159)__pyx_v_msg:r(0,2)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_6:r(0,2)___pyx_argnames.7780___pyx_vtabptr_4pygr_11cnestedlist_IntervalDBIterator__pyx_tp_new_4pygr_11cnestedlist_IntervalDBIterator:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,127)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,127)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,127)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,127)__pyx_r:r(0,5)__pyx_1:r(0,124)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)__pyx_f_4pygr_11cnestedlist_18IntervalDBIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_i:r(0,5)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)___pyx_argnames.9614__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_check_nonempty:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,262):t(0,262)=ar(0,120);0;0;(0,8)___pyx_argnames.9511__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_find_overlap_list:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_i:r(0,5)__pyx_v_nhit:(0,5)__pyx_v_it:(0,124)__pyx_v_im_buf:(0,221)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,124)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)__pyx_argnames:V(0,263):t(0,263)=ar(0,120);0;2;(0,8)___pyx_argnames.9446__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_find_overlap:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,264):t(0,264)=ar(0,120);0;2;(0,8)___pyx_argnames.9393__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_open:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_filestem:(0,2)__pyx_v_err_msg:(0,265)__pyx_r:r(0,2):t(0,265)=ar(0,120);0;1023;(0,54)__pyx_2:r(0,142)__pyx_argnames:V(0,266):t(0,266)=ar(0,120);0;1;(0,8)___pyx_argnames.9327___pyx_d9___pyx_d10__pyx_tp_new_4pygr_11cnestedlist_IntervalFileDB:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_filestem:(0,2)__pyx_v_mode:(0,2)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_f_4pygr_11cnestedlist_13NLMSASequence___iadd__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_seq:P(0,2)__pyx_v_x:r(0,2)__pyx_v_ns:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:r(0,185)__pyx_6:r(0,2)__pyx_f_4pygr_11cnestedlist_13NLMSASequence___len__:f(0,185)__pyx_v_self:P(0,2)__pyx_r:r(0,185)__pyx_2:r(0,185)___pyx_argnames.15427__pyx_f_4pygr_11cnestedlist_13NLMSASequence_buildInMemory:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_v_n:r(0,2)__pyx_r:r(0,2)__pyx_2:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)__pyx_argnames:V(0,267):t(0,267)=ar(0,120);0;0;(0,8)___pyx_argnames.15300__pyx_f_4pygr_11cnestedlist_13NLMSASequence_buildFiles:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_v_db:r(0,127)__pyx_v_filename:r(0,2)__pyx_v_os:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,268):t(0,268)=ar(0,120);0;0;(0,8)___pyx_argnames.15235__pyx_f_4pygr_11cnestedlist_13NLMSASequence_close:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,269):t(0,269)=ar(0,120);0;0;(0,8)___pyx_argnames.15180__pyx_f_4pygr_11cnestedlist_13NLMSASequence_forceLoad:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_argnames:V(0,270):t(0,270)=ar(0,120);0;0;(0,8)___pyx_argnames.9157__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_mergeSeq:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_id:r(0,5)__pyx_r:r(0,2)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_argnames:V(0,271):t(0,271)=ar(0,120);0;0;(0,8)__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_i:r(0,5)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_f_4pygr_11cnestedlist_5NLMSA___iadd__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_seq:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_f_4pygr_11cnestedlist_5NLMSA___invert__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)___pyx_argnames.17758__pyx_f_4pygr_11cnestedlist_5NLMSA_addAnnotation:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_a:(0,2)__pyx_v_ival:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,272):t(0,272)=ar(0,120);0;1;(0,8)___pyx_argnames.17148__pyx_f_4pygr_11cnestedlist_5NLMSA_nextID:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_nlmsaID:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_argnames:V(0,273):t(0,273)=ar(0,120);0;0;(0,8)___pyx_argnames.17015___pyx_d62___pyx_d63__pyx_f_4pygr_11cnestedlist_5NLMSA_newSequence:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seq:(0,2)__pyx_v_is_union:(0,2)__pyx_v_ns:r(0,194)__pyx_v_id:r(0,2)__pyx_v_filestem:r(0,2)__pyx_v_mode:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:(0,5)__pyx_4:r(0,2)__pyx_argnames:V(0,274):t(0,274)=ar(0,120);0;2;(0,8)___pyx_argnames.16495__pyx_f_4pygr_11cnestedlist_5NLMSA___setstate__:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_state:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,275):t(0,275)=ar(0,120);0;1;(0,8)___pyx_argnames.16433__pyx_f_4pygr_11cnestedlist_5NLMSA___getstate__:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,276):t(0,276)=ar(0,120);0;0;(0,8)___pyx_argnames.16372__pyx_f_4pygr_11cnestedlist_5NLMSA___reduce__:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_classutil:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,277):t(0,277)=ar(0,120);0;0;(0,8)__pyx_f_4pygr_11cnestedlist_5NLMSA___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSASlice:f(0,5)o:P(0,2)i:P(0,2)v:P(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)___pyx_argnames.13633__pyx_f_4pygr_11cnestedlist_10NLMSASlice_rawIvals:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,5)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,5)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_argnames:V(0,278):t(0,278)=ar(0,120);0;0;(0,8)___pyx_argnames.13228___pyx_d37__pyx_f_4pygr_11cnestedlist_10NLMSASlice_split:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_minAligned:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_seqIntervals:r(0,2)__pyx_v_ivals:r(0,2)__pyx_v_l:r(0,2)__pyx_v_ival:r(0,2)__pyx_v_subslice:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:(0,5)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,279):t(0,279)=ar(0,120);0;1;(0,8)___pyx_argnames.11489__pyx_f_4pygr_11cnestedlist_10NLMSASlice_generateSeqEnds:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_l:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_edge:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,5)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,280):t(0,280)=ar(0,120);0;0;(0,8)___pyx_argnames.11391__pyx_f_4pygr_11cnestedlist_10NLMSASlice_findSeqEnds:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seq:(0,2)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,281):t(0,281)=ar(0,120);0;1;(0,8)___pyx_argnames.10828__pyx_f_4pygr_11cnestedlist_10NLMSASlice_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,282):t(0,282)=ar(0,120);0;0;(0,8)__pyx_getprop_4pygr_11cnestedlist_10NLMSASlice_letters:f(0,2)o:P(0,2)x:P(0,87)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)___pyx_argnames.9888__pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_argnames:V(0,283):t(0,283)=ar(0,120);0;0;(0,8)___pyx_argnames.9820__pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_l:r(0,2)__pyx_v_node:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,284):t(0,284)=ar(0,120);0;0;(0,8)__pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_f_4pygr_11cnestedlist_9NLMSANode___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_seq:P(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_f_4pygr_11cnestedlist_9NLMSANode___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,5)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_loadAll__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_loadAll:f(0,5)__pyx_v_self:P(0,121)__pyx_v_ikeep:(0,5)__pyx_r:r(0,5)__pyx_1:r(0,5)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_nextBlock__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_nextBlock:f(0,5)__pyx_v_self:P(0,121)__pyx_v_pkeep:P(0,285)__pyx_v_i:r(0,5):t(0,285)=*(0,5)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_restart__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_restart:f(0,5)__pyx_v_self:P(0,121)__pyx_v_start:P(0,5)__pyx_v_end:P(0,5)__pyx_v_db:P(0,126)__pyx_v_ns:P(0,194)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)___pyx_f_4pygr_11cnestedlist_18IntervalDBIterator_cnext__pyx_f_4pygr_11cnestedlist_18IntervalDBIterator_cnext:f(0,5)__pyx_v_self:P(0,286)__pyx_r:r(0,5):t(0,286)=*(0,219)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_f_4pygr_11cnestedlist_13NLMSASequence_saveInterval__pyx_f_4pygr_11cnestedlist_13NLMSASequence_saveInterval:f(0,5)__pyx_v_self:P(0,194)__pyx_v_im:P(0,125)__pyx_v_n:P(0,5)__pyx_v_expand_self:P(0,5)__pyx_v_ifile:P(0,159)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_cnext__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_cnext:f(0,5)__pyx_v_self:P(0,121)__pyx_v_pkeep:P(0,285)__pyx_r:r(0,5)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_extend__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_extend:f(0,5)__pyx_v_self:P(0,121)__pyx_v_ikeep:P(0,5)__pyx_v_length:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_new_buf:r(0,125)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_copy__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_copy:f(0,5)__pyx_v_self:P(0,121)__pyx_v_src:P(0,121)__pyx_v_new_buf:r(0,125)__pyx_2:r(0,2)__pyx_3:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_argnames.13727__pyx_f_4pygr_11cnestedlist_advanceStartStop:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,287):t(0,287)=ar(0,120);0;4;(0,8)type:r(0,228)type:r(0,228)___pyx_argnames.13801__pyx_tp_new_4pygr_11cnestedlist_NLMSASliceIterator:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)type:r(0,228)type:r(0,228)type:r(0,228)___pyx_argnames.9695__pyx_tp_new_4pygr_11cnestedlist_NLMSASliceLetters:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)type:r(0,228)type:r(0,228)type:r(0,228)__pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_node:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)type:r(0,228)type:r(0,228)___pyx_argnames.16947___pyx_d61__pyx_f_4pygr_11cnestedlist_5NLMSA_addToSeqlist:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_ns:(0,194)__pyx_v_seq:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_argnames:V(0,288):t(0,288)=ar(0,120);0;2;(0,8)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)___pyx_f_4pygr_11cnestedlist_5NLMSA_save_nbuild__pyx_f_4pygr_11cnestedlist_5NLMSA_save_nbuild:f(0,1)__pyx_v_self:P(0,195)__pyx_v_nbuild:P(0,285)__pyx_v_ns:r(0,194)__pyx_1:r(0,2)__pyx_2:r(0,2)type:r(0,228)type:r(0,228)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_argnames.16309__pyx_f_4pygr_11cnestedlist_5NLMSA_close:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_ns:r(0,194)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,289):t(0,289)=ar(0,120);0;0;(0,8)type:r(0,228)type:r(0,228)___pyx_argnames.17191__pyx_f_4pygr_11cnestedlist_5NLMSA_initLPO:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_ns:r(0,194)__pyx_v_offset:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:(0,5)__pyx_3:r(0,2)__pyx_argnames:V(0,290):t(0,290)=ar(0,120);0;0;(0,8)type:r(0,228)type:r(0,228)___pyx_f_4pygr_11cnestedlist_10NLMSASlice_get_seq_interval__pyx_f_4pygr_11cnestedlist_10NLMSASlice_get_seq_interval:f(0,2)__pyx_v_self:P(0,189)__pyx_v_nl:P(0,195)__pyx_v_targetID:P(0,5)__pyx_v_start:P(0,5)__pyx_v_stop:P(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.19855___pyx_d66___pyx_d67___pyx_d68__pyx_f_4pygr_11cnestedlist_textfile_to_binaries:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_filename:(0,2)__pyx_v_seqDict:(0,2)__pyx_v_prefixDict:(0,2)__pyx_v_buildpath:(0,2)__pyx_v_i:r(0,5)__pyx_v_n:(0,5)__pyx_v_nlmsaID:(0,5)__pyx_v_nsID:(0,5)__pyx_v_offset:(0,5)__pyx_v_is_bidirectional:(0,5)__pyx_v_pairwiseMode:(0,5)__pyx_v_nprefix:(0,5)__pyx_v_infile:r(0,159)__pyx_v_err_msg:(0,291)__pyx_v_line:(0,292)__pyx_v_tmp:(0,291)__pyx_v_basestem:(0,291)__pyx_v_seqDictID:(0,291)__pyx_v_ignorePrefix:r(0,2)__pyx_v_os:(0,2)__pyx_v_buildpath1:(0,2)__pyx_v_worldbase:(0,2)__pyx_v_classutil:(0,2)__pyx_v_pickle:(0,2)__pyx_v_seqIDdict:(0,2)__pyx_v_IDdict:(0,2)__pyx_v_d:(0,2)__pyx_v_ifile:(0,2)__pyx_v_missing:(0,2)__pyx_v_seqdb:(0,2)__pyx_v_NLMSAindexText:(0,2)__pyx_v_buildpath2:(0,2)__pyx_v_sys:(0,2)__pyx_v_s:(0,2)__pyx_r:r(0,2)__pyx_1:(0,5):t(0,291)=ar(0,120);0;2047;(0,54):t(0,292)=ar(0,120);0;32767;(0,54)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,185)__pyx_7:r(0,2)__pyx_argnames:V(0,293):t(0,293)=ar(0,120);0;4;(0,8)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)___pyx_vtable_4pygr_11cnestedlist_IntervalDBIterator___pyx_vtable_4pygr_11cnestedlist_NLMSASequence___pyx_vtable_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_vtabptr_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_vtable_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA_add_seqidmap_to_union___pyx_f_4pygr_11cnestedlist_10NLMSASlice_findSeqBounds___pyx_vtable_4pygr_11cnestedlist_NLMSASlice___pyx_vtabptr_4pygr_11cnestedlist_NLMSASlice___pyx_vtable_4pygr_11cnestedlist_NLMSANode___pyx_vtabptr_4pygr_11cnestedlist_NLMSANode___pyx_d7___pyx_d5___pyx_d8___pyx_d6___pyx_d11___pyx_d12___pyx_d13___pyx_d14___pyx_d15___pyx_d16___pyx_d17___pyx_d19___pyx_d18___pyx_d20___pyx_d21___pyx_d22___pyx_d23___pyx_d24___pyx_d25___pyx_d26___pyx_d27___pyx_d28___pyx_d29___pyx_d30___pyx_d31___pyx_d32___pyx_d33___pyx_d34___pyx_d35___pyx_d36___pyx_d39___pyx_d40___pyx_d38___pyx_d41___pyx_d42___pyx_d43___pyx_d44___pyx_d46___pyx_d47___pyx_d48___pyx_d45___pyx_d49___pyx_d50___pyx_d51___pyx_d52___pyx_d54___pyx_d53___pyx_d55___pyx_d56___pyx_d57___pyx_d58___pyx_d59___pyx_d60___pyx_d64___pyx_d65initcnestedlist:F(0,1)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)__pyx_10:r(0,2)__pyx_11:r(0,2)__pyx_12:r(0,2)__pyx_13:r(0,2)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_9NLMSANode___cmp__:f(0,5)__pyx_v_self:P(0,2)__pyx_v_other:P(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_getprop_4pygr_11cnestedlist_9NLMSANode_edges:f(0,2)o:P(0,2)x:P(0,87)__pyx_v_l:r(0,2)__pyx_v_ival2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.14233__pyx_f_4pygr_11cnestedlist_9NLMSANode_getSeqPos:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_argnames:V(0,294):t(0,294)=ar(0,120);0;1;(0,8)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___cmp__:f(0,5)__pyx_v_self:P(0,2)__pyx_v_other:P(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___repr__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___hash__:f(0,33)__pyx_v_self:P(0,2)__pyx_r:r(0,33)long int:t(0,33)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,33)name:r(0,2)name:r(0,2)___pyx_argnames.11174__pyx_f_4pygr_11cnestedlist_10NLMSASlice_matchIntervals:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seq:(0,2)__pyx_v_i:r(0,5)__pyx_v_target_id:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_l:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_ival1:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_6:(0,5)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_argnames:V(0,295):t(0,295)=ar(0,120);0;1;(0,8)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.15912__pyx_f_4pygr_11cnestedlist_5NLMSA___init__:f(0,5)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_pathstem:(0,2)__pyx_v_mode:(0,2)__pyx_v_seqDict:(0,2)__pyx_v_mafFiles:(0,2)__pyx_v_axtFiles:(0,2)__pyx_v_maxOpenFiles:(0,2)__pyx_v_maxlen:(0,2)__pyx_v_nPad:(0,2)__pyx_v_maxint:(0,2)__pyx_v_trypath:(0,2)__pyx_v_bidirectional:(0,2)__pyx_v_pairwiseMode:(0,2)__pyx_v_bidirectionalRule:(0,2)__pyx_v_use_virtual_lpo:(0,2)__pyx_v_maxLPOcoord:(0,2)__pyx_v_inverseDB:(0,2)__pyx_v_alignedIvals:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_resource:r(0,2)__pyx_v_seqdb:(0,2)__pyx_r:r(0,5)__pyx_1:(0,2)__pyx_2:r(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,5)__pyx_argnames:V(0,296):t(0,296)=ar(0,120);0;17;(0,8)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)___pyx_argnames.17261__pyx_f_4pygr_11cnestedlist_5NLMSA_init_pairwise_mode:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,297):t(0,297)=ar(0,120);0;0;(0,8)name:r(0,2)name:r(0,2)___pyx_argnames.17634__pyx_f_4pygr_11cnestedlist_5NLMSA_edges:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_args:(0,2)__pyx_v_kwargs:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,298):t(0,298)=ar(0,120);0;0;(0,8)name:r(0,2)name:r(0,2)___pyx_argnames.17822__pyx_f_4pygr_11cnestedlist_5NLMSA_add_aligned_intervals:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_alignedIvals:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,299):t(0,299)=ar(0,120);0;1;(0,8)name:r(0,2)name:r(0,2)___pyx_argnames.18746__pyx_f_4pygr_11cnestedlist_5NLMSA_buildFiles:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_saveSeqDict:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_ns:r(0,194)__pyx_v_ntotal:r(0,2)__pyx_v_ifile:r(0,2)__pyx_v_sys:r(0,2)__pyx_v_pickle:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:(0,5)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,300):t(0,300)=ar(0,120);0;1;(0,8)type:r(0,228)type:r(0,228)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)___pyx_argnames.19040__pyx_f_4pygr_11cnestedlist_5NLMSA_save_seq_dict:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,301):t(0,301)=ar(0,120);0;0;(0,8)name:r(0,2)name:r(0,2)___pyx_argnames.19100__pyx_f_4pygr_11cnestedlist_5NLMSA_build:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_v_ntotal:r(0,2)__pyx_v_ns:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,302):t(0,302)=ar(0,120);0;0;(0,8)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.19231__pyx_f_4pygr_11cnestedlist_5NLMSA_seqInterval:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_iseq:(0,5)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_seq:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,303):t(0,303)=ar(0,120);0;3;(0,8)name:r(0,2)name:r(0,2)__pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSA:f(0,5)o:P(0,2)i:P(0,2)v:P(0,2)__pyx_r:r(0,5)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:(0,5)__pyx_4:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_13NLMSASequence___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:r(0,5)__pyx_3:(0,2)__pyx_4:(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)__pyx_f_4pygr_11cnestedlist_18NLMSASliceIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)name:r(0,2)name:r(0,2)item:r(0,2)name:r(0,2)item:r(0,2)___pyx_argnames.13972__pyx_tp_new_4pygr_11cnestedlist_NLMSANode:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)type:r(0,228)type:r(0,228)type:r(0,228)name:r(0,2)name:r(0,2)item:r(0,2)item:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)___pyx_argnames.10583__pyx_f_4pygr_11cnestedlist_10NLMSASlice_edges:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_mergeAll:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_seqIntervals:r(0,2)__pyx_v_ivals:r(0,2)__pyx_v_l:r(0,2)__pyx_v_ival1:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_mergeIntervals:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,304):t(0,304)=ar(0,120);0;1;(0,8)name:r(0,2)name:r(0,2)item:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.10727__pyx_f_4pygr_11cnestedlist_10NLMSASlice_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_v_l:r(0,2)__pyx_v_ival1:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_edge:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,305):t(0,305)=ar(0,120);0;0;(0,8)item:r(0,2)___pyx_argnames.10898__pyx_f_4pygr_11cnestedlist_10NLMSASlice_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_mergeAll:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_seqIntervals:r(0,2)__pyx_v_ivals:r(0,2)__pyx_v_l:r(0,2)__pyx_v_ival1:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_mergeIntervals:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,306):t(0,306)=ar(0,120);0;1;(0,8)item:r(0,2)___pyx_argnames.13087__pyx_f_4pygr_11cnestedlist_10NLMSASlice_clip_interval_list:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,2)__pyx_v_end:(0,2)__pyx_v_l:(0,2)__pyx_v_result:r(0,2)__pyx_v_srcStart:r(0,2)__pyx_v_srcEnd:r(0,2)__pyx_v_destStart:r(0,2)__pyx_v_destEnd:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,185)__pyx_argnames:V(0,307):t(0,307)=ar(0,120);0;3;(0,8)item:r(0,2)___pyx_argnames.16561__pyx_f_4pygr_11cnestedlist_5NLMSA_read_indexes:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seqDict:(0,2)__pyx_v_ns:r(0,194)__pyx_v_ifile:r(0,2)__pyx_v_line:(0,2)__pyx_v_id:r(0,2)__pyx_v_name:(0,2)__pyx_v_is_union:r(0,2)__pyx_v_length:(0,2)__pyx_v_filestem:r(0,2)__pyx_v_seq:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:(0,2)__pyx_3:(0,5)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)__pyx_9:r(0,2)__pyx_argnames:V(0,308):t(0,308)=ar(0,120);0;1;(0,8)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)___pyx_argnames.16804__pyx_f_4pygr_11cnestedlist_5NLMSA_read_attrs:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_pickle:r(0,2)__pyx_v_ifile:r(0,2)__pyx_v_d:r(0,2)__pyx_v_k:r(0,2)__pyx_v_v:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:(0,2)__pyx_3:(0,5)__pyx_4:(0,2)__pyx_argnames:V(0,309):t(0,309)=ar(0,120);0;0;(0,8)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSASequence:f(0,5)o:P(0,2)i:P(0,2)v:P(0,2)__pyx_v_im_tmp:(0,130)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)__pyx_v_im_tmp:(0,130)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)__pyx_f_4pygr_11cnestedlist_5NLMSA_add_seqidmap_to_union:f(0,194)__pyx_v_self:P(0,195)__pyx_v_j:P(0,5)__pyx_v_seqidmap:P(0,216)__pyx_v_ns:P(0,194)__pyx_v_build_ifile:P(0,310)__pyx_v_nbuild:P(0,285)__pyx_v_ns_lpo:r(0,194):t(0,310)=*(0,159)__pyx_r:r(0,194)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)type:r(0,228)type:r(0,228)i:r(0,185)i:r(0,185)i:r(0,185)j:r(0,2)type:r(0,228)type:r(0,228)__pyx_f_4pygr_11cnestedlist_10NLMSASlice_findSeqBounds:f(0,5)__pyx_v_self:P(0,189)__pyx_v_id:P(0,5)__pyx_v_ori:P(0,5)__pyx_v_left:r(0,5)__pyx_v_right:r(0,5)__pyx_v_mid:r(0,5)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)name:r(0,2)name:r(0,2)j:r(0,2)name:r(0,2)name:r(0,2)j:r(0,2)name:r(0,2)name:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_argnames.19384__pyx_f_4pygr_11cnestedlist_dump_textfile:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_pathstem:(0,2)__pyx_v_outfilename:(0,2)__pyx_v_nprefix:r(0,5)__pyx_v_outfile:r(0,159)__pyx_v_err_msg:(0,291)__pyx_v_tmp:(0,291)__pyx_v_seqDictID:(0,311)__pyx_v_classutil:r(0,2)__pyx_v_pickle:r(0,2)__pyx_v_sys:r(0,2)__pyx_v_seqIDdict:r(0,2)__pyx_v_seqDict:r(0,2)__pyx_v_prefixDict:r(0,2)__pyx_v_ifile:(0,2)__pyx_v_d:(0,2)__pyx_v_os:(0,2)__pyx_v_basestem:(0,2)__pyx_v_pleaseWarn:r(0,2)__pyx_v_id:(0,2)__pyx_v_t:(0,2)__pyx_v_line:(0,2)__pyx_v_name:(0,2)__pyx_v_is_union:(0,2)__pyx_v_length:(0,2)__pyx_v_mypath:(0,2)__pyx_v_mybase:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,5):t(0,311)=ar(0,120);0;255;(0,54)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:r(0,185)__pyx_6:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:(0,2)__pyx_11:(0,2)__pyx_12:(0,2)__pyx_13:r(0,8)__pyx_argnames:V(0,312):t(0,312)=ar(0,120);0;2;(0,8)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)r:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)___pyx_argnames.14586__pyx_f_4pygr_11cnestedlist_9NLMSANode_getEdgeSeqs:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_other:(0,186)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_d:r(0,2)__pyx_v_seq:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_3:(0,5)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,313):t(0,313)=ar(0,120);0;1;(0,8)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)j:r(0,2)___pyx_argnames.14734__pyx_f_4pygr_11cnestedlist_9NLMSANode_nodeEdges:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,5)__pyx_v_has_continuation:r(0,5)__pyx_v_d:r(0,2)__pyx_v_nodes:r(0,2)__pyx_v_result:r(0,2)__pyx_v_node:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:r(0,5)__pyx_3:(0,5)__pyx_4:r(0,185)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,314):t(0,314)=ar(0,120);0;0;(0,8)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)j:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)j:r(0,2)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)j:r(0,2)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)j:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)___pyx_argnames.9960__pyx_tp_new_4pygr_11cnestedlist_NLMSASlice:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)type:r(0,228)type:r(0,228)type:r(0,228)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)i:r(0,185)o:r(0,2)r:r(0,2)j:r(0,2)type:r(0,228)type:r(0,228)o:r(0,2)r:r(0,2)j:r(0,2)type:r(0,228)type:r(0,228)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)___pyx_argnames.11630__pyx_f_4pygr_11cnestedlist_10NLMSASlice_groupByIntervals:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_maxgap:(0,5)__pyx_v_maxinsert:(0,5)__pyx_v_mininsert:(0,5)__pyx_v_filterSeqs:(0,2)__pyx_v_filterList:(0,2)__pyx_v_mergeMost:(0,2)__pyx_v_maxsize:(0,2)__pyx_v_mergeAll:(0,2)__pyx_v_ivalMethod:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_gap:r(0,5)__pyx_v_insert:r(0,5)__pyx_v_targetStart:r(0,5)__pyx_v_targetEnd:r(0,5)__pyx_v_start:r(0,5)__pyx_v_end:r(0,5)__pyx_v_maskStart:r(0,5)__pyx_v_maskEnd:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_targetDict:(0,2)__pyx_v_seq:(0,2)__pyx_v_t:(0,2)__pyx_v_seqIntervals:(0,2)__pyx_v_target:(0,2)__pyx_v_l:r(0,2)__pyx_v_lastIval:r(0,2)__pyx_v_m:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,5)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:r(0,2)__pyx_10:(0,2)__pyx_11:r(0,185)__pyx_12:(0,2)__pyx_argnames:V(0,315):t(0,315)=ar(0,120);0;9;(0,8)r:r(0,2)j:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)j:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)j:r(0,2)v:r(0,2)i:r(0,185)r:r(0,5)v:r(0,2)i:r(0,185)r:r(0,5)v:r(0,2)i:r(0,185)r:r(0,5)j:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)o:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)o:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,5)j:r(0,2)___pyx_argnames.12166__pyx_f_4pygr_11cnestedlist_10NLMSASlice_conservationFilter:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_seq:(0,2)__pyx_v_m:(0,2)__pyx_v_pIdentityMin:(0,2)__pyx_v_minAlignSize:(0,2)__pyx_v_maxAlignSize:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_seqEdge:(0,2)__pyx_v_t:(0,2)__pyx_v_mergeIntervals:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,316):t(0,316)=ar(0,120);0;5;(0,8)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)___pyx_argnames.12370__pyx_f_4pygr_11cnestedlist_10NLMSASlice_filterIvalConservation:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_seqIntervals:(0,2)__pyx_v_pIdentityMin:(0,2)__pyx_v_filterFun:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_types:r(0,2)__pyx_v_pIdentityMin0:r(0,2)__pyx_v_targetID:r(0,2)__pyx_v_l:r(0,2)__pyx_v_seq:r(0,2)__pyx_v_newIval:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_6:(0,2)__pyx_7:r(0,185)__pyx_argnames:V(0,317):t(0,317)=ar(0,120);0;3;(0,8)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)r:r(0,2)j:r(0,2)r:r(0,5)j:r(0,2)___pyx_argnames.12584__pyx_f_4pygr_11cnestedlist_10NLMSASlice_groupBySequences:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_seqIntervals:(0,2)__pyx_v_sourceOnly:(0,2)__pyx_v_indelCut:(0,2)__pyx_v_seqGroups:(0,2)__pyx_v_minAligned:(0,2)__pyx_v_pMinAligned:(0,2)__pyx_v_seqMethod:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_i:(0,5)__pyx_v_j:r(0,5)__pyx_v_start:r(0,5)__pyx_v_end:(0,5)__pyx_v_targetStart:r(0,5)__pyx_v_targetEnd:(0,5)__pyx_v_ipos:(0,5)__pyx_v_id:r(0,5)__pyx_v_f:r(0,318)float:t(0,318)=r(0,5);4;0;__pyx_v_nl:r(0,195)__pyx_v_result:r(0,2)__pyx_v_mapping:r(0,2)__pyx_v_seqs:r(0,2)__pyx_v_bounds:r(0,2)__pyx_v_seq:r(0,2)__pyx_v_ivals:(0,2)__pyx_v_isIndel:r(0,2)__pyx_v_ival:r(0,2)__pyx_v_seqStart:(0,2)__pyx_v_maskStart:(0,2)__pyx_v_bound:(0,2)__pyx_v_isStart:r(0,2)__pyx_v_mergeIntervals:(0,2)__pyx_v_pleaseClip:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:(0,5)__pyx_10:r(0,2)__pyx_11:r(0,185)__pyx_12:r(0,2)__pyx_argnames:V(0,319):t(0,319)=ar(0,120);0;7;(0,8)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.13401__pyx_f_4pygr_11cnestedlist_10NLMSASlice_regions:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_dummyArg:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_ns_lpo:r(0,194)__pyx_v_l:r(0,2)__pyx_v_subslice:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_6:r(0,185)__pyx_argnames:V(0,320):t(0,320)=ar(0,120);0;1;(0,8)i:r(0,185)o:r(0,2)i:r(0,185)o:r(0,2)j:r(0,2)type:r(0,228)type:r(0,228)___pyx_argnames.17977__pyx_f_4pygr_11cnestedlist_5NLMSA_readMAFfiles:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_mafFiles:(0,2)__pyx_v_maxint:(0,2)__pyx_v_n:r(0,5)__pyx_v_block_len:(0,5)__pyx_v_tmp:(0,292)__pyx_v_a_header:(0,321)__pyx_v_ifile:r(0,159)__pyx_v_im:(0,322)__pyx_v_im_tmp:(0,130)__pyx_v_ns_lpo:r(0,194):t(0,321)=ar(0,120);0;3;(0,54):t(0,322)=ar(0,120);0;4095;(0,130)__pyx_v_ns:(0,194)__pyx_v_build_ifile:(0,323)__pyx_v_nbuild:(0,324)__pyx_v_has_continuation:(0,5):t(0,323)=ar(0,120);0;4095;(0,159):t(0,324)=ar(0,120);0;4095;(0,5)__pyx_v_linecode_count:(0,325)__pyx_v_pythonStr:(0,2)__pyx_v_seqInfo:(0,2)__pyx_v_filename:(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:r(0,185):t(0,325)=ar(0,120);0;255;(0,183)__pyx_3:r(0,2)__pyx_4:(0,2)__pyx_6:(0,5)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_argnames:V(0,326):t(0,326)=ar(0,120);0;2;(0,8)i:r(0,185)o:r(0,2)r:r(0,2)j:r(0,2)type:r(0,228)type:r(0,228)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.18431__pyx_f_4pygr_11cnestedlist_5NLMSA_readAxtNet:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_axtFiles:(0,2)__pyx_v_bidirectionalRule:(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_isrc:(0,5)__pyx_v_is_bidirectional:r(0,5)__pyx_v_comment:(0,321)__pyx_v_src_prefix:(0,327)__pyx_v_dest_prefix:(0,327)__pyx_v_ifile:(0,159)__pyx_v_im:(0,322)__pyx_v_im_tmp:(0,130)__pyx_v_ns_src:r(0,194):t(0,327)=ar(0,120);0;63;(0,54)__pyx_v_build_ifile:(0,323)__pyx_v_nbuild:(0,324)__pyx_v_pythonStr:r(0,2)__pyx_v_seqInfo:r(0,2)__pyx_v_string:r(0,2)__pyx_v_os:r(0,2)__pyx_v_filename:r(0,2)__pyx_v_t:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,185)__pyx_2:(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_6:(0,5)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_argnames:V(0,328):t(0,328)=ar(0,120);0;2;(0,8)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)__pyx_f_4pygr_11cnestedlist_5NLMSA___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_id:r(0,2)__pyx_v_ns:r(0,2)__pyx_v_offset:r(0,2)__pyx_v_i:(0,2)__pyx_v_l:(0,2)__pyx_v_myslice:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:(0,2)__pyx_3:r(0,5)__pyx_4:r(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,185)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)item:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)j:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)___pyx_argnames.8674__pyx_tp_new_4pygr_11cnestedlist_IntervalFileDBIterator:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)___pyx_argnames.14896__pyx_f_4pygr_11cnestedlist_13NLMSASequence___init__:f(0,5)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_nl:(0,195)__pyx_v_filestem:(0,2)__pyx_v_seq:(0,2)__pyx_v_mode:(0,2)__pyx_v_is_union:(0,2)__pyx_v_length:(0,2)__pyx_v_types:r(0,2)__pyx_v_lastLPO:(0,2)__pyx_v_filename:(0,2)__pyx_v_errmsg:(0,2)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)__pyx_10:r(0,2)__pyx_11:(0,5)__pyx_12:r(0,185)__pyx_argnames:V(0,329):t(0,329)=ar(0,120);0;6;(0,8)type:r(0,228)type:r(0,228)type:r(0,228)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)j:r(0,2)___pyx_argnames.8075__pyx_f_4pygr_11cnestedlist_10IntervalDB_save_tuples:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_l:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_t:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_6:r(0,2)__pyx_argnames:V(0,330):t(0,330)=ar(0,120);0;1;(0,8)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)__pyx_m:S(0,2)__pyx_b:S(0,2)__pyx_lineno:S(0,5)__pyx_filename:S(0,8)__pyx_f:S(0,233)__pyx_vtabptr_4pygr_11cnestedlist_IntervalDBIterator:S(0,220)__pyx_vtabptr_4pygr_11cnestedlist_NLMSASequence:S(0,202)__pyx_vtabptr_4pygr_11cnestedlist_IntervalFileDBIterator:S(0,123)__pyx_vtabptr_4pygr_11cnestedlist_NLMSA:S(0,203)__pyx_vtabptr_4pygr_11cnestedlist_NLMSASlice:S(0,193)__pyx_vtabptr_4pygr_11cnestedlist_NLMSANode:S(0,188)__pyx_ptype_4pygr_11cnestedlist_IntervalDB:S(0,228)__pyx_ptype_4pygr_11cnestedlist_IntervalDBIterator:S(0,228)__pyx_ptype_4pygr_11cnestedlist_IntervalFileDB:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSASequence:S(0,228)__pyx_ptype_4pygr_11cnestedlist_IntervalFileDBIterator:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSA:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSASlice:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSASliceLetters:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSANode:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSASliceIterator:S(0,228)__pyx_k1:S(0,331)__pyx_k2:S(0,332)__pyx_k3:S(0,333)__pyx_k4:S(0,334)__pyx_k5:S(0,335)__pyx_k6:S(0,336)__pyx_k7:S(0,337)__pyx_k8:S(0,338)__pyx_k9:S(0,339)__pyx_k10:S(0,340)__pyx_k11:S(0,341)__pyx_k12:S(0,342)__pyx_k13:S(0,343)__pyx_k14:S(0,344)__pyx_k15:S(0,345)__pyx_k16:S(0,346)__pyx_k17:S(0,347)__pyx_k18:S(0,348)__pyx_k19:S(0,349)__pyx_k20:S(0,350)__pyx_k21:S(0,351)__pyx_k22:S(0,352)__pyx_k23:S(0,353)__pyx_k24:S(0,354)__pyx_k25:S(0,355)__pyx_k26:S(0,356)__pyx_k27:S(0,357)__pyx_k28:S(0,358)__pyx_k29:S(0,359)__pyx_k30:S(0,360)__pyx_k31:S(0,361)__pyx_k32:S(0,362)__pyx_k33:S(0,363)__pyx_k34:S(0,364)__pyx_k35:S(0,365)__pyx_k36:S(0,366)__pyx_k37:S(0,367)__pyx_k38:S(0,368)__pyx_k39:S(0,369)__pyx_k40:S(0,370)__pyx_k41:S(0,371)__pyx_k42:S(0,372)__pyx_k43:S(0,373)__pyx_k44:S(0,374)__pyx_k45:S(0,375)__pyx_k46:S(0,376)__pyx_k47:S(0,377)__pyx_k48:S(0,378)__pyx_k49:S(0,379)__pyx_k50:S(0,380)__pyx_k51:S(0,381)__pyx_k52:S(0,382)__pyx_k53:S(0,383)__pyx_k54:S(0,384)__pyx_k55:S(0,385)__pyx_k56:S(0,386)__pyx_k57:S(0,387)__pyx_k58:S(0,388)__pyx_k59:S(0,389)__pyx_k60:S(0,390)__pyx_k61:S(0,391)__pyx_k62:S(0,392)__pyx_k63:S(0,393)__pyx_k64:S(0,394)__pyx_k65:S(0,395)__pyx_k66:S(0,396)__pyx_k67:S(0,397)__pyx_k68:S(0,398)__pyx_k69:S(0,399)__pyx_k70:S(0,400)__pyx_k71:S(0,401)__pyx_k72:S(0,402)__pyx_k73:S(0,403)__pyx_k74:S(0,404)__pyx_k75:S(0,405)__pyx_k76:S(0,406)__pyx_k77:S(0,407)__pyx_k78:S(0,408)__pyx_k79:S(0,409)__pyx_k80:S(0,410)__pyx_k81:S(0,411)__pyx_k82:S(0,412)__pyx_k83:S(0,413)__pyx_k84:S(0,414)__pyx_k85:S(0,415)__pyx_k86:S(0,416)__pyx_k87:S(0,417)__pyx_k88:S(0,418)__pyx_k89:S(0,419)__pyx_k90:S(0,420)__pyx_k91:S(0,421)__pyx_k92:S(0,422)__pyx_k93:S(0,423)__pyx_k94:S(0,424)__pyx_k95:S(0,425)__pyx_k96:S(0,426)__pyx_k97:S(0,427)__pyx_k98:S(0,428)__pyx_k99:S(0,429)__pyx_k100:S(0,430)__pyx_k101:S(0,431)__pyx_k102:S(0,432)__pyx_k103:S(0,433)__pyx_k104:S(0,434)__pyx_k105:S(0,435)__pyx_k106:S(0,436)__pyx_k107:S(0,437)__pyx_k108:S(0,438)__pyx_k109:S(0,439)__pyx_k110:S(0,440)__pyx_k111:S(0,441)__pyx_k112:S(0,442)__pyx_k113:S(0,443)__pyx_k114:S(0,444)__pyx_k115:S(0,445)__pyx_k116:S(0,446)__pyx_k117:S(0,447)__pyx_k118:S(0,448)__pyx_k119:S(0,449)__pyx_k120:S(0,450)__pyx_k121:S(0,451)__pyx_k122:S(0,452)__pyx_k123:S(0,453)__pyx_k124:S(0,454)__pyx_k125:S(0,455)__pyx_k126:S(0,456)__pyx_k127:S(0,457)__pyx_k128:S(0,458)__pyx_k129:S(0,459)__pyx_k130:S(0,460)__pyx_k131:S(0,461)__pyx_k132:S(0,462)__pyx_k133:S(0,463)__pyx_k134:S(0,464)__pyx_k135:S(0,465)__pyx_k136:S(0,466)__pyx_k137:S(0,467)__pyx_k138:S(0,468)__pyx_k139:S(0,469)__pyx_k140:S(0,470)__pyx_k141:S(0,471)__pyx_k142:S(0,472)__pyx_k143:S(0,473)__pyx_k144:S(0,474)__pyx_k145:S(0,475)__pyx_k146:S(0,476)__pyx_k147:S(0,477)__pyx_k148:S(0,478)__pyx_k149:S(0,479)__pyx_k150:S(0,480)__pyx_k151:S(0,481)__pyx_k152:S(0,482)__pyx_k153:S(0,483)__pyx_k154:S(0,484)__pyx_k155:S(0,485)__pyx_k156:S(0,486)__pyx_k157:S(0,487)__pyx_k158:S(0,488)__pyx_k159:S(0,489)__pyx_k160:S(0,490)__pyx_k161:S(0,491)__pyx_k162:S(0,492)__pyx_k163:S(0,493)__pyx_k164:S(0,494)__pyx_k165:S(0,495)__pyx_k166:S(0,496)__pyx_k167:S(0,497)__pyx_k168:S(0,498)__pyx_k169:S(0,499)__pyx_k170:S(0,500)__pyx_k171:S(0,501)__pyx_k172:S(0,502)__pyx_k173:S(0,503)__pyx_k174:S(0,504)__pyx_k175:S(0,505)__pyx_k176:S(0,506)__pyx_k177:S(0,507)__pyx_k178:S(0,508)__pyx_k179:S(0,509)__pyx_k180:S(0,510)__pyx_k181:S(0,511)__pyx_k182:S(0,512)__pyx_k183:S(0,513)__pyx_k184:S(0,514)__pyx_k185:S(0,515)__pyx_k186:S(0,516)__pyx_k187:S(0,517)__pyx_k188:S(0,518)__pyx_k189:S(0,519)__pyx_k190:S(0,520)__pyx_k191:S(0,521)__pyx_k192:S(0,522)__pyx_k193:S(0,523)__pyx_k194:S(0,524)__pyx_k195:S(0,525)__pyx_k196:S(0,526)__pyx_k197:S(0,527)__pyx_k198:S(0,528)__pyx_k199:S(0,529)__pyx_k200:S(0,530)__pyx_k201:S(0,531)__pyx_k202:S(0,532)__pyx_k203:S(0,533)__pyx_k204:S(0,534)__pyx_k205:S(0,535)__pyx_k206:S(0,536)__pyx_k207:S(0,537)__pyx_k208:S(0,538)__pyx_k209:S(0,539)__pyx_k210:S(0,540)__pyx_k211:S(0,541)__pyx_k212:S(0,542)__pyx_k213:S(0,543)__pyx_k214:S(0,544)__pyx_k215:S(0,545)__pyx_k216:S(0,546)__pyx_k217:S(0,547)__pyx_k218:S(0,548)__pyx_k219:S(0,549)__pyx_k220:S(0,550)__pyx_k221:S(0,551)__pyx_k222:S(0,552)__pyx_k223:S(0,553)__pyx_k224:S(0,554)__pyx_k225:S(0,555)__pyx_k226:S(0,556)__pyx_k227:S(0,557)__pyx_k228:S(0,558)__pyx_k229:S(0,559)__pyx_k230:S(0,560)__pyx_k231:S(0,561)__pyx_k232:S(0,562)__pyx_k233:S(0,563)__pyx_k234:S(0,564)__pyx_k235:S(0,565)__pyx_k236:S(0,566)__pyx_k237:S(0,567)__pyx_k238:S(0,568)__pyx_k239:S(0,569)__pyx_k240:S(0,570)__pyx_k241:S(0,571)__pyx_k242:S(0,572)__pyx_k243:S(0,573)__pyx_k244:S(0,574)__pyx_k245:S(0,575)__pyx_k246:S(0,576)__pyx_k247:S(0,577)__pyx_k248:S(0,578)__pyx_k249:S(0,579)__pyx_k250:S(0,580)__pyx_k251:S(0,581)__pyx_k252:S(0,582)__pyx_n_AttributeError:S(0,2)__pyx_n_BuildMSASlice:S(0,2)__pyx_n_ClassicUnpickler:S(0,2)__pyx_n_DictQueue:S(0,2)__pyx_n_EmptyAlignmentError:S(0,2)__pyx_n_EmptySlice:S(0,2)__pyx_n_EmptySliceError:S(0,2)__pyx_n_FloatType:S(0,2)__pyx_n_LetterEdge:S(0,2)__pyx_n_NLMSASeqDict:S(0,2)__pyx_n_NLMSASequence:S(0,2)__pyx_n_NLMSA_LPO_Internal:S(0,2)__pyx_n_NLMSA_UNION_Internal:S(0,2)__pyx_n_NLMSAindex:S(0,2)__pyx_n_PrefixUnionDict:S(0,2)__pyx_n_RLIMIT_NOFILE:S(0,2)__pyx_n_Seq2SeqEdge:S(0,2)__pyx_n_SeqCacheOwner:S(0,2)__pyx_n_SeqPath:S(0,2)__pyx_n_SeqPrefixUnionDict:S(0,2)__pyx_n_StringType:S(0,2)__pyx_n___class__:S(0,2)__pyx_n___getstate__:S(0,2)__pyx_n___iadd__:S(0,2)__pyx_n___init__:S(0,2)__pyx_n__cache_max:S(0,2)__pyx_n__persistent_id:S(0,2)__pyx_n_absoluteSlice:S(0,2)__pyx_n_addAll:S(0,2)__pyx_n_addToSeqlist:S(0,2)__pyx_n_add_aligned_intervals:S(0,2)__pyx_n_advanceStartStop:S(0,2)__pyx_n_append:S(0,2)__pyx_n_basename:S(0,2)__pyx_n_build:S(0,2)__pyx_n_buildFiles:S(0,2)__pyx_n_buildFromUnsortedFile:S(0,2)__pyx_n_buildInMemory:S(0,2)__pyx_n_cacheHint:S(0,2)__pyx_n_cache_reference:S(0,2)__pyx_n_check_nonempty:S(0,2)__pyx_n_chr:S(0,2)__pyx_n_classutil:S(0,2)__pyx_n_clip_interval_list:S(0,2)__pyx_n_close:S(0,2)__pyx_n_cmp:S(0,2)__pyx_n_conservationFilter:S(0,2)__pyx_n_conservedSegment:S(0,2)__pyx_n_doSlice:S(0,2)__pyx_n_dump:S(0,2)__pyx_n_edges:S(0,2)__pyx_n_end:S(0,2)__pyx_n_filterIvalConservation:S(0,2)__pyx_n_filterSeqs:S(0,2)__pyx_n_forceLoad:S(0,2)__pyx_n_generate_nlmsa_edges:S(0,2)__pyx_n_get:S(0,2)__pyx_n_getID:S(0,2)__pyx_n_getIDcoords:S(0,2)__pyx_n_getSeq:S(0,2)__pyx_n_getSeqID:S(0,2)__pyx_n_groupByIntervals:S(0,2)__pyx_n_groupBySequences:S(0,2)__pyx_n_id:S(0,2)__pyx_n_im:S(0,2)__pyx_n_indelCut:S(0,2)__pyx_n_info:S(0,2)__pyx_n_initLPO:S(0,2)__pyx_n_inverseDB:S(0,2)__pyx_n_ipos:S(0,2)__pyx_n_is_bidirectional:S(0,2)__pyx_n_is_lpo:S(0,2)__pyx_n_is_union:S(0,2)__pyx_n_items:S(0,2)__pyx_n_iteritems:S(0,2)__pyx_n_join:S(0,2)__pyx_n_keys:S(0,2)__pyx_n_length:S(0,2)__pyx_n_load:S(0,2)__pyx_n_logger:S(0,2)__pyx_n_mapping:S(0,2)__pyx_n_maxAlignSize:S(0,2)__pyx_n_maxgap:S(0,2)__pyx_n_maxinsert:S(0,2)__pyx_n_memory:S(0,2)__pyx_n_mergeAll:S(0,2)__pyx_n_mergeSeq:S(0,2)__pyx_n_minAlignSize:S(0,2)__pyx_n_minAligned:S(0,2)__pyx_n_mininsert:S(0,2)__pyx_n_msaSlice:S(0,2)__pyx_n_n:S(0,2)__pyx_n_name:S(0,2)__pyx_n_newSequence:S(0,2)__pyx_n_nextID:S(0,2)__pyx_n_nlmsaSequence:S(0,2)__pyx_n_nlmsaSlice:S(0,2)__pyx_n_nlmsa_utils:S(0,2)__pyx_n_nodeEdges:S(0,2)__pyx_n_noname:S(0,2)__pyx_n_ns:S(0,2)__pyx_n_offset:S(0,2)__pyx_n_onDemand:S(0,2)__pyx_n_open:S(0,2)__pyx_n_open_shelve:S(0,2)__pyx_n_orientation:S(0,2)__pyx_n_os:S(0,2)__pyx_n_pAlignedMin:S(0,2)__pyx_n_pIdentityMin:S(0,2)__pyx_n_pMinAligned:S(0,2)__pyx_n_pairwiseMode:S(0,2)__pyx_n_path:S(0,2)__pyx_n_pathForward:S(0,2)__pyx_n_pathstem:S(0,2)__pyx_n_pickle:S(0,2)__pyx_n_prefixDict:S(0,2)__pyx_n_prune_self_mappings:S(0,2)__pyx_n_pygr:S(0,2)__pyx_n_r:S(0,2)__pyx_n_rU:S(0,2)__pyx_n_rawIvals:S(0,2)__pyx_n_rb:S(0,2)__pyx_n_readAxtNet:S(0,2)__pyx_n_readMAFfiles:S(0,2)__pyx_n_read_attrs:S(0,2)__pyx_n_read_indexes:S(0,2)__pyx_n_read_seq_dict:S(0,2)__pyx_n_relativeSlice:S(0,2)__pyx_n_remove:S(0,2)__pyx_n_reopenReadOnly:S(0,2)__pyx_n_resource:S(0,2)__pyx_n_runBuildMethod:S(0,2)__pyx_n_saveSeq:S(0,2)__pyx_n_save_seq_dict:S(0,2)__pyx_n_save_tuples:S(0,2)__pyx_n_seq:S(0,2)__pyx_n_seqBounds:S(0,2)__pyx_n_seqDict:S(0,2)__pyx_n_seqInfoDict:S(0,2)__pyx_n_seqInterval:S(0,2)__pyx_n_seqdb:S(0,2)__pyx_n_seqlist:S(0,2)__pyx_n_sequence:S(0,2)__pyx_n_setrlimit:S(0,2)__pyx_n_sort:S(0,2)__pyx_n_sourceDB:S(0,2)__pyx_n_sourceOnly:S(0,2)__pyx_n_sourcePath:S(0,2)__pyx_n_split:S(0,2)__pyx_n_splitLPOintervals:S(0,2)__pyx_n_start:S(0,2)__pyx_n_startswith:S(0,2)__pyx_n_stop:S(0,2)__pyx_n_string:S(0,2)__pyx_n_strip:S(0,2)__pyx_n_sys:S(0,2)__pyx_n_targetDB:S(0,2)__pyx_n_target_start:S(0,2)__pyx_n_types:S(0,2)__pyx_n_w:S(0,2)__pyx_n_warn:S(0,2)__pyx_n_wb:S(0,2)__pyx_n_worldbase:S(0,2)__pyx_n_write:S(0,2)__pyx_n_write_binaries:S(0,2)__pyx_n_xmlrpc:S(0,2)__pyx_k3p:S(0,2)__pyx_k5p:S(0,2)__pyx_k7p:S(0,2)__pyx_k8p:S(0,2)__pyx_k11p:S(0,2)__pyx_k13p:S(0,2)__pyx_k14p:S(0,2)__pyx_k15p:S(0,2)__pyx_k17p:S(0,2)__pyx_k26p:S(0,2)__pyx_k27p:S(0,2)__pyx_k35p:S(0,2)__pyx_k47p:S(0,2)__pyx_k53p:S(0,2)__pyx_k83p:S(0,2)__pyx_k86p:S(0,2)__pyx_k88p:S(0,2)__pyx_k89p:S(0,2)__pyx_k90p:S(0,2)__pyx_k99p:S(0,2)__pyx_k104p:S(0,2)__pyx_k106p:S(0,2)__pyx_k107p:S(0,2)__pyx_k113p:S(0,2)__pyx_k114p:S(0,2)__pyx_k126p:S(0,2)__pyx_k139p:S(0,2)__pyx_k144p:S(0,2)__pyx_k149p:S(0,2)__pyx_k153p:S(0,2)__pyx_k154p:S(0,2)__pyx_k156p:S(0,2)__pyx_k160p:S(0,2)__pyx_k165p:S(0,2)__pyx_k168p:S(0,2)__pyx_k171p:S(0,2)__pyx_k174p:S(0,2)__pyx_k176p:S(0,2)__pyx_k177p:S(0,2)__pyx_k180p:S(0,2)__pyx_k182p:S(0,2)__pyx_k183p:S(0,2)__pyx_k185p:S(0,2)__pyx_k186p:S(0,2)__pyx_k188p:S(0,2)__pyx_k192p:S(0,2)__pyx_k193p:S(0,2)__pyx_k194p:S(0,2)__pyx_k196p:S(0,2)__pyx_k197p:S(0,2)__pyx_k198p:S(0,2)__pyx_k199p:S(0,2)__pyx_k203p:S(0,2)__pyx_k206p:S(0,2)__pyx_k209p:S(0,2)__pyx_k211p:S(0,2)__pyx_k213p:S(0,2)__pyx_k214p:S(0,2)__pyx_k216p:S(0,2)__pyx_k221p:S(0,2)__pyx_k224p:S(0,2)__pyx_k225p:S(0,2)__pyx_k229p:S(0,2)__pyx_k230p:S(0,2)__pyx_k232p:S(0,2)__pyx_k233p:S(0,2)__pyx_k235p:S(0,2)__pyx_k239p:S(0,2)__pyx_k241p:S(0,2)__pyx_k246p:S(0,2)__pyx_k247p:S(0,2)__pyx_k248p:S(0,2)__pyx_string_tab:S(0,583)__pyx_d1:S(0,2)__pyx_d2:S(0,2)__pyx_d3:S(0,2)__pyx_d4:S(0,2)__pyx_d5:S(0,126):t(0,331)=ar(0,120);0;1;(0,54):t(0,332)=ar(0,120);0;14;(0,54):t(0,333)=ar(0,120);0;22;(0,54):t(0,334)=ar(0,120);0;5;(0,54):t(0,335)=ar(0,120);0;34;(0,54):t(0,336)=ar(0,120);0;2;(0,54):t(0,337)=ar(0,120);0;15;(0,54):t(0,338)=ar(0,120);0;27;(0,54):t(0,339)=ar(0,120);0;14;(0,54):t(0,340)=ar(0,120);0;6;(0,54):t(0,341)=ar(0,120);0;33;(0,54):t(0,342)=ar(0,120);0;9;(0,54):t(0,343)=ar(0,120);0;13;(0,54):t(0,344)=ar(0,120);0;56;(0,54):t(0,345)=ar(0,120);0;21;(0,54):t(0,346)=ar(0,120);0;4;(0,54):t(0,347)=ar(0,120);0;37;(0,54):t(0,348)=ar(0,120);0;9;(0,54):t(0,349)=ar(0,120);0;5;(0,54):t(0,350)=ar(0,120);0;7;(0,54):t(0,351)=ar(0,120);0;8;(0,54):t(0,352)=ar(0,120);0;14;(0,54):t(0,353)=ar(0,120);0;2;(0,54):t(0,354)=ar(0,120);0;11;(0,54):t(0,355)=ar(0,120);0;15;(0,54):t(0,356)=ar(0,120);0;29;(0,54):t(0,357)=ar(0,120);0;35;(0,54):t(0,358)=ar(0,120);0;8;(0,54):t(0,359)=ar(0,120);0;6;(0,54):t(0,360)=ar(0,120);0;10;(0,54):t(0,361)=ar(0,120);0;9;(0,54):t(0,362)=ar(0,120);0;8;(0,54):t(0,363)=ar(0,120);0;13;(0,54):t(0,364)=ar(0,120);0;2;(0,54):t(0,365)=ar(0,120);0;36;(0,54):t(0,366)=ar(0,120);0;11;(0,54):t(0,367)=ar(0,120);0;6;(0,54):t(0,368)=ar(0,120);0;15;(0,54):t(0,369)=ar(0,120);0;11;(0,54):t(0,370)=ar(0,120);0;16;(0,54):t(0,371)=ar(0,120);0;8;(0,54):t(0,372)=ar(0,120);0;16;(0,54):t(0,373)=ar(0,120);0;8;(0,54):t(0,374)=ar(0,120);0;11;(0,54):t(0,375)=ar(0,120);0;5;(0,54):t(0,376)=ar(0,120);0;4;(0,54):t(0,377)=ar(0,120);0;121;(0,54):t(0,378)=ar(0,120);0;5;(0,54):t(0,379)=ar(0,120);0;11;(0,54):t(0,380)=ar(0,120);0;13;(0,54):t(0,381)=ar(0,120);0;9;(0,54):t(0,382)=ar(0,120);0;12;(0,54):t(0,383)=ar(0,120);0;32;(0,54):t(0,384)=ar(0,120);0;10;(0,54):t(0,385)=ar(0,120);0;11;(0,54):t(0,386)=ar(0,120);0;5;(0,54):t(0,387)=ar(0,120);0;4;(0,54):t(0,388)=ar(0,120);0;9;(0,54):t(0,389)=ar(0,120);0;8;(0,54):t(0,390)=ar(0,120);0;6;(0,54):t(0,391)=ar(0,120);0;9;(0,54):t(0,392)=ar(0,120);0;9;(0,54):t(0,393)=ar(0,120);0;10;(0,54):t(0,394)=ar(0,120);0;11;(0,54):t(0,395)=ar(0,120);0;12;(0,54):t(0,396)=ar(0,120);0;12;(0,54):t(0,397)=ar(0,120);0;12;(0,54):t(0,398)=ar(0,120);0;22;(0,54):t(0,399)=ar(0,120);0;13;(0,54):t(0,400)=ar(0,120);0;16;(0,54):t(0,401)=ar(0,120);0;18;(0,54):t(0,402)=ar(0,120);0;5;(0,54):t(0,403)=ar(0,120);0;18;(0,54):t(0,404)=ar(0,120);0;9;(0,54):t(0,405)=ar(0,120);0;7;(0,54):t(0,406)=ar(0,120);0;4;(0,54):t(0,407)=ar(0,120);0;10;(0,54):t(0,408)=ar(0,120);0;10;(0,54):t(0,409)=ar(0,120);0;11;(0,54):t(0,410)=ar(0,120);0;8;(0,54):t(0,411)=ar(0,120);0;9;(0,54):t(0,412)=ar(0,120);0;5;(0,54):t(0,413)=ar(0,120);0;39;(0,54):t(0,414)=ar(0,120);0;3;(0,54):t(0,415)=ar(0,120);0;13;(0,54):t(0,416)=ar(0,120);0;13;(0,54):t(0,417)=ar(0,120);0;16;(0,54):t(0,418)=ar(0,120);0;25;(0,54):t(0,419)=ar(0,120);0;15;(0,54):t(0,420)=ar(0,120);0;26;(0,54):t(0,421)=ar(0,120);0;4;(0,54):t(0,422)=ar(0,120);0;10;(0,54):t(0,423)=ar(0,120);0;2;(0,54):t(0,424)=ar(0,120);0;3;(0,54):t(0,425)=ar(0,120);0;10;(0,54):t(0,426)=ar(0,120);0;10;(0,54):t(0,427)=ar(0,120);0;4;(0,54):t(0,428)=ar(0,120);0;4;(0,54):t(0,429)=ar(0,120);0;49;(0,54):t(0,430)=ar(0,120);0;6;(0,54):t(0,431)=ar(0,120);0;6;(0,54):t(0,432)=ar(0,120);0;6;(0,54):t(0,433)=ar(0,120);0;1;(0,54):t(0,434)=ar(0,120);0;6;(0,54):t(0,435)=ar(0,120);0;2;(0,54):t(0,436)=ar(0,120);0;30;(0,54):t(0,437)=ar(0,120);0;24;(0,54):t(0,438)=ar(0,120);0;21;(0,54):t(0,439)=ar(0,120);0;14;(0,54):t(0,440)=ar(0,120);0;2;(0,54):t(0,441)=ar(0,120);0;6;(0,54):t(0,442)=ar(0,120);0;11;(0,54):t(0,443)=ar(0,120);0;29;(0,54):t(0,444)=ar(0,120);0;48;(0,54):t(0,445)=ar(0,120);0;11;(0,54):t(0,446)=ar(0,120);0;8;(0,54):t(0,447)=ar(0,120);0;8;(0,54):t(0,448)=ar(0,120);0;7;(0,54):t(0,449)=ar(0,120);0;8;(0,54):t(0,450)=ar(0,120);0;9;(0,54):t(0,451)=ar(0,120);0;13;(0,54):t(0,452)=ar(0,120);0;12;(0,54):t(0,453)=ar(0,120);0;7;(0,54):t(0,454)=ar(0,120);0;8;(0,54):t(0,455)=ar(0,120);0;8;(0,54):t(0,456)=ar(0,120);0;50;(0,54):t(0,457)=ar(0,120);0;13;(0,54):t(0,458)=ar(0,120);0;12;(0,54):t(0,459)=ar(0,120);0;10;(0,54):t(0,460)=ar(0,120);0;12;(0,54):t(0,461)=ar(0,120);0;10;(0,54):t(0,462)=ar(0,120);0;5;(0,54):t(0,463)=ar(0,120);0;18;(0,54):t(0,464)=ar(0,120);0;6;(0,54):t(0,465)=ar(0,120);0;7;(0,54):t(0,466)=ar(0,120);0;21;(0,54):t(0,467)=ar(0,120);0;5;(0,54):t(0,468)=ar(0,120);0;6;(0,54):t(0,469)=ar(0,120);0;15;(0,54):t(0,470)=ar(0,120);0;9;(0,54):t(0,471)=ar(0,120);0;16;(0,54):t(0,472)=ar(0,120);0;9;(0,54):t(0,473)=ar(0,120);0;12;(0,54):t(0,474)=ar(0,120);0;33;(0,54):t(0,475)=ar(0,120);0;8;(0,54):t(0,476)=ar(0,120);0;7;(0,54):t(0,477)=ar(0,120);0;9;(0,54):t(0,478)=ar(0,120);0;8;(0,54):t(0,479)=ar(0,120);0;11;(0,54):t(0,480)=ar(0,120);0;2;(0,54):t(0,481)=ar(0,120);0;10;(0,54):t(0,482)=ar(0,120);0;5;(0,54):t(0,483)=ar(0,120);0;1;(0,54):t(0,484)=ar(0,120);0;23;(0,54):t(0,485)=ar(0,120);0;18;(0,54):t(0,486)=ar(0,120);0;38;(0,54):t(0,487)=ar(0,120);0;8;(0,54):t(0,488)=ar(0,120);0;12;(0,54):t(0,489)=ar(0,120);0;6;(0,54):t(0,490)=ar(0,120);0;9;(0,54):t(0,491)=ar(0,120);0;4;(0,54):t(0,492)=ar(0,120);0;16;(0,54):t(0,493)=ar(0,120);0;12;(0,54):t(0,494)=ar(0,120);0;6;(0,54):t(0,495)=ar(0,120);0;39;(0,54):t(0,496)=ar(0,120);0;6;(0,54):t(0,497)=ar(0,120);0;4;(0,54):t(0,498)=ar(0,120);0;260;(0,54):t(0,499)=ar(0,120);0;13;(0,54):t(0,500)=ar(0,120);0;3;(0,54):t(0,501)=ar(0,120);0;57;(0,54):t(0,502)=ar(0,120);0;7;(0,54):t(0,503)=ar(0,120);0;10;(0,54):t(0,504)=ar(0,120);0;54;(0,54):t(0,505)=ar(0,120);0;17;(0,54):t(0,506)=ar(0,120);0;43;(0,54):t(0,507)=ar(0,120);0;30;(0,54):t(0,508)=ar(0,120);0;20;(0,54):t(0,509)=ar(0,120);0;11;(0,54):t(0,510)=ar(0,120);0;127;(0,54):t(0,511)=ar(0,120);0;2;(0,54):t(0,512)=ar(0,120);0;21;(0,54):t(0,513)=ar(0,120);0;22;(0,54):t(0,514)=ar(0,120);0;5;(0,54):t(0,515)=ar(0,120);0;31;(0,54):t(0,516)=ar(0,120);0;38;(0,54):t(0,517)=ar(0,120);0;4;(0,54):t(0,518)=ar(0,120);0;53;(0,54):t(0,519)=ar(0,120);0;3;(0,54):t(0,520)=ar(0,120);0;1;(0,54):t(0,521)=ar(0,120);0;6;(0,54):t(0,522)=ar(0,120);0;7;(0,54):t(0,523)=ar(0,120);0;24;(0,54):t(0,524)=ar(0,120);0;8;(0,54):t(0,525)=ar(0,120);0;8;(0,54):t(0,526)=ar(0,120);0;1;(0,54):t(0,527)=ar(0,120);0;4;(0,54):t(0,528)=ar(0,120);0;82;(0,54):t(0,529)=ar(0,120);0;41;(0,54):t(0,530)=ar(0,120);0;14;(0,54):t(0,531)=ar(0,120);0;10;(0,54):t(0,532)=ar(0,120);0;5;(0,54):t(0,533)=ar(0,120);0;12;(0,54):t(0,534)=ar(0,120);0;20;(0,54):t(0,535)=ar(0,120);0;19;(0,54):t(0,536)=ar(0,120);0;16;(0,54):t(0,537)=ar(0,120);0;3;(0,54):t(0,538)=ar(0,120);0;4;(0,54):t(0,539)=ar(0,120);0;18;(0,54):t(0,540)=ar(0,120);0;13;(0,54):t(0,541)=ar(0,120);0;321;(0,54):t(0,542)=ar(0,120);0;13;(0,54):t(0,543)=ar(0,120);0;30;(0,54):t(0,544)=ar(0,120);0;4;(0,54):t(0,545)=ar(0,120);0;11;(0,54):t(0,546)=ar(0,120);0;10;(0,54):t(0,547)=ar(0,120);0;10;(0,54):t(0,548)=ar(0,120);0;4;(0,54):t(0,549)=ar(0,120);0;14;(0,54):t(0,550)=ar(0,120);0;7;(0,54):t(0,551)=ar(0,120);0;308;(0,54):t(0,552)=ar(0,120);0;3;(0,54):t(0,553)=ar(0,120);0;27;(0,54):t(0,554)=ar(0,120);0;24;(0,54):t(0,555)=ar(0,120);0;400;(0,54):t(0,556)=ar(0,120);0;18;(0,54):t(0,557)=ar(0,120);0;18;(0,54):t(0,558)=ar(0,120);0;16;(0,54):t(0,559)=ar(0,120);0;21;(0,54):t(0,560)=ar(0,120);0;23;(0,54):t(0,561)=ar(0,120);0;26;(0,54):t(0,562)=ar(0,120);0;16;(0,54):t(0,563)=ar(0,120);0;0;(0,54):t(0,564)=ar(0,120);0;4;(0,54):t(0,565)=ar(0,120);0;42;(0,54):t(0,566)=ar(0,120);0;4;(0,54):t(0,567)=ar(0,120);0;9;(0,54):t(0,568)=ar(0,120);0;1;(0,54):t(0,569)=ar(0,120);0;7;(0,54):t(0,570)=ar(0,120);0;17;(0,54):t(0,571)=ar(0,120);0;131;(0,54):t(0,572)=ar(0,120);0;15;(0,54):t(0,573)=ar(0,120);0;17;(0,54):t(0,574)=ar(0,120);0;10;(0,54):t(0,575)=ar(0,120);0;13;(0,54):t(0,576)=ar(0,120);0;21;(0,54):t(0,577)=ar(0,120);0;27;(0,54):t(0,578)=ar(0,120);0;3;(0,54):t(0,579)=ar(0,120);0;52;(0,54):t(0,580)=ar(0,120);0;58;(0,54):t(0,581)=ar(0,120);0;6;(0,54):t(0,582)=ar(0,120);0;19;(0,54):t(0,583)=ar(0,120);0;238;(0,584)__Pyx_StringTabEntry:t(0,584)=(0,585):T(0,585)=s16p:(0,232),0,32;i:(0,5),32,32;s:(0,8),64,32;n:(0,33),96,32;;__pyx_d6:S(0,194)__pyx_d7:S(0,5)__pyx_d8:S(0,2)__pyx_d9:S(0,2)__pyx_d10:S(0,2)__pyx_d11:S(0,5)__pyx_d12:S(0,5)__pyx_d13:S(0,2)__pyx_d14:S(0,2)__pyx_d15:S(0,2)__pyx_d16:S(0,2)__pyx_d17:S(0,5)__pyx_d18:S(0,5)__pyx_d19:S(0,5)__pyx_d20:S(0,2)__pyx_d21:S(0,2)__pyx_d22:S(0,2)__pyx_d23:S(0,2)__pyx_d24:S(0,2)__pyx_d25:S(0,2)__pyx_d26:S(0,2)__pyx_d27:S(0,2)__pyx_d28:S(0,2)__pyx_d29:S(0,2)__pyx_d30:S(0,2)__pyx_d31:S(0,2)__pyx_d32:S(0,2)__pyx_d33:S(0,2)__pyx_d34:S(0,2)__pyx_d35:S(0,2)__pyx_d36:S(0,2)__pyx_d37:S(0,2)__pyx_d38:S(0,2)__pyx_d39:S(0,5)__pyx_d40:S(0,5)__pyx_d41:S(0,2)__pyx_d42:S(0,2)__pyx_d43:S(0,2)__pyx_d44:S(0,2)__pyx_d45:S(0,2)__pyx_d46:S(0,2)__pyx_d47:S(0,2)__pyx_d48:S(0,2)__pyx_d49:S(0,2)__pyx_d50:S(0,2)__pyx_d51:S(0,2)__pyx_d52:S(0,2)__pyx_d53:S(0,2)__pyx_d54:S(0,2)__pyx_d55:S(0,2)__pyx_d56:S(0,2)__pyx_d57:S(0,2)__pyx_d58:S(0,2)__pyx_d59:S(0,2)__pyx_d60:S(0,2)__pyx_d61:S(0,2)__pyx_d62:S(0,2)__pyx_d63:S(0,2)__pyx_d64:S(0,2)__pyx_d65:S(0,2)__pyx_d66:S(0,2)__pyx_d67:S(0,2)__pyx_d68:S(0,2)__pyx_doc_4pygr_11cnestedlist_10IntervalDB_save_tuples:S(0,586)__pyx_doc_4pygr_11cnestedlist_10IntervalDB_runBuildMethod:S(0,587)__pyx_doc_4pygr_11cnestedlist_10IntervalDB_buildFromUnsortedFile:S(0,588)__pyx_doc_4pygr_11cnestedlist_22IntervalFileDBIterator_mergeSeq:S(0,589)__pyx_doc_4pygr_11cnestedlist_17NLMSASliceLetters_items:S(0,590)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_edges:S(0,591)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_items:S(0,592)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_keys:S(0,593)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_matchIntervals:S(0,594)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_findSeqEnds:S(0,595)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_generateSeqEnds:S(0,596)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_groupByIntervals:S(0,597)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_groupBySequences:S(0,598)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_clip_interval_list:S(0,599)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_split:S(0,600)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_regions:S(0,601)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_rawIvals:S(0,602)__pyx_doc_4pygr_11cnestedlist_9NLMSANode_getSeqPos:S(0,603)__pyx_doc_4pygr_11cnestedlist_9NLMSANode_getEdgeSeqs:S(0,604)__pyx_doc_4pygr_11cnestedlist_9NLMSANode_nodeEdges:S(0,605)__pyx_doc_4pygr_11cnestedlist_13NLMSASequence_forceLoad:S(0,606)__pyx_doc_4pygr_11cnestedlist_13NLMSASequence_close:S(0,607)__pyx_doc_4pygr_11cnestedlist_13NLMSASequence_buildFiles:S(0,608)__pyx_doc_4pygr_11cnestedlist_5NLMSA_close:S(0,609)__pyx_doc_4pygr_11cnestedlist_5NLMSA_read_indexes:S(0,610)__pyx_doc_4pygr_11cnestedlist_5NLMSA_read_attrs:S(0,611)__pyx_doc_4pygr_11cnestedlist_5NLMSA_addToSeqlist:S(0,612)__pyx_doc_4pygr_11cnestedlist_5NLMSA_newSequence:S(0,613)__pyx_doc_4pygr_11cnestedlist_5NLMSA_nextID:S(0,614)__pyx_doc_4pygr_11cnestedlist_5NLMSA_initLPO:S(0,615)__pyx_doc_4pygr_11cnestedlist_5NLMSA_init_pairwise_mode:S(0,616)__pyx_doc_4pygr_11cnestedlist_5NLMSA_addAnnotation:S(0,617)__pyx_doc_4pygr_11cnestedlist_5NLMSA_add_aligned_intervals:S(0,618)__pyx_doc_4pygr_11cnestedlist_5NLMSA_readMAFfiles:S(0,619)__pyx_doc_4pygr_11cnestedlist_5NLMSA_readAxtNet:S(0,620)__pyx_doc_4pygr_11cnestedlist_5NLMSA_buildFiles:S(0,621)__pyx_doc_4pygr_11cnestedlist_5NLMSA_save_seq_dict:S(0,622)__pyx_doc_4pygr_11cnestedlist_5NLMSA_build:S(0,623)__pyx_doc_4pygr_11cnestedlist_5NLMSA_seqInterval:S(0,624)__pyx_doc_4pygr_11cnestedlist_dump_textfile:S(0,625)__pyx_doc_4pygr_11cnestedlist_textfile_to_binaries:S(0,626)__pyx_methods_4pygr_11cnestedlist_IntervalDB:S(0,627)__pyx_tp_as_number_IntervalDB:S(0,61)__pyx_tp_as_sequence_IntervalDB:S(0,62)__pyx_tp_as_mapping_IntervalDB:S(0,63)__pyx_tp_as_buffer_IntervalDB:S(0,68)__pyx_vtable_4pygr_11cnestedlist_IntervalDBIterator:S(0,222):t(0,586)=ar(0,120);0;51;(0,54):t(0,587)=ar(0,120);0;49;(0,54):t(0,588)=ar(0,120);0;48;(0,54):t(0,589)=ar(0,120);0;61;(0,54):t(0,590)=ar(0,120);0;40;(0,54):t(0,591)=ar(0,120);0;64;(0,54):t(0,592)=ar(0,120);0;53;(0,54):t(0,593)=ar(0,120);0;72;(0,54):t(0,594)=ar(0,120);0;193;(0,54):t(0,595)=ar(0,120);0;52;(0,54):t(0,596)=ar(0,120);0;37;(0,54):t(0,597)=ar(0,120);0;1306;(0,54):t(0,598)=ar(0,120);0;1386;(0,54):t(0,599)=ar(0,120);0;46;(0,54):t(0,600)=ar(0,120);0;116;(0,54):t(0,601)=ar(0,120);0;110;(0,54):t(0,602)=ar(0,120);0;50;(0,54):t(0,603)=ar(0,120);0;39;(0,54):t(0,604)=ar(0,120);0;62;(0,54):t(0,605)=ar(0,120);0;37;(0,54):t(0,606)=ar(0,120);0;53;(0,54):t(0,607)=ar(0,120);0;63;(0,54):t(0,608)=ar(0,120);0;52;(0,54):t(0,609)=ar(0,120);0;28;(0,54):t(0,610)=ar(0,120);0;66;(0,54):t(0,611)=ar(0,120);0;61;(0,54):t(0,612)=ar(0,120);0;51;(0,54):t(0,613)=ar(0,120);0;46;(0,54):t(0,614)=ar(0,120);0;40;(0,54):t(0,615)=ar(0,120);0;30;(0,54):t(0,616)=ar(0,120);0;67;(0,54):t(0,617)=ar(0,120);0;60;(0,54):t(0,618)=ar(0,120);0;34;(0,54):t(0,619)=ar(0,120);0;38;(0,54):t(0,620)=ar(0,120);0;41;(0,54):t(0,621)=ar(0,120);0;65;(0,54):t(0,622)=ar(0,120);0;45;(0,54):t(0,623)=ar(0,120);0;69;(0,54):t(0,624)=ar(0,120);0;45;(0,54):t(0,625)=ar(0,120);0;38;(0,54):t(0,626)=ar(0,120);0;51;(0,54):t(0,627)=ar(0,120);0;8;(0,72)__pyx_methods_4pygr_11cnestedlist_IntervalDBIterator:S(0,628)__pyx_tp_as_number_IntervalDBIterator:S(0,61)__pyx_tp_as_sequence_IntervalDBIterator:S(0,62)__pyx_tp_as_mapping_IntervalDBIterator:S(0,63)__pyx_tp_as_buffer_IntervalDBIterator:S(0,68)__pyx_methods_4pygr_11cnestedlist_IntervalFileDB:S(0,629)__pyx_tp_as_number_IntervalFileDB:S(0,61)__pyx_tp_as_sequence_IntervalFileDB:S(0,62)__pyx_tp_as_mapping_IntervalFileDB:S(0,63)__pyx_tp_as_buffer_IntervalFileDB:S(0,68)__pyx_vtable_4pygr_11cnestedlist_NLMSASequence:S(0,206):t(0,628)=ar(0,120);0;0;(0,72):t(0,629)=ar(0,120);0;5;(0,72)__pyx_methods_4pygr_11cnestedlist_NLMSASequence:S(0,630)__pyx_members_4pygr_11cnestedlist_NLMSASequence:S(0,631)__pyx_tp_as_number_NLMSASequence:S(0,61)__pyx_tp_as_sequence_NLMSASequence:S(0,62)__pyx_tp_as_mapping_NLMSASequence:S(0,63)__pyx_tp_as_buffer_NLMSASequence:S(0,68)__pyx_vtable_4pygr_11cnestedlist_IntervalFileDBIterator:S(0,128):t(0,630)=ar(0,120);0;4;(0,72):t(0,631)=ar(0,120);0;11;(0,73)__pyx_methods_4pygr_11cnestedlist_IntervalFileDBIterator:S(0,632)__pyx_tp_as_number_IntervalFileDBIterator:S(0,61)__pyx_tp_as_sequence_IntervalFileDBIterator:S(0,62)__pyx_tp_as_mapping_IntervalFileDBIterator:S(0,63)__pyx_tp_as_buffer_IntervalFileDBIterator:S(0,68)__pyx_vtable_4pygr_11cnestedlist_NLMSA:S(0,207):t(0,632)=ar(0,120);0;1;(0,72)__pyx_methods_4pygr_11cnestedlist_NLMSA:S(0,633)__pyx_members_4pygr_11cnestedlist_NLMSA:S(0,634)__pyx_tp_as_number_NLMSA:S(0,61)__pyx_tp_as_sequence_NLMSA:S(0,62)__pyx_tp_as_mapping_NLMSA:S(0,63)__pyx_tp_as_buffer_NLMSA:S(0,68)__pyx_vtable_4pygr_11cnestedlist_NLMSASlice:S(0,197):t(0,633)=ar(0,120);0;20;(0,72):t(0,634)=ar(0,120);0;17;(0,73)__pyx_methods_4pygr_11cnestedlist_NLMSASlice:S(0,635)__pyx_members_4pygr_11cnestedlist_NLMSASlice:S(0,636)__pyx_getsets_4pygr_11cnestedlist_NLMSASlice:S(0,637)__pyx_tp_as_number_NLMSASlice:S(0,61)__pyx_tp_as_sequence_NLMSASlice:S(0,62)__pyx_tp_as_mapping_NLMSASlice:S(0,63)__pyx_tp_as_buffer_NLMSASlice:S(0,68)__pyx_methods_4pygr_11cnestedlist_NLMSASliceLetters:S(0,638)__pyx_members_4pygr_11cnestedlist_NLMSASliceLetters:S(0,639)__pyx_tp_as_number_NLMSASliceLetters:S(0,61)__pyx_tp_as_sequence_NLMSASliceLetters:S(0,62)__pyx_tp_as_mapping_NLMSASliceLetters:S(0,63)__pyx_tp_as_buffer_NLMSASliceLetters:S(0,68)__pyx_vtable_4pygr_11cnestedlist_NLMSANode:S(0,190):t(0,635)=ar(0,120);0;15;(0,72):t(0,636)=ar(0,120);0;6;(0,73):t(0,637)=ar(0,120);0;1;(0,74):t(0,638)=ar(0,120);0;2;(0,72):t(0,639)=ar(0,120);0;1;(0,73)__pyx_methods_4pygr_11cnestedlist_NLMSANode:S(0,640)__pyx_members_4pygr_11cnestedlist_NLMSANode:S(0,641)__pyx_getsets_4pygr_11cnestedlist_NLMSANode:S(0,642)__pyx_tp_as_number_NLMSANode:S(0,61)__pyx_tp_as_sequence_NLMSANode:S(0,62)__pyx_tp_as_mapping_NLMSANode:S(0,63)__pyx_tp_as_buffer_NLMSANode:S(0,68)__pyx_methods_4pygr_11cnestedlist_NLMSASliceIterator:S(0,643)__pyx_tp_as_number_NLMSASliceIterator:S(0,61)__pyx_tp_as_sequence_NLMSASliceIterator:S(0,62)__pyx_tp_as_mapping_NLMSASliceIterator:S(0,63)__pyx_tp_as_buffer_NLMSASliceIterator:S(0,68)__pyx_methods:S(0,644)__pyx_filenames:S(0,645)__pyx_type_4pygr_11cnestedlist_IntervalDB:G(0,229)__pyx_type_4pygr_11cnestedlist_IntervalDBIterator:G(0,229)__pyx_type_4pygr_11cnestedlist_IntervalFileDB:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSASequence:G(0,229)__pyx_type_4pygr_11cnestedlist_IntervalFileDBIterator:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSA:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSASlice:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSASliceLetters:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSANode:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSASliceIterator:G(0,229):t(0,640)=ar(0,120);0;3;(0,72):t(0,641)=ar(0,120);0;3;(0,73):t(0,642)=ar(0,120);0;1;(0,74):t(0,643)=ar(0,120);0;0;(0,72):t(0,644)=ar(0,120);0;3;(0,72):t(0,645)=ar(0,120);0;0;(0,8)/Users/administrator/Desktop/pygr-0.8.0/pygr/apps/maf2nclist.cgcc2_compiled.:t(0,1)=(0,1)seqnameID_qsort_cmp:F(0,2)void_a:P(0,3)void_b:P(0,3)int:t(0,2)=r(0,2);-2147483648;2147483647;:t(0,3)=*(0,4):t(0,4)=k(0,1)seqidmap_qsort_cmp:F(0,2)void_a:P(0,3)void_b:P(0,3)findseqID:F(0,2)seqName:P(0,5)seqidmap:P(0,6)r:P(0,2)int:t(0,2):t(0,5)=*(0,7):t(0,6)=*(0,8)char:t(0,7)=r(0,7);0;127;SeqIDMap:t(0,8)=(0,9):T(0,9)=s20id:(0,5),0,32;length:(0,2),32,32;ns_id:(0,2),64,32;offset:(0,2),96,32;nlmsa_id:(0,2),128,32;;l:r(0,2)mid:r(0,2)save_interval:F(0,2)im:P(0,10)start:P(0,2)stop:P(0,2)iseq:P(0,2)istart:P(0,2)istop:P(0,2):t(0,10)=*(0,11)IntervalMap:t(0,11)=(0,12):T(0,12)=s24start:(0,2),0,32;end:(0,2),32,32;target_id:(0,2),64,32;target_start:(0,2),96,32;target_end:(0,2),128,32;sublist:(0,2),160,32;;/usr/include/ctype.hpygr/apps/maf2nclist.creadMAFrecord:F(0,2)im:P(0,10)n:P(0,2)seqidmap:P(0,6)nseq:P(0,2)lpoStart:P(0,2)p_block_len:P(0,13)ifile:P(0,14)maxseq:P(0,2)linecode_count:p(0,15)p_has_continuation:p(0,13)i:r(0,2):t(0,13)=*(0,2):t(0,14)=*(0,16):t(0,15)=*(0,17)FILE:t(0,16)=(0,18)long long int:t(0,17)=@s64;r(0,17);01000000000000000000000;0777777777777777777777;__sFILE:T(0,18)=s88_p:(0,19),0,32;_r:(0,2),32,32;_w:(0,2),64,32;_flags:(0,20),96,16;_file:(0,20),112,16;_bf:(0,21),128,64;_lbfsize:(0,2),192,32;_cookie:(0,22),224,32;_close:(0,23),256,32;_read:(0,24),288,32;_seek:(0,25),320,32;_write:(0,26),352,32;_ub:(0,21),384,64;_extra:(0,27),448,32;_ur:(0,2),480,32;_ubuf:(0,28),512,24;_nbuf:(0,29),536,8;_lb:(0,21),544,64;_blksize:(0,2),608,32;_offset:(0,30),640,64;;:t(0,19)=*(0,32)short int:t(0,20)=@s16;r(0,20);-32768;32767;__sbuf:T(0,21)=s8_base:(0,19),0,32;_size:(0,2),32,32;;:t(0,22)=*(0,1):t(0,23)=*(0,33):t(0,24)=*(0,34):t(0,25)=*(0,35):t(0,26)=*(0,36):t(0,27)=*(0,37):t(0,28)=ar(0,38);0;2;(0,32):t(0,29)=ar(0,38);0;0;(0,32)__darwin_off_t:t(0,31)=(0,39)fpos_t:t(0,30)=(0,31)unsigned char:t(0,32)=@s8;r(0,32);0;255;:t(0,33)=f(0,2):t(0,34)=f(0,2):t(0,35)=f(0,30):t(0,36)=f(0,2):t(0,37)=xs__sFILEX:long unsigned int:t(0,38)=r(0,38);0;037777777777;__int64_t:t(0,39)=(0,17)seqStart:(0,2)junk:(0,2)iseq:r(0,2)max_len:r(0,2)seqLength:(0,2)newline:r(0,2)extend:r(0,2)tmp:(0,40)char:t(0,7):t(0,40)=ar(0,38);0;32767;(0,32)seq:(0,41)prefix:(0,42)seqName:(0,43)oriFlag:(0,42)linecode_count:r(0,15)p_has_continuation:r(0,13)_c:r(0,44)__darwin_ct_rune_t:t(0,44)=(0,2):t(0,41)=ar(0,38);0;32767;(0,7):t(0,42)=ar(0,38);0;7;(0,7):t(0,43)=ar(0,38);0;63;(0,7)l:r(0,2)l:r(0,2)istart:r(0,2)istart:r(0,2)istart:r(0,2)l:r(0,2)/usr/include/ctype.hpygr/apps/maf2nclist.cread_axtnet:F(0,2)im:p(0,10)seqidmap:P(0,6)nseq:P(0,2)ifile:P(0,14)maxseq:P(0,2)isrc:p(0,13)src_prefix:p(0,5)dest_prefix:p(0,5)i:r(0,2)srcStart:(0,2)srcEnd:(0,2)destStart:(0,2)destEnd:(0,2)junk:(0,2)junk2:(0,2)idest:r(0,2)n:r(0,2)ivalSrc:r(0,2)ivalDest:r(0,2)lineMax:r(0,2)lineAlloc:(0,2)destLength:r(0,2)tmp:(0,40)src_seq:r(0,5)dest_seq:r(0,5)srcName:(0,43)destName:(0,43)oriFlag:(0,42)srcChr:(0,43)destChr:(0,43)void:t(0,1)_c:r(0,44)l:r(0,2)l:r(0,2)errstr:(0,45)istop:r(0,2):t(0,45)=ar(0,38);0;1023;(0,7)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)errstr:(0,45)errstr:(0,45)errstr:(0,45)PK2M*;ÂÑ6UÔUÔpygr/coordinator.pyfrom __future__ import generators import os import time import thread import sys import xmlrpclib import traceback from SimpleXMLRPCServer import SimpleXMLRPCServer import socket import dbfile import logging def get_hostname(host=None): 'get FQDN for host, or current host if not specified' if host is None: host=socket.gethostname() try: return socket.gethostbyaddr(host)[0] except socket.herror: # DNS CAN'T RESOLVE HOSTNAME return host # JUST USE HOSTNAME AS REPORTED BY gethostname() def get_server(host, port, logRequests=False): """Start xmlrpc server on requested host:port. Return bound SimpleXMLRPCServer server obj and port it's bound to. Set port=0 to bind to a random port number. """ if host is None: # use localhost as default host='localhost' server = SimpleXMLRPCServer((host, port), logRequests=logRequests) port = server.socket.getsockname()[1] logging.info("Running XMLRPC server on port %d..." % port) return server, port class XMLRPCClientObject(object): 'provides object proxy for remote object, with methods that mirror its xmlrpc_methods' def __init__(self,server,name,methodDict): self.name=name self.server=server import new class methodcall(object): def __init__(self,name): self.name=name def __call__(self,obj,*args): return obj.server.server.methodCall(obj.name,self.name,args) for methodName in methodDict: # CREATE METHODS TO ACCESS REMOTE OBJECT'S METHODS setattr(self,methodName,new.instancemethod(methodcall(methodName),self,self.__class__)) class XMLRPCClient(dict): 'interface to XMLRPC server serving multiple named objects' def __init__(self,url): self.server=xmlrpclib.ServerProxy(url) def __getitem__(self,name): 'get connection to the named server object' try: return dict.__getitem__(self,name) except KeyError: methodDict=self.server.objectInfo(name) # GET INFO ABOUT REQUESTED OBJECT import types if isinstance(methodDict,types.StringType): raise KeyError(methodDict) # RETURNED VALUE IS ERROR MESSAGE! v=XMLRPCClientObject(self,name,methodDict) self[name]=v # SAVE THIS OBJECT INTO OUR DICTIONARY return v class ConnectionDict(dict): 'ensure that multiple requests for the same connection use same ServerProxy' def __call__(self,url,name): try: s=self[url] # REUSE EXISTING CONNECTION TO THE SERVER except KeyError: s=XMLRPCClient(url) # GET NEW CONNECTION TO THE SERVER self[url]=s # CACHE THIS CONNECTION return s[name] # GET THE REQUESTED OBJECT PROXY FROM THE SERVER get_connection=ConnectionDict() # THIS RETURNS SAME ServerProxy FOR SAME url def safe_dispatch(self,name,args): """restrict calls to selected methods, and trap all exceptions to keep server alive!""" import datetime if name in self.xmlrpc_methods: # MAKE SURE THIS METHOD IS EXPLICITLY ALLOWED try: # TRAP ALL ERRORS TO PREVENT OUR SERVER FROM DYING print >>sys.stderr,'XMLRPC:',name,args,\ datetime.datetime.now().isoformat(' ') # LOG THE REQUEST if self.xmlrpc_methods[name]: # use this as an alias for method m = getattr(self,self.xmlrpc_methods[name]) else: # use method name as usual m = getattr(self,name) # GET THE BOUND METHOD val=m(*args) # CALL THE METHOD sys.stderr.flush() # FLUSH ANY OUTPUT TO OUR LOG return val # HAND BACK ITS RETURN VALUE except SystemExit: raise # WE REALLY DO WANT TO EXIT. except: # METHOD RAISED AN EXCEPTION, SO PRINT TRACEBACK TO STDERR traceback.print_exc(self.max_tb,sys.stderr) else: print >>sys.stderr,"safe_dispatch: blocked unregistered method %s" % name return False # THIS RETURN VALUE IS CONFORMABLE BY XMLRPC... class ObjectFromString(list): """convenience class for initialization from string of format: val1,val2,foo=12,bar=39,sshopts=-1 -p 1234 Args of format name=val are saved on the object as attributes; otherwise each arg is saved as a list. Argument type conversion is performed automatically if attrtype mapping provided either to constructor or by the class itself. Numeric keys in this mapping are applied to the corresponding list arguments; string keys in this mapping are applied to the corresponding attribute arguments. Both the argument separator and assignment separator can be customized.""" _separator=',' _eq_separator='=' def __init__(self,s,separator=None,eq_separator=None): list.__init__(self) if separator is None: separator=self._separator if eq_separator is None: eq_separator=self._eq_separator args=s.split(separator) i=0 for arg in args: try: # PROCESS attr=val ARGUMENT FORMAT k,v=arg.split(eq_separator) try: # SEE IF WE HAVE A TYPE FOR THIS ATTRIBUTE v=self._attrtype[k](v) except (AttributeError,KeyError): pass # IF NO CONVERSION, JUST USE THE ORIGINAL STRING setattr(self,k,v) # SAVE VALUE AS ATTRIBUTE except ValueError: # JUST A SIMPLE ARGUMENT, SO SAVE AS ARG LIST try: # SEE IF WE HAVE A TYPE FOR THIS LIST ITEM arg=self._attrtype[i](arg) except (AttributeError,KeyError): pass # IF NO CONVERSION, JUST USE THE ORIGINAL STRING self.append(arg) i+=1 # ADVANCE OUR ARGUMENT COUNT class FileDict(dict): "read key,value pairs as WS-separated lines, with objclass(value) conversion" def __init__(self,filename,objclass=str): dict.__init__(self) f=file(filename, 'rU') # text file for line in f: key=line.split()[0] # GET THE 1ST ARGUMENT val=line[len(key):].lstrip().rstrip() # GET THE REST, STRIP OUTER WS self[key]=objclass(val) # APPLY THE DESIRED TYPE CONVERSION f.close() def detach_as_demon_process(self): "standard UNIX technique c/o Jurgen Hermann's Python Cookbook recipe" # CREATE AN APPROPRIATE ERRORLOG FILEPATH if not hasattr(self,'errlog') or self.errlog is False: self.errlog = os.path.join(os.getcwd(), self.name + '.log') pid = os.fork() if pid: return pid os.setsid() # CREATE A NEW SESSION WITH NO CONTROLLING TERMINAL os.umask(0) # IS THIS ABSOLUTELY NECESSARY? sys.stdout=file(self.errlog,'a') # DEMONIZE BY REDIRECTING ALL OUTPUT TO LOG sys.stderr=sys.stdout return 0 def serve_forever(self): 'start the service -- this will run forever' import datetime print >>sys.stderr,"START_SERVER:%s %s" %(self.name,datetime.datetime. now().isoformat(' ')) sys.stderr.flush() self.server.serve_forever() class CoordinatorInfo(object): """stores information about individual coordinators for the controller and provides interface to Coordinator that protects against possibility of deadlock.""" min_startup_time=60.0 def __init__(self,name,url,user,priority,resources,job_id=0,immediate=False, demand_ncpu=0): self.name=name self.url=url self.user=user self.priority=priority self.job_id=job_id self.immediate=immediate self.server=xmlrpclib.ServerProxy(url) self.processors={} self.resources=resources self.start_time=time.time() self.demand_ncpu=demand_ncpu # SET TO NON-ZERO IF YOU WANT FIXED #CPUS self.allocated_ncpu=0 self.new_cpus=[] self.last_start_proc_time=0.0 def __iadd__(self,newproc): "add a processor to this coordinator's list" self.processors[newproc]=time.time() return self def __isub__(self,oldproc): "remove a processor from this coordinator's list" del self.processors[oldproc] return self def update_load(self): """tell this coordinator to use only allocated_ncpu processors, and to launch processors on the list of new_cpus. Simply spawns a thread to do this without danger of deadlock""" import threading t=threading.Thread(target=self.update_load_thread, args=(self.allocated_ncpu,self.new_cpus)) self.new_cpus=[] # DISCONNECT FROM OLD LIST TO PREVENT OVERWRITING t.start() def update_load_thread(self,ncpu,new_cpus): """tell this coordinator to use only ncpu processors, and to launch processors on the list of new_cpus. Run this in a separate thread to prevent deadlock.""" self.server.set_max_clients(ncpu) if len(new_cpus)>0 and \ time.time()-self.last_start_proc_time>self.min_startup_time: self.server.start_processors(new_cpus) # SEND OUR LIST self.last_start_proc_time=time.time() class HostInfo(ObjectFromString): _attrtype={'maxload':float} class XMLRPCServerBase(object): 'Base class for creating an XMLRPC server for multiple objects' xmlrpc_methods={'methodCall':0,'objectList':0,'objectInfo':0} max_tb=10 _dispatch=safe_dispatch # RESTRICT XMLRPC TO JUST THE METHODS LISTED ABOVE def __init__(self, name, host='', port=5000, logRequests=False, server=None): self.host=host self.name=name if server is not None: self.server = server self.port = port else: self.server,self.port = get_server(host, port, logRequests) self.server.register_instance(self) self.objDict={} def __setitem__(self,name,obj): 'add a new object to serve' self.objDict[name]=obj def __delitem__(self,name): del self.objDict[name] def objectList(self): 'get list of named objects in this server: [(name,methodDict),...]' return [(name,obj.xmlrpc_methods) for (name,obj) in self.objDict.items()] def objectInfo(self,objname): 'get dict of methodnames on the named object' try: return self.objDict[objname].xmlrpc_methods except KeyError: return 'error: server has no object named %s' % objname def methodCall(self,objname,methodname,args): 'run the named method on the named object and return its result' try: obj=self.objDict[objname] if methodname in obj.xmlrpc_methods: m=getattr(obj,methodname) else: print >>sys.stderr,\ "methodCall: blocked unregistered method %s" % methodname return '' except (KeyError,AttributeError): return '' # RETURN FAILURE CODE return m(*args) # RUN THE OBJECT METHOD def serve_forever(self, demonize=None, daemonize=False): 'launch the XMLRPC service. if daemonize=True, detach & exit.' if demonize is not None: logging.warning("demonize is a deprecated argument to serve_forever; use 'daemonize' instead!") daemonize = demonize print 'Serving on interface "%s", port %d' % (self.host, self.port,) if daemonize: print "detaching to run as a daemon." pid = detach_as_demon_process(self) if pid: print 'PID', pid sys.exit(0) serve_forever(self) def serve_in_thread(self): thread.start_new_thread(serve_forever, (self,)) def register(self,url=None,name='index',server=None): 'register our server with the designated index server' data=self.registrationData # RAISE ERROR IF NO DATA TO REGISTER... if server is None and url is not None: # USE THE URL TO GET THE INDEX SERVER server=get_connection(url,name) if server is not None: server.registerServer('%s:%d' % (self.host,self.port),data) else: # DEFAULT: SEARCH WORLDBASEPATH TO FIND INDEX SERVER from pygr import worldbase worldbase._mdb.registerServer('%s:%d' % (self.host,self.port),data) class ResourceController(object): """Centralized controller for getting resources and rules for making them. """ xmlrpc_methods={'load_balance':0,'setrule':0,'delrule':0,'report_load':0, 'register_coordinator':0,'unregister_coordinator':0, 'register_processor':0,'unregister_processor':0, 'get_resource':0,'acquire_rule':0,'release_rule':0, 'request_cpus':0,'retry_unused_hosts':0, 'get_status':0,'setthrottle':0,'del_lock':0, 'get_hostinfo':0,'set_hostinfo':0} _dispatch=safe_dispatch # RESTRICT XMLRPC TO JUST THE METHODS LISTED ABOVE max_tb=10 def __init__(self,rc='controller',port=5000,overload_margin=0.6, rebalance_frequency=1200,errlog=False,throttle=1.0): self.name=rc self.overload_margin=overload_margin self.rebalance_frequency=rebalance_frequency self.errlog=errlog self.throttle=throttle self.rebalance_time=time.time() self.must_rebalance=False self.host=get_hostname() self.hosts=FileDict(self.name+'.hosts',HostInfo) self.getrules() self.getresources() self.server,self.port = get_server(self.host,port) self.server.register_instance(self) self.coordinators={} self.njob=0 self.locks={} self.systemLoad={} hostlist=[host for host in self.hosts] for host in hostlist: # 1ST ASSUME HOST EMPTY, THEN GET LOAD REPORTS hostFQDN=get_hostname(host) # CONVERT ALL HOSTNAMES TO FQDNs if hostFQDN!=host: # USE FQDN FOR ALL SUBSEQUENT REFS! self.hosts[hostFQDN]=self.hosts[host] del self.hosts[host] self.systemLoad[hostFQDN]=0.0 __call__=serve_forever def assign_load(self): "calculate the latest balanced loads" maxload=0. total=0. current_job=99999999 for c in self.coordinators.values(): if c.priority>0.0 and c.job_id0.: # DON'T DIVIDE BY ZERO... maxload /= float(total) for c in self.coordinators.values(): # ALLOCATE SHARE OF TOTAL CPUS... if c.demand_ncpu: # ALLOCATE EXACTLY THE NUMBER REQUESTED c.allocated_ncpu=int(c.demand_ncpu) elif c.run: # COMPUTE BASED ON PRIORITY SHARE c.allocated_ncpu=int(maxload * c.priority) else: # NOT RUNNING c.allocated_ncpu=0 return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def assign_processors(self): "hand out available processors to coordinators in order of need" margin=self.overload_margin-1.0 free_cpus=[] nproc={} for c in self.coordinators.values(): # COUNT NUMBER OF PROCS for host,pid in c.processors: # RUNNING ON EACH HOST try: nproc[host]+=1.0 # INCREMENT AN EXISTING COUNT except KeyError: nproc[host]=1.0 # NEW, SO SET INITIAL COUNT for host in self.hosts: # BUILD LIST OF HOST CPUS TO BE ASSIGNED if host not in self.systemLoad: # ADDING A NEW HOST self.systemLoad[host]=0.0 # DEFAULT LOAD: ASSUME HOST EMPTY try: # host MAY NOT BE IN nproc, SO CATCH THAT ERROR if self.systemLoad[host]>nproc[host]: raise KeyError # USE self.systemLoad[host] except KeyError: load=self.systemLoad[host] # MAXIMUM VALUE else: load=nproc[host] # MAXIMUM VALUE if load0: l+=ncpu*[c] # ADD c TO l EXACTLY ncpu TIMES import random random.shuffle(l) # REORDER LIST OF COORDINATORS RANDOMLY i=0 # INDEX INTO OUR l LIST while i0 # RETURN TRUE IF WE HANDED OUT SOME PROCESSORS def load_balance(self): "recalculate load assignments, and assign free cpus" self.rebalance_time=time.time() # RESET OUR FLAGS self.must_rebalance=False self.assign_load() # CALCULATE HOW MANY CPUS EACH COORDINATOR SHOULD GET self.assign_processors() # ASSIGN FREE CPUS TO COORDINATORS THAT NEED THEM for c in self.coordinators.values(): c.update_load() # INFORM THE COORDINATOR return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def get_hostinfo(self,host,attr): "get a host attribute" return getattr(self.hosts[host],attr) def set_hostinfo(self,host,attr,val): "increase or decrease the maximum load allowed on a given host" try: setattr(self.hosts[host],attr,val) except KeyError: self.hosts[host]=HostInfo('%s=%s' %(attr,str(val))) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def getrules(self): import shelve self.rules=dbfile.shelve_open(self.name+'.rules') def getresources(self): import shelve self.resources=dbfile.shelve_open(self.name+'.rsrc') def setrule(self,rsrc,rule): "save a resource generation rule into our database" self.rules[rsrc]=rule self.rules.close() # THIS IS THE ONLY WAY I KNOW TO FLUSH... self.getrules() return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def delrule(self,rsrc): "delete a resource generation rule from our database" try: del self.rules[rsrc] except KeyError: print >>sys.stderr, "Attempt to delete unknown resource rule %s" % rsrc else: self.rules.close() # THIS IS THE ONLY WAY I KNOW TO FLUSH... self.getrules() return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def setthrottle(self,throttle): "set the total level of usage of available CPUs, usually 1.0" self.throttle=float(throttle) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def report_load(self,host,pid,load): "save a reported load from one of our processors" self.systemLoad[host]=load # AT A REGULAR INTERVAL WE SHOULD REBALANCE LOAD if self.must_rebalance or \ time.time()-self.rebalance_time>self.rebalance_frequency: self.load_balance() if load>sys.stderr,'change_priority: %s (%s,%s): %f -> %f' \ % (name,user,url,self.coordinators[url].priority,priority) self.coordinators[url].priority=priority self.coordinators[url].immediate=immediate self.coordinators[url].demand_ncpu=demand_ncpu except KeyError: print >>sys.stderr,'register_coordinator: %s (%s,%s): %f' \ % (name,user,url,priority) self.coordinators[url]=CoordinatorInfo(name,url,user,priority, resources,self.njob,immediate, demand_ncpu) self.njob+=1 # INCREMENT COUNT OF JOBS WE'VE REGISTERED self.must_rebalance=True # FORCE REBALANCING ON NEXT OPPORTUNITY return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def unregister_coordinator(self,name,url,message): "remove a coordinator from our list" try: del self.coordinators[url] print >>sys.stderr,'unregister_coordinator: %s (%s): %s' \ % (name,url,message) self.load_balance() # FORCE IT TO REBALANCE THE LOAD TO NEW JOBS... except KeyError: print >>sys.stderr,'unregister_coordinator: %s unknown:%s (%s)' \ % (name,url,message) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def request_cpus(self,name,url): "return a list of hosts for this coordinator to run processors on" try: c=self.coordinators[url] except KeyError: print >>sys.stderr,'request_cpus: unknown coordinator %s @ %s' % (name,url) return [] # HAND BACK AN EMPTY LIST self.assign_load() # CALCULATE HOW MANY CPUS EACH COORDINATOR SHOULD GET self.assign_processors() # ASSIGN FREE CPUS TO COORDINATORS THAT NEED THEM new_cpus=tuple(c.new_cpus) # MAKE A NEW COPY OF THE LIST OF HOSTS del c.new_cpus[:] # EMPTY OUR LIST return new_cpus def register_processor(self,host,pid,url): "record a new processor starting up" try: self.coordinators[url]+= (host,pid) self.systemLoad[host] += 1.0 # THIS PROBABLY INCREASES LOAD BY 1 except KeyError: pass return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def unregister_processor(self,host,pid,url): "processor shutting down, so remove it from the list" try: self.coordinators[url]-= (host,pid) self.systemLoad[host] -= 1.0 # THIS PROBABLY DECREASES LOAD BY 1 if self.systemLoad[host]<0.0: self.systemLoad[host]=0.0 for k,v in self.locks.items(): # MAKE SURE THIS PROC HAS NO LOCKS... h=k.split(':')[0] if h==host and v==pid: del self.locks[k] # REMOVE ALL ITS PENDING LOCKS except KeyError: pass self.load_balance() # FREEING A PROCESSOR, SO REBALANCE TO USE THIS return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def get_resource(self,host,pid,rsrc): """return a filename for the resource, or False if rule must be applied, or True if client must wait to get the resource""" key=host+':'+rsrc try: # JUST HAND BACK THE RESOURCE return self.resources[key] except KeyError: if key in self.locks: return True # TELL CLIENT TO WAIT else: return False # TELL CLIENT TO ACQUIRE IT VIA RULE def acquire_rule(self,host,pid,rsrc): "lock the resource on this specific host, and return its production rule" if rsrc not in self.rules: return False # TELL CLIENT NO SUCH RULE key=host+':'+rsrc if key in self.locks: return True # TELL CLIENT TO WAIT self.locks[key]=pid # LOCK THIS RESOURCE ON THIS HOST UNTIL CONSTRUCTED return self.rules[rsrc] # RETURN THE CONSTRUCTION RULE def release_rule(self,host,pid,rsrc): "client is done applying this rule, so now safe to give out the resource" key=host+':'+rsrc self.del_lock(host,rsrc) self.resources[key]=self.rules[rsrc][0] # ADD THE FILE NAME TO RESOURCE LIST self.resources.close() # THIS IS THE ONLY WAY I KNOW TO FLUSH THIS... self.getresources() return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def del_lock(self,host,rsrc): "delete a lock on a pending resource construction process" key=host+':'+rsrc try: del self.locks[key] # REMOVE THE LOCK except KeyError: print >>sys.stderr,"attempt to release non-existent lock %s,%s:%d" \ %(host,rule,pid) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def retry_unused_hosts(self): "reset systemLoad for hosts that have no jobs running" myhosts={} for c in self.coordinators.values(): # LIST HOSTS WE'RE CURRENTLY USING for host,pid in c.processors: myhosts[host]=None # MARK THIS HOST AS IN USE for host in self.systemLoad: # RESET LOADS FOR ALL HOSTS WE'RE NOT USING if host not in myhosts: self.systemLoad[host]=0.0 return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def get_status(self): """get report of system loads, max loads, coordinators, rules, resources, locks""" l=[(name,host.maxload) for name,host in self.hosts.items()] l.sort() return self.name,self.errlog,self.systemLoad,l,\ [(c.name,c.url,c.priority,c.allocated_ncpu,len(c.processors),\ c.start_time) for c in self.coordinators.values()], \ dict(self.rules),dict(self.resources),self.locks class AttrProxy(object): def __init__(self,getattr_proxy,k): self.getattr_proxy=getattr_proxy self.k=k def __getattr__(self,attr): try: val=self.getattr_proxy(self.k,attr) # GET IT FROM OUR PROXY except: raise AttributeError('unable to get proxy attr '+attr) setattr(self,attr,val) # CACHE THIS ATTRIBUTE RIGHT HERE! return val class DictAttrProxy(dict): def __init__(self,getattr_proxy): dict.__init__(self) self.getattr_proxy=getattr_proxy def __getitem__(self,k): try: return dict.__getitem__(self,k) except KeyError: val=AttrProxy(self.getattr_proxy,k) self[k]=val return val class Coordinator(object): """Run our script as Processor on one or more client nodes, using XMLRPC communication between clients and server. On the server all output is logged to name.log, and successfully completed task IDs are stored in name.success, and error task IDs are stored in name.error On the clients all output is logged to the file name_#.log in the user's and/or system-specific temporary directory.""" xmlrpc_methods={'start_processors':0,'register_client':0,'unregister_client':0, 'report_success':0,'report_error':0,'next':0, 'get_status':0,'set_max_clients':0,'stop_client':0} _dispatch=safe_dispatch # RESTRICT XMLRPC TO JUST THE METHODS LISTED ABOVE max_tb=10 # MAXIMUM #STACK LEVELS TO PRINT IN TRACEBACKS max_ssh_errors=5 #MAXIMUM #ERRORS TO PERMIT IN A ROW BEFORE QUITTING python='python' # DEFAULT EXECUTABLE FOR RUNNING OUR CLIENTS def __init__(self,name,script,it,resources,port=8888,priority=1.0,rc_url=None, errlog=False,immediate=False,ncpu_limit=999999, demand_ncpu=0,max_initialization_errors=3,**kwargs): self.name=name self.script=script self.it=iter(it) # MAKE SURE it IS AN ITERATOR; IF IT'S NOT, MAKE IT SO self.resources=resources self.priority=priority self.errlog=errlog self.immediate=immediate self.ncpu_limit=ncpu_limit self.demand_ncpu=demand_ncpu self.max_initialization_errors=max_initialization_errors self.kwargs=kwargs self.host=get_hostname() self.user=os.environ['USER'] try: # MAKE SURE ssh-agent IS AVAILABLE TO US BEFORE LAUNCHING LOTS OF PROCS a=os.environ['SSH_AGENT_PID'] except KeyError: raise OSError(1,'SSH_AGENT_PID not found. No ssh-agent running?') self.dir=os.getcwd() self.n=0 self.nsuccess=0 self.nerrors=0 self.nssh_errors=0 self.iclient=0 self.max_clients=40 if rc_url is None: # USE DEFAULT RESOURCE CONTROLLER ADDRESS ON SAME HOST rc_url='http://%s:5000' % self.host self.rc_url=rc_url self.rc_server=xmlrpclib.ServerProxy(rc_url) #GET CONNECTION TO RESOURCE CONTROLLER self.server,self.port = get_server(self.host,port) #CREATE XMLRPC SERVER self.server.register_instance(self) # WE PROVIDE ALL THE METHODS FOR THE SERVER self.clients={} self.pending={} self.already_done={} self.stop_clients={} self.logfile={} self.clients_starting={} self.clients_initializing={} self.initialization_errors={} try: # LOAD LIST OF IDs ALREADY SUCCESSFULLY PROCESSED, IF ANY f=file(name+'.success','rU') # text file for line in f: self.already_done[line.strip()]=None f.close() except IOError: # OK IF NO SUCCESS FILE YET, WE'LL CREATE ONE. pass self.successfile=file(name+'.success','a') # success FILE IS CUMMULATIVE self.errorfile=file(name+'.error','w') # OVERWRITE THE ERROR FILE self.done=False self.hosts=DictAttrProxy(self.rc_server.get_hostinfo) self.register() def __call__(self,*l,**kwargs): "start the server, and launch a cpu request in a separate thread" import threading t=threading.Thread(target=self.initialize_thread) t.start() serve_forever(self,*l,**kwargs) def initialize_thread(self): "run this method in a separate thread to bootstrap our initial cpu request" time.sleep(5) # GIVE serve_forever() TIME TO START SERVER self.rc_server.load_balance() # NOW ASK CONTROLLER TO REBALANCE AND GIVE US CPUS def start_client(self,host): "start a processor on a client node" import tempfile if len(self.clients)>=self.ncpu_limit: print >>sys.stderr,'start_client: blocked, CPU limit', \ len(self.clients),self.ncpu_limit return # DON'T START ANOTHER PROCESS, TOO MANY ALREADY if len(self.clients)>=self.max_clients: print >>sys.stderr,'start_client: blocked, too many already', \ len(self.clients),self.max_clients return # DON'T START ANOTHER PROCESS, TOO MANY ALREADY try: if len(self.clients_starting[host])>=self.max_ssh_errors: print >>sys.stderr,\ 'start_client: blocked, too many unstarted jobs:',\ host,self.clients_starting[host] return # DON'T START ANOTHER PROCESS, host MAY BE DEAD... except KeyError: # NO clients_starting ON host, GOOD! pass try: if len(self.initialization_errors[host])>=self.max_initialization_errors: print >>sys.stderr,\ 'start_client: blocked, too many initialization errors:',\ host,self.initialization_errors[host] return # DON'T START ANOTHER PROCESS, host HAS A PROBLEM except KeyError: # NO initialization_errors ON host, GOOD! pass try: sshopts=self.hosts[host].sshopts # GET sshopts VIA XMLRPC except AttributeError: sshopts='' logfile=os.path.join(tempfile.gettempdir(), '%s_%d.log' % (self.name, self.iclient)) # PASS OUR KWARGS ON TO THE CLIENT PROCESSOR kwargs=' '.join(['--%s=%s'%(k,v) for k,v in self.kwargs.items()]) cmd='cd %s;%s %s --url=http://%s:%d --rc_url=%s --logfile=%s %s %s' \ % (self.dir,self.python,self.script,self.host,self.port, self.rc_url,logfile,self.name,kwargs) # UGH, HAVE TO MIX CSH REDIRECTION (REMOTE) WITH SH REDIRECTION (LOCAL) ssh_cmd="ssh %s %s '(%s) &%s &' >%s 2>&1 &" \ % (sshopts,host,cmd,logfile,self.errlog) print >>sys.stderr,'SSH: '+ssh_cmd self.logfile[logfile]=[host,False,self.iclient] # NO PID YET try: # RECORD THIS CLIENT AS STARTING UP self.clients_starting[host][self.iclient]=time.time() except KeyError: # CREATE A NEW HOST ENTRY self.clients_starting[host]={self.iclient:time.time()} # RUN SSH IN BACKGROUND TO AVOID WAITING FOR IT TO TIMEOUT!!! os.system(ssh_cmd) # LAUNCH THE SSH PROCESS, SHOULD RETURN IMMEDIATELY self.iclient += 1 # ADVANCE OUR CLIENT COUNTER def start_processors(self,hosts): "start processors on the list of hosts using SSH transport" for host in hosts: # LAUNCH OURSELVES AS PROCESSOR ON ALL THESE HOSTS self.start_client(host) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def register(self): "register our existence with the resource controller" url='http://%s:%d' % (self.host,self.port) self.rc_server.register_coordinator(self.name,url,self.user, self.priority,self.resources, self.immediate,self.demand_ncpu) def unregister(self,message): "tell the resource controller we're exiting" url='http://%s:%d' % (self.host,self.port) self.rc_server.unregister_coordinator(self.name,url,message) def register_client(self,host,pid,logfile): 'XMLRPC call to register client hostname and PID as starting_up' print >>sys.stderr,'register_client: %s:%d' %(host,pid) self.clients[(host,pid)]=0 try: self.logfile[logfile][1]=pid # SAVE OUR PID iclient=self.logfile[logfile][2] # GET ITS CLIENT ID del self.clients_starting[host][iclient] #REMOVE FROM STARTUP LIST except KeyError: print >>sys.stderr,'no client logfile?',host,pid,logfile self.clients_initializing[(host,pid)]=logfile return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def unregister_client(self,host,pid,message): 'XMLRPC call to remove client from register as exiting' print >>sys.stderr,'unregister_client: %s:%d %s' % (host,pid,message) try: del self.clients[(host,pid)] except KeyError: print >>sys.stderr,'unregister_client: unknown client %s:%d' % (host,pid) try: # REMOVE IT FROM THE LIST OF CLIENTS TO SHUTDOWN, IF PRESENT del self.stop_clients[(host,pid)] except KeyError: pass try: # REMOVE FROM INITIALIZATION LIST del self.clients_initializing[(host,pid)] except KeyError: pass if len(self.clients)==0 and self.done: # NO MORE TASKS AND NO MORE CLIENTS self.exit("Done") # SO SERVER CAN EXIT return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def report_success(self,host,pid,success_id): 'mark task as successfully completed' print >>self.successfile,success_id # KEEP PERMANENT RECORD OF SUCCESS ID self.successfile.flush() self.nsuccess += 1 try: self.clients[(host,pid)] += 1 except KeyError: print >>sys.stderr,'report_success: unknown client %s:%d' % (host,pid) try: del self.pending[success_id] except KeyError: print >>sys.stderr,'report_success: unknown ID %s' % str(success_id) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def report_error(self,host,pid,id,tb_report): "get traceback report from client as text" print >>sys.stderr,"TRACEBACK: %s:%s ID %s\n%s" % \ (host,str(pid),str(id),tb_report) if (host,pid) in self.clients_initializing: logfile=self.clients_initializing[(host,pid)] try: self.initialization_errors[host].append(logfile) except KeyError: self.initialization_errors[host]=[logfile] try: del self.pending[id] except KeyError: # NOT ASSOCIATED WITH AN ACTUAL TASK ID, SO DON'T RECORD if id is not None and id is not False: print >>sys.stderr,'report_error: unknown ID %s' % str(id) else: print >>self.errorfile,id # KEEP PERMANENT RECORD OF FAILURE ID self.nerrors+=1 self.errorfile.flush() return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def next(self,host,pid,success_id): 'return next ID from iterator to the XMLRPC caller' if (host,pid) not in self.clients: print >>sys.stderr,'next: unknown client %s:%d' % (host,pid) return False # HAND BACK "NO MORE FOR YOU TO DO" SIGNAL try: # INITIALIZATION DONE, SO REMOVE FROM INITIALIZATION LIST del self.clients_initializing[(host,pid)] except KeyError: pass if success_id is not False: self.report_success(host,pid,success_id) if self.done: # EXHAUSTED OUR ITERATOR, SO SHUT DOWN THIS CLIENT return False # HAND BACK "NO MORE FOR YOU TO DO" SIGNAL try: # CHECK LIST FOR COMMAND TO SHUT DOWN THIS CLIENT del self.stop_clients[(host,pid)] # IS IT IN stop_clients? return False # IF SO, HAND BACK "NO MORE FOR YOU TO DO" SIGNAL except KeyError: # DO ONE MORE CHECK: ARE WE OVER OUR MAX ALLOWED LOAD? if len(self.clients)>self.max_clients: # YES, BETTER THROTTLE DOWN print >>sys.stderr,'next: halting %s:too many processors (%d>%d)' \ % (host,len(self.clients),self.max_clients) return False # HAND BACK "NO MORE FOR YOU TO DO" SIGNAL for id in self.it: # GET AN ID WE CAN USE if str(id) not in self.already_done: self.n+=1 # GREAT, WE CAN USE THIS ID self.lastID=id self.pending[id]=(host,pid,time.time()) print >>sys.stderr,'giving id %s to %s:%d' %(str(id),host,pid) return id print >>sys.stderr,'exhausted all items from iterator!' self.done=True # EXHAUSTED OUR ITERATOR self.priority=0.0 # RELEASE OUR CLAIMS ON ANY FURTHER PROCESSOR ALLOCATION self.register() # AND INFORM THE RESOURCE CONTROLLER return False # False IS CONFORMABLE BY XMLRPC... def get_status(self): "return basic status info on number of jobs finished, client list etc." client_report=[client+(nsuccess,) for client,nsuccess in self.clients.items()] pending_report=[(k,)+v for k,v in self.pending.items()] return self.name,self.errlog,self.n,self.nsuccess,self.nerrors,client_report,\ pending_report,self.logfile def set_max_clients(self,n): "change the maximum number of clients we should have running" self.max_clients=int(n) # MAKE SURE n IS CONVERTABLE TO int return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def stop_client(self,host,pid): "set signal forcing this client to exit on next iteration" self.stop_clients[(host,pid)]=None return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def exit(self,message): "clean up and close this server" self.unregister(message) self.successfile.close() self.errorfile.close() sys.exit() try: class ResourceFile(file): """wrapper around some locking behavior, to ensure only one copy operation performed for a given resource on a given host. Otherwise, it's just a regular file object.""" def __init__(self,resource,rule,mode,processor): "resource is name of the resource; rule is (localFile,cpCommand)" self.resource=resource self.processor=processor localFile,cpCommand=rule if not os.access(localFile,os.R_OK): cmd=cpCommand % localFile print 'copying data:',cmd os.system(cmd) file.__init__(self,localFile,mode) # NOW INITIALIZE AS A REAL FILE OBJECT def close(self): self.processor.release_rule(self.resource) # RELEASE THE LOCK WE PLACED ON THIS RULE file.close(self) except TypeError: pass class Processor(object): 'provides an iterator interface to an XMLRPC ID server' max_errors_in_a_row=10 # LOOKS LIKE NOTHING WORKS HERE, SO QUIT! max_tb=10 # DON'T SHOW MORE THAN 10 STACK LEVELS FOR A TRACEBACK report_frequency=600 overload_max=5 # MAXIMUM NUMBER OF OVERLOAD EVENTS IN A ROW BEFORE WE EXIT def __init__(self,url="http://localhost:8888", rc_url='http://localhost:5000',logfile=False,**kwargs): self.url=url self.logfile=logfile self.server=xmlrpclib.ServerProxy(url) self.rc_url=rc_url self.rc_server=xmlrpclib.ServerProxy(rc_url) self.host=get_hostname() self.pid=os.getpid() self.user=os.environ['USER'] self.success_id=False self.pending_id=False self.exit_message='MYSTERY-EXIT please debug' self.overload_count=0 def register(self): "add ourselves to list of processors for this server" self.server.register_client(self.host,self.pid,self.logfile) self.rc_server.register_processor(self.host,self.pid,self.url) print >>sys.stderr,'REGISTERED:',self.url,self.rc_url def unregister(self,message): "remove ourselves from list of processors for this server" if self.success_id is not False: # REPORT THAT LAST JOB SUCCEEDED! self.report_success(self.success_id) self.server.unregister_client(self.host,self.pid,message) self.rc_server.unregister_processor(self.host,self.pid,self.url) print >>sys.stderr,'UNREGISTERED:',self.url,self.rc_url,message def __iter__(self): return self def next(self): "get next ID from server" # REPORT LAST JOB SUCCESSFULLY COMPLETED, IF ANY while 1: id=self.server.next(self.host,self.pid,self.success_id) self.success_id=False # ERASE SUCCESS ID if id is True: # WE'RE BEING TOLD TO JUST WAIT time.sleep(60) # SO GO TO SLEEP FOR A MINUTE else: break if id is False: # NO MODE id FOR US TO PROCESS, SO QUIT self.serverStopIteration=True # RECORD THIS AS GENUINE END EVENT raise StopIteration else: # HAND BACK THE id TO THE USER self.pending_id=id return id def report_success(self,id): "report successful completion of task ID" self.server.report_success(self.host,self.pid,id) def report_error(self,id): "report an error using traceback.print_exc()" import StringIO err_report=StringIO.StringIO() traceback.print_exc(self.max_tb,sys.stderr) #REPORT TB TO OUR LOG traceback.print_exc(self.max_tb,err_report) #REPORT TB TO SERVER self.server.report_error(self.host,self.pid,id,err_report.getvalue()) err_report.close() def report_load(self): "report system load" load=os.getloadavg()[0] # GET 1 MINUTE LOAD AVERAGE if self.rc_server.report_load(self.host,self.pid,load) is False: self.overload_count+=1 # ARE WE CONSISTENTLY OVERLOADED FOR EXTENDED PERIOD? if self.overload_count>self.overload_max: # IF EXCEEDED LIMIT, EXIT self.exit('load too high') else: self.overload_count=0 def open_resource(self,resource,mode): "get a file object for the requested resource, opened in mode" while 1: rule=self.rc_server.get_resource(self.host,self.pid,resource) if rule is False: # WE HAVE TO LOCK AND APPLY A RULE... rule=self.acquire_rule(resource) if rule is True: # HMM, LOOKS LIKE A RACE CONDITION. KEEP WAITING time.sleep(60) # WAIT A MINUTE BEFORE ASKING FOR RESOURCE AGAIN continue return ResourceFile(resource,rule,mode,self) #CONSTRUCT THE RESOURCE elif rule is True: # RULE IS LOCKED BY ANOTHER PROCESSOR time.sleep(60) # WAIT A MINUTE BEFORE ASKING FOR RESOURCE AGAIN else: # GOT A REGULAR FILE, SO JUST OPEN IT return file(rule,mode) def acquire_rule(self,resource): "lock the specified resource rule for this host, so it's safe to build it" rule=self.rc_server.acquire_rule(self.host,self.pid,resource) if rule is False: # NO SUCH RESOURCE?!? self.exit('invalid resource: '+resource) return rule def release_rule(self,resource): "release our lock on this resource rule, so others can use it" self.rc_server.release_rule(self.host,self.pid,resource) def exit(self,message): "save message for self.unregister() and force exit" self.exit_message=message raise SystemExit def run_all(self,resultGenerator,**kwargs): "run until all task IDs completed, trap & report all errors" errors_in_a_row=0 it=resultGenerator(self,**kwargs) # GET ITERATOR FROM GENERATOR report_time=time.time() self.register() # REGISTER WITH RESOURCE CONTROLLER & COORDINATOR initializationError=None try: # TRAP ERRORS BOTH IN USER CODE AND coordinator CODE while 1: try: # TRAP AND REPORT ALL ERRORS IN USER CODE id=it.next() # THIS RUNS USER CODE FOR ONE ITERATION self.success_id=id # MARK THIS AS A SUCCESS... errors_in_a_row=0 initializationError=False except StopIteration: # NO MORE TASKS FOR US... if not hasattr(self,'serverStopIteration'): # WIERD!! # USER CODE RAISED StopIteration?!? self.report_error(self.pending_id) # REPORT THE PROBLEM self.exit_message='user StopIteration error' elif initializationError: self.exit_message='initialization error' else: self.exit_message='done' break except SystemExit: # sys.exit() CALLED raise # WE REALLY DO WANT TO EXIT. except: # MUST HAVE BEEN AN ERROR IN THE USER CODE if initializationError is None: # STILL IN INITIALIZATION initializationError=True self.report_error(self.pending_id) # REPORT THE PROBLEM errors_in_a_row +=1 if errors_in_a_row>=self.max_errors_in_a_row: self.exit_message='too many errors' break if time.time()-report_time>self.report_frequency: self.report_load() # SEND A ROUTINE LOAD REPORT report_time=time.time() except SystemExit: # sys.exit() CALLED pass # WE REALLY DO WANT TO EXIT. except: # IMPORTANT TO TRAP ALL ERRORS SO THAT WE UNREGISTER!! traceback.print_exc(self.max_tb,sys.stderr) #REPORT TB TO OUR LOG self.exit_message='error trap' self.unregister('run_all '+self.exit_message) # MUST UNREGISTER!! def run_interactive(self,it,n=1,**kwargs): "run n task IDs, with no error trapping" if not hasattr(it,'next'): it=it(self,**kwargs) # ASSUME it IS GENERATOR, USE IT TO GET ITERATOR i=0 self.register() # REGISTER WITH RESOURCE CONTROLLER & COORDINATOR try: # EVEN IF ERROR OCCURS, WE MUST UNREGISTER!! for id in it: self.success_id=id i+=1 if i>=n: break except: self.unregister('run_interactive error') # MUST UNREGISTER!!! raise # SHOW THE ERROR INTERACTIVELY self.unregister('run_interactive exit') return it # HAND BACK ITERATOR IN CASE USER WANTS TO RUN MORE... def parse_argv(): "parse sys.argv into a dictionary of GNU-style args --foo=bar and list of other args" d={} l=[] for v in sys.argv[1:]: if v[:2]=='--': try: k,v=v[2:].split('=') d[k]=v except ValueError: d[v[2:]]=None else: l.append(v) return d,l def start_client_or_server(clientGenerator,serverGenerator,resources,script): """start controller, client or server depending on whether we get coordinator argument from the command-line args. Client must be a generator function that takes Processor as argument, and uses it as an iterator. Also, clientGenerator must yield the IDs that the Processor provides (this structure allows us to trap all exceptions from clientGenerator, while allowing it to do resource initializations that would be much less elegant in a callback function.) Server must be a function that returns an iterator (e.g. a generator). Resources is a list of strings naming the resources we need copied to local host for client to be able to do its work. Both client and server constructors use **kwargs to get command line arguments (passed as GNU-style --foo=bar; see the constructor arguments to see the list of options that each can be passed. #CALL LIKE THIS FROM yourscript.py: import coordinator if __name__=='__main__': coordinator.start_client_or_server(clientGen,serverGen,resources,__file__) To start the resource controller: python coordinator.py --rc=NAME [options] To start a job coordinator: python yourscript.py NAME [--rc_url=URL] [options] To start a job processor: python yourscript.py --url=URL --rc_url=URL [options]""" d,l=parse_argv() if 'url' in d: # WE ARE A CLIENT! client=Processor(**d) time.sleep(5) # GIVE THE SERVER SOME BREATHING SPACE client.run_all(clientGenerator,**d) elif 'rc' in d: # WE ARE THE RESOURCE CONTROLLER rc_server=ResourceController(**d) # NAME FOR THIS CONTROLLER... detach_as_demon_process(rc_server) rc_server() # START THE SERVER else: # WE ARE A SERVER try: # PASS OUR KWARGS TO THE SERVER FUNCTION it=serverGenerator(**d) except TypeError: # DOESN'T WANT ANY ARGS? it=serverGenerator() server=Coordinator(l[0],script,it,resources,**d) detach_as_demon_process(server) server() # START THE SERVER class CoordinatorMonitor(object): "Monitor a Coordinator." def __init__(self,coordInfo): self.name,self.url,self.priority,self.allocated_ncpu,self.ncpu,\ self.start_time=coordInfo self.server=xmlrpclib.ServerProxy(self.url) self.get_status() def get_status(self): self.name,self.errlog,self.n,self.nsuccess,self.nerrors,self.client_report,\ self.pending_report,self.logfile=self.server.get_status() print "Got status from Coordinator:",self.name,self.url def __getattr__(self,attr): "just pass on method requests to our server" return getattr(self.server,attr) class RCMonitor(object): """monitor a ResourceController. Useful methods: get_status() load_balance() setrule(rsrc,rule) delrule(rsrc) setload(host,maxload) retry_unused_hosts() Documented in ResourceController docstrings.""" def __init__(self,host=None,port=5000): host=get_hostname(host) # GET FQDN self.rc_url='http://%s:%d' %(host,port) self.rc_server=xmlrpclib.ServerProxy(self.rc_url) self.get_status() def get_status(self): self.name,self.errlog,self.systemLoad,self.hosts,coordinators, \ self.rules,self.resources,self.locks=self.rc_server.get_status() print "Got status from ResourceController:",self.name,self.rc_url self.coordinators={} for cinfo in coordinators: try: # IF COORDINATOR HAS DIED, STILL WANT TO RETURN RCMonitor... self.coordinators[cinfo[0]]=CoordinatorMonitor(cinfo) except socket.error,e: # JUST COMPLAIN, BUT CONTINUE... print >>sys.stderr,"Unable to connect to coordinator:",cinfo,e def __getattr__(self,attr): "just pass on method requests to our rc_server" return getattr(self.rc_server,attr) def test_client(server,**kwargs): for id in server: print 'ID',id yield id time.sleep(1) def test_server(): return range(1000) if __name__=='__main__': start_client_or_server(test_client,test_server,[],__file__) PKŒ.;yöÄ´ûüûüpygr/coordinator.pyc;ò @,©Jc@smdklZdkZdkZdkZdkZdkZdkZdklZdk Z dk Z dk Z e d„Z ed„Zdefd„ƒYZdefd„ƒYZd efd „ƒYZeƒZd „Zd efd „ƒYZdefd„ƒYZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZ defd„ƒYZ!defd„ƒYZ"yd e#fd!„ƒYZ$Wne%j onXd"efd#„ƒYZ&d$„Z'd%„Z(d&efd'„ƒYZ)d(efd)„ƒYZ*d*„Z+d+„Z,e-d,joe(e+e,ge.ƒndS(-(s generatorsN(sSimpleXMLRPCServercCsS|tjotiƒ}nyti|ƒdSWntij o |SnXdS(s3get FQDN for host, or current host if not specifiediN(shostsNonessockets gethostnames gethostbyaddrsherror(shost((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_hostnames cCsa|tjo d}nt||fd|ƒ}|iiƒd}ti d|ƒ||fSdS(s­Start xmlrpc server on requested host:port. Return bound SimpleXMLRPCServer server obj and port it's bound to. Set port=0 to bind to a random port number. s localhosts logRequestsis#Running XMLRPC server on port %d...N( shostsNonesSimpleXMLRPCServersports logRequestssserverssockets getsocknamesloggingsinfo(shostsports logRequestssserver((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_servers  sXMLRPCClientObjectcBstZdZd„ZRS(sTprovides object proxy for remote object, with methods that mirror its xmlrpc_methodscCsn||_||_dk}dtfd„ƒY}x6|D].}t|||i ||ƒ||i ƒƒq8WdS(Ns methodcallcBstZd„Zd„ZRS(NcCs ||_dS(N(snamesself(sselfsname((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__-scGs#|iii|i|i|ƒSdS(N(sobjsservers methodCallsnamesselfsargs(sselfsobjsargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__call__/s(s__name__s __module__s__init__s__call__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys methodcall,s ( snamesselfsserversnewsobjects methodcalls methodDicts methodNamessetattrsinstancemethods __class__(sselfsserversnames methodDicts methodNames methodcallsnew((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__(s   (s__name__s __module__s__doc__s__init__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysXMLRPCClientObject&s s XMLRPCClientcBs tZdZd„Zd„ZRS(s9interface to XMLRPC server serving multiple named objectscCsti|ƒ|_dS(N(s xmlrpclibs ServerProxysurlsselfsserver(sselfsurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__6scCsŒyti||ƒSWnqtj oe|ii|ƒ}dk}t ||i ƒot|ƒ‚nt |||ƒ}|||<|SnXdS(s)get connection to the named server objectN( sdicts __getitem__sselfsnamesKeyErrorsservers objectInfos methodDictstypess isinstances StringTypesXMLRPCClientObjectsv(sselfsnamesvs methodDictstypes((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys __getitem__8s  (s__name__s __module__s__doc__s__init__s __getitem__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys XMLRPCClient4s  sConnectionDictcBstZdZd„ZRS(sJensure that multiple requests for the same connection use same ServerProxycCsFy||}Wn)tj ot|ƒ}|||run the named method on the named object and return its results*methodCall: blocked unregistered method %ssN( sselfsobjDictsobjnamesobjs methodnamesxmlrpc_methodssgetattrsmssyssstderrsKeyErrorsAttributeErrorsargs(sselfsobjnames methodnamesargssobjsm((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys methodCall s  cCs„|tj otidƒ|}nd|i|ifGH|o6dGHt|ƒ}|odG|GHt i dƒqvnt |ƒdS(s=launch the XMLRPC service. if daemonize=True, detach & exit.sLdemonize is a deprecated argument to serve_forever; use 'daemonize' instead!s"Serving on interface "%s", port %dsdetaching to run as a daemon.sPIDiN( sdemonizesNonesloggingswarnings daemonizesselfshostsportsdetach_as_demon_processspidssyssexits serve_forever(sselfsdemonizes daemonizespid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys serve_forevers     cCstit|fƒdS(N(sthreadsstart_new_threads serve_foreversself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysserve_in_thread)ssindexcCs›|i}|tjo |tj ot||ƒ}n|tj o$|id|i |i f|ƒn1dk l }|i id|i |i f|ƒdS(s4register our server with the designated index servers%s:%d(s worldbaseN(sselfsregistrationDatasdatasserversNonesurlsget_connectionsnamesregisterServershostsportspygrs worldbases_mdb(sselfsurlsnamesservers worldbasesdata((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister,s  $ (s__name__s __module__s__doc__sxmlrpc_methodssmax_tbs safe_dispatchs _dispatchsFalsesNones__init__s __setitem__s __delitem__s objectLists objectInfos methodCalls serve_foreversserve_in_threadsregister(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysXMLRPCServerBaseís !      sResourceControllercBs©tZdZhdd<dd<dd<dd<dd<dd<dd<d d<d d<d d<d d<d d<dd<dd<dd<dd<dd<dd}|it|iƒ}|djo|||g7}q…q…Wdk}|i|ƒd}xM|t| ƒjo|t|ƒjo&||ii| |ƒ|d7}qæW|djSdS(s>hand out available processors to coordinators in order of needf1.0f0.0iNi(sselfsoverload_marginsmargins free_cpussnprocs coordinatorssvaluesscs processorsshostspidsKeyErrorshostss systemLoadsloadsmaxloadsintslensFalseslsallocated_ncpusncpusrandomsshufflesisnew_cpussappend( sselfsloadscsrandomspidslsncpusishosts free_cpussnprocsmargin((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysassign_processors„sP    4   &cCsXtiƒ|_t|_|iƒ|iƒx!|iiƒD]}|i ƒq<Wt SdS(s2recalculate load assignments, and assign free cpusN( stimesselfsrebalance_timesFalsesmust_rebalances assign_loadsassign_processorss coordinatorssvaluesscs update_loadsTrue(sselfsc((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys load_balance«s   cCst|i||ƒSdS(sget a host attributeN(sgetattrsselfshostsshostsattr(sselfshostsattr((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_hostinfoµscCs\yt|i|||ƒWn6tj o*td|t|ƒfƒ|i| %fs$register_coordinator: %s (%s,%s): %fiN(ssyssstderrsnamesusersurlsselfs coordinatorssprioritys immediates demand_ncpusKeyErrorsCoordinatorInfos resourcessnjobsTruesmust_rebalance(sselfsnamesurlsusersprioritys resourcess immediates demand_ncpu((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister_coordinatorìs*  cCsjy2|i|=tid|||fIJ|iƒWn-tj o!tid|||fIJnXt SdS(s"remove a coordinator from our lists#unregister_coordinator: %s (%s): %ss*unregister_coordinator: %s unknown:%s (%s)N( sselfs coordinatorssurlssyssstderrsnamesmessages load_balancesKeyErrorsTrue(sselfsnamesurlsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysunregister_coordinatorÿs cCsty|i|}Wn.tj o"tid||fIJgSnX|iƒ|i ƒt |i ƒ}|i 2|SdS(s@return a list of hosts for this coordinator to run processors ons)request_cpus: unknown coordinator %s @ %sN( sselfs coordinatorssurlscsKeyErrorssyssstderrsnames assign_loadsassign_processorsstuplesnew_cpus(sselfsnamesurlscsnew_cpus((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys request_cpus s   cCsNy0|i|c||f7<|i|cd7&%s &' >%s 2>&1 &sSSH: i()stempfileslensselfsclientss ncpu_limitssyssstderrs max_clientssclients_startingshostsmax_ssh_errorssKeyErrorsinitialization_errorssmax_initialization_errorsshostsssshoptssAttributeErrorsosspathsjoins gettempdirsnamesiclientslogfilesappends_[1]skwargssitemssksvsdirspythonsscriptsportsrc_urlscmdserrlogsssh_cmdsFalsestimessystem( sselfshosts_[1]scmdssshoptsstempfilesvsssh_cmdskwargsslogfilesk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys start_clientÚsH %%     +I:$ cCs&x|D]}|i|ƒqWtSdS(s9start processors on the list of hosts using SSH transportN(shostsshostsselfs start_clientsTrue(sselfshostsshost((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysstart_processors s cCsNd|i|if}|ii|i||i|i|i |i |i ƒdS(s3register our existence with the resource controllers http://%s:%dN( sselfshostsportsurls rc_serversregister_coordinatorsnamesusersprioritys resourcess immediates demand_ncpu(sselfsurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregisters  cCs3d|i|if}|ii|i||ƒdS(s*tell the resource controller we're exitings http://%s:%dN(sselfshostsportsurls rc_serversunregister_coordinatorsnamesmessage(sselfsmessagesurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys unregisterscCs®tid||fIJd|i||fXMLRPC call to register client hostname and PID as starting_upsregister_client: %s:%diiisno client logfile?N( ssyssstderrshostspidsselfsclientsslogfilesiclientsclients_startingsKeyErrorsclients_initializingsTrue(sselfshostspidslogfilesiclient((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister_clients$cCsètid|||fIJy|i||f=Wn*tj otid||fIJnXy|i||f=Wntj onXy|i ||f=Wntj onXt |iƒdjo|i o|i dƒnt SdS(s5XMLRPC call to remove client from register as exitingsunregister_client: %s:%d %ss'unregister_client: unknown client %s:%disDoneN(ssyssstderrshostspidsmessagesselfsclientssKeyErrors stop_clientssclients_initializingslensdonesexitsTrue(sselfshostspidsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysunregister_client+s" cCs¶|i|IJ|iiƒ|id7_y|i||fcd7s  cCstid|t|ƒt|ƒ|fIJ||f|ijoU|i||f}y|i |i |ƒWq”t j o|g|i |%d)isgiving id %s to %s:%ds"exhausted all items from iterator!f0.0N(shostspidsselfsclientsssyssstderrsFalsesclients_initializingsKeyErrors success_idsreport_successsdones stop_clientsslens max_clientssitsidsstrs already_donesnslastIDstimespendingsTruesprioritysregister(sselfshostspids success_idsid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysnextbs@  &         cCs¬gi}|iiƒD]\}}|||fƒq~}gi}|iiƒD]\}}||f|ƒqT~}|i |i |i|i|i|||ifSdS(sEreturn basic status info on number of jobs finished, client list etc.N(sappends_[1]sselfsclientssitemssclientsnsuccesss client_reportspendingsksvspending_reportsnameserrlogsnsnerrorsslogfile(sselfsvsclients_[1]s client_reportspending_reportsnsuccesssk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_status„s==cCst|ƒ|_tSdS(s;change the maximum number of clients we should have runningN(sintsnsselfs max_clientssTrue(sselfsn((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysset_max_clientsŠscCst|i||fWWn8tj on'ti|itiƒd|_nX|id |iƒd S( s:run until all task IDs completed, trap & report all errorsiisserverStopIterationsuser StopIteration errorsinitialization errorsdonestoo many errorss error trapsrun_all N(serrors_in_a_rowsresultGeneratorsselfskwargssitstimes report_timesregistersNonesinitializationErrorsnextsids success_idsFalses StopIterationshasattrs report_errors pending_ids exit_messages SystemExitsTruesmax_errors_in_a_rowsreport_frequencys report_loads tracebacks print_excsmax_tbssyssstderrs unregister(sselfsresultGeneratorskwargss report_timesitsidsinitializationErrorserrors_in_a_row((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysrun_all sR               icKst|dƒ o|||}nd}|iƒy:x3|D]+}||_|d7}||joPq>q>WWn|i dƒ‚nX|i dƒ|SdS(s&run n task IDs, with no error trappingsnextiisrun_interactive errorsrun_interactive exitN( shasattrsitsselfskwargssisregistersids success_idsns unregister(sselfsitsnskwargssisid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysrun_interactiveLs"       (s__name__s __module__s__doc__smax_errors_in_a_rowsmax_tbsreport_frequencys overload_maxsFalses__init__sregisters unregisters__iter__snextsreport_successs report_errors report_loads open_resources acquire_rules release_rulesexitsrun_allsrun_interactive(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys Processor³s&           ,cCsŸh}g}x‚tidD]s}|d djoOy'|didƒ\}}|||run the named method on the named object and return its results*methodCall: blocked unregistered method %ssN( sselfsobjDictsobjnamesobjs methodnamesxmlrpc_methodssgetattrsmssyssstderrsKeyErrorsAttributeErrorsargs(sselfsobjnames methodnamesargssobjsm((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys methodCall s  cCs„|tj otidƒ|}nd|i|ifGH|o6dGHt|ƒ}|odG|GHt i dƒqvnt |ƒdS(s=launch the XMLRPC service. if daemonize=True, detach & exit.sLdemonize is a deprecated argument to serve_forever; use 'daemonize' instead!s"Serving on interface "%s", port %dsdetaching to run as a daemon.sPIDiN( sdemonizesNonesloggingswarnings daemonizesselfshostsportsdetach_as_demon_processspidssyssexits serve_forever(sselfsdemonizes daemonizespid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys serve_forevers     cCstit|fƒdS(N(sthreadsstart_new_threads serve_foreversself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysserve_in_thread)ssindexcCs›|i}|tjo |tj ot||ƒ}n|tj o$|id|i |i f|ƒn1dk l }|i id|i |i f|ƒdS(s4register our server with the designated index servers%s:%d(s worldbaseN(sselfsregistrationDatasdatasserversNonesurlsget_connectionsnamesregisterServershostsportspygrs worldbases_mdb(sselfsurlsnamesservers worldbasesdata((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister,s  $ (s__name__s __module__s__doc__sxmlrpc_methodssmax_tbs safe_dispatchs _dispatchsFalsesNones__init__s __setitem__s __delitem__s objectLists objectInfos methodCalls serve_foreversserve_in_threadsregister(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysXMLRPCServerBaseís !      sResourceControllercBs©tZdZhdd<dd<dd<dd<dd<dd<dd<d d<d d<d d<d d<d d<dd<dd<dd<dd<dd<dd}|it|iƒ}|djo|||g7}q…q…Wdk}|i|ƒd}xM|t| ƒjo|t|ƒjo&||ii| |ƒ|d7}qæW|djSdS(s>hand out available processors to coordinators in order of needf1.0f0.0iNi(sselfsoverload_marginsmargins free_cpussnprocs coordinatorssvaluesscs processorsshostspidsKeyErrorshostss systemLoadsloadsmaxloadsintslensFalseslsallocated_ncpusncpusrandomsshufflesisnew_cpussappend( sselfsloadscsrandomspidslsncpusishosts free_cpussnprocsmargin((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysassign_processors„sP    4   &cCsXtiƒ|_t|_|iƒ|iƒx!|iiƒD]}|i ƒq<Wt SdS(s2recalculate load assignments, and assign free cpusN( stimesselfsrebalance_timesFalsesmust_rebalances assign_loadsassign_processorss coordinatorssvaluesscs update_loadsTrue(sselfsc((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys load_balance«s   cCst|i||ƒSdS(sget a host attributeN(sgetattrsselfshostsshostsattr(sselfshostsattr((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_hostinfoµscCs\yt|i|||ƒWn6tj o*td|t|ƒfƒ|i| %fs$register_coordinator: %s (%s,%s): %fiN(ssyssstderrsnamesusersurlsselfs coordinatorssprioritys immediates demand_ncpusKeyErrorsCoordinatorInfos resourcessnjobsTruesmust_rebalance(sselfsnamesurlsusersprioritys resourcess immediates demand_ncpu((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister_coordinatorìs*  cCsjy2|i|=tid|||fIJ|iƒWn-tj o!tid|||fIJnXt SdS(s"remove a coordinator from our lists#unregister_coordinator: %s (%s): %ss*unregister_coordinator: %s unknown:%s (%s)N( sselfs coordinatorssurlssyssstderrsnamesmessages load_balancesKeyErrorsTrue(sselfsnamesurlsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysunregister_coordinatorÿs cCsty|i|}Wn.tj o"tid||fIJgSnX|iƒ|i ƒt |i ƒ}|i 2|SdS(s@return a list of hosts for this coordinator to run processors ons)request_cpus: unknown coordinator %s @ %sN( sselfs coordinatorssurlscsKeyErrorssyssstderrsnames assign_loadsassign_processorsstuplesnew_cpus(sselfsnamesurlscsnew_cpus((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys request_cpus s   cCsNy0|i|c||f7<|i|cd7&%s &' >%s 2>&1 &sSSH: i()stempfileslensselfsclientss ncpu_limitssyssstderrs max_clientssclients_startingshostsmax_ssh_errorssKeyErrorsinitialization_errorssmax_initialization_errorsshostsssshoptssAttributeErrorsosspathsjoins gettempdirsnamesiclientslogfilesappends_[1]skwargssitemssksvsdirspythonsscriptsportsrc_urlscmdserrlogsssh_cmdsFalsestimessystem( sselfshosts_[1]scmdssshoptsstempfilesvsssh_cmdskwargsslogfilesk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys start_clientÚsH %%     +I:$ cCs&x|D]}|i|ƒqWtSdS(s9start processors on the list of hosts using SSH transportN(shostsshostsselfs start_clientsTrue(sselfshostsshost((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysstart_processors s cCsNd|i|if}|ii|i||i|i|i |i |i ƒdS(s3register our existence with the resource controllers http://%s:%dN( sselfshostsportsurls rc_serversregister_coordinatorsnamesusersprioritys resourcess immediates demand_ncpu(sselfsurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregisters  cCs3d|i|if}|ii|i||ƒdS(s*tell the resource controller we're exitings http://%s:%dN(sselfshostsportsurls rc_serversunregister_coordinatorsnamesmessage(sselfsmessagesurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys unregisterscCs®tid||fIJd|i||fXMLRPC call to register client hostname and PID as starting_upsregister_client: %s:%diiisno client logfile?N( ssyssstderrshostspidsselfsclientsslogfilesiclientsclients_startingsKeyErrorsclients_initializingsTrue(sselfshostspidslogfilesiclient((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister_clients$cCsètid|||fIJy|i||f=Wn*tj otid||fIJnXy|i||f=Wntj onXy|i ||f=Wntj onXt |iƒdjo|i o|i dƒnt SdS(s5XMLRPC call to remove client from register as exitingsunregister_client: %s:%d %ss'unregister_client: unknown client %s:%disDoneN(ssyssstderrshostspidsmessagesselfsclientssKeyErrors stop_clientssclients_initializingslensdonesexitsTrue(sselfshostspidsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysunregister_client+s" cCs¶|i|IJ|iiƒ|id7_y|i||fcd7s  cCstid|t|ƒt|ƒ|fIJ||f|ijoU|i||f}y|i |i |ƒWq”t j o|g|i |%d)isgiving id %s to %s:%ds"exhausted all items from iterator!f0.0N(shostspidsselfsclientsssyssstderrsFalsesclients_initializingsKeyErrors success_idsreport_successsdones stop_clientsslens max_clientssitsidsstrs already_donesnslastIDstimespendingsTruesprioritysregister(sselfshostspids success_idsid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysnextbs@  &         cCs¬gi}|iiƒD]\}}|||fƒq~}gi}|iiƒD]\}}||f|ƒqT~}|i |i |i|i|i|||ifSdS(sEreturn basic status info on number of jobs finished, client list etc.N(sappends_[1]sselfsclientssitemssclientsnsuccesss client_reportspendingsksvspending_reportsnameserrlogsnsnerrorsslogfile(sselfsvsclients_[1]s client_reportspending_reportsnsuccesssk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_status„s==cCst|ƒ|_tSdS(s;change the maximum number of clients we should have runningN(sintsnsselfs max_clientssTrue(sselfsn((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysset_max_clientsŠscCst|i||fWWn8tj on'ti|itiƒd|_nX|id |iƒd S( s:run until all task IDs completed, trap & report all errorsiisserverStopIterationsuser StopIteration errorsinitialization errorsdonestoo many errorss error trapsrun_all N(serrors_in_a_rowsresultGeneratorsselfskwargssitstimes report_timesregistersNonesinitializationErrorsnextsids success_idsFalses StopIterationshasattrs report_errors pending_ids exit_messages SystemExitsTruesmax_errors_in_a_rowsreport_frequencys report_loads tracebacks print_excsmax_tbssyssstderrs unregister(sselfsresultGeneratorskwargss report_timesitsidsinitializationErrorserrors_in_a_row((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysrun_all sR               icKst|dƒ o|||}nd}|iƒy:x3|D]+}||_|d7}||joPq>q>WWn|i dƒ‚nX|i dƒ|SdS(s&run n task IDs, with no error trappingsnextiisrun_interactive errorsrun_interactive exitN( shasattrsitsselfskwargssisregistersids success_idsns unregister(sselfsitsnskwargssisid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysrun_interactiveLs"       (s__name__s __module__s__doc__smax_errors_in_a_rowsmax_tbsreport_frequencys overload_maxsFalses__init__sregisters unregisters__iter__snextsreport_successs report_errors report_loads open_resources acquire_rules release_rulesexitsrun_allsrun_interactive(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys Processor³s&           ,cCsŸh}g}x‚tidD]s}|d djoOy'|didƒ\}}|||' class BetterShelf(shelve.Shelf): """Shelf subclass that fixes its horrible iter implementation. """ def __iter__(self): 'avoid using iter provided by shelve/DictMixin, which loads all keys!' try: return iter(self.dict) except TypeError: # gdbm lacks __iter__ method, so try iter_gdbm() exc_type, exc_value, exc_traceback = sys.exc_info() try: self.dict.firstkey except AttributeError: # evidently not a gdbm dict raise exc_value, None, exc_traceback # re-raise original error else: # iterate using gdbm-specific method return iter_gdbm(self.dict) if sys.version_info < (2, 6): # Python finally added good err msg in 2.6 def close(self): if isinstance(self.dict, _ClosedDict): return # if already closed, nothing further to do... shelve.Shelf.close(self) # close Shelf as usual self.dict = _ClosedDict() # raises sensible error msg if accessed def shelve_open(filename, flag='c', protocol=None, writeback=False, useHash=True, mode=0666, *args, **kwargs): """improved implementation of shelve.open() that won't generate bogus __del__ warning messages like Python's version does.""" d = open_index(filename, flag, useHash, mode) # construct Shelf only if OK return BetterShelf(d, protocol, writeback, *args, **kwargs) PKŒ.;!!w((pygr/dbfile.pyc;ò å ¨Jc@s©dkZdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZ d „Z y4dk Z y e i Wne j o e‚nXWniej o]y:dkZy ei Wne j o e‚nXeZ Wq.ej o eZ q.XnXd ed d „Zd ed d „Zd„Zdeifd„ƒYZdeifd„ƒYZdeeed d„ZdS(NsWrongFormatErrorcBstZdZRS(s>attempted to open db with the wrong format e.g. btree vs. hash(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysWrongFormatErrors sNoSuchFileErrorcBstZdZRS(sfile does not exist!(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysNoSuchFileErrors sPermissionsErrorcBstZdZRS(s)inadequate permissions for requested file(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysPermissionsError s s ReadOnlyErrorcBstZdZRS(s=attempted to open a file for writing, but no write permission(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys ReadOnlyErrors cOs‚yti||ŽSWngtij oX}t|ƒ}|idƒot |ƒ‚n!|i dƒot |ƒ‚n‚nXdS(sItrap anydbm.error message and transform to our consistent exception typessnew dbsdb typeN( sanydbmsopensargsskwargsserrorsesstrsmsgsendswithsNoSuchFileErrors startswithsWrongFormatError(sargsskwargssesmsg((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_anydbms sri¶cCsay/|ot||ƒSnti|||ƒSWn+tiij o…|djp |djoTyt |ƒ}Wn#t j ot d|ƒ‚nX|i ƒtd|ƒ‚q]t d|ƒ‚n–tiij otd|ƒ‚nntiij o[y(|otii‚nt||ƒSWq]tiij otd|ƒ‚q]XnXdS(s¡open bsddb index instead of hash by default. useHash=True forces it to use anydbm default (i.e. hash) instead. Also gives more meaningful error messages.scsws'insufficient permissions to open file: sfile is read-only: sno file named: s,file does not match expected shelve format: N(suseHashs open_anydbmsfilenamesflagsbsddbsbtopensmodesdbs DBAccessErrorsfilesifilesIOErrorsPermissionsErrorscloses ReadOnlyErrorsDBNoSuchFileErrorsNoSuchFileErrorsDBInvalidArgErrorsWrongFormatError(sfilenamesflagsuseHashsmodesifile((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_bsddb/s. cCsTttjo0t||ƒ}| otidƒn|Snt ||||ƒSdS(Ns2Falling back to hash index: unable to import bsddb( sbsddbsNones open_anydbmsfilenamesflagsdsuseHashsloggerswarns open_bsddbsmode(sfilenamesflagsuseHashsmodesd((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_indexOs  ccs8|iƒ}x%|tj o|V|i|ƒ}qWdS(siterator for gdbm objectsN(sdbsfirstkeysksNonesnextkey(sdbsk((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys iter_gdbmWs   s _ClosedDictcBs2tZdZd„ZeZZZZd„ZRS(spThis dummy class exists solely to raise a clear error msg if accessed. Copied from the Python 2.6 shelve.py cGstdƒ‚dS(Ns!invalid operation on closed shelf(s ValueError(sselfsargs((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysclosedascCsdSdS(Ns((sself((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys__repr__es( s__name__s __module__s__doc__scloseds __getitem__s __setitem__s __delitem__skeyss__repr__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys _ClosedDict^s  s BetterShelfcBs:tZdZd„Zeiddfjo d„ZnRS(s@Shelf subclass that fixes its horrible iter implementation. cCs}yt|iƒSWnetj oYtiƒ\}}}y|ii Wnt j o|t |‚qyXt |iƒSnXdS(sDavoid using iter provided by shelve/DictMixin, which loads all keys!N( sitersselfsdicts TypeErrorssyssexc_infosexc_types exc_values exc_tracebacksfirstkeysAttributeErrorsNones iter_gdbm(sselfs exc_tracebacks exc_valuesexc_type((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys__iter__msiicCs;t|itƒodSntii|ƒtƒ|_dS(N(s isinstancesselfsdicts _ClosedDictsshelvesShelfsclose(sself((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysclose{s(s__name__s __module__s__doc__s__iter__ssyss version_infosclose(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys BetterShelfjs  scc Os/t||||ƒ}t|||||ŽSdS(swimproved implementation of shelve.open() that won't generate bogus __del__ warning messages like Python's version does.N( s open_indexsfilenamesflagsuseHashsmodesds BetterShelfsprotocols writebacksargsskwargs( sfilenamesflagsprotocols writebacksuseHashsmodesargsskwargssd((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys shelve_opens(sshelvesanydbmssyssUserDictsloggersIOErrorsWrongFormatErrorsNoSuchFileErrorsPermissionsErrors ReadOnlyErrors open_anydbmsbsddbsdbsAttributeErrors ImportErrorsbsddb3sNonesFalses open_bsddbs open_indexs iter_gdbms DictMixins _ClosedDictsShelfs BetterShelfsTrues shelve_open(sNoSuchFileErrors open_anydbms _ClosedDicts shelve_opens open_indexsbsddbsloggersbsddb3sUserDictsPermissionsErrorssyssanydbmsWrongFormatErrors iter_gdbms ReadOnlyErrorsshelves open_bsddbs BetterShelf((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys?s8$           PK Œ.;!!w((pygr/dbfile.pyo;ò å ¨Jc@s©dkZdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZ d „Z y4dk Z y e i Wne j o e‚nXWniej o]y:dkZy ei Wne j o e‚nXeZ Wq.ej o eZ q.XnXd ed d „Zd ed d „Zd„Zdeifd„ƒYZdeifd„ƒYZdeeed d„ZdS(NsWrongFormatErrorcBstZdZRS(s>attempted to open db with the wrong format e.g. btree vs. hash(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysWrongFormatErrors sNoSuchFileErrorcBstZdZRS(sfile does not exist!(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysNoSuchFileErrors sPermissionsErrorcBstZdZRS(s)inadequate permissions for requested file(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysPermissionsError s s ReadOnlyErrorcBstZdZRS(s=attempted to open a file for writing, but no write permission(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys ReadOnlyErrors cOs‚yti||ŽSWngtij oX}t|ƒ}|idƒot |ƒ‚n!|i dƒot |ƒ‚n‚nXdS(sItrap anydbm.error message and transform to our consistent exception typessnew dbsdb typeN( sanydbmsopensargsskwargsserrorsesstrsmsgsendswithsNoSuchFileErrors startswithsWrongFormatError(sargsskwargssesmsg((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_anydbms sri¶cCsay/|ot||ƒSnti|||ƒSWn+tiij o…|djp |djoTyt |ƒ}Wn#t j ot d|ƒ‚nX|i ƒtd|ƒ‚q]t d|ƒ‚n–tiij otd|ƒ‚nntiij o[y(|otii‚nt||ƒSWq]tiij otd|ƒ‚q]XnXdS(s¡open bsddb index instead of hash by default. useHash=True forces it to use anydbm default (i.e. hash) instead. Also gives more meaningful error messages.scsws'insufficient permissions to open file: sfile is read-only: sno file named: s,file does not match expected shelve format: N(suseHashs open_anydbmsfilenamesflagsbsddbsbtopensmodesdbs DBAccessErrorsfilesifilesIOErrorsPermissionsErrorscloses ReadOnlyErrorsDBNoSuchFileErrorsNoSuchFileErrorsDBInvalidArgErrorsWrongFormatError(sfilenamesflagsuseHashsmodesifile((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_bsddb/s. cCsTttjo0t||ƒ}| otidƒn|Snt ||||ƒSdS(Ns2Falling back to hash index: unable to import bsddb( sbsddbsNones open_anydbmsfilenamesflagsdsuseHashsloggerswarns open_bsddbsmode(sfilenamesflagsuseHashsmodesd((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_indexOs  ccs8|iƒ}x%|tj o|V|i|ƒ}qWdS(siterator for gdbm objectsN(sdbsfirstkeysksNonesnextkey(sdbsk((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys iter_gdbmWs   s _ClosedDictcBs2tZdZd„ZeZZZZd„ZRS(spThis dummy class exists solely to raise a clear error msg if accessed. Copied from the Python 2.6 shelve.py cGstdƒ‚dS(Ns!invalid operation on closed shelf(s ValueError(sselfsargs((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysclosedascCsdSdS(Ns((sself((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys__repr__es( s__name__s __module__s__doc__scloseds __getitem__s __setitem__s __delitem__skeyss__repr__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys _ClosedDict^s  s BetterShelfcBs:tZdZd„Zeiddfjo d„ZnRS(s@Shelf subclass that fixes its horrible iter implementation. cCs}yt|iƒSWnetj oYtiƒ\}}}y|ii Wnt j o|t |‚qyXt |iƒSnXdS(sDavoid using iter provided by shelve/DictMixin, which loads all keys!N( sitersselfsdicts TypeErrorssyssexc_infosexc_types exc_values exc_tracebacksfirstkeysAttributeErrorsNones iter_gdbm(sselfs exc_tracebacks exc_valuesexc_type((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys__iter__msiicCs;t|itƒodSntii|ƒtƒ|_dS(N(s isinstancesselfsdicts _ClosedDictsshelvesShelfsclose(sself((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysclose{s(s__name__s __module__s__doc__s__iter__ssyss version_infosclose(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys BetterShelfjs  scc Os/t||||ƒ}t|||||ŽSdS(swimproved implementation of shelve.open() that won't generate bogus __del__ warning messages like Python's version does.N( s open_indexsfilenamesflagsuseHashsmodesds BetterShelfsprotocols writebacksargsskwargs( sfilenamesflagsprotocols writebacksuseHashsmodesargsskwargssd((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys shelve_opens(sshelvesanydbmssyssUserDictsloggersIOErrorsWrongFormatErrorsNoSuchFileErrorsPermissionsErrors ReadOnlyErrors open_anydbmsbsddbsdbsAttributeErrors ImportErrorsbsddb3sNonesFalses open_bsddbs open_indexs iter_gdbms DictMixins _ClosedDictsShelfs BetterShelfsTrues shelve_open(sNoSuchFileErrors open_anydbms _ClosedDicts shelve_opens open_indexsbsddbsloggersbsddb3sUserDictsPermissionsErrorssyssanydbmsWrongFormatErrors iter_gdbms ReadOnlyErrorsshelves open_bsddbs BetterShelf((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys?s8$           PK6j$;PëX#­"­"pygr/downloader.pyimport sys, os from classutil import call_subprocess import logger # METHODS FOR AUTOMATIC DOWNLOADING OF RESOURCES def copy_to_file(f,ifile=None,newpath=None,blocksize=8192000): 'copy from file obj f to ifile (or create newpath if given)' if newpath is not None: ifile = file(newpath,'wb') # binary file try: while True: s = f.read(blocksize) if s == '': break ifile.write(s) finally: if newpath is not None: ifile.close() f.close() def do_gunzip(filepath,newpath=None): 'gunzip the target using Python gzip module' from gzip import GzipFile if newpath is None: newpath = filepath[:-3] f = GzipFile(filepath) copy_to_file(f,newpath=newpath) return newpath def run_gunzip(filepath,newpath=None): 'run gunzip program as a sub process' if newpath is None: newpath = filepath[:-3] ifile = open(newpath, 'w+b') try: if call_subprocess(['gunzip', '-c', filepath], stdout=ifile): raise OSError('gunzip "%s" failed!' % filepath) finally: ifile.close() return newpath def run_unzip(filepath,newpath=None,singleFile=False,**kwargs): '''run unzip program as a sub process, save to single file newpath if desired.''' if newpath is None: newpath = filepath[:-4] # DROP THE .zip SUFFIX if singleFile: # concatenate all files into newpath ifile = file(newpath, 'wb') # copy as binary file try: status = call_subprocess(['unzip', '-p', filepath], stdout=ifile) finally: ifile.close() else: # just unzip the package as usual status = call_subprocess(['unzip', filepath]) if status != 0: raise OSError('unzip "%s" failed!' % filepath) return newpath def create_dir_if_needed(path): 'ensure that this directory exists, by creating it if needed' import os if os.path.isdir(path): return # directory exists so nothing to do create_dir_if_needed(os.path.dirname(path)) # ensure parent exists os.mkdir(path) # create this directory def create_file_with_path(basepath, filepath): 'create file in write mode, creating parent directory(s) if needed' import os.path newpath = os.path.join(basepath, filepath) create_dir_if_needed(os.path.dirname(newpath)) return file(newpath, 'wb') # copy as binary file def do_unzip(filepath, newpath=None,singleFile=False,**kwargs): 'extract zip archive, to single file given by newpath if desired' # WARNING: zipfile module reads entire file into memory! if newpath is None: newpath = filepath[:-4] from zipfile import ZipFile t = ZipFile(filepath, 'r') try: if singleFile: # extract to a single file ifile = file(newpath,'wb') # copy as binary file try: for name in t.namelist(): ifile.write(t.read(name)) # may run out of memory!! finally: ifile.close() else: # extract a bunch of files as usual for name in t.namelist(): ifile = create_file_with_path(newpath, name) ifile.write(t.read(name)) # may run out of memory!! ifile.close() finally: t.close() return newpath def do_untar(filepath,mode='r|',newpath=None,singleFile=False,**kwargs): 'extract tar archive, to single file given by newpath if desired' if newpath is None: newpath = filepath + '.out' import tarfile t = tarfile.open(filepath, mode) try: if singleFile: # extract to a single file ifile = file(newpath,'wb') # copy as binary file try: for name in t.getnames(): f = t.extractfile(name) copy_to_file(f,ifile) finally: ifile.close() else: # extract a bunch of files as usual import os t.extractall(os.path.dirname(newpath)) finally: t.close() return newpath def uncompress_file(filepath,**kwargs): '''stub for applying appropriate uncompression based on file suffix (.tar .tar.gz .tgz .tar.bz2 .gz and .zip for now)''' if filepath.endswith('.zip'): logger.info('unzipping %s...' % filepath) try: return run_unzip(filepath,**kwargs) except OSError: return do_unzip(filepath, **kwargs) elif filepath.endswith('.tar'): logger.info('untarring %s...' % filepath) return do_untar(filepath,newpath=filepath[:-4],**kwargs) elif filepath.endswith('.tgz'): logger.info('untarring %s...' % filepath) return do_untar(filepath,mode='r:gz',newpath=filepath[:-4],**kwargs) elif filepath.endswith('.tar.gz'): logger.info('untarring %s...' % filepath) return do_untar(filepath,mode='r:gz',newpath=filepath[:-7],**kwargs) elif filepath.endswith('.tar.bz2'): logger.info('untarring %s...' % filepath) return do_untar(filepath,mode='r:bz2',newpath=filepath[:-8],**kwargs) elif filepath.endswith('.gz'): logger.info('gunzipping %s...' % filepath) try: # could use gzip module, but it's two times slower!! return run_gunzip(filepath, **kwargs) # run as sub process except OSError: # on Windows, have to run as python module return do_gunzip(filepath, **kwargs) return filepath # DEFAULT: NOT COMPRESSED, SO JUST HAND BACK FILENAME def download_monitor(bcount, bsize, totalsize): 'show current download progress' if bcount == 0: download_monitor.percentage_last_shown = 0. bytes = bcount * bsize percentage = bytes * 100. / totalsize if percentage >= 10. + download_monitor.percentage_last_shown: logger.info('downloaded %s bytes (%2.1f%%)...' % (bytes, percentage)) download_monitor.percentage_last_shown = percentage def download_unpickler(path,filename,kwargs): 'try to download the desired file, and uncompress it if need be' import urllib,classutil,os if filename is None: filename = os.path.basename(path) try: dl_dir = os.environ['WORLDBASEDOWNLOAD'] except KeyError: dl_dir = classutil.get_env_or_cwd('PYGRDATADOWNLOAD') filepath = os.path.join(dl_dir, filename) logger.info('Beginning download of %s to %s...' % (path, filepath)) t = urllib.urlretrieve(path,filepath,download_monitor) logger.info('Download done.') filepath = uncompress_file(filepath, **kwargs) # UNCOMPRESS IF NEEDED # PATH TO WHERE THIS FILE IS NOW STORED o = classutil.SourceFileName(filepath) o._saveLocalBuild = True # MARK THIS FOR SAVING IN LOCAL PYGR.DATA return o download_unpickler.__safe_for_unpickling__ = 1 class SourceURL(object): '''unpickling this object will trigger downloading of the desired path, which will be cached to WORLDBASEDOWNLOAD directory if any. The value returned from unpickling will simply be the path to the downloaded file, as a SourceFileName''' _worldbase_no_cache = True # force worldbase to always re-load this class def __init__(self,path,filename=None,**kwargs): self.path = path self.kwargs = kwargs self.filename = filename if path.startswith('http:'): # make sure we can read this URL import httplib conn = httplib.HTTPConnection(path.split('/')[2]) try: conn.request('GET', '/'.join([''] + path.split('/')[3:])) r1 = conn.getresponse() if r1.status!=200: raise OSError('http GET failed: %d %s, %s' %(r1.status,r1.reason,path)) finally: conn.close() def __reduce__(self): return (download_unpickler,(self.path,self.filename,self.kwargs)) def generic_build_unpickler(cname, args, kwargs): 'does nothing but construct the specified klass with the specified args' if cname=='BlastDB': from seqdb import BlastDB as klass else: raise ValueError('''class name not registered for unpickling security. Add it to pygr.downloader.generic_build_unpickler if needed: ''' + cname) o = klass(*args, **kwargs) o._saveLocalBuild = True # MARK FOR LOCAL PYGR.DATA SAVE return o generic_build_unpickler.__safe_for_unpickling__ = 1 class GenericBuilder(object): 'proxy for constructing the desired klass on unpickling' _worldbase_no_cache = True # force worldbase to always re-load this class def __init__(self, cname, *args, **kwargs): self.cname = cname self.args = args self.kwargs = kwargs def __reduce__(self): return (generic_build_unpickler,(self.cname,self.args,self.kwargs)) PKŒ.;%ôzc²,²,pygr/downloader.pyc;ò èu¡Jc@súdkZdkZdklZdkZeedd„Zed„Zed„Zee d„Z d„Z d„Z ee d „Z d ee d „Zd „Zd „Zd„Zde_defd„ƒYZd„Zde_defd„ƒYZdS(N(scall_subprocessi}cCsŽ|tj ot|dƒ}nzAx:to2|i|ƒ}|djoPn|i |ƒq&WWd|tj o|i ƒn|i ƒXdS(s:copy from file obj f to ifile (or create newpath if given)swbsN( snewpathsNonesfilesifilesTruesfsreads blocksizessswritesclose(sfsifilesnewpaths blocksizess((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys copy_to_files   cCsLdkl}|tjo|d }n||ƒ}t|d|ƒ|SdS(s*gunzip the target using Python gzip module(sGzipFileiýÿÿÿsnewpathN(sgzipsGzipFilesnewpathsNonesfilepathsfs copy_to_file(sfilepathsnewpathsfsGzipFile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys do_gunzips   cCst|tjo|d }nt|dƒ}z4tdd|gd|ƒotd|ƒ‚nWd|iƒX|SdS(s#run gunzip program as a sub processiýÿÿÿsw+bsgunzips-csstdoutsgunzip "%s" failed!N(snewpathsNonesfilepathsopensifilescall_subprocesssOSErrorsclose(sfilepathsnewpathsifile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys run_gunzips  cKs|tjo|d }n|o@t|dƒ}ztdd|gd|ƒ}Wd|iƒXntd|gƒ}|djot d|ƒ‚n|SdS( sOrun unzip program as a sub process, save to single file newpath if desired.iüÿÿÿswbsunzips-psstdoutNisunzip "%s" failed!( snewpathsNonesfilepaths singleFilesfilesifilescall_subprocesssstatussclosesOSError(sfilepathsnewpaths singleFileskwargssstatussifile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys run_unzip+s  cCsKdk}|ii|ƒodSnt|ii|ƒƒ|i|ƒdS(s;ensure that this directory exists, by creating it if neededN(sosspathsisdirscreate_dir_if_neededsdirnamesmkdir(spathsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pyscreate_dir_if_needed=s  cCsEdk}|ii||ƒ}t|ii|ƒƒt |dƒSdS(sAcreate file in write mode, creating parent directory(s) if neededNswb( sos.pathsosspathsjoinsbasepathsfilepathsnewpathscreate_dir_if_neededsdirnamesfile(sbasepathsfilepathsnewpathsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pyscreate_file_with_pathEs  cKsð|tjo|d }ndkl}||dƒ}z£|oRt|dƒ}z1x*|i ƒD]}|i |i |ƒƒq`WWd|i ƒXnGxC|i ƒD]5}t||ƒ}|i |i |ƒƒ|i ƒq WWd|i ƒX|SdS(s?extract zip archive, to single file given by newpath if desirediüÿÿÿ(sZipFilesrswbN(snewpathsNonesfilepathszipfilesZipFilests singleFilesfilesifilesnamelistsnameswritesreadsclosescreate_file_with_path(sfilepathsnewpaths singleFileskwargssnamesZipFilesifilest((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdo_unzipMs,     sr|c KsÑ|tjo|d}ndk}|i||ƒ} z…|oXt|dƒ}z7x0| i ƒD]"}| i |ƒ}t||ƒq_WWd|iƒXn#dk} | i| ii|ƒƒWd| iƒX|SdS(s?extract tar archive, to single file given by newpath if desireds.outNswb(snewpathsNonesfilepathstarfilesopensmodests singleFilesfilesifilesgetnamessnames extractfilesfs copy_to_filesclosesoss extractallspathsdirname( sfilepathsmodesnewpaths singleFileskwargssnamesfstarfilesifilesosst((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdo_untarfs(     cKs¼|idƒoItid|ƒyt||SWq´tj ot||Sq´Xn\|idƒo,tid|ƒt|d|d |Sn |idƒo2tid|ƒt|dd d|d |SnÞ|id ƒo2tid|ƒt|dd d|d |Snœ|id ƒo2tid|ƒt|dd d|d |SnZ|idƒoItid|ƒyt ||SWq´tj ot ||Sq´Xn|SdS(svstub for applying appropriate uncompression based on file suffix (.tar .tar.gz .tgz .tar.bz2 .gz and .zip for now)s.zipsunzipping %s...s.tarsuntarring %s...snewpathiüÿÿÿs.tgzsmodesr:gzs.tar.gziùÿÿÿs.tar.bz2sr:bz2iøÿÿÿs.gzsgunzipping %s...N( sfilepathsendswithsloggersinfos run_unzipskwargssOSErrorsdo_unzipsdo_untars run_gunzips do_gunzip(sfilepathskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysuncompress_file}s4!!!cCsn|djo dt_n||}|d|}|dtijo$tid||fƒ|t_ndS(sshow current download progressif0.0f100.0f10.0s downloaded %s bytes (%2.1f%%)...N( sbcountsdownload_monitorspercentage_last_shownsbsizesbytess totalsizes percentagesloggersinfo(sbcountsbsizes totalsizesbytess percentage((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdownload_monitor›s   c Csñdk}dk}dk} |tjo| ii|ƒ}ny| id}Wn"t j o|i dƒ}nX| ii ||ƒ}t id||fƒ|i||tƒ}t idƒt||}|i|ƒ}t|_|SdS(s>try to download the desired file, and uncompress it if need beNsWORLDBASEDOWNLOADsPYGRDATADOWNLOADs!Beginning download of %s to %s...sDownload done.(surllibs classutilsossfilenamesNonespathsbasenamesenvironsdl_dirsKeyErrorsget_env_or_cwdsjoinsfilepathsloggersinfos urlretrievesdownload_monitorstsuncompress_fileskwargssSourceFileNamesosTrues_saveLocalBuild( spathsfilenameskwargssos classutilsfilepathsurllibsdl_dirstsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdownload_unpickler¦s    is SourceURLcBs)tZdZeZed„Zd„ZRS(sóunpickling this object will trigger downloading of the desired path, which will be cached to WORLDBASEDOWNLOAD directory if any. The value returned from unpickling will simply be the path to the downloaded file, as a SourceFileNamecKsÖ||_||_||_|idƒo§dk}|i|idƒdƒ}zp|i ddi dg|idƒdƒƒ|i ƒ}|i djo#td|i |i|fƒ‚nWd|iƒXndS( Nshttp:s/isGETsiiÈshttp GET failed: %d %s, %s(spathsselfskwargssfilenames startswithshttplibsHTTPConnectionssplitsconnsrequestsjoins getresponsesr1sstatussOSErrorsreasonsclose(sselfspathsfilenameskwargsshttplibsr1sconn((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys__init__Às    - 'cCs t|i|i|iffSdS(N(sdownload_unpicklersselfspathsfilenameskwargs(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys __reduce__Ïs(s__name__s __module__s__doc__sTrues_worldbase_no_cachesNones__init__s __reduce__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys SourceURLºs  cCsN|djodkl}ntd|ƒ‚|||Ž}t|_ |SdS(sFdoes nothing but construct the specified klass with the specified argssBlastDB(sBlastDBspclass name not registered for unpickling security. Add it to pygr.downloader.generic_build_unpickler if needed: N( scnamesseqdbsBlastDBsklasss ValueErrorsargsskwargssosTrues_saveLocalBuild(scnamesargsskwargssosklass((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysgeneric_build_unpicklerÒs  sGenericBuildercBs&tZdZeZd„Zd„ZRS(s6proxy for constructing the desired klass on unpicklingcOs||_||_||_dS(N(scnamesselfsargsskwargs(sselfscnamesargsskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys__init__ás  cCs t|i|i|iffSdS(N(sgeneric_build_unpicklersselfscnamesargsskwargs(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys __reduce__ås(s__name__s __module__s__doc__sTrues_worldbase_no_caches__init__s __reduce__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysGenericBuilderÞs  (ssyssoss classutilscall_subprocesssloggersNones copy_to_files do_gunzips run_gunzipsFalses run_unzipscreate_dir_if_neededscreate_file_with_pathsdo_unzipsdo_untarsuncompress_filesdownload_monitorsdownload_unpicklers__safe_for_unpickling__sobjects SourceURLsgeneric_build_unpicklersGenericBuilder(sdo_untarsdo_unzips copy_to_files SourceURLsuncompress_filesGenericBuildersgeneric_build_unpicklers run_gunzips do_gunzipscreate_file_with_pathssysscreate_dir_if_neededsdownload_unpicklerscall_subprocesssloggersdownload_monitorsoss run_unzip((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys?s$         PK Œ.;%ôzc²,²,pygr/downloader.pyo;ò èu¡Jc@súdkZdkZdklZdkZeedd„Zed„Zed„Zee d„Z d„Z d„Z ee d „Z d ee d „Zd „Zd „Zd„Zde_defd„ƒYZd„Zde_defd„ƒYZdS(N(scall_subprocessi}cCsŽ|tj ot|dƒ}nzAx:to2|i|ƒ}|djoPn|i |ƒq&WWd|tj o|i ƒn|i ƒXdS(s:copy from file obj f to ifile (or create newpath if given)swbsN( snewpathsNonesfilesifilesTruesfsreads blocksizessswritesclose(sfsifilesnewpaths blocksizess((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys copy_to_files   cCsLdkl}|tjo|d }n||ƒ}t|d|ƒ|SdS(s*gunzip the target using Python gzip module(sGzipFileiýÿÿÿsnewpathN(sgzipsGzipFilesnewpathsNonesfilepathsfs copy_to_file(sfilepathsnewpathsfsGzipFile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys do_gunzips   cCst|tjo|d }nt|dƒ}z4tdd|gd|ƒotd|ƒ‚nWd|iƒX|SdS(s#run gunzip program as a sub processiýÿÿÿsw+bsgunzips-csstdoutsgunzip "%s" failed!N(snewpathsNonesfilepathsopensifilescall_subprocesssOSErrorsclose(sfilepathsnewpathsifile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys run_gunzips  cKs|tjo|d }n|o@t|dƒ}ztdd|gd|ƒ}Wd|iƒXntd|gƒ}|djot d|ƒ‚n|SdS( sOrun unzip program as a sub process, save to single file newpath if desired.iüÿÿÿswbsunzips-psstdoutNisunzip "%s" failed!( snewpathsNonesfilepaths singleFilesfilesifilescall_subprocesssstatussclosesOSError(sfilepathsnewpaths singleFileskwargssstatussifile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys run_unzip+s  cCsKdk}|ii|ƒodSnt|ii|ƒƒ|i|ƒdS(s;ensure that this directory exists, by creating it if neededN(sosspathsisdirscreate_dir_if_neededsdirnamesmkdir(spathsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pyscreate_dir_if_needed=s  cCsEdk}|ii||ƒ}t|ii|ƒƒt |dƒSdS(sAcreate file in write mode, creating parent directory(s) if neededNswb( sos.pathsosspathsjoinsbasepathsfilepathsnewpathscreate_dir_if_neededsdirnamesfile(sbasepathsfilepathsnewpathsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pyscreate_file_with_pathEs  cKsð|tjo|d }ndkl}||dƒ}z£|oRt|dƒ}z1x*|i ƒD]}|i |i |ƒƒq`WWd|i ƒXnGxC|i ƒD]5}t||ƒ}|i |i |ƒƒ|i ƒq WWd|i ƒX|SdS(s?extract zip archive, to single file given by newpath if desirediüÿÿÿ(sZipFilesrswbN(snewpathsNonesfilepathszipfilesZipFilests singleFilesfilesifilesnamelistsnameswritesreadsclosescreate_file_with_path(sfilepathsnewpaths singleFileskwargssnamesZipFilesifilest((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdo_unzipMs,     sr|c KsÑ|tjo|d}ndk}|i||ƒ} z…|oXt|dƒ}z7x0| i ƒD]"}| i |ƒ}t||ƒq_WWd|iƒXn#dk} | i| ii|ƒƒWd| iƒX|SdS(s?extract tar archive, to single file given by newpath if desireds.outNswb(snewpathsNonesfilepathstarfilesopensmodests singleFilesfilesifilesgetnamessnames extractfilesfs copy_to_filesclosesoss extractallspathsdirname( sfilepathsmodesnewpaths singleFileskwargssnamesfstarfilesifilesosst((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdo_untarfs(     cKs¼|idƒoItid|ƒyt||SWq´tj ot||Sq´Xn\|idƒo,tid|ƒt|d|d |Sn |idƒo2tid|ƒt|dd d|d |SnÞ|id ƒo2tid|ƒt|dd d|d |Snœ|id ƒo2tid|ƒt|dd d|d |SnZ|idƒoItid|ƒyt ||SWq´tj ot ||Sq´Xn|SdS(svstub for applying appropriate uncompression based on file suffix (.tar .tar.gz .tgz .tar.bz2 .gz and .zip for now)s.zipsunzipping %s...s.tarsuntarring %s...snewpathiüÿÿÿs.tgzsmodesr:gzs.tar.gziùÿÿÿs.tar.bz2sr:bz2iøÿÿÿs.gzsgunzipping %s...N( sfilepathsendswithsloggersinfos run_unzipskwargssOSErrorsdo_unzipsdo_untars run_gunzips do_gunzip(sfilepathskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysuncompress_file}s4!!!cCsn|djo dt_n||}|d|}|dtijo$tid||fƒ|t_ndS(sshow current download progressif0.0f100.0f10.0s downloaded %s bytes (%2.1f%%)...N( sbcountsdownload_monitorspercentage_last_shownsbsizesbytess totalsizes percentagesloggersinfo(sbcountsbsizes totalsizesbytess percentage((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdownload_monitor›s   c Csñdk}dk}dk} |tjo| ii|ƒ}ny| id}Wn"t j o|i dƒ}nX| ii ||ƒ}t id||fƒ|i||tƒ}t idƒt||}|i|ƒ}t|_|SdS(s>try to download the desired file, and uncompress it if need beNsWORLDBASEDOWNLOADsPYGRDATADOWNLOADs!Beginning download of %s to %s...sDownload done.(surllibs classutilsossfilenamesNonespathsbasenamesenvironsdl_dirsKeyErrorsget_env_or_cwdsjoinsfilepathsloggersinfos urlretrievesdownload_monitorstsuncompress_fileskwargssSourceFileNamesosTrues_saveLocalBuild( spathsfilenameskwargssos classutilsfilepathsurllibsdl_dirstsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdownload_unpickler¦s    is SourceURLcBs)tZdZeZed„Zd„ZRS(sóunpickling this object will trigger downloading of the desired path, which will be cached to WORLDBASEDOWNLOAD directory if any. The value returned from unpickling will simply be the path to the downloaded file, as a SourceFileNamecKsÖ||_||_||_|idƒo§dk}|i|idƒdƒ}zp|i ddi dg|idƒdƒƒ|i ƒ}|i djo#td|i |i|fƒ‚nWd|iƒXndS( Nshttp:s/isGETsiiÈshttp GET failed: %d %s, %s(spathsselfskwargssfilenames startswithshttplibsHTTPConnectionssplitsconnsrequestsjoins getresponsesr1sstatussOSErrorsreasonsclose(sselfspathsfilenameskwargsshttplibsr1sconn((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys__init__Às    - 'cCs t|i|i|iffSdS(N(sdownload_unpicklersselfspathsfilenameskwargs(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys __reduce__Ïs(s__name__s __module__s__doc__sTrues_worldbase_no_cachesNones__init__s __reduce__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys SourceURLºs  cCsN|djodkl}ntd|ƒ‚|||Ž}t|_ |SdS(sFdoes nothing but construct the specified klass with the specified argssBlastDB(sBlastDBspclass name not registered for unpickling security. Add it to pygr.downloader.generic_build_unpickler if needed: N( scnamesseqdbsBlastDBsklasss ValueErrorsargsskwargssosTrues_saveLocalBuild(scnamesargsskwargssosklass((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysgeneric_build_unpicklerÒs  sGenericBuildercBs&tZdZeZd„Zd„ZRS(s6proxy for constructing the desired klass on unpicklingcOs||_||_||_dS(N(scnamesselfsargsskwargs(sselfscnamesargsskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys__init__ás  cCs t|i|i|iffSdS(N(sgeneric_build_unpicklersselfscnamesargsskwargs(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys __reduce__ås(s__name__s __module__s__doc__sTrues_worldbase_no_caches__init__s __reduce__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysGenericBuilderÞs  (ssyssoss classutilscall_subprocesssloggersNones copy_to_files do_gunzips run_gunzipsFalses run_unzipscreate_dir_if_neededscreate_file_with_pathsdo_unzipsdo_untarsuncompress_filesdownload_monitorsdownload_unpicklers__safe_for_unpickling__sobjects SourceURLsgeneric_build_unpicklersGenericBuilder(sdo_untarsdo_unzips copy_to_files SourceURLsuncompress_filesGenericBuildersgeneric_build_unpicklers run_gunzips do_gunzipscreate_file_with_pathssysscreate_dir_if_neededsdownload_unpicklerscall_subprocesssloggersdownload_monitorsoss run_unzip((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys?s$         PKŒ|;þ„Hè,t,tpygr/graphquery.py from __future__ import generators from mapping import * class QueryMatchWrapper(dict): "build a queryMatch mapping on demand, since its not actually needed during query traversal" def __init__(self,dataMatch,compiler): dict.__init__(self) for k,v in dataMatch.items(): # INVERT THE DATA MATCH MAPPING self[v]=k for i in range(compiler.n): # ALSO SAVE MAPPINGS TO DATA EDGES gqi=compiler.gqi[i] self[gqi.fromNode,gqi.queryNode]=compiler.dataEdge[i] class QueryMatchDescriptor(object): def __get__(self,obj,objtype): return QueryMatchWrapper(obj.dataMatch,obj) class QueryMatcher(object): "map a query node or edge on demand" def __init__(self,compiler): self.compiler=compiler def __getitem__(self,k): for q,d in self.iteritems(): if q==k: return d return KeyError def __iter__(self,k): for k,v in self.iteritems(): yield k def iteritems(self): for dataNode,queryNode in self.compiler.dataMatch.items(): yield queryNode,dataNode # RETURN NODE MAPPINGS for i in range(self.compiler.n): # ALSO SAVE MAPPINGS TO DATA EDGES gqi=self.compiler.gqi[i] # RETURN EDGE MAPPINGS yield (gqi.fromNode,gqi.queryNode),self.compiler.dataEdge[i] def items(self): return [x for x in self.iteritems()] def __repr__(self): return '{'+','.join([repr(k)+':'+repr(v) for k,v in self.iteritems()])+'}' class GraphQueryCompiler(object): 'compile a series of GraphQueryIterators into python code, run them' #queryMatch=QueryMatchDescriptor() _lang="" # NO LANGUAGE STEM def __init__(self,name='graphquery',globalDict=None): self.name=name self.code=[] self.unmark_code=[] self.next_code=[] self.end_code=[] self.indent=[] self.gqi=[] self.queryLayerGraph=dictGraph() self.n=0 if globalDict is None: self._compiled={} else: self._compiled=globalDict self.queryMatch=QueryMatcher(self) def __getitem__(self,key): 'return appropropriate code for accessing nodes / edges in data or query' if key=='n': return self.n elif key=='name': return self.name elif key=='dataGraph': queryEdge=self.gqi[self.n].queryGraph[self.gqi[self.n].fromNode][self.gqi[self.n].queryNode] try: # CHECK IF QUERY EDGE USES A NON-DEFAULT DATA GRAPH dg=queryEdge['dataGraph'] return 'self.gqi[%d].dataGraph' % self.n except (TypeError,KeyError): return 'dataGraph' elif key=='filter': return 'self.gqi[%d].filter' % self.n elif key=='toQueryNode': return 'self.gqi[%d].queryNode' % self.n elif key=='fromQueryNode': return 'self.gqi[%d].fromNode' % self.n if key[:2]=='to': layer=self.queryLayerGraph[self.gqi[self.n].queryNode] elif key[:4]=='from': layer=self.queryLayerGraph[self.gqi[self.n].fromNode] if key[-8:]=='DataNode': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'dataNode%d' %layer.values()[0] if key[-8:]=='DataEdge': # GET LAST LAYER, WHERE THIS EDGE CREATED return 'dataEdge[%d]' %layer.values()[-1] if key=='level': return self.n try: return getattr(self.gqi[self.n],key) except AttributeError: raise KeyError('%s not a valid GraphQueryCompiler key' % key) def indent_code(self,codestr,current_indent): 'calculate indentation levels added by code in codestr' codestr=codestr % self # PERFORM MACRO SUBSTITUTIONS lines=codestr.split('\n') lastline=lines[-1] if lastline=='' and len(lines)>1: # IGNORE TERMINAL BLANK LINE lastline=lines[-2] nindent=len(lastline.split('\t'))-1 # DETERMINE FINAL INDENTATION LEVEL if len(lastline)>0 and lastline[-1]==':': nindent+=1 s='' # NOW FORMAT THE CODE WITH PROPER INDENTATION LEVEL for line in lines: s+=current_indent*'\t'+line+'\n' return s,current_indent+nindent def __iadd__(self,gqi): 'add a GraphQueryIterator to be compiled into this query' self.gqi.append(gqi) if gqi.queryNode not in self.queryLayerGraph: # NOT ALREADY BOUND? self.queryLayerGraph+=gqi.queryNode codestr=getattr(gqi,self._lang+'_generator_code') markstr=getattr(gqi,self._lang+'_index_code') unmarkstr=getattr(gqi,self._lang+'_unmark_code') try: endcode=getattr(gqi,self._lang+'_end_code') except AttributeError: endcode='' try: nextcode=getattr(gqi,self._lang+'_next_code') except AttributeError: nextcode='' self.lastGenerator=self.n else: codestr=getattr(gqi,self._lang+'_closure_code') markstr=None unmarkstr=getattr(gqi,self._lang+'_unmark_closure_code') try: endcode=getattr(gqi,self._lang+'_end_closure_code') except AttributeError: endcode='' try: nextcode=getattr(gqi,self._lang+'_next_closure_code') except AttributeError: nextcode='' #BIND QUERY EDGE TO THIS LAYER self.queryLayerGraph[gqi.queryNode][gqi.fromNode]=self.n try: # GET INDENTATION LEVEL FROM PREVIOUS LAYER current_indent=self.indent[-1] except IndexError: current_indent=1 # TOPLEVEL: MUST INDENT INSIDE def self.end_code.append(self.indent_code(endcode,current_indent)[0]) s,current_indent=self.indent_code(codestr,current_indent) self.next_code.append(self.indent_code(nextcode,current_indent)[0]) if hasattr(gqi,'filter'): s2,current_indent=self.indent_code(getattr(gqi,self._lang+'_filter_code'), current_indent) s+=s2 if hasattr(gqi,'filtercode'): s2,current_indent=self.indent_code(gqi.filtercode,current_indent) s+=s2 if markstr is not None: s2,current_indent=self.indent_code(markstr,current_indent) s+=s2 if unmarkstr is not None: s2,tail_indent=self.indent_code(unmarkstr,current_indent) self.unmark_code.append(s2) else: self.unmark_code.append('') # NO UNMARK CODE, SO JUST APPEND BLANK self.code.append(s) self.indent.append(current_indent) self.n+=1 return self # iadd MUST RETURN self!! _def_code=""" def %(name)s(self,dataGraph,dataMatch=None,queryMatch=None): if dataMatch is None: dataMatch={} self.dataMatch=dataMatch dataEdge=%(n)d*[None] self.dataEdge=dataEdge """ _yield_code='yield self.queryMatch\n' _end_code='' def __str__(self): 'generate code for this query, as a string function definition' s=self._def_code % self for layer in self.code: # GENERATE ALL THE TRAVERSAL CODE s+=layer s2=self.indent_code(self._yield_code,self.indent[-1])[0] # yield THE RESULT s+=s2 i=len(self.unmark_code)-1 while i>=0: # GENERATE THE UNMARKING CODE... s+=self.unmark_code[i] s+=self.next_code[i] s+=self.end_code[i] i-=1 s+=self._end_code % self return s def run(self,dataGraph,*args,**kwargs): 'run the query, pre-compiling it if necessary' try: # JUST TRY RUNNING OUR FUNCTION: IT RETURNS AN ITERATOR return self._compiled[self.name](self,dataGraph,*args,**kwargs) except KeyError: self.compile() return self._compiled[self.name](self,dataGraph,*args,**kwargs) # RUN IT def compile(self): 'compile using Python exec statement' exec str(self) in self._compiled # COMPILE OUR FUNCTION def find_distutils_lib(path='build'): 'locate the build/lib path where distutils builds modules' import os dirs=os.listdir('build') # TRY TO FIND LIB DIRECTORY CONTAINING BUILT MODULE for d in dirs: if d[:4]=='lib.': return path+'/'+d raise OSError((1,'unable to locate build/lib where distutils built your module!')) class GraphQueryPyrex(GraphQueryCompiler): 'compile a series of GraphQueryIterators into pyrex code, run them' #queryMatch=QueryMatchDescriptor() _lang="_pyrex" # NO LANGUAGE STEM def __getitem__(self,key): 'return appropropriate code for accessing nodes / edges in data or query' if key=='n': return self.n elif key=='name': return self.name elif key=='dataGraph': try: # CHECK IF QUERY EDGE USES A NON-DEFAULT DATA GRAPH queryEdge=self.gqi[self.n].queryGraph[self.gqi[self.n].fromNode][self.gqi[self.n].queryNode] dg=queryEdge['dataGraph'] return 'self.gqi[%d].dataGraph' % self.n except (TypeError,KeyError): return 'dataGraph' elif key=='filter': return 'self.gqi[%d].filter' % self.n elif key=='toQueryNode': return 'self.gqi[%d].queryNode' % self.n elif key=='fromQueryNode': return 'self.gqi[%d].fromNode' % self.n if key[:2]=='to': layer=self.queryLayerGraph[self.gqi[self.n].queryNode] elif key[:4]=='from': layer=self.queryLayerGraph[self.gqi[self.n].fromNode] if key[-8:]=='DataNode': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'dataNode%d' %layer.values()[0] if key[-8:]=='DataEdge': # GET LAST LAYER, WHERE THIS EDGE CREATED return 'dataEdge%d' %layer.values()[-1] if key[-8:]=='DataDict': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'cDict%d' %layer.values()[0] if key[-7:]=='DataPtr': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'pDictEntry%d' %layer.values()[0] if key[-11:]=='DataPtrCont': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'pGraphEntry%d' %layer.values()[0] if key[-11:]=='DataCounter': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'i%d' %layer.values()[0] if key=='toDataNodeUnmatched': l=['dataNode%d!=dataNode%d' %(self.queryLayerGraph[self.gqi[i].queryNode].values()[0], self.queryLayerGraph[self.gqi[self.n].queryNode].values()[0]) for i in range(self.n)] if len(l)>0: return ' and '.join(l) else: return 'True' if key=='dataNodeDefs': return ','.join(['dataNode%d' %i for i in range(self.n)]) if key=='dataEdgeDefs': return ','.join(['dataEdge%d' %i for i in range(self.n)]) if key=='dataDictDefs': return ','.join(['*cDict%d' %i for i in range(self.n)]) if key=='dataPtrDefs': return ','.join(['*pDictEntry%d' %i for i in range(self.n)]) if key=='dataPtrContDefs': return ','.join(['*pGraphEntry%d' %i for i in range(self.n)]) if key=='dataCounterDefs': return ','.join(['i%d' %i for i in range(self.n)]) if key=='dataCounterArgs': return ','.join(['int i%d' %i for i in range(self.n)]) if key=='itaVector': return ','.join(['ita.vector[%d]' %i for i in range(self.n)]) if key=='itaTuple': return ',\\\n'.join(['p_ita[%d]' %i for i in range(2*self.n)]) if key=='resultTuple': return ',\\\n'.join(['dataNode%d,dataEdge%d' %(self.queryLayerGraph[self.gqi[i].queryNode].values()[0],i) for i in range(self.n)]) if key=='resultTuples': return ','.join(['(dataNode%d,dataEdge%d)' %(self.queryLayerGraph[self.gqi[i].queryNode].values()[0],i) for i in range(self.n)]) if key=='level' or key=='nEdges': return self.n if key=='lastGenerator': return self.lastGenerator try: return getattr(self.gqi[self.n],key) except AttributeError: raise KeyError('%s not a valid GraphQueryPyrex key' % key) _def_code=""" cimport cdict cdef c_%(name)s(cdict.CGraphDict cgd,cdict.IntTupleArray ita,%(dataCounterArgs)s): cdef cdict.CGraph *dataGraph cdef cdict.CDict %(dataDictDefs)s cdef cdict.CDictEntry %(dataPtrDefs)s cdef cdict.CDictEntry *pd_temp cdef cdict.CGraphEntry %(dataPtrContDefs)s cdef cdict.CGraphEntry *p_temp #cdef int %(dataCounterDefs)s cdef int %(dataNodeDefs)s cdef int %(dataEdgeDefs)s cdef int *p_ita dataGraph=cgd.d p_ita=ita.data """ _yield_code=""" %(itaTuple)s=%(resultTuple)s p_ita=p_ita+2*%(nEdges)d ita.n=ita.n+1 if ita.n>=ita.n_alloc: ita.set_vector((%(dataCounterDefs)s),1) return """ #results.append((%(resultTuples)s))\n _end_code=""" ita.isDone=1 # COMPLETED THIS QUERY from pygr import cdict def %(name)s(self,g,int maxhit=1000,cdict.IntTupleArray ita=None,qml=None): if not isinstance(g,cdict.CGraphDict): g=cdict.CGraphDict(g,cdict.KeyIndex()) if ita is None: ita=cdict.IntTupleArray(maxhit,%(nEdges)d,2,%(lastGenerator)d) ita.n=0 c_%(name)s(g,ita,%(itaVector)s) # RUN THE QUERY if qml is not None: qml.matches=ita return qml else: return cdict.QueryMatchList(self,ita,g,%(name)s) """ def compile(self): 'compile using Pyrex, Distutils, and finally import!' import os try: # WE NEED ACCESS TO PYGR SOURCE TO ACCESS cgraph FUNCTIONS IN THIS MODULE... pygrpath=os.environ['PYGRPATH'] except KeyError: raise OSError((1,"""pyrex compilation requires access to pygr source. Please set the environment variable PYGRPATH to the top of the pygr source package.""")) if not os.access(pygrpath+'/pygr/cgraph.c',os.R_OK): raise OSError((1,"""Unable to access %s/pygr/cgraph.c. Is PYGRPATH set to the top of the pygr source package?""" % pygrpath)) exit_status=os.system('cp %s/pygr/cgraph.c %s/pygr/cgraph.h %s/pygr/cdict.pxd .' % (pygrpath,pygrpath,pygrpath)) if exit_status!=0: # RUN THE PYREX COMPILER TO PRODUCE C raise OSError((exit_status, 'unable to copy source code to this directory.')) modulename=self.name+str(id(self)) # CONSTRUCT A UNIQUE NAME FOR MODULE myfile=file(modulename+'.pyx','w') # GENERATE PYREX CODE myfile.write(str(self)) # WRITE CODE myfile.close() exit_status=os.system('pyrexc %s.pyx' % (modulename)) if exit_status!=0: # RUN THE PYREX COMPILER TO PRODUCE C raise OSError((exit_status, 'pyrex compilation failed. Is pyrex missing or not in your PATH?')) from distutils.core import setup, Extension module1 = Extension(modulename,sources = ['cgraph.c', modulename+'.c']) setup (name = modulename,description = 'autogenerated by pygr.graphquery', ext_modules = [module1],script_args=['build']) # BUILD MODULE USING distutils modulepath=find_distutils_lib() # FIND DIRECTORY CONTAINING OUR BUILT MODULE # WORKAROUND NASTY PROBLEM WITH PYREX cimport: NO WAY TO TELL IT MODULE IS # IN A SUBDIRECTORY! I.E. from pygr cimport cdict FAILS, AS DOES cimport pygr.cdict # INSTEAD WE HAVE TO SAY cimport cdict import sys import os.path from pygr import cdict sys.path+=[os.path.dirname(cdict.__file__)] # SO WE HAVE TO ADD ITS LOCATION TO OUR PATH import imp # FINALLY, TRY TO IMPORT THE NEW MODULE modulefile,path,desc=imp.find_module(modulename,[modulepath]) self._module=imp.load_module(modulename,modulefile,path,desc) # LOAD & BIND THE MODULE self._compiled[self.name]=getattr(self._module,self.name) # BIND OUR QUERY FUNCTION modulefile.close() class GraphQueryIterator(object): """iterator for a single node in graph query. Subclasses provide different flavors of generator methods: graph w/ edges; container; attr; function etc.""" def __init__(self,fromNode,queryNode,dataGraph,queryGraph, dataMatch,queryMatch,attrDict={}): self.fromNode=fromNode self.queryNode=queryNode self.dataGraph=dataGraph self.queryGraph=queryGraph self.dataMatch=dataMatch self.queryMatch=queryMatch self.dataNode=None for attr,val in attrDict.items(): # SAVE OUR EDGE INFO setattr(self,attr,val) # JUST ATTACH EDGE INFO AS ATTRIBUTES OF THIS OBJ ## try: ## self.nq=len(self.queryGraph[self.queryNode]) ## except KeyError: ## self.nq=0 def restart(self): "reset the iterator to its beginning" self.mustMark=True if self.fromNode != None: self.dataNode=self.queryMatch[self.fromNode] if self.queryNode in self.queryMatch: # ALREADY ASSIGNED TO A DATA NODE self.mustMark=False if self.fromNode is None: # NO PATH TO HERE, SO JUST ECHO SINGLETON self.iterator=self.echo() else: # CHECK FOR PATH FROM fromNode TO THIS DATA NODE self.iterator=self.closure() else: self.iterator=self.generate() def echo(self): "Just return what our node is ALREADY matched to" yield self.queryMatch[self.queryNode],None def closure(self): "this node is already matched. Make sure there exists path to it (closure)" targetNode=self.queryMatch[self.queryNode] try: # GENERATE IFF container HAS EDGE TO targetNode container=self.dataGraph[self.dataNode] yield targetNode,container[targetNode] except KeyError:pass def generate(self): "generate all neighbors of data node matched to fromNode" try: it=self.dataGraph[self.dataNode] except KeyError: pass else: for i,e in it.items(): yield i,e _generator_code=""" try: # GENERATOR it%(level)d=%(dataGraph)s[%(fromDataNode)s] except KeyError: continue for %(toDataNode)s,%(toDataEdge)s in it%(level)d.items():""" _index_code=""" if %(toDataNode)s in dataMatch: continue else: dataMatch[%(toDataNode)s]=%(toQueryNode)s #queryMatch[%(toQueryNode)s]=%(toDataNode)s #queryMatch[%(fromQueryNode)s,%(toQueryNode)s]=%(toDataEdge)s # THIS LINE PREVENTS COMPILER FROM PUSHING EXTRA INDENTATION LAYER""" _filter_code="if self.gqi[%(level)d].filter(toNode=%(toDataNode)s,fromNode=%(fromDataNode)s,edge=%(toDataEdge)s,queryMatch=self.queryMatch,gqi=self.gqi[%(level)d]):" _unmark_code=""" del dataMatch[%(toDataNode)s] #del queryMatch[%(toQueryNode)s] #del queryMatch[%(fromQueryNode)s,%(toQueryNode)s]""" _closure_code=""" try: # CLOSURE %(toDataEdge)s=%(dataGraph)s[%(fromDataNode)s][%(toDataNode)s] except KeyError: pass else: #queryMatch[%(fromQueryNode)s,%(toQueryNode)s]=%(toDataEdge)s""" _unmark_closure_code="#del queryMatch[%(fromQueryNode)s,%(toQueryNode)s]" # PYREX CODE _pyrex_generator_code=""" p_temp=cdict.cgraph_getitem(%(dataGraph)s,%(fromDataNode)s) if p_temp!=NULL: %(fromDataDict)s=p_temp[0].v %(toDataPtr)s=%(fromDataDict)s[0].dict while %(toDataCounter)s < %(fromDataDict)s[0].n: %(toDataNode)s=%(toDataPtr)s[%(toDataCounter)s].k %(toDataEdge)s=%(toDataPtr)s[%(toDataCounter)s].v """ #for %(toDataCounter)s from 0 <= %(toDataCounter)s < %(fromDataDict)s[0].n: _pyrex_index_code='if %(toDataNodeUnmatched)s:' _pyrex_unmark_code='# COMPILER NEEDS AT LEAST ONE LINE, EVEN THOUGH NOTHING TO DO HERE' _pyrex_next_code='%(toDataCounter)s=%(toDataCounter)s+1' _pyrex_end_code='%(toDataCounter)s=0' _pyrex_closure_code=""" p_temp=cdict.cgraph_getitem(%(dataGraph)s,%(fromDataNode)s) if p_temp!=NULL: %(fromDataDict)s=p_temp[0].v pd_temp=cdict.cdict_getitem(%(fromDataDict)s,%(toDataNode)s) if pd_temp!=NULL: %(toDataEdge)s=pd_temp[0].v """ _pyrex_unmark_closure_code='# COMPILER NEEDS AT LEAST ONE LINE, EVEN THOUGH NOTHING TO DO HERE' def unmark(self): "erase node and edge assignment associated with the iterator" if self.mustMark and self.queryNode in self.queryMatch: i=self.queryMatch[self.queryNode] # ERASE OLD NODE ASSIGNMENT del self.dataMatch[i] del self.queryMatch[self.queryNode] try: del self.queryMatch[(self.fromNode,self.queryNode)] #ERASE OLD EDGE except KeyError: pass def next(self): "returns the next node from iterator that passes all tests" self.unmark() for i,e in self.iterator: # RETURN THE FIRST ACCEPTABLE ITEM ## try: # THIS EDGE COUNT CHECK WON'T WORK IF MULTIPLE GRAPHS BEING QUERIED!! ## nd=len(self.dataGraph[i]) # CHECK # OF OUTGOING EDGES ## except KeyError: ## nd=0 ## if nd>=self.nq and if self.mustMark and i in self.dataMatch: continue # THIS NODE ALREADY ASSIGNED. CAN'T REUSE IT! if (not hasattr(self,'filter') # APPLY EDGE / NODE TESTS HERE or self.filter(toNode=i,fromNode=self.dataNode,edge=e, queryMatch=self.queryMatch,gqi=self)): if self.mustMark: self.dataMatch[i]=self.queryNode # SAVE THIS NODE ASSIGNMENT self.queryMatch[self.queryNode]=i if e is not None: # SAVE EDGE INFO, IF ANY self.queryMatch[(self.fromNode,self.queryNode)]=e return i # THIS ITEM PASSES ALL TESTS. RETURN IT return None # NO MORE ITEMS FROM THE ITERATOR class ContainerGQI(GraphQueryIterator): "Iterate over all nodes in self.dataGraph" def generate(self): for i in self.dataGraph: yield i,None _generator_code=""" %(toDataEdge)s=None # CONTAINER for %(toDataNode)s in dataGraph:""" _pyrex_generator_code=""" %(toDataPtrCont)s=%(dataGraph)s[0].dict for %(toDataCounter)s from 0 <= %(toDataCounter)s < %(dataGraph)s[0].n: %(toDataNode)s=%(toDataPtrCont)s[%(toDataCounter)s].k %(toDataEdge)s= -1 # NO EDGE INFO """ class AttributeGQI(GraphQueryIterator): "Iterate over all nodes in attribute called self.attr of self.dataNode" def generate(self): for i,e in getattr(self.dataNode,self.attr).items(): yield i,e _generator_code="for %(toDataNode)s,%(toDataEdge)s in getattr(%(fromDataNode)s,'%(attr)s').items():" class AttrContainerGQI(GraphQueryIterator): "Iterate over all nodes in attribute called self.attrN of self.dataNode (no edge info)" def generate(self): for i in getattr(self.dataNode,self.attrN): yield i,None _generator_code=""" %(toDataEdge)s=None for %(toDataNode)s in getattr(%(fromDataNode)s,'%(attrN)s'):""" class CallableGQI(GraphQueryIterator): "Call the specified function self.f as iterator" def generate(self): for i,e in self.f(self.dataNode,self.dataGraph,self): yield i,e _generator_code="for %(toDataNode)s,%(toDataEdge)s in self.gqi[%(level)d].f(%(fromDataNode)s,dataGraph,self.gqi[%(level)d]):" class CallableContainerGQI(GraphQueryIterator): "Call the specified function self.fN as iterator (no edge info)" def generate(self): for i in self.fN(self.dataNode,self.dataGraph,self): yield i,None _generator_code=""" %(toDataEdge)s=None for %(toDataNode)s in self.gqi[%(level)d].fN(%(fromDataNode)s,dataGraph,self.gqi[%(level)d]):""" class SubqueryGQI(GraphQueryIterator): """base class for running subqueries; produces a union of all subquery solutions. self.subqueries must be list of graph objects, each representing a subquery""" def __init__(self,fromNode,queryNode,dataGraph,queryGraph, dataMatch,queryMatch,attrDict={}): GraphQueryIterator.__init__(self,fromNode,queryNode,dataGraph,queryGraph, dataMatch,queryMatch,attrDict) self.graphQueries=[] for qg in self.subqueries: # INITIALIZE OUR SUBQUERIES self.graphQueries.append(self.gqClass(self.dataGraph,qg, dataMatch,queryMatch)) def closure(self): "Generate union of all solutions returned by all subqueries" for gq in self.graphQueries: for d in gq: # LAUNCHES THE GRAPH QUERY, GETS ALL ITS SOLUTIONS yield self.queryMatch[self.queryNode],None gq.cleanup() # REMOVE ITS QUERY-DATA MAPPING BEFORE GOING TO NEXT SUBQUERY def newGQI(self,oclass,fromNode,toNode,dataGraph,queryGraph, dataMatch,queryMatch,gqiDict): """figure out a default GQI class to use, based on an attribute dictionary, then return a new object of that class initialized with the input data.""" if fromNode is not None and toNode is not None and \ queryGraph[fromNode][toNode] is not None: kwargs=queryGraph[fromNode][toNode] for attr in kwargs: try: oclass=gqiDict[attr] # USE ATTRIBUTE NAME TO DETERMINE DEFAULT CLASS except KeyError: pass else: kwargs={} try: oclass=kwargs['__class__'] # LET USER SET CLASS TO USE except KeyError: pass return oclass(fromNode,toNode,dataGraph,queryGraph,dataMatch,queryMatch,kwargs) class GraphQuery(object): "represents a single query or subquery" # DEFAULT MAPPING OF ATTRIBUTE NAMES TO GQI CLASSES TO USE WITH THEM gqiDict={'attr':AttributeGQI, 'attrN':AttrContainerGQI, 'f':CallableGQI, 'fN':CallableContainerGQI, 'subqueries':SubqueryGQI} newGQI=newGQI # USE THIS METHOD TO CHOOSE GQI CLASS FOR EACH ITERATOR def __init__(self,dataGraph,queryGraph,dataMatch=None,queryMatch=None): 'Enumerate nodes in queryGraph in BFS order, constructing iterator stack' self.dataGraph=dataGraph self.queryGraph=queryGraph if dataMatch is None: dataMatch={} if queryMatch is None: queryMatch={} self.dataMatch=dataMatch self.queryMatch=queryMatch # 1ST NEED TO FIND START NODES, PROCESS THEM 1ST, MARK THEM AS GENERATE ALL... isFollower={} for node in queryGraph: for node2 in queryGraph[node]: isFollower[node2]=True # node2 HAS INCOMING EDGE, SO NOT A START NODE! q=[] self.q=q n=0 for node in queryGraph: # PLACE START NODES AT HEAD OF QUEUE if node not in isFollower: q.append(self.newGQI(ContainerGQI,None,node,dataGraph,queryGraph, dataMatch,queryMatch,self.gqiDict)) n += 1 if n==0: # NO START NODES, SO JUST ADD THE FIRST QUERY NODE TO THE QUEUE for node in queryGraph: q.append(self.newGQI(ContainerGQI,None,node,dataGraph,queryGraph, dataMatch,queryMatch,self.gqiDict)) n += 1 break # JUST ADD THE FIRST NODE TO THE QUEUE if n==0: raise ValueError('query graph is empty!') visited={} i=0 while i=0: dataNode=self.q[i].next() if dataNode is not None: #print i,qu[i].queryNode,dataNode if i+1~ƒSn|d9jp |d:jo |iSn|d;jo |iSnyt|i|i|ƒSWn#tj ot d<|ƒ‚nXd=S(>sGreturn appropropriate code for accessing nodes / edges in data or querysnsnames dataGraphsself.gqi[%d].dataGraphsfiltersself.gqi[%d].filters toQueryNodesself.gqi[%d].queryNodes fromQueryNodesself.gqi[%d].fromNodeistoisfromiøÿÿÿsDataNodes dataNode%disDataEdges dataEdge%diÿÿÿÿsDataDictscDict%diùÿÿÿsDataPtrs pDictEntry%diõÿÿÿs DataPtrConts pGraphEntry%ds DataCountersi%dstoDataNodeUnmatchedsdataNode%d!=dataNode%ds and sTrues dataNodeDefss,s dataEdgeDefss dataDictDefss*cDict%ds dataPtrDefss *pDictEntry%dsdataPtrContDefss*pGraphEntry%dsdataCounterDefssdataCounterArgssint i%ds itaVectorsita.vector[%d]sitaTuples,\ s p_ita[%d]s resultTuplesdataNode%d,dataEdge%ds resultTupless(dataNode%d,dataEdge%d)slevelsnEdgess lastGenerators"%s not a valid GraphQueryPyrex keyN(skeysselfsnsnamesgqis queryGraphsfromNodes queryNodes queryEdgesdgs TypeErrorsKeyErrorsqueryLayerGraphslayersvaluessappends_[1]srangesislslensjoins lastGeneratorsgetattrsAttributeError(sselfskeyslayersisdgsls_[1]s queryEdge((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys __getitem__àsŠ     5      s ? ? ? ? ? ? ? ? C ` `   s½ cimport cdict cdef c_%(name)s(cdict.CGraphDict cgd,cdict.IntTupleArray ita,%(dataCounterArgs)s): cdef cdict.CGraph *dataGraph cdef cdict.CDict %(dataDictDefs)s cdef cdict.CDictEntry %(dataPtrDefs)s cdef cdict.CDictEntry *pd_temp cdef cdict.CGraphEntry %(dataPtrContDefs)s cdef cdict.CGraphEntry *p_temp #cdef int %(dataCounterDefs)s cdef int %(dataNodeDefs)s cdef int %(dataEdgeDefs)s cdef int *p_ita dataGraph=cgd.d p_ita=ita.data s %(itaTuple)s=%(resultTuple)s p_ita=p_ita+2*%(nEdges)d ita.n=ita.n+1 if ita.n>=ita.n_alloc: ita.set_vector((%(dataCounterDefs)s),1) return sÕ ita.isDone=1 # COMPLETED THIS QUERY from pygr import cdict def %(name)s(self,g,int maxhit=1000,cdict.IntTupleArray ita=None,qml=None): if not isinstance(g,cdict.CGraphDict): g=cdict.CGraphDict(g,cdict.KeyIndex()) if ita is None: ita=cdict.IntTupleArray(maxhit,%(nEdges)d,2,%(lastGenerator)d) ita.n=0 c_%(name)s(g,ita,%(itaVector)s) # RUN THE QUERY if qml is not None: qml.matches=ita return qml else: return cdict.QueryMatchList(self,ita,g,%(name)s) c CsAdk}y|id} Wn%tj otddfƒ‚nX|i| d|iƒ otdd| fƒ‚n|id| | | fƒ}|djot|d fƒ‚n|i t t |ƒƒ}t|d d ƒ} | it |ƒƒ| iƒ|id |ƒ}|djot|d fƒ‚ndkl} l}||dd|dgƒ}| d|ddd|gddgƒtƒ}dk}dk}dkl}|i|ii|iƒg7_dk}|i ||gƒ\}} } |i#||| | ƒ|_$t%|i$|i ƒ|i&|i <|iƒdS(s3compile using Pyrex, Distutils, and finally import!NsPYGRPATHis‘pyrex compilation requires access to pygr source. Please set the environment variable PYGRPATH to the top of the pygr source package.s/pygr/cgraph.cseUnable to access %s/pygr/cgraph.c. Is PYGRPATH set to the top of the pygr source package?s8cp %s/pygr/cgraph.c %s/pygr/cgraph.h %s/pygr/cdict.pxd .is-unable to copy source code to this directory.s.pyxsws pyrexc %s.pyxs@pyrex compilation failed. Is pyrex missing or not in your PATH?(ssetups Extensionssourcesscgraph.cs.csnames descriptions autogenerated by pygr.graphquerys ext_moduless script_argssbuild(scdict('sossenvironspygrpathsKeyErrorsOSErrorsaccesssR_OKssystems exit_statussselfsnamesstrsids modulenamesfilesmyfileswritesclosesdistutils.coressetups Extensionsmodule1sfind_distutils_libs modulepathssyssos.pathspygrscdictspathsdirnames__file__simps find_modules modulefilesdescs load_modules_modulesgetattrs _compiled(sselfs modulenames exit_statuss modulefiles modulepathsmodule1simps Extensionssysspathsdescspygrpathssetupsmyfilesosscdict((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pyscompileXs@        ! ( s__name__s __module__s__doc__s_langs __getitem__s _def_codes _yield_codes _end_codescompile(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysGraphQueryPyrexÜs  N sGraphQueryIteratorcBsžtZdZhd„Zd„Zd„Zd„Zd„ZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZd„Zd„ZRS(sœiterator for a single node in graph query. Subclasses provide different flavors of generator methods: graph w/ edges; container; attr; function etc.c Csp||_||_||_||_||_||_t|_x*|i ƒD]\}} t ||| ƒqLWdS(N(sfromNodesselfs queryNodes dataGraphs queryGraphs dataMatchs queryMatchsNonesdataNodesattrDictsitemssattrsvalssetattr( sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDictsattrsval((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys__init__‰s        cCs•t|_|itjo|i|i|_n|i|ijo?t|_|itjo|i ƒ|_ q‘|i ƒ|_ n|i ƒ|_ dS(s#reset the iterator to its beginningN( sTruesselfsmustMarksfromNodesNones queryMatchsdataNodes queryNodesFalsesechositeratorsclosuresgenerate(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysrestart™s  ccs|i|itfVdS(s/Just return what our node is ALREADY matched toN(sselfs queryMatchs queryNodesNone(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysecho§sccsL|i|i}y"|i|i}|||fVWntj onXdS(sJthis node is already matched. Make sure there exists path to it (closure)N(sselfs queryMatchs queryNodes targetNodes dataGraphsdataNodes containersKeyError(sselfs targetNodes container((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysclosure«sccsUy|i|i}Wntj on)Xx$|iƒD]\}}||fVq7WdS(s7generate all neighbors of data node matched to fromNodeN(sselfs dataGraphsdataNodesitsKeyErrorsitemssise(sselfsisesit((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysgenerate³s s“ try: # GENERATOR it%(level)d=%(dataGraph)s[%(fromDataNode)s] except KeyError: continue for %(toDataNode)s,%(toDataEdge)s in it%(level)d.items():s if %(toDataNode)s in dataMatch: continue else: dataMatch[%(toDataNode)s]=%(toQueryNode)s #queryMatch[%(toQueryNode)s]=%(toDataNode)s #queryMatch[%(fromQueryNode)s,%(toQueryNode)s]=%(toDataEdge)s # THIS LINE PREVENTS COMPILER FROM PUSHING EXTRA INDENTATION LAYERs–if self.gqi[%(level)d].filter(toNode=%(toDataNode)s,fromNode=%(fromDataNode)s,edge=%(toDataEdge)s,queryMatch=self.queryMatch,gqi=self.gqi[%(level)d]):sr del dataMatch[%(toDataNode)s] #del queryMatch[%(toQueryNode)s] #del queryMatch[%(fromQueryNode)s,%(toQueryNode)s]s« try: # CLOSURE %(toDataEdge)s=%(dataGraph)s[%(fromDataNode)s][%(toDataNode)s] except KeyError: pass else: #queryMatch[%(fromQueryNode)s,%(toQueryNode)s]=%(toDataEdge)ss2#del queryMatch[%(fromQueryNode)s,%(toQueryNode)s]s. p_temp=cdict.cgraph_getitem(%(dataGraph)s,%(fromDataNode)s) if p_temp!=NULL: %(fromDataDict)s=p_temp[0].v %(toDataPtr)s=%(fromDataDict)s[0].dict while %(toDataCounter)s < %(fromDataDict)s[0].n: %(toDataNode)s=%(toDataPtr)s[%(toDataCounter)s].k %(toDataEdge)s=%(toDataPtr)s[%(toDataCounter)s].v sif %(toDataNodeUnmatched)s:sB# COMPILER NEEDS AT LEAST ONE LINE, EVEN THOUGH NOTHING TO DO HEREs%%(toDataCounter)s=%(toDataCounter)s+1s%(toDataCounter)s=0sÛ p_temp=cdict.cgraph_getitem(%(dataGraph)s,%(fromDataNode)s) if p_temp!=NULL: %(fromDataDict)s=p_temp[0].v pd_temp=cdict.cdict_getitem(%(fromDataDict)s,%(toDataNode)s) if pd_temp!=NULL: %(toDataEdge)s=pd_temp[0].v cCs||io|i|ijo+|i|i}|i|=|i|i=ny|i|i|if=Wntj onXdS(s;erase node and edge assignment associated with the iteratorN(sselfsmustMarks queryNodes queryMatchsis dataMatchsfromNodesKeyError(sselfsi((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysunmarkòs c Csï|iƒxÚ|iD]Ï\}}|io ||ijoqnt|dƒ p.|id|d|i d|d|i d|ƒo`|io$|i |i|<||i |i Call the specified function self.fN as iterator (no edge info)ccs4x-|i|i|i|ƒD]}|tfVqWdS(N(sselfsfNsdataNodes dataGraphsisNone(sselfsi((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysgenerate@ssr %(toDataEdge)s=None for %(toDataNode)s in self.gqi[%(level)d].fN(%(fromDataNode)s,dataGraph,self.gqi[%(level)d]):(s__name__s __module__s__doc__sgenerates_generator_code(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysCallableContainerGQI>s  s SubqueryGQIcBs#tZdZhd„Zd„ZRS(sžbase class for running subqueries; produces a union of all subquery solutions. self.subqueries must be list of graph objects, each representing a subqueryc Cshti||||||||ƒg|_ x6|i D]+}|i i |i|i|||ƒƒq5WdS(N(sGraphQueryIterators__init__sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDicts graphQueriess subqueriessqgsappendsgqClass( sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDictsqg((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys__init__Js   ccsGx@|iD]5}x"|D]}|i|itfVqW|iƒq WdS(s:Generate union of all solutions returned by all subqueriesN(sselfs graphQueriessgqsds queryMatchs queryNodesNonescleanup(sselfsdsgq((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysclosureRs (s__name__s __module__s__doc__s__init__sclosure(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys SubqueryGQIGs  c CsÀ|tj o|tj o|||tj oG|||} x<| D]*} y|| }WqDtj oqDXqDWnh} y| d}Wntj onX|||||||| ƒSdS(s—figure out a default GQI class to use, based on an attribute dictionary, then return a new object of that class initialized with the input data.s __class__N( sfromNodesNonestoNodes queryGraphskwargssattrsgqiDictsoclasssKeyErrors dataGraphs dataMatchs queryMatch( sselfsoclasssfromNodestoNodes dataGraphs queryGraphs dataMatchs queryMatchsgqiDictsattrskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysnewGQI\s/ s GraphQuerycBswtZdZhde<de<de<de<de~ƒSn|d9jp |d:jo |iSn|d;jo |iSnyt|i|i|ƒSWn#tj ot d<|ƒ‚nXd=S(>sGreturn appropropriate code for accessing nodes / edges in data or querysnsnames dataGraphsself.gqi[%d].dataGraphsfiltersself.gqi[%d].filters toQueryNodesself.gqi[%d].queryNodes fromQueryNodesself.gqi[%d].fromNodeistoisfromiøÿÿÿsDataNodes dataNode%disDataEdges dataEdge%diÿÿÿÿsDataDictscDict%diùÿÿÿsDataPtrs pDictEntry%diõÿÿÿs DataPtrConts pGraphEntry%ds DataCountersi%dstoDataNodeUnmatchedsdataNode%d!=dataNode%ds and sTrues dataNodeDefss,s dataEdgeDefss dataDictDefss*cDict%ds dataPtrDefss *pDictEntry%dsdataPtrContDefss*pGraphEntry%dsdataCounterDefssdataCounterArgssint i%ds itaVectorsita.vector[%d]sitaTuples,\ s p_ita[%d]s resultTuplesdataNode%d,dataEdge%ds resultTupless(dataNode%d,dataEdge%d)slevelsnEdgess lastGenerators"%s not a valid GraphQueryPyrex keyN(skeysselfsnsnamesgqis queryGraphsfromNodes queryNodes queryEdgesdgs TypeErrorsKeyErrorsqueryLayerGraphslayersvaluessappends_[1]srangesislslensjoins lastGeneratorsgetattrsAttributeError(sselfskeyslayersisdgsls_[1]s queryEdge((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys __getitem__àsŠ     5      s ? ? ? ? ? ? ? ? C ` `   s½ cimport cdict cdef c_%(name)s(cdict.CGraphDict cgd,cdict.IntTupleArray ita,%(dataCounterArgs)s): cdef cdict.CGraph *dataGraph cdef cdict.CDict %(dataDictDefs)s cdef cdict.CDictEntry %(dataPtrDefs)s cdef cdict.CDictEntry *pd_temp cdef cdict.CGraphEntry %(dataPtrContDefs)s cdef cdict.CGraphEntry *p_temp #cdef int %(dataCounterDefs)s cdef int %(dataNodeDefs)s cdef int %(dataEdgeDefs)s cdef int *p_ita dataGraph=cgd.d p_ita=ita.data s %(itaTuple)s=%(resultTuple)s p_ita=p_ita+2*%(nEdges)d ita.n=ita.n+1 if ita.n>=ita.n_alloc: ita.set_vector((%(dataCounterDefs)s),1) return sÕ ita.isDone=1 # COMPLETED THIS QUERY from pygr import cdict def %(name)s(self,g,int maxhit=1000,cdict.IntTupleArray ita=None,qml=None): if not isinstance(g,cdict.CGraphDict): g=cdict.CGraphDict(g,cdict.KeyIndex()) if ita is None: ita=cdict.IntTupleArray(maxhit,%(nEdges)d,2,%(lastGenerator)d) ita.n=0 c_%(name)s(g,ita,%(itaVector)s) # RUN THE QUERY if qml is not None: qml.matches=ita return qml else: return cdict.QueryMatchList(self,ita,g,%(name)s) c CsAdk}y|id} Wn%tj otddfƒ‚nX|i| d|iƒ otdd| fƒ‚n|id| | | fƒ}|djot|d fƒ‚n|i t t |ƒƒ}t|d d ƒ} | it |ƒƒ| iƒ|id |ƒ}|djot|d fƒ‚ndkl} l}||dd|dgƒ}| d|ddd|gddgƒtƒ}dk}dk}dkl}|i|ii|iƒg7_dk}|i ||gƒ\}} } |i#||| | ƒ|_$t%|i$|i ƒ|i&|i <|iƒdS(s3compile using Pyrex, Distutils, and finally import!NsPYGRPATHis‘pyrex compilation requires access to pygr source. Please set the environment variable PYGRPATH to the top of the pygr source package.s/pygr/cgraph.cseUnable to access %s/pygr/cgraph.c. Is PYGRPATH set to the top of the pygr source package?s8cp %s/pygr/cgraph.c %s/pygr/cgraph.h %s/pygr/cdict.pxd .is-unable to copy source code to this directory.s.pyxsws pyrexc %s.pyxs@pyrex compilation failed. Is pyrex missing or not in your PATH?(ssetups Extensionssourcesscgraph.cs.csnames descriptions autogenerated by pygr.graphquerys ext_moduless script_argssbuild(scdict('sossenvironspygrpathsKeyErrorsOSErrorsaccesssR_OKssystems exit_statussselfsnamesstrsids modulenamesfilesmyfileswritesclosesdistutils.coressetups Extensionsmodule1sfind_distutils_libs modulepathssyssos.pathspygrscdictspathsdirnames__file__simps find_modules modulefilesdescs load_modules_modulesgetattrs _compiled(sselfs modulenames exit_statuss modulefiles modulepathsmodule1simps Extensionssysspathsdescspygrpathssetupsmyfilesosscdict((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pyscompileXs@        ! ( s__name__s __module__s__doc__s_langs __getitem__s _def_codes _yield_codes _end_codescompile(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysGraphQueryPyrexÜs  N sGraphQueryIteratorcBsžtZdZhd„Zd„Zd„Zd„Zd„ZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZd„Zd„ZRS(sœiterator for a single node in graph query. Subclasses provide different flavors of generator methods: graph w/ edges; container; attr; function etc.c Csp||_||_||_||_||_||_t|_x*|i ƒD]\}} t ||| ƒqLWdS(N(sfromNodesselfs queryNodes dataGraphs queryGraphs dataMatchs queryMatchsNonesdataNodesattrDictsitemssattrsvalssetattr( sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDictsattrsval((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys__init__‰s        cCs•t|_|itjo|i|i|_n|i|ijo?t|_|itjo|i ƒ|_ q‘|i ƒ|_ n|i ƒ|_ dS(s#reset the iterator to its beginningN( sTruesselfsmustMarksfromNodesNones queryMatchsdataNodes queryNodesFalsesechositeratorsclosuresgenerate(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysrestart™s  ccs|i|itfVdS(s/Just return what our node is ALREADY matched toN(sselfs queryMatchs queryNodesNone(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysecho§sccsL|i|i}y"|i|i}|||fVWntj onXdS(sJthis node is already matched. Make sure there exists path to it (closure)N(sselfs queryMatchs queryNodes targetNodes dataGraphsdataNodes containersKeyError(sselfs targetNodes container((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysclosure«sccsUy|i|i}Wntj on)Xx$|iƒD]\}}||fVq7WdS(s7generate all neighbors of data node matched to fromNodeN(sselfs dataGraphsdataNodesitsKeyErrorsitemssise(sselfsisesit((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysgenerate³s s“ try: # GENERATOR it%(level)d=%(dataGraph)s[%(fromDataNode)s] except KeyError: continue for %(toDataNode)s,%(toDataEdge)s in it%(level)d.items():s if %(toDataNode)s in dataMatch: continue else: dataMatch[%(toDataNode)s]=%(toQueryNode)s #queryMatch[%(toQueryNode)s]=%(toDataNode)s #queryMatch[%(fromQueryNode)s,%(toQueryNode)s]=%(toDataEdge)s # THIS LINE PREVENTS COMPILER FROM PUSHING EXTRA INDENTATION LAYERs–if self.gqi[%(level)d].filter(toNode=%(toDataNode)s,fromNode=%(fromDataNode)s,edge=%(toDataEdge)s,queryMatch=self.queryMatch,gqi=self.gqi[%(level)d]):sr del dataMatch[%(toDataNode)s] #del queryMatch[%(toQueryNode)s] #del queryMatch[%(fromQueryNode)s,%(toQueryNode)s]s« try: # CLOSURE %(toDataEdge)s=%(dataGraph)s[%(fromDataNode)s][%(toDataNode)s] except KeyError: pass else: #queryMatch[%(fromQueryNode)s,%(toQueryNode)s]=%(toDataEdge)ss2#del queryMatch[%(fromQueryNode)s,%(toQueryNode)s]s. p_temp=cdict.cgraph_getitem(%(dataGraph)s,%(fromDataNode)s) if p_temp!=NULL: %(fromDataDict)s=p_temp[0].v %(toDataPtr)s=%(fromDataDict)s[0].dict while %(toDataCounter)s < %(fromDataDict)s[0].n: %(toDataNode)s=%(toDataPtr)s[%(toDataCounter)s].k %(toDataEdge)s=%(toDataPtr)s[%(toDataCounter)s].v sif %(toDataNodeUnmatched)s:sB# COMPILER NEEDS AT LEAST ONE LINE, EVEN THOUGH NOTHING TO DO HEREs%%(toDataCounter)s=%(toDataCounter)s+1s%(toDataCounter)s=0sÛ p_temp=cdict.cgraph_getitem(%(dataGraph)s,%(fromDataNode)s) if p_temp!=NULL: %(fromDataDict)s=p_temp[0].v pd_temp=cdict.cdict_getitem(%(fromDataDict)s,%(toDataNode)s) if pd_temp!=NULL: %(toDataEdge)s=pd_temp[0].v cCs||io|i|ijo+|i|i}|i|=|i|i=ny|i|i|if=Wntj onXdS(s;erase node and edge assignment associated with the iteratorN(sselfsmustMarks queryNodes queryMatchsis dataMatchsfromNodesKeyError(sselfsi((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysunmarkòs c Csï|iƒxÚ|iD]Ï\}}|io ||ijoqnt|dƒ p.|id|d|i d|d|i d|ƒo`|io$|i |i|<||i |i Call the specified function self.fN as iterator (no edge info)ccs4x-|i|i|i|ƒD]}|tfVqWdS(N(sselfsfNsdataNodes dataGraphsisNone(sselfsi((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysgenerate@ssr %(toDataEdge)s=None for %(toDataNode)s in self.gqi[%(level)d].fN(%(fromDataNode)s,dataGraph,self.gqi[%(level)d]):(s__name__s __module__s__doc__sgenerates_generator_code(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysCallableContainerGQI>s  s SubqueryGQIcBs#tZdZhd„Zd„ZRS(sžbase class for running subqueries; produces a union of all subquery solutions. self.subqueries must be list of graph objects, each representing a subqueryc Cshti||||||||ƒg|_ x6|i D]+}|i i |i|i|||ƒƒq5WdS(N(sGraphQueryIterators__init__sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDicts graphQueriess subqueriessqgsappendsgqClass( sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDictsqg((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys__init__Js   ccsGx@|iD]5}x"|D]}|i|itfVqW|iƒq WdS(s:Generate union of all solutions returned by all subqueriesN(sselfs graphQueriessgqsds queryMatchs queryNodesNonescleanup(sselfsdsgq((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysclosureRs (s__name__s __module__s__doc__s__init__sclosure(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys SubqueryGQIGs  c CsÀ|tj o|tj o|||tj oG|||} x<| D]*} y|| }WqDtj oqDXqDWnh} y| d}Wntj onX|||||||| ƒSdS(s—figure out a default GQI class to use, based on an attribute dictionary, then return a new object of that class initialized with the input data.s __class__N( sfromNodesNonestoNodes queryGraphskwargssattrsgqiDictsoclasssKeyErrors dataGraphs dataMatchs queryMatch( sselfsoclasssfromNodestoNodes dataGraphs queryGraphs dataMatchs queryMatchsgqiDictsattrskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysnewGQI\s/ s GraphQuerycBswtZdZhde<de<de<de<de= (2, 5) def get_logger(name='pygr-log', stream=sys.stdout, formatter=None): """ Returns a logger >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') >>> disable() >>> info('logtest, this message should be visible') >>> disable('DEBUG') >>> debug('logtest, this message SHOULD NOT be visible') >>> info('logtest, this message should be visible') """ logger = logging.getLogger(name) # this is needed in case the process is # forked/multithreaded; loggers exist in a global scope # we don't want each import to duplocate this handler if not logger.handlers: console = logging.StreamHandler(stream) console.setLevel(logging.DEBUG) if PYTHON_25: format = '%(levelname)s %(module)s.%(funcName)s: %(message)s' else: format = '%(levelname)s %(module)s: %(message)s' formatter = formatter or logging.Formatter(format) console.setFormatter(formatter) logger.addHandler(console) logger.setLevel(logging.DEBUG) return logger def disable(level=0): """ Disables logging levels Levels: DEBUG, INFO, WARNING, ERROR >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') """ level = str(level) value = dict(NOTSET=0, DEBUG=10, INFO=20, WARNING=30, ERROR=40)\ .get(level.upper(), 0) logging.disable(value) # populate some loggers by default log = get_logger() debug, info, warn, error = log.debug, log.info, log.warn, log.error def test(verbose=0): "Performs module level testing" import doctest doctest.testmod(verbose=verbose) if __name__ == "__main__": test() PKŒ.;:¨ßEÇ Ç pygr/logger.pyc;ò èu¡Jc@s©dZdkZdkZeiddfjZdeied„Zdd„ZeƒZ e i e i e i e i f\Z Z Z Z dd„Zed jo eƒndS( sé Implements logging functionality Upon import creates a module level log class (log) and the following logging functions: debug, info, warn and error The default formatters will print out the function the log was triggered from. Niispygr-logcCsœti|ƒ}|i ozti|ƒ}|iti ƒt o d}nd}|p ti |ƒ}|i|ƒ|i|ƒ|iti ƒn|SdS(sG Returns a logger >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') >>> disable() >>> info('logtest, this message should be visible') >>> disable('DEBUG') >>> debug('logtest, this message SHOULD NOT be visible') >>> info('logtest, this message should be visible') s2%(levelname)s %(module)s.%(funcName)s: %(message)ss%%(levelname)s %(module)s: %(message)sN(sloggings getLoggersnamesloggershandlerss StreamHandlersstreamsconsolessetLevelsDEBUGs PYTHON_25sformats formatters Formatters setFormatters addHandler(snamesstreams formattersconsolesformatslogger((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pys get_loggers     ic CsVt|ƒ}tddddddddd d ƒi|iƒdƒ}ti|ƒd S( sž Disables logging levels Levels: DEBUG, INFO, WARNING, ERROR >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') sNOTSETisDEBUGi sINFOisWARNINGisERRORi(N(sstrslevelsdictsgetsuppersvaluesloggingsdisable(slevelsvalue((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pysdisable2s 9cCsdk}|id|ƒdS(sPerforms module level testingNsverbose(sdocteststestmodsverbose(sverbosesdoctest((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pystestCs s__main__(s__doc__ssyssloggings version_infos PYTHON_25sstdoutsNones get_loggersdisableslogsdebugsinfoswarnserrorstests__name__( sinfoswarnsloggingslogstestssyss get_loggersdisableserrorsdebugs PYTHON_25((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pys? s  *  PK Œ.;:¨ßEÇ Ç pygr/logger.pyo;ò èu¡Jc@s©dZdkZdkZeiddfjZdeied„Zdd„ZeƒZ e i e i e i e i f\Z Z Z Z dd„Zed jo eƒndS( sé Implements logging functionality Upon import creates a module level log class (log) and the following logging functions: debug, info, warn and error The default formatters will print out the function the log was triggered from. Niispygr-logcCsœti|ƒ}|i ozti|ƒ}|iti ƒt o d}nd}|p ti |ƒ}|i|ƒ|i|ƒ|iti ƒn|SdS(sG Returns a logger >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') >>> disable() >>> info('logtest, this message should be visible') >>> disable('DEBUG') >>> debug('logtest, this message SHOULD NOT be visible') >>> info('logtest, this message should be visible') s2%(levelname)s %(module)s.%(funcName)s: %(message)ss%%(levelname)s %(module)s: %(message)sN(sloggings getLoggersnamesloggershandlerss StreamHandlersstreamsconsolessetLevelsDEBUGs PYTHON_25sformats formatters Formatters setFormatters addHandler(snamesstreams formattersconsolesformatslogger((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pys get_loggers     ic CsVt|ƒ}tddddddddd d ƒi|iƒdƒ}ti|ƒd S( sž Disables logging levels Levels: DEBUG, INFO, WARNING, ERROR >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') sNOTSETisDEBUGi sINFOisWARNINGisERRORi(N(sstrslevelsdictsgetsuppersvaluesloggingsdisable(slevelsvalue((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pysdisable2s 9cCsdk}|id|ƒdS(sPerforms module level testingNsverbose(sdocteststestmodsverbose(sverbosesdoctest((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pystestCs s__main__(s__doc__ssyssloggings version_infos PYTHON_25sstdoutsNones get_loggersdisableslogsdebugsinfoswarnserrorstests__name__( sinfoswarnsloggingslogstestssyss get_loggersdisableserrorsdebugs PYTHON_25((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pys? s  *  PK6j$;¸ªá{{pygr/mapping.py from __future__ import generators from schema import * import classutil def update_graph(self,graph): 'save nodes and edges of graph to self' for node,d in graph.iteritems(): self += node saveDict = self[node] for target,edge in d.iteritems(): saveDict[target] = edge class PathList(list): """Internal representation for storing both nodes and edges as list So filter functions can see both nodes and edges""" def __init__(self,nodes=None,edges=None): if nodes!=None: list.__init__(self,nodes) else: list.__init__(self) if edges!=None: self.edge=list(edges) else: self.edge=[] def append(self,val): list.append(self,val) self.edge.append(val) def extend(self,l): list.extend(self,l) # EXTEND TOP-LEVEL LIST AS USUAL try: # EXTEND OUR EDGE LIST AS WELL self.edge.extend(l.edge) except AttributeError: #IF l HAS NO EDGES, PAD OUR EDGE LIST WITH Nones self.edge.extend(len(l)*[None]) class Edge(list): "Interface to edge information." isDirected=False def __init__(self,graph,nodes,edgeInfo): self.graph=graph if edgeInfo: self.edgeInfo=edgeInfo list.__init__(self,nodes) # SAVE NODES AS TUPLE def __getattr__(self,attr): try: return getattr(self.edgeInfo,attr) except AttributeError: if isinstance(self.edgeInfo,types.DictType): return self.edgeInfo[attr] # TREAT edgeInfo AS ATTRIBUTE DICTIONARY raise AttributeError(attr) # SHOULD WE DEFINE A setattr HERE TOO, TO ALLOW USER TO ADD NEW ATTRIBUTE VALUES?? # setattr IS PAINFUL TO IMPLEMENT, BECAUSE OF THE RECURSIVE REFERENCE PROBLEM def __cmp__(self,other): # DO WE NEED TO COMPARE EDGE INFO?? if not isinstance(other,Edge): # CAN ONLY COMPARE A PAIR OF EDGES return -1 diff=cmp(self.graph,other.graph) if diff: # NOT IN THE SAME GRAPH... return diff elif self.isDirected: # IF DIRECTED, JUST COMPARE IN CURRENT ORDER return tuple.__cmp__(self,other) else: # UNDIRECTED COMPARISON REQUIRES PUTTING BOTH IN SAME ORDER me=[i for i in self] you=[i for i in other] me.sort() you.sort() return cmp(me,you) # NEEDS SCHEMA SUPPORT: RETURN A SINGLE SCHEMA TUPLE DESCRIBING THIS EDGE. class DirectedEdge(Edge): isDirected=True # need a class to provide access to the edges in a graph # iterator, membership test #class EdgeSet class dictEdge(dict): """2nd layer graph interface implemenation using dict. """ dictClass=dict def __init__(self,graph,fromNode): self.graph=graph self.fromNode=fromNode self.dictClass.__init__(self) # INITIALIZE TOPLEVEL DICTIONARY def __iadd__(self,target): "Add edge from fromNode to target with no edge-info" self[target]=None return self # THIS IS REQUIRED FROM iadd()!! def __setitem__(self,target,edgeInfo): "Add edge from fromNode to target with edgeInfo" self.dictClass.__setitem__(self,target,edgeInfo) if target not in self.graph: # ADD NEW NODE TO THE NODE DICT self.graph+=target _setitem_=dict.__setitem__ # INTERNAL INTERFACE FOR SAVING AN ENTRY def __delitem__(self,target): "Delete edge from fromNode to target" try: self.dictClass.__delitem__(self,target) except KeyError: # GENERATE A MORE INFORMATIVE ERROR MESSAGE raise KeyError('No edge from node to target') def __isub__(self,target): "Delete edge from fromNode to target" self.__delitem__(target) return self # THIS IS REQUIRED FROM iadd()!! def edges(self): "Return iterator for accessing edges from fromNode" for target,edgeInfo in self.items(): if isinstance(edgeInfo,Edge): yield edgeInfo else: yield Edge(self.graph,(self.fromNode,target,edgeInfo),edgeInfo) class dictGraph(dict): """Top layer graph interface implemenation using dict. """ dictClass=dict edgeDictClass=dictEdge def __init__(self,schema=None,domain=None,range=None): if schema and domain and range: if domain not in schema: schema += domain #ADD DOMAIN AS NODE TO schema GRAPH schema[domain][range]=self self.dictClass.__init__(self) # INITIALIZE TOPLEVEL DICTIONARY def __iadd__(self,node,ruleSet=False): "Add node to graph with no edges" if node not in self: self.dictClass.__setitem__(self,node,self.edgeDictClass(self,node)) if ruleSet==False: ruleSet=getschema(node,graph=self) for rule in ruleSet: if isinstance(rule[1],types.StringType): # ATTRIBUTE BINDING! setattr(node,rule[1],self[node]) # BIND DIRECTLY TO ATTRIBUTE return self # THIS IS REQUIRED FROM iadd()!! def __setitem__(self,node,target): "This method exists only to support g[n]+=o. Do not use as g[n]=foo." if self[node]!=target: raise ValueError('Incorrect usage. Add edges using g[n]+=o or g[n][o]=edge.') def __delitem__(self,node): "Delete node from graph." # GRR, WE REALLY NEED TO FIND ALL EDGES THAT GO TO THIS NODE, DELETE THEM TOO try: self.dictClass.__delitem__(self,node) # DO STUFF TO REMOVE IT HERE... except KeyError: raise KeyError('Node not present in mapping.') for rule in getschema(node,graph=self): if isinstance(rule[1],types.StringType): # ATTRIBUTE BINDING! delattr(node,rule[1]) # REMOVE ATTRIBUTE BINDING def __isub__(self,node): "Delete node from graph" self.__delitem__(node) return self # THIS IS REQUIRED FROM isub()!! def __hash__(self): # SO SCHEMA CAN INDEX ON GRAPHS... return id(self) def edges(self): "Return iterator for all edges in this graph" for edgedict in self.values(): for edge in edgedict.edges(): yield edge update = update_graph class dictEdgeFB(dictEdge): "dictEdge subclass that saves both forward and backward edges" def __setitem__(self,target,edgeInfo): "Save edge in both forward and backward dicts." dictEdge.__setitem__(self,target,edgeInfo) # FORWARD EDGE try: d=self.graph._inverse[target] except KeyError: d=self.dictClass() self.graph._inverse[target]=d d[self.fromNode]=edgeInfo # SAVE BACKWARD EDGE def __invert__(self): "Get nodes with edges to this node" return self.graph._inverse[self.fromNode] class dictGraphFB(dictGraph): "Graph that saves both forward and backward edges" def __init__(self,**kwargs): dictGraph.__init__(self,**kwargs) self._inverse=self.dictClass() __invert__ = classutil.standard_invert def __delitem__(self,node): "Delete node from the graph" try: fromNodes=self._inverse[node] # del self._inverse[node] # REMOVE FROM _inverse DICT except KeyError: pass else: # DELETE EDGES TO THIS NODE for i in fromNodes: del self[i][node] dictGraph.__delitem__(self,node) def listUnion(ivals): 'merge all items using union operator' union=None for ival in ivals: try: union+=ival except TypeError: union=ival return union class DictQueue(dict): 'each index entry acts like a queue; setitem PUSHES, and delitem POPS' def __setitem__(self,k,val): try: dict.__getitem__(self,k).append(val) except KeyError: dict.__setitem__(self,k,[val]) def __getitem__(self,k): return dict.__getitem__(self,k)[0] def __delitem__(self,k): l=dict.__getitem__(self,k) del l[0] if len(l)==0: dict.__delitem__(self,k) ################################ PYGR.DATA.SCHEMA - AWARE CLASSES BELOW def close_if_possible(self): 'close storage to ensure any pending data is written' try: do_close = self.d.close except AttributeError: pass else: do_close() class Collection(object): 'flexible storage mapping ID --> OBJECT' def __init__(self,saveDict=None,dictClass=dict,**kwargs): '''saveDict, if not None, is the internal mapping to use as our storage. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if provided, is the class to use for storage of the dict data.''' if saveDict is not None: self.d = saveDict elif 'filename' in kwargs: # USE A SHELVE (BERKELEY DB) try: if kwargs['intKeys']: # ALLOW INT KEYS, HAVE TO USE IntShelve self.__class__ = IntShelve else: raise KeyError except KeyError: self.__class__ = PicklableShelve return self.__init__(**kwargs) else: self.d = dictClass() classutil.apply_itemclass(self,kwargs) def __getitem__(self,k): return self.d[k] def __setitem__(self,k,v): self.d[k] = v def __delitem__(self,k): del self.d[k] def __len__(self): return len(self.d) def __contains__(self,k): return k in self.d def __iter__(self): return iter(self.d) def __getattr__(self,attr): if attr=='__setstate__' or attr=='__dict__': # PREVENT INFINITE RECURSE IN UNPICKLE raise AttributeError try: # PROTECT AGAINST INFINITE RECURSE IF NOT FULLY __init__ED... return getattr(self.__dict__['d'],attr) except KeyError: raise AttributeError('Collection has no subdictionary') close = close_if_possible def __del__(self): 'must ensure that shelve object is closed to save pending data' try: self.close() except classutil.FileAlreadyClosedError: pass class PicklableShelve(Collection): 'persistent storage mapping ID --> OBJECT' def __init__(self,filename,mode=None,writeback=False,unpicklingMode=False, verbose=True,**kwargs): '''Wrapper for a shelve object that can be pickled. Ideally, you should specify a TWO letter mode string: the first letter to indicate what mode the shelve should be initially opened in, and the second to indicate the mode to open the shelve during unpickling. e.g. mode='nr': to create an empty shelve (writable), which in future will be re-opened read-only. Also, mode=None makes it first attempt to open read-only, but if the file does not exist will create it using mode 'c'. ''' self.filename = classutil.SourceFileName(str(filename)) # MARKS THIS STR AS A FILE PATH self.writeback = writeback if unpicklingMode or mode is None or mode=='r': # JUST USE mode AS GIVEN self.mode = mode elif mode=='n' or mode=='c' or mode=='w': # AMBIGUOUS MODES, WARN & SET DEFAULT if verbose: import sys print >>sys.stderr,'''Warning: you opened shelve file %s in mode '%s' but this is ambiguous for how the shelve should be re-opened later during unpickling. By default it will be re-opened in mode 'r' (read-only). To make it be re-opened writable, create it in mode '%sw', or call its method reopen('w'), which will make it be re-opened in mode 'w' now and in later unpickling. To suppress this warning message, use the verbose=False option.''' % (filename,mode,mode) self.mode = 'r' else: # PROCESS UNAMBIGUOUS TWO-LETTER mode STRING try: if len(mode)==2 and mode[0] in 'ncwr' and mode[1] in 'cwr': self.mode = mode[1] # IN FUTURE OPEN IN THIS MODE mode = mode[0] # OPEN NOW IN THIS MODE else: raise ValueError('invalid mode string: '+mode) except TypeError: raise ValueError('file mode must be a string!') if unpicklingMode: self.d = classutil.open_shelve(filename,mode,writeback,allowReadOnly=True) else: self.d = classutil.open_shelve(filename,mode,writeback) classutil.apply_itemclass(self,kwargs) __getstate__ = classutil.standard_getstate ############### PICKLING METHODS __setstate__ = classutil.standard_setstate _pickleAttrs = dict(filename=0,mode=0,writeback=0) def close(self): '''close our shelve index file. ''' self.d.close() def __setitem__(self,k,v): try: self.d[k]=v except TypeError: raise TypeError('to allow int keys, you must pass intKeys=True to constructor!') def reopen(self,mode='r'): 're-open shelve in the specified mode, and save mode on self' self.close() self.d = classutil.open_shelve(self.filename,mode,writeback=self.writeback) self.mode = mode class IntShelve(PicklableShelve): 'provides an interface to shelve that can use int as key' def saveKey(self,i): 'convert to string key' if isinstance(i,int): return 'int:%s'%i elif isinstance(i,str): return i try: return 'int:%s'%int(i) except TypeError: pass raise KeyError('IntShelve can only save int or str as key') def trueKey(self,k): "convert back to key's original format" if k.startswith('int:'): return int(k[4:]) else: return k def __getitem__(self,k): return self.d[self.saveKey(k)] def __setitem__(self,k,v): self.d[self.saveKey(k)]=v def __delitem__(self,k): del self.d[self.saveKey(k)] def __contains__(self,k): return self.saveKey(k) in self.d def __iter__(self): ################ STANDARD ITERATOR METHODS for k in self.d: yield self.trueKey(k) def keys(self): return [k for k in self] def iteritems(self): for k,v in self.d.iteritems(): yield self.trueKey(k),v def items(self): return [k for k in self.iteritems()] ## PACKING / UNPACKING METHODS FOR SEPARATING INTERNAL VS. EXTERNAL ## REPRESENTATIONS OF GRAPH NODES AND EDGES ## 1. ID-BASED PACKING: USE obj.id AS INTERNAL REPRESENTATION ## ## 2. TRIVIAL: INTERNAL AND EXTERNAL REPRESENTATIONS IDENTICAL ## WORKS WELL FOR STRING OR INT NODES / EDGES. ## ## 3. PICKLE PACKING: USE PICKLE AS INTERNAL REPRESENTATION def pack_id(self,obj): 'extract id attribute from obj' try: return obj.id except AttributeError: if obj is None: return None raise def unpack_source(self,objID): return self.sourceDB[objID] def unpack_target(self,objID): return self.targetDB[objID] def unpack_edge(self,objID): try: return self.edgeDB[objID] except KeyError: if objID is None: return None raise def add_standard_packing_methods(localDict): localDict['pack_source'] = pack_id localDict['pack_target'] = pack_id localDict['pack_edge'] = pack_id localDict['unpack_source'] = unpack_source localDict['unpack_target'] = unpack_target localDict['unpack_edge'] = unpack_edge def add_trivial_packing_methods(localDict): for name in ('pack_source','pack_target','pack_edge', 'unpack_source','unpack_target','unpack_edge'): localDict[name] = lambda self,obj:obj def pack_pickle(self,obj): 'get pickle string for obj' import pickle return pickle.dumps(obj) def unpack_pickle(self,s): 'unpickle string to get obj' import pickle return pickle.loads(s) class MappingInverse(object): def __init__(self,db): self._inverse=db self.attr=db.inverseAttr def __getitem__(self,k): return self._inverse.sourceDB[getattr(k,self.attr)] __invert__ = classutil.standard_invert class Mapping(object): '''dict-like class suitable for persistent usages. Extracts ID values from keys and values passed to it, and saves IDs into its internal dictionary instead of the actual objects. Thus, the external interface is objects, but the internal storage is ID values.''' def __init__(self,sourceDB,targetDB,saveDict=None,IDAttr='id',targetIDAttr='id', itemAttr=None,multiValue=False,inverseAttr=None,**kwargs): '''sourceDB: dictionary that maps key ID values to key objects targetDB: dictionary that maps value IDs to value objects saveDict, if not None, is the internal mapping to use as our storage IDAttr: attribute name to obtain an ID from a key object targetIDAttr: attribute name to obtain an ID from a value object itemAttr, if not None, the attribute to obtain target (value) ID from an internal storage value multiValue: if True, treat each value as a list of values. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if not None, is the class to use for storage of the dict data''' if saveDict is None: self.d=classutil.get_shelve_or_dict(**kwargs) else: self.d=saveDict self.IDAttr=IDAttr self.targetIDAttr=targetIDAttr self.itemAttr=itemAttr self.multiValue=multiValue self.sourceDB=sourceDB self.targetDB=targetDB if inverseAttr is not None: self.inverseAttr=inverseAttr def __getitem__(self,k): kID=getattr(k,self.IDAttr) return self.getTarget(self.d[kID]) def getTarget(self,vID): if self.itemAttr is not None: vID=getattr(vID,self.itemAttr) if self.multiValue: return [self.targetDB[j] for j in vID] else: return self.targetDB[vID] def __setitem__(self,k,v): if self.multiValue: v=[getattr(x,self.targetIDAttr) for x in v] else: v=getattr(v,self.targetIDAttr) self.d[getattr(k,self.IDAttr)]=v def __delitem__(self,k): del self.d[getattr(k,self.IDAttr)] def __contains__(self,k): return getattr(k,self.IDAttr) in self.d def __len__(self): return len(self.d) def clear(self): self.d.clear() def copy(self): return Mapping(self.sourceDB,self.targetDB,self.d.copy(),self.IDAttr, self.targetIDAttr,self.itemAttr,self.multiValue) def update(self,b): for k,v in b.iteritems(): self[k]=v def get(self,k,v=None): try: return self[k] except KeyError: return v def setdefault(self,k,v=None): try: return self[k] except KeyError: self[k]=v return v def pop(self,k,v=None): try: v=self[k] except KeyError: return v del self[k] return v def popitem(self): kID,vID=self.d.popitem() return kID,self.getTarget(vID) def __iter__(self): ######################## ITERATORS for kID in self.d: yield self.sourceDB[kID] def keys(self): return [k for k in self] def itervalues(self): for vID in self.d.itervalues(): yield self.getTarget(vID) def values(self): return [v for v in self] def iteritems(self): for kID,vID in self.d.iteritems(): yield self.sourceDB[kID],self.getTarget(vID) def items(self): return [x for x in self.iteritems()] __invert__ = classutil.standard_invert _inverseClass = MappingInverse close = close_if_possible def __del__(self): close_if_possible(self) def graph_cmp(self,other): 'compare two graph dictionaries' import sys diff = cmp(len(self),len(other)) if diff!=0: print >>sys.stderr,'len diff:',len(self),len(other) return diff for node,d in self.iteritems(): try: d2 = other[node] except KeyError: print >>sys.stderr,'other missing key' return 1 diff = cmp(d,d2) if diff!=0: print >>sys.stderr,'value diff',d,d2 return diff return 0 class IDNodeDict(object): """2nd layer graph interface implementation using proxy dict. e.g. shelve.""" dictClass=dict def __init__(self,graph,fromNode): self.graph=graph self.fromNode=fromNode def __getitem__(self,target): ############# ACCESS METHODS edgeID=self.graph.d[self.fromNode][self.graph.pack_target(target)] return self.graph.unpack_edge(edgeID) def __setitem__(self,target,edgeInfo): "Add edge from fromNode to target with edgeInfo" self.graph.d[self.fromNode][self.graph.pack_target(target)] \ = self.graph.pack_edge(edgeInfo) if not hasattr(self.graph,'sourceDB') or \ (hasattr(self.graph,'targetDB') and self.graph.sourceDB==self.graph.targetDB): self.graph+=target # ADD NEW NODE TO THE NODE DICT def __delitem__(self,target): "Delete edge from fromNode to target" try: del self.graph.d[self.fromNode][self.graph.pack_target(target)] except KeyError: # GENERATE A MORE INFORMATIVE ERROR MESSAGE raise KeyError('No edge from node to target') ######### CONVENIENCE METHODS THAT USE THE ACCESS METHODS ABOVE def __iadd__(self,target): "Add edge from fromNode to target with no edge-info" self[target]=None return self # THIS IS REQUIRED FROM iadd()!! def __isub__(self,target): "Delete edge from fromNode to target" self.__delitem__(target) return self # THIS IS REQUIRED FROM iadd()!! def edges(self): "Return iterator for accessing edges from fromNode" for target,edgeInfo in self.graph.d[self.fromNode].items(): yield (self.graph.unpack_source(self.fromNode), self.graph.unpack_target(target), self.graph.unpack_edge(edgeInfo)) def __len__(self): return len(self.graph.d[self.fromNode]) def keys(self): return [k[1] for k in self.edges()] ##### ITERATORS def values(self): return [k[2] for k in self.edges()] def items(self): return [k[1:3] for k in self.edges()] def __iter__(self): for source,target,edgeInfo in self.edges(): yield target def itervalues(self): for source,target,edgeInfo in self.edges(): yield edgeInfo def iteritems(self): for source,target,edgeInfo in self.edges(): yield target,edgeInfo __cmp__ = graph_cmp class IDNodeDictWriteback(IDNodeDict): 'forces writing of subdictionary in shelve opened without writeback=True' def __setitem__(self,target,edgeInfo): d = self.graph.d[self.fromNode] d[self.graph.pack_target(target)] = self.graph.pack_edge(edgeInfo) self.graph.d[self.fromNode] = d # WRITE IT BACK... REQUIRED FOR SHELVE self.graph += target # ADD NEW NODE TO THE NODE DICT def __delitem__(self,target): d = self.graph.d[self.fromNode] del d[self.graph.pack_target(target)] self.graph.d[self.fromNode] = d # WRITE IT BACK... REQUIRED FOR SHELVE class IDNodeDictWriteNow(IDNodeDictWriteback): 'opens shelve for writing, writes an item, immediately reopens' def __setitem__(self,target,edgeInfo): self.graph.d.reopen('w') IDNodeDictWriteback.__setitem__(self,target,edgeInfo) self.graph.d.reopen('w') def __delitem__(self,target): self.graph.d.reopen('w') IDNodeDictWriteback.__delitem__(self,target) self.graph.d.reopen('w') class IDGraphEdges(object): '''provides iterator over edges as (source,target,edge) tuples and getitem[edge] --> [(source,target),...]''' def __init__(self,g): self.g=g def __iter__(self): for d in self.g.itervalues(): for edge in d.edges(): yield edge def __getitem__(self,edge): l=[] for sourceID,targetID in self.d[edge.id]: l.append((self.g.sourceDB[sourceID],self.g.targetDB[targetID])) return l def __call__(self): return self class IDGraphEdgeDescriptor(object): 'provides interface to edges on demand' def __get__(self,obj,objtype): return IDGraphEdges(obj) def save_graph_db_refs(self,sourceDB=None,targetDB=None,edgeDB=None, simpleKeys=False,unpack_edge=None, edgeDictClass=None,graph=None,**kwargs): 'apply kwargs to reference DB objects for this graph' if sourceDB is not None: self.sourceDB=sourceDB else: simpleKeys = True # NO SOURCE DB, SO STORE KEYS AS INTERNAL REPRESENTATION if targetDB is not None: self.targetDB=targetDB if edgeDB is not None: self.edgeDB=edgeDB else: # just save the edge object as itself (not its ID) self.pack_edge = self.unpack_edge = lambda edge:edge if simpleKeys: # SWITCH TO USING TRIVIAL PACKING: OBJECT IS ITS OWN ID self.__class__ = self._IDGraphClass if unpack_edge is not None: self.unpack_edge = unpack_edge # UNPACKING METHOD OVERRIDES DEFAULT if graph is not None: self.graph = graph if edgeDictClass is not None: self.edgeDictClass = edgeDictClass def graph_db_inverse_refs(self,edgeIndex=False): 'return kwargs for inverse of this graph, or edge index of this graph' if edgeIndex: # TO CONSTRUCT AN EDGE INDEX db = ('edgeDB','sourceDB','targetDB') else: # DEFAULT: TO CONSTRUCT AN INVERSE MAPPING OF THE GRAPH db = ('targetDB','sourceDB','edgeDB') try: d = dict(sourceDB=getattr(self,db[0]),targetDB=getattr(self,db[1])) try: d['edgeDB'] = getattr(self,db[2]) # EDGE INFO IS OPTIONAL except AttributeError: pass except AttributeError: d = dict(simpleKeys=True) # NO SOURCE / TARGET DB, SO USE IDs AS KEYS try: # COPY THE LOCAL UNPACKING METHOD, IF ANY if not edgeIndex: d['unpack_edge'] = self.__dict__['unpack_edge'] except KeyError: pass return d def graph_setitem(self,node,target): "This method exists only to support g[n]+=o. Do not use as g[n]=foo." node=self.pack_source(node) try: if node==target.fromNode: return except AttributeError: pass raise ValueError('Incorrect usage. Add edges using g[n]+=o or g[n][o]=edge.') class Graph(object): """Top layer graph interface implemenation using proxy dict. Works with dict, shelve, any mapping interface.""" edgeDictClass=IDNodeDict # DEFAULT EDGE DICT def __init__(self,saveDict=None,dictClass=dict,writeNow=False,**kwargs): if saveDict is not None: # USE THE SUPPLIED STORAGE self.d = saveDict elif 'filename' in kwargs: # USE A SHELVE (BERKELEY DB) try: if kwargs['intKeys']: # ALLOW INT KEYS, HAVE TO USE IntShelve self.d = IntShelve(writeback=False,**kwargs) else: raise KeyError except KeyError: self.d = PicklableShelve(writeback=False,**kwargs) if writeNow: self.edgeDictClass = IDNodeDictWriteNow # WRITE IMMEDIATELY else: self.edgeDictClass = IDNodeDictWriteback # USE OUR OWN WRITEBACK else: self.d = dictClass() save_graph_db_refs(self,**kwargs) __getstate__ = classutil.standard_getstate ############### PICKLING METHODS __setstate__ = classutil.standard_setstate _pickleAttrs = dict(d='saveDict',sourceDB=0,targetDB=0,edgeDB=0, edgeDictClass=0) add_standard_packing_methods(locals()) ############ PACK / UNPACK METHODS def close(self): '''If possible, close our dict. ''' try: do_close = self.d.close except AttributeError: pass else: do_close() def __len__(self): return len(self.d) def __iter__(self): for node in self.d: yield self.unpack_source(node) def keys(self): return [k for k in self] def itervalues(self): for node in self.d: yield self.edgeDictClass(self,node) def values(self): return [v for v in self.itervalues()] def iteritems(self): for node in self.d: yield self.unpack_source(node),self.edgeDictClass(self,node) def items(self): return [v for v in self.iteritems()] edges=IDGraphEdgeDescriptor() def __iadd__(self,node): "Add node to graph with no edges" node=self.pack_source(node) if node not in self.d: self.d[node]={} # INITIALIZE TOPLEVEL DICTIONARY return self # THIS IS REQUIRED FROM iadd()!! def __contains__(self,node): return self.pack_source(node) in self.d def __getitem__(self,node): if node in self: return self.edgeDictClass(self,self.pack_source(node)) raise KeyError('node not in graph') __setitem__ = graph_setitem def __delitem__(self,node): "Delete node from graph." node=self.pack_source(node) # GRR, WE REALLY NEED TO FIND ALL EDGES THAT GO TO THIS NODE, DELETE THEM TOO try: del self.d[node] # DO STUFF TO REMOVE IT HERE... except KeyError: raise KeyError('Node not present in mapping.') def __isub__(self,node): "Delete node from graph" self.__delitem__(node) return self # THIS IS REQUIRED FROM isub()!! update = update_graph __cmp__ = graph_cmp def __del__(self): try: self.close() except classutil.FileAlreadyClosedError: pass # NEED TO PROVIDE A REAL INVERT METHOD!! ## def __invert__(self): ## 'get an interface to the inverse graph mapping' ## try: # CACHED ## return self._inverse ## except AttributeError: # NEED TO CONSTRUCT INVERSE MAPPING ## self._inverse=IDGraph(~(self.d),self.targetDB,self.sourceDB,self.edgeDB) ## self._inverse._inverse=self ## return self._inverse def __hash__(self): # SO SCHEMA CAN INDEX ON GRAPHS... return id(self) class IDGraph(Graph): add_trivial_packing_methods(locals()) Graph._IDGraphClass = IDGraph class KeepUniqueDict(dict): 'dict that blocks attempts to overwrite an existing key' def __setitem__(self,k,v): try: if self[k] is v: return # ALREADY SAVED. NOTHING TO DO! except KeyError: # NOT PRESENT, SO JUST SAVE THE VALUE dict.__setitem__(self,k,v) return raise KeyError('attempt to overwrite existing key!') def __hash__(self): 'ALLOW THIS OBJECT TO BE USED AS A KEY IN DICTS...' return id(self) PKŒ.;ñmÜ ˆÖˆÖpygr/mapping.pyc;ò èu¡Jc@s—dklZdkTdkZd„Zdefd„ƒYZdefd„ƒYZdefd „ƒYZd e fd „ƒYZ d e fd „ƒYZ de fd„ƒYZ de fd„ƒYZ d„Zde fd„ƒYZd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZd„Zd„Zd„Zd„Zd „Zd!„Zd"„Zd#„Zd$efd%„ƒYZd&efd'„ƒYZd(„Zd)efd*„ƒYZ d+e fd,„ƒYZ!d-e!fd.„ƒYZ"d/efd0„ƒYZ#d1efd2„ƒYZ$e%e%e%e&e%e%e%d3„Z'e&d4„Z(d5„Z)d6efd7„ƒYZ*d8e*fd9„ƒYZ+e+e*_,d:e fd;„ƒYZ-dS(<(s generators(s*NcCs\xU|iƒD]G\}}||7}||}x$|iƒD]\}}||| OBJECTcKs™|tj o ||_nld|joRy"|do t|_nt‚Wntj ot|_nX|i |Sn |ƒ|_t i ||ƒdS(ssaveDict, if not None, is the internal mapping to use as our storage. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if provided, is the class to use for storage of the dict data.sfilenamesintKeysN( ssaveDictsNonesselfsdskwargss IntShelves __class__sKeyErrorsPicklableShelves__init__s dictClasss classutilsapply_itemclass(sselfssaveDicts dictClassskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__s       cCs|i|SdS(N(sselfsdsk(sselfsk((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__&scCs||i| OBJECTcKsŒtit|ƒƒ|_||_|p|tjp |djo ||_né|djp|djp |djo;|o'dk }|i d|||fIJnd|_n‡ydt |ƒdjo|dd jo|d d jo|d |_|d}nt d |ƒ‚Wntj ot d ƒ‚nX|o"ti|||dtƒ|_nti|||ƒ|_ti||ƒdS(sÞWrapper for a shelve object that can be pickled. Ideally, you should specify a TWO letter mode string: the first letter to indicate what mode the shelve should be initially opened in, and the second to indicate the mode to open the shelve during unpickling. e.g. mode='nr': to create an empty shelve (writable), which in future will be re-opened read-only. Also, mode=None makes it first attempt to open read-only, but if the file does not exist will create it using mode 'c'. srsnscswNs¥Warning: you opened shelve file %s in mode '%s' but this is ambiguous for how the shelve should be re-opened later during unpickling. By default it will be re-opened in mode 'r' (read-only). To make it be re-opened writable, create it in mode '%sw', or call its method reopen('w'), which will make it be re-opened in mode 'w' now and in later unpickling. To suppress this warning message, use the verbose=False option.iisncwriscwrsinvalid mode string: sfile mode must be a string!s allowReadOnly(s classutilsSourceFileNamesstrsfilenamesselfs writebacksunpicklingModesmodesNonesverbosessyssstderrslens ValueErrors TypeErrors open_shelvesTruesdsapply_itemclassskwargs(sselfsfilenamesmodes writebacksunpicklingModesverboseskwargsssys((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__=s*  ! '  5 "sfilenameismodes writebackcCs|iiƒdS(sclose our shelve index file. N(sselfsdsclose(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysclosehscCs7y||i|Äs(snames localDict(s localDictsname((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysadd_trivial_packing_methodsÁscCsdk}|i|ƒSdS(sget pickle string for objN(spicklesdumpssobj(sselfsobjspickle((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys pack_pickleÇs cCsdk}|i|ƒSdS(sunpickle string to get objN(spicklesloadsss(sselfssspickle((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys unpack_pickleÌs sMappingInversecBs#tZd„Zd„ZeiZRS(NcCs||_|i|_dS(N(sdbsselfs_inverses inverseAttrsattr(sselfsdb((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__Ós cCs|iit||iƒSdS(N(sselfs_inversessourceDBsgetattrsksattr(sselfsk((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__Ös(s__name__s __module__s__init__s __getitem__s classutilsstandard_inverts __invert__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysMappingInverseÒs  sMappingcBsûtZdZeddeeed„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zed „Zed „Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZeiZeZeZd„Z RS(s dict-like class suitable for persistent usages. Extracts ID values from keys and values passed to it, and saves IDs into its internal dictionary instead of the actual objects. Thus, the external interface is objects, but the internal storage is ID values.sidc Ks€|tjoti| |_n ||_||_||_||_ ||_ ||_ ||_ |tj o ||_ ndS(sËsourceDB: dictionary that maps key ID values to key objects targetDB: dictionary that maps value IDs to value objects saveDict, if not None, is the internal mapping to use as our storage IDAttr: attribute name to obtain an ID from a key object targetIDAttr: attribute name to obtain an ID from a value object itemAttr, if not None, the attribute to obtain target (value) ID from an internal storage value multiValue: if True, treat each value as a list of values. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if not None, is the class to use for storage of the dict dataN(ssaveDictsNones classutilsget_shelve_or_dictskwargssselfsdsIDAttrs targetIDAttrsitemAttrs multiValuessourceDBstargetDBs inverseAttr( sselfssourceDBstargetDBssaveDictsIDAttrs targetIDAttrsitemAttrs multiValues inverseAttrskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__ßs          cCs*t||iƒ}|i|i|ƒSdS(N(sgetattrsksselfsIDAttrskIDs getTargetsd(sselfskskID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__øscCso|itj ot||iƒ}n|io0gi}|D]}||i |ƒq>~Sn |i |SdS(N( sselfsitemAttrsNonesgetattrsvIDs multiValuesappends_[1]sjstargetDB(sselfsvIDsjs_[1]((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys getTargetûs  0cCsp|io7gi}|D]}|t||iƒƒq~}nt||iƒ}||it||i ƒx7|iiƒD]&\}}|i||i|ƒfVqWdS(N(sselfsds iteritemsskIDsvIDssourceDBs getTarget(sselfsvIDskID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys iteritems1s cCs/gi}|iƒD]}||ƒq~SdS(N(sappends_[1]sselfs iteritemssx(sselfs_[1]sx((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysitems4scCst|ƒdS(N(sclose_if_possiblesself(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__del__8s(!s__name__s __module__s__doc__sNonesFalses__init__s __getitem__s getTargets __setitem__s __delitem__s __contains__s__len__sclearscopysupdatesgets setdefaultspopspopitems__iter__skeyss itervaluessvaluess iteritemssitemss classutilsstandard_inverts __invert__sMappingInverses _inverseClasssclose_if_possiblescloses__del__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysMappingÚs2                     cCsõdk}tt|ƒt|ƒƒ}|djo-|idIt|ƒIt|ƒIJ|SnxŒ|iƒD]~\}}y||}Wn$t j o|idIJdSnXt||ƒ}|djo!|idI|I|IJ|SqkqkWdSdS(scompare two graph dictionariesNis len diff:sother missing keyis value diff( ssysscmpslensselfsothersdiffsstderrs iteritemssnodesdsd2sKeyError(sselfsothersnodesdssyssdiffsd2((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys graph_cmp<s$  %     s IDNodeDictcBs˜tZdZeZd„Zd„Zd„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„ZeZRS(sN2nd layer graph interface implementation using proxy dict. e.g. shelve.cCs||_||_dS(N(sgraphsselfsfromNode(sselfsgraphsfromNode((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__Us cCs7|ii|i|ii|ƒ}|ii|ƒSdS(N(sselfsgraphsdsfromNodes pack_targetstargetsedgeIDs unpack_edge(sselfstargetsedgeID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__Ys#cCs†|ii|ƒ|ii|i|ii|ƒ [(source,target),...]cCs ||_dS(N(sgsself(sselfsg((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__§sccs9x2|iiƒD]!}x|iƒD] }|Vq#WqWdS(N(sselfsgs itervaluessdsedgessedge(sselfsedgesd((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__iter__©s  cCsVg}xE|i|iD]3\}}|i|ii ||ii |fƒqW|SdS(N( slsselfsdsedgesidssourceIDstargetIDsappendsgssourceDBstargetDB(sselfsedgessourceIDstargetIDsl((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__­s  +cCs|SdS(N(sself(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__call__²s(s__name__s __module__s__doc__s__init__s__iter__s __getitem__s__call__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys IDGraphEdges¤s    sIDGraphEdgeDescriptorcBstZdZd„ZRS(s%provides interface to edges on demandcCst|ƒSdS(N(s IDGraphEdgessobj(sselfsobjsobjtype((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__get__·s(s__name__s __module__s__doc__s__get__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysIDGraphEdgeDescriptorµs c KsÐ|tj o ||_nt}|tj o ||_n|tj o ||_nd„|_|_|o|i |_ n|tj o ||_n|tj o ||_ n|tj o ||_ ndS(s3apply kwargs to reference DB objects for this graphcCs|S(N(sedge(sedge((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysÈsN( ssourceDBsNonesselfsTrues simpleKeysstargetDBsedgeDBs pack_edges unpack_edges _IDGraphClasss __class__sgraphs edgeDictClass( sselfssourceDBstargetDBsedgeDBs simpleKeyss unpack_edges edgeDictClasssgraphskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pyssave_graph_db_refs»s"           cCsñ|odddf}ndddf}ydtdt||dƒdt||dƒƒ}yt||dƒ|d OBJECTcKs™|tj o ||_nld|joRy"|do t|_nt‚Wntj ot|_nX|i |Sn |ƒ|_t i ||ƒdS(ssaveDict, if not None, is the internal mapping to use as our storage. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if provided, is the class to use for storage of the dict data.sfilenamesintKeysN( ssaveDictsNonesselfsdskwargss IntShelves __class__sKeyErrorsPicklableShelves__init__s dictClasss classutilsapply_itemclass(sselfssaveDicts dictClassskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__s       cCs|i|SdS(N(sselfsdsk(sselfsk((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__&scCs||i| OBJECTcKsŒtit|ƒƒ|_||_|p|tjp |djo ||_né|djp|djp |djo;|o'dk }|i d|||fIJnd|_n‡ydt |ƒdjo|dd jo|d d jo|d |_|d}nt d |ƒ‚Wntj ot d ƒ‚nX|o"ti|||dtƒ|_nti|||ƒ|_ti||ƒdS(sÞWrapper for a shelve object that can be pickled. Ideally, you should specify a TWO letter mode string: the first letter to indicate what mode the shelve should be initially opened in, and the second to indicate the mode to open the shelve during unpickling. e.g. mode='nr': to create an empty shelve (writable), which in future will be re-opened read-only. Also, mode=None makes it first attempt to open read-only, but if the file does not exist will create it using mode 'c'. srsnscswNs¥Warning: you opened shelve file %s in mode '%s' but this is ambiguous for how the shelve should be re-opened later during unpickling. By default it will be re-opened in mode 'r' (read-only). To make it be re-opened writable, create it in mode '%sw', or call its method reopen('w'), which will make it be re-opened in mode 'w' now and in later unpickling. To suppress this warning message, use the verbose=False option.iisncwriscwrsinvalid mode string: sfile mode must be a string!s allowReadOnly(s classutilsSourceFileNamesstrsfilenamesselfs writebacksunpicklingModesmodesNonesverbosessyssstderrslens ValueErrors TypeErrors open_shelvesTruesdsapply_itemclassskwargs(sselfsfilenamesmodes writebacksunpicklingModesverboseskwargsssys((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__=s*  ! '  5 "sfilenameismodes writebackcCs|iiƒdS(sclose our shelve index file. N(sselfsdsclose(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysclosehscCs7y||i|Äs(snames localDict(s localDictsname((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysadd_trivial_packing_methodsÁscCsdk}|i|ƒSdS(sget pickle string for objN(spicklesdumpssobj(sselfsobjspickle((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys pack_pickleÇs cCsdk}|i|ƒSdS(sunpickle string to get objN(spicklesloadsss(sselfssspickle((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys unpack_pickleÌs sMappingInversecBs#tZd„Zd„ZeiZRS(NcCs||_|i|_dS(N(sdbsselfs_inverses inverseAttrsattr(sselfsdb((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__Ós cCs|iit||iƒSdS(N(sselfs_inversessourceDBsgetattrsksattr(sselfsk((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__Ös(s__name__s __module__s__init__s __getitem__s classutilsstandard_inverts __invert__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysMappingInverseÒs  sMappingcBsûtZdZeddeeed„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zed „Zed „Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZeiZeZeZd„Z RS(s dict-like class suitable for persistent usages. Extracts ID values from keys and values passed to it, and saves IDs into its internal dictionary instead of the actual objects. Thus, the external interface is objects, but the internal storage is ID values.sidc Ks€|tjoti| |_n ||_||_||_||_ ||_ ||_ ||_ |tj o ||_ ndS(sËsourceDB: dictionary that maps key ID values to key objects targetDB: dictionary that maps value IDs to value objects saveDict, if not None, is the internal mapping to use as our storage IDAttr: attribute name to obtain an ID from a key object targetIDAttr: attribute name to obtain an ID from a value object itemAttr, if not None, the attribute to obtain target (value) ID from an internal storage value multiValue: if True, treat each value as a list of values. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if not None, is the class to use for storage of the dict dataN(ssaveDictsNones classutilsget_shelve_or_dictskwargssselfsdsIDAttrs targetIDAttrsitemAttrs multiValuessourceDBstargetDBs inverseAttr( sselfssourceDBstargetDBssaveDictsIDAttrs targetIDAttrsitemAttrs multiValues inverseAttrskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__ßs          cCs*t||iƒ}|i|i|ƒSdS(N(sgetattrsksselfsIDAttrskIDs getTargetsd(sselfskskID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__øscCso|itj ot||iƒ}n|io0gi}|D]}||i |ƒq>~Sn |i |SdS(N( sselfsitemAttrsNonesgetattrsvIDs multiValuesappends_[1]sjstargetDB(sselfsvIDsjs_[1]((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys getTargetûs  0cCsp|io7gi}|D]}|t||iƒƒq~}nt||iƒ}||it||i ƒx7|iiƒD]&\}}|i||i|ƒfVqWdS(N(sselfsds iteritemsskIDsvIDssourceDBs getTarget(sselfsvIDskID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys iteritems1s cCs/gi}|iƒD]}||ƒq~SdS(N(sappends_[1]sselfs iteritemssx(sselfs_[1]sx((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysitems4scCst|ƒdS(N(sclose_if_possiblesself(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__del__8s(!s__name__s __module__s__doc__sNonesFalses__init__s __getitem__s getTargets __setitem__s __delitem__s __contains__s__len__sclearscopysupdatesgets setdefaultspopspopitems__iter__skeyss itervaluessvaluess iteritemssitemss classutilsstandard_inverts __invert__sMappingInverses _inverseClasssclose_if_possiblescloses__del__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysMappingÚs2                     cCsõdk}tt|ƒt|ƒƒ}|djo-|idIt|ƒIt|ƒIJ|SnxŒ|iƒD]~\}}y||}Wn$t j o|idIJdSnXt||ƒ}|djo!|idI|I|IJ|SqkqkWdSdS(scompare two graph dictionariesNis len diff:sother missing keyis value diff( ssysscmpslensselfsothersdiffsstderrs iteritemssnodesdsd2sKeyError(sselfsothersnodesdssyssdiffsd2((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys graph_cmp<s$  %     s IDNodeDictcBs˜tZdZeZd„Zd„Zd„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„ZeZRS(sN2nd layer graph interface implementation using proxy dict. e.g. shelve.cCs||_||_dS(N(sgraphsselfsfromNode(sselfsgraphsfromNode((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__Us cCs7|ii|i|ii|ƒ}|ii|ƒSdS(N(sselfsgraphsdsfromNodes pack_targetstargetsedgeIDs unpack_edge(sselfstargetsedgeID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__Ys#cCs†|ii|ƒ|ii|i|ii|ƒ [(source,target),...]cCs ||_dS(N(sgsself(sselfsg((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__§sccs9x2|iiƒD]!}x|iƒD] }|Vq#WqWdS(N(sselfsgs itervaluessdsedgessedge(sselfsedgesd((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__iter__©s  cCsVg}xE|i|iD]3\}}|i|ii ||ii |fƒqW|SdS(N( slsselfsdsedgesidssourceIDstargetIDsappendsgssourceDBstargetDB(sselfsedgessourceIDstargetIDsl((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__­s  +cCs|SdS(N(sself(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__call__²s(s__name__s __module__s__doc__s__init__s__iter__s __getitem__s__call__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys IDGraphEdges¤s    sIDGraphEdgeDescriptorcBstZdZd„ZRS(s%provides interface to edges on demandcCst|ƒSdS(N(s IDGraphEdgessobj(sselfsobjsobjtype((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__get__·s(s__name__s __module__s__doc__s__get__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysIDGraphEdgeDescriptorµs c KsÐ|tj o ||_nt}|tj o ||_n|tj o ||_nd„|_|_|o|i |_ n|tj o ||_n|tj o ||_ n|tj o ||_ ndS(s3apply kwargs to reference DB objects for this graphcCs|S(N(sedge(sedge((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysÈsN( ssourceDBsNonesselfsTrues simpleKeysstargetDBsedgeDBs pack_edges unpack_edges _IDGraphClasss __class__sgraphs edgeDictClass( sselfssourceDBstargetDBsedgeDBs simpleKeyss unpack_edges edgeDictClasssgraphskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pyssave_graph_db_refs»s"           cCsñ|odddf}ndddf}ydtdt||dƒdt||dƒƒ}yt||dƒ|d>sys.stderr,'''%s Database table %s appears to be missing or has no layer name! To create this table, call worldbase.MySQLMetabase("%s",createLayer=) where is the layer name you want to assign it. %s''' %('!'*40,self.tablename,self.tablename,'!'*40) raise if n>0: self.zoneName = self.cursor.fetchone()[0] # GET LAYERNAME FROM DB if self.cursor.execute('select location from %s where pygr_id=%%s' % self.tablename,('0root',))>0: for row in self.cursor.fetchall(): self.rootNames[row[0]]=None mdb.save_root_names(self.rootNames) self.graph = SQLGraph(schemaTable,self.cursor,attrAlias= dict(source_id='source_id',target_id='target_id', edge_id='edge_id'),simpleKeys=True, unpack_edge=SchemaEdge(self)) def save_root_name(self,name): self.rootNames[name]=None self.cursor.execute('insert into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)' %self.tablename,('0root',name,'a')) def find_resource(self,id,download=False): 'get construction rule from mysql, and attempt to construct' self.cursor.execute('select location,objdata,docstring from %s where pygr_id=%%s' % self.tablename,(id,)) for location,objdata,docstring in self.cursor.fetchall(): return objdata,docstring # return first resource found raise WorldbaseNotFoundError('unable to construct %s from remote services') def __setitem__(self,id,obj): 'add an object to this resource database' s = dumps(obj) # PICKLE obj AND ITS DEPENDENCIES d = get_info_dict(obj, s) self.cursor.execute('replace into %s (pygr_id,location,docstring,user,creation_time,pickle_size,objdata) values (%%s,%%s,%%s,%%s,%%s,%%s,%%s)' %self.tablename, (id,'mysql:'+self.tablename,obj.__doc__,d['user'], d['creation_time'],d['pickle_size'],s)) root=id.split('.')[0] if root not in self.rootNames: self.save_root_name(root) def __delitem__(self,id): 'delete this resource and its schema rules' if self.cursor.execute('delete from %s where pygr_id=%%s' %self.tablename,(id,))<1: raise WorldbaseNotFoundError('no resource %s in this database'%id) def registerServer(self,locationKey,serviceDict): 'register the specified services to mysql database' n=0 for id,(d,pdata) in serviceDict.items(): n+=self.cursor.execute('replace into %s (pygr_id,location,docstring,user,creation_time,pickle_size,objdata) values (%%s,%%s,%%s,%%s,%%s,%%s,%%s)' % self.tablename, (id,locationKey,d['__doc__'],d['user'], d['creation_time'],d['pickle_size'],pdata)) return n def setschema(self,id,attr,kwargs): 'save a schema binding for id.attr --> targetID' if not attr.startswith('-'): # REAL ATTRIBUTE targetID=kwargs['targetID'] # RAISES KeyError IF NOT PRESENT kwdata = dumps(kwargs) self.cursor.execute('replace into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)' %self.tablename,('SCHEMA.'+id,attr,kwdata)) def delschema(self,id,attr): 'delete schema binding for id.attr' self.cursor.execute('delete from %s where pygr_id=%%s and location=%%s' %self.tablename,('SCHEMA.'+id,attr)) def getschema(self,id): 'return dict of {attr:{args}}' d={} self.cursor.execute('select location,objdata from %s where pygr_id=%%s' % self.tablename,('SCHEMA.'+id,)) for attr,objData in self.cursor.fetchall(): d[attr]=self.mdb.loads(objData) return d def dir(self,pattern,matchType='p',asDict=False,download=False): 'return list or dict of resources matching the specified string' if matchType == 'r': self.cursor.execute('select pygr_id,docstring,user,creation_time,pickle_size from %s where pygr_id regexp %%s' % self.tablename, (pattern, )) elif matchType == 'p': self.cursor.execute('select pygr_id,docstring,user,creation_time,pickle_size from %s where pygr_id like %%s' % self.tablename,(pattern+'%',)) else: # Exit now to avoid fetching rows with no query executed if asDict: return {} else: return [] d={} for l in self.cursor.fetchall(): d[l[0]] = dict(__doc__=l[1],user=l[2],creation_time=l[3],pickle_size=l[4]) if asDict: return d else: return [name for name in d] class SchemaEdge(object): 'provides unpack_edge method for schema graph storage' def __init__(self,schemaDB): self.schemaDB = schemaDB def __call__(self,edgeID): 'get the actual schema object describing this ID' return self.schemaDB.getschema(edgeID)['-schemaEdge'] class ResourceDBGraphDescr(object): 'this property provides graph interface to schema' def __get__(self,obj,objtype): g = Graph(filename=obj.dbpath+'_schema',mode='cw',writeNow=True, simpleKeys=True,unpack_edge=SchemaEdge(obj)) obj.graph = g return g class ShelveMetabase(object): '''BerkeleyDB-based storage of worldbase resource databases, using the python shelve module. Users will not need to create instances of this class themselves, as worldbase automatically creates one for each appropriate entry in your WORLDBASEPATH; if the corresponding database file does not already exist, it is automatically created for you.''' _pygr_data_version=(0,1,0) graph = ResourceDBGraphDescr() # INTERFACE TO SCHEMA GRAPH def __init__(self, dbpath, mdb, mode='r', newZone=None, **kwargs): import anydbm self.dbpath = os.path.join(dbpath, '.pygr_data') # CONSTRUCT FILENAME self.mdb = mdb self.writeable = True # can write to this storage self.zoneName = None try: # OPEN DATABASE FOR READING self.db = dbfile.shelve_open(self.dbpath, mode) try: mdb.save_root_names(self.db['0root']) except KeyError: pass try: self.zoneName = self.db['0zoneName'] except KeyError: pass except anydbm.error: # CREATE NEW FILE IF NEEDED self.db = dbfile.shelve_open(self.dbpath, 'c') self.db['0version'] = self._pygr_data_version # SAVE VERSION STAMP self.db['0root'] = {} if newZone is not None: self.db['0zoneName'] = newZone self.zoneName = newZone def reopen(self, mode): self.db.close() self.db = dbfile.shelve_open(self.dbpath, mode) def find_resource(self, resID, download=False): 'get an item from this resource database' objdata = self.db[resID] # RAISES KeyError IF NOT PRESENT try: return objdata, self.db['__doc__.' + resID]['__doc__'] except KeyError: return objdata, None def __setitem__(self, resID, obj): 'add an object to this resource database' s = dumps(obj) # PICKLE obj AND ITS DEPENDENCIES self.reopen('w') # OPEN BRIEFLY IN WRITE MODE try: self.db[resID] = s # SAVE TO OUR SHELVE FILE self.db['__doc__.' + resID] = get_info_dict(obj, s) root = resID.split('.')[0] # SEE IF ROOT NAME IS IN THIS SHELVE d = self.db.get('0root', {}) if root not in d: d[root] = None # ADD NEW ENTRY self.db['0root'] = d # SAVE BACK TO SHELVE finally: self.reopen('r') # REOPEN READ-ONLY def __delitem__(self, resID): 'delete this item from the database, with a modicum of safety' self.reopen('w') # OPEN BRIEFLY IN WRITE MODE try: try: del self.db[resID] # DELETE THE SPECIFIED RULE except KeyError: raise WorldbaseNotFoundError('ID %s not found in %s' % (resID,self.dbpath)) try: del self.db['__doc__.' + resID] except KeyError: pass finally: self.reopen('r') # REOPEN READ-ONLY def dir(self, pattern, matchType='p',asDict=False,download=False): 'generate all item IDs matching the specified pattern' if matchType == 'r': pattern = re.compile(pattern) l=[] for name in self.db: if matchType == 'p' and name.startswith(pattern) \ or matchType == 'r' and pattern.search(name): l.append(name) if asDict: d={} for name in l: d[name] = self.db.get('__doc__.'+name,None) return d return l def setschema(self, resID, attr, kwargs): 'save a schema binding for resID.attr --> targetID' if not attr.startswith('-'): # REAL ATTRIBUTE targetID = kwargs['targetID'] # RAISES KeyError IF NOT PRESENT self.reopen('w') # OPEN BRIEFLY IN WRITE MODE d = self.db.get('SCHEMA.' + resID, {}) d[attr] = kwargs # SAVE THIS SCHEMA RULE self.db['SCHEMA.' + resID] = d # FORCE shelve TO RESAVE BACK self.reopen('r') # REOPEN READ-ONLY def getschema(self, resID): 'return dict of {attr:{args}}' return self.db['SCHEMA.' + resID] def delschema(self, resID, attr): 'delete schema binding for resID.attr' self.reopen('w') # OPEN BRIEFLY IN WRITE MODE d=self.db['SCHEMA.' + resID] del d[attr] self.db['SCHEMA.' + resID] = d # FORCE shelve TO RESAVE BACK self.reopen('r') # REOPEN READ-ONLY def __del__(self): 'close the shelve file when finished' self.db.close() def dumps(obj, **kwargs): 'pickle to string, using persistent ID encoding' src = StringIO() pickler = PygrPickler(src) # NEED OUR OWN PICKLER, TO USE persistent_id pickler.setRoot(obj, **kwargs) # ROOT OF PICKLE TREE: SAVE EVEN IF persistent_id pickler.dump(obj) # PICKLE IT return src.getvalue() # RETURN THE PICKLED FORM AS A STRING def get_info_dict(obj, pickleString): 'get dict of standard info about a resource' d = dict(creation_time=datetime.datetime.now(), pickle_size=len(pickleString),__doc__=obj.__doc__) try: d['user'] = os.environ['USER'] except KeyError: d['user'] = None return d class MetabaseBase(object): def persistent_load(self, persid): 'check for PYGR_ID:... format and return the requested object' if persid.startswith('PYGR_ID:'): return self(persid[8:]) # RUN OUR STANDARD RESOURCE REQUEST PROCESS else: # UNKNOWN PERSISTENT ID... NOT FROM PYGR! raise pickle.UnpicklingError, 'Invalid persistent ID %s' % persid def load(self, resID, objdata, docstring): 'load the pickled data and all its dependencies' obj = self.loads(objdata) obj.__doc__ = docstring if hasattr(obj,'_saveLocalBuild') and obj._saveLocalBuild: saver = self.writer.saver # mdb in which to record local copy # SAVE AUTO BUILT RESOURCE TO LOCAL PYGR.DATA hasPending = saver.has_pending() # any pending transaction? saver.add_resource(resID, obj) # add to queue for commit obj._saveLocalBuild = False # NO NEED TO SAVE THIS AGAIN if hasPending: print >>sys.stderr,'''Saving new resource %s to local worldbase... You must use worldbase.commit() to commit! You are seeing this message because you appear to be in the middle of a worldbase transaction. Ordinarily worldbase would automatically commit this new downloaded resource, but doing so now would also commit your pending transaction, which you may not be ready to do!''' % resID else: # automatically save new resource saver.save_pending() # commit it else: # NORMAL USAGE obj._persistent_id = resID # MARK WITH ITS PERSISTENT ID self.resourceCache[resID] = obj # SAVE TO OUR CACHE self.bind_schema(resID, obj) # BIND SHADOW ATTRIBUTES IF ANY return obj def loads(self, data): 'unpickle from string, using persistent ID expansion' src = StringIO(data) unpickler = pickle.Unpickler(src) unpickler.persistent_load = self.persistent_load # WE PROVIDE PERSISTENT LOOKUP obj = unpickler.load() # ACTUALLY UNPICKLE THE DATA return obj def __call__(self, resID, debug=None, download=None, *args, **kwargs): 'get the requested resource ID by searching all databases' try: return self.resourceCache[resID] # USE OUR CACHED OBJECT except KeyError: pass debug_state = self.debug # SAVE ORIGINAL STATE download_state = self.download if debug is not None: self.debug = debug if download is not None: # apply the specified download mode self.download = download else: # just use our current download mode download = self.download try: # finally... TO RESTORE debug STATE EVEN IF EXCEPTION OCCURS. self.update(debug=self.debug, keepCurrentPath=True) # load if empty for objdata,docstr in self.find_resource(resID, download): try: obj = self.load(resID, objdata, docstr) break except (KeyError,IOError): # NOT IN THIS DB; FILES NOT ACCESSIBLE... if self.debug: # PASS ON THE ACTUAL ERROR IMMEDIATELY raise finally: # RESTORE STATE BEFORE RAISING ANY EXCEPTION self.debug = debug_state self.download = download_state self.resourceCache[resID] = obj # save to our cache return obj def bind_schema(self, resID, obj): 'if this resource ID has any schema, bind its attrs to class' try: schema = self.getschema(resID) except KeyError: return # NO SCHEMA FOR THIS OBJ, SO NOTHING TO DO self.resourceCache.schemaCache[resID] = schema # cache for speed for attr,rules in schema.items(): if not attr.startswith('-'): # only bind real attributes self.bind_property(obj, attr, **rules) def bind_property(self, obj, attr, itemRule=False, **kwargs): 'create a descriptor for the attr on the appropriate obj class' try: # SEE IF OBJECT TELLS US TO SKIP THIS ATTRIBUTE return obj._ignoreShadowAttr[attr] # IF PRESENT, NOTHING TO DO except (AttributeError,KeyError): pass # PROCEED AS NORMAL if itemRule: # SHOULD BIND TO ITEMS FROM obj DATABASE targetClass = get_bound_subclass(obj,'itemClass') # CLASS USED FOR CONSTRUCTING ITEMS descr = ItemDescriptor(attr, self, **kwargs) else: # SHOULD BIND DIRECTLY TO obj VIA ITS CLASS targetClass = get_bound_subclass(obj) descr = OneTimeDescriptor(attr, self, **kwargs) setattr(targetClass, attr, descr) # BIND descr TO targetClass.attr if itemRule: try: # BIND TO itemSliceClass TOO, IF IT EXISTS... targetClass = get_bound_subclass(obj,'itemSliceClass') except AttributeError: pass # NO itemSliceClass, SO SKIP else: # BIND TO itemSliceClass setattr(targetClass, attr, descr) if attr == 'inverseDB': # ADD SHADOW __invert__ TO ACCESS THIS addSpecialMethod(obj, '__invert__', getInverseDB) def get_schema_attr(self, resID, attr): 'actually retrieve the desired schema attribute' try: # GET SCHEMA FROM CACHE schema = self.resourceCache.schemaCache[resID] except KeyError: # HMM, IT SHOULD BE CACHED! schema = self.getschema(resID) # OBTAIN FROM RESOURCE DB self.resourceCache.schemaCache[resID] = schema # KEEP IT IN OUR CACHE try: schema = schema[attr] # GET SCHEMA FOR THIS SPECIFIC ATTRIBUTE except KeyError: raise AttributeError('no worldbase schema info for %s.%s' \ % (resID,attr)) targetID = schema['targetID'] # GET THE RESOURCE ID return self(targetID) # actually load the resource def add_root_name(self, name): 'add name to the root of our data namespace and schema namespace' getattr(self.Data, name) # forces root object to add name if not present getattr(self.Schema, name) # forces root object to add name if not present def save_root_names(self, rootNames): 'add set of names to our namespace root' for name in rootNames: self.add_root_name(name) def clear_cache(self): 'clear all resources from cache' self.resourceCache.clear() def get_writer(self): 'return writeable mdb if available, or raise exception' try: return self.writer except AttributeError: raise WorldbaseReadOnlyError('this metabase is read-only!') def add_resource(self, resID, obj=None): """assign obj as the specified resource ID to our metabase. if obj is None, treat resID as a dictionary whose keys are resource IDs and values are the objects to save.""" if obj is None: self.get_writer().saver.add_resource_dict(resID) else: self.get_writer().saver.add_resource(resID, obj) def delete_resource(self, resID): 'delete specified resource ID from our metabase' self.get_writer().saver.delete_resource(resID) def commit(self): 'save any pending resource assignments and schemas' self.get_writer().saver.save_pending() def rollback(self): 'discard any pending resource assignments and schemas' self.get_writer().saver.rollback() def queue_schema_obj(self, schemaPath, attr, schemaObj): 'add a schema to the list of pending schemas to commit' self.get_writer().saver.queue_schema_obj(schemaPath, attr, schemaObj) def add_schema(self, resID, schemaObj): 'assign a schema relation object to a worldbase resource name' l = resID.split('.') schemaPath = SchemaPath(self, '.'.join(l[:-1])) setattr(schemaPath, l[-1], schemaObj) def list_pending(self): return self.get_writer().saver.list_pending() class Metabase(MetabaseBase): def __init__(self, dbpath, resourceCache, zoneDict=None, parent=None, **kwargs): '''zoneDict provides a mechanism for the caller to request information about what type of metabase this dbpath mapped to. zoneDict must be a dict''' self.parent = parent self.Schema = SchemaPath(self) self.Data = ResourceRoot(self) # root of namespace self.resourceCache = resourceCache self.debug = True # single mdb should expose all errors self.download = False if zoneDict is None: # user doesn't want zoneDict info zoneDict = {} # use a dummy dict, disposable if dbpath.startswith('http://'): storage = XMLRPCMetabase(dbpath, self, **kwargs) if 'remote' not in zoneDict: zoneDict['remote'] = self elif dbpath.startswith('mysql:'): storage = MySQLMetabase(dbpath[6:], self, **kwargs) if 'MySQL' not in zoneDict: zoneDict['MySQL'] = self else: # TREAT AS LOCAL FILEPATH dbpath = os.path.expanduser(dbpath) storage = ShelveMetabase(dbpath, self, **kwargs) if dbpath == os.path.expanduser('~') \ or dbpath.startswith(os.path.expanduser('~')+os.sep): if 'my' not in zoneDict: zoneDict['my'] = self elif os.path.isabs(dbpath): if 'system' not in zoneDict: zoneDict['system'] = self elif dbpath.split(os.sep)[0]==os.curdir: if 'here' not in zoneDict: zoneDict['here'] = self elif 'subdir' not in zoneDict: zoneDict['subdir'] = self self.storage = storage if storage.zoneName is not None and storage.zoneName not in zoneDict: zoneDict[storage.zoneName] = self # record this zone name if storage.writeable: self.writeable = True self.saver = ResourceSaver(self) self.writer = self # record downloaded resources here else: self.writeable = False def update(self, worldbasePath=None, debug=None, keepCurrentPath=False): if not keepCurrentPath: # metabase has fixed path raise ValueError('You cannot change the path of a Metabase') def find_resource(self, resID, download=False): yield self.storage.find_resource(resID, download) def get_pending_or_find(self, resID, **kwargs): 'find resID even if only pending (not actually saved yet)' try: # 1st LOOK IN PENDING QUEUE return self.saver.pendingData[resID] except KeyError: pass return self(resID,**kwargs) def getschema(self, resID): 'return dict of {attr:{args}} or KeyError if not found' return self.storage.getschema(resID) def save_root_names(self, rootNames): if self.parent is not None: # add names to parent's namespace as well self.parent.save_root_names(rootNames) MetabaseBase.save_root_names(self, rootNames) # call the generic method def saveSchema(self, resID, attr, args): 'save an attribute binding rule to the schema; DO NOT use this internal interface unless you know what you are doing!' self.storage.setschema(resID, attr, args) def saveSchemaEdge(self, schema): 'save schema edge to schema graph' self.saveSchema(schema.name, '-schemaEdge', schema) self.storage.graph += schema.sourceDB # ADD NODE TO SCHEMA GRAPH self.storage.graph[schema.sourceDB][schema.targetDB] = schema.name # EDGE def dir(self, pattern='', matchType='p', asDict=False, download=False): return self.storage.dir(pattern, matchType, asDict=asDict, download=download) class ZoneDict(UserDict.DictMixin): 'interface to current zones' def __init__(self, mdbList): self.mdbList = mdbList def __getitem__(self, zoneName): self.mdbList.update(keepCurrentPath=True) # make sure metabases loaded return self.mdbList.zoneDict[zoneName] def keys(self): self.mdbList.update(keepCurrentPath=True) # make sure metabases loaded return self.mdbList.zoneDict.keys() def copy(self): self.mdbList.update(keepCurrentPath=True) # make sure metabases loaded return self.mdbList.zoneDict.copy() class MetabaseList(MetabaseBase): '''Primary interface for worldbase resource database access. A single instance of this class is created upon import of the worldbase module, accessible as worldbase.getResource. Users normally will have no need to create additional instances of this class themselves.''' # DEFAULT WORLDBASEPATH: HOME, CURRENT DIR, XMLRPC IN THAT ORDER defaultPath = ['~','.','http://biodb2.bioinformatics.ucla.edu:5000'] def __init__(self, worldbasePath=None, resourceCache=None, separator=',', mdbArgs={}): '''initializes attrs; does not connect to metabases''' if resourceCache is None: # create a cache for loaded resources resourceCache = ResourceCache() self.resourceCache = resourceCache self.mdb = None self.mdbArgs = mdbArgs self.zoneDict = {} self.zones = ZoneDict(self) # interface to dict of zones self.worldbasePath = worldbasePath self.separator = separator self.Schema = SchemaPath(self) self.Data = ResourceRoot(self, zones=self.zones) # root of namespace self.debug = False # if one load attempt fails, try other metabases self.download = False self.ready = False def get_writer(self): 'ensure that metabases are loaded, before looking for our writer' self.update(keepCurrentPath=True) # make sure metabases loaded return MetabaseBase.get_writer(self) # proceed as usual def find_resource(self, resID, download=False): 'search our metabases for pickle string and docstr for resID' for mdb in self.mdb: try: yield mdb.find_resource(resID, download).next() except KeyError: # not in this db pass raise WorldbaseNotFoundError('unable to find %s in WORLDBASEPATH' % resID) def get_worldbase_path(self): 'get environment var, or default in that order' try: return os.environ['WORLDBASEPATH'] except KeyError: try: return os.environ['PYGRDATAPATH'] except KeyError: return self.separator.join(self.defaultPath) def update(self, worldbasePath=None, debug=None, keepCurrentPath=False, mdbArgs=None): 'get the latest list of resource databases' if keepCurrentPath: # only update if self.worldbasePath is None worldbasePath = self.worldbasePath if worldbasePath is None: # get environment var or default worldbasePath = self.get_worldbase_path() if debug is None: debug = self.debug if mdbArgs is None: mdbArgs = self.mdbArgs if not self.ready or self.worldbasePath != worldbasePath: # reload self.worldbasePath = worldbasePath try: # disconnect from previous writeable interface if any del self.writer except AttributeError: pass self.mdb = [] try: # default: we don't have a writeable mdb to save data in del self.writer except AttributeError: pass self.zoneDict = {} for dbpath in worldbasePath.split(self.separator): try: # connect to metabase mdb = Metabase(dbpath, self.resourceCache, self.zoneDict, self, **mdbArgs) except (KeyboardInterrupt,SystemExit): raise # DON'T TRAP THESE CONDITIONS # FORCED TO ADOPT THIS STRUCTURE BECAUSE xmlrpc RAISES # socket.gaierror WHICH IS NOT A SUBCLASS OF StandardError... # SO I CAN'T JUST TRAP StandardError, UNFORTUNATELY... except: # trap errors and continue to next metabase if debug: raise # expose the error immediately else: # warn the user but keep going... import traceback traceback.print_exc(10,sys.stderr) # JUST PRINT TRACEBACK print >>sys.stderr,''' WARNING: error accessing metabase %s. Continuing...''' % dbpath else: # NO PROBLEM, SO ADD TO OUR RESOURCE DB LIST self.mdb.append(mdb) # SAVE TO OUR LIST OF RESOURCE DATABASES if mdb.writeable and not hasattr(self, 'writer'): self.writer = mdb # record as place to save resources self.ready = True # metabases successfully loaded def get_pending_or_find(self, resID, **kwargs): 'find resID even if only pending (not actually saved yet)' for mdb in self.mdb: try: # 1st LOOK IN PENDING QUEUE return mdb.saver.pendingData[resID] except KeyError: pass return self(resID, **kwargs) def registerServer(self,locationKey,serviceDict): 'register the serviceDict with the first index server in WORLDBASEPATH' for mdb in self.mdb: if hasattr(mdb.storage, 'registerServer'): n = mdb.storage.registerServer(locationKey, serviceDict) if n == len(serviceDict): return n raise ValueError('unable to register services. Check WORLDBASEPATH') def getschema(self, resID): 'search our resource databases for schema info for the desired ID' for mdb in self.mdb: try: return mdb.getschema(resID) # TRY TO OBTAIN FROM THIS DATABASE except KeyError: pass # NOT IN THIS DB raise KeyError('no schema info available for ' + resID) def dir(self, pattern='', matchType='p', asDict=False, download=False): 'get list or dict of resources beginning with the specified string' self.update(keepCurrentPath=True) # make sure metabases loaded results = [] for mdb in self.mdb: results.append(mdb.dir(pattern, matchType, asDict=asDict, download=download)) if asDict: # merge result dictionaries d = {} results.reverse() # give first results highest precedence for subdir in results: d.update(subdir) return d else: # simply remove redundancy from results d = {} for l in results: filter(d.setdefault, l) # add all entries to dict results = d.keys() results.sort() return results class ResourceCache(dict): 'provide one central repository of loaded resources & schema info' def __init__(self): dict.__init__(self) self.schemaCache = {} def clear(self): dict.clear(self) # clear our dictionary self.schemaCache.clear() # class ResourceSaver(object): 'queues new resources until committed to our mdb' def __init__(self, mdb): self.clear_pending() self.mdb = mdb def clear_pending(self): self.pendingData = {} # CLEAR THE PENDING QUEUE self.pendingSchema = {} # CLEAR THE PENDING QUEUE self.lastData = {} self.lastSchema = {} self.rollbackData = {} # CLEAR THE ROLLBACK CACHE def check_docstring(self,obj): 'enforce requirement for docstring, by raising exception if not present' try: if obj.__doc__ is None or (hasattr(obj.__class__,'__doc__') and obj.__doc__==obj.__class__.__doc__): raise AttributeError except AttributeError: raise ValueError('to save a resource object, you MUST give it a __doc__ string attribute describing it!') def add_resource(self, resID, obj): 'queue the object for saving to our metabase as ' self.check_docstring(obj) obj._persistent_id = resID # MARK OBJECT WITH ITS PERSISTENT ID self.pendingData[resID] = obj # ADD TO QUEUE try: self.rollbackData[resID] = self.mdb.resourceCache[resID] except KeyError: pass self.cache_if_appropriate(resID, obj) def cache_if_appropriate(self, resID, obj): try: if obj._worldbase_no_cache: return # do not cache this object; it is not ready to use!! except AttributeError: pass self.mdb.resourceCache[resID] = obj # SAVE TO OUR CACHE def add_resource_dict(self, d): 'queue a dict of name:object pairs for saving to metabase' for k,v in d.items(): self.add_resource(k, v) def queue_schema_obj(self, schemaPath, attr, schemaObj): 'add a schema object to the queue for saving to our metabase' resID = schemaPath.getPath(attr) # GET STRING ID self.pendingSchema[resID] = (schemaPath,attr,schemaObj) def save_resource(self, resID, obj): 'save the object as ' self.check_docstring(obj) if obj._persistent_id != resID: raise WorldbaseMismatchError('''The _persistent_id attribute for %s has changed! If you changed it, shame on you! Otherwise, this should not happen, so report the reproducible steps to this error message as a bug report.''' % resID) self.mdb.storage[resID] = obj # FINALLY, SAVE THE OBJECT TO THE DATABASE self.cache_if_appropriate(resID, obj) # SAVE TO OUR CACHE def has_pending(self): 'return True if there are resources pending to be committed' return len(self.pendingData)>0 or len(self.pendingSchema)>0 def save_pending(self): 'save any pending worldbase resources and schema' if len(self.pendingData)>0 or len(self.pendingSchema)>0: d = self.pendingData schemaDict = self.pendingSchema else: raise WorldbaseEmptyError('there is no data queued for saving!') for resID,obj in d.items(): # now save the data self.save_resource(resID, obj) for schemaPath,attr,schemaObj in schemaDict.values():# save schema schemaObj.saveSchema(schemaPath, attr, self.mdb) # save each rule self.clear_pending() # FINALLY, CLEAN UP... self.lastData = d # keep as a historical record self.lastSchema = schemaDict def list_pending(self): 'return tuple of pending data dictionary, pending schema' return list(self.pendingData),list(self.pendingSchema) def rollback(self): 'dump any pending data without saving, and restore state of cache' if len(self.pendingData)==0 and len(self.pendingSchema)==0: raise WorldbaseEmptyError('there is no data queued for saving!') self.mdb.resourceCache.update(self.rollbackData) # RESTORE THE ROLLBACK QUEUE self.clear_pending() def delete_resource(self, resID): # incorporate this into commit-process? 'delete the specified resource from resourceCache, saver and schema' del self.mdb.storage[resID] # delete from the resource database try: del self.mdb.resourceCache[resID] # delete from cache if exists except KeyError: pass try: del self.pendingData[resID] # delete from queue if exists except KeyError: pass self.delSchema(resID) def delSchema(self, resID): 'delete schema bindings TO and FROM this resource ID' storage = self.mdb.storage try: d = storage.getschema(resID) # GET THE EXISTING SCHEMA except KeyError: return # no schema stored for this object so nothing to do... self.mdb.resourceCache.schemaCache.clear() # THIS IS MORE AGGRESSIVE THAN NEEDED... COULD BE REFINED for attr,obj in d.items(): if attr.startswith('-'): # A SCHEMA OBJECT obj.delschema(storage) # DELETE ITS SCHEMA RELATIONS storage.delschema(resID, attr) # delete attribute schema rule def __del__(self): try: self.save_pending() # SEE WHETHER ANY DATA NEEDS SAVING print >>sys.stderr,''' WARNING: saving worldbase pending data that you forgot to save... Remember in the future, you must issue the command worldbase.commit() to save your pending worldbase resources to your resource database(s), or alternatively worldbase.rollback() to dump those pending data without saving them. It is a very bad idea to rely on this automatic attempt to save your forgotten data, because it is possible that the Python interpreter may never call this function at exit (for details see the atexit module docs in the Python Library Reference).''' except WorldbaseEmptyError: pass class ResourceServer(XMLRPCServerBase): 'serves resources that can be transmitted on XMLRPC' def __init__(self, mdb, name, serverClasses=None, clientHost=None, withIndex=True, excludeClasses=None, downloadDB=None, resourceDict=None, **kwargs): 'construct server for the designated classes' XMLRPCServerBase.__init__(self, name, **kwargs) self.mdb = mdb if resourceDict is None: resourceDict = mdb.resourceCache if excludeClasses is None: # DEFAULT: NO POINT IN SERVING SQL TABLES... from sqlgraph import SQLTableBase,SQLGraphClustered excludeClasses = [SQLTableBase,SQLGraphClustered] if serverClasses is None: # DEFAULT TO ALL CLASSES WE KNOW HOW TO SERVE from seqdb import SequenceFileDB,BlastDB, \ XMLRPCSequenceDB,BlastDBXMLRPC, \ AnnotationDB, AnnotationClient, AnnotationServer serverClasses=[(SequenceFileDB,XMLRPCSequenceDB,BlastDBXMLRPC), (BlastDB,XMLRPCSequenceDB,BlastDBXMLRPC), (AnnotationDB,AnnotationClient,AnnotationServer)] try: from cnestedlist import NLMSA from xnestedlist import NLMSAClient,NLMSAServer serverClasses.append((NLMSA,NLMSAClient,NLMSAServer)) except ImportError: # cnestedlist NOT INSTALLED, SO SKIP... pass if clientHost is None: # DEFAULT: USE THE SAME HOST STRING AS SERVER clientHost = self.host clientDict={} for id,obj in resourceDict.items(): # SAVE ALL OBJECTS MATCHING serverClasses skipThis = False for skipClass in excludeClasses: # CHECK LIST OF CLASSES TO EXCLUDE if isinstance(obj,skipClass): skipThis = True break if skipThis: continue # DO NOT INCLUDE THIS OBJECT IN SERVER skipThis=True for baseKlass,clientKlass,serverKlass in serverClasses: if isinstance(obj,baseKlass) and not isinstance(obj,clientKlass): skipThis=False # OK, WE CAN SERVE THIS CLASS break if skipThis: # HAS NO XMLRPC CLIENT-SERVER CLASS PAIRING try: # SAVE IT AS ITSELF self.client_dict_setitem(clientDict,id,obj,badClasses=nonPortableClasses) except WorldbaseNotPortableError: pass # HAS NON-PORTABLE LOCAL DEPENDENCIES, SO SKIP IT continue # GO ON TO THE NEXT DATA RESOURCE try: # TEST WHETHER obj CAN BE RE-CLASSED TO CLIENT / SERVER obj.__class__=serverKlass # CONVERT TO SERVER CLASS FOR SERVING except TypeError: # GRR, EXTENSION CLASS CAN'T BE RE-CLASSED... state=obj.__getstate__() # READ obj STATE newobj=serverKlass.__new__(serverKlass) # ALLOCATE NEW OBJECT newobj.__setstate__(state) # AND INITIALIZE ITS STATE obj=newobj # THIS IS OUR RE-CLASSED VERSION OF obj try: # USE OBJECT METHOD TO SAVE HOST INFO, IF ANY... obj.saveHostInfo(clientHost, self.port, id) except AttributeError: # TRY TO SAVE URL AND NAME DIRECTLY ON obj obj.url = 'http://%s:%d' % (clientHost,self.port) obj.name = id obj.__class__ = clientKlass # CONVERT TO CLIENT CLASS FOR PICKLING self.client_dict_setitem(clientDict,id,obj) obj.__class__ = serverKlass # CONVERT TO SERVER CLASS FOR SERVING self[id] = obj # ADD TO XMLRPC SERVER self.registrationData = clientDict # SAVE DATA FOR SERVER REGISTRATION if withIndex: # SERVE OUR OWN INDEX AS A STATIC, READ-ONLY INDEX myIndex = MetabaseServer(name, readOnly=True, # CREATE EMPTY INDEX downloadDB=downloadDB) self['index'] = myIndex # ADD TO OUR XMLRPC SERVER self.register('', '', server=myIndex) # ADD OUR RESOURCES TO THE INDEX def client_dict_setitem(self, clientDict, k, obj, **kwargs): 'save pickle and schema for obj into clientDict' pickleString = dumps(obj,**kwargs) # PICKLE THE CLIENT OBJECT, SAVE clientDict[k] = (get_info_dict(obj,pickleString),pickleString) try: # SAVE SCHEMA INFO AS WELL... clientDict['SCHEMA.'+k] = (dict(schema_version='1.0'), self.mdb.getschema(k)) except KeyError: pass # NO SCHEMA FOR THIS OBJ, SO NOTHING TO DO class ResourcePath(object): 'simple way to read resource names as python foo.bar.bob expressions' def __init__(self, mdb, base=None): self.__dict__['_path'] = base # AVOID TRIGGERING setattr! self.__dict__['_mdb'] = mdb def getPath(self, name): if self._path is not None: return self._path+'.'+name else: return name def __getattr__(self, name): 'extend the resource path by one more attribute' attr = self._pathClass(self._mdb, self.getPath(name)) # MUST NOT USE setattr BECAUSE WE OVERRIDE THIS BELOW! self.__dict__[name] = attr # CACHE THIS ATTRIBUTE ON THE OBJECT return attr def __call__(self, *args, **kwargs): 'construct the requested resource' return self._mdb(self._path, *args, **kwargs) def __setattr__(self, name, obj): 'save obj using the specified resource name' self._mdb.add_resource(self.getPath(name), obj) def __delattr__(self, name): self._mdb.delete_resource(self.getPath(name)) try: # IF ACTUAL ATTRIBUTE EXISTS, JUST DELETE IT del self.__dict__[name] except KeyError: # TRY TO DELETE RESOURCE FROM THE DATABASE pass # NOTHING TO DO def __dir__(self, prefix=None, start=None): """return list of our attributes from worldbase search """ if prefix is None: start = len(self._path) + 1 # skip past . separator prefix = self._path l = self._mdb.dir(prefix) d = {} for name in l: if name.startswith(prefix): d[name[start:].split('.')[0]] = None return d.keys() ResourcePath._pathClass = ResourcePath class ResourceRoot(ResourcePath): 'provide proxy to public metabase methods' def __init__(self, mdb, base=None, zones=None): ResourcePath.__init__(self, mdb, base) self.__dict__['schema'] = mdb.Schema # AVOID TRIGGERING setattr! if zones is not None: self.__dict__['zones'] = zones for attr in ('dir', 'commit', 'rollback', 'add_resource', 'delete_resource', 'clear_cache', 'add_schema', 'update', 'list_pending'): self.__dict__[attr] = getattr(mdb, attr) # mirror metabase methods def __call__(self, resID, *args, **kwargs): """Construct the requested resource""" return self._mdb(resID, *args, **kwargs) def __dir__(self): return ResourcePath.__dir__(self, '', 0) class ResourceZone(object): 'provide pygr.Data old-style interface to resource zones' def __init__(self, mdb, zoneName): self._mdbParent = mdb self._zoneName = zoneName def __getattr__(self, name): self._mdbParent.update(keepCurrentPath=True) # make sure metabases loaded try: mdb = self._mdbParent.zoneDict[self._zoneName] # get our zone except KeyError: raise ValueError('no zone "%s" available' % self._zoneName) if name == 'schema': # get schema root return SchemaPath.__getitem__(self, mdb) else: # treat as regular worldbase string return ResourcePath.__getitem__(self, mdb, name) class SchemaPath(ResourcePath): 'save schema information for a resource' def __setattr__(self, name, schema): try: schema.saveSchema # VERIFY THAT THIS LOOKS LIKE A SCHEMA OBJECT except AttributeError: raise ValueError('not a valid schema object!') self._mdb.queue_schema_obj(self, name, schema) # QUEUE IT def __delattr__(self, attr): raise NotImplementedError('schema deletion is not yet implemented.') SchemaPath._pathClass = SchemaPath class DirectRelation(object): 'bind an attribute to the target' def __init__(self, target): self.targetID = getID(target) def schemaDict(self): return dict(targetID=self.targetID) def saveSchema(self, source, attr, mdb, **kwargs): d = self.schemaDict() d.update(kwargs) # ADD USER-SUPPLIED ARGS try: # IF kwargs SUPPLIED A TARGET, SAVE ITS ID d['targetID'] = getID(d['targetDB']) del d['targetDB'] except KeyError: pass mdb.saveSchema(getID(source), attr, d) class ItemRelation(DirectRelation): 'bind item attribute to the target' def schemaDict(self): return dict(targetID=self.targetID,itemRule=True) class ManyToManyRelation(object): 'a general graph mapping from sourceDB -> targetDB with edge info' _relationCode='many:many' def __init__(self,sourceDB,targetDB,edgeDB=None,bindAttrs=None, sourceNotNone=None,targetNotNone=None): self.sourceDB=getID(sourceDB) # CONVERT TO STRING RESOURCE ID self.targetDB=getID(targetDB) if edgeDB is not None: self.edgeDB=getID(edgeDB) else: self.edgeDB=None self.bindAttrs=bindAttrs if sourceNotNone is not None: self.sourceNotNone = sourceNotNone if targetNotNone is not None: self.targetNotNone = targetNotNone def save_graph_bindings(self, graphDB, attr, mdb): 'save standard schema bindings to graphDB attributes sourceDB, targetDB, edgeDB' graphDB = graphDB.getPath(attr) # GET STRING ID FOR source self.name = graphDB mdb.saveSchemaEdge(self) #SAVE THIS RULE b = DirectRelation(self.sourceDB) # SAVE sourceDB BINDING b.saveSchema(graphDB, 'sourceDB', mdb) b = DirectRelation(self.targetDB) # SAVE targetDB BINDING b.saveSchema(graphDB, 'targetDB', mdb) if self.edgeDB is not None: # SAVE edgeDB BINDING b = DirectRelation(self.edgeDB) b.saveSchema(graphDB, 'edgeDB', mdb) return graphDB def saveSchema(self, path, attr, mdb): 'save schema bindings associated with this rule' graphDB = self.save_graph_bindings(path, attr, mdb) if self.bindAttrs is not None: bindObj = (self.sourceDB,self.targetDB,self.edgeDB) bindArgs = [{},dict(invert=True),dict(getEdges=True)] try: # USE CUSTOM INVERSE SCHEMA IF PROVIDED BY TARGET DB bindArgs[1] = mdb.get_pending_or_find(graphDB)._inverse_schema() except AttributeError: pass for i in range(3): if len(self.bindAttrs)>i and self.bindAttrs[i] is not None: b = ItemRelation(graphDB) # SAVE ITEM BINDING b.saveSchema(bindObj[i], self.bindAttrs[i], mdb, **bindArgs[i]) def delschema(self,resourceDB): 'delete resource attribute bindings associated with this rule' if self.bindAttrs is not None: bindObj=(self.sourceDB,self.targetDB,self.edgeDB) for i in range(3): if len(self.bindAttrs)>i and self.bindAttrs[i] is not None: resourceDB.delschema(bindObj[i],self.bindAttrs[i]) class OneToManyRelation(ManyToManyRelation): _relationCode='one:many' class OneToOneRelation(ManyToManyRelation): _relationCode='one:one' class ManyToOneRelation(ManyToManyRelation): _relationCode='many:one' class InverseRelation(DirectRelation): "bind source and target as each other's inverse mappings" _relationCode = 'inverse' def saveSchema(self, source, attr, mdb, **kwargs): 'save schema bindings associated with this rule' source = source.getPath(attr) # GET STRING ID FOR source self.name = source mdb.saveSchemaEdge(self) #SAVE THIS RULE DirectRelation.saveSchema(self, source, 'inverseDB', mdb, **kwargs) # source -> target b = DirectRelation(source) # CREATE REVERSE MAPPING b.saveSchema(self.targetID, 'inverseDB', mdb, **kwargs) # target -> source def delschema(self,resourceDB): resourceDB.delschema(self.targetID,'inverseDB') def getID(obj): 'get persistent ID of the object or raise AttributeError' if isinstance(obj,str): # TREAT ANY STRING AS A RESOURCE ID return obj elif isinstance(obj,ResourcePath): return obj._path # GET RESOURCE ID FROM A ResourcePath else: try: # GET RESOURCE'S PERSISTENT ID return obj._persistent_id except AttributeError: raise AttributeError('this obj has no persistent ID!') PKŒ.;@ ±$ÈQÈQpygr/metabase.pyc;ò !¨Jc@s5dkZdkZdkZdkZdkZdkZdklZdklZl Z l Z dk l Z l Z lZdklZdkZyeWnej oegZnXdefd„ƒYZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZ defd„ƒYZ!defd„ƒYZ"defd„ƒYZ#dei$fd„ƒYZ%dei&fd „ƒYZ'd!efd"„ƒYZ(d#„Z)d$efd%„ƒYZ*d&efd'„ƒYZ+d(efd)„ƒYZ,d*efd+„ƒYZ-d,efd-„ƒYZ.d.„Z/d/„Z0d0efd1„ƒYZ1d2e1fd3„ƒYZ2d4ei3fd5„ƒYZ4d6e1fd7„ƒYZ5d8e6fd9„ƒYZ7d:efd;„ƒYZ8d<efd=„ƒYZ9d>efd?„ƒYZ:e:e:_;d@e:fdA„ƒYZ<dBefdC„ƒYZ=dDe:fdE„ƒYZ>e>e>_;dFefdG„ƒYZ?dHe?fdI„ƒYZ@dJefdK„ƒYZAdLeAfdM„ƒYZBdNeAfdO„ƒYZCdPeAfdQ„ƒYZDdRe?fdS„ƒYZEdT„ZFdS(UN(sStringIO(s CollectionsMappingsGraph(sstandard_invertsget_bound_subclasssSourceFileName(sXMLRPCServerBasesOneTimeDescriptorcBs tZdZd„Zd„ZRS(s)provides shadow attribute based on schemacKs||_||_dS(N(sattrNamesselfsattrsmdb(sselfsattrNamesmdbskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__s cCs_y |i}Wntj otdƒ‚nX|ii||iƒ}||i |i<|SdS(Ns8attempt to access worldbase attr on non-worldbase object( sobjs_persistent_idsresIDsAttributeErrorsselfsmdbsget_schema_attrsattrstargets__dict__(sselfsobjsobjtypesresIDstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__s (s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneTimeDescriptors  sItemDescriptorcBs8tZdZeeeeed„Zd„Zd„ZRS(s<provides shadow attribute for items in a db, based on schemac KsC||_||_||_||_||_||_||_dS(N( sattrNamesselfsattrsmdbsinvertsgetEdgessmapAttrs targetAttrs uniqueMapping( sselfsattrNamesmdbsinvertsgetEdgessmapAttrs targetAttrs uniqueMappingskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__s      cCs~y|ii}Wntj otdƒ‚nX|ii||iƒ}|i o |}n|i o |i }n|SdS(s2return the mapping object for this schema relations8attempt to access worldbase attr on non-worldbase objectN( sobjsdbs_persistent_idsresIDsAttributeErrorsselfsmdbsget_schema_attrsattrs targetDictsinvertsgetEdgessedges(sselfsobjsresIDs targetDict((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_target(s    cCsœ|i|ƒ}|itj o5t||iƒ}|tjotSn||}n ||}|i tj ot||i ƒ}n||i |i <|SdS(N( sselfs get_targetsobjs targetDictsmapAttrsNonesgetattrsobj_idsresults targetAttrs__dict__sattr(sselfsobjsobjtypes targetDictsobj_idsresult((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__4s  (s__name__s __module__s__doc__sFalsesNones__init__s get_targets__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysItemDescriptors  sItemDescriptorRWcBstZd„ZRS(NcCsH|i otdƒ‚n|i|ƒ}|||<||i|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__set__Es   (s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysItemDescriptorRWDssForwardingDescriptorcBs tZdZd„Zd„ZRS(s;forward an attribute request to item from another containercCs||_||_dS(N(stargetDBsselfsattr(sselfstargetDBsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ps cCs$|i|i}t||iƒSdS(N(sselfstargetDBsobjsidstargetsgetattrsattr(sselfsobjsobjtypestarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__Ss(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysForwardingDescriptorNs  sSpecialMethodDescriptorcBs tZdZd„Zd„ZRS(s4enables shadowing of special methods like __invert__cCs ||_dS(N(sattrNamesselfsattr(sselfsattrName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__YscCsEy|i|iSWn,tj o td||ifƒ‚nXdS(Ns%s has no method %s(sobjs__dict__sselfsattrsKeyErrorsAttributeError(sselfsobjsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__[s(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysSpecialMethodDescriptorWs  cCs–dk}|i|||iƒ}y"t||ƒ|jodSnWntj onXtd|ƒ‚t |||ƒt |i|t |ƒƒdS(s‚bind function f as special method attr on obj. obj cannot be an builtin or extension class (if so, just subclass it)Ns(%s already bound to a different function( snewsinstancemethodsfsobjs __class__smsgetattrsattrsAttributeErrorssetattrsSpecialMethodDescriptor(sobjsattrsfsmsnew((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysaddSpecialMethodas  cCs |iSdS(s default shadow __invert__ methodN(sselfs inverseDB(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getInverseDBqssWorldbaseNotPortableErrorcBstZdZRS(s_indicates that object has a local data dependency and cannnot be transferred to a remote client(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNotPortableErrorvs sWorldbaseNotFoundErrorcBstZdZRS(s\unable to find a loadable resource for the requested worldbase identifier from WORLDBASEPATH(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNotFoundErrorys sWorldbaseMismatchErrorcBstZdZRS(sL_persistent_id attr on object no longer matches its assigned worldbase ID?!?(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseMismatchError|s sWorldbaseEmptyErrorcBstZdZRS(sFuser hasn't queued anything, so trying to save or rollback is an error(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseEmptyErrors sWorldbaseReadOnlyErrorcBstZdZRS(s6attempt to write data to a read-only resource database(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseReadOnlyError‚s sWorldbaseSchemaErrorcBstZdZRS(sIattempt to set attribute to an object not in the database bound by schema(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseSchemaError…s sWorldbaseNoModuleErrorcBstZdZRS(s6attempt to pickle a class from a non-importable module(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNoModuleError‰s s PygrPicklercBs tZd„Zhfd„ZRS(NcCs)dk}y>t||iƒo |idjotd|iƒ‚nWntj onXyzt||iƒ o ||i j oRyd|i t |ƒSWqÖt j o&|i tj od|i SqÒqÖXnWntj onXx1|iD]&}t||ƒotdƒ‚q÷q÷WtSdS(sFconvert objects with _persistent_id to PYGR_ID strings during picklingNs__main__s}You cannot pickle a class from __main__! To make this class (%s) picklable, it must be loaded via a regular import statement.s PYGR_ID:%ssUthis object has a local data dependency and cannnot be transferred to a remote client(stypess isinstancesobjsTypeTypes __module__sWorldbaseNoModuleErrors__name__sAttributeErrorsselfsroots sourceIDssidsKeyErrors_persistent_idsNones badClassessklasssWorldbaseNotPortableError(sselfsobjsklassstypes((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys persistent_idŽs* #$ cCs||_||_||_dS(sGset obj as root of pickling tree: genuinely pickle it (not just its id)N(sobjsselfsroots sourceIDss badClasses(sselfsobjs sourceIDss badClasses((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssetRoot¥s  (s__name__s __module__s persistent_idssetRoot(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys PygrPicklers sMetabaseServercBs¿tZdZhdd<dd<dd<dd<dd<ddbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__±s     1 sdefaultcCs{ti|dƒ}xX|iƒD]J\}}|idƒo||i |dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysread_download_db¼s cCs |iSdS(s!return layer name for this serverN(sselfsname(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetNameÅscCs/|o|i|ifSn|i|ifSdS(N(sdownloadsselfs downloadDBs downloadDocssdsdocs(sselfsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_dbÈscCs»|i|ƒ\}}y||}Wntj o dSnX|idƒo:xc|D]+}y||d=WqTtj oqTXqTWn-y||d|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getResourceÍs$  cCsrd}xa|iƒD]S\}\}}||ii|hƒ|<|t j o||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServeràs  cCsXy:|i||=t|i|ƒdjo|i|=nWntj onXdSdS(s:delete the specified resource under the specified locationisN(sselfsdsids locationKeyslensdocssKeyError(sselfsids locationKey((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delResourceésspc CsÛ|i|ƒ\}}|djoti|ƒ}ng}xY|D]Q}|djo |i |ƒp|djo |i |ƒo|i |ƒqBqBW|o5h} x$|D]}|i|hƒ| |return list or dict of resources matching the specified stringsrspN(sselfsget_dbsdownloadsdbsdocss matchTypesrescompilespatternslsnames startswithssearchsappendsasDictsdsget( sselfspatternsasDicts matchTypesdownloadsnamesdbslsdocssd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdiròs  :cCs |iSdS(N(sselfs_pygr_data_version(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_versions(s__name__s __module__s__doc__sxmlrpc_methodss_pygr_data_versionsTruesNones__init__sread_download_dbsgetNamesget_dbsFalses getResourcesregisterServers delResourcesdirs get_version(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysMetabaseServer¬s <    cGstdƒ‚dS(Ns€You cannot save data to a remote XMLRPC server. Give a user-editable resource database as the first entry in your WORLDBASEPATH!(sWorldbaseReadOnlyError(sselfsl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysraise_illegal_savessXMLRPCMetabasecBs_tZdZd„Zed„Zd„Zd„Zdeed„Ze Z e Z e Z e Z RS(s3client interface to remote XMLRPC resource databasecKsPdkl}||dƒ|_||_||_|iiƒ|_t|_ dS(N(sget_connectionsindex( s coordinatorsget_connectionsurlsselfsserversmdbsgetNameszoneNamesFalses writeable(sselfsurlsmdbskwargssget_connection((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ s    cCs¿|o|ii||ƒ}n|ii|ƒ}|djotd|ƒ‚ny|d}|d=Wntj o t }nXx$|i ƒD]\}}||fSq‘Wtd|ƒ‚dS(s9get pickledata,docstring for this resource ID from serverssresource %s not founds__doc__s&unable to find %s from remote servicesN( sdownloadsselfsservers getResourcesidsdsWorldbaseNotFoundErrors docstringsKeyErrorsNonesitemsslocationsobjdata(sselfsidsdownloadsobjdatasds docstringslocation((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resources     cCs|ii||ƒSdS(s"forward registration to the serverN(sselfsserversregisterServers locationKeys serviceDict(sselfs locationKeys serviceDict((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServer#scCsR|iid|ƒ}|djo t‚nx|iƒD] }|Sq:Wt‚dS(sreturn dict of {attr:{args}}sSCHEMA.sN(sselfsservers getResourcesidsdsKeyErrorsvaluess schemaDict(sselfsids schemaDictsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema&s   spcCs>|o|ii||||ƒSn|ii|||ƒSdS(s>return list or dict of resources matching the specified stringN(sdownloadsselfsserversdirspatternsasDicts matchType(sselfspatterns matchTypesasDictsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir.s(s__name__s __module__s__doc__s__init__sFalses find_resourcesregisterServers getschemasdirsraise_illegal_saves __setitem__s __delitem__s setschemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysXMLRPCMetabase s     s MySQLMetabasecBs‰tZdZdddfZeed„Zd„Zed„Zd„Z d„Z d„Z d „Z d „Z d „Zd eed „ZRS(sýTo create a new resource table, call: MySQLMetabase("DBNAME.TABLENAME", mdb, createLayer="LAYERNAME") where DBNAME is the name of your database, TABLENAME is the name of the table you want to create, and LAYERNAME is the layer name you want to assign itiic Ksxdkl}l} ||ƒ\|_|_|_||_t|_ h|_ |id}|t jo |}n|t j oÂtiiƒ}|iid|iƒ|iid|iƒ|iid|id||dfƒ|iid|id d |idfƒ||_|iid|ƒ|iid |ƒnôy#|iid |idfƒ} WnAtj o5tid dd|i|iddfIJ‚nX| djo|iiƒd|_n|iid |idfƒdjo?x(|iiƒD]} t |i | dinsert into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)s0versions%d.%d.%dsycreate table %s (source_id varchar(255) not null,target_id varchar(255),edge_id varchar(255),unique(source_id,target_id))s)select location from %s where pygr_id=%%ssÏ%s Database table %s appears to be missing or has no layer name! To create this table, call worldbase.MySQLMetabase("%s",createLayer=) where is the layer name you want to assign it. %ss!i(is0roots attrAliass source_ids target_idsedge_ids simpleKeyss unpack_edge( ssqlgraphsget_name_cursorsSQLGraphs tablenamesselfscursors serverInfosmdbsTrues writeables rootNamess schemaTables createLayersNonesnewZonesdatetimesnows creation_timesexecutes_pygr_data_versionszoneNamesns StandardErrorssyssstderrsfetchonesfetchallsrowssave_root_namessdicts SchemaEdgesgraph( sselfs tablenamesmdbs createLayersnewZoneskwargss schemaTables creation_timesget_name_cursorsSQLGraphsnsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__AsJ        +  cCs4t|i|<|iid|id|dfƒdS(Ns>insert into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)s0rootsa(sNonesselfs rootNamessnamescursorsexecutes tablename(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_namens cCsZ|iid|i|fƒx*|iiƒD]\}}}||fSq-Wt dƒ‚dS(s:get construction rule from mysql, and attempt to constructs;select location,objdata,docstring from %s where pygr_id=%%ss+unable to construct %s from remote servicesN( sselfscursorsexecutes tablenamesidsfetchallslocationsobjdatas docstringsWorldbaseNotFoundError(sselfsidsdownloadsobjdatas docstringslocation((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourcers c Cs˜t|ƒ}t||ƒ}|iid|i|d|i|i |d|d|d|fƒ|i dƒd}||i jo|i|ƒndS( s'add an object to this resource databasesxreplace into %s (pygr_id,location,docstring,user,creation_time,pickle_size,objdata) values (%%s,%%s,%%s,%%s,%%s,%%s,%%s)smysql:susers creation_times pickle_sizes.iN(sdumpssobjsss get_info_dictsdsselfscursorsexecutes tablenamesids__doc__ssplitsroots rootNamesssave_root_name(sselfsidsobjsdsssroot((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setitem__ys 2cCs>|iid|i|fƒdjotd|ƒ‚ndS(s)delete this resource and its schema ruless delete from %s where pygr_id=%%sisno resource %s in this databaseN(sselfscursorsexecutes tablenamesidsWorldbaseNotFoundError(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delitem__„sc Csvd}xe|iƒD]W\}\}}||iid|i |||d|d|d|d|fƒ7}qW|SdS(s1register the specified services to mysql databaseisxreplace into %s (pygr_id,location,docstring,user,creation_time,pickle_size,objdata) values (%%s,%%s,%%s,%%s,%%s,%%s,%%s)s__doc__susers creation_times pickle_sizeN( sns serviceDictsitemssidsdspdatasselfscursorsexecutes tablenames locationKey(sselfs locationKeys serviceDictsdspdatasnsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServer‰s 3cCsV|idƒ o|d}nt|ƒ}|iid|i d|||fƒdS(s.save a schema binding for id.attr --> targetIDs-stargetIDs?replace into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)sSCHEMA.N( sattrs startswithskwargsstargetIDsdumpsskwdatasselfscursorsexecutes tablenamesid(sselfsidsattrskwargsskwdatastargetID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys setschema’s  cCs(|iid|id||fƒdS(s!delete schema binding for id.attrs1delete from %s where pygr_id=%%s and location=%%ssSCHEMA.N(sselfscursorsexecutes tablenamesidsattr(sselfsidsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema™scCseh}|iid|id|fƒx3|iiƒD]"\}}|i i |ƒ||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemas spc Cs|djo!|iid|i|fƒnF|djo%|iid|i|dfƒn|ohSngSh}xP|iiƒD]?}t d|dd|d d |d d |d ƒ||dreturn list or dict of resources matching the specified stringsrsXselect pygr_id,docstring,user,creation_time,pickle_size from %s where pygr_id regexp %%sspsVselect pygr_id,docstring,user,creation_time,pickle_size from %s where pygr_id like %%ss%s__doc__isuseris creation_timeis pickle_sizeiiN(s matchTypesselfscursorsexecutes tablenamespatternsasDictsdsfetchallslsdictsappends_[1]sname( sselfspatterns matchTypesasDictsdownloadsdsls_[1]sname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir¥s"  =(s__name__s __module__s__doc__s_pygr_data_versionsNones__init__ssave_root_namesFalses find_resources __setitem__s __delitem__sregisterServers setschemas delschemas getschemasdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MySQLMetabase;s -      s SchemaEdgecBs tZdZd„Zd„ZRS(s4provides unpack_edge method for schema graph storagecCs ||_dS(N(sschemaDBsself(sselfsschemaDB((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ÀscCs|ii|ƒdSdS(s/get the actual schema object describing this IDs -schemaEdgeN(sselfsschemaDBs getschemasedgeID(sselfsedgeID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__Âs(s__name__s __module__s__doc__s__init__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys SchemaEdge¾s  sResourceDBGraphDescrcBstZdZd„ZRS(s0this property provides graph interface to schemac CsEtd|iddddtdtdt|ƒƒ}||_|SdS(Nsfilenames_schemasmodescwswriteNows simpleKeyss unpack_edge(sGraphsobjsdbpathsTrues SchemaEdgesgsgraph(sselfsobjsobjtypesg((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__Ès (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysResourceDBGraphDescrÆs sShelveMetabasecBs’tZdZdddfZeƒZded„Zd„Ze d„Z d„Z d„Z d e e d „Z d „Zd „Zd „Zd„ZRS(sfBerkeleyDB-based storage of worldbase resource databases, using the python shelve module. Users will not need to create instances of this class themselves, as worldbase automatically creates one for each appropriate entry in your WORLDBASEPATH; if the corresponding database file does not already exist, it is automatically created for you.iisrcKs)dk}tii|dƒ|_||_t|_t |_ ytt i |i|ƒ|_y|i|idƒWntj onXy|id|_ Wntj onXWnr|ij oct i |idƒ|_|i|idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ös,        cCs)|iiƒti|i|ƒ|_dS(N(sselfsdbsclosesdbfiles shelve_opensdbpathsmode(sselfsmode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysreopenís cCsN|i|}y||id|dfSWntj o|tfSnXdS(s'get an item from this resource databases__doc__.s__doc__N(sselfsdbsresIDsobjdatasKeyErrorsNone(sselfsresIDsdownloadsobjdata((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourceðs  cCs©t|ƒ}|idƒz{||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setitem__÷s     cCs‹|idƒziy|i|=Wn,tj o td||ifƒ‚nXy|id|=Wntj onXWd|idƒXdS(s<delete this item from the database, with a modicum of safetyswsID %s not found in %ss__doc__.Nsr(sselfsreopensdbsresIDsKeyErrorsWorldbaseNotFoundErrorsdbpath(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delitem__s  spcCsÐ|djoti|ƒ}ng}x\|iD]Q}|djo |i|ƒp|djo |i |ƒo|i |ƒq0q0W|o<h}x+|D]#}|ii d|tƒ||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirs  :!cCsq|idƒ o|d}n|idƒ|iid|hƒ}|||<||id|<|idƒdS(s1save a schema binding for resID.attr --> targetIDs-stargetIDswsSCHEMA.srN( sattrs startswithskwargsstargetIDsselfsreopensdbsgetsresIDsd(sselfsresIDsattrskwargssdstargetID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys setschema#s  cCs|id|SdS(sreturn dict of {attr:{args}}sSCHEMA.N(sselfsdbsresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema,scCsG|idƒ|id|}||=||id|<|idƒdS(s$delete schema binding for resID.attrswsSCHEMA.srN(sselfsreopensdbsresIDsdsattr(sselfsresIDsattrsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema/s  cCs|iiƒdS(s#close the shelve file when finishedN(sselfsdbsclose(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__del__6s(s__name__s __module__s__doc__s_pygr_data_versionsResourceDBGraphDescrsgraphsNones__init__sreopensFalses find_resources __setitem__s __delitem__sdirs setschemas getschemas delschemas__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysShelveMetabaseÎs        cKs@tƒ}t|ƒ}|i|||i|ƒ|iƒSdS(s.pickle to string, using persistent ID encodingN( sStringIOssrcs PygrPicklerspicklerssetRootsobjskwargssdumpsgetvalue(sobjskwargsssrcspickler((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdumps=s    cCsjtdtiiƒdt|ƒd|iƒ}yti d|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_info_dictEss MetabaseBasecBs¶tZd„Zd„Zd„Zeed„Zd„Zed„Z d„Z d„Z d „Z d „Z d „Zed „Zd „Zd„Zd„Zd„Zd„Zd„ZRS(NcCs6|idƒo||dƒSntid|‚dS(s<check for PYGR_ID:... format and return the requested objectsPYGR_ID:isInvalid persistent ID %sN(spersids startswithsselfspicklesUnpicklingError(sselfspersid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyspersistent_loadPscCs»|i|ƒ}||_t|dƒo|io[|ii }|i ƒ}|i ||ƒt|_|otid|IJq–|iƒn ||_||i|<|i||ƒ|SdS(s.load the pickled data and all its dependenciess_saveLocalBuildsdSaving new resource %s to local worldbase... You must use worldbase.commit() to commit! You are seeing this message because you appear to be in the middle of a worldbase transaction. Ordinarily worldbase would automatically commit this new downloaded resource, but doing so now would also commit your pending transaction, which you may not be ready to do!N(sselfsloadssobjdatasobjs docstrings__doc__shasattrs_saveLocalBuildswriterssavers has_pendings hasPendings add_resourcesresIDsFalsessyssstderrs save_pendings_persistent_ids resourceCaches bind_schema(sselfsresIDsobjdatas docstringsobjs hasPendingssaver((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysloadVs      cCs;t|ƒ}ti|ƒ}|i|_|iƒ}|SdS(s3unpickle from string, using persistent ID expansionN( sStringIOsdatassrcspickles Unpicklers unpicklersselfspersistent_loadsloadsobj(sselfsdatassrcsobjs unpickler((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysloadsos    c Os&y|i|SWntj onX|i} |i}|tj o ||_n|tj o ||_n |i}z‡|i d|idt ƒxg|i ||ƒD]S\}}y|i|||ƒ} PWq£ttfj o|io‚qöq£Xq£WWd| |_||_X| |i|<| SdS(s8get the requested resource ID by searching all databasessdebugskeepCurrentPathN(sselfs resourceCachesresIDsKeyErrorsdebugs debug_statesdownloadsdownload_statesNonesupdatesTrues find_resourcesobjdatasdocstrsloadsobjsIOError( sselfsresIDsdebugsdownloadsargsskwargssobjdatasdocstrsdownload_statesobjs debug_state((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__vs6            cCs†y|i|ƒ}Wntj o dSnX||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys bind_schema’s  cKsîy|i|SWnttfj onX|o%t|dƒ}t|||}nt|ƒ}t |||}t |||ƒ|o=yt|dƒ}Wntj oqÉXt |||ƒn|djot|dtƒndS(s=create a descriptor for the attr on the appropriate obj classs itemClasssitemSliceClasss inverseDBs __invert__N(sobjs_ignoreShadowAttrsattrsAttributeErrorsKeyErrorsitemRulesget_bound_subclasss targetClasssItemDescriptorsselfskwargssdescrsOneTimeDescriptorssetattrsaddSpecialMethods getInverseDB(sselfsobjsattrsitemRuleskwargssdescrs targetClass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys bind_propertyœs&  cCs›y|ii|}Wn2tj o&|i|ƒ}||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_schema_attr²s cCs$t|i|ƒt|i|ƒdS(s?add name to the root of our data namespace and schema namespaceN(sgetattrsselfsDatasnamesSchema(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_root_nameÀscCs"x|D]}|i|ƒqWdS(s&add set of names to our namespace rootN(s rootNamessnamesselfs add_root_name(sselfs rootNamessname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_namesÄscCs|iiƒdS(sclear all resources from cacheN(sselfs resourceCachesclear(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys clear_cacheÈscCs1y |iSWntj otdƒ‚nXdS(s5return writeable mdb if available, or raise exceptionsthis metabase is read-only!N(sselfswritersAttributeErrorsWorldbaseReadOnlyError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_writerËs  cCsD|tjo|iƒii|ƒn|iƒii||ƒdS(s´assign obj as the specified resource ID to our metabase. if obj is None, treat resID as a dictionary whose keys are resource IDs and values are the objects to save.N(sobjsNonesselfs get_writerssaversadd_resource_dictsresIDs add_resource(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_resourceÑs cCs|iƒii|ƒdS(s.delete specified resource ID from our metabaseN(sselfs get_writerssaversdelete_resourcesresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdelete_resourceÙscCs|iƒiiƒdS(s1save any pending resource assignments and schemasN(sselfs get_writerssavers save_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscommitÜscCs|iƒiiƒdS(s4discard any pending resource assignments and schemasN(sselfs get_writerssaversrollback(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysrollbackßscCs |iƒii|||ƒdS(s5add a schema to the list of pending schemas to commitN(sselfs get_writerssaversqueue_schema_objs schemaPathsattrs schemaObj(sselfs schemaPathsattrs schemaObj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysqueue_schema_objâscCsC|idƒ}t|di|d ƒƒ}t||d|ƒdS(s<assign a schema relation object to a worldbase resource names.iÿÿÿÿN( sresIDssplitsls SchemaPathsselfsjoins schemaPathssetattrs schemaObj(sselfsresIDs schemaObjsls schemaPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_schemaåscCs|iƒiiƒSdS(N(sselfs get_writerssavers list_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys list_pendingês(s__name__s __module__spersistent_loadsloadsloadssNones__call__s bind_schemasFalses bind_propertysget_schema_attrs add_root_namessave_root_namess clear_caches get_writers add_resourcesdelete_resourcescommitsrollbacksqueue_schema_objs add_schemas list_pending(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MetabaseBaseOs$               sMetabasecBswtZeed„Zeeed„Zed„Zd„Zd„Zd„Z d„Z d„Z d d eed „Z RS( NcKs`||_t|ƒ|_t|ƒ|_||_t|_t |_ |t jo h}n|idƒo1t|||}d|jo||dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ðsL        <          cCs| otdƒ‚ndS(Ns(You cannot change the path of a Metabase(skeepCurrentPaths ValueError(sselfs worldbasePathsdebugskeepCurrentPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysupdatesccs|ii||ƒVdS(N(sselfsstorages find_resourcesresIDsdownload(sselfsresIDsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourcescKs9y|ii|SWntj onX|||SdS(s8find resID even if only pending (not actually saved yet)N(sselfssavers pendingDatasresIDsKeyErrorskwargs(sselfsresIDskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_pending_or_find!s cCs|ii|ƒSdS(s5return dict of {attr:{args}} or KeyError if not foundN(sselfsstorages getschemasresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema(scCs8|itj o|ii|ƒnti||ƒdS(N(sselfsparentsNonessave_root_namess rootNamess MetabaseBase(sselfs rootNames((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_names+scCs|ii|||ƒdS(stsave an attribute binding rule to the schema; DO NOT use this internal interface unless you know what you are doing!N(sselfsstorages setschemasresIDsattrsargs(sselfsresIDsattrsargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchema/scCsL|i|id|ƒ|ii|i7_|i|ii|i|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssaveSchemaEdge2ssspcCs#|ii||d|d|ƒSdS(NsasDictsdownload(sselfsstoragesdirspatterns matchTypesasDictsdownload(sselfspatterns matchTypesasDictsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir7s( s__name__s __module__sNones__init__sFalsesupdates find_resourcesget_pending_or_finds getschemassave_root_namess saveSchemassaveSchemaEdgesdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysMetabaseïs,      sZoneDictcBs2tZdZd„Zd„Zd„Zd„ZRS(sinterface to current zonescCs ||_dS(N(smdbListsself(sselfsmdbList((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__>scCs%|iidtƒ|ii|SdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictszoneName(sselfszoneName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getitem__@scCs'|iidtƒ|iiiƒSdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyskeysCscCs'|iidtƒ|iiiƒSdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictscopy(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscopyFs(s__name__s __module__s__doc__s__init__s __getitem__skeysscopy(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysZoneDict<s    s MetabaseListcBs•tZdZdddgZeedhd„Zd„Zed„Zd„Z eeeed „Z d „Z d „Z d „Z d deed„ZRS(sPrimary interface for worldbase resource database access. A single instance of this class is created upon import of the worldbase module, accessible as worldbase.getResource. Users normally will have no need to create additional instances of this class themselves.s~s.s*http://biodb2.bioinformatics.ucla.edu:5000s,cCs¥|tjo tƒ}n||_t|_||_h|_t|ƒ|_||_ ||_ t |ƒ|_ t |d|iƒ|_t|_t|_t|_dS(s0initializes attrs; does not connect to metabasesszonesN(s resourceCachesNones ResourceCachesselfsmdbsmdbArgsszoneDictsZoneDictszoness worldbasePaths separators SchemaPathsSchemas ResourceRootsDatasFalsesdebugsdownloadsready(sselfs worldbasePaths resourceCaches separatorsmdbArgs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Qs          cCs!|idtƒti|ƒSdS(s?ensure that metabases are loaded, before looking for our writerskeepCurrentPathN(sselfsupdatesTrues MetabaseBases get_writer(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_writerasccsXxA|iD]6}y|i||ƒiƒVWq tj oq Xq Wtd|ƒ‚dS(s;search our metabases for pickle string and docstr for resIDs"unable to find %s in WORLDBASEPATHN(sselfsmdbs find_resourcesresIDsdownloadsnextsKeyErrorsWorldbaseNotFoundError(sselfsresIDsdownloadsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourcees  cCsaytidSWnKtj o?ytidSWq]tj o|ii|iƒSq]XnXdS(s-get environment var, or default in that orders WORLDBASEPATHs PYGRDATAPATHN(sossenvironsKeyErrorsselfs separatorsjoins defaultPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_worldbase_pathmscCsÃ|o |i}n|tjo|iƒ}n|tjo |i}n|tjo |i}n|i p |i|jo?||_y |`Wnt j onXg|_ y |`Wnt j onXh|_ xÔ|i |i ƒD]À}y"t||i|i ||}Wn]ttfj o ‚qî|o‚q®dk}|idtiƒtid|IJqîX|i i|ƒ|iot|dƒ o ||_qîqîWt|_ndS(s)get the latest list of resource databasesNi s5 WARNING: error accessing metabase %s. Continuing...swriter(skeepCurrentPathsselfs worldbasePathsNonesget_worldbase_pathsdebugsmdbArgssreadyswritersAttributeErrorsmdbszoneDictssplits separatorsdbpathsMetabases resourceCachesKeyboardInterrupts SystemExits tracebacks print_excssyssstderrsappends writeableshasattrsTrue(sselfs worldbasePathsdebugskeepCurrentPathsmdbArgssdbpaths tracebacksmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysupdatevsJ           " cKsMx9|iD].}y|ii|SWq tj oq Xq W|||SdS(s8find resID even if only pending (not actually saved yet)N(sselfsmdbssavers pendingDatasresIDsKeyErrorskwargs(sselfsresIDskwargssmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_pending_or_find£s  cCskxX|iD]M}t|idƒo4|ii||ƒ}|t|ƒjo|SqWq q Wt dƒ‚dS(sEregister the serviceDict with the first index server in WORLDBASEPATHsregisterServers1unable to register services. Check WORLDBASEPATHN( sselfsmdbshasattrsstoragesregisterServers locationKeys serviceDictsnslens ValueError(sselfs locationKeys serviceDictsmdbsn((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServer«s cCsOx8|iD]-}y|i|ƒSWq tj oq Xq Wtd|ƒ‚dS(s@search our resource databases for schema info for the desired IDsno schema info available for N(sselfsmdbs getschemasresIDsKeyError(sselfsresIDsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema³s  sspc CsÑ|idtƒg}x6|iD]+}|i|i||d|d|ƒƒq W|o6h}|i ƒx|D]} |i| ƒqmW|SnBh}x|D]}t|i|ƒq™W|iƒ}|iƒ|SdS(sAget list or dict of resources beginning with the specified stringskeepCurrentPathsasDictsdownloadN(sselfsupdatesTruesresultssmdbsappendsdirspatterns matchTypesasDictsdownloadsdsreversessubdirslsfilters setdefaultskeysssort( sselfspatterns matchTypesasDictsdownloadsdsmdbsresultsslssubdir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir»s*    (s__name__s __module__s__doc__s defaultPathsNones__init__s get_writersFalses find_resourcesget_worldbase_pathsupdatesget_pending_or_findsregisterServers getschemasdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MetabaseListJs    -   s ResourceCachecBs tZdZd„Zd„ZRS(s@provide one central repository of loaded resources & schema infocCsti|ƒh|_dS(N(sdicts__init__sselfs schemaCache(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Òs cCsti|ƒ|iiƒdS(N(sdictsclearsselfs schemaCache(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysclearÕs (s__name__s __module__s__doc__s__init__sclear(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceCacheÐs  s ResourceSavercBs•tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„ZRS(s/queues new resources until committed to our mdbcCs|iƒ||_dS(N(sselfs clear_pendingsmdb(sselfsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ûs cCs1h|_h|_h|_h|_h|_dS(N(sselfs pendingDatas pendingSchemaslastDatas lastSchemas rollbackData(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys clear_pendingÞs     cCsmyG|itjp&t|idƒo|i|iijo t‚nWntj otdƒ‚nXdS(sFenforce requirement for docstring, by raising exception if not presents__doc__sUto save a resource object, you MUST give it a __doc__ string attribute describing it!N(sobjs__doc__sNoneshasattrs __class__sAttributeErrors ValueError(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscheck_docstringäs 9cCsh|i|ƒ||_||i|N( sselfscheck_docstringsobjsresIDs_persistent_ids pendingDatasmdbs resourceCaches rollbackDatasKeyErrorscache_if_appropriate(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_resourceìs   cCs@y|iodSnWntj onX||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscache_if_appropriateös   cCs1x*|iƒD]\}}|i||ƒq WdS(s8queue a dict of name:object pairs for saving to metabaseN(sdsitemssksvsselfs add_resource(sselfsdsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysadd_resource_dictýs cCs)|i|ƒ}|||f|i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysqueue_schema_objscCsU|i|ƒ|i|jotd|ƒ‚n||ii|<|i||ƒdS(ssave the object as s½The _persistent_id attribute for %s has changed! If you changed it, shame on you! Otherwise, this should not happen, so report the reproducible steps to this error message as a bug report.N( sselfscheck_docstringsobjs_persistent_idsresIDsWorldbaseMismatchErrorsmdbsstoragescache_if_appropriate(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys save_resources  cCs-t|iƒdjpt|iƒdjSdS(s:return True if there are resources pending to be committediN(slensselfs pendingDatas pendingSchema(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys has_pendingscCsÑt|iƒdjpt|iƒdjo|i}|i}n tdƒ‚x*|iƒD]\}}|i ||ƒq[Wx3|i ƒD]%\}}}|i|||iƒqˆW|iƒ||_||_dS(s/save any pending worldbase resources and schemais#there is no data queued for saving!N(slensselfs pendingDatas pendingSchemasds schemaDictsWorldbaseEmptyErrorsitemssresIDsobjs save_resourcesvaluess schemaPathsattrs schemaObjs saveSchemasmdbs clear_pendingslastDatas lastSchema(sselfsresIDsds schemaObjs schemaDicts schemaPathsobjsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys save_pendings,       cCs t|iƒt|iƒfSdS(s7return tuple of pending data dictionary, pending schemaN(slistsselfs pendingDatas pendingSchema(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys list_pendingscCs`t|iƒdjot|iƒdjotdƒ‚n|iii|iƒ|i ƒdS(s@dump any pending data without saving, and restore state of cacheis#there is no data queued for saving!N( slensselfs pendingDatas pendingSchemasWorldbaseEmptyErrorsmdbs resourceCachesupdates rollbackDatas clear_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysrollback"s ,cCsi|ii|=y|ii|=Wntj onXy|i|=Wntj onX|i|ƒdS(sBdelete the specified resource from resourceCache, saver and schemaN(sselfsmdbsstoragesresIDs resourceCachesKeyErrors pendingDatas delSchema(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdelete_resource(s cCsž|ii}y|i|ƒ}Wntj o dSnX|iiii ƒxK|i ƒD]=\}}|i dƒo|i|ƒn|i||ƒqYWdS(s3delete schema bindings TO and FROM this resource IDNs-(sselfsmdbsstorages getschemasresIDsdsKeyErrors resourceCaches schemaCachesclearsitemssattrsobjs startswiths delschema(sselfsresIDsdsstoragesobjsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delSchema0s   cCs5y|iƒtidIJWntj onXdS(Ns WARNING: saving worldbase pending data that you forgot to save... Remember in the future, you must issue the command worldbase.commit() to save your pending worldbase resources to your resource database(s), or alternatively worldbase.rollback() to dump those pending data without saving them. It is a very bad idea to rely on this automatic attempt to save your forgotten data, because it is possible that the Python interpreter may never call this function at exit (for details see the atexit module docs in the Python Library Reference).(sselfs save_pendingssyssstderrsWorldbaseEmptyError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__del__<s   (s__name__s __module__s__doc__s__init__s clear_pendingscheck_docstrings add_resourcescache_if_appropriatesadd_resource_dictsqueue_schema_objs save_resources has_pendings save_pendings list_pendingsrollbacksdelete_resources delSchemas__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceSaverÙs             sResourceServercBs2tZdZeeeeeed„Zd„ZRS(s2serves resources that can be transmitted on XMLRPCc !KsKti||| ||_|tjo |i}n|tjo#dk l }l }||g}n|tjo¯dkl}l}l}l}l}l}l}|||f|||f|||fg}y:dkl}dkl}l}|i|||fƒWq"tj oq"Xn|tjo |i}nh}x¶|i ƒD]¨\} }t#} x)|D]!}t&||ƒo t'} PqhqhW| oqOnt'} xC|D];\} }}t&|| ƒot&||ƒ o t#} Pq¨q¨W| o:y|i+|| |dt,ƒWqOt-j oqOXqOny ||_.WnAt/j o5|i0ƒ}|i2|ƒ} | i4|ƒ| }nXy|i5||i6| ƒWn2t7j o&d||i6f|_8| |_nX||_.|i+|| |ƒ||_.||| d d d | ƒnd S( s+construct server for the designated classes(s SQLTableBasesSQLGraphClustered(sSequenceFileDBsBlastDBsXMLRPCSequenceDBs BlastDBXMLRPCs AnnotationDBsAnnotationClientsAnnotationServer(sNLMSA(s NLMSAClients NLMSAServers badClassess http://%s:%dsreadOnlys downloadDBsindexssserverN(?sXMLRPCServerBases__init__sselfsnameskwargssmdbs resourceDictsNones resourceCachesexcludeClassesssqlgraphs SQLTableBasesSQLGraphClustereds serverClassessseqdbsSequenceFileDBsBlastDBsXMLRPCSequenceDBs BlastDBXMLRPCs AnnotationDBsAnnotationClientsAnnotationServers cnestedlistsNLMSAs xnestedlists NLMSAClients NLMSAServersappends ImportErrors clientHostshosts clientDictsitemssidsobjsFalsesskipThiss skipClasss isinstancesTrues baseKlasss clientKlasss serverKlasssclient_dict_setitemsnonPortableClassessWorldbaseNotPortableErrors __class__s TypeErrors __getstate__sstates__new__snewobjs __setstate__s saveHostInfosportsAttributeErrorsurlsregistrationDatas withIndexsMetabaseServers downloadDBsmyIndexsregister(!sselfsmdbsnames serverClassess clientHosts withIndexsexcludeClassess downloadDBs resourceDictskwargss baseKlasssmyIndexsnewobjsidsstates NLMSAClients clientKlasssBlastDBsSequenceFileDBs BlastDBXMLRPCsXMLRPCSequenceDBs skipClasssNLMSAs serverKlasss clientDictsobjsAnnotationServersAnnotationClients AnnotationDBsSQLGraphClustereds NLMSAServers SQLTableBasesskipThis((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ns€     1*      !           cKsot||}t||ƒ|f||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysclient_dict_setitem’s-(s__name__s __module__s__doc__sNonesTrues__init__sclient_dict_setitem(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysResourceServerLs Ds ResourcePathcBsVtZdZed„Zd„Zd„Zd„Zd„Zd„Z eed„Z RS(sCsimple way to read resource names as python foo.bar.bob expressionscCs||id<||idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ s cCs+|itj o|id|Sn|SdS(Ns.(sselfs_pathsNonesname(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetPath£scCs3|i|i|i|ƒƒ}||i|<|SdS(s.extend the resource path by one more attributeN(sselfs _pathClasss_mdbsgetPathsnamesattrs__dict__(sselfsnamesattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getattr__¨s cOs|i|i||ŽSdS(s construct the requested resourceN(sselfs_mdbs_pathsargsskwargs(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__®scCs |ii|i|ƒ|ƒdS(s*save obj using the specified resource nameN(sselfs_mdbs add_resourcesgetPathsnamesobj(sselfsnamesobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setattr__±scCsA|ii|i|ƒƒy|i|=Wntj onXdS(N(sselfs_mdbsdelete_resourcesgetPathsnames__dict__sKeyError(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delattr__´s cCs“|tjo t|iƒd}|i}n|ii|ƒ}h}x=|D]5}|i |ƒot|||i dƒdbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__dir__ºs  #( s__name__s __module__s__doc__sNones__init__sgetPaths __getattr__s__call__s __setattr__s __delattr__s__dir__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourcePathžs       s ResourceRootcBs/tZdZeed„Zd„Zd„ZRS(s(provide proxy to public metabase methodsc Cs‡ti|||ƒ|i|id<|tj o||idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__És "cOs|i|||ŽSdS(s Construct the requested resourceN(sselfs_mdbsresIDsargsskwargs(sselfsresIDsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__ÒscCsti|ddƒSdS(Nsi(s ResourcePaths__dir__sself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__dir__Õs(s__name__s __module__s__doc__sNones__init__s__call__s__dir__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceRootÇs  s ResourceZonecBs tZdZd„Zd„ZRS(s7provide pygr.Data old-style interface to resource zonescCs||_||_dS(N(smdbsselfs _mdbParentszoneNames _zoneName(sselfsmdbszoneName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ús cCs‹|iidtƒy|ii|i}Wn&tj otd|iƒ‚nX|djot i ||ƒSnt i |||ƒSdS(NskeepCurrentPathsno zone "%s" availablesschema( sselfs _mdbParentsupdatesTrueszoneDicts _zoneNamesmdbsKeyErrors ValueErrorsnames SchemaPaths __getitem__s ResourcePath(sselfsnamesmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getattr__Ýs (s__name__s __module__s__doc__s__init__s __getattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceZoneØs  s SchemaPathcBs tZdZd„Zd„ZRS(s&save schema information for a resourcecCsGy |iWntj otdƒ‚nX|ii|||ƒdS(Nsnot a valid schema object!(sschemas saveSchemasAttributeErrors ValueErrorsselfs_mdbsqueue_schema_objsname(sselfsnamesschema((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setattr__ês  cCstdƒ‚dS(Ns'schema deletion is not yet implemented.(sNotImplementedError(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delattr__ðs(s__name__s __module__s__doc__s __setattr__s __delattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys SchemaPathès  sDirectRelationcBs)tZdZd„Zd„Zd„ZRS(sbind an attribute to the targetcCst|ƒ|_dS(N(sgetIDstargetsselfstargetID(sselfstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__÷scCstd|iƒSdS(NstargetID(sdictsselfstargetID(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys schemaDictùscKsk|iƒ}|i|ƒyt|dƒ|d<|d=Wntj onX|it|ƒ||ƒdS(NstargetDBstargetID( sselfs schemaDictsdsupdateskwargssgetIDsKeyErrorsmdbs saveSchemassourcesattr(sselfssourcesattrsmdbskwargssd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaûs   (s__name__s __module__s__doc__s__init__s schemaDicts saveSchema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysDirectRelationõs   s ItemRelationcBstZdZd„ZRS(s!bind item attribute to the targetcCstd|idtƒSdS(NstargetIDsitemRule(sdictsselfstargetIDsTrue(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys schemaDicts(s__name__s __module__s__doc__s schemaDict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ItemRelations sManyToManyRelationcBsDtZdZdZeeeed„Zd„Zd„Zd„ZRS(s@a general graph mapping from sourceDB -> targetDB with edge infos many:manycCsˆt|ƒ|_t|ƒ|_|tj ot|ƒ|_n t|_||_|tj o ||_n|tj o ||_ndS(N( sgetIDssourceDBsselfstargetDBsedgeDBsNones bindAttrss sourceNotNones targetNotNone(sselfssourceDBstargetDBsedgeDBs bindAttrss sourceNotNones targetNotNone((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ s      cCs§|i|ƒ}||_|i|ƒt|iƒ}|i |d|ƒt|i ƒ}|i |d|ƒ|i t j o&t|i ƒ}|i |d|ƒn|SdS(sNsave standard schema bindings to graphDB attributes sourceDB, targetDB, edgeDBssourceDBstargetDBsedgeDBN(sgraphDBsgetPathsattrsselfsnamesmdbssaveSchemaEdgesDirectRelationssourceDBsbs saveSchemastargetDBsedgeDBsNone(sselfsgraphDBsattrsmdbsb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_graph_bindingss  c Cs|i|||ƒ}|itj oæ|i|i |i f}ht dt ƒt dt ƒg}y|i|ƒiƒ|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchema's! * cCs|itj o||i|i|if}xatdƒD]O}t |iƒ|jo|i|tj o|i |||i|ƒq5q5WndS(s<delete resource attribute bindings associated with this ruleiN( sselfs bindAttrssNonessourceDBstargetDBsedgeDBsbindObjsrangesislens resourceDBs delschema(sselfs resourceDBsbindObjsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema6s *( s__name__s __module__s__doc__s _relationCodesNones__init__ssave_graph_bindingss saveSchemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysManyToManyRelation s  sOneToManyRelationcBstZdZRS(Nsone:many(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneToManyRelation>ssOneToOneRelationcBstZdZRS(Nsone:one(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneToOneRelationAssManyToOneRelationcBstZdZRS(Nsmany:one(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysManyToOneRelationDssInverseRelationcBs&tZdZdZd„Zd„ZRS(s7bind source and target as each other's inverse mappingssinversecKsg|i|ƒ}||_|i|ƒti||d||t|ƒ}|i|i d||dS(s.save schema bindings associated with this rules inverseDBN( ssourcesgetPathsattrsselfsnamesmdbssaveSchemaEdgesDirectRelations saveSchemaskwargssbstargetID(sselfssourcesattrsmdbskwargssb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaJs    cCs|i|idƒdS(Ns inverseDB(s resourceDBs delschemasselfstargetID(sselfs resourceDB((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschemaTs(s__name__s __module__s__doc__s _relationCodes saveSchemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysInverseRelationGs  cCsdt|tƒo|SnIt|tƒo |iSn.y |iSWntj otdƒ‚nXdS(s7get persistent ID of the object or raise AttributeErrorsthis obj has no persistent ID!N(s isinstancesobjsstrs ResourcePaths_paths_persistent_idsAttributeError(sobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetIDWs  (GsosspicklessyssresdatetimesUserDictsStringIOsmappings CollectionsMappingsGraphs classutilsstandard_invertsget_bound_subclasssSourceFileNames coordinatorsXMLRPCServerBasesdbfilesnonPortableClassess NameErrorsobjectsOneTimeDescriptorsItemDescriptorsItemDescriptorRWsForwardingDescriptorsSpecialMethodDescriptorsaddSpecialMethods getInverseDBs ValueErrorsWorldbaseNotPortableErrorsKeyErrorsWorldbaseNotFoundErrorsWorldbaseMismatchErrorsWorldbaseEmptyErrorsWorldbaseReadOnlyErrorsWorldbaseSchemaErrors PickleErrorsWorldbaseNoModuleErrorsPicklers PygrPicklersMetabaseServersraise_illegal_savesXMLRPCMetabases MySQLMetabases SchemaEdgesResourceDBGraphDescrsShelveMetabasesdumpss get_info_dicts MetabaseBasesMetabases DictMixinsZoneDicts MetabaseListsdicts ResourceCaches ResourceSaversResourceServers ResourcePaths _pathClasss ResourceRoots ResourceZones SchemaPathsDirectRelations ItemRelationsManyToManyRelationsOneToManyRelationsOneToOneRelationsManyToOneRelationsInverseRelationsgetID(;sOneTimeDescriptorsItemDescriptorRWsGraphsstandard_invertsWorldbaseNotPortableErrorsdatetimesXMLRPCServerBases ItemRelationsWorldbaseEmptyErrorsManyToManyRelationsraise_illegal_saves ResourceSaversMetabaseServersMetabases PygrPicklersForwardingDescriptorsOneToOneRelationsXMLRPCMetabasesDirectRelationsnonPortableClassessInverseRelationsMappings Collectionsres getInverseDBsResourceServersWorldbaseReadOnlyErrorsWorldbaseNotFoundErrorsManyToOneRelations MetabaseListsShelveMetabases ResourceRootsdbfiles get_info_dicts SchemaEdgesUserDicts SchemaPathssyssSpecialMethodDescriptorsgetIDsSourceFileNamesWorldbaseSchemaErrorspickles ResourceZonesOneToManyRelationsItemDescriptorsStringIOsossWorldbaseNoModuleErrors ResourcePathsWorldbaseMismatchErrorsdumpss MetabaseBasesZoneDictsResourceDBGraphDescrs ResourceCachesget_bound_subclasssaddSpecialMethods MySQLMetabase((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys?sl6   '    Y 1ƒo   M† sR'  4PK Œ.;@ ±$ÈQÈQpygr/metabase.pyo;ò !¨Jc@s5dkZdkZdkZdkZdkZdkZdklZdklZl Z l Z dk l Z l Z lZdklZdkZyeWnej oegZnXdefd„ƒYZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZ defd„ƒYZ!defd„ƒYZ"defd„ƒYZ#dei$fd„ƒYZ%dei&fd „ƒYZ'd!efd"„ƒYZ(d#„Z)d$efd%„ƒYZ*d&efd'„ƒYZ+d(efd)„ƒYZ,d*efd+„ƒYZ-d,efd-„ƒYZ.d.„Z/d/„Z0d0efd1„ƒYZ1d2e1fd3„ƒYZ2d4ei3fd5„ƒYZ4d6e1fd7„ƒYZ5d8e6fd9„ƒYZ7d:efd;„ƒYZ8d<efd=„ƒYZ9d>efd?„ƒYZ:e:e:_;d@e:fdA„ƒYZ<dBefdC„ƒYZ=dDe:fdE„ƒYZ>e>e>_;dFefdG„ƒYZ?dHe?fdI„ƒYZ@dJefdK„ƒYZAdLeAfdM„ƒYZBdNeAfdO„ƒYZCdPeAfdQ„ƒYZDdRe?fdS„ƒYZEdT„ZFdS(UN(sStringIO(s CollectionsMappingsGraph(sstandard_invertsget_bound_subclasssSourceFileName(sXMLRPCServerBasesOneTimeDescriptorcBs tZdZd„Zd„ZRS(s)provides shadow attribute based on schemacKs||_||_dS(N(sattrNamesselfsattrsmdb(sselfsattrNamesmdbskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__s cCs_y |i}Wntj otdƒ‚nX|ii||iƒ}||i |i<|SdS(Ns8attempt to access worldbase attr on non-worldbase object( sobjs_persistent_idsresIDsAttributeErrorsselfsmdbsget_schema_attrsattrstargets__dict__(sselfsobjsobjtypesresIDstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__s (s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneTimeDescriptors  sItemDescriptorcBs8tZdZeeeeed„Zd„Zd„ZRS(s<provides shadow attribute for items in a db, based on schemac KsC||_||_||_||_||_||_||_dS(N( sattrNamesselfsattrsmdbsinvertsgetEdgessmapAttrs targetAttrs uniqueMapping( sselfsattrNamesmdbsinvertsgetEdgessmapAttrs targetAttrs uniqueMappingskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__s      cCs~y|ii}Wntj otdƒ‚nX|ii||iƒ}|i o |}n|i o |i }n|SdS(s2return the mapping object for this schema relations8attempt to access worldbase attr on non-worldbase objectN( sobjsdbs_persistent_idsresIDsAttributeErrorsselfsmdbsget_schema_attrsattrs targetDictsinvertsgetEdgessedges(sselfsobjsresIDs targetDict((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_target(s    cCsœ|i|ƒ}|itj o5t||iƒ}|tjotSn||}n ||}|i tj ot||i ƒ}n||i |i <|SdS(N( sselfs get_targetsobjs targetDictsmapAttrsNonesgetattrsobj_idsresults targetAttrs__dict__sattr(sselfsobjsobjtypes targetDictsobj_idsresult((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__4s  (s__name__s __module__s__doc__sFalsesNones__init__s get_targets__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysItemDescriptors  sItemDescriptorRWcBstZd„ZRS(NcCsH|i otdƒ‚n|i|ƒ}|||<||i|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__set__Es   (s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysItemDescriptorRWDssForwardingDescriptorcBs tZdZd„Zd„ZRS(s;forward an attribute request to item from another containercCs||_||_dS(N(stargetDBsselfsattr(sselfstargetDBsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ps cCs$|i|i}t||iƒSdS(N(sselfstargetDBsobjsidstargetsgetattrsattr(sselfsobjsobjtypestarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__Ss(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysForwardingDescriptorNs  sSpecialMethodDescriptorcBs tZdZd„Zd„ZRS(s4enables shadowing of special methods like __invert__cCs ||_dS(N(sattrNamesselfsattr(sselfsattrName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__YscCsEy|i|iSWn,tj o td||ifƒ‚nXdS(Ns%s has no method %s(sobjs__dict__sselfsattrsKeyErrorsAttributeError(sselfsobjsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__[s(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysSpecialMethodDescriptorWs  cCs–dk}|i|||iƒ}y"t||ƒ|jodSnWntj onXtd|ƒ‚t |||ƒt |i|t |ƒƒdS(s‚bind function f as special method attr on obj. obj cannot be an builtin or extension class (if so, just subclass it)Ns(%s already bound to a different function( snewsinstancemethodsfsobjs __class__smsgetattrsattrsAttributeErrorssetattrsSpecialMethodDescriptor(sobjsattrsfsmsnew((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysaddSpecialMethodas  cCs |iSdS(s default shadow __invert__ methodN(sselfs inverseDB(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getInverseDBqssWorldbaseNotPortableErrorcBstZdZRS(s_indicates that object has a local data dependency and cannnot be transferred to a remote client(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNotPortableErrorvs sWorldbaseNotFoundErrorcBstZdZRS(s\unable to find a loadable resource for the requested worldbase identifier from WORLDBASEPATH(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNotFoundErrorys sWorldbaseMismatchErrorcBstZdZRS(sL_persistent_id attr on object no longer matches its assigned worldbase ID?!?(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseMismatchError|s sWorldbaseEmptyErrorcBstZdZRS(sFuser hasn't queued anything, so trying to save or rollback is an error(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseEmptyErrors sWorldbaseReadOnlyErrorcBstZdZRS(s6attempt to write data to a read-only resource database(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseReadOnlyError‚s sWorldbaseSchemaErrorcBstZdZRS(sIattempt to set attribute to an object not in the database bound by schema(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseSchemaError…s sWorldbaseNoModuleErrorcBstZdZRS(s6attempt to pickle a class from a non-importable module(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNoModuleError‰s s PygrPicklercBs tZd„Zhfd„ZRS(NcCs)dk}y>t||iƒo |idjotd|iƒ‚nWntj onXyzt||iƒ o ||i j oRyd|i t |ƒSWqÖt j o&|i tj od|i SqÒqÖXnWntj onXx1|iD]&}t||ƒotdƒ‚q÷q÷WtSdS(sFconvert objects with _persistent_id to PYGR_ID strings during picklingNs__main__s}You cannot pickle a class from __main__! To make this class (%s) picklable, it must be loaded via a regular import statement.s PYGR_ID:%ssUthis object has a local data dependency and cannnot be transferred to a remote client(stypess isinstancesobjsTypeTypes __module__sWorldbaseNoModuleErrors__name__sAttributeErrorsselfsroots sourceIDssidsKeyErrors_persistent_idsNones badClassessklasssWorldbaseNotPortableError(sselfsobjsklassstypes((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys persistent_idŽs* #$ cCs||_||_||_dS(sGset obj as root of pickling tree: genuinely pickle it (not just its id)N(sobjsselfsroots sourceIDss badClasses(sselfsobjs sourceIDss badClasses((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssetRoot¥s  (s__name__s __module__s persistent_idssetRoot(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys PygrPicklers sMetabaseServercBs¿tZdZhdd<dd<dd<dd<dd<ddbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__±s     1 sdefaultcCs{ti|dƒ}xX|iƒD]J\}}|idƒo||i |dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysread_download_db¼s cCs |iSdS(s!return layer name for this serverN(sselfsname(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetNameÅscCs/|o|i|ifSn|i|ifSdS(N(sdownloadsselfs downloadDBs downloadDocssdsdocs(sselfsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_dbÈscCs»|i|ƒ\}}y||}Wntj o dSnX|idƒo:xc|D]+}y||d=WqTtj oqTXqTWn-y||d|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getResourceÍs$  cCsrd}xa|iƒD]S\}\}}||ii|hƒ|<|t j o||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServeràs  cCsXy:|i||=t|i|ƒdjo|i|=nWntj onXdSdS(s:delete the specified resource under the specified locationisN(sselfsdsids locationKeyslensdocssKeyError(sselfsids locationKey((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delResourceésspc CsÛ|i|ƒ\}}|djoti|ƒ}ng}xY|D]Q}|djo |i |ƒp|djo |i |ƒo|i |ƒqBqBW|o5h} x$|D]}|i|hƒ| |return list or dict of resources matching the specified stringsrspN(sselfsget_dbsdownloadsdbsdocss matchTypesrescompilespatternslsnames startswithssearchsappendsasDictsdsget( sselfspatternsasDicts matchTypesdownloadsnamesdbslsdocssd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdiròs  :cCs |iSdS(N(sselfs_pygr_data_version(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_versions(s__name__s __module__s__doc__sxmlrpc_methodss_pygr_data_versionsTruesNones__init__sread_download_dbsgetNamesget_dbsFalses getResourcesregisterServers delResourcesdirs get_version(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysMetabaseServer¬s <    cGstdƒ‚dS(Ns€You cannot save data to a remote XMLRPC server. Give a user-editable resource database as the first entry in your WORLDBASEPATH!(sWorldbaseReadOnlyError(sselfsl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysraise_illegal_savessXMLRPCMetabasecBs_tZdZd„Zed„Zd„Zd„Zdeed„Ze Z e Z e Z e Z RS(s3client interface to remote XMLRPC resource databasecKsPdkl}||dƒ|_||_||_|iiƒ|_t|_ dS(N(sget_connectionsindex( s coordinatorsget_connectionsurlsselfsserversmdbsgetNameszoneNamesFalses writeable(sselfsurlsmdbskwargssget_connection((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ s    cCs¿|o|ii||ƒ}n|ii|ƒ}|djotd|ƒ‚ny|d}|d=Wntj o t }nXx$|i ƒD]\}}||fSq‘Wtd|ƒ‚dS(s9get pickledata,docstring for this resource ID from serverssresource %s not founds__doc__s&unable to find %s from remote servicesN( sdownloadsselfsservers getResourcesidsdsWorldbaseNotFoundErrors docstringsKeyErrorsNonesitemsslocationsobjdata(sselfsidsdownloadsobjdatasds docstringslocation((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resources     cCs|ii||ƒSdS(s"forward registration to the serverN(sselfsserversregisterServers locationKeys serviceDict(sselfs locationKeys serviceDict((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServer#scCsR|iid|ƒ}|djo t‚nx|iƒD] }|Sq:Wt‚dS(sreturn dict of {attr:{args}}sSCHEMA.sN(sselfsservers getResourcesidsdsKeyErrorsvaluess schemaDict(sselfsids schemaDictsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema&s   spcCs>|o|ii||||ƒSn|ii|||ƒSdS(s>return list or dict of resources matching the specified stringN(sdownloadsselfsserversdirspatternsasDicts matchType(sselfspatterns matchTypesasDictsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir.s(s__name__s __module__s__doc__s__init__sFalses find_resourcesregisterServers getschemasdirsraise_illegal_saves __setitem__s __delitem__s setschemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysXMLRPCMetabase s     s MySQLMetabasecBs‰tZdZdddfZeed„Zd„Zed„Zd„Z d„Z d„Z d „Z d „Z d „Zd eed „ZRS(sýTo create a new resource table, call: MySQLMetabase("DBNAME.TABLENAME", mdb, createLayer="LAYERNAME") where DBNAME is the name of your database, TABLENAME is the name of the table you want to create, and LAYERNAME is the layer name you want to assign itiic Ksxdkl}l} ||ƒ\|_|_|_||_t|_ h|_ |id}|t jo |}n|t j oÂtiiƒ}|iid|iƒ|iid|iƒ|iid|id||dfƒ|iid|id d |idfƒ||_|iid|ƒ|iid |ƒnôy#|iid |idfƒ} WnAtj o5tid dd|i|iddfIJ‚nX| djo|iiƒd|_n|iid |idfƒdjo?x(|iiƒD]} t |i | dinsert into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)s0versions%d.%d.%dsycreate table %s (source_id varchar(255) not null,target_id varchar(255),edge_id varchar(255),unique(source_id,target_id))s)select location from %s where pygr_id=%%ssÏ%s Database table %s appears to be missing or has no layer name! To create this table, call worldbase.MySQLMetabase("%s",createLayer=) where is the layer name you want to assign it. %ss!i(is0roots attrAliass source_ids target_idsedge_ids simpleKeyss unpack_edge( ssqlgraphsget_name_cursorsSQLGraphs tablenamesselfscursors serverInfosmdbsTrues writeables rootNamess schemaTables createLayersNonesnewZonesdatetimesnows creation_timesexecutes_pygr_data_versionszoneNamesns StandardErrorssyssstderrsfetchonesfetchallsrowssave_root_namessdicts SchemaEdgesgraph( sselfs tablenamesmdbs createLayersnewZoneskwargss schemaTables creation_timesget_name_cursorsSQLGraphsnsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__AsJ        +  cCs4t|i|<|iid|id|dfƒdS(Ns>insert into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)s0rootsa(sNonesselfs rootNamessnamescursorsexecutes tablename(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_namens cCsZ|iid|i|fƒx*|iiƒD]\}}}||fSq-Wt dƒ‚dS(s:get construction rule from mysql, and attempt to constructs;select location,objdata,docstring from %s where pygr_id=%%ss+unable to construct %s from remote servicesN( sselfscursorsexecutes tablenamesidsfetchallslocationsobjdatas docstringsWorldbaseNotFoundError(sselfsidsdownloadsobjdatas docstringslocation((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourcers c Cs˜t|ƒ}t||ƒ}|iid|i|d|i|i |d|d|d|fƒ|i dƒd}||i jo|i|ƒndS( s'add an object to this resource databasesxreplace into %s (pygr_id,location,docstring,user,creation_time,pickle_size,objdata) values (%%s,%%s,%%s,%%s,%%s,%%s,%%s)smysql:susers creation_times pickle_sizes.iN(sdumpssobjsss get_info_dictsdsselfscursorsexecutes tablenamesids__doc__ssplitsroots rootNamesssave_root_name(sselfsidsobjsdsssroot((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setitem__ys 2cCs>|iid|i|fƒdjotd|ƒ‚ndS(s)delete this resource and its schema ruless delete from %s where pygr_id=%%sisno resource %s in this databaseN(sselfscursorsexecutes tablenamesidsWorldbaseNotFoundError(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delitem__„sc Csvd}xe|iƒD]W\}\}}||iid|i |||d|d|d|d|fƒ7}qW|SdS(s1register the specified services to mysql databaseisxreplace into %s (pygr_id,location,docstring,user,creation_time,pickle_size,objdata) values (%%s,%%s,%%s,%%s,%%s,%%s,%%s)s__doc__susers creation_times pickle_sizeN( sns serviceDictsitemssidsdspdatasselfscursorsexecutes tablenames locationKey(sselfs locationKeys serviceDictsdspdatasnsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServer‰s 3cCsV|idƒ o|d}nt|ƒ}|iid|i d|||fƒdS(s.save a schema binding for id.attr --> targetIDs-stargetIDs?replace into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)sSCHEMA.N( sattrs startswithskwargsstargetIDsdumpsskwdatasselfscursorsexecutes tablenamesid(sselfsidsattrskwargsskwdatastargetID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys setschema’s  cCs(|iid|id||fƒdS(s!delete schema binding for id.attrs1delete from %s where pygr_id=%%s and location=%%ssSCHEMA.N(sselfscursorsexecutes tablenamesidsattr(sselfsidsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema™scCseh}|iid|id|fƒx3|iiƒD]"\}}|i i |ƒ||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemas spc Cs|djo!|iid|i|fƒnF|djo%|iid|i|dfƒn|ohSngSh}xP|iiƒD]?}t d|dd|d d |d d |d ƒ||dreturn list or dict of resources matching the specified stringsrsXselect pygr_id,docstring,user,creation_time,pickle_size from %s where pygr_id regexp %%sspsVselect pygr_id,docstring,user,creation_time,pickle_size from %s where pygr_id like %%ss%s__doc__isuseris creation_timeis pickle_sizeiiN(s matchTypesselfscursorsexecutes tablenamespatternsasDictsdsfetchallslsdictsappends_[1]sname( sselfspatterns matchTypesasDictsdownloadsdsls_[1]sname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir¥s"  =(s__name__s __module__s__doc__s_pygr_data_versionsNones__init__ssave_root_namesFalses find_resources __setitem__s __delitem__sregisterServers setschemas delschemas getschemasdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MySQLMetabase;s -      s SchemaEdgecBs tZdZd„Zd„ZRS(s4provides unpack_edge method for schema graph storagecCs ||_dS(N(sschemaDBsself(sselfsschemaDB((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ÀscCs|ii|ƒdSdS(s/get the actual schema object describing this IDs -schemaEdgeN(sselfsschemaDBs getschemasedgeID(sselfsedgeID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__Âs(s__name__s __module__s__doc__s__init__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys SchemaEdge¾s  sResourceDBGraphDescrcBstZdZd„ZRS(s0this property provides graph interface to schemac CsEtd|iddddtdtdt|ƒƒ}||_|SdS(Nsfilenames_schemasmodescwswriteNows simpleKeyss unpack_edge(sGraphsobjsdbpathsTrues SchemaEdgesgsgraph(sselfsobjsobjtypesg((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__Ès (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysResourceDBGraphDescrÆs sShelveMetabasecBs’tZdZdddfZeƒZded„Zd„Ze d„Z d„Z d„Z d e e d „Z d „Zd „Zd „Zd„ZRS(sfBerkeleyDB-based storage of worldbase resource databases, using the python shelve module. Users will not need to create instances of this class themselves, as worldbase automatically creates one for each appropriate entry in your WORLDBASEPATH; if the corresponding database file does not already exist, it is automatically created for you.iisrcKs)dk}tii|dƒ|_||_t|_t |_ ytt i |i|ƒ|_y|i|idƒWntj onXy|id|_ Wntj onXWnr|ij oct i |idƒ|_|i|idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ös,        cCs)|iiƒti|i|ƒ|_dS(N(sselfsdbsclosesdbfiles shelve_opensdbpathsmode(sselfsmode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysreopenís cCsN|i|}y||id|dfSWntj o|tfSnXdS(s'get an item from this resource databases__doc__.s__doc__N(sselfsdbsresIDsobjdatasKeyErrorsNone(sselfsresIDsdownloadsobjdata((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourceðs  cCs©t|ƒ}|idƒz{||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setitem__÷s     cCs‹|idƒziy|i|=Wn,tj o td||ifƒ‚nXy|id|=Wntj onXWd|idƒXdS(s<delete this item from the database, with a modicum of safetyswsID %s not found in %ss__doc__.Nsr(sselfsreopensdbsresIDsKeyErrorsWorldbaseNotFoundErrorsdbpath(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delitem__s  spcCsÐ|djoti|ƒ}ng}x\|iD]Q}|djo |i|ƒp|djo |i |ƒo|i |ƒq0q0W|o<h}x+|D]#}|ii d|tƒ||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirs  :!cCsq|idƒ o|d}n|idƒ|iid|hƒ}|||<||id|<|idƒdS(s1save a schema binding for resID.attr --> targetIDs-stargetIDswsSCHEMA.srN( sattrs startswithskwargsstargetIDsselfsreopensdbsgetsresIDsd(sselfsresIDsattrskwargssdstargetID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys setschema#s  cCs|id|SdS(sreturn dict of {attr:{args}}sSCHEMA.N(sselfsdbsresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema,scCsG|idƒ|id|}||=||id|<|idƒdS(s$delete schema binding for resID.attrswsSCHEMA.srN(sselfsreopensdbsresIDsdsattr(sselfsresIDsattrsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema/s  cCs|iiƒdS(s#close the shelve file when finishedN(sselfsdbsclose(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__del__6s(s__name__s __module__s__doc__s_pygr_data_versionsResourceDBGraphDescrsgraphsNones__init__sreopensFalses find_resources __setitem__s __delitem__sdirs setschemas getschemas delschemas__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysShelveMetabaseÎs        cKs@tƒ}t|ƒ}|i|||i|ƒ|iƒSdS(s.pickle to string, using persistent ID encodingN( sStringIOssrcs PygrPicklerspicklerssetRootsobjskwargssdumpsgetvalue(sobjskwargsssrcspickler((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdumps=s    cCsjtdtiiƒdt|ƒd|iƒ}yti d|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_info_dictEss MetabaseBasecBs¶tZd„Zd„Zd„Zeed„Zd„Zed„Z d„Z d„Z d „Z d „Z d „Zed „Zd „Zd„Zd„Zd„Zd„Zd„ZRS(NcCs6|idƒo||dƒSntid|‚dS(s<check for PYGR_ID:... format and return the requested objectsPYGR_ID:isInvalid persistent ID %sN(spersids startswithsselfspicklesUnpicklingError(sselfspersid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyspersistent_loadPscCs»|i|ƒ}||_t|dƒo|io[|ii }|i ƒ}|i ||ƒt|_|otid|IJq–|iƒn ||_||i|<|i||ƒ|SdS(s.load the pickled data and all its dependenciess_saveLocalBuildsdSaving new resource %s to local worldbase... You must use worldbase.commit() to commit! You are seeing this message because you appear to be in the middle of a worldbase transaction. Ordinarily worldbase would automatically commit this new downloaded resource, but doing so now would also commit your pending transaction, which you may not be ready to do!N(sselfsloadssobjdatasobjs docstrings__doc__shasattrs_saveLocalBuildswriterssavers has_pendings hasPendings add_resourcesresIDsFalsessyssstderrs save_pendings_persistent_ids resourceCaches bind_schema(sselfsresIDsobjdatas docstringsobjs hasPendingssaver((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysloadVs      cCs;t|ƒ}ti|ƒ}|i|_|iƒ}|SdS(s3unpickle from string, using persistent ID expansionN( sStringIOsdatassrcspickles Unpicklers unpicklersselfspersistent_loadsloadsobj(sselfsdatassrcsobjs unpickler((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysloadsos    c Os&y|i|SWntj onX|i} |i}|tj o ||_n|tj o ||_n |i}z‡|i d|idt ƒxg|i ||ƒD]S\}}y|i|||ƒ} PWq£ttfj o|io‚qöq£Xq£WWd| |_||_X| |i|<| SdS(s8get the requested resource ID by searching all databasessdebugskeepCurrentPathN(sselfs resourceCachesresIDsKeyErrorsdebugs debug_statesdownloadsdownload_statesNonesupdatesTrues find_resourcesobjdatasdocstrsloadsobjsIOError( sselfsresIDsdebugsdownloadsargsskwargssobjdatasdocstrsdownload_statesobjs debug_state((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__vs6            cCs†y|i|ƒ}Wntj o dSnX||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys bind_schema’s  cKsîy|i|SWnttfj onX|o%t|dƒ}t|||}nt|ƒ}t |||}t |||ƒ|o=yt|dƒ}Wntj oqÉXt |||ƒn|djot|dtƒndS(s=create a descriptor for the attr on the appropriate obj classs itemClasssitemSliceClasss inverseDBs __invert__N(sobjs_ignoreShadowAttrsattrsAttributeErrorsKeyErrorsitemRulesget_bound_subclasss targetClasssItemDescriptorsselfskwargssdescrsOneTimeDescriptorssetattrsaddSpecialMethods getInverseDB(sselfsobjsattrsitemRuleskwargssdescrs targetClass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys bind_propertyœs&  cCs›y|ii|}Wn2tj o&|i|ƒ}||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_schema_attr²s cCs$t|i|ƒt|i|ƒdS(s?add name to the root of our data namespace and schema namespaceN(sgetattrsselfsDatasnamesSchema(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_root_nameÀscCs"x|D]}|i|ƒqWdS(s&add set of names to our namespace rootN(s rootNamessnamesselfs add_root_name(sselfs rootNamessname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_namesÄscCs|iiƒdS(sclear all resources from cacheN(sselfs resourceCachesclear(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys clear_cacheÈscCs1y |iSWntj otdƒ‚nXdS(s5return writeable mdb if available, or raise exceptionsthis metabase is read-only!N(sselfswritersAttributeErrorsWorldbaseReadOnlyError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_writerËs  cCsD|tjo|iƒii|ƒn|iƒii||ƒdS(s´assign obj as the specified resource ID to our metabase. if obj is None, treat resID as a dictionary whose keys are resource IDs and values are the objects to save.N(sobjsNonesselfs get_writerssaversadd_resource_dictsresIDs add_resource(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_resourceÑs cCs|iƒii|ƒdS(s.delete specified resource ID from our metabaseN(sselfs get_writerssaversdelete_resourcesresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdelete_resourceÙscCs|iƒiiƒdS(s1save any pending resource assignments and schemasN(sselfs get_writerssavers save_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscommitÜscCs|iƒiiƒdS(s4discard any pending resource assignments and schemasN(sselfs get_writerssaversrollback(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysrollbackßscCs |iƒii|||ƒdS(s5add a schema to the list of pending schemas to commitN(sselfs get_writerssaversqueue_schema_objs schemaPathsattrs schemaObj(sselfs schemaPathsattrs schemaObj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysqueue_schema_objâscCsC|idƒ}t|di|d ƒƒ}t||d|ƒdS(s<assign a schema relation object to a worldbase resource names.iÿÿÿÿN( sresIDssplitsls SchemaPathsselfsjoins schemaPathssetattrs schemaObj(sselfsresIDs schemaObjsls schemaPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_schemaåscCs|iƒiiƒSdS(N(sselfs get_writerssavers list_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys list_pendingês(s__name__s __module__spersistent_loadsloadsloadssNones__call__s bind_schemasFalses bind_propertysget_schema_attrs add_root_namessave_root_namess clear_caches get_writers add_resourcesdelete_resourcescommitsrollbacksqueue_schema_objs add_schemas list_pending(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MetabaseBaseOs$               sMetabasecBswtZeed„Zeeed„Zed„Zd„Zd„Zd„Z d„Z d„Z d d eed „Z RS( NcKs`||_t|ƒ|_t|ƒ|_||_t|_t |_ |t jo h}n|idƒo1t|||}d|jo||dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ðsL        <          cCs| otdƒ‚ndS(Ns(You cannot change the path of a Metabase(skeepCurrentPaths ValueError(sselfs worldbasePathsdebugskeepCurrentPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysupdatesccs|ii||ƒVdS(N(sselfsstorages find_resourcesresIDsdownload(sselfsresIDsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourcescKs9y|ii|SWntj onX|||SdS(s8find resID even if only pending (not actually saved yet)N(sselfssavers pendingDatasresIDsKeyErrorskwargs(sselfsresIDskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_pending_or_find!s cCs|ii|ƒSdS(s5return dict of {attr:{args}} or KeyError if not foundN(sselfsstorages getschemasresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema(scCs8|itj o|ii|ƒnti||ƒdS(N(sselfsparentsNonessave_root_namess rootNamess MetabaseBase(sselfs rootNames((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_names+scCs|ii|||ƒdS(stsave an attribute binding rule to the schema; DO NOT use this internal interface unless you know what you are doing!N(sselfsstorages setschemasresIDsattrsargs(sselfsresIDsattrsargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchema/scCsL|i|id|ƒ|ii|i7_|i|ii|i|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssaveSchemaEdge2ssspcCs#|ii||d|d|ƒSdS(NsasDictsdownload(sselfsstoragesdirspatterns matchTypesasDictsdownload(sselfspatterns matchTypesasDictsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir7s( s__name__s __module__sNones__init__sFalsesupdates find_resourcesget_pending_or_finds getschemassave_root_namess saveSchemassaveSchemaEdgesdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysMetabaseïs,      sZoneDictcBs2tZdZd„Zd„Zd„Zd„ZRS(sinterface to current zonescCs ||_dS(N(smdbListsself(sselfsmdbList((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__>scCs%|iidtƒ|ii|SdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictszoneName(sselfszoneName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getitem__@scCs'|iidtƒ|iiiƒSdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyskeysCscCs'|iidtƒ|iiiƒSdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictscopy(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscopyFs(s__name__s __module__s__doc__s__init__s __getitem__skeysscopy(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysZoneDict<s    s MetabaseListcBs•tZdZdddgZeedhd„Zd„Zed„Zd„Z eeeed „Z d „Z d „Z d „Z d deed„ZRS(sPrimary interface for worldbase resource database access. A single instance of this class is created upon import of the worldbase module, accessible as worldbase.getResource. Users normally will have no need to create additional instances of this class themselves.s~s.s*http://biodb2.bioinformatics.ucla.edu:5000s,cCs¥|tjo tƒ}n||_t|_||_h|_t|ƒ|_||_ ||_ t |ƒ|_ t |d|iƒ|_t|_t|_t|_dS(s0initializes attrs; does not connect to metabasesszonesN(s resourceCachesNones ResourceCachesselfsmdbsmdbArgsszoneDictsZoneDictszoness worldbasePaths separators SchemaPathsSchemas ResourceRootsDatasFalsesdebugsdownloadsready(sselfs worldbasePaths resourceCaches separatorsmdbArgs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Qs          cCs!|idtƒti|ƒSdS(s?ensure that metabases are loaded, before looking for our writerskeepCurrentPathN(sselfsupdatesTrues MetabaseBases get_writer(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_writerasccsXxA|iD]6}y|i||ƒiƒVWq tj oq Xq Wtd|ƒ‚dS(s;search our metabases for pickle string and docstr for resIDs"unable to find %s in WORLDBASEPATHN(sselfsmdbs find_resourcesresIDsdownloadsnextsKeyErrorsWorldbaseNotFoundError(sselfsresIDsdownloadsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourcees  cCsaytidSWnKtj o?ytidSWq]tj o|ii|iƒSq]XnXdS(s-get environment var, or default in that orders WORLDBASEPATHs PYGRDATAPATHN(sossenvironsKeyErrorsselfs separatorsjoins defaultPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_worldbase_pathmscCsÃ|o |i}n|tjo|iƒ}n|tjo |i}n|tjo |i}n|i p |i|jo?||_y |`Wnt j onXg|_ y |`Wnt j onXh|_ xÔ|i |i ƒD]À}y"t||i|i ||}Wn]ttfj o ‚qî|o‚q®dk}|idtiƒtid|IJqîX|i i|ƒ|iot|dƒ o ||_qîqîWt|_ndS(s)get the latest list of resource databasesNi s5 WARNING: error accessing metabase %s. Continuing...swriter(skeepCurrentPathsselfs worldbasePathsNonesget_worldbase_pathsdebugsmdbArgssreadyswritersAttributeErrorsmdbszoneDictssplits separatorsdbpathsMetabases resourceCachesKeyboardInterrupts SystemExits tracebacks print_excssyssstderrsappends writeableshasattrsTrue(sselfs worldbasePathsdebugskeepCurrentPathsmdbArgssdbpaths tracebacksmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysupdatevsJ           " cKsMx9|iD].}y|ii|SWq tj oq Xq W|||SdS(s8find resID even if only pending (not actually saved yet)N(sselfsmdbssavers pendingDatasresIDsKeyErrorskwargs(sselfsresIDskwargssmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_pending_or_find£s  cCskxX|iD]M}t|idƒo4|ii||ƒ}|t|ƒjo|SqWq q Wt dƒ‚dS(sEregister the serviceDict with the first index server in WORLDBASEPATHsregisterServers1unable to register services. Check WORLDBASEPATHN( sselfsmdbshasattrsstoragesregisterServers locationKeys serviceDictsnslens ValueError(sselfs locationKeys serviceDictsmdbsn((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServer«s cCsOx8|iD]-}y|i|ƒSWq tj oq Xq Wtd|ƒ‚dS(s@search our resource databases for schema info for the desired IDsno schema info available for N(sselfsmdbs getschemasresIDsKeyError(sselfsresIDsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema³s  sspc CsÑ|idtƒg}x6|iD]+}|i|i||d|d|ƒƒq W|o6h}|i ƒx|D]} |i| ƒqmW|SnBh}x|D]}t|i|ƒq™W|iƒ}|iƒ|SdS(sAget list or dict of resources beginning with the specified stringskeepCurrentPathsasDictsdownloadN(sselfsupdatesTruesresultssmdbsappendsdirspatterns matchTypesasDictsdownloadsdsreversessubdirslsfilters setdefaultskeysssort( sselfspatterns matchTypesasDictsdownloadsdsmdbsresultsslssubdir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir»s*    (s__name__s __module__s__doc__s defaultPathsNones__init__s get_writersFalses find_resourcesget_worldbase_pathsupdatesget_pending_or_findsregisterServers getschemasdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MetabaseListJs    -   s ResourceCachecBs tZdZd„Zd„ZRS(s@provide one central repository of loaded resources & schema infocCsti|ƒh|_dS(N(sdicts__init__sselfs schemaCache(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Òs cCsti|ƒ|iiƒdS(N(sdictsclearsselfs schemaCache(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysclearÕs (s__name__s __module__s__doc__s__init__sclear(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceCacheÐs  s ResourceSavercBs•tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„ZRS(s/queues new resources until committed to our mdbcCs|iƒ||_dS(N(sselfs clear_pendingsmdb(sselfsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ûs cCs1h|_h|_h|_h|_h|_dS(N(sselfs pendingDatas pendingSchemaslastDatas lastSchemas rollbackData(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys clear_pendingÞs     cCsmyG|itjp&t|idƒo|i|iijo t‚nWntj otdƒ‚nXdS(sFenforce requirement for docstring, by raising exception if not presents__doc__sUto save a resource object, you MUST give it a __doc__ string attribute describing it!N(sobjs__doc__sNoneshasattrs __class__sAttributeErrors ValueError(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscheck_docstringäs 9cCsh|i|ƒ||_||i|N( sselfscheck_docstringsobjsresIDs_persistent_ids pendingDatasmdbs resourceCaches rollbackDatasKeyErrorscache_if_appropriate(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_resourceìs   cCs@y|iodSnWntj onX||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscache_if_appropriateös   cCs1x*|iƒD]\}}|i||ƒq WdS(s8queue a dict of name:object pairs for saving to metabaseN(sdsitemssksvsselfs add_resource(sselfsdsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysadd_resource_dictýs cCs)|i|ƒ}|||f|i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysqueue_schema_objscCsU|i|ƒ|i|jotd|ƒ‚n||ii|<|i||ƒdS(ssave the object as s½The _persistent_id attribute for %s has changed! If you changed it, shame on you! Otherwise, this should not happen, so report the reproducible steps to this error message as a bug report.N( sselfscheck_docstringsobjs_persistent_idsresIDsWorldbaseMismatchErrorsmdbsstoragescache_if_appropriate(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys save_resources  cCs-t|iƒdjpt|iƒdjSdS(s:return True if there are resources pending to be committediN(slensselfs pendingDatas pendingSchema(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys has_pendingscCsÑt|iƒdjpt|iƒdjo|i}|i}n tdƒ‚x*|iƒD]\}}|i ||ƒq[Wx3|i ƒD]%\}}}|i|||iƒqˆW|iƒ||_||_dS(s/save any pending worldbase resources and schemais#there is no data queued for saving!N(slensselfs pendingDatas pendingSchemasds schemaDictsWorldbaseEmptyErrorsitemssresIDsobjs save_resourcesvaluess schemaPathsattrs schemaObjs saveSchemasmdbs clear_pendingslastDatas lastSchema(sselfsresIDsds schemaObjs schemaDicts schemaPathsobjsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys save_pendings,       cCs t|iƒt|iƒfSdS(s7return tuple of pending data dictionary, pending schemaN(slistsselfs pendingDatas pendingSchema(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys list_pendingscCs`t|iƒdjot|iƒdjotdƒ‚n|iii|iƒ|i ƒdS(s@dump any pending data without saving, and restore state of cacheis#there is no data queued for saving!N( slensselfs pendingDatas pendingSchemasWorldbaseEmptyErrorsmdbs resourceCachesupdates rollbackDatas clear_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysrollback"s ,cCsi|ii|=y|ii|=Wntj onXy|i|=Wntj onX|i|ƒdS(sBdelete the specified resource from resourceCache, saver and schemaN(sselfsmdbsstoragesresIDs resourceCachesKeyErrors pendingDatas delSchema(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdelete_resource(s cCsž|ii}y|i|ƒ}Wntj o dSnX|iiii ƒxK|i ƒD]=\}}|i dƒo|i|ƒn|i||ƒqYWdS(s3delete schema bindings TO and FROM this resource IDNs-(sselfsmdbsstorages getschemasresIDsdsKeyErrors resourceCaches schemaCachesclearsitemssattrsobjs startswiths delschema(sselfsresIDsdsstoragesobjsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delSchema0s   cCs5y|iƒtidIJWntj onXdS(Ns WARNING: saving worldbase pending data that you forgot to save... Remember in the future, you must issue the command worldbase.commit() to save your pending worldbase resources to your resource database(s), or alternatively worldbase.rollback() to dump those pending data without saving them. It is a very bad idea to rely on this automatic attempt to save your forgotten data, because it is possible that the Python interpreter may never call this function at exit (for details see the atexit module docs in the Python Library Reference).(sselfs save_pendingssyssstderrsWorldbaseEmptyError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__del__<s   (s__name__s __module__s__doc__s__init__s clear_pendingscheck_docstrings add_resourcescache_if_appropriatesadd_resource_dictsqueue_schema_objs save_resources has_pendings save_pendings list_pendingsrollbacksdelete_resources delSchemas__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceSaverÙs             sResourceServercBs2tZdZeeeeeed„Zd„ZRS(s2serves resources that can be transmitted on XMLRPCc !KsKti||| ||_|tjo |i}n|tjo#dk l }l }||g}n|tjo¯dkl}l}l}l}l}l}l}|||f|||f|||fg}y:dkl}dkl}l}|i|||fƒWq"tj oq"Xn|tjo |i}nh}x¶|i ƒD]¨\} }t#} x)|D]!}t&||ƒo t'} PqhqhW| oqOnt'} xC|D];\} }}t&|| ƒot&||ƒ o t#} Pq¨q¨W| o:y|i+|| |dt,ƒWqOt-j oqOXqOny ||_.WnAt/j o5|i0ƒ}|i2|ƒ} | i4|ƒ| }nXy|i5||i6| ƒWn2t7j o&d||i6f|_8| |_nX||_.|i+|| |ƒ||_.||| d d d | ƒnd S( s+construct server for the designated classes(s SQLTableBasesSQLGraphClustered(sSequenceFileDBsBlastDBsXMLRPCSequenceDBs BlastDBXMLRPCs AnnotationDBsAnnotationClientsAnnotationServer(sNLMSA(s NLMSAClients NLMSAServers badClassess http://%s:%dsreadOnlys downloadDBsindexssserverN(?sXMLRPCServerBases__init__sselfsnameskwargssmdbs resourceDictsNones resourceCachesexcludeClassesssqlgraphs SQLTableBasesSQLGraphClustereds serverClassessseqdbsSequenceFileDBsBlastDBsXMLRPCSequenceDBs BlastDBXMLRPCs AnnotationDBsAnnotationClientsAnnotationServers cnestedlistsNLMSAs xnestedlists NLMSAClients NLMSAServersappends ImportErrors clientHostshosts clientDictsitemssidsobjsFalsesskipThiss skipClasss isinstancesTrues baseKlasss clientKlasss serverKlasssclient_dict_setitemsnonPortableClassessWorldbaseNotPortableErrors __class__s TypeErrors __getstate__sstates__new__snewobjs __setstate__s saveHostInfosportsAttributeErrorsurlsregistrationDatas withIndexsMetabaseServers downloadDBsmyIndexsregister(!sselfsmdbsnames serverClassess clientHosts withIndexsexcludeClassess downloadDBs resourceDictskwargss baseKlasssmyIndexsnewobjsidsstates NLMSAClients clientKlasssBlastDBsSequenceFileDBs BlastDBXMLRPCsXMLRPCSequenceDBs skipClasssNLMSAs serverKlasss clientDictsobjsAnnotationServersAnnotationClients AnnotationDBsSQLGraphClustereds NLMSAServers SQLTableBasesskipThis((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ns€     1*      !           cKsot||}t||ƒ|f||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysclient_dict_setitem’s-(s__name__s __module__s__doc__sNonesTrues__init__sclient_dict_setitem(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysResourceServerLs Ds ResourcePathcBsVtZdZed„Zd„Zd„Zd„Zd„Zd„Z eed„Z RS(sCsimple way to read resource names as python foo.bar.bob expressionscCs||id<||idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ s cCs+|itj o|id|Sn|SdS(Ns.(sselfs_pathsNonesname(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetPath£scCs3|i|i|i|ƒƒ}||i|<|SdS(s.extend the resource path by one more attributeN(sselfs _pathClasss_mdbsgetPathsnamesattrs__dict__(sselfsnamesattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getattr__¨s cOs|i|i||ŽSdS(s construct the requested resourceN(sselfs_mdbs_pathsargsskwargs(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__®scCs |ii|i|ƒ|ƒdS(s*save obj using the specified resource nameN(sselfs_mdbs add_resourcesgetPathsnamesobj(sselfsnamesobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setattr__±scCsA|ii|i|ƒƒy|i|=Wntj onXdS(N(sselfs_mdbsdelete_resourcesgetPathsnames__dict__sKeyError(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delattr__´s cCs“|tjo t|iƒd}|i}n|ii|ƒ}h}x=|D]5}|i |ƒot|||i dƒdbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__dir__ºs  #( s__name__s __module__s__doc__sNones__init__sgetPaths __getattr__s__call__s __setattr__s __delattr__s__dir__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourcePathžs       s ResourceRootcBs/tZdZeed„Zd„Zd„ZRS(s(provide proxy to public metabase methodsc Cs‡ti|||ƒ|i|id<|tj o||idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__És "cOs|i|||ŽSdS(s Construct the requested resourceN(sselfs_mdbsresIDsargsskwargs(sselfsresIDsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__ÒscCsti|ddƒSdS(Nsi(s ResourcePaths__dir__sself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__dir__Õs(s__name__s __module__s__doc__sNones__init__s__call__s__dir__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceRootÇs  s ResourceZonecBs tZdZd„Zd„ZRS(s7provide pygr.Data old-style interface to resource zonescCs||_||_dS(N(smdbsselfs _mdbParentszoneNames _zoneName(sselfsmdbszoneName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ús cCs‹|iidtƒy|ii|i}Wn&tj otd|iƒ‚nX|djot i ||ƒSnt i |||ƒSdS(NskeepCurrentPathsno zone "%s" availablesschema( sselfs _mdbParentsupdatesTrueszoneDicts _zoneNamesmdbsKeyErrors ValueErrorsnames SchemaPaths __getitem__s ResourcePath(sselfsnamesmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getattr__Ýs (s__name__s __module__s__doc__s__init__s __getattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceZoneØs  s SchemaPathcBs tZdZd„Zd„ZRS(s&save schema information for a resourcecCsGy |iWntj otdƒ‚nX|ii|||ƒdS(Nsnot a valid schema object!(sschemas saveSchemasAttributeErrors ValueErrorsselfs_mdbsqueue_schema_objsname(sselfsnamesschema((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setattr__ês  cCstdƒ‚dS(Ns'schema deletion is not yet implemented.(sNotImplementedError(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delattr__ðs(s__name__s __module__s__doc__s __setattr__s __delattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys SchemaPathès  sDirectRelationcBs)tZdZd„Zd„Zd„ZRS(sbind an attribute to the targetcCst|ƒ|_dS(N(sgetIDstargetsselfstargetID(sselfstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__÷scCstd|iƒSdS(NstargetID(sdictsselfstargetID(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys schemaDictùscKsk|iƒ}|i|ƒyt|dƒ|d<|d=Wntj onX|it|ƒ||ƒdS(NstargetDBstargetID( sselfs schemaDictsdsupdateskwargssgetIDsKeyErrorsmdbs saveSchemassourcesattr(sselfssourcesattrsmdbskwargssd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaûs   (s__name__s __module__s__doc__s__init__s schemaDicts saveSchema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysDirectRelationõs   s ItemRelationcBstZdZd„ZRS(s!bind item attribute to the targetcCstd|idtƒSdS(NstargetIDsitemRule(sdictsselfstargetIDsTrue(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys schemaDicts(s__name__s __module__s__doc__s schemaDict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ItemRelations sManyToManyRelationcBsDtZdZdZeeeed„Zd„Zd„Zd„ZRS(s@a general graph mapping from sourceDB -> targetDB with edge infos many:manycCsˆt|ƒ|_t|ƒ|_|tj ot|ƒ|_n t|_||_|tj o ||_n|tj o ||_ndS(N( sgetIDssourceDBsselfstargetDBsedgeDBsNones bindAttrss sourceNotNones targetNotNone(sselfssourceDBstargetDBsedgeDBs bindAttrss sourceNotNones targetNotNone((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ s      cCs§|i|ƒ}||_|i|ƒt|iƒ}|i |d|ƒt|i ƒ}|i |d|ƒ|i t j o&t|i ƒ}|i |d|ƒn|SdS(sNsave standard schema bindings to graphDB attributes sourceDB, targetDB, edgeDBssourceDBstargetDBsedgeDBN(sgraphDBsgetPathsattrsselfsnamesmdbssaveSchemaEdgesDirectRelationssourceDBsbs saveSchemastargetDBsedgeDBsNone(sselfsgraphDBsattrsmdbsb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_graph_bindingss  c Cs|i|||ƒ}|itj oæ|i|i |i f}ht dt ƒt dt ƒg}y|i|ƒiƒ|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchema's! * cCs|itj o||i|i|if}xatdƒD]O}t |iƒ|jo|i|tj o|i |||i|ƒq5q5WndS(s<delete resource attribute bindings associated with this ruleiN( sselfs bindAttrssNonessourceDBstargetDBsedgeDBsbindObjsrangesislens resourceDBs delschema(sselfs resourceDBsbindObjsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema6s *( s__name__s __module__s__doc__s _relationCodesNones__init__ssave_graph_bindingss saveSchemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysManyToManyRelation s  sOneToManyRelationcBstZdZRS(Nsone:many(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneToManyRelation>ssOneToOneRelationcBstZdZRS(Nsone:one(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneToOneRelationAssManyToOneRelationcBstZdZRS(Nsmany:one(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysManyToOneRelationDssInverseRelationcBs&tZdZdZd„Zd„ZRS(s7bind source and target as each other's inverse mappingssinversecKsg|i|ƒ}||_|i|ƒti||d||t|ƒ}|i|i d||dS(s.save schema bindings associated with this rules inverseDBN( ssourcesgetPathsattrsselfsnamesmdbssaveSchemaEdgesDirectRelations saveSchemaskwargssbstargetID(sselfssourcesattrsmdbskwargssb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaJs    cCs|i|idƒdS(Ns inverseDB(s resourceDBs delschemasselfstargetID(sselfs resourceDB((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschemaTs(s__name__s __module__s__doc__s _relationCodes saveSchemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysInverseRelationGs  cCsdt|tƒo|SnIt|tƒo |iSn.y |iSWntj otdƒ‚nXdS(s7get persistent ID of the object or raise AttributeErrorsthis obj has no persistent ID!N(s isinstancesobjsstrs ResourcePaths_paths_persistent_idsAttributeError(sobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetIDWs  (GsosspicklessyssresdatetimesUserDictsStringIOsmappings CollectionsMappingsGraphs classutilsstandard_invertsget_bound_subclasssSourceFileNames coordinatorsXMLRPCServerBasesdbfilesnonPortableClassess NameErrorsobjectsOneTimeDescriptorsItemDescriptorsItemDescriptorRWsForwardingDescriptorsSpecialMethodDescriptorsaddSpecialMethods getInverseDBs ValueErrorsWorldbaseNotPortableErrorsKeyErrorsWorldbaseNotFoundErrorsWorldbaseMismatchErrorsWorldbaseEmptyErrorsWorldbaseReadOnlyErrorsWorldbaseSchemaErrors PickleErrorsWorldbaseNoModuleErrorsPicklers PygrPicklersMetabaseServersraise_illegal_savesXMLRPCMetabases MySQLMetabases SchemaEdgesResourceDBGraphDescrsShelveMetabasesdumpss get_info_dicts MetabaseBasesMetabases DictMixinsZoneDicts MetabaseListsdicts ResourceCaches ResourceSaversResourceServers ResourcePaths _pathClasss ResourceRoots ResourceZones SchemaPathsDirectRelations ItemRelationsManyToManyRelationsOneToManyRelationsOneToOneRelationsManyToOneRelationsInverseRelationsgetID(;sOneTimeDescriptorsItemDescriptorRWsGraphsstandard_invertsWorldbaseNotPortableErrorsdatetimesXMLRPCServerBases ItemRelationsWorldbaseEmptyErrorsManyToManyRelationsraise_illegal_saves ResourceSaversMetabaseServersMetabases PygrPicklersForwardingDescriptorsOneToOneRelationsXMLRPCMetabasesDirectRelationsnonPortableClassessInverseRelationsMappings Collectionsres getInverseDBsResourceServersWorldbaseReadOnlyErrorsWorldbaseNotFoundErrorsManyToOneRelations MetabaseListsShelveMetabases ResourceRootsdbfiles get_info_dicts SchemaEdgesUserDicts SchemaPathssyssSpecialMethodDescriptorsgetIDsSourceFileNamesWorldbaseSchemaErrorspickles ResourceZonesOneToManyRelationsItemDescriptorsStringIOsossWorldbaseNoModuleErrors ResourcePathsWorldbaseMismatchErrorsdumpss MetabaseBasesZoneDictsResourceDBGraphDescrs ResourceCachesget_bound_subclasssaddSpecialMethods MySQLMetabase((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys?sl6   '    Y 1ƒo   M† sR'  4PK6j$;Ë n:çDçDpygr/nlmsa_utils.pyimport classutil, logger import os, types class NLMSASeqList(list): def __init__(self, nlmsaSeqDict): list.__init__(self) self.nlmsaSeqDict = nlmsaSeqDict def __getitem__(self, nlmsaID): 'return NLMSASequence for a given nlmsa_id' try: return list.__getitem__(self,nlmsaID) except IndexError: seqID,nsID = self.nlmsaSeqDict.IDdict[str(nlmsaID)] return list.__getitem__(self,nsID) def getSeq(self, nlmsaID): 'return seq for a given nlmsa_id' seqID,nsID = self.nlmsaSeqDict.IDdict[str(nlmsaID)] return self.nlmsaSeqDict.nlmsa.seqDict[seqID] def getSeqID(self, nlmsaID): 'return seqID for a given nlmsa_id' seqID,nsID=self.nlmsaSeqDict.IDdict[str(nlmsaID)] return seqID def is_lpo(self, id): if id >= len(self): return False ns = self[id] if ns.is_lpo: return True else: return False def nextID(self): return len(self) class EmptySliceError(KeyError): pass class EmptyAlignmentError(ValueError): pass class EmptySlice: 'Empty slice for use by NLMSASlice' def __init__(self, seq): self.seq = seq def edges(self, *args, **kwargs): return [] def items(self, **kwargs): return [] def iteritems(self, **kwargs): return iter([]) def keys(self, **kwargs): return [] def __iter__(self): return iter([]) def __getitem__(self, k): raise KeyError def __len__(self): return 0 def matchIntervals(self, seq=None): return [] def findSeqEnds(self, seq): raise KeyError('seq not aligned in this interval') def generateSeqEnds(self): return [] def groupByIntervals(self, **kwargs): return {} def groupBySequences(self, **kwargs): return [] def split(self, **kwargs): return [] def regions(self, **kwargs): return [] def __cmp__(self, other): return cmp(self.seq, other.seq) def rawIvals(self): return [] class NLMSASeqDict(dict): 'index sequences by pathForward, and use list to keep reverse mapping' def __init__(self, nlmsa, filename, mode, maxID=1000000, idDictClass=None): dict.__init__(self) self.seqlist = NLMSASeqList(self) self.maxID = maxID self.nlmsa = nlmsa self.filename = filename if mode == 'memory': # just use python dictionary idDictClass = dict elif mode == 'w': # new database mode = 'n' if idDictClass is None: # use persistent id dictionary storage self.seqIDdict = classutil.open_shelve(filename + '.seqIDdict', mode) self.IDdict = classutil.open_shelve(filename + '.idDict', mode) else: # user supplied class for id dictionary storage self.seqIDdict = idDictClass() self.IDdict = idDictClass() def saveSeq(self, seq, nsID= -1, offset=0, nlmsaID=None): 'save mapping of seq to specified (nlmsaID,ns,offset)' if nsID < 0: # let the union figure it out self.nlmsa.currentUnion.__iadd__(seq) return # the union added it for us, no need to do anything if isinstance(seq, types.StringType): id = seq # treat this as fully qualified identifier else: # get the identfier from the seq / database id = self.getSeqID(seq) if nlmsaID is None: # allocate a new unique id nlmsaID = self.nlmsa.nextID() self.seqIDdict[id] = nlmsaID, nsID, offset self.IDdict[str(nlmsaID)] = id,nsID def getIDcoords(self, seq): 'return nlmsaID,start,stop for a given seq ival.' nlmsaID = self.getID(seq) return nlmsaID, seq.start, seq.stop # standard coords def getID(self, seq): 'return nlmsa_id for a given seq' return self[seq][0] def __getitem__(self, seq): 'return nlmsaID,NLMSASequence,offset for a given seq' if not hasattr(seq, 'annotationType'): # don't cache annotations try: # look in our sequence cache return dict.__getitem__(self,seq.pathForward) except AttributeError: raise KeyError('key must be a sequence interval!') except KeyError: pass seqID = self.getSeqID(seq) # use seq id to look up... try: nlmsaID, nsID, offset = self.seqIDdict[seqID] except KeyError: raise KeyError('seq not found in this alignment') v = nlmsaID, self.seqlist[nsID], offset if not hasattr(seq,'annotationType'): # don't cache annotations dict.__setitem__(self, seq.pathForward, v) # cache this result return v def __iter__(self): 'iterate over sequences in this alignment' for seqID in self.seqIDdict: yield self.nlmsa.seqDict[seqID] def getSeqID(self, seq): 'return fully qualified sequence ID for this seq' return (~(self.nlmsa.seqDict))[seq] def __setitem__(self, k, ns): 'save mapping of seq to the specified NLMSASequence' self.seqlist.append(ns) if isinstance(k, types.StringType): dict.__setitem__(self,k,(ns.id,ns,0)) # allow build with a string object elif k is not None: dict.__setitem__(self,k.pathForward,(ns.id,ns,0)) def __iadd__(self, ns): 'add coord system ns to the alignment' self[None] = ns return self # iadd must return self!!! def close(self): 'finalize and close shelve indexes' try: do_close = self.seqIDdict.close except AttributeError: return # our storage doesn't support close(), so nothing to do do_close() # close both shelve objects self.IDdict.close() def reopenReadOnly(self, mode='r'): 'save existing data and reopen in read-only mode' self.close() self.seqIDdict = classutil.open_shelve(self.filename + '.seqIDdict', mode) self.IDdict = classutil.open_shelve(self.filename + '.idDict', mode) def getUnionSlice(self, seq): 'get union coords for this seq interval, adding seq to index if needed' try: id, ns, offset = self[seq] # look up in index except KeyError: self.saveSeq(seq) # add this new sequence to our current union id, ns, offset = self[seq] # look up in index i, start, stop = self.getIDcoords(seq) # make sure to handle annots right if start < 0: # reverse orientation return ns, slice(start - offset, stop - offset) # use union coords else: # forward orientation return ns, slice(start + offset, stop + offset) # use union coords def splitLPOintervals(lpoList, ival, targetIval=None): 'return list of intervals split to different LPOs' if ival.start < 0: # reverse orientation: force into forward ori start= -(ival.stop) stop= -(ival.start) else: # forward orientation start=ival.start stop=ival.stop l = [] i = len(lpoList) - 1 while i >= 0: offset = lpoList[i].offset if offset < stop: # appears to be in this if offset <= start: # fits completely in this LPO if ival.start < 0: # reverse ori myslice = slice(offset - stop, offset - start) else: # forward ori myslice = slice(start - offset, stop - offset) if targetIval is not None: l.append((lpoList[i], myslice, targetIval)) else: l.append((lpoList[i], myslice)) return l # done else: # continues past start of this LPO if ival.start < 0: # reverse ori myslice = slice(offset - stop, 0) else: # forward ori myslice = slice(0, stop - offset) if targetIval is not None: l.append((lpoList[i], myslice, targetIval[offset - start:])) targetIval = targetIval[:offset - start] #remove part already appended else: l.append((lpoList[i], myslice)) stop = offset i -= 1 # continue to previous LPO raise ValueError('empty lpoList or offset not starting at 0? Debug!') class BuildMSASlice(object): def __init__(self,ns,start,stop,id,offset,is_lpo=0,seq=None): self.ns=ns self.start=start self.stop=stop self.id=id self.offset=offset self.is_lpo=is_lpo self.seq=seq def offsetSlice(self,ival): if ival.orientation<0: return slice(ival.start-self.offset,ival.stop-self.offset) else: return slice(ival.start+self.offset,ival.stop+self.offset) def __iadd__(self,targetIval): 'save an alignment edge between self and targetIval' if self.is_lpo: # assign to correct LPO(s) if isinstance(targetIval,types.SliceType): raise ValueError('you attempted to map LPO --> LPO?!?') self.ns.nlmsaLetters.__iadd__(targetIval) splitList=splitLPOintervals(self.ns.nlmsaLetters.lpoList, slice(self.start,self.stop),targetIval) for ns,src,target in splitList: # save intervals to respective LPOs ns[src]=self.ns.nlmsaLetters.seqs.getIDcoords(target) #LPO-->target if self.ns.nlmsaLetters.is_bidirectional: nsu,myslice=self.ns.nlmsaLetters.seqs.getUnionSlice(target) nsu[myslice]=(ns.id,src.start,src.stop) # save target --> LPO else: if isinstance(targetIval,types.SliceType): # target is LPO splitList=splitLPOintervals(self.ns.nlmsaLetters.lpoList, targetIval,self.seq) for ns,target,src in splitList: self.ns[self.offsetSlice(src)]=(ns.id,target.start,target.stop) if self.ns.nlmsaLetters.is_bidirectional: ns[target]=(self.id,src.start,src.stop) # save LPO --> SRC else: # both src and target are normal seqs. use_virtual_lpo!! self.ns.nlmsaLetters.__iadd__(targetIval) self.ns.nlmsaLetters.init_pairwise_mode() ns_lpo=self.ns.nlmsaLetters.seqlist[self.ns.id -1] # our virtual LPO ns_lpo[self.offsetSlice(self.seq)]=self.ns.nlmsaLetters.seqs \ .getIDcoords(targetIval) # save src --> target if self.ns.nlmsaLetters.is_bidirectional: nsu,myslice=self.ns.nlmsaLetters.seqs.getUnionSlice(targetIval) ns_lpo=self.ns.nlmsaLetters.seqlist[nsu.id -1] # our virtual LPO ns_lpo[myslice]=(self.id,self.start,self.stop) # save target --> src return self # iadd must always return self def __setitem__(self,k,v): if v is not None: raise ValueError('NLMSA cannot save edge-info. Only nlmsa[s1][s2]=None allowed') self+=k def read_seq_dict(pathstem,trypath=None): 'read seqDict for NLMSA' if os.access(pathstem+'.seqDictP',os.R_OK): from pygr import worldbase ifile = file(pathstem+'.seqDictP', 'rb') # pickle is binary file! try: # load from worldbase-aware pickle file seqDict = worldbase._mdb.loads(ifile.read()) finally: ifile.close() elif os.access(pathstem+'.seqDict',os.R_OK): # old-style union header import seqdb seqDict = seqdb.PrefixUnionDict(filename=pathstem+'.seqDict', trypath=trypath) else: raise ValueError('''Unable to find seqDict file %s.seqDictP or %s.seqDict and no seqDict provided as an argument''' % (pathstem,pathstem)) return seqDict def save_seq_dict(pathstem,seqDict): 'save seqDict to a worldbase-aware pickle file' from metabase import dumps ofile = file(pathstem+'.seqDictP','wb') # pickle is binary file! try: ofile.write(dumps(seqDict)) finally: ofile.close() def prune_self_mappings(src_prefix,dest_prefix,is_bidirectional): '''return is_bidirectional flag according to whether source and target are the same genome. This handles axtNet reading, in which mappings between genomes are given in only one direction, whereas mappings between the same genome are given in both directions.''' if src_prefix == dest_prefix: return 0 else: return 1 def nlmsa_textdump_unpickler(filepath,kwargs): from cnestedlist import textfile_to_binaries,NLMSA logger.info('Saving NLMSA indexes from textdump: %s' % filepath) try: buildpath = os.environ['WORLDBASEBUILDDIR'] except KeyError: buildpath = classutil.get_env_or_cwd('PYGRDATABUILDDIR') path = textfile_to_binaries(filepath, buildpath=buildpath, **kwargs) o = NLMSA(path) # now open in read mode from the saved index fileset o._saveLocalBuild = True # mark this for saving in local metabase return o nlmsa_textdump_unpickler.__safe_for_unpickling__ = 1 class NLMSABuilder(object): 'when unpickled triggers construction of NLMSA from textdump' _worldbase_no_cache = True # force worldbase to reload this fresh def __init__(self,filepath,**kwargs): self.filepath = filepath self.kwargs = kwargs def __reduce__(self): return (nlmsa_textdump_unpickler,(self.filepath,self.kwargs)) class SeqCacheOwner(object): 'weak referenceable object: workaround for pyrex extension classes' def __init__(self): self.cachedSeqs = {} def cache_reference(self, seq): 'keep a ref to seqs cached on our behalf' self.cachedSeqs[seq.id] = seq def generate_nlmsa_edges(self, *args, **kwargs): """iterate over all edges for all sequences in the alignment. Very slow for a big alignment!""" for seq in self.seqs: myslice = self[seq] for results in myslice.edges(*args, **kwargs): yield results def get_interval(seq,start,end,ori): "trivial function to get the interval seq[start:end] with requested ori" if ori < 0: return seq.absolute_slice(-end, -start) else: return seq.absolute_slice(start, end) _default_ivals_attrs = dict(idDest='id', startDest='start', stopDest='stop', oriDest='ori') class CoordsToIntervals(object): '''Transforms coord objects to (ival1,ival2) aligned interval pairs. The intervals can come in in two forms: First, as a list, with [src, dest1, dest2, dest3] information; or second, as an object, with attributes specifying src/dest info. ''' def __init__(self, srcDB, destDB=None, alignedIvalsAttrs=_default_ivals_attrs): self.srcDB = srcDB if destDB: self.destDB = destDB else: self.destDB = srcDB self.getAttr = classutil.make_attribute_interface(alignedIvalsAttrs) def __call__(self, alignedCoords): '''Read interval info from alignedCoords and generate actual intervals. Information read is id, start, stop, and orientation (ori). ''' for c in alignedCoords: if isinstance(c, (CoordsGroupStart,CoordsGroupEnd)): yield c # just pass grouping-info through continue try: srcData = c[0] # align everything to the first interval destSet = c[1:] except TypeError: srcData = c # extract both src and dest from ivals object destSet = [c] id = self.getAttr(srcData, 'id') start = self.getAttr(srcData, 'start') stop = self.getAttr(srcData, 'stop') ori = self.getAttr(srcData, 'ori', 1) # default orientation: + srcIval = get_interval(self.srcDB[id], start, stop, ori) # get the dest interval(s) and yield w/src. for destData in destSet: idDest = self.getAttr(destData, 'idDest') startDest = self.getAttr(destData, 'startDest') stopDest = self.getAttr(destData, 'stopDest') oriDest = self.getAttr(destData, 'oriDest', 1) # default ori: + destIval = get_interval(self.destDB[idDest], startDest, stopDest, oriDest) yield srcIval, destIval # generate aligned intervals def add_aligned_intervals(al, alignedIvals): '''Save a set of aligned intervals to alignment. ''' # for each pair of aligned intervals, save them into the alignment. for t in alignedIvals: # is 't' a marker object for start or end of a group of coordinates? if isinstance(t, (CoordsGroupStart, CoordsGroupEnd)): continue # ignore grouping markers (src, dest) = t al += src al[src][dest] = None # save their alignment class CoordsGroupStart(object): '''Marker object indicating start of a coordinates group. See BlastHitParser for an example.''' pass class CoordsGroupEnd(object): '''Marker object indicating end of a group of coordinates. See BlastHitParser for an example.''' pass PKŒ.;¶b£f£fpygr/nlmsa_utils.pyc;ò èu¡Jc @sdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZdefd„ƒYZ dfd„ƒYZ d e fd „ƒYZ e d „Zd efd „ƒYZe d„Zd„Zd„Zd„Zde_defd„ƒYZdefd„ƒYZd„Zd„Ze dddddddd ƒZd!efd"„ƒYZd#„Zd$efd%„ƒYZd&efd'„ƒYZdS((Ns NLMSASeqListcBs>tZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCsti|ƒ||_dS(N(slists__init__sselfs nlmsaSeqDict(sselfs nlmsaSeqDict((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__s cCsZyti||ƒSWn?tj o3|iit|ƒ\}}ti||ƒSnXdS(s)return NLMSASequence for a given nlmsa_idN( slists __getitem__sselfsnlmsaIDs IndexErrors nlmsaSeqDictsIDdictsstrsseqIDsnsID(sselfsnlmsaIDsnsIDsseqID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__ s cCs1|iit|ƒ\}}|iii|SdS(sreturn seq for a given nlmsa_idN( sselfs nlmsaSeqDictsIDdictsstrsnlmsaIDsseqIDsnsIDsnlmsasseqDict(sselfsnlmsaIDsseqIDsnsID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgetSeqscCs$|iit|ƒ\}}|SdS(s!return seqID for a given nlmsa_idN(sselfs nlmsaSeqDictsIDdictsstrsnlmsaIDsseqIDsnsID(sselfsnlmsaIDsseqIDsnsID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgetSeqIDscCs?|t|ƒjotSn||}|iotSntSdS(N(sidslensselfsFalsesnssis_lposTrue(sselfsidsns((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysis_lpos   cCst|ƒSdS(N(slensself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysnextID$s(s__name__s __module__s__init__s __getitem__sgetSeqsgetSeqIDsis_lposnextID(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys NLMSASeqLists      sEmptySliceErrorcBstZRS(N(s__name__s __module__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysEmptySliceError'ssEmptyAlignmentErrorcBstZRS(N(s__name__s __module__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysEmptyAlignmentError*ss EmptySlicecBsªtZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z e d „Z d „Z d „Zd „Zd „Zd„Zd„Zd„Zd„ZRS(s!Empty slice for use by NLMSASlicecCs ||_dS(N(sseqsself(sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__/scOsgSdS(N((sselfsargsskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysedges1scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysitems3scKstgƒSdS(N(siter(sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys iteritems5scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pyskeys7scCstgƒSdS(N(siter(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__iter__9scCs t‚dS(N(sKeyError(sselfsk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__;scCsdSdS(Ni((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__len__=scCsgSdS(N((sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysmatchIntervals?scCstdƒ‚dS(Ns seq not aligned in this interval(sKeyError(sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys findSeqEndsAscCsgSdS(N((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgenerateSeqEndsCscKshSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgroupByIntervalsEscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgroupBySequencesGscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pyssplitIscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysregionsKscCst|i|iƒSdS(N(scmpsselfsseqsother(sselfsother((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__cmp__MscCsgSdS(N((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysrawIvalsOs(s__name__s __module__s__doc__s__init__sedgessitemss iteritemsskeyss__iter__s __getitem__s__len__sNonesmatchIntervalss findSeqEndssgenerateSeqEndssgroupByIntervalssgroupBySequencesssplitsregionss__cmp__srawIvals(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys EmptySlice-s$                 s NLMSASeqDictcBsŒtZdZded„Zdded„Zd„Zd„Zd„Zd „Z d „Z d „Z d „Z d „Z dd„Zd„ZRS(sDindex sequences by pathForward, and use list to keep reverse mappingi@BcCsÄti|ƒt|ƒ|_||_||_||_|djo t}n|djo d}n|t jo6t i |d|ƒ|_ t i |d|ƒ|_n|ƒ|_ |ƒ|_dS(Nsmemoryswsns .seqIDdicts.idDict(sdicts__init__sselfs NLMSASeqListsseqlistsmaxIDsnlmsasfilenamesmodes idDictClasssNones classutils open_shelves seqIDdictsIDdict(sselfsnlmsasfilenamesmodesmaxIDs idDictClass((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__Ts          iÿÿÿÿicCs§|djo|iii|ƒdSnt|tiƒo |}n|i |ƒ}|t jo|ii ƒ}n|||f|i|<||f|it|ƒ|iiii|ƒ\}}|i|i |if|| LPO?!?iN(sselfsis_lpos isinstances targetIvalstypess SliceTypes ValueErrorsnss nlmsaLetterss__iadd__ssplitLPOintervalsslpoListsslicesstartsstops splitListssrcstargetsseqss getIDcoordssis_bidirectionals getUnionSlicesnsusmyslicesidsseqs offsetSlicesinit_pairwise_modesseqlistsns_lpo( sselfs targetIvalssrcsnsustargetsns_lposnss splitListsmyslice((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__iadd__ûs< (((( cCs+|tj otdƒ‚n||7}dS(Ns<NLMSA cannot save edge-info. Only nlmsa[s1][s2]=None allowed(svsNones ValueErrorsselfsk(sselfsksv((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __setitem__s (s__name__s __module__sNones__init__s offsetSlices__iadd__s __setitem__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys BuildMSASliceës  !cCsÉti|dtiƒoNdkl}t|ddƒ}z|ii |i ƒƒ}Wd|i ƒXnZti|dtiƒo)dk }|id|dd|ƒ}ntd||fƒ‚|SdS( sread seqDict for NLMSAs .seqDictP(s worldbasesrbNs.seqDictsfilenamestrypaths\Unable to find seqDict file %s.seqDictP or %s.seqDict and no seqDict provided as an argument(sossaccessspathstemsR_OKspygrs worldbasesfilesifiles_mdbsloadssreadsseqDictsclosesseqdbsPrefixUnionDictstrypaths ValueError(spathstemstrypathsseqdbs worldbasesifilesseqDict((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys read_seq_dict#s  cCsIdkl}t|ddƒ}z|i||ƒƒWd|iƒXdS(s-save seqDict to a worldbase-aware pickle file(sdumpss .seqDictPswbN(smetabasesdumpssfilespathstemsofileswritesseqDictsclose(spathstemsseqDictsdumpssofile((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys save_seq_dict7s cCs||jodSndSdS(s return is_bidirectional flag according to whether source and target are the same genome. This handles axtNet reading, in which mappings between genomes are given in only one direction, whereas mappings between the same genome are given in both directions.iiN(s src_prefixs dest_prefix(s src_prefixs dest_prefixsis_bidirectional((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysprune_self_mappingsAs cCsŒdkl}l}tid|ƒytid}Wn"t j ot i dƒ}nX||d||}||ƒ}t|_|SdS(N(stextfile_to_binariessNLMSAs&Saving NLMSA indexes from textdump: %ssWORLDBASEBUILDDIRsPYGRDATABUILDDIRs buildpath(s cnestedliststextfile_to_binariessNLMSAsloggersinfosfilepathsossenvirons buildpathsKeyErrors classutilsget_env_or_cwdskwargsspathsosTrues_saveLocalBuild(sfilepathskwargss buildpathsNLMSAsospathstextfile_to_binaries((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysnlmsa_textdump_unpicklerKs  is NLMSABuildercBs&tZdZeZd„Zd„ZRS(s;when unpickled triggers construction of NLMSA from textdumpcKs||_||_dS(N(sfilepathsselfskwargs(sselfsfilepathskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__[s cCst|i|iffSdS(N(snlmsa_textdump_unpicklersselfsfilepathskwargs(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __reduce__^s(s__name__s __module__s__doc__sTrues_worldbase_no_caches__init__s __reduce__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys NLMSABuilderXs  s SeqCacheOwnercBs tZdZd„Zd„ZRS(sAweak referenceable object: workaround for pyrex extension classescCs h|_dS(N(sselfs cachedSeqs(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__cscCs||i|itZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCsti|ƒ||_dS(N(slists__init__sselfs nlmsaSeqDict(sselfs nlmsaSeqDict((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__s cCsZyti||ƒSWn?tj o3|iit|ƒ\}}ti||ƒSnXdS(s)return NLMSASequence for a given nlmsa_idN( slists __getitem__sselfsnlmsaIDs IndexErrors nlmsaSeqDictsIDdictsstrsseqIDsnsID(sselfsnlmsaIDsnsIDsseqID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__ s cCs1|iit|ƒ\}}|iii|SdS(sreturn seq for a given nlmsa_idN( sselfs nlmsaSeqDictsIDdictsstrsnlmsaIDsseqIDsnsIDsnlmsasseqDict(sselfsnlmsaIDsseqIDsnsID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgetSeqscCs$|iit|ƒ\}}|SdS(s!return seqID for a given nlmsa_idN(sselfs nlmsaSeqDictsIDdictsstrsnlmsaIDsseqIDsnsID(sselfsnlmsaIDsseqIDsnsID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgetSeqIDscCs?|t|ƒjotSn||}|iotSntSdS(N(sidslensselfsFalsesnssis_lposTrue(sselfsidsns((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysis_lpos   cCst|ƒSdS(N(slensself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysnextID$s(s__name__s __module__s__init__s __getitem__sgetSeqsgetSeqIDsis_lposnextID(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys NLMSASeqLists      sEmptySliceErrorcBstZRS(N(s__name__s __module__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysEmptySliceError'ssEmptyAlignmentErrorcBstZRS(N(s__name__s __module__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysEmptyAlignmentError*ss EmptySlicecBsªtZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z e d „Z d „Z d „Zd „Zd „Zd„Zd„Zd„Zd„ZRS(s!Empty slice for use by NLMSASlicecCs ||_dS(N(sseqsself(sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__/scOsgSdS(N((sselfsargsskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysedges1scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysitems3scKstgƒSdS(N(siter(sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys iteritems5scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pyskeys7scCstgƒSdS(N(siter(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__iter__9scCs t‚dS(N(sKeyError(sselfsk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__;scCsdSdS(Ni((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__len__=scCsgSdS(N((sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysmatchIntervals?scCstdƒ‚dS(Ns seq not aligned in this interval(sKeyError(sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys findSeqEndsAscCsgSdS(N((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgenerateSeqEndsCscKshSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgroupByIntervalsEscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgroupBySequencesGscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pyssplitIscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysregionsKscCst|i|iƒSdS(N(scmpsselfsseqsother(sselfsother((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__cmp__MscCsgSdS(N((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysrawIvalsOs(s__name__s __module__s__doc__s__init__sedgessitemss iteritemsskeyss__iter__s __getitem__s__len__sNonesmatchIntervalss findSeqEndssgenerateSeqEndssgroupByIntervalssgroupBySequencesssplitsregionss__cmp__srawIvals(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys EmptySlice-s$                 s NLMSASeqDictcBsŒtZdZded„Zdded„Zd„Zd„Zd„Zd „Z d „Z d „Z d „Z d „Z dd„Zd„ZRS(sDindex sequences by pathForward, and use list to keep reverse mappingi@BcCsÄti|ƒt|ƒ|_||_||_||_|djo t}n|djo d}n|t jo6t i |d|ƒ|_ t i |d|ƒ|_n|ƒ|_ |ƒ|_dS(Nsmemoryswsns .seqIDdicts.idDict(sdicts__init__sselfs NLMSASeqListsseqlistsmaxIDsnlmsasfilenamesmodes idDictClasssNones classutils open_shelves seqIDdictsIDdict(sselfsnlmsasfilenamesmodesmaxIDs idDictClass((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__Ts          iÿÿÿÿicCs§|djo|iii|ƒdSnt|tiƒo |}n|i |ƒ}|t jo|ii ƒ}n|||f|i|<||f|it|ƒ|iiii|ƒ\}}|i|i |if|| LPO?!?iN(sselfsis_lpos isinstances targetIvalstypess SliceTypes ValueErrorsnss nlmsaLetterss__iadd__ssplitLPOintervalsslpoListsslicesstartsstops splitListssrcstargetsseqss getIDcoordssis_bidirectionals getUnionSlicesnsusmyslicesidsseqs offsetSlicesinit_pairwise_modesseqlistsns_lpo( sselfs targetIvalssrcsnsustargetsns_lposnss splitListsmyslice((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__iadd__ûs< (((( cCs+|tj otdƒ‚n||7}dS(Ns<NLMSA cannot save edge-info. Only nlmsa[s1][s2]=None allowed(svsNones ValueErrorsselfsk(sselfsksv((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __setitem__s (s__name__s __module__sNones__init__s offsetSlices__iadd__s __setitem__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys BuildMSASliceës  !cCsÉti|dtiƒoNdkl}t|ddƒ}z|ii |i ƒƒ}Wd|i ƒXnZti|dtiƒo)dk }|id|dd|ƒ}ntd||fƒ‚|SdS( sread seqDict for NLMSAs .seqDictP(s worldbasesrbNs.seqDictsfilenamestrypaths\Unable to find seqDict file %s.seqDictP or %s.seqDict and no seqDict provided as an argument(sossaccessspathstemsR_OKspygrs worldbasesfilesifiles_mdbsloadssreadsseqDictsclosesseqdbsPrefixUnionDictstrypaths ValueError(spathstemstrypathsseqdbs worldbasesifilesseqDict((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys read_seq_dict#s  cCsIdkl}t|ddƒ}z|i||ƒƒWd|iƒXdS(s-save seqDict to a worldbase-aware pickle file(sdumpss .seqDictPswbN(smetabasesdumpssfilespathstemsofileswritesseqDictsclose(spathstemsseqDictsdumpssofile((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys save_seq_dict7s cCs||jodSndSdS(s return is_bidirectional flag according to whether source and target are the same genome. This handles axtNet reading, in which mappings between genomes are given in only one direction, whereas mappings between the same genome are given in both directions.iiN(s src_prefixs dest_prefix(s src_prefixs dest_prefixsis_bidirectional((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysprune_self_mappingsAs cCsŒdkl}l}tid|ƒytid}Wn"t j ot i dƒ}nX||d||}||ƒ}t|_|SdS(N(stextfile_to_binariessNLMSAs&Saving NLMSA indexes from textdump: %ssWORLDBASEBUILDDIRsPYGRDATABUILDDIRs buildpath(s cnestedliststextfile_to_binariessNLMSAsloggersinfosfilepathsossenvirons buildpathsKeyErrors classutilsget_env_or_cwdskwargsspathsosTrues_saveLocalBuild(sfilepathskwargss buildpathsNLMSAsospathstextfile_to_binaries((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysnlmsa_textdump_unpicklerKs  is NLMSABuildercBs&tZdZeZd„Zd„ZRS(s;when unpickled triggers construction of NLMSA from textdumpcKs||_||_dS(N(sfilepathsselfskwargs(sselfsfilepathskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__[s cCst|i|iffSdS(N(snlmsa_textdump_unpicklersselfsfilepathskwargs(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __reduce__^s(s__name__s __module__s__doc__sTrues_worldbase_no_caches__init__s __reduce__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys NLMSABuilderXs  s SeqCacheOwnercBs tZdZd„Zd„ZRS(sAweak referenceable object: workaround for pyrex extension classescCs h|_dS(N(sselfs cachedSeqs(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__cscCs||i|iend, and letterunit (1 or 3) depending on the ratio of end-start difference vs the actual non-gap letter count. Returns tuple (ori,letterunit)""" if end>start: ori=1 else: ori= -1 ngap=0 for l in seq: if l==gapchar: ngap+=1 seqlen=len(seq)-ngap if ori*float(end-start)/seqlen >2.0: letterunit=3 else: letterunit=1 return ori,letterunit class BlastIval(object): def __repr__(self): return '' class BlastHitParser(object): """reads alignment info from blastall standard output. Method parse_file(fo) reads file object fo, and generates tuples suitable for BlastIval.""" gapchar='-' def __init__(self): self.hit_id=0 self.nline = 0 self.reset() def reset(self): "flush any alignment info, so we can start reading new alignment" self.query_seq="" self.subject_seq="" self.hit_id+=1 def save_query(self,line): self.query_id=line.split()[1] def save_subject(self,line): self.subject_id=line.split()[0][1:] def save_score(self,line): "save a Score: line" self.blast_score=float(line.split()[2]) s=line.split()[7] if s[0]=='e': s='1'+s try: self.e_value= -math.log(float(s))/math.log(10.0) except (ValueError,OverflowError): self.e_value=300. def save_identity(self,line): "save Identities line" s=line.split()[3][1:] self.identity_percent=int(s[:s.find('%')]) def save_query_line(self,line): "save a Query: line" c=line.split() self.query_end=int(c[3]) if not self.query_seq: self.query_start=int(c[1]) if self.query_start < self.query_end: # handles forward orientation self.query_start -= 1 self.query_seq+=c[2] self.seq_start_char=line.find(c[2], 5) # IN CASE BLAST SCREWS UP Sbjct: def save_subject_line(self,line): "save a Sbjct: line, attempt to handle various BLAST insanities" c=line.split() if len(c)<4: # OOPS, BLAST FORGOT TO PUT SPACE BEFORE 1ST NUMBER # THIS HAPPENS IN TBLASTN... WHEN THE SUBJECT SEQUENCE # COVERS RANGE 1-1200, THE FOUR DIGIT NUMBER WILL RUN INTO # THE SEQUENCE, WITH NO SPACE!! c=['Sbjct:',line[6:self.seq_start_char]] \ +line[self.seq_start_char:].split() # FIX BLAST SCREW-UP self.subject_end=int(c[3]) if not self.subject_seq: self.subject_start=int(c[1]) if self.subject_start < self.subject_end: # handles forward orientation self.subject_start -= 1 self.subject_seq+=c[2] lendiff=len(self.query_seq)-len(self.subject_seq) if lendiff>0: # HANDLE TBLASTN SCREWINESS: Sbjct SEQ OFTEN TOO SHORT!! # THIS APPEARS TO BE ASSOCIATED ESPECIALLY WITH STOP CODONS * self.subject_seq+=lendiff*'A' # EXTEND TO SAME LENGTH AS QUERY... elif lendiff<0 and not hasattr(self,'ignore_query_truncation'): # WHAT THE HECK?!?! WARN THE USER: BLAST RESULTS ARE SCREWY... raise ValueError( """BLAST appears to have truncated the Query: sequence to be shorter than the Sbjct: sequence: Query: %s Sbjct: %s This should not happen! To ignore this error, please create an attribute ignore_query_truncation on the BlastHitParser object.""" % (self.query_seq,self.subject_seq)) def get_interval_obj(self, q_start, q_end, s_start, s_end, query_ori, query_factor, subject_ori, subject_factor): "return interval result as an object with attributes" o = BlastIval() o.hit_id = self.hit_id o.src_id = self.query_id o.dest_id = self.subject_id o.blast_score = self.blast_score o.e_value = self.e_value o.percent_id = self.identity_percent o.src_ori = query_ori o.dest_ori = subject_ori query_start = self.query_start+q_start*query_ori*query_factor query_end = self.query_start+q_end*query_ori*query_factor subject_start = self.subject_start+s_start*subject_ori*subject_factor subject_end = self.subject_start+s_end*subject_ori*subject_factor if query_start=0: # END OF AN UNGAPPED INTERVAL yield self.get_interval_obj(q_start, i_query, s_start, i_subject, query_ori, query_factor, subject_ori, subject_factor) q_start= -1 elif q_start<0: # START OF AN UNGAPPED INTERVAL q_start=i_query s_start=i_subject if self.query_seq[i]!=self.gapchar: # COUNT QUERY LETTERS i_query+=1 if self.subject_seq[i]!=self.gapchar: # COUNT SUBJECT LETTERS i_subject+=1 if q_start>=0: # REPORT THE LAST INTERVAL yield self.get_interval_obj(q_start, i_query, s_start, i_subject, query_ori, query_factor, subject_ori, subject_factor) yield CoordsGroupEnd() def parse_file(self,myfile): "generate interval tuples by parsing BLAST output from myfile" for line in myfile: self.nline += 1 if self.is_valid_hit() and \ (is_line_start('>',line) or is_line_start(' Score =',line) \ or is_line_start(' Database:',line) \ or is_line_start('Query=',line)): for t in self.generate_intervals(): # REPORT THIS ALIGNMENT yield t # GENERATE ALL ITS INTERVAL MATCHES self.reset() # RESET TO START A NEW ALIGNMENT if is_line_start('Query=',line): self.save_query(line) elif is_line_start('>',line): self.save_subject(line) elif is_line_start(' Score =',line): self.save_score(line) elif 'Identities =' in line: self.save_identity(line) elif is_line_start('Query:',line): self.save_query_line(line) elif is_line_start('Sbjct:',line): self.save_subject_line(line) if self.nline == 0: # no blast output?? raise IOError('no BLAST output. Check that blastall is in your PATH') if __name__=='__main__': import sys p=BlastHitParser() for t in p.parse_file(sys.stdin): print t PKŒ.;¸«ã€Î'Î'pygr/parse_blast.pyc;ò èu¡Jc@s³dklZdkZdklZlZd„Zdd„Zdefd„ƒYZ defd „ƒYZ e d jo8dk Z e ƒZ x#e ie iƒD] ZeGHqœWndS( (s generatorsN(sCoordsGroupStartsCoordsGroupEndcCs||t|ƒ jSdS(s$check whether line begins with tokenN(stokenslineslen(stokensline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys is_line_startss-c Csœ||jo d}nd}d}x)|D]!}||jo|d7}q*q*Wt|ƒ|}|t ||ƒ|djo d}nd}||fSdS(sÕtry to determine orientation (1 or -1) based on whether start>end, and letterunit (1 or 3) depending on the ratio of end-start difference vs the actual non-gap letter count. Returns tuple (ori,letterunit)iiÿÿÿÿif2.0iN( sendsstartsorisngapsseqslsgapcharslensseqlensfloats letterunit( sstartsendsseqsgapchars letterunitsngapsseqlenslsori((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysget_ori_letterunit s    s BlastIvalcBstZd„ZRS(NcCsdt|iƒdSdS(Ns (sreprsselfs__dict__(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys__repr__s(s__name__s __module__s__repr__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys BlastIvalssBlastHitParsercBs€tZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „ZRS(s”reads alignment info from blastall standard output. Method parse_file(fo) reads file object fo, and generates tuples suitable for BlastIval.s-cCs d|_d|_|iƒdS(Ni(sselfshit_idsnlinesreset(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys__init__'s  cCs%d|_d|_|id7_dS(s?flush any alignment info, so we can start reading new alignmentsiN(sselfs query_seqs subject_seqshit_id(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysreset+s  cCs|iƒd|_dS(Ni(slinessplitsselfsquery_id(sselfsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_query0scCs|iƒdd|_dS(Nii(slinessplitsselfs subject_id(sselfsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_subject2scCs›t|iƒdƒ|_|iƒd}|ddjod|}ny*tit|ƒƒ tidƒ|_Wn"t t fj od|_nXdS( ssave a Score: lineiiises1f10.0f300.0N( sfloatslinessplitsselfs blast_scoresssmathslogse_values ValueErrors OverflowError(sselfsliness((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_score4s*cCs4|iƒdd}t||idƒ ƒ|_dS(ssave Identities lineiis%N(slinessplitsssintsfindsselfsidentity_percent(sselfsliness((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_identity>scCs—|iƒ}t|dƒ|_|i o=t|dƒ|_|i|ijo|id8_qgn|i|d7_|i|ddƒ|_ dS(ssave a Query: lineiiiiN( slinessplitscsintsselfs query_ends query_seqs query_startsfindsseq_start_char(sselfslinesc((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pyssave_query_lineBs  cCs:|iƒ}t|ƒdjo+d|d|i!g||iiƒ}nt|dƒ|_|i o=t|dƒ|_ |i |ijo|i d8_ q¥n|i|d7_t|i ƒt|iƒ}|djo|i|d7_n?|djot |d ƒ o t d |i |ifƒ‚nd S( s>save a Sbjct: line, attempt to handle various BLAST insanitiesisSbjct:iiiiisAsignore_query_truncationsOBLAST appears to have truncated the Query: sequence to be shorter than the Sbjct: sequence: Query: %s Sbjct: %s This should not happen! To ignore this error, please create an attribute ignore_query_truncation on the BlastHitParser object.N(slinessplitscslensselfsseq_start_charsints subject_ends subject_seqs subject_starts query_seqslendiffshasattrs ValueError(sselfslinescslendiff((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pyssave_subject_lineLs +  c Cs)tƒ} |i| _|i| _|i| _|i| _|i | _ |i | _ || _ || _|i|||} |i|||} |i|||} |i|||} | | jo| | _| | _n| | _| | _| | jo| | _| | _n| | _| | _| SdS(s3return interval result as an object with attributesN(s BlastIvalsosselfshit_idsquery_idssrc_ids subject_idsdest_ids blast_scorese_valuesidentity_percents percent_ids query_orissrc_oris subject_orisdest_oris query_startsq_starts query_factorsq_ends query_ends subject_startss_startssubject_factorss_ends subject_ends src_startssrc_ends dest_startsdest_end(sselfsq_startsq_endss_startss_ends query_oris query_factors subject_orissubject_factors subject_ends query_endsos subject_starts query_start((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysget_interval_objis2                   cCs|io|iSdS(N(sselfs query_seqs subject_seq(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys is_valid_hit†sc cstƒVt|i|i|i|iƒ\}}t|i |i |i |iƒ\}}d} d}d}d}xïtt|iƒƒD]Ø}|i||ijp|i ||ijo=| djo&|i| |||||||ƒVnd} n| djo|} |}n|i||ijo|d7}n|i ||ijo|d7}qƒqƒW| djo&|i| |||||||ƒVntƒVdS(s2generate interval tuples for the current alignmentiÿÿÿÿiiN(sCoordsGroupStartsget_ori_letterunitsselfs query_starts query_ends query_seqsgapchars query_oris query_factors subject_starts subject_ends subject_seqs subject_orissubject_factorsq_startss_startsi_querys i_subjectsrangeslensisget_interval_objsCoordsGroupEnd( sselfs query_factors subject_oris query_oriss_startsi_querysis i_subjectssubject_factorsq_start((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysgenerate_intervalsˆs@  .       ccs}xV|D]N}|id7_|iƒo=td|ƒp-td|ƒptd|ƒp td|ƒo)x|iƒD] }|VqvW|iƒntd|ƒo|i |ƒqtd|ƒo|i |ƒqtd|ƒo|i |ƒqd|jo|i |ƒqtd|ƒo|i |ƒqtd|ƒo|i|ƒqqW|id jotd ƒ‚nd S( s<generate interval tuples by parsing BLAST output from myfileis>s Score =s Database:sQuery=s Identities =sQuery:sSbjct:is5no BLAST output. Check that blastall is in your PATHN(smyfileslinesselfsnlines is_valid_hits is_line_startsgenerate_intervalsstsresets save_querys save_subjects save_scores save_identityssave_query_linessave_subject_linesIOError(sselfsmyfilestsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys parse_file«s.M  (s__name__s __module__s__doc__sgapchars__init__sresets save_querys save_subjects save_scores save_identityssave_query_linessave_subject_linesget_interval_objs is_valid_hitsgenerate_intervalss parse_file(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysBlastHitParser"s          #s__main__(s __future__s generatorssmaths nlmsa_utilssCoordsGroupStartsCoordsGroupEnds is_line_startsget_ori_letterunitsobjects BlastIvalsBlastHitParsers__name__ssyssps parse_filesstdinst( s is_line_startsBlastHitParsers BlastIvalsget_ori_letterunitssysspsCoordsGroupEndstsCoordsGroupStartsmaths generators((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys?s    £   PK Œ.;¸«ã€Î'Î'pygr/parse_blast.pyo;ò èu¡Jc@s³dklZdkZdklZlZd„Zdd„Zdefd„ƒYZ defd „ƒYZ e d jo8dk Z e ƒZ x#e ie iƒD] ZeGHqœWndS( (s generatorsN(sCoordsGroupStartsCoordsGroupEndcCs||t|ƒ jSdS(s$check whether line begins with tokenN(stokenslineslen(stokensline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys is_line_startss-c Csœ||jo d}nd}d}x)|D]!}||jo|d7}q*q*Wt|ƒ|}|t ||ƒ|djo d}nd}||fSdS(sÕtry to determine orientation (1 or -1) based on whether start>end, and letterunit (1 or 3) depending on the ratio of end-start difference vs the actual non-gap letter count. Returns tuple (ori,letterunit)iiÿÿÿÿif2.0iN( sendsstartsorisngapsseqslsgapcharslensseqlensfloats letterunit( sstartsendsseqsgapchars letterunitsngapsseqlenslsori((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysget_ori_letterunit s    s BlastIvalcBstZd„ZRS(NcCsdt|iƒdSdS(Ns (sreprsselfs__dict__(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys__repr__s(s__name__s __module__s__repr__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys BlastIvalssBlastHitParsercBs€tZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „ZRS(s”reads alignment info from blastall standard output. Method parse_file(fo) reads file object fo, and generates tuples suitable for BlastIval.s-cCs d|_d|_|iƒdS(Ni(sselfshit_idsnlinesreset(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys__init__'s  cCs%d|_d|_|id7_dS(s?flush any alignment info, so we can start reading new alignmentsiN(sselfs query_seqs subject_seqshit_id(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysreset+s  cCs|iƒd|_dS(Ni(slinessplitsselfsquery_id(sselfsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_query0scCs|iƒdd|_dS(Nii(slinessplitsselfs subject_id(sselfsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_subject2scCs›t|iƒdƒ|_|iƒd}|ddjod|}ny*tit|ƒƒ tidƒ|_Wn"t t fj od|_nXdS( ssave a Score: lineiiises1f10.0f300.0N( sfloatslinessplitsselfs blast_scoresssmathslogse_values ValueErrors OverflowError(sselfsliness((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_score4s*cCs4|iƒdd}t||idƒ ƒ|_dS(ssave Identities lineiis%N(slinessplitsssintsfindsselfsidentity_percent(sselfsliness((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_identity>scCs—|iƒ}t|dƒ|_|i o=t|dƒ|_|i|ijo|id8_qgn|i|d7_|i|ddƒ|_ dS(ssave a Query: lineiiiiN( slinessplitscsintsselfs query_ends query_seqs query_startsfindsseq_start_char(sselfslinesc((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pyssave_query_lineBs  cCs:|iƒ}t|ƒdjo+d|d|i!g||iiƒ}nt|dƒ|_|i o=t|dƒ|_ |i |ijo|i d8_ q¥n|i|d7_t|i ƒt|iƒ}|djo|i|d7_n?|djot |d ƒ o t d |i |ifƒ‚nd S( s>save a Sbjct: line, attempt to handle various BLAST insanitiesisSbjct:iiiiisAsignore_query_truncationsOBLAST appears to have truncated the Query: sequence to be shorter than the Sbjct: sequence: Query: %s Sbjct: %s This should not happen! To ignore this error, please create an attribute ignore_query_truncation on the BlastHitParser object.N(slinessplitscslensselfsseq_start_charsints subject_ends subject_seqs subject_starts query_seqslendiffshasattrs ValueError(sselfslinescslendiff((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pyssave_subject_lineLs +  c Cs)tƒ} |i| _|i| _|i| _|i| _|i | _ |i | _ || _ || _|i|||} |i|||} |i|||} |i|||} | | jo| | _| | _n| | _| | _| | jo| | _| | _n| | _| | _| SdS(s3return interval result as an object with attributesN(s BlastIvalsosselfshit_idsquery_idssrc_ids subject_idsdest_ids blast_scorese_valuesidentity_percents percent_ids query_orissrc_oris subject_orisdest_oris query_startsq_starts query_factorsq_ends query_ends subject_startss_startssubject_factorss_ends subject_ends src_startssrc_ends dest_startsdest_end(sselfsq_startsq_endss_startss_ends query_oris query_factors subject_orissubject_factors subject_ends query_endsos subject_starts query_start((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysget_interval_objis2                   cCs|io|iSdS(N(sselfs query_seqs subject_seq(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys is_valid_hit†sc cstƒVt|i|i|i|iƒ\}}t|i |i |i |iƒ\}}d} d}d}d}xïtt|iƒƒD]Ø}|i||ijp|i ||ijo=| djo&|i| |||||||ƒVnd} n| djo|} |}n|i||ijo|d7}n|i ||ijo|d7}qƒqƒW| djo&|i| |||||||ƒVntƒVdS(s2generate interval tuples for the current alignmentiÿÿÿÿiiN(sCoordsGroupStartsget_ori_letterunitsselfs query_starts query_ends query_seqsgapchars query_oris query_factors subject_starts subject_ends subject_seqs subject_orissubject_factorsq_startss_startsi_querys i_subjectsrangeslensisget_interval_objsCoordsGroupEnd( sselfs query_factors subject_oris query_oriss_startsi_querysis i_subjectssubject_factorsq_start((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysgenerate_intervalsˆs@  .       ccs}xV|D]N}|id7_|iƒo=td|ƒp-td|ƒptd|ƒp td|ƒo)x|iƒD] }|VqvW|iƒntd|ƒo|i |ƒqtd|ƒo|i |ƒqtd|ƒo|i |ƒqd|jo|i |ƒqtd|ƒo|i |ƒqtd|ƒo|i|ƒqqW|id jotd ƒ‚nd S( s<generate interval tuples by parsing BLAST output from myfileis>s Score =s Database:sQuery=s Identities =sQuery:sSbjct:is5no BLAST output. Check that blastall is in your PATHN(smyfileslinesselfsnlines is_valid_hits is_line_startsgenerate_intervalsstsresets save_querys save_subjects save_scores save_identityssave_query_linessave_subject_linesIOError(sselfsmyfilestsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys parse_file«s.M  (s__name__s __module__s__doc__sgapchars__init__sresets save_querys save_subjects save_scores save_identityssave_query_linessave_subject_linesget_interval_objs is_valid_hitsgenerate_intervalss parse_file(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysBlastHitParser"s          #s__main__(s __future__s generatorssmaths nlmsa_utilssCoordsGroupStartsCoordsGroupEnds is_line_startsget_ori_letterunitsobjects BlastIvalsBlastHitParsers__name__ssyssps parse_filesstdinst( s is_line_startsBlastHitParsers BlastIvalsget_ori_letterunitssysspsCoordsGroupEndstsCoordsGroupStartsmaths generators((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys?s    £   PKŒ|;;*G]]pygr/schema.py import types # STORES DICTIONARY OF ATTRIBUTE-BOUND GRAPHS # AND LIST OF UNBOUND GRAPHS class SchemaDict(dict): """ Container for schema rules bound to a class or object. Rules are stored in two indexes for fast access, indexed by graph, and indexed by attrname. Use += and -= to add or remove rules. """ def __init__(self,newlist=(),baselist=()): "Initialize schema list from list of base classes and newlist of rules" self.attrs={} dict.__init__(self) # COMBINE SCHEMAS FROM PARENTS WITH NEW SCHEMA LIST for b in baselist: if hasattr(b,'__class_schema__'): self.update(b.__class_schema__) self.attrs.update(b.__class_schema__.attrs) for i in newlist: # newlist OVERRIDES OLD DEFS FROM baselist self += i def __iadd__(self,i): "Add a schema rule to this SchemaDict" g=i[0] if len(i)>=2: if isinstance(i[1],types.StringType): if i[1] in self.attrs: # REMOVE OLD ENTRY self -= self.attrs[i[1]] self.attrs[i[1]]=i # SAVE IN INDEX ACCORDING TO ATTR NAME else: raise TypeError('Attribute name must be a string') if g not in self: self[g]=[] self[g].append(i) # SAVE IN GRAPH INDEX return self # REQUIRED FROM iadd()!! def __isub__(self,i): "Remove a schema rule from this SchemaDict" g=i[0] if g not in self: raise KeyError('graph not found in SchemaDict!') self[g].remove(i) # REMOVE OLD ENTRY if len(self[g])==0: # REMOVE EMPTY LIST del self[g] if len(i)>=2: if isinstance(i[1],types.StringType): if i[1] not in self.attrs: raise KeyError('attribute not found in SchemaDict!') del self.attrs[i[1]] # REMOVE OLD ENTRY else: raise TypeError('Attribute name must be a string') return self # REQUIRED FROM iadd()!! def initInstance(self,obj): "Add obj as new node to all graphs referenced by this SchemaDict." for g,l in self.items(): # GET ALL OUR RULES for s in l: if obj not in g: g.__iadd__(obj,(s,)) # ADD OBJECT TO GRAPH USING RULE s def getschema(self,attr=None,graph=None): "Return list of schema rules that match attr / graph arguments." if attr: if attr in self.attrs: return [self.attrs[attr]] elif graph: if graph in self: return self[graph] else: raise ValueError('You must specify an attribute or graph.') return [] # DIDN'T FIND ANYTHING class SchemaList(list): "Temporary container for returned schema list, with attached methods" def __init__(self,obj): self.obj=obj # OBJECT THAT WE'RE DESCRIBING SCHEMA OF list.__init__(self) # CALL SUPERCLASS CONSTRUCTOR def __iadd__(self,rule): "Add a new schema rule to object described by this SchemaList" if not hasattr(self.obj,'__schema__'): self.obj.__schema__=SchemaDict() self.obj.__schema__ += rule return self # REQUIRED FROM iadd()!! # PROBABLY NEED AN __isub__() TOO?? ###################### # getschema, getnodes, getedges # these functions are analogous to getattr, except they get graph information def getschema(o,attr=None,graph=None): "Get list of schema rules for object o that match attr / graph arguments." found=SchemaList(o) attrs={} if hasattr(o,'__schema__'): for s in o.__schema__.getschema(attr,graph): found.append(s) if isinstance(s[1],types.StringType): attrs[s[1]]=None if attr and len(found)>0: # DON'T PROCEED return found if hasattr(o,'__class_schema__'): for s in o.__class_schema__.getschema(attr,graph): if not isinstance(s[1],types.StringType) or s[1] not in attrs: found.append(s) # DON'T OVERWRITE OBJECT __schema__ BINDINGS return found def setschema(o,attr,graph): "Bind object to graph, and if attr not None, also bind graph to this attribute." if not hasattr(o,'__schema__'): o.__schema__=SchemaDict() o.__schema__ += (graph,attr) def getnodes(o,attr=None,graph=None): """Get destination nodes from graph bindings of o, limited to the specific attribute or graph if specified""" if attr: if hasattr(o,'__schema__') and attr in o.__schema__: return getattr(o,o.__schema__[attr][2]) # RETURN THE PRODUCT if hasattr(o,'__class_schema__') and attr in o.__class_schema__: return getattr(o,o.__class_schema__[attr][2]) # RETURN THE PRODUCT raise AttributeError('No attribute named %s in object %s' % (attr,o)) elif graph: # JUST LOOK UP THE GRAPH TRIVIALLY return graph[o] else: # SHOULD WE GET ALL NODES FROM ALL SCHEMA ENTRIES? HOW?? raise ValueError('You must pass an attribute name or graph') def getedges(o,attr=None,graph=None): """Get edges from graph bindings of o, limited to the specific attribute or graph if specified""" g=getnodes(o,attr,graph) # CAN JUST REUSE THE LOGIC OF getnodes if g and hasattr(g,'edges'): return g.edges() else: return None PKŒ.;ÖT''pygr/schema.pyc;ò éæ…Jc@sodkZdefd„ƒYZdefd„ƒYZeed„Zd„Zeed„Zeed„Z dS( Ns SchemaDictcBsGtZdZffd„Zd„Zd„Zd„Zeed„ZRS(sÇ Container for schema rules bound to a class or object. Rules are stored in two indexes for fast access, indexed by graph, and indexed by attrname. Use += and -= to add or remove rules. cCs€h|_ti|ƒxH|D]@}t|dƒo*|i|iƒ|ii|iiƒqqWx|D]}||7}qhWdS(sEInitialize schema list from list of base classes and newlist of ruless__class_schema__N( sselfsattrssdicts__init__sbaselistsbshasattrsupdates__class_schema__snewlistsi(sselfsnewlistsbaselistsbsi((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__init__ s  cCsº|d}t|ƒdjoit|dtiƒoB|d|ijo||i|d8}n||i|dReturn list of schema rules that match attr / graph arguments.s'You must specify an attribute or graph.N(sattrsselfsattrssgraphs ValueError(sselfsattrsgraph((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys getschema>s  ( s__name__s __module__s__doc__s__init__s__iadd__s__isub__s initInstancesNones getschema(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys SchemaDicts    s SchemaListcBs tZdZd„Zd„ZRS(sCTemporary container for returned schema list, with attached methodscCs||_ti|ƒdS(N(sobjsselfslists__init__(sselfsobj((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__init__Os cCsAt|idƒ otƒ|i_n|ii|7_|SdS(s<Add a new schema rule to object described by this SchemaLists __schema__N(shasattrsselfsobjs SchemaDicts __schema__srule(sselfsrule((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__iadd__Ss (s__name__s __module__s__doc__s__init__s__iadd__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys SchemaListMs  cCst|ƒ}h}t|dƒoZxW|ii||ƒD]<}|i |ƒt |dt i ƒot||dReturn list of schema rules that match attr / graph arguments.s'You must specify an attribute or graph.N(sattrsselfsattrssgraphs ValueError(sselfsattrsgraph((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys getschema>s  ( s__name__s __module__s__doc__s__init__s__iadd__s__isub__s initInstancesNones getschema(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys SchemaDicts    s SchemaListcBs tZdZd„Zd„ZRS(sCTemporary container for returned schema list, with attached methodscCs||_ti|ƒdS(N(sobjsselfslists__init__(sselfsobj((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__init__Os cCsAt|idƒ otƒ|i_n|ii|7_|SdS(s<Add a new schema rule to object described by this SchemaLists __schema__N(shasattrsselfsobjs SchemaDicts __schema__srule(sselfsrule((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__iadd__Ss (s__name__s __module__s__doc__s__init__s__iadd__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys SchemaListMs  cCst|ƒ}h}t|dƒoZxW|ii||ƒD]<}|i |ƒt |dt i ƒot||d self._cache_max: # TRUNCATE EXCESSIVE LENGTH ival=(ival[0], ival[0] + self._cache_max) # @CTB untested d[id]=[ival[0], ival[1]] try: self._cache[owner] = d # ADD TO EXISTING CACHE except AttributeError: self._cache = weakref.WeakKeyDictionary() # AUTOMATICALLY REMOVE self._cache[owner] = d # FROM CACHE IF owner GOES OUT OF SCOPE def strsliceCache(self, seq, start, stop): """Get strslice using cache hints, if any available.""" try: cacheDict=self._cache except AttributeError: raise IndexError('no cache present') for owner, d in cacheDict.items(): try: ival = d[seq.id] except KeyError: continue # NOT IN THIS CACHE, SO SKIP @CTB untested ival_start, ival_stop = ival[:2] if start >= ival_start and stop <= ival_stop: # CONTAINED IN ival try: s = ival[2] # get seq string from our cache except IndexError: # use strslice() to retrieve from storage s = seq.strslice(ival_start, ival_stop, useCache=False) ival.append(s) try: # does owner want to reference this cached seq? save_f = owner.cache_reference except AttributeError: pass # no, so nothing to do else: # let owner control caching in our _weakValueDict save_f(seq) # # @CTB untested return s[start - ival_start:stop - ival_start] raise IndexError('interval not found in cache') # @CTB untested # these methods should all be implemented on all SequenceDBs. def close(self): pass # subclass should implement closing of its open resources! def __iter__(self): return iter(self.seqInfoDict) def iteritems(self): for seqID in self: yield seqID, self[seqID] def __len__(self): return len(self.seqInfoDict) def __getitem__(self, seqID): """Retrieve sequence by id, using cache if available.""" try: # for speed, default case (cache hit) should return immediately return self._weakValueDict[seqID] except KeyError: # not in cache? try loading. try: s = self.itemClass(self, seqID) except KeyError: raise KeyError("no key '%s' in database %s" % (seqID, repr(self))) self._weakValueDict[seqID] = s # save in cache. return s def keys(self): return self.seqInfoDict.keys() def __contains__(self, key): return key in self.seqInfoDict def __repr__(self): return "<%s '%s'>" % (self.__class__.__name__, self.itemClass.__class__.__name__) def clear_cache(self): """Empty the cache.""" self._weakValueDict.clear() # these methods should not be implemented for read-only database. clear = setdefault = pop = popitem = copy = update = \ classutil.read_only_error #### # # FileDBSequence and SequenceFileDB, and associated support classes. # class _FileDBSeqDescriptor(object): """Descriptor to retrieve entire sequence from seqLenDict.""" def __get__(self, obj, objtype): length = obj.db.seqLenDict[obj.id][0] return obj.strslice(0, length) class FileDBSequence(SequenceBase): """Default sequence object for file-based storage mechanism. See SequenceFileDB for the associated database class. In general, you should not create objects from this class directly; retrieve them from SequenceFileDB objects, instead. NOTE: 'self.db' is attached to all instances of this class that come from a particular database by 'classutil.get_bound_subclass'. """ seq = _FileDBSeqDescriptor() # dynamically retrieve 'seq'. __reduce__ = classutil.item_reducer # for pickling purposes. def __init__(self, db, id): self.id = id SequenceBase.__init__(self) if self.id not in self.db.seqLenDict: raise KeyError('sequence %s not in db %s' % (self.id, self.db)) def __len__(self): """Unpack this sequence's length from the seqLenDict.""" return self.db.seqLenDict[self.id][0] def strslice(self, start, end, useCache=True): """Access slice of a sequence efficiently, using seqLenDict info.""" if useCache: # If it's in the cache, use that! try: return self.db.strsliceCache(self, start, end) except IndexError: pass return self.db.strslice(self.id, start, end) class SequenceFileDB(SequenceDB): """Main class for file-based storage of a sequence database. By default, SequenceFileDB uses a seqLenDict, a.k.a. a shelve index of sequence lengths and offsets, to retrieve sequence slices with fseek. Thus entire chromosomes (for example) do not have to be loaded to retrieve a subslice. Takes one required argument, 'filepath', which should be the name of a FASTA file (or a file whose format is understood by your custom reader; see 'reader' kw arg, and the _store_seqlen_dict function). The SequenceFileDB seqInfoDict interface is a wrapper around the seqLenDict created by the __init__ function. """ itemClass = FileDBSequence # copy _pickleAttrs and add 'filepath' _pickleAttrs = SequenceDB._pickleAttrs.copy() _pickleAttrs['filepath'] = 0 def __init__(self, filepath, reader=None, **kwargs): # make filepath a pickleable attribute. self.filepath = classutil.SourceFileName(str(filepath)) fullpath = self.filepath + '.seqlen' # build the seqLenDict if it doesn't already exist try: seqLenDict = classutil.open_shelve(fullpath, 'r') except NoSuchFileError: seqLenDict = self._create_seqLenDict(fullpath, filepath, reader) self.seqLenDict = seqLenDict self.seqInfoDict = _SeqLenDictWrapper(self) # standard interface # initialize base class. dbname = os.path.basename(filepath) SequenceDB.__init__(self, filepath=filepath, dbname=dbname, **kwargs) def close(self): '''close our open shelve index file and _pureseq...''' self.seqLenDict.close() try: do_close = self._pureseq.close except AttributeError: pass # _pureseq not open yet, so nothing to do else: do_close() def __repr__(self): return "<%s '%s'>" % (self.__class__.__name__, self.filepath) def _create_seqLenDict(self, dictpath, seqpath, reader=None): """Create a seqLenDict from 'seqpath' and store in 'dictpath'.""" seqLenDict = classutil.open_shelve(dictpath, 'n') try: logger.debug('Building sequence length index...') _store_seqlen_dict(seqLenDict, seqpath, reader) finally: seqLenDict.close() # close after writing, no matter what! return classutil.open_shelve(dictpath, 'r') # re-open read-only def strslice(self, seqID, start, end, useCache=True): """Access slice of a sequence efficiently, using seqLenDict info.""" # Retrieve sequence from the .pureseq file based on seqLenDict # information. try: ifile=self._pureseq except AttributeError: fullpath = self.filepath + '.pureseq' ifile = file(fullpath, 'rb') self._pureseq = ifile # Now, read in the actual slice. offset = self.seqLenDict[seqID][1] ifile.seek(offset + start) return ifile.read(end - start) # Some support classes for the SeqLenDict mechanism. class BasicSeqInfo(object): """Wrapper to provide the correct seqInfoDict-style object information. This boils down to providing id, db, length, and possibly offset. """ def __init__(self, seqID, seqDB, length=None): self.id = seqID self.db = seqDB if length is None: self.length = len(seqDB[seqID]) # generic but possibly slow else: self.length = length class _SeqLenObject(BasicSeqInfo): """Wrapper for use with a seqLenDict """ def __init__(self, seqID, seqDB): length, self.offset = seqDB.seqLenDict[seqID] BasicSeqInfo.__init__(self, seqID, seqDB, length) class BasicSeqInfoDict(object, UserDict.DictMixin): """Wrapper around SequenceDB.seqLenDict to provide seqInfoDict behavior. This basic version just gets the length from the sequence object itself. """ itemClass = BasicSeqInfo def __init__(self, db): self.seqDB = db def __getitem__(self, k): return self.itemClass(k, self.seqDB) def __len__(self): return len(self.seqDB.seqLenDict) def __iter__(self): return iter(self.seqDB.seqLenDict) def keys(self): return self.seqDB.seqLenDict.keys() class _SeqLenDictWrapper(BasicSeqInfoDict): """ The default storage mechanism for sequences implemented by FileDBSequence and SequenceFileDB puts everything in seqLenDict, a shelve index of lengths and offsets. This class wraps that dictionary to provide the interface that SequenceDB expects to see. """ itemClass = _SeqLenObject class _SeqLenDictSaver(object): """Support for generic reading functions, called by _store_seqlen_dict. This allows you to specify your own 'reader' function when constructing a FileSequenceDB, e.g. so that you could read something other than FASTA files into a seqLenDict. Pass in this function as the 'reader' kwarg to FileSequenceDB. Custom reader functions should take a file handle and a filename, and return a list of sequence info objects with 'id', 'length', and 'sequence' attributes for each sequence in the given file/filename. _SeqLenDictSaver will then construct a '.pureseq' file containing the concatenated sequences and fill in the seqLenDict appropriately. """ def __init__(self, reader): self.reader = reader def __call__(self, d, ifile, filename): offset = 0L pureseq_fp = file(filename + '.pureseq', 'wb') try: for o in self.reader(ifile, filename): # store the length & offset in the seqLenDict d[o.id] = o.length, offset offset += o.length if o.length != len(o.sequence): raise ValueError('length does not match sequence: %s,%d' % (o.id, o.length)) pureseq_fp.write(o.sequence) finally: pureseq_fp.close() def _store_seqlen_dict(d, filename, reader=None, mode='rU'): """Store sequence lengths in a dictionary, e.g. a seqLenDict. Used by SequenceFileDB._create_seqLenDict. The 'reader' function implements a custom sequence format reader; by default, _store_seqlen_dict uses seqfmt.read_fasta_lengths, which reads FASTA-format files. See _SeqLenDictSaver for information on building a custom 'reader', and see the seqdb docs for an example. """ # if a custom reader function was passed in, run that. builder = seqfmt.read_fasta_lengths if reader is not None: builder = _SeqLenDictSaver(reader) ifile = file(filename, mode) try: builder(d, ifile, filename) # run the builder on our sequence set finally: ifile.close() #### # # class PrefixUnionDict and associated support classes. # class _PrefixUnionDictInverse(object): """Provide inverse (~) operator behavior for PrefixUnionDicts. This enables ~pud to return a database that, given a sequence object, returns the corresponding key (prefix.id) to retrieve that sequence object in the pud. """ def __init__(self, db): self.db = db def __getitem__(self, ival): seq = ival.pathForward # get the top-level sequence object try: # for speed, normal case should execute immediately prefix = self.db.dicts[seq.db] except KeyError: try: # @CTB abstraction boundary violation! keep? how test? if seq.pathForward._anno_seq.db in self.db.dicts: raise KeyError('''\ this annotation is not in the PrefixUnion, but its sequence is. You can get that using its \'sequence\' attribute.''') except AttributeError: pass raise KeyError('seq.db not in PrefixUnionDict') return prefix + self.db.separator + str(seq.id) def __contains__(self, seq): try: return seq.pathForward.db in self.db.dicts except AttributeError: return False class _PrefixUnionMemberDict(object, UserDict.DictMixin): """ @CTB confusing/inappropriate use of a dict interface! keep?? @CTB document. 'd[prefix]=value; d[k] returns value if k is a member of prefix' """ def __init__(self, puDict, default=None, attrMethod=lambda x:x.pathForward.db): self.values = {} self.puDict = puDict self._attrMethod = attrMethod if default is not None: self.default = default # @CTB can we use setdefault for this? def keys(self): return self.puDict.prefixDict.keys() possibleKeys = keys # legacy interface (?) def __setitem__(self, k, v): if k not in self.puDict.prefixDict: raise KeyError('key %s is not a valid union prefix string!' % k) new_k = self.puDict.prefixDict[k] self.values[new_k] = v def __getitem__(self, k): try: db = self._attrMethod(k) except AttributeError: raise TypeError('wrong key type? _attrMethod() failed.') if db not in self.values: try: return self.default except AttributeError: # no default value - raise KeyError. raise KeyError('key not a member of this union!') return self.values[db] class PrefixUnionDict(object, UserDict.DictMixin): """Interface to a set of sequence DBs, each assigned a unique prefix. For example, the sequence ID 'foo.bar' would unpack to ID 'bar' in the dictionary associated with the prefix 'foo'. This is a useful way to combine disparate seqdbs into a single db, without actually altering the individual seqdbs. PrefixUnionDicts can be created in one of two ways: either - pass in a dictionary containing prefix-to-seqdb mappings as 'prefixDict', or - pass in a header file containing the information necessary to create such a dictionary. In the latter case, see the 'writeHeaderFile' method for format information. The optional kwarg 'trypath' contains a list of directories to search for the database file named in each line. The optional kwarg 'dbClass' specifies the database class to use to load each sequence file; it defaults to SequenceFileDB. The default ID separator is '.'; use the 'separator' kwarg to change it. @CTB trypath => trypaths? """ # define ~ (invert) operator to return a lazily-created _PUDInverse. __invert__ = classutil.lazy_create_invert(_PrefixUnionDictInverse) def __init__(self, prefixDict=None, separator='.', filename=None, dbClass=SequenceFileDB, trypath=None): # read union header file if filename is not None: if prefixDict: raise TypeError(''' cannot create with prefixDict and filename both!''') if trypath is None: trypath = [os.path.dirname(filename)] ifile = file(filename, 'rU') try: it = iter(ifile) separator = it.next().strip('\r\n') # remove leading/trailing CR prefixDict = {} for line in it: prefix, filepath=line.strip().split('\t')[:2] try: dbfile = classutil.search_dirs_for_file(filepath, trypath) db = dbClass(dbfile) except IOError: for db in prefixDict.values(): db.close() # close databases before exiting raise IOError('''\ unable to open database %s: check path or privileges. Set 'trypath' to give a list of directories to search.''' % filepath) else: prefixDict[prefix] = db finally: ifile.close() self.separator = separator if prefixDict is not None: self.prefixDict = prefixDict else: self.prefixDict = {} # also create a reverse mapping d = {} for k, v in self.prefixDict.items(): d[v] = k self.dicts = d self.seqInfoDict = _PUDSeqInfoDict(self) # supply standard interface def format_id(self, prefix, seqID): return prefix + self.separator + seqID def get_prefix_id(self, k): """Subdivide a key into a prefix and ID using the given separator.""" try: t = k.split(self.separator, 2) # split into no more than 3 fields except AttributeError: raise KeyError('key should be a string! ' + repr(k)) l = len(t) if l == 2: return t elif l<2: raise KeyError('invalid id format; no prefix: ' + k) else: # id contains separator character? prefix = t[0] # assume prefix doesn't contain separator @CTB untested seqID = k[len(prefix) + 1:] # skip past prefix return prefix, seqID def get_subitem(self, d, seqID): # try int key first try: return d[int(seqID)] except (ValueError, KeyError, TypeError): pass # otherwise, use default (str) key try: return d[seqID] except KeyError: raise KeyError, "no key '%s' in %s" % (seqID, repr(d)) def __getitem__(self, k): """For 'foo.bar', return 'bar' in dict associated with prefix 'foo'""" prefix, seqID = self.get_prefix_id(k) try: d = self.prefixDict[prefix] except KeyError, e: raise KeyError("no key '%s' in %s" % (k, repr(self))) return self.get_subitem(d, seqID) def __contains__(self, k): """Is the given ID in our PrefixUnionDict?""" # try it out as an ID. if isinstance(k, str): try: (prefix, id) = self.get_prefix_id(k) return id in self.prefixDict[prefix] except KeyError: return False # otherwise, try treating key as a sequence. # @CTB inconsistent with 'getitem'. try: db = k.pathForward.db except AttributeError: raise AttributeError('key must be a sequence with db attribute!') return db in self.dicts def has_key(self, k): return self.__contains__(k) def __iter__(self): for p, d in self.prefixDict.items(): for id in d: yield self.format_id(p, id) def keys(self): return list(self.iterkeys()) def iterkeys(self): return iter(self) def iteritems(self): for p,d in self.prefixDict.items(): for id, seq in d.iteritems(): yield self.format_id(p, id), seq def getName(self, ival): """For a given sequence, return a fully qualified name, 'prefix.id'.""" seq = ival.pathForward # get the top-level sequence object return self.dicts[seq.db] + self.separator + seq.id def newMemberDict(self, **kwargs): # @CTB not used; necessary? """return a new member dictionary (empty)""" return _PrefixUnionMemberDict(self, **kwargs) def writeHeaderFile(self,filename): # @CTB not used; necessary? """Save a header file, suitable for later re-creation.""" ifile = file(filename, 'w') print >>ifile, self.separator for k, v in self.prefixDict.items(): try: print >>ifile, '%s\t%s' % (k, v.filepath) except AttributeError: raise AttributeError('''\ seq db '%s' has no filepath; you may be able to save this to worldbase, but not to a text HeaderFile!''' % k) ifile.close() def __len__(self): n=0 for db in self.dicts: n += len(db) return n def cacheHint(self, ivalDict, owner=None): # @CTB untested '''save a cache hint dict of {id:(start,stop)}''' d={} # extract separate cache hint dict for each prefix for longID,ival in ivalDict.items(): prefix, seqID = self.get_prefix_id(longID) d.setdefault(prefix, {})[seqID] = ival for prefix,seqDict in d.items(): try: m = self.prefixDict[prefix].cacheHint except AttributeError: # subdict can't cacheHint(), so just ignore pass else: # pass cache hint down to subdictionary m(seqDict, owner) # not clear what this should do for PrefixUnionDict copy = setdefault = update = classutil.method_not_implemented # these methods should not be implemented for read-only database. clear = pop = popitem = classutil.read_only_error class _PrefixDictInverseAdder(_PrefixUnionDictInverse): """Inverse class for SeqPrefixUnionDict; adds sequences when looked up. @CTB is getName only used by __getitem__? Make private? """ def getName(self, seq): """Find in or add the given sequence to the inverse of a PUD.""" try: return _PrefixUnionDictInverse.__getitem__(self, seq) except AttributeError: # no seq.db? treat as a user sequence. new_id = 'user' + self.db.separator + seq.pathForward.id # check to make sure it's already in the user seq db... _ = self.db[new_id] return new_id def __getitem__(self, seq): """__getitem__ interface that calls getName.""" try: return self.getName(seq) except KeyError: if not self.db.addAll: raise # if we should add, add seq & re-try. self.db += seq return self.getName(seq) class SeqPrefixUnionDict(PrefixUnionDict): """SeqPrefixUnionDict provides += functionality to add seqs to a PUD. See the __iadd__ method for details. If addAll is True, then looking a sequence up in the inverse db will automatically add it to the PrefixUnionDict. """ __invert__ = classutil.lazy_create_invert(_PrefixDictInverseAdder) def __init__(self, addAll=False, **kwargs): PrefixUnionDict.__init__(self, **kwargs) # override default PrefixUnionDict __invert__ to add sequences; # see classutil.lazy_create_invert. self.addAll = addAll # see _PrefixDictInverseAdder behavior. def __iadd__(self, k): """Add a sequence or database to the PUD, with a unique prefix. NOTE: __iadd__ must return self. """ # seq or db already present? if k in (~self): return self db = getattr(k, 'db', None) if db is None: # annotation sequence? db = getattr(k.pathForward, 'db', None) # @CTB untested if db is None: # this is a user sequence, with no container; create. if not self.prefixDict.has_key('user'): d = KeepUniqueDict() self._add_prefix_dict('user', d) else: d = self.prefixDict['user'] # now add the sequence d[k.pathForward.id] = k.pathForward return self # already contain? nothing to do. if db in self.dicts: # @CTB can this 'if' ever be true? return self # ok, not present; add, with a unique name. does it have # _persistent_id? try: name = db._persistent_id.split('.')[-1] except AttributeError: # no; retrieve from filepath? name = getattr(db, 'filepath', None) if name: # got one; clean up. name = os.path.basename(name) name = name.split('.')[0] else: # generate one. name = 'noname%d' % len(self.dicts) if name in self.prefixDict: logger.debug(''' It appears that two different sequence databases are being assigned the same prefix ("%s"). For this reason, the attempted automatic construction of a PrefixUnionDict for you cannot be completed! You should instead construct a PrefixUnionDict that assigns a unique prefix to each sequence database, and supply it directly as the seqDict argument to the NLMSA constructor.''' % id) raise ValueError('''\ cannot automatically construct PrefixUnionDict''') self._add_prefix_dict(name, db) return self def _add_prefix_dict(self, name, d): self.prefixDict[name] = d self.dicts[d] = name class _PUDSeqInfoDict(object, UserDict.DictMixin): """A wrapper object supplying a standard seqInfoDict interface for PUDs. This class simply provides a standard dict interface that rewrites individual sequence IDs into the compound PrefixUnionDict seq IDs on the fly. """ def __init__(self, db): self.seqDB = db def __iter__(self): return iter(self.seqDB) def keys(self): return list(self.iterkeys()) def iterkeys(self): for (k, v) in self.iteritems(): yield k def itervalues(self): for (k, v) in self.iteritems(): yield v def iteritems(self): for p, d in self.seqDB.prefixDict.items(): for seqID, info in d.seqInfoDict.iteritems(): yield self.seqDB.format_id(p, seqID), info def __getitem__(self, k): prefix, seqID = self.seqDB.get_prefix_id(k) db = self.seqDB.prefixDict[prefix] return self.seqDB.get_subitem(db.seqInfoDict, seqID) def has_key(self, k): return k in self.seqDB # # @CTB stopped review here. ################################################### # class BlastDB(SequenceFileDB): # @CTB untested? '''Deprecated interface provided for backwards compatibility. Provides blast() and megablast() methods for searching your seq db. Instead of this, you should use the blast.BlastMapping, which provides a graph interface to BLAST, or MegablastMapping for megablast.''' def __reduce__(self): # provided only for compatibility w/ 0.7 clients return (classutil.ClassicUnpickler, (self.__class__,self.__getstate__())) def __init__(self, filepath=None, blastReady=False, blastIndexPath=None, blastIndexDirs=None, **kwargs): "format database and build indexes if needed. Provide filepath or file object" SequenceFileDB.__init__(self, filepath, **kwargs) def __repr__(self): return "" % (self.filepath) def blast(self, seq, al=None, blastpath='blastall', blastprog=None, expmax=0.001, maxseq=None, verbose=True, opts='', **kwargs): 'run blast with the specified parameters, return NLMSA alignment' blastmap = self.formatdb() return blastmap(seq, al, blastpath, blastprog, expmax, maxseq, verbose, opts, **kwargs) def megablast(self,seq, al=None, blastpath='megablast', expmax=1e-20, maxseq=None, minIdentity=None, maskOpts='-U T -F m', rmPath='RepeatMasker', rmOpts='-xsmall', verbose=True, opts='', **kwargs): 'run megablast with the specified parameters, return NLMSA alignment' from blast import MegablastMapping blastmap = self.formatdb(attr='megablastMap', mapClass=MegablastMapping) return blastmap(seq, al, blastpath, expmax, maxseq, minIdentity, maskOpts, rmPath, rmOpts, verbose, opts, **kwargs) def formatdb(self, filepath=None, attr='blastMap', mapClass=None): 'create a blast mapping object if needed, and ensure it is indexed' try: # see if mapping object already exists blastmap = getattr(self, attr) except AttributeError: if mapClass is None: # default: BlastMapping from blast import BlastMapping mapClass = BlastMapping blastmap = mapClass(self) setattr(self, attr, blastmap) # re-use this in the future blastmap.formatdb(filepath) # create index file if not already present return blastmap class BlastDBXMLRPC(BlastDB): 'XMLRPC server wrapper around a standard BlastDB' xmlrpc_methods = dict(getSeqLen=0, get_strslice=0, getSeqLenDict=0, get_db_size=0, get_seqtype=0, strslice='get_strslice') def getSeqLen(self,id): 'get sequence length, or -1 if not found' try: return len(self[id]) except KeyError: return -1 # SEQUENCE OBJECT DOES NOT EXIST def getSeqLenDict(self): 'return seqLenDict over XMLRPC' d = {} for k,v in self.seqLenDict.items(): d[k] = v[0],str(v[1]) # CONVERT TO STR TO ALLOW OFFSET>2GB return d # XML-RPC CANNOT HANDLE INT > 2 GB, SO FORCED TO CONVERT... def get_db_size(self): return len(self) def get_strslice(self,id,start,stop): 'return string sequence for specified interval in the specified sequence' if start<0: # HANDLE NEGATIVE ORIENTATION return str((-(self[id]))[-stop:-start]) else: # POSITIVE ORIENTATION return str(self[id][start:stop]) def get_seqtype(self): return self._seqtype class XMLRPCSequence(SequenceBase): "Represents a sequence in a blast database, accessed via XMLRPC" def __init__(self, db, id): self.length = db.server.getSeqLen(id) if self.length<=0: raise KeyError('%s not in this database' % id) self.id = id SequenceBase.__init__(self) def strslice(self,start,end,useCache=True): "XMLRPC access to slice of a sequence" if useCache: try: return self.db.strsliceCache(self,start,end) except IndexError: # NOT FOUND IN CACHE pass # JUST USE OUR REGULAR XMLRPC METHOD return self.db.server.get_strslice(self.id,start,end) # GET FROM XMLRPC def __len__(self): return self.length class XMLRPCSeqLenDescr(object): 'descriptor that returns dictionary of remote server seqLenDict' def __init__(self,attr): self.attr = attr def __get__(self,obj,objtype): 'only called if attribute does not already exist. Saves result as attribute' d = obj.server.getSeqLenDict() for k,v in d.items(): d[k] = v[0],int(v[1]) # CONVERT OFFSET STR BACK TO INT obj.__dict__[self.attr] = d # PROVIDE DIRECTLY TO THE __dict__ return d class XMLRPCSequenceDB(SequenceDB): 'XMLRPC client: access sequence database over XMLRPC' itemClass = XMLRPCSequence # sequence storage interface seqLenDict = XMLRPCSeqLenDescr('seqLenDict') # INTERFACE TO SEQLENDICT def __init__(self, url, name, *args, **kwargs): import coordinator self.server = coordinator.get_connection(url, name) self.url = url self.name = name self.seqInfoDict = _SeqLenDictWrapper(self) SequenceDB.__init__(self, *args, **kwargs) def __reduce__(self): # provided only for compatibility w/ 0.7 clients return (classutil.ClassicUnpickler, (self.__class__,self.__getstate__())) def __getstate__(self): # DO NOT pickle self.itemClass! We provide our own. return dict(url=self.url, name=self.name) # just need XMLRPC info def __len__(self): return self.server.get_db_size() def __contains__(self, k): if self.server.getSeqLen(k)>0: return True else: return False def _set_seqtype(self): 'efficient way to determine sequence type of this database' try: # if already known, no need to do anything return self._seqtype except AttributeError: self._seqtype = self.server.get_seqtype() return self._seqtype PKŒ.;«'ÇÕààpygr/seqdb.pyc;ò èu¡Jc@s‘dZdklZdkZdkZdkZdkZdkTdkTdk Z dk l Z l Z l Z lZlZdkZdkZdklZdefd„ƒYZdeeifd „ƒYZd efd „ƒYZd efd „ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdeeifd„ƒYZdefd„ƒYZdefd„ƒYZ e!dd„Z"defd„ƒYZ#deeifd„ƒYZ$d eeifd!„ƒYZ%d"e#fd#„ƒYZ&d$e%fd%„ƒYZ'd&eeifd'„ƒYZ(d(efd)„ƒYZ)d*e)fd+„ƒYZ*d,efd-„ƒYZ+d.efd/„ƒYZ,d0efd1„ƒYZ-dS(2só seqdb contains a set of classes for interacting with sequence databases. Primary sequence database classes: - SequenceDB - base class for sequence databases - SequenceFileDB - file-based sequence database - PrefixUnionDict - container to combine multiple sequence databases - XMLRPCSequenceDB - XML-RPC-accessible sequence database Extensions: - SeqPrefixUnionDict - extends PrefixUnionDict to automatically add seqs - BlastDB - implements NCBI-style name munging for lookups Associated sequence classes: - FileDBSequence - sequence associated with a SequenceFileDB - XMLRPCSequence - sequence associated with a XMLRPCSequenceDB ---- SequenceDB provides some basic behaviors for sequence databases: dictionary behavior, an invert operator interface, and caching for both sequence objects and sequence intervals. It also relies on a 'seqInfoDict' attribute to contain summary information about sequences, so that e.g. slice operations can be done without loading the entire sequence into memory. (See below for more info on seqInfoDict.) SequenceFileDB extends SequenceDB to contain a file-based database of sequences. It constructs a seqLenDict that allows direct on-disk lookup of sequence intervals. (See below for more info on seqLenDict.) PrefixUnionDict provides a unified SequenceDB-like interface to a collection of sequence databases by combining the database name with the sequence ID into a new sequence id. For example, the ID 'genome.chrI' would return the sequence 'chrI' in the 'genome' database. This is particularly handy for situations where you want to have seqdbs of multiple sequence types (DNA, protein, annotations, etc.) all associated together. @CTB document XMLRPCSequenceDB. @CTB document SeqPrefixUnionDict. @CTB document BlastDB. ---- The seqInfoDict interface ------------------------- The seqInfoDict attribute of a SequenceDB is a dictionary-like object, keyed by sequence IDs, with associated values being an information object containing various attributes. seqInfoDict is essentially an optimization that permits other pygr-aware components to access information *about* sequences without actually loading the entire sequence. The only required attribute at the moment is 'length', which is required by some of the NLMSA code. However, seqInfoDict is a good mechanism for the storage of any summary information on a sequence, and so it may be expanded in the future. The seqLenDict interface ------------------------ The seqLenDict attribute is specific to a SequenceFileDB, where it provides a file-backed storage of length and offset sequence metadata. It is used to implement a key optimization in SequenceFileDB, in which a sequence's offset within a file is used to read only the required part of the sequence into memory. This optimization is particularly important for large sequences, e.g. chromosomes, where reading the entire sequence into memory shouldn't be done unless it's necessary. The seqLenDict is keyed by sequence ID and the associated values are a 2-tuple (length, offset), where the offset indicates the byte offset within the '.pureseq' index file created for each SequenceFileDB. get_bound_subclass and the 'self.db' attribute ---------------------------------------------- The SequenceDB constructor calls classutil.get_bound_subclass on its itemClass. What does that do, and what is it for? get_bound_subclass takes an existing class, makes a new subclass of it, binds the variable 'db' to it, and then calls the _init_subclass classmethod (if it exists) on the new class. This has the effect of creating a new class for each SequenceDB instance, tied specifically to that instance and initialized by the _init_subclass method. The main effect of this for SequenceDBs is that for any SequenceDB descendant, the '.db' attribute is automatically set for each Sequence retrieved from the database. CTB: I think this is an optimization? Caching ------- @CTB discuss caching. Pickling sequence databases and sequences ----------------------------------------- @CTB document pickling issues. programmer notes: extending SequenceDB - seqInfoDict, itemclass extending SequenceFileDB - seqLenDict - using your own itemclass - using your own reader doctests & examples ------------------- update docs for these classes! intro: - loading a FASTA file - using a PUD + combining dbs, etc. + inverse Code review issues, short term: - @CTB get_bound_subclass stuff refers directly to itemClass to set 'db'. - @CTB fix 'import *'s - @CTB run lint/checker? - @CTB test _create_seqLenDict - @CTB XMLRPCSequenceDB vs SequenceFileDB Some long term issues: - it should be possible to remove _SeqLenDictSaver and just combine its functionality with _store_seqlen_dict. --titus 3/21/09 (s generatorsN(s*(s AnnotationDBs AnnotationSeqsAnnotationSlicesAnnotationServersAnnotationClient(sNoSuchFileErrors_SequenceDBInversecBs)tZdZd„Zd„Zd„ZRS(sAImplements __inverse__ on SequenceDB objects, returning seq name.cCs ||_dS(N(sdbsself(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__¥scCs|iiSdS(N(sseqs pathForwardsid(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__¨scCs5y|ii|ijSWntj o tSnXdS(N(sseqs pathForwardsdbsselfsAttributeErrorsFalse(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __contains__«s(s__name__s __module__s__doc__s__init__s __getitem__s __contains__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SequenceDBInverse£s   s SequenceDBcBsñtZdZeZeZeiZ ei Z e ddƒZ eieƒZeed„Zd„Zd„ZdZd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Z ei!Z"Z#Z$Z%Z&Z'RS(sÏBase class for sequence databases. SequenceDB provides a few basic (base) behaviors: - dict-like interface to sequence objects each with an ID - the ~ (invert) operator returns an 'inverted' database, which is a dict-like object that returns sequence names when given a sequence. - weakref-based automatic flushing of seq objects no longer in use; use autoGC=0 to turn this off. - cacheHint() system for caching a given set of sequence intervals associated with an owner object, which are flushed from cache if the owner object is garbage-collected. For subclassing, note that self.seqInfoDict must be set before SequenceDB.__init__ is called! sautoGCicKs¹|oti|ƒ|_n h|_||_|id|iƒ|_|id|iƒ|_|it jo t d‚n|i ƒ}||d(sselfs __class__s__name__s itemClass(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__FscCs|iiƒdS(sEmpty the cache.N(sselfs_weakValueDictsclear(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys clear_cacheJs((s__name__s __module__s__doc__sNones itemClasss SeqDBSlicesitemSliceClasss classutilsstandard_getstates __getstate__sstandard_setstates __setstate__sdicts _pickleAttrsslazy_create_inverts_SequenceDBInverses __invert__sTrues__init__s__hash__s _set_seqtypes _cache_maxs cacheHints strsliceCachescloses__iter__s iteritemss__len__s __getitem__skeyss __contains__s__repr__s clear_cachesread_only_errorsclears setdefaultspopspopitemscopysupdate(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys SequenceDB±s.               s_FileDBSeqDescriptorcBstZdZd„ZRS(s7Descriptor to retrieve entire sequence from seqLenDict.cCs+|ii|id}|id|ƒSdS(Ni(sobjsdbs seqLenDictsidslengthsstrslice(sselfsobjsobjtypeslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__get__Ys(s__name__s __module__s__doc__s__get__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_FileDBSeqDescriptorWs sFileDBSequencecBs>tZdZeƒZeiZd„Zd„Z e d„Z RS(s‡Default sequence object for file-based storage mechanism. See SequenceFileDB for the associated database class. In general, you should not create objects from this class directly; retrieve them from SequenceFileDB objects, instead. NOTE: 'self.db' is attached to all instances of this class that come from a particular database by 'classutil.get_bound_subclass'. cCsP||_ti|ƒ|i|iijo td|i|ifƒ‚ndS(Nssequence %s not in db %s(sidsselfs SequenceBases__init__sdbs seqLenDictsKeyError(sselfsdbsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ls  cCs|ii|idSdS(s2Unpack this sequence's length from the seqLenDict.iN(sselfsdbs seqLenDictsid(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__rscCsX|o4y|ii|||ƒSWq;tj oq;Xn|ii|i||ƒSdS(s>Access slice of a sequence efficiently, using seqLenDict info.N( suseCachesselfsdbs strsliceCachesstartsends IndexErrorsstrslicesid(sselfsstartsendsuseCache((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrslicevs ( s__name__s __module__s__doc__s_FileDBSeqDescriptorsseqs classutils item_reducers __reduce__s__init__s__len__sTruesstrslice(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysFileDBSequence]s     sSequenceFileDBcBsctZdZeZeiiƒZded|iiƒy|ii}Wntj on X|ƒdS(s0close our open shelve index file and _pureseq...N(sselfs seqLenDictscloses_pureseqsdo_closesAttributeError(sselfsdo_close((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysclose©s cCsd|ii|ifSdS(Ns <%s '%s'>(sselfs __class__s__name__sfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__³scCsUti|dƒ}z!tidƒt|||ƒWd|i ƒXti|dƒSdS(s;Create a seqLenDict from 'seqpath' and store in 'dictpath'.sns!Building sequence length index...Nsr( s classutils open_shelvesdictpaths seqLenDictsloggersdebugs_store_seqlen_dictsseqpathsreadersclose(sselfsdictpathsseqpathsreaders seqLenDict((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_create_seqLenDict¶s  cCsy |i}Wn8tj o,|id}t|dƒ}||_nX|i|d}|i ||ƒ|i ||ƒSdS(s>Access slice of a sequence efficiently, using seqLenDict info.s.pureseqsrbiN(sselfs_pureseqsifilesAttributeErrorsfilepathsfullpathsfiles seqLenDictsseqIDsoffsetsseeksstartsreadsend(sselfsseqIDsstartsendsuseCachesifilesoffsetsfullpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrsliceÀs  (s__name__s __module__s__doc__sFileDBSequences itemClasss SequenceDBs _pickleAttrsscopysNones__init__scloses__repr__s_create_seqLenDictsTruesstrslice(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysSequenceFileDB€s     s BasicSeqInfocBstZdZed„ZRS(s•Wrapper to provide the correct seqInfoDict-style object information. This boils down to providing id, db, length, and possibly offset. cCsC||_||_|tjot||ƒ|_n ||_dS(N(sseqIDsselfsidsseqDBsdbslengthsNoneslen(sselfsseqIDsseqDBslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__Øs    (s__name__s __module__s__doc__sNones__init__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys BasicSeqInfoÒs s _SeqLenObjectcBstZdZd„ZRS(s"Wrapper for use with a seqLenDict cCs0|i|\}|_ti||||ƒdS(N(sseqDBs seqLenDictsseqIDslengthsselfsoffsets BasicSeqInfos__init__(sselfsseqIDsseqDBslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__âs(s__name__s __module__s__doc__s__init__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys _SeqLenObjectàs sBasicSeqInfoDictcBsAtZdZeZd„Zd„Zd„Zd„Zd„Z RS(s—Wrapper around SequenceDB.seqLenDict to provide seqInfoDict behavior. This basic version just gets the length from the sequence object itself. cCs ||_dS(N(sdbsselfsseqDB(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ëscCs|i||iƒSdS(N(sselfs itemClasssksseqDB(sselfsk((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__îscCst|iiƒSdS(N(slensselfsseqDBs seqLenDict(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__ñscCst|iiƒSdS(N(sitersselfsseqDBs seqLenDict(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iter__ôscCs|iiiƒSdS(N(sselfsseqDBs seqLenDictskeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeys÷s( s__name__s __module__s__doc__s BasicSeqInfos itemClasss__init__s __getitem__s__len__s__iter__skeys(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysBasicSeqInfoDictæs     s_SeqLenDictWrappercBstZdZeZRS(s The default storage mechanism for sequences implemented by FileDBSequence and SequenceFileDB puts everything in seqLenDict, a shelve index of lengths and offsets. This class wraps that dictionary to provide the interface that SequenceDB expects to see. (s__name__s __module__s__doc__s _SeqLenObjects itemClass(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SeqLenDictWrapperús s_SeqLenDictSavercBs tZdZd„Zd„ZRS(s°Support for generic reading functions, called by _store_seqlen_dict. This allows you to specify your own 'reader' function when constructing a FileSequenceDB, e.g. so that you could read something other than FASTA files into a seqLenDict. Pass in this function as the 'reader' kwarg to FileSequenceDB. Custom reader functions should take a file handle and a filename, and return a list of sequence info objects with 'id', 'length', and 'sequence' attributes for each sequence in the given file/filename. _SeqLenDictSaver will then construct a '.pureseq' file containing the concatenated sequences and fill in the seqLenDict appropriately. cCs ||_dS(N(sreadersself(sselfsreader((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__scCs¸d}t|ddƒ}zx†|i||ƒD]r}|i|f||i <||i7}|it |i ƒjo t d|i |ifƒ‚n|i|i ƒq/WWd|iƒXdS(Nls.pureseqswbs%length does not match sequence: %s,%d(soffsetsfilesfilenames pureseq_fpsselfsreadersifilesoslengthsdsidslenssequences ValueErrorswritesclose(sselfsdsifilesfilenamesosoffsets pureseq_fp((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__call__s  (s__name__s __module__s__doc__s__init__s__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SeqLenDictSavers  srUcCs[ti}|tj ot|ƒ}nt||ƒ}z||||ƒWd|i ƒXdS(s–Store sequence lengths in a dictionary, e.g. a seqLenDict. Used by SequenceFileDB._create_seqLenDict. The 'reader' function implements a custom sequence format reader; by default, _store_seqlen_dict uses seqfmt.read_fasta_lengths, which reads FASTA-format files. See _SeqLenDictSaver for information on building a custom 'reader', and see the seqdb docs for an example. N( sseqfmtsread_fasta_lengthssbuildersreadersNones_SeqLenDictSaversfilesfilenamesmodesifilesdsclose(sdsfilenamesreadersmodesbuildersifile((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_store_seqlen_dict&s   s_PrefixUnionDictInversecBs)tZdZd„Zd„Zd„ZRS(sïProvide inverse (~) operator behavior for PrefixUnionDicts. This enables ~pud to return a database that, given a sequence object, returns the corresponding key (prefix.id) to retrieve that sequence object in the pud. cCs ||_dS(N(sdbsself(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__KscCs§|i}y|ii|i}Wnetj oYy0|iii|iijotdƒ‚nWnt j onXtdƒ‚nX||ii t |i ƒSdS(Nspthis annotation is not in the PrefixUnion, but its sequence is. You can get that using its 'sequence' attribute.sseq.db not in PrefixUnionDict( sivals pathForwardsseqsselfsdbsdictssprefixsKeyErrors _anno_seqsAttributeErrors separatorsstrsid(sselfsivalsseqsprefix((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__Ns cCs8y|ii|iijSWntj o tSnXdS(N(sseqs pathForwardsdbsselfsdictssAttributeErrorsFalse(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __contains___s(s__name__s __module__s__doc__s__init__s __getitem__s __contains__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_PrefixUnionDictInverseBs   s_PrefixUnionMemberDictcBsAtZdZed„d„Zd„ZeZd„Zd„ZRS(sž @CTB confusing/inappropriate use of a dict interface! keep?? @CTB document. 'd[prefix]=value; d[k] returns value if k is a member of prefix' cCs |iiS(N(sxs pathForwardsdb(sx((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysmscCs9h|_||_||_|tj o ||_ndS(N(sselfsvaluesspuDicts attrMethods _attrMethodsdefaultsNone(sselfspuDictsdefaults attrMethod((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ls     cCs|iiiƒSdS(N(sselfspuDicts prefixDictskeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeystscCsH||iijotd|ƒ‚n|ii|}||i| trypaths? s.cCs±|tj o,|otdƒ‚n|tjotii|ƒg}nt|dƒ} zÎt | ƒ}|i ƒi dƒ}h}x |D]˜} | i ƒidƒd \}} y"ti| |ƒ}||ƒ} WnDtj o8x|iƒD]} | iƒqïWtd| ƒ‚qŠX| |||iiƒD]-\}}x|D]}|i||ƒVq#WqWdS(N(sselfs prefixDictsitemsspsdsids format_id(sselfspsdsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iter__s  cCst|iƒƒSdS(N(slistsselfsiterkeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeysscCst|ƒSdS(N(sitersself(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysiterkeyssccsWxP|iiƒD]?\}}x0|iƒD]"\}}|i||ƒ|fVq)WqWdS(N( sselfs prefixDictsitemsspsds iteritemssidsseqs format_id(sselfspsdsseqsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys iteritemss   cCs)|i}|i|i|i|iSdS(sAFor a given sequence, return a fully qualified name, 'prefix.id'.N(sivals pathForwardsseqsselfsdictssdbs separatorsid(sselfsivalsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysgetName$s cKst||SdS(s&return a new member dictionary (empty)N(s_PrefixUnionMemberDictsselfskwargs(sselfskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys newMemberDict)scCs‹t|dƒ}||iIJx^|iiƒD]M\}}y|d||i fIJWq,t j ot d|ƒ‚q,Xq,W|i ƒdS(s3Save a header file, suitable for later re-creation.sws%s %sseseq db '%s' has no filepath; you may be able to save this to worldbase, but not to a text HeaderFile!N( sfilesfilenamesifilesselfs separators prefixDictsitemssksvsfilepathsAttributeErrorsclose(sselfsfilenamesifilesksv((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyswriteHeaderFile-s  cCs2d}x!|iD]}|t|ƒ7}qW|SdS(Ni(snsselfsdictssdbslen(sselfsdbsn((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__:s  c Cs¦h}xE|iƒD]7\}} |i|ƒ\}}| |i |hƒ|tj o2d|ii|ii}|i|}|SnXdS(s:Find in or add the given sequence to the inverse of a PUD.suserN( s_PrefixUnionDictInverses __getitem__sselfsseqsAttributeErrorsdbs separators pathForwardsidsnew_ids_(sselfsseqsnew_ids_((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysgetName]s cCs\y|i|ƒSWnDtj o8|ii o‚n|i|7_|i|ƒSnXdS(s)__getitem__ interface that calls getName.N(sselfsgetNamesseqsKeyErrorsdbsaddAll(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__gs(s__name__s __module__s__doc__sgetNames __getitem__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_PrefixDictInverseAdderWs  sSeqPrefixUnionDictcBs;tZdZeieƒZed„Zd„Z d„Z RS(sìSeqPrefixUnionDict provides += functionality to add seqs to a PUD. See the __iadd__ method for details. If addAll is True, then looking a sequence up in the inverse db will automatically add it to the PrefixUnionDict. cKsti||||_dS(N(sPrefixUnionDicts__init__sselfskwargssaddAll(sselfsaddAllskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__scCsš||jo|Snt|dtƒ}|tjot|idtƒ}n|tjoY|iidƒ otƒ}|i d|ƒn|id}|i||ii <|Sn||i jo|Sny|i idƒd}Wn™tj ot|dtƒ}|o)tii|ƒ}|idƒd}ndt|i ƒ}||ijo!tidt ƒtd ƒ‚q‚nX|i ||ƒ|Sd S( spAdd a sequence or database to the PUD, with a unique prefix. NOTE: __iadd__ must return self. sdbsusers.iÿÿÿÿsfilepathisnoname%dsv It appears that two different sequence databases are being assigned the same prefix ("%s"). For this reason, the attempted automatic construction of a PrefixUnionDict for you cannot be completed! You should instead construct a PrefixUnionDict that assigns a unique prefix to each sequence database, and supply it directly as the seqDict argument to the NLMSA constructor.s.cannot automatically construct PrefixUnionDictN(sksselfsgetattrsNonesdbs pathForwards prefixDictshas_keysKeepUniqueDictsds_add_prefix_dictsidsdictss_persistent_idssplitsnamesAttributeErrorsosspathsbasenameslensloggersdebugs ValueError(sselfsksdsdbsname((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iadd__†s8    cCs||i|<||i|(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__÷ssblastallf0.001sc Ks2|iƒ} | ||||||||| SdS(s?run blast with the specified parameters, return NLMSA alignmentN( sselfsformatdbsblastmapsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptsskwargs( sselfsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptsskwargssblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysblastùs s megablastf9.9999999999999995e-21s -U T -F ms RepeatMaskers-xsmallc  KsTdkl} |iddd| ƒ}|||||||||| | | | SdS(sCrun megablast with the specified parameters, return NLMSA alignment(sMegablastMappingsattrs megablastMapsmapClassN(sblastsMegablastMappingsselfsformatdbsblastmapsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargs(sselfsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargssMegablastMappingsblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys megablasts  sblastMapcCs~yt||ƒ}WnStj oG|tjodkl}|}n||ƒ}t |||ƒnX|i |ƒ|SdS(sAcreate a blast mapping object if needed, and ensure it is indexed(s BlastMappingN( sgetattrsselfsattrsblastmapsAttributeErrorsmapClasssNonesblasts BlastMappingssetattrsformatdbsfilepath(sselfsfilepathsattrsmapClasss BlastMappingsblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysformatdb s     ( s__name__s __module__s__doc__s __reduce__sNonesFalses__init__s__repr__sTruesblasts megablastsformatdb(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysBlastDBìs   ' s BlastDBXMLRPCc BshtZdZeddddddddddddƒZd„Zd „Zd „Zd „Zd „Z RS( s/XMLRPC server wrapper around a standard BlastDBs getSeqLenis get_strslices getSeqLenDicts get_db_sizes get_seqtypesstrslicecCs0yt||ƒSWntj o dSnXdS(s'get sequence length, or -1 if not foundiÿÿÿÿN(slensselfsidsKeyError(sselfsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys getSeqLens cCsLh}x;|iiƒD]*\}}|dt|dƒf||Represents a sequence in a blast database, accessed via XMLRPCcCsS|ii|ƒ|_|idjotd|ƒ‚n||_ti|ƒdS(Nis%s not in this database( sdbsservers getSeqLensidsselfslengthsKeyErrors SequenceBases__init__(sselfsdbsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__7s  cCs[|o4y|ii|||ƒSWq;tj oq;Xn|iii|i ||ƒSdS(s$XMLRPC access to slice of a sequenceN( suseCachesselfsdbs strsliceCachesstartsends IndexErrorsservers get_strslicesid(sselfsstartsendsuseCache((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrslice=s cCs |iSdS(N(sselfslength(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__Es(s__name__s __module__s__doc__s__init__sTruesstrslices__len__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysXMLRPCSequence5s   sXMLRPCSeqLenDescrcBs tZdZd„Zd„ZRS(s>descriptor that returns dictionary of remote server seqLenDictcCs ||_dS(N(sattrsself(sselfsattr((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__JscCsb|iiƒ}x8|iƒD]*\}}|dt|dƒf||y |iSWn,tj o |iiƒ|_|iSnXdS(s9efficient way to determine sequence type of this databaseN(sselfs_seqtypesAttributeErrorsservers get_seqtype(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys _set_seqtypejs  ( s__name__s __module__s__doc__sXMLRPCSequences itemClasssXMLRPCSeqLenDescrs seqLenDicts__init__s __reduce__s __getstate__s__len__s __contains__s _set_seqtype(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysXMLRPCSequenceDBTs       (.s__doc__s __future__s generatorsssyssossUserDictsweakrefssequencessqlgraphs classutils annotations AnnotationDBs AnnotationSeqsAnnotationSlicesAnnotationServersAnnotationClientsloggersseqfmtsdbfilesNoSuchFileErrorsobjects_SequenceDBInverses DictMixins SequenceDBs_FileDBSeqDescriptors SequenceBasesFileDBSequencesSequenceFileDBs BasicSeqInfos _SeqLenObjectsBasicSeqInfoDicts_SeqLenDictWrappers_SeqLenDictSaversNones_store_seqlen_dicts_PrefixUnionDictInverses_PrefixUnionMemberDictsPrefixUnionDicts_PrefixDictInverseAddersSeqPrefixUnionDicts_PUDSeqInfoDictsBlastDBs BlastDBXMLRPCsXMLRPCSequencesXMLRPCSeqLenDescrsXMLRPCSequenceDB($s _SeqLenObjects_store_seqlen_dictsAnnotationSlicesNoSuchFileErrors BlastDBXMLRPCsseqfmts_FileDBSeqDescriptors generatorssXMLRPCSequenceDBsloggersBasicSeqInfoDictsXMLRPCSeqLenDescrsBlastDBsSequenceFileDBs_SequenceDBInverses classutilsPrefixUnionDictsXMLRPCSequencesUserDicts_PrefixDictInverseAdderssyss SequenceDBs_SeqLenDictSaversFileDBSequences_PrefixUnionDictInverses_PrefixUnionMemberDicts_SeqLenDictWrappersSeqPrefixUnionDicts BasicSeqInfos_PUDSeqInfoDictsAnnotationServers AnnotationSeqsAnnotationClients AnnotationDBsweakrefsos((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys?ŒsD      %   ¦#R "$&ËN*+ PK Œ.;«'ÇÕààpygr/seqdb.pyo;ò èu¡Jc@s‘dZdklZdkZdkZdkZdkZdkTdkTdk Z dk l Z l Z l Z lZlZdkZdkZdklZdefd„ƒYZdeeifd „ƒYZd efd „ƒYZd efd „ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdeeifd„ƒYZdefd„ƒYZdefd„ƒYZ e!dd„Z"defd„ƒYZ#deeifd„ƒYZ$d eeifd!„ƒYZ%d"e#fd#„ƒYZ&d$e%fd%„ƒYZ'd&eeifd'„ƒYZ(d(efd)„ƒYZ)d*e)fd+„ƒYZ*d,efd-„ƒYZ+d.efd/„ƒYZ,d0efd1„ƒYZ-dS(2só seqdb contains a set of classes for interacting with sequence databases. Primary sequence database classes: - SequenceDB - base class for sequence databases - SequenceFileDB - file-based sequence database - PrefixUnionDict - container to combine multiple sequence databases - XMLRPCSequenceDB - XML-RPC-accessible sequence database Extensions: - SeqPrefixUnionDict - extends PrefixUnionDict to automatically add seqs - BlastDB - implements NCBI-style name munging for lookups Associated sequence classes: - FileDBSequence - sequence associated with a SequenceFileDB - XMLRPCSequence - sequence associated with a XMLRPCSequenceDB ---- SequenceDB provides some basic behaviors for sequence databases: dictionary behavior, an invert operator interface, and caching for both sequence objects and sequence intervals. It also relies on a 'seqInfoDict' attribute to contain summary information about sequences, so that e.g. slice operations can be done without loading the entire sequence into memory. (See below for more info on seqInfoDict.) SequenceFileDB extends SequenceDB to contain a file-based database of sequences. It constructs a seqLenDict that allows direct on-disk lookup of sequence intervals. (See below for more info on seqLenDict.) PrefixUnionDict provides a unified SequenceDB-like interface to a collection of sequence databases by combining the database name with the sequence ID into a new sequence id. For example, the ID 'genome.chrI' would return the sequence 'chrI' in the 'genome' database. This is particularly handy for situations where you want to have seqdbs of multiple sequence types (DNA, protein, annotations, etc.) all associated together. @CTB document XMLRPCSequenceDB. @CTB document SeqPrefixUnionDict. @CTB document BlastDB. ---- The seqInfoDict interface ------------------------- The seqInfoDict attribute of a SequenceDB is a dictionary-like object, keyed by sequence IDs, with associated values being an information object containing various attributes. seqInfoDict is essentially an optimization that permits other pygr-aware components to access information *about* sequences without actually loading the entire sequence. The only required attribute at the moment is 'length', which is required by some of the NLMSA code. However, seqInfoDict is a good mechanism for the storage of any summary information on a sequence, and so it may be expanded in the future. The seqLenDict interface ------------------------ The seqLenDict attribute is specific to a SequenceFileDB, where it provides a file-backed storage of length and offset sequence metadata. It is used to implement a key optimization in SequenceFileDB, in which a sequence's offset within a file is used to read only the required part of the sequence into memory. This optimization is particularly important for large sequences, e.g. chromosomes, where reading the entire sequence into memory shouldn't be done unless it's necessary. The seqLenDict is keyed by sequence ID and the associated values are a 2-tuple (length, offset), where the offset indicates the byte offset within the '.pureseq' index file created for each SequenceFileDB. get_bound_subclass and the 'self.db' attribute ---------------------------------------------- The SequenceDB constructor calls classutil.get_bound_subclass on its itemClass. What does that do, and what is it for? get_bound_subclass takes an existing class, makes a new subclass of it, binds the variable 'db' to it, and then calls the _init_subclass classmethod (if it exists) on the new class. This has the effect of creating a new class for each SequenceDB instance, tied specifically to that instance and initialized by the _init_subclass method. The main effect of this for SequenceDBs is that for any SequenceDB descendant, the '.db' attribute is automatically set for each Sequence retrieved from the database. CTB: I think this is an optimization? Caching ------- @CTB discuss caching. Pickling sequence databases and sequences ----------------------------------------- @CTB document pickling issues. programmer notes: extending SequenceDB - seqInfoDict, itemclass extending SequenceFileDB - seqLenDict - using your own itemclass - using your own reader doctests & examples ------------------- update docs for these classes! intro: - loading a FASTA file - using a PUD + combining dbs, etc. + inverse Code review issues, short term: - @CTB get_bound_subclass stuff refers directly to itemClass to set 'db'. - @CTB fix 'import *'s - @CTB run lint/checker? - @CTB test _create_seqLenDict - @CTB XMLRPCSequenceDB vs SequenceFileDB Some long term issues: - it should be possible to remove _SeqLenDictSaver and just combine its functionality with _store_seqlen_dict. --titus 3/21/09 (s generatorsN(s*(s AnnotationDBs AnnotationSeqsAnnotationSlicesAnnotationServersAnnotationClient(sNoSuchFileErrors_SequenceDBInversecBs)tZdZd„Zd„Zd„ZRS(sAImplements __inverse__ on SequenceDB objects, returning seq name.cCs ||_dS(N(sdbsself(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__¥scCs|iiSdS(N(sseqs pathForwardsid(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__¨scCs5y|ii|ijSWntj o tSnXdS(N(sseqs pathForwardsdbsselfsAttributeErrorsFalse(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __contains__«s(s__name__s __module__s__doc__s__init__s __getitem__s __contains__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SequenceDBInverse£s   s SequenceDBcBsñtZdZeZeZeiZ ei Z e ddƒZ eieƒZeed„Zd„Zd„ZdZd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Z ei!Z"Z#Z$Z%Z&Z'RS(sÏBase class for sequence databases. SequenceDB provides a few basic (base) behaviors: - dict-like interface to sequence objects each with an ID - the ~ (invert) operator returns an 'inverted' database, which is a dict-like object that returns sequence names when given a sequence. - weakref-based automatic flushing of seq objects no longer in use; use autoGC=0 to turn this off. - cacheHint() system for caching a given set of sequence intervals associated with an owner object, which are flushed from cache if the owner object is garbage-collected. For subclassing, note that self.seqInfoDict must be set before SequenceDB.__init__ is called! sautoGCicKs¹|oti|ƒ|_n h|_||_|id|iƒ|_|id|iƒ|_|it jo t d‚n|i ƒ}||d(sselfs __class__s__name__s itemClass(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__FscCs|iiƒdS(sEmpty the cache.N(sselfs_weakValueDictsclear(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys clear_cacheJs((s__name__s __module__s__doc__sNones itemClasss SeqDBSlicesitemSliceClasss classutilsstandard_getstates __getstate__sstandard_setstates __setstate__sdicts _pickleAttrsslazy_create_inverts_SequenceDBInverses __invert__sTrues__init__s__hash__s _set_seqtypes _cache_maxs cacheHints strsliceCachescloses__iter__s iteritemss__len__s __getitem__skeyss __contains__s__repr__s clear_cachesread_only_errorsclears setdefaultspopspopitemscopysupdate(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys SequenceDB±s.               s_FileDBSeqDescriptorcBstZdZd„ZRS(s7Descriptor to retrieve entire sequence from seqLenDict.cCs+|ii|id}|id|ƒSdS(Ni(sobjsdbs seqLenDictsidslengthsstrslice(sselfsobjsobjtypeslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__get__Ys(s__name__s __module__s__doc__s__get__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_FileDBSeqDescriptorWs sFileDBSequencecBs>tZdZeƒZeiZd„Zd„Z e d„Z RS(s‡Default sequence object for file-based storage mechanism. See SequenceFileDB for the associated database class. In general, you should not create objects from this class directly; retrieve them from SequenceFileDB objects, instead. NOTE: 'self.db' is attached to all instances of this class that come from a particular database by 'classutil.get_bound_subclass'. cCsP||_ti|ƒ|i|iijo td|i|ifƒ‚ndS(Nssequence %s not in db %s(sidsselfs SequenceBases__init__sdbs seqLenDictsKeyError(sselfsdbsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ls  cCs|ii|idSdS(s2Unpack this sequence's length from the seqLenDict.iN(sselfsdbs seqLenDictsid(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__rscCsX|o4y|ii|||ƒSWq;tj oq;Xn|ii|i||ƒSdS(s>Access slice of a sequence efficiently, using seqLenDict info.N( suseCachesselfsdbs strsliceCachesstartsends IndexErrorsstrslicesid(sselfsstartsendsuseCache((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrslicevs ( s__name__s __module__s__doc__s_FileDBSeqDescriptorsseqs classutils item_reducers __reduce__s__init__s__len__sTruesstrslice(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysFileDBSequence]s     sSequenceFileDBcBsctZdZeZeiiƒZded|iiƒy|ii}Wntj on X|ƒdS(s0close our open shelve index file and _pureseq...N(sselfs seqLenDictscloses_pureseqsdo_closesAttributeError(sselfsdo_close((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysclose©s cCsd|ii|ifSdS(Ns <%s '%s'>(sselfs __class__s__name__sfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__³scCsUti|dƒ}z!tidƒt|||ƒWd|i ƒXti|dƒSdS(s;Create a seqLenDict from 'seqpath' and store in 'dictpath'.sns!Building sequence length index...Nsr( s classutils open_shelvesdictpaths seqLenDictsloggersdebugs_store_seqlen_dictsseqpathsreadersclose(sselfsdictpathsseqpathsreaders seqLenDict((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_create_seqLenDict¶s  cCsy |i}Wn8tj o,|id}t|dƒ}||_nX|i|d}|i ||ƒ|i ||ƒSdS(s>Access slice of a sequence efficiently, using seqLenDict info.s.pureseqsrbiN(sselfs_pureseqsifilesAttributeErrorsfilepathsfullpathsfiles seqLenDictsseqIDsoffsetsseeksstartsreadsend(sselfsseqIDsstartsendsuseCachesifilesoffsetsfullpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrsliceÀs  (s__name__s __module__s__doc__sFileDBSequences itemClasss SequenceDBs _pickleAttrsscopysNones__init__scloses__repr__s_create_seqLenDictsTruesstrslice(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysSequenceFileDB€s     s BasicSeqInfocBstZdZed„ZRS(s•Wrapper to provide the correct seqInfoDict-style object information. This boils down to providing id, db, length, and possibly offset. cCsC||_||_|tjot||ƒ|_n ||_dS(N(sseqIDsselfsidsseqDBsdbslengthsNoneslen(sselfsseqIDsseqDBslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__Øs    (s__name__s __module__s__doc__sNones__init__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys BasicSeqInfoÒs s _SeqLenObjectcBstZdZd„ZRS(s"Wrapper for use with a seqLenDict cCs0|i|\}|_ti||||ƒdS(N(sseqDBs seqLenDictsseqIDslengthsselfsoffsets BasicSeqInfos__init__(sselfsseqIDsseqDBslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__âs(s__name__s __module__s__doc__s__init__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys _SeqLenObjectàs sBasicSeqInfoDictcBsAtZdZeZd„Zd„Zd„Zd„Zd„Z RS(s—Wrapper around SequenceDB.seqLenDict to provide seqInfoDict behavior. This basic version just gets the length from the sequence object itself. cCs ||_dS(N(sdbsselfsseqDB(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ëscCs|i||iƒSdS(N(sselfs itemClasssksseqDB(sselfsk((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__îscCst|iiƒSdS(N(slensselfsseqDBs seqLenDict(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__ñscCst|iiƒSdS(N(sitersselfsseqDBs seqLenDict(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iter__ôscCs|iiiƒSdS(N(sselfsseqDBs seqLenDictskeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeys÷s( s__name__s __module__s__doc__s BasicSeqInfos itemClasss__init__s __getitem__s__len__s__iter__skeys(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysBasicSeqInfoDictæs     s_SeqLenDictWrappercBstZdZeZRS(s The default storage mechanism for sequences implemented by FileDBSequence and SequenceFileDB puts everything in seqLenDict, a shelve index of lengths and offsets. This class wraps that dictionary to provide the interface that SequenceDB expects to see. (s__name__s __module__s__doc__s _SeqLenObjects itemClass(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SeqLenDictWrapperús s_SeqLenDictSavercBs tZdZd„Zd„ZRS(s°Support for generic reading functions, called by _store_seqlen_dict. This allows you to specify your own 'reader' function when constructing a FileSequenceDB, e.g. so that you could read something other than FASTA files into a seqLenDict. Pass in this function as the 'reader' kwarg to FileSequenceDB. Custom reader functions should take a file handle and a filename, and return a list of sequence info objects with 'id', 'length', and 'sequence' attributes for each sequence in the given file/filename. _SeqLenDictSaver will then construct a '.pureseq' file containing the concatenated sequences and fill in the seqLenDict appropriately. cCs ||_dS(N(sreadersself(sselfsreader((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__scCs¸d}t|ddƒ}zx†|i||ƒD]r}|i|f||i <||i7}|it |i ƒjo t d|i |ifƒ‚n|i|i ƒq/WWd|iƒXdS(Nls.pureseqswbs%length does not match sequence: %s,%d(soffsetsfilesfilenames pureseq_fpsselfsreadersifilesoslengthsdsidslenssequences ValueErrorswritesclose(sselfsdsifilesfilenamesosoffsets pureseq_fp((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__call__s  (s__name__s __module__s__doc__s__init__s__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SeqLenDictSavers  srUcCs[ti}|tj ot|ƒ}nt||ƒ}z||||ƒWd|i ƒXdS(s–Store sequence lengths in a dictionary, e.g. a seqLenDict. Used by SequenceFileDB._create_seqLenDict. The 'reader' function implements a custom sequence format reader; by default, _store_seqlen_dict uses seqfmt.read_fasta_lengths, which reads FASTA-format files. See _SeqLenDictSaver for information on building a custom 'reader', and see the seqdb docs for an example. N( sseqfmtsread_fasta_lengthssbuildersreadersNones_SeqLenDictSaversfilesfilenamesmodesifilesdsclose(sdsfilenamesreadersmodesbuildersifile((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_store_seqlen_dict&s   s_PrefixUnionDictInversecBs)tZdZd„Zd„Zd„ZRS(sïProvide inverse (~) operator behavior for PrefixUnionDicts. This enables ~pud to return a database that, given a sequence object, returns the corresponding key (prefix.id) to retrieve that sequence object in the pud. cCs ||_dS(N(sdbsself(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__KscCs§|i}y|ii|i}Wnetj oYy0|iii|iijotdƒ‚nWnt j onXtdƒ‚nX||ii t |i ƒSdS(Nspthis annotation is not in the PrefixUnion, but its sequence is. You can get that using its 'sequence' attribute.sseq.db not in PrefixUnionDict( sivals pathForwardsseqsselfsdbsdictssprefixsKeyErrors _anno_seqsAttributeErrors separatorsstrsid(sselfsivalsseqsprefix((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__Ns cCs8y|ii|iijSWntj o tSnXdS(N(sseqs pathForwardsdbsselfsdictssAttributeErrorsFalse(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __contains___s(s__name__s __module__s__doc__s__init__s __getitem__s __contains__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_PrefixUnionDictInverseBs   s_PrefixUnionMemberDictcBsAtZdZed„d„Zd„ZeZd„Zd„ZRS(sž @CTB confusing/inappropriate use of a dict interface! keep?? @CTB document. 'd[prefix]=value; d[k] returns value if k is a member of prefix' cCs |iiS(N(sxs pathForwardsdb(sx((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysmscCs9h|_||_||_|tj o ||_ndS(N(sselfsvaluesspuDicts attrMethods _attrMethodsdefaultsNone(sselfspuDictsdefaults attrMethod((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ls     cCs|iiiƒSdS(N(sselfspuDicts prefixDictskeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeystscCsH||iijotd|ƒ‚n|ii|}||i| trypaths? s.cCs±|tj o,|otdƒ‚n|tjotii|ƒg}nt|dƒ} zÎt | ƒ}|i ƒi dƒ}h}x |D]˜} | i ƒidƒd \}} y"ti| |ƒ}||ƒ} WnDtj o8x|iƒD]} | iƒqïWtd| ƒ‚qŠX| |||iiƒD]-\}}x|D]}|i||ƒVq#WqWdS(N(sselfs prefixDictsitemsspsdsids format_id(sselfspsdsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iter__s  cCst|iƒƒSdS(N(slistsselfsiterkeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeysscCst|ƒSdS(N(sitersself(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysiterkeyssccsWxP|iiƒD]?\}}x0|iƒD]"\}}|i||ƒ|fVq)WqWdS(N( sselfs prefixDictsitemsspsds iteritemssidsseqs format_id(sselfspsdsseqsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys iteritemss   cCs)|i}|i|i|i|iSdS(sAFor a given sequence, return a fully qualified name, 'prefix.id'.N(sivals pathForwardsseqsselfsdictssdbs separatorsid(sselfsivalsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysgetName$s cKst||SdS(s&return a new member dictionary (empty)N(s_PrefixUnionMemberDictsselfskwargs(sselfskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys newMemberDict)scCs‹t|dƒ}||iIJx^|iiƒD]M\}}y|d||i fIJWq,t j ot d|ƒ‚q,Xq,W|i ƒdS(s3Save a header file, suitable for later re-creation.sws%s %sseseq db '%s' has no filepath; you may be able to save this to worldbase, but not to a text HeaderFile!N( sfilesfilenamesifilesselfs separators prefixDictsitemssksvsfilepathsAttributeErrorsclose(sselfsfilenamesifilesksv((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyswriteHeaderFile-s  cCs2d}x!|iD]}|t|ƒ7}qW|SdS(Ni(snsselfsdictssdbslen(sselfsdbsn((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__:s  c Cs¦h}xE|iƒD]7\}} |i|ƒ\}}| |i |hƒ|tj o2d|ii|ii}|i|}|SnXdS(s:Find in or add the given sequence to the inverse of a PUD.suserN( s_PrefixUnionDictInverses __getitem__sselfsseqsAttributeErrorsdbs separators pathForwardsidsnew_ids_(sselfsseqsnew_ids_((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysgetName]s cCs\y|i|ƒSWnDtj o8|ii o‚n|i|7_|i|ƒSnXdS(s)__getitem__ interface that calls getName.N(sselfsgetNamesseqsKeyErrorsdbsaddAll(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__gs(s__name__s __module__s__doc__sgetNames __getitem__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_PrefixDictInverseAdderWs  sSeqPrefixUnionDictcBs;tZdZeieƒZed„Zd„Z d„Z RS(sìSeqPrefixUnionDict provides += functionality to add seqs to a PUD. See the __iadd__ method for details. If addAll is True, then looking a sequence up in the inverse db will automatically add it to the PrefixUnionDict. cKsti||||_dS(N(sPrefixUnionDicts__init__sselfskwargssaddAll(sselfsaddAllskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__scCsš||jo|Snt|dtƒ}|tjot|idtƒ}n|tjoY|iidƒ otƒ}|i d|ƒn|id}|i||ii <|Sn||i jo|Sny|i idƒd}Wn™tj ot|dtƒ}|o)tii|ƒ}|idƒd}ndt|i ƒ}||ijo!tidt ƒtd ƒ‚q‚nX|i ||ƒ|Sd S( spAdd a sequence or database to the PUD, with a unique prefix. NOTE: __iadd__ must return self. sdbsusers.iÿÿÿÿsfilepathisnoname%dsv It appears that two different sequence databases are being assigned the same prefix ("%s"). For this reason, the attempted automatic construction of a PrefixUnionDict for you cannot be completed! You should instead construct a PrefixUnionDict that assigns a unique prefix to each sequence database, and supply it directly as the seqDict argument to the NLMSA constructor.s.cannot automatically construct PrefixUnionDictN(sksselfsgetattrsNonesdbs pathForwards prefixDictshas_keysKeepUniqueDictsds_add_prefix_dictsidsdictss_persistent_idssplitsnamesAttributeErrorsosspathsbasenameslensloggersdebugs ValueError(sselfsksdsdbsname((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iadd__†s8    cCs||i|<||i|(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__÷ssblastallf0.001sc Ks2|iƒ} | ||||||||| SdS(s?run blast with the specified parameters, return NLMSA alignmentN( sselfsformatdbsblastmapsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptsskwargs( sselfsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptsskwargssblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysblastùs s megablastf9.9999999999999995e-21s -U T -F ms RepeatMaskers-xsmallc  KsTdkl} |iddd| ƒ}|||||||||| | | | SdS(sCrun megablast with the specified parameters, return NLMSA alignment(sMegablastMappingsattrs megablastMapsmapClassN(sblastsMegablastMappingsselfsformatdbsblastmapsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargs(sselfsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargssMegablastMappingsblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys megablasts  sblastMapcCs~yt||ƒ}WnStj oG|tjodkl}|}n||ƒ}t |||ƒnX|i |ƒ|SdS(sAcreate a blast mapping object if needed, and ensure it is indexed(s BlastMappingN( sgetattrsselfsattrsblastmapsAttributeErrorsmapClasssNonesblasts BlastMappingssetattrsformatdbsfilepath(sselfsfilepathsattrsmapClasss BlastMappingsblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysformatdb s     ( s__name__s __module__s__doc__s __reduce__sNonesFalses__init__s__repr__sTruesblasts megablastsformatdb(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysBlastDBìs   ' s BlastDBXMLRPCc BshtZdZeddddddddddddƒZd„Zd „Zd „Zd „Zd „Z RS( s/XMLRPC server wrapper around a standard BlastDBs getSeqLenis get_strslices getSeqLenDicts get_db_sizes get_seqtypesstrslicecCs0yt||ƒSWntj o dSnXdS(s'get sequence length, or -1 if not foundiÿÿÿÿN(slensselfsidsKeyError(sselfsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys getSeqLens cCsLh}x;|iiƒD]*\}}|dt|dƒf||Represents a sequence in a blast database, accessed via XMLRPCcCsS|ii|ƒ|_|idjotd|ƒ‚n||_ti|ƒdS(Nis%s not in this database( sdbsservers getSeqLensidsselfslengthsKeyErrors SequenceBases__init__(sselfsdbsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__7s  cCs[|o4y|ii|||ƒSWq;tj oq;Xn|iii|i ||ƒSdS(s$XMLRPC access to slice of a sequenceN( suseCachesselfsdbs strsliceCachesstartsends IndexErrorsservers get_strslicesid(sselfsstartsendsuseCache((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrslice=s cCs |iSdS(N(sselfslength(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__Es(s__name__s __module__s__doc__s__init__sTruesstrslices__len__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysXMLRPCSequence5s   sXMLRPCSeqLenDescrcBs tZdZd„Zd„ZRS(s>descriptor that returns dictionary of remote server seqLenDictcCs ||_dS(N(sattrsself(sselfsattr((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__JscCsb|iiƒ}x8|iƒD]*\}}|dt|dƒf||y |iSWn,tj o |iiƒ|_|iSnXdS(s9efficient way to determine sequence type of this databaseN(sselfs_seqtypesAttributeErrorsservers get_seqtype(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys _set_seqtypejs  ( s__name__s __module__s__doc__sXMLRPCSequences itemClasssXMLRPCSeqLenDescrs seqLenDicts__init__s __reduce__s __getstate__s__len__s __contains__s _set_seqtype(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysXMLRPCSequenceDBTs       (.s__doc__s __future__s generatorsssyssossUserDictsweakrefssequencessqlgraphs classutils annotations AnnotationDBs AnnotationSeqsAnnotationSlicesAnnotationServersAnnotationClientsloggersseqfmtsdbfilesNoSuchFileErrorsobjects_SequenceDBInverses DictMixins SequenceDBs_FileDBSeqDescriptors SequenceBasesFileDBSequencesSequenceFileDBs BasicSeqInfos _SeqLenObjectsBasicSeqInfoDicts_SeqLenDictWrappers_SeqLenDictSaversNones_store_seqlen_dicts_PrefixUnionDictInverses_PrefixUnionMemberDictsPrefixUnionDicts_PrefixDictInverseAddersSeqPrefixUnionDicts_PUDSeqInfoDictsBlastDBs BlastDBXMLRPCsXMLRPCSequencesXMLRPCSeqLenDescrsXMLRPCSequenceDB($s _SeqLenObjects_store_seqlen_dictsAnnotationSlicesNoSuchFileErrors BlastDBXMLRPCsseqfmts_FileDBSeqDescriptors generatorssXMLRPCSequenceDBsloggersBasicSeqInfoDictsXMLRPCSeqLenDescrsBlastDBsSequenceFileDBs_SequenceDBInverses classutilsPrefixUnionDictsXMLRPCSequencesUserDicts_PrefixDictInverseAdderssyss SequenceDBs_SeqLenDictSaversFileDBSequences_PrefixUnionDictInverses_PrefixUnionMemberDicts_SeqLenDictWrappersSeqPrefixUnionDicts BasicSeqInfos_PUDSeqInfoDictsAnnotationServers AnnotationSeqsAnnotationClients AnnotationDBsweakrefsos((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys?ŒsD      %   ¦#R "$&ËN*+ PK Œ.;“Hpygr/seqfmt.pydef __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp __file__ = pkg_resources.resource_filename(__name__,'seqfmt.so') __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() PK Œ.;¥•jÈPPpygr/seqfmt.pyc;ò ¬á®Jc@sd„atƒdS(cCsMdk}dk}dk}|itdƒatabb|i ttƒdS(Ns seqfmt.so( ssyss pkg_resourcessimpsresource_filenames__name__s__file__sNones __loader__s __bootstrap__s load_dynamic(s pkg_resourcesssyssimp((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqfmt.pys __bootstrap__s  N(s __bootstrap__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqfmt.pys?s PK Œ.;¥•jÈPPpygr/seqfmt.pyo;ò ¬á®Jc@sd„atƒdS(cCsMdk}dk}dk}|itdƒatabb|i ttƒdS(Ns seqfmt.so( ssyss pkg_resourcessimpsresource_filenames__name__s__file__sNones __loader__s __bootstrap__s load_dynamic(s pkg_resourcesssyssimp((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqfmt.pys __bootstrap__s  N(s __bootstrap__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqfmt.pys?s PKcŒ.;<1/~~pygr/seqfmt.soþíúΘ „__TEXT __text__TEXTÀ´À€__picsymbolstub1__TEXT€@€€ __cstring__TEXTÀ(ÀŒ__DATA  __data__DATA , __dyld__DATA!,!,__la_symbol_ptr__DATA!4ˆ!4"__nl_symbol_ptr__DATA!¼ !¼D__bss__DATA!Ü(8__LINKEDIT0P0N 4F(jÄ/usr/lib/libgcc_s.1.dylib 4J®zÈX /usr/lib/libSystem.B.dylib1 WNä/0 P,,-*M´L04|¦BŸ}ˆ¦|¦}€cx=ŒŒd}‰¦| x=ŒŒ8N€ |¦BŸ}h¦|¦=kk8}i¦N€ |¦¿aÿì||x|@&BŸ-|ž#xè¦|½+xA”!ÿ AŠ€C8BC-žAŽ€^8B^.A’€]8B]?€´@ž<€]8Bÿÿ/‚]@žh€]£ëx; €| ¦| xN€!HX`A’P<_€€B €Až<<_<Ÿ€Bœ8„À€bHµ@Ž@Hl``; ```@Ž ;´€I}>Kx8BI``<_<€B˜‰Až˜€´žAž4<_<Ÿ-ž.€Bœ8„ì€bH5Kÿÿ€```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!<<_€B¤‰@žT<žãx€I}ß8`“Á8“Á<“¡@“D€À“aL8€8 8ÀgÛxÈóxÉóxÊóxHHQ|yy&A‚xH!EÓx$Ëx8ÀH‘|zy~à&A‚Œ€À@HÙH|€]£ëx€| ¦| xN€!``AŠ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€! A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```~ø A‚œ€Z8Bÿÿ/‚Z@žˆ€Z8!CÓxaºÁÿØ€}r }q | ¦| x€}p |¦N€ ~à&;@H,;À;`; ;@.M~à&V÷€&W€€]8Bÿÿ/‚]@žþ˜Kÿþt8!a€ºÁÿØ|¦}r }q }p N€ ```|¦¿aÿì8 BŸ8À8àô覔!ÿ <<Ÿ<_?Ÿ8c<8„h8BØ\¬HÍ?ß/ƒ|ix~œAž¸€C<8cD8BIHa<_/ƒ|exb AžŒ€~œ<Ÿ8„PH]/ƒ@œ´Hp```€ž €~8„ÿÿH5}€~€/€Až@€/€AžH1```ƒ¾;Þ/@žÿ´Hp```€\¬88!`<8c`"<_¤€<_»aÿì‘"¨|¦Kÿûœ``?ƒ»Ä8Ä/Až|xKÿÿH`8!`€»aÿì|¦N€ ```|¦¾ÿÀ|ƒ#x|@&BŸ<ÿÿ|¤+xè¦`pA<ß<¿|!n8ÆH88¥ð8á89<@8<9!@Hå;À/ƒAž (a8?<Ÿƒx€K8BK!<€I8BIa@€K8BK;€„€a<9)‘;HE|}y@‚L<_zÛxpÛx8€B"H€<_8,€B"H <_8-€B"H `8€H ­.||x@’P<_8zÛxpÛx€B"<_<_‘"€]8Bÿÿ/‚]@ž ÀH ¤```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ƒãxH=|~xHU/ƒAž0<_; zÛxpÛx€B-™8"<_‘"H €\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<ŸÃóx8„@H ¥|sy@‚\<€@€c$H í|}y@‚8zÛx<_PÓx8€B"``<_<_‘"H 8`H ‰.||x@’(<_8zÛxpÛx€B"<_Kÿþœ“£ <_|dx€B€bH |~y@‚DM€<_zÛx; pÛx€B8"<_‘"```<_H (€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!Ãóx8€8 Kÿõ €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!ƒXKÿþÌ`?߀a@€ž(H |zy@‚ <_zÛxpÛx8 €B"Kÿþ°€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!CÓxH ]/ƒ@ž,<_8!=?pÛx€Bb<_‘iH|<Ÿ8„Kx8BIHü<_8,€B"H8<_8-€B"<_<_‘"HT<_8-€B"<_<_‘"H`€]£ëx€| ¦| xN€!A’t; -™``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`AŽ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!<;À8côKÿîµ€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€P8Bÿÿ/‚P@ž €P~ƒx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€!Ãóxa€ºÿÀ|¦}q }p N€ |¦BŸ}h¦=k|¦…‹¬}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹t}‰¦N€ |¦BŸ}h¦=k|¦…‹X}‰¦N€ |¦BŸ}h¦=k|¦…‹<}‰¦N€ |¦BŸ}h¦=k|¦…‹ }‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹è}‰¦N€ |¦BŸ}h¦=k|¦…‹Ì}‰¦N€ |¦BŸ}h¦=k|¦…‹°}‰¦N€ |¦BŸ}h¦=k|¦…‹”}‰¦N€ |¦BŸ}h¦=k|¦…‹x}‰¦N€ |¦BŸ}h¦=k|¦…‹\}‰¦N€ |¦BŸ}h¦=k|¦…‹@}‰¦N€ |¦BŸ}h¦=k|¦…‹$}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹ì}‰¦N€ |¦BŸ}h¦=k|¦…‹Ð}‰¦N€ |¦BŸ}h¦=k|¦…‹´}‰¦N€ |¦BŸ}h¦=k|¦…‹˜}‰¦N€ |¦BŸ}h¦=k|¦…‹|}‰¦N€ |¦BŸ}h¦=k|¦…‹`}‰¦N€ |¦BŸ}h¦=k|¦…‹D}‰¦N€ |¦BŸ}h¦=k|¦…‹(}‰¦N€ |¦BŸ}h¦=k|¦…‹ }‰¦N€ |¦BŸ}h¦=k|¦…‹ð}‰¦N€ |¦BŸ}h¦=k|¦…‹Ô}‰¦N€ |¦BŸ}h¦=k|¦…‹¸}‰¦N€ |¦BŸ}h¦=k|¦…‹œ}‰¦N€ |¦BŸ}h¦=k|¦…‹€}‰¦N€ |¦BŸ}h¦=k|¦…‹d}‰¦N€ |¦BŸ}h¦=k|¦…‹H}‰¦N€ |¦BŸ}h¦=k|¦…‹,}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ read_fasta_lengthsseqfmt.pyxraise: arg 3 must be a traceback or Noneinstance exception may not have a separate valueraise: exception must be an old-style class or instanceseqfmt__builtin____builtins__pygr.seqfmtdpyfilefilenameOOOpygr.seqfmt.read_fasta_lengths!ð  !ô ˜!ø „!ü x " dunable to create %s.puresequnable to open %ssplitfilenoÀ À Èread seq lengths from python file object, save into dictionary d>wbrج°¸ààÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ @!$@! @!@!@ ´@ ¬@ ¨@ L@ D@ <@ 4@ ,@ $@ @ @ @ @!¸@!´@!°@!¬@!¨@!¤@! @!œ@!˜@!”@!@!Œ@!ˆ@!„@!€@!|@!x@!t@!p@!l@!h@!d@!`@!\@!X@!T@!P@!L@!H@!D@!@@!<@!8@!4@ ðÀd=dKfL<[€i {!ð‹  •!ô¤ ˜®!ø¹ „Ã!üÎ xØ"ã dí ¨ü À& ÈR! \!f!p!.D_D`D_D`$D_(D`@DaPDbdDdxDeˆDhÀDiØD˜ðDkDnDpDs0DyDDzPD€D‚°DƒÀD„ÄDœØD•ÜDœèD•D‡D˜0D™`DšDœ¬Dš°Dœ´Dš¼DœÀDšÈDœÐDšÜDœàŽ$_¡@_­@_º@_Ä€Ѐ߀õ€1€[€j€ € !€ 2€ K€ \€ u€ †€ ¡€ ²€ Í€ Þ€ õ€ € € /€ @€ Q€ b€ z€ ‹€ ¦€ ·€ Ó€ ä€ € € B€ S€ o€ €€ —€ ¨€ À Þ€ ú€ € € -€ I€ e€ }€ Ž€ §€ ¸€ Ï€ à€ ø€€$€4€D€T€d€t€“€´€Ô€å€õ€€€2€B€R€b€Ë€;€¬€¼€Ì€Ü€ç€õ€R€Ú€õ€€€/€E€U€o€ˆ€š€²€Ä€Þ€ð€ €€<€N€n€‰€§€º€Ý€€€5€H€k€|€€ž€¯€À€Ñ€â€ó€€$ôN.D½DÆ4*!èDÇ@DÈHDÉPDÊ\:!ÜDËhDÌpDÍxDΰDϼDÐðC!äDà 4Dá @Dç TDè `Dé hDë pDì Dí ÀDî ðDï Dð `Dñ €Dð „Dñ ˆDð Dñ ”Dð œDñ ¤Dð °Dñ ¸Dë èDñ Q$½k@½{@¾@¿ @À²@ÁÅ@ÂÙ@Ãê@Äü€€"€@€_€ä€Q€d€u€ˆ€©€Ç€æ€ € 6€"I€"”€"§€"º€"Í€"ë€#€# €$€$)À$*à $$+$N $. 0DE 0DG 8DE <DG @DE HDG TD\ \$,!ìDG dD\ lDG tDH |DG €DH ˆDI ŒDJ DI ˜DJ  $5!àDK ¨DJ ¬DK ´DL ¸D¯ àD° ôD² D³ D® DM @DS HDR LDM TDS `DM dDS hDM lDS pDR tD® €DS  $>$E 0$P$„N ´$Q!. ÀDX ÀDo ÈDX ÌDo ÜDX àDo ìDX ôDo øDY üDo D[ DY DZ Do Dp ,Dt 0Dw 4Dt 8Dp <Dq HDr XDt hDw lDt tDw |DÌ ¤Dà ¸Dx ÐD/ Dy0Dz`D{¤D|ÐD€àDèD‚4DƒlD…pD†ÌD‡øDˆD‰4D@DtD• D–ØDšäD›ìDœDTDž€DŸÀD¡ÄD¢D£<D¤LD¥xD¬ D¶ÄD¹ÌD¶ÐD¹ØD¾èDÁDÂDÁDÂDÆ(DÉ4DÊHDË€D̘DͬDΰDÑ´DÒÌDØøDÙ0DÚDDÜHDÝdDÞDߨDàÔDáìD¡D¢4D÷HD¤XD¥`D§€D¨ŒD§D¨”Dâ¼DãÄDäð$f„PDÛP${„DûDü˜$‰„ DÛ $ž„àDþàDèDðDøDDöD DöD÷ D(D¾8D@DLD`D˜D°DèD ìD#ðD$D*HD,PDÑhDÜ|DÞ D/ÄD0ÜD1 D2PD5`D6D7ÀD8ðD9 D;P$¬$X À$Ü@X$î@X%@X%€Y8%"€Z<%7€[@%N@]%i€%¾@^%Ô@_%ì€`H&€aD&@b&,€&9€&\€&{@c&’@d&ª@e&Á@f&Ó@g&â@h&ñ@i'@j'€'€'-€'C€(é€(ü€)+€)d€)w€)Š€)€)°€)À)ã€*€*#€*;€*f€*w€*ˆ€*›€*¬€*€*Ý@l*ì@m*ü&n!+€+2À À+3@¤+<ÀX+=à¼+>€@+`@ü+lÀ +màà+nàt+o$ ´Nt+p(%!Ü+(&!à+Ž('!ä+¢((!è+¸()!ì+É€+Ú&9  +ì&:!+þ&; „,&< x,"&=!,4&> d,F&?! ,X&@ ˜,j(B!ð,€(C!ô,•(E!ø,¦(F!ü,·(G",È&I ,â&W È-&= ¨--&U!-F€-e€-„€-¤€-À-â€.€.!€.@€.`€.€€.Ÿ€.½€.ã€/,dt0C 0Oþlþzþ†þ–þ¥þ¶þÅþÖþãþ÷þþþ&þ;þMþ[þoþ„þ–þ¨þÀþÒþæþùþþ*þBþQþdþvþˆþ•þ¥¹þÉÕÝåìóú>;L5BFVTR1?=DEM<:2096UJP/8SQ-AGI@C>;L5BFVTR1?=DEM<:2096UJP/8SQ-AGI@C.4K7HN3O__dyld_func_lookupdyld_stub_binding_helper__mh_bundle_header_initseqfmt_PyArg_ParseTupleAndKeywords_PyClass_Type_PyCode_New_PyErr_Occurred_PyErr_Restore_PyErr_SetString_PyExc_IOError_PyExc_TypeError_PyFrame_New_PyImport_AddModule_PyInstance_Type_PyInt_AsLong_PyInt_FromLong_PyLong_FromLongLong_PyModule_GetDict_PyNumber_Add_PyNumber_Remainder_PyObject_CallObject_PyObject_GetAttr_PyObject_GetItem_PyObject_SetAttrString_PyObject_SetItem_PySequence_GetItem_PyString_AsString_PyString_FromString_PyString_FromStringAndSize_PyString_InternInPlace_PyString_Type_PyThreadState_Get_PyTraceBack_Here_PyTraceBack_Type_PyTuple_New_Py_InitModule4__DefaultRuneLocale__Py_NoneStruct___maskrune_fclose_fdopen_fgets_fopen_fputc_strcpydyld__mach_header/Users/administrator/Desktop/pygr-0.8.0/pygr/seqfmt.cgcc2_compiled.:t(0,1)=(0,1)___pyx_string_tab___pyx_n_fileno___pyx_k1___pyx_n_split___pyx_k8___pyx_k3p___pyx_k3___pyx_k4p___pyx_k4___pyx_k6p___pyx_k6___pyx_methods___pyx_f_4pygr_6seqfmt_read_fasta_lengths___pyx_doc_4pygr_6seqfmt_read_fasta_lengths___pyx_k7___pyx_k5___pyx_k2___pyx_filenames___Pyx_Raise__Pyx_Raise:f(0,1)type:P(0,2)value:P(0,2)tb:P(0,2)void:t(0,1):t(0,2)=*(0,3)PyObject:t(0,3)=(0,4)_object:T(0,4)=s8ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;;int:t(0,5)=r(0,5);-2147483648;2147483647;:t(0,6)=*(0,7)_typeobject:T(0,7)=s192ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ob_size:(0,5),64,32;tp_name:(0,8),96,32;tp_basicsize:(0,5),128,32;tp_itemsize:(0,5),160,32;tp_dealloc:(0,9),192,32;tp_print:(0,11),224,32;tp_getattr:(0,13),256,32;tp_setattr:(0,15),288,32;tp_compare:(0,17),320,32;tp_repr:(0,19),352,32;tp_as_number:(0,21),384,32;tp_as_sequence:(0,22),416,32;tp_as_mapping:(0,23),448,32;tp_hash:(0,24),480,32;tp_call:(0,26),512,32;tp_str:(0,19),544,32;tp_getattro:(0,28),576,32;tp_setattro:(0,30),608,32;tp_as_buffer:(0,32),640,32;tp_flags:(0,33),672,32;tp_doc:(0,8),704,32;tp_traverse:(0,34),736,32;tp_clear:(0,36),768,32;tp_richcompare:(0,38),800,32;tp_weaklistoffset:(0,33),832,32;tp_iter:(0,40),864,32;tp_iternext:(0,41),896,32;tp_methods:(0,42),928,32;tp_members:(0,43),960,32;tp_getset:(0,44),992,32;tp_base:(0,6),1024,32;tp_dict:(0,2),1056,32;tp_descr_get:(0,45),1088,32;tp_descr_set:(0,46),1120,32;tp_dictoffset:(0,33),1152,32;tp_init:(0,47),1184,32;tp_alloc:(0,48),1216,32;tp_new:(0,50),1248,32;tp_free:(0,52),1280,32;tp_is_gc:(0,36),1312,32;tp_bases:(0,2),1344,32;tp_mro:(0,2),1376,32;tp_cache:(0,2),1408,32;tp_subclasses:(0,2),1440,32;tp_weaklist:(0,2),1472,32;tp_del:(0,9),1504,32;;:t(0,8)=*(0,54):t(0,10)=*(0,55)destructor:t(0,9)=(0,10):t(0,12)=*(0,56)printfunc:t(0,11)=(0,12):t(0,14)=*(0,57)getattrfunc:t(0,13)=(0,14):t(0,16)=*(0,58)setattrfunc:t(0,15)=(0,16):t(0,18)=*(0,59)cmpfunc:t(0,17)=(0,18):t(0,20)=*(0,60)reprfunc:t(0,19)=(0,20):t(0,21)=*(0,61):t(0,22)=*(0,62):t(0,23)=*(0,63):t(0,25)=*(0,64)hashfunc:t(0,24)=(0,25):t(0,27)=*(0,65)ternaryfunc:t(0,26)=(0,27):t(0,29)=*(0,66)getattrofunc:t(0,28)=(0,29):t(0,31)=*(0,67)setattrofunc:t(0,30)=(0,31):t(0,32)=*(0,68)long int:t(0,33)=r(0,33);-2147483648;2147483647;:t(0,35)=*(0,69)traverseproc:t(0,34)=(0,35):t(0,37)=*(0,70)inquiry:t(0,36)=(0,37):t(0,39)=*(0,71)richcmpfunc:t(0,38)=(0,39)getiterfunc:t(0,40)=(0,20)iternextfunc:t(0,41)=(0,20):t(0,42)=*(0,72):t(0,43)=*(0,73):t(0,44)=*(0,74)descrgetfunc:t(0,45)=(0,27)descrsetfunc:t(0,46)=(0,31)initproc:t(0,47)=(0,31):t(0,49)=*(0,75)allocfunc:t(0,48)=(0,49):t(0,51)=*(0,76)newfunc:t(0,50)=(0,51):t(0,53)=*(0,77)freefunc:t(0,52)=(0,53)char:t(0,54)=r(0,54);0;127;:t(0,55)=f(0,1):t(0,56)=f(0,5):t(0,57)=f(0,2):t(0,58)=f(0,5):t(0,59)=f(0,5):t(0,60)=f(0,2)PyNumberMethods:t(0,61)=(0,78)PySequenceMethods:t(0,62)=(0,79)PyMappingMethods:t(0,63)=(0,80):t(0,64)=f(0,33):t(0,65)=f(0,2):t(0,66)=f(0,2):t(0,67)=f(0,5)PyBufferProcs:t(0,68)=(0,81):t(0,69)=f(0,5):t(0,70)=f(0,5):t(0,71)=f(0,2)PyMethodDef:T(0,72)=s16ml_name:(0,8),0,32;ml_meth:(0,82),32,32;ml_flags:(0,5),64,32;ml_doc:(0,8),96,32;;PyMemberDef:T(0,73)=s20name:(0,8),0,32;type:(0,5),32,32;offset:(0,5),64,32;flags:(0,5),96,32;doc:(0,8),128,32;;PyGetSetDef:T(0,74)=s20name:(0,8),0,32;get:(0,83),32,32;set:(0,85),64,32;doc:(0,8),96,32;closure:(0,87),128,32;;:t(0,75)=f(0,2):t(0,76)=f(0,2):t(0,77)=f(0,1):T(0,78)=s152nb_add:(0,88),0,32;nb_subtract:(0,88),32,32;nb_multiply:(0,88),64,32;nb_divide:(0,88),96,32;nb_remainder:(0,88),128,32;nb_divmod:(0,88),160,32;nb_power:(0,26),192,32;nb_negative:(0,89),224,32;nb_positive:(0,89),256,32;nb_absolute:(0,89),288,32;nb_nonzero:(0,36),320,32;nb_invert:(0,89),352,32;nb_lshift:(0,88),384,32;nb_rshift:(0,88),416,32;nb_and:(0,88),448,32;nb_xor:(0,88),480,32;nb_or:(0,88),512,32;nb_coerce:(0,90),544,32;nb_int:(0,89),576,32;nb_long:(0,89),608,32;nb_float:(0,89),640,32;nb_oct:(0,89),672,32;nb_hex:(0,89),704,32;nb_inplace_add:(0,88),736,32;nb_inplace_subtract:(0,88),768,32;nb_inplace_multiply:(0,88),800,32;nb_inplace_divide:(0,88),832,32;nb_inplace_remainder:(0,88),864,32;nb_inplace_power:(0,26),896,32;nb_inplace_lshift:(0,88),928,32;nb_inplace_rshift:(0,88),960,32;nb_inplace_and:(0,88),992,32;nb_inplace_xor:(0,88),1024,32;nb_inplace_or:(0,88),1056,32;nb_floor_divide:(0,88),1088,32;nb_true_divide:(0,88),1120,32;nb_inplace_floor_divide:(0,88),1152,32;nb_inplace_true_divide:(0,88),1184,32;;:T(0,79)=s40sq_length:(0,36),0,32;sq_concat:(0,88),32,32;sq_repeat:(0,92),64,32;sq_item:(0,92),96,32;sq_slice:(0,94),128,32;sq_ass_item:(0,96),160,32;sq_ass_slice:(0,98),192,32;sq_contains:(0,100),224,32;sq_inplace_concat:(0,88),256,32;sq_inplace_repeat:(0,92),288,32;;:T(0,80)=s12mp_length:(0,36),0,32;mp_subscript:(0,88),32,32;mp_ass_subscript:(0,101),64,32;;:T(0,81)=s16bf_getreadbuffer:(0,102),0,32;bf_getwritebuffer:(0,104),32,32;bf_getsegcount:(0,105),64,32;bf_getcharbuffer:(0,107),96,32;;PyCFunction:t(0,82)=(0,29):t(0,84)=*(0,109)getter:t(0,83)=(0,84):t(0,86)=*(0,110)setter:t(0,85)=(0,86):t(0,87)=*(0,1)binaryfunc:t(0,88)=(0,29)unaryfunc:t(0,89)=(0,20):t(0,91)=*(0,111)coercion:t(0,90)=(0,91):t(0,93)=*(0,112)intargfunc:t(0,92)=(0,93):t(0,95)=*(0,113)intintargfunc:t(0,94)=(0,95):t(0,97)=*(0,114)intobjargproc:t(0,96)=(0,97):t(0,99)=*(0,115)intintobjargproc:t(0,98)=(0,99)objobjproc:t(0,100)=(0,18)objobjargproc:t(0,101)=(0,31):t(0,103)=*(0,116)getreadbufferproc:t(0,102)=(0,103)getwritebufferproc:t(0,104)=(0,103):t(0,106)=*(0,117)getsegcountproc:t(0,105)=(0,106):t(0,108)=*(0,118)getcharbufferproc:t(0,107)=(0,108):t(0,109)=f(0,2):t(0,110)=f(0,5):t(0,111)=f(0,5):t(0,112)=f(0,2):t(0,113)=f(0,2):t(0,114)=f(0,5):t(0,115)=f(0,5):t(0,116)=f(0,5):t(0,117)=f(0,5):t(0,118)=f(0,5)___Pyx_AddTraceback___pyx_filename___pyx_m___pyx_lineno__Pyx_AddTraceback:f(0,1)funcname:P(0,8)py_srcfile:r(0,2)py_funcname:r(0,2)py_globals:r(0,2)empty_tuple:r(0,2)empty_string:r(0,2)py_code:r(0,119)py_frame:r(0,120):t(0,119)=*(0,121):t(0,120)=*(0,122)PyCodeObject:t(0,121)=(0,123)PyFrameObject:t(0,122)=(0,124):T(0,123)=s64ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;co_argcount:(0,5),64,32;co_nlocals:(0,5),96,32;co_stacksize:(0,5),128,32;co_flags:(0,5),160,32;co_code:(0,2),192,32;co_consts:(0,2),224,32;co_names:(0,2),256,32;co_varnames:(0,2),288,32;co_freevars:(0,2),320,32;co_cellvars:(0,2),352,32;co_filename:(0,2),384,32;co_name:(0,2),416,32;co_firstlineno:(0,5),448,32;co_lnotab:(0,2),480,32;;_frame:T(0,124)=s336ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ob_size:(0,5),64,32;f_back:(0,125),96,32;f_code:(0,119),128,32;f_builtins:(0,2),160,32;f_globals:(0,2),192,32;f_locals:(0,2),224,32;f_valuestack:(0,126),256,32;f_stacktop:(0,126),288,32;f_trace:(0,2),320,32;f_exc_type:(0,2),352,32;f_exc_value:(0,2),384,32;f_exc_traceback:(0,2),416,32;f_tstate:(0,127),448,32;f_lasti:(0,5),480,32;f_lineno:(0,5),512,32;f_restricted:(0,5),544,32;f_iblock:(0,5),576,32;f_blockstack:(0,128),608,1920;f_nlocals:(0,5),2528,32;f_ncells:(0,5),2560,32;f_nfreevars:(0,5),2592,32;f_stacksize:(0,5),2624,32;f_localsplus:(0,129),2656,32;;:t(0,125)=*(0,124):t(0,126)=*(0,2):t(0,127)=*(0,130):t(0,128)=ar(0,131);0;19;(0,132):t(0,129)=ar(0,131);0;0;(0,2)PyThreadState:t(0,130)=(0,133)long unsigned int:t(0,131)=r(0,131);0;037777777777;PyTryBlock:t(0,132)=(0,134)_ts:T(0,133)=s84next:(0,135),0,32;interp:(0,136),32,32;frame:(0,125),64,32;recursion_depth:(0,5),96,32;tracing:(0,5),128,32;use_tracing:(0,5),160,32;c_profilefunc:(0,137),192,32;c_tracefunc:(0,137),224,32;c_profileobj:(0,2),256,32;c_traceobj:(0,2),288,32;curexc_type:(0,2),320,32;curexc_value:(0,2),352,32;curexc_traceback:(0,2),384,32;exc_type:(0,2),416,32;exc_value:(0,2),448,32;exc_traceback:(0,2),480,32;dict:(0,2),512,32;tick_counter:(0,5),544,32;gilstate_counter:(0,5),576,32;async_exc:(0,2),608,32;thread_id:(0,33),640,32;;:T(0,134)=s12b_type:(0,5),0,32;b_handler:(0,5),32,32;b_level:(0,5),64,32;;:t(0,135)=*(0,133):t(0,136)=*(0,139):t(0,138)=*(0,140)Py_tracefunc:t(0,137)=(0,138)PyInterpreterState:t(0,139)=(0,141):t(0,140)=f(0,5)_is:T(0,141)=s36next:(0,142),0,32;tstate_head:(0,135),32,32;modules:(0,2),64,32;sysdict:(0,2),96,32;builtins:(0,2),128,32;codec_search_path:(0,2),160,32;codec_search_cache:(0,2),192,32;codec_error_registry:(0,2),224,32;dlopenflags:(0,5),256,32;;:t(0,142)=*(0,141)___pyx_f___pyx_binitseqfmt:F(0,1)___pyx_argnames.6809/usr/include/ctype.hpygr/seqfmt.c/usr/include/ctype.hpygr/seqfmt.c__pyx_f_4pygr_6seqfmt_read_fasta_lengths:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_d:(0,2)__pyx_v_pyfile:(0,2)__pyx_v_filename:(0,2)__pyx_v_seqLength:r(0,143)long long int:t(0,143)=@s64;r(0,143);01000000000000000000000;0777777777777777777777;__pyx_v_ipos:r(0,143)__pyx_v_offset:r(0,143)__pyx_v_tmp:(0,144)__pyx_v_fastastart:(0,145)__pyx_v_p:r(0,8)char:t(0,54):t(0,144)=ar(0,131);0;32767;(0,54):t(0,145)=ar(0,131);0;3;(0,54)__pyx_v_ifile:r(0,146)__pyx_v_ifile2:r(0,146)__pyx_v_outfile:r(0,2)__pyx_v_id:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,5)int:t(0,5):t(0,146)=*(0,147)FILE:t(0,147)=(0,148)__sFILE:T(0,148)=s88_p:(0,149),0,32;_r:(0,5),32,32;_w:(0,5),64,32;_flags:(0,150),96,16;_file:(0,150),112,16;_bf:(0,151),128,64;_lbfsize:(0,5),192,32;_cookie:(0,87),224,32;_close:(0,152),256,32;_read:(0,153),288,32;_seek:(0,154),320,32;_write:(0,155),352,32;_ub:(0,151),384,64;_extra:(0,156),448,32;_ur:(0,5),480,32;_ubuf:(0,157),512,24;_nbuf:(0,158),536,8;_lb:(0,151),544,64;_blksize:(0,5),608,32;_offset:(0,159),640,64;;:t(0,149)=*(0,161)short int:t(0,150)=@s16;r(0,150);-32768;32767;__sbuf:T(0,151)=s8_base:(0,149),0,32;_size:(0,5),32,32;;:t(0,152)=*(0,162):t(0,153)=*(0,163):t(0,154)=*(0,164):t(0,155)=*(0,165):t(0,156)=*(0,166):t(0,157)=ar(0,131);0;2;(0,161):t(0,158)=ar(0,131);0;0;(0,161)__darwin_off_t:t(0,160)=(0,167)fpos_t:t(0,159)=(0,160)unsigned char:t(0,161)=@s8;r(0,161);0;255;:t(0,162)=f(0,5):t(0,163)=f(0,5):t(0,164)=f(0,159):t(0,165)=f(0,5):t(0,166)=xs__sFILEX:__int64_t:t(0,167)=(0,143)__pyx_5:r(0,2)__pyx_6:r(0,54)__pyx_argnames:V(0,168):t(0,168)=ar(0,131);0;3;(0,8)j:r(0,2)__darwin_ct_rune_t:t(0,169)=(0,5)_c:r(0,169)__pyx_m:S(0,2)__pyx_b:S(0,2)__pyx_lineno:S(0,5)__pyx_filename:S(0,8)__pyx_f:S(0,170):t(0,170)=*(0,8)__pyx_k1:S(0,171)__pyx_k2:S(0,172)__pyx_k3:S(0,173)__pyx_k4:S(0,174)__pyx_k5:S(0,175)__pyx_k6:S(0,176)__pyx_k7:S(0,177)__pyx_k8:S(0,178)__pyx_n_fileno:S(0,2)__pyx_n_split:S(0,2)__pyx_k3p:S(0,2)__pyx_k4p:S(0,2)__pyx_k6p:S(0,2)__pyx_string_tab:S(0,179)__pyx_doc_4pygr_6seqfmt_read_fasta_lengths:S(0,180)__pyx_methods:S(0,181)__pyx_filenames:S(0,182):t(0,171)=ar(0,131);0;6;(0,54):t(0,172)=ar(0,131);0;1;(0,54):t(0,173)=ar(0,131);0;17;(0,54):t(0,174)=ar(0,131);0;8;(0,54):t(0,175)=ar(0,131);0;2;(0,54):t(0,176)=ar(0,131);0;19;(0,54):t(0,177)=ar(0,131);0;1;(0,54):t(0,178)=ar(0,131);0;5;(0,54):t(0,179)=ar(0,131);0;5;(0,183):t(0,180)=ar(0,131);0;64;(0,54):t(0,181)=ar(0,131);0;1;(0,72):t(0,182)=ar(0,131);0;0;(0,8)__Pyx_StringTabEntry:t(0,183)=(0,184):T(0,184)=s16p:(0,126),0,32;i:(0,5),32,32;s:(0,8),64,32;n:(0,33),96,32;;PK5u);Xˆ { {pygr/sequence.py from __future__ import generators import types from sequtil import * NOT_ON_SAME_PATH= -2 class ReadOnlyAttribute(object): def __init__(self,attr): self.attr=attr def __get__(self,obj,klass): return getattr(obj,self.attr) ################################################################### # # INTERVAL - INTERVAL MAPPING # CORRECTLY HANDLES SCALING AND ORIENTATION TRANSFORMATIONS # ASSUMES A SIMPLE SCALAR TRANSFORMATION FROM ONE COORD SYSTEM # TO THE OTHER. DOES NOT HANDLE INDELS WITHIN THE MAPPING! class IntervalTransform(object): "Represents coordinate transformation from one interval to another" srcPath=ReadOnlyAttribute('_srcPath') # PREVENT USER FROM MODIFYING THESE! destPath=ReadOnlyAttribute('_destPath') def __init__(self,srcPath,destPath,edgeInfo=None, edgeAttr=None,edgeIndex=None): "MAP FROM srcPath -> destPath" self.scale= len(destPath)/float(len(srcPath)) self._srcPath=srcPath self._destPath=destPath if edgeInfo!=None and edgeAttr!=None: try: # GET EDGE INFO IF PRESENT edgeInfo=getattr(edgeInfo,edgeAttr) except AttributeError: edgeInfo=None if edgeInfo!=None: if edgeIndex!=None: edgeInfo=edgeInfo[edgeIndex] self.edgeInfo=edgeInfo def xform(self,i): 'transform int srcPath local coord to destPath local coord' return int(i*self.scale) def xformBack(self,i): 'transform int destPath local coord to srcPath local coord' return int(i/self.scale) def getStartStop(self,srcPath,ourPath): 'compute srcPath start,stop in ourPath local coords' if srcPath.path is ourPath.path: return srcPath.start-ourPath.start,srcPath.stop-ourPath.start try: if srcPath.path._reverse is ourPath.path: return -(srcPath.start)-ourPath.start,\ -(srcPath.stop)-ourPath.start except AttributeError:pass raise ValueError('sequence mismatch: argument not from this seq') def __call__(self,srcPath): """Apply this transformation to an interval NB: it is not restricted to the domain of this transform, and thus can extend BEYOND the boundaries of this transform. If you want it clipped use [] interface instead of ().""" start,stop=self.getStartStop(srcPath,self.srcPath) return SeqPath(self.destPath,self.xform(start),self.xform(stop), relativeToStart=True) def reverse(self,destPath): "reverse transform an interval" start,stop=self.getStartStop(destPath,self.destPath) return SeqPath(self.srcPath,self.xformBack(start), self.xformBack(stop),relativeToStart=True) def __getitem__(self,srcPath): # PROVIDE DICT-LIKE INTERFACE """intersect srcPath with domain of this transform, then return transform to target domain coordinates""" return self(srcPath*self.srcPath) def __iter__(self): yield self.srcPath def items(self): yield self.srcPath,self.destPath def __getattr__(self,attr): "provide transparent wrapper for edgeInfo attributes" try: return getattr(self.__dict__['edgeInfo'],attr) except (KeyError,AttributeError): # RAISE EXCEPTION IF NOT FOUND! raise AttributeError('neither IntervalTransform nor edgeinfo has attr ' +attr) def repr_dict(self): "Return compact dictionary representing this interval mapping" s=self.srcPath.repr_dict() # GET REPR OF BOTH INTERVALS d=self.destPath.repr_dict() out={} for k,val in s.items(): # ADD PREFIX TO EACH ATTR out['src_'+k]=val out['dest_'+k]=d[k] try: e=self.edgeInfo.repr_dict() # GET EDGE INFO IF PRESENT except AttributeError: pass else: out.update(e) # SAVE EDGE INFO DATA return out def nidentity(self): "calculate total #identity matches between srcPath and destPath" nid=0 src=str(self.srcPath).upper() dest=str(self.destPath).upper() slen=len(src) i=0 while i target. seqs returns its sequences" seqs=LetterEdgeDescriptor() def __init__(self,origin,target): self.origin=origin self.target=target def __iter__(self): 'generate origin seqpos for sequences that traverse this edge' for seq in self.seqs: yield self.origin.getSeqPos(seq) # REDUCE 1:MANY SCHEMA TO 1:1, DISCARD EDGE INFO def iteritems(self): 'generate origin,target seqpos for sequences that traverse this edge' for seq in self.seqs: # REDUCE 1:MANY SCHEMA TO 1:1, DISCARD EDGE INFO yield self.origin.getSeqPos(seq),self.target.getSeqPos(seq) def __getitem__(self,k): 'return origin,target seqpos for sequence k; raise KeyError if not in this edge' try: k=k.path except AttributeError: raise TypeError('k not a valid sequence: it has no path attribute') return (self.origin.getSeqPos(k.path),self.target.getSeqPos(k.path)) def __cmp__(self,other): 'two edge objects match if they link identical nodes' try: if self.origin==other.origin and self.target==other.target: return 0 # REPORT A MATCH except AttributeError: # other MUST BE A DIFFERENT TYPE, SO NO MATCH pass return cmp(id(self),id(other)) def absoluteSlice(seq,start,stop): '''get slice of top-level sequence object, in absolute coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForward''' try: if start<0: # REVERSE ORIENTATION return -(seq.pathForward[-stop:-start]) else: # FORWARD ORIENTATION return seq.pathForward[start:stop] except AttributeError: if seq is None: return slice(start, stop) def relativeSlice(seq,start,stop): '''get slice of this sequence object, in relative coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForward''' if start<0: # REVERSE ORIENTATION return -(seq[-stop:-start]) else: # FORWARD ORIENTATION return seq[start:stop] def sumSliceIndex(i, myslice, relativeToStart): '''Adjust index value either relative to myslice.start (positive indexes) or relative to myslice.stop (negative indexes). Handle the case where i is None or myslice is None appropriately. ''' if myslice is None: # NO OBJECT, SO NOTHING TO DO... return i if i is None: i = 0 i *= myslice.step if relativeToStart: return i + myslice.start else: return i + myslice.stop class SeqOriDescriptor(object): "Get orientation of sequence interval" def __get__(self, seq, objtype): if seq.start>=0: return 1 # FORWARD ORIENTATION else: return -1 # REVERSE ORIENTATION class PathForwardDescr(object): 'get the top-level forward sequence object' def __get__(self,seq,objtype): if seq.orientation>0: return seq.path else: return seq.path._reverse class AbsIntervalDescr(object): 'get the top-level forward sequence object' def __get__(self,seq,objtype): if seq.orientation>0: return seq.start,seq.stop else: return -(seq.stop),-(seq.start) class SeqPath(object): '''Base class for specifying a path, ie. sequence interval. This implementation takes a sequence object as initializer and simply represents the interval as a slice of the sequence.''' orientation=SeqOriDescriptor() # COMPUTE ORIENTATION AUTOMATICALLY pathForward=PathForwardDescr() # GET THE TOP-LEVEL FORWARD SEQUENCE OBJ _abs_interval=AbsIntervalDescr() def __init__(self, path, start=0, stop=None, step=None, reversePath=False, relativeToStart=False, absoluteCoords=False): '''Return slice of path[start:stop:step]. NB: start>stop means reverse orientation, i.e. (-path)[-stop:-start] start/stop are LOCAL coordinates relative to the specified path By default, start/stop are interpreted in the usual Python slicing way, i.e. a negative start value is interpreted as len(path)-start. The relativeToStart option turns off this behavior, so that negative values are interpreted as negative coordinates in the local coordinate system of path. absoluteCoords option allows intervals to be created using Pygrs internal coordinate convention i.e. -20,-10 --> -(path.pathForward[10:20]) ''' if reversePath: # create top-level negative orientation path start = -(path.stop) stop = 0 self._reverse = path path = None # make this a top-level path object if absoluteCoords: # THIS OPTION PROVIDES TRANSPARENT WAY TO CREATE if start >= 0: # INTERVALS USING start,stop PAIRS THAT FOLLOW path = path.pathForward # OUR INTERNAL SIGN CONVENTION else: # i.e. start<0 MEANS REVERSE ORIENTATION! path = - (path.pathForward) else: # ADJUST start,stop ACCORDING TO path.start / path.stop start = sumSliceIndex(start, path, relativeToStart or start is None or start>=0) stop = sumSliceIndex(stop, path, relativeToStart or (stop is not None and stop>=0)) if start is not None and stop is not None and start>stop: start = -start # start>stop MEANS REVERSE ORIENTATION! stop = -stop if path is not None: path = -path if path is not None: # perform bounds checking if start < path.path.start: start = path.path.start if stop > path.path.stop: stop = path.path.stop if start is None or stop is None or start>=stop: raise IndexError('cannot create empty sequence interval!') self.start = start self.stop = stop if step is None: step = 1 if path is None: self.path = self self.step = step else: # STORE TOP-LEVEL SEQUENCE PATH... self.path = path.path self.step = step * path.step def classySlice(self, path, *l, **kwargs): 'create a subslice using appropriate class based on container' try: # if db provides a class to use for slices, use it. klass = path.pathForward.db.itemSliceClass except AttributeError: klass = SeqPath # default: just use generic slice class return klass(path, *l, **kwargs) # construct the slice def absolute_slice(self, start, stop): 'get slice of top-level sequence, using absolute coords' return self.classySlice(self, start, stop, absoluteCoords=True) def __getitem__(self,k): if isinstance(k,types.IntType): if k== -1: # HAVE TO HANDLE THIS CASE SPECIALLY k=slice(k,None,1) # -1 IS LAST LETTER, SO [-1:None] slice else: # REGULAR CASE, JUST [k:k+1] slice k=slice(k,k+1,1) if isinstance(k,types.SliceType): # GET AN INTERVAL USING slice return self.classySlice(self,k.start,k.stop,k.step) elif isinstance(k,SeqPath): # MODEL SEQ AS GRAPH if k.path is not self.path: raise KeyError('node is not in this sequence!') try: target=self.classySlice(self.path,k.stop,k.stop+len(k)*k.step,k.step) return {target:LetterEdge(k,target)} except IndexError: # OUT OF BOUNDS, SO NO NEXT NODE return {} raise KeyError('requires a slice object or integer key') def __len__(self): if self.path is self and self.orientation<0: return len(self._reverse) # GET LENGTH FROM FORWARD SEQUENCE d=(self.stop-self.start)/self.step # NUMBER OF RESULTS FROM iter(self) if d>0: # IF stop-start other' if self.path is other.path and self.stop==other.start: return {self.path:self.stop - self.step} else: return {} def getSeqPos(self,seq): 'get seq interval corresponding to this node in sequence graph' if seq.path is self.path: return self raise KeyError('seq not on this path!') ################################ INTERVAL COMPOSITION OPERATORS def __hash__(self): 'ensure that same seq intervals match in dict' return id(self.path)^hash(self.start)^hash(self.stop) def __cmp__(self,other): 'ensure that same seq intervals match in cmp()' if not isinstance(other,SeqPath): return -1 if self.path is other.path: return cmp((self.start,self.stop),(other.start,other.stop)) else: return NOT_ON_SAME_PATH #raise TypeError('SeqPath not comparable, not on same path: %s,%s' # % (self.path,other.path)) def __contains__(self,k): # PUT OTHER LOGIC HERE FOR CHECKING WHETHER INTERVAL IS CONTAINED... if isinstance(k,SeqPath): if k.path==self.path and self.start<=k.start and k.stop<=self.stop: return True else: return False elif isinstance(k,types.IntType): return self.start<=k and k self coordinate systems" return IntervalTransform(other,self) def __neg__(self): "return same interval in reverse orientation" try: if self.seqtype()==PROTEIN_SEQTYPE: raise ValueError('protein sequence has no reverse orientation!') except AttributeError: pass # ALLOW UNTYPED SEQ OBJECTS TO BE REV-COMPD if self is self.path: # TOP-LEVEL SEQUENCE OBJECT try: return self._reverse # USE EXISTING RC OBJECT FOR THIS SEQ except AttributeError: # CREATE ONLY ONE RC FOR THIS SEQUENCE self._reverse = self.classySlice(self, reversePath=True) return self._reverse elif self.orientation>0: # FORWARD ORI: JUST REVERSE INDICES return self.classySlice(self.path,self.stop,self.start, self.step) #SWAP ==> RC else: # REVERSE ORI: BECAUSE OF stop=0 POSSIBILITY, USE POSITIVE COORDS return self.classySlice(self.path._reverse,-(self.stop), -(self.start),self.step) def __add__(self,other): "return merged interval spanning both self and other intervals" if self.path is not other.path: raise ValueError('incompatible intervals cannot be merged.') if self.startother.stop: stop=self.stop else: stop=other.stop if stop==0: # HAVE TO HANDLE BOUNDARY CASE SPECIALLY BECAUSE OF PYTHON CONVENTION stop = None return self.classySlice(self.path,start,stop,self.step) def __iadd__(self,other): "return merged interval spanning both self and other intervals" if self.path is not other.path: raise ValueError('incompatible intervals cannot be merged.') if other.startself.stop: self.stop=other.stop return self # iadd MUST ALWAYS RETURN self!! def before(self): 'get the sequence interval before this interval' return self.classySlice(self.path,None,self.start) def after(self): 'get the sequence interval after this interval' if self.stop==0: raise IndexError('cannot create empty sequence interval') return self.classySlice(self.path,self.stop,None) def is_full_length(self): 'test whether this constitutes the whole sequence (in either orientation)' return self == self.path ############################################ STRING SEQUENCE METHODS _complement={'a':'t', 'c':'g', 'g':'c', 't':'a', 'u':'a', 'n':'n', 'A':'T', 'C':'G', 'G':'C', 'T':'A', 'U':'A', 'N':'N'} def reverse_complement(self,s): 'get reverse complement of a string s' #return ''.join([self._complement.get(c,c) for c in s[::-1]]) return ''.join([self._complement.get(s[i],s[i]) for i in range(len(s) -1, -1, -1)]) def seqtype(self): "Get the sequence type for this sequence" path=self.pathForward try: # TRY GETTING IT FROM TOP-LEVEL SEQUENCE OBJECT? return path._seqtype except AttributeError: try: # TRY TO GET IT FROM DB THIS SEQ IS ASSOCIATED WITH, IF ANY return path.db._seqtype except AttributeError:# GUESS IT FROM 1ST 40 LETTERS OF SEQUENCE path._seqtype=guess_seqtype(str(self[0:40])) return path._seqtype def __str__(self): 'string for this sequence interval; use reverse complement if necessary...' if self.orientation>0: return self.path.strslice(self.start,self.stop) else: s=self.path._reverse.strslice(-(self.stop),-(self.start)) return self.reverse_complement(s) def __repr__(self): try: # USE id CONVENTION TO GET A NAME FOR THIS SEQUENCE id=self.pathForward.id except AttributeError: # OTHERWISE JUST USE A DEFAULT, SHOWING THERE'S NO id id='@NONAME' if self.orientation<0: # INDICATE NEGATIVE ORIENTATION return '-%s[%d:%d]' % (id,-self.stop,-self.start) else: return '%s[%d:%d]' % (id,self.start,self.stop) def repr_dict(self): "Return compact dictionary representing this interval" try: id=self.path.id except AttributeError: id=self.id return {'id':id,'start':self.start,'end':self.stop,'ori':self.orientation} class LengthDescriptor(object): 'property that just returns length of object' def __get__(self, seq, klass): return len(seq) # BASIC WRAPPER FOR A SEQUENCE. LETS US ATTACH A NAME TO IT... class SequenceBase(SeqPath): 'base sequence type assumes there will be a seq attribute providing sequence' start=0 stop = LengthDescriptor() step=1 orientation=1 def __init__(self): self.path=self def update(self,seq): 'change this sequence to the string ' self.seq=seq def __len__(self): 'default: get the whole self.seq and compute its length' return len(self.seq) # COMPUTE IT FROM THE SEQUENCE def strslice(self,start,stop): 'default method assumes self.seq is a sliceable string' return self.seq[start:stop] class Sequence(SequenceBase): 'default sequence class initialized with a sequence string and ID' def __init__(self,s,id): SequenceBase.__init__(self) self.id=id self.seq=s class SeqFilterDict(dict): '''stores a set of intervals, either on init or via self[ival]=junk; self[ival] returns intersection of ival and the overlapping interval in self if any; otherwise raise KeyError''' def __init__(self,l=[]): 'accepts optional arg giving list of intervals' dict.__init__(self) for ival in l: self[ival]=None def __getitem__(self,k): try: ival=dict.__getitem__(self,k.path) except KeyError: raise KeyError('seq not in dict') result=k*ival # RETURN INTERSECTION OF IVALS if result is None: raise KeyError # PROPER WAY TO SIGNAL KEY MAPS TO NO VALUE return result def __setitem__(self,ival,junk): dict.__setitem__(self,ival.path,ival) def __iter__(self): return dict.itervalues(self) ## class S2SEEdgesDescriptor(object): ## "list of interval matches as list of tuples (ival1,ival2,xform)" ## def __get__(self,s2se,objtype): ## return [(t.srcPath,t.destPath,t) for t in s2se.matches] class Seq2SeqEdge(object): '''Maps two sequence regions onto each other, using a list of scalar transformations. Can handle indels within the mapping.''' #edges=S2SEEdgesDescriptor() def __init__(self,msaSlice,targetPath,sourcePath=None,matchIntervals=False): self.msaSlice=msaSlice self.targetPath=targetPath if sourcePath is not None: self.sourcePath=sourcePath self.matchIntervals = matchIntervals else: # NEED TO REVERSE-MAP targetPath TO FIND sourcePath si = msaSlice.groupByIntervals(filterList=[targetPath], # MASK TO targetPath mergeAll=True) l = msaSlice.groupBySequences(si) try: self.sourcePath = l[0][0] except IndexError: raise KeyError('target interval not in msaSlice!') self.matchIntervals = l[0][2] def items(self,mergeAll=False,**kwargs): 'get list of (srcPath,destPath) 1:1 matches' if self.matchIntervals is None: # THIS IS ALREADY A 1:1 INTERVAL! return [(self.sourcePath,self.targetPath)] elif self.matchIntervals is False: raise ValueError('no matchIntervals information!') l = [] # USE STORED LIST OF 1:1 INTERVALS for srcStart,srcEnd,destStart,destEnd in self.matchIntervals: l.append((absoluteSlice(self.sourcePath,srcStart,srcEnd), absoluteSlice(self.targetPath,destStart,destEnd))) return l def get_gaps(self): 'return list of (srcIval,destIval) representing gaps / insertions' if self.matchIntervals is False: raise ValueError('no matchIntervals information!') elif self.matchIntervals is None or len(self.matchIntervals)<2: return [] # no gaps here... srcLast = self.matchIntervals[0][1] # ends of 1st aligned intervals destLast = self.matchIntervals[0][3] l = [] for t in self.matchIntervals[1:]: if t[0]>srcLast: # gap region srcIval = absoluteSlice(self.sourcePath, srcLast, t[0]) else: srcIval = None if t[2]>destLast: # insertion region destIval = absoluteSlice(self.targetPath, destLast, t[2]) else: destIval = None if srcIval is not None or destIval is not None: l.append((srcIval,destIval)) srcLast = t[1] # ends of these aligned intervals destLast = t[3] return l def __iter__(self,sourceOnly=True,**kwargs): return iter([t[0] for t in self.items(sourceOnly=sourceOnly,**kwargs)]) def length(self,mode=max): 'get length of source vs. target interval according to mode' return mode(len(self.sourcePath),len(self.targetPath)) def pIdentity(self,mode=max,trapOverflow=True): "calculate fractional identity for this pairwise alignment" nid=0 start1=self.sourcePath.start s1=str(self.sourcePath).upper() start2=self.targetPath.start s2=str(self.targetPath).upper() for srcPath,destPath in self.items(): isrc=srcPath.start-start1 idest=destPath.start-start2 for i in xrange(len(srcPath)): if s1[isrc+i]==s2[idest+i]: nid+=1 x=nid/float(self.length(mode)) if trapOverflow and x>1.: raise ValueError('''pIdentity overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.''') return x def longestSegment(self,segment,pIdentityMin=.9,minAlignSize=1, mode=max,**kwargs): besthit=None for i in xrange(len(segment)): ni=0 # IDENTITY COUNT nm=0 # MISMATCH COUNT for j in xrange(i,-1,-1): ni+=segment[j][2] l=mode(segment[i][0]+segment[i][2]-segment[j][0], segment[i][1]+segment[i][2]-segment[j][1]) pIdentity=float(ni)/l if pIdentity>=pIdentityMin and (besthit is None or ni+nm>besthit[4]): besthit=(segment[j][0],segment[i][0]+segment[i][2], segment[j][1],segment[i][1]+segment[i][2],ni+nm) nm+=segment[j][3] if besthit is None: return None elif besthit[4]>=minAlignSize: return besthit[:4] else: return None def conservedSegment(self,**kwargs): "calculate fractional identity for this pairwise alignment" start1=self.sourcePath.start s1=str(self.sourcePath).upper() start2=self.targetPath.start s2=str(self.targetPath).upper() i1=None segment=[] n=0 for srcPath,destPath in self.items(): # FIND UNBROKEN IDENTITY SEGMENTS isrc=srcPath.start-start1 idest=destPath.start-start2 for i in xrange(len(srcPath)): if s1[isrc+i]==s2[idest+i]: # EXACT MATCH if i1 is None: # START NEW IDENTITY-SEGMENT seg1,i1=isrc+i,isrc+i seg2,i2=idest+i,idest+i elif i1+1!=isrc+i or i2+1!=idest+i: # NOT CONTIGUOUS, SO BREAK segment.append((seg1+start1,seg2+start2,i1+1-seg1,n)) n=0 # RESET MISMATCH COUNT seg1,i1=isrc+i,isrc+i seg2,i2=idest+i,idest+i else: i1=isrc+i i2=idest+i else: # MISMATCH if i1 is not None: # BREAK PREVIOUS SEGMENT segment.append((seg1+start1,seg2+start2,i1+1-seg1,n)) i1=None n=0 # RESET MISMATCH COUNT n+=1 # COUNT MISMATCH if i1 is not None: segment.append((seg1+start1,seg2+start2,i1+1-seg1,n)) return self.longestSegment(segment,**kwargs) def pAligned(self,mode=max,trapOverflow=True): 'get fraction of aligned letters for this pairwise alignment' nid=0 for srcPath,destPath in self.items(): nid+=len(destPath) x=nid/float(self.length(mode)) if trapOverflow and x>1.: raise ValueError('''pAligned overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.''') return x class SeqDBDescriptor(object): 'forwards attribute requests to self.pathForward' def __init__(self,attr): self.attr=attr def __get__(self,obj,objtype): return getattr(obj.pathForward,self.attr) # RAISES AttributeError IF NONE class SeqDBSlice(SeqPath): 'JUST A WRAPPER FOR SCHEMA TO HANG SHADOW ATTRIBUTES ON...' id=SeqDBDescriptor('id') db=SeqDBDescriptor('db') # CURRENTLY UNUSED ## class PathEdgeDict(dict): ## def __init__(self,p): ## self.path=p.path ## self.pos=p.end-1 ## if p.endbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ scCst||iƒSdS(N(sgetattrsobjsselfsattr(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__ s(s__name__s __module__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysReadOnlyAttribute s sIntervalTransformcBs¤tZdZedƒZedƒZeeed„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„Zd„ZRS(sARepresents coordinate transformation from one interval to anothers_srcPaths _destPathcCs·t|ƒtt|ƒƒ|_||_||_|t jo |t jo3yt ||ƒ}Wq~t j o t }q~Xn|t jo(|t jo||}n||_ndS(sMAP FROM srcPath -> destPathN(slensdestPathsfloatssrcPathsselfsscales_srcPaths _destPathsedgeInfosNonesedgeAttrsgetattrsAttributeErrors edgeIndex(sselfssrcPathsdestPathsedgeInfosedgeAttrs edgeIndex((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__s    cCst||iƒSdS(s9transform int srcPath local coord to destPath local coordN(sintsisselfsscale(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysxform,scCst||iƒSdS(s9transform int destPath local coord to srcPath local coordN(sintsisselfsscale(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys xformBack/scCs™|i|ijo"|i|i|i|ifSny>|ii|ijo$|i |i|i |ifSnWntj onXtdƒ‚dS(s2compute srcPath start,stop in ourPath local coordss-sequence mismatch: argument not from this seqN(ssrcPathspathsourPathsstartsstops_reversesAttributeErrors ValueError(sselfssrcPathsourPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getStartStop2s"(cCsJ|i||iƒ\}}t|i|i|ƒ|i|ƒdtƒSdS(s÷Apply this transformation to an interval NB: it is not restricted to the domain of this transform, and thus can extend BEYOND the boundaries of this transform. If you want it clipped use [] interface instead of ().srelativeToStartN( sselfs getStartStopssrcPathsstartsstopsSeqPathsdestPathsxformsTrue(sselfssrcPathsstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__call__<s!cCsJ|i||iƒ\}}t|i|i|ƒ|i|ƒdtƒSdS(sreverse transform an intervalsrelativeToStartN( sselfs getStartStopsdestPathsstartsstopsSeqPathssrcPaths xformBacksTrue(sselfsdestPathsstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysreverseDscCs|||iƒSdS(skintersect srcPath with domain of this transform, then return transform to target domain coordinatesN(sselfssrcPath(sselfssrcPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__Isccs |iVdS(N(sselfssrcPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__Msccs|i|ifVdS(N(sselfssrcPathsdestPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysitemsOscCsHyt|id|ƒSWn)ttfj otd|ƒ‚nXdS(s3provide transparent wrapper for edgeInfo attributessedgeInfos0neither IntervalTransform nor edgeinfo has attr N(sgetattrsselfs__dict__sattrsKeyErrorsAttributeError(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getattr__Qs cCsŸ|iiƒ}|iiƒ}h}x:|iƒD],\}}||d|<|||d|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys repr_dictYs  cCsŒd}t|iƒiƒ}t|iƒiƒ}t|ƒ}d}x?||jo1||||jo|d7}n|d7}qEW|SdS(s>calculate total #identity matches between srcPath and destPathiiN( snidsstrsselfssrcPathsupperssrcsdestPathsdestslensslensi(sselfssrcsslensdestsnidsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys nidentityfs  cCs|itt|iƒƒSdS(s9calculate fractional identity for this pairwise alignmentN(sselfs nidentitysfloatslenssrcPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys percent_idrs(s__name__s __module__s__doc__sReadOnlyAttributessrcPathsdestPathsNones__init__sxforms xformBacks getStartStops__call__sreverses __getitem__s__iter__sitemss __getattr__s repr_dicts nidentitys percent_id(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysIntervalTransforms            sLetterEdgeDescriptorcBstZdZd„ZRS(s-cached dict of sequences traversing this edgecCsDy |iSWn2tj o&|ii|iƒ|_|iSnXdS(N(sedges_seqssAttributeErrorsorigins getEdgeSeqsstarget(sselfsedgesobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__‚s  (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysLetterEdgeDescriptor€s s LetterEdgecBsDtZdZeƒZd„Zd„Zd„Zd„Zd„Z RS(sDrepresents an edge from origin -> target. seqs returns its sequencescCs||_||_dS(N(soriginsselfstarget(sselfsoriginstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__s ccs(x!|iD]}|ii|ƒVq WdS(s<generate origin seqpos for sequences that traverse this edgeN(sselfsseqssseqsorigins getSeqPos(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__s ccs:x3|iD](}|ii|ƒ|ii|ƒfVq WdS(sCgenerate origin,target seqpos for sequences that traverse this edgeN(sselfsseqssseqsorigins getSeqPosstarget(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys iteritems”s cCs[y |i}Wntj otdƒ‚nX|ii|iƒ|ii|iƒfSdS(sNreturn origin,target seqpos for sequence k; raise KeyError if not in this edges0k not a valid sequence: it has no path attributeN(skspathsAttributeErrors TypeErrorsselfsorigins getSeqPosstarget(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__˜s  cCsey2|i|ijo|i|ijodSnWntj onXtt|ƒt|ƒƒSdS(s3two edge objects match if they link identical nodesiN(sselfsoriginsotherstargetsAttributeErrorscmpsid(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__cmp__Ÿs& ( s__name__s __module__s__doc__sLetterEdgeDescriptorsseqss__init__s__iter__s iteritemss __getitem__s__cmp__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys LetterEdgeŠs      cCsly4|djo|i| | ! Sn|i||!SWn1tj o%|tjot||ƒSqhnXdS(s˜get slice of top-level sequence object, in absolute coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForwardiN(sstartsseqs pathForwardsstopsAttributeErrorsNonesslice(sseqsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys absoluteSlice«s  cCs.|djo|| | ! Sn |||!SdS(s“get slice of this sequence object, in relative coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForwardiN(sstartsseqsstop(sseqsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys relativeSlice¸s cCs^|tjo|Sn|tjo d}n||i9}|o||iSn ||iSdS(sÆAdjust index value either relative to myslice.start (positive indexes) or relative to myslice.stop (negative indexes). Handle the case where i is None or myslice is None appropriately. iN(smyslicesNonesisstepsrelativeToStartsstartsstop(sismyslicesrelativeToStart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys sumSliceIndexÁs    sSeqOriDescriptorcBstZdZd„ZRS(s$Get orientation of sequence intervalcCs |idjodSndSdS(Niiiÿÿÿÿ(sseqsstart(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__Ós(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqOriDescriptorÑs sPathForwardDescrcBstZdZd„ZRS(s)get the top-level forward sequence objectcCs)|idjo |iSn |iiSdS(Ni(sseqs orientationspaths_reverse(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__Ûs (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysPathForwardDescrÙs sAbsIntervalDescrcBstZdZd„ZRS(s)get the top-level forward sequence objectcCs:|idjo|i|ifSn|i |i fSdS(Ni(sseqs orientationsstartsstop(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__ãs(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysAbsIntervalDescrás sSeqPathcBs—tZdZeƒZeƒZeƒZde e e e e d„Z d„Z d„Z d„Zd„Zd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zhdd<dd<dd<dd<dd<dd<dd<dd <d d<dd<d!d<d"d"stop means reverse orientation, i.e. (-path)[-stop:-start] start/stop are LOCAL coordinates relative to the specified path By default, start/stop are interpreted in the usual Python slicing way, i.e. a negative start value is interpreted as len(path)-start. The relativeToStart option turns off this behavior, so that negative values are interpreted as negative coordinates in the local coordinate system of path. absoluteCoords option allows intervals to be created using Pygrs internal coordinate convention i.e. -20,-10 --> -(path.pathForward[10:20]) is&cannot create empty sequence interval!iN( s reversePathspathsstopsstartsselfs_reversesNonesabsoluteCoordss pathForwards sumSliceIndexsrelativeToStarts IndexErrorsstep(sselfspathsstartsstopssteps reversePathsrelativeToStartsabsoluteCoords((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ñsB      ,,'  '        cOsCy|iii}Wntj o t}nX||||ŽSdS(s<create a subslice using appropriate class based on containerN( spaths pathForwardsdbsitemSliceClasssklasssAttributeErrorsSeqPathslskwargs(sselfspathslskwargssklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys classySlice$s  cCs|i|||dtƒSdS(s6get slice of top-level sequence, using absolute coordssabsoluteCoordsN(sselfs classySlicesstartsstopsTrue(sselfsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysabsolute_slice+scCs6t|tiƒo=|djot|tdƒ}qPt||ddƒ}nt|tiƒo#|i||i |i |i ƒSn¡t|t ƒo|i |i j otdƒ‚nyO|i|i |i |i t|ƒ|i |i ƒ}h|t||ƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__.s #5 cCse|i|jo |idjot|iƒSn|i|i|i}|djo|SndSdS(Nii( sselfspaths orientationslens_reversesstopsstartsstepsd(sselfsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__len__@s   ccs)x"tt|ƒƒD]}||VqWdS(N(srangeslensselfsi(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__Jsccsd|d}xItdt|ƒƒD]2}||}|h|t||ƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys iteritemsMs   cCsL|i|ijo|i|ijoh|i|i|ireturn dict of sequences that traverse edge from self -> otherN(sselfspathsothersstopsstartsstep(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getEdgeSeqsUs&cCs+|i|ijo|Sntdƒ‚dS(s=get seq interval corresponding to this node in sequence graphsseq not on this path!N(sseqspathsselfsKeyError(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getSeqPos[scCs+t|iƒt|iƒAt|iƒASdS(s,ensure that same seq intervals match in dictN(sidsselfspathshashsstartsstop(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__hash__bscCs]t|tƒ odSn|i|ijo)t|i|if|i|ifƒSntSdS(s-ensure that same seq intervals match in cmp()iÿÿÿÿN( s isinstancesothersSeqPathsselfspathscmpsstartsstopsNOT_ON_SAME_PATH(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__cmp__es )cCs‘t|tƒoI|i|ijo#|i|ijo|i|ijotSqtSn5t|t i ƒo!|i|jo ||ijSndS(N( s isinstancesksSeqPathspathsselfsstartsstopsTruesFalsestypessIntType(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __contains__ps 9cCsw|i|ij otSn|i|ijo|i|ijp#|i|ijo|i|ijotSntSdS(s+check whether two paths on same seq overlapN(sselfspathspsFalsesstartsstopsTrue(sselfsp((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysoverlapszs LcCs«t|tƒo‹|i|ij otSnt|i|iƒ}t|i |i ƒ}||jo1|djo t}n|i |i||ƒSq§tSn t dƒ‚dS(s"find intersection of two intervalsis"SeqPath can only intersect SeqPathN( s isinstancesothersSeqPathsselfspathsNonesmaxsstartsminsstops classySlices TypeError(sselfsothersstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__mul__„s   cCst||ƒSdS(s6return transform from other -> self coordinate systemsN(sIntervalTransformsothersself(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__div__”scCsòy'|iƒtjotdƒ‚nWntj onX||ijoDy |iSWqîtj o&|i|dtƒ|_|iSqîXn^|i djo&|i|i|i |i |i ƒSn(|i|ii|i |i |i ƒSdS(s+return same interval in reverse orientations,protein sequence has no reverse orientation!s reversePathiN( sselfsseqtypesPROTEIN_SEQTYPEs ValueErrorsAttributeErrorspaths_reverses classySlicesTrues orientationsstopsstartsstep(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__neg__˜s" cCs¬|i|ij otdƒ‚n|i|ijo |i}n |i}|i|ijo |i}n |i}|djo t}n|i|i|||iƒSdS(s=return merged interval spanning both self and other intervalss(incompatible intervals cannot be merged.iN( sselfspathsothers ValueErrorsstartsstopsNones classySlicesstep(sselfsothersstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__add__«s      cCsq|i|ij otdƒ‚n|i|ijo|i|_n|i|ijo|i|_n|SdS(s=return merged interval spanning both self and other intervalss(incompatible intervals cannot be merged.N(sselfspathsothers ValueErrorsstartsstop(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iadd__»scCs|i|it|iƒSdS(s.get the sequence interval before this intervalN(sselfs classySlicespathsNonesstart(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysbeforeÄscCs=|idjotdƒ‚n|i|i|itƒSdS(s-get the sequence interval after this intervalis%cannot create empty sequence intervalN(sselfsstops IndexErrors classySlicespathsNone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysafterÇscCs||ijSdS(sHtest whether this constitutes the whole sequence (in either orientation)N(sselfspath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysis_full_lengthÌssastscsgsusnsAsTsCsGsUsNcCs_digi}tt|ƒdddƒD]'}||ii ||||ƒƒq*~ƒSdS(s$get reverse complement of a string ssiiÿÿÿÿN( sjoinsappends_[1]srangeslensssisselfs _complementsget(sselfsssis_[1]((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysreverse_complementÓscCsu|i}y |iSWnZtj oNy|iiSWqqtj o*tt|dd!ƒƒ|_|iSqqXnXdS(s'Get the sequence type for this sequenceii(N(sselfs pathForwardspaths_seqtypesAttributeErrorsdbs guess_seqtypesstr(sselfspath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysseqtypeØs  cCs^|idjo|ii|i|iƒSn.|iii|i |i ƒ}|i|ƒSdS(sIstring for this sequence interval; use reverse complement if necessary...iN( sselfs orientationspathsstrslicesstartsstops_reversesssreverse_complement(sselfss((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__str__äs  cCsty|ii}Wntj o d}nX|idjod||i |i fSnd||i|ifSdS(Ns@NONAMEis -%s[%d:%d]s %s[%d:%d](sselfs pathForwardsidsAttributeErrors orientationsstopsstart(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__repr__ës cCsdy|ii}Wntj o|i}nXhd|<d|i<d|i<d|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys repr_dictös (&s__name__s __module__s__doc__sSeqOriDescriptors orientationsPathForwardDescrs pathForwardsAbsIntervalDescrs _abs_intervalsNonesFalses__init__s classySlicesabsolute_slices __getitem__s__len__s__iter__s iteritemss getEdgeSeqss getSeqPoss__hash__s__cmp__s __contains__soverlapss__mul__s__div__s__neg__s__add__s__iadd__sbeforesaftersis_full_lengths _complementsreverse_complementsseqtypes__str__s__repr__s repr_dict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqPathês>    3               r   sLengthDescriptorcBstZdZd„ZRS(s+property that just returns length of objectcCst|ƒSdS(N(slensseq(sselfsseqsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__s(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysLengthDescriptorÿs s SequenceBasecBsMtZdZdZeƒZdZdZd„Zd„Z d„Z d„Z RS(sKbase sequence type assumes there will be a seq attribute providing sequenceiicCs ||_dS(N(sselfspath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ scCs ||_dS(s(change this sequence to the string N(sseqsself(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysupdatescCst|iƒSdS(s6default: get the whole self.seq and compute its lengthN(slensselfsseq(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__len__scCs|i||!SdS(s5default method assumes self.seq is a sliceable stringN(sselfsseqsstartsstop(sselfsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysstrslices( s__name__s __module__s__doc__sstartsLengthDescriptorsstopssteps orientations__init__supdates__len__sstrslice(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SequenceBases     sSequencecBstZdZd„ZRS(s@default sequence class initialized with a sequence string and IDcCs#ti|ƒ||_||_dS(N(s SequenceBases__init__sselfsidsssseq(sselfsssid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__s  (s__name__s __module__s__doc__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSequences s SeqFilterDictcBs5tZdZgd„Zd„Zd„Zd„ZRS(s·stores a set of intervals, either on init or via self[ival]=junk; self[ival] returns intersection of ival and the overlapping interval in self if any; otherwise raise KeyErrorcCs,ti|ƒx|D]}t||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__$s  cCsdyti||iƒ}Wntj otdƒ‚nX||}|tjo t‚n|SdS(Nsseq not in dict( sdicts __getitem__sselfskspathsivalsKeyErrorsresultsNone(sselfsksresultsival((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__)s   cCsti||i|ƒdS(N(sdicts __setitem__sselfsivalspath(sselfsivalsjunk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __setitem__2scCsti|ƒSdS(N(sdicts itervaluessself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__4s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s__iter__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SeqFilterDict s   s Seq2SeqEdgecBsƒtZdZeed„Zed„Zd„Zed„Z e d„Z e ed„Z dde d „Z d „Ze ed „ZRS( sMaps two sequence regions onto each other, using a list of scalar transformations. Can handle indels within the mapping.cCs«||_||_|tj o||_||_ns|id|gdtƒ}|i |ƒ}y|dd|_Wnt j ot dƒ‚nX|dd|_dS(Ns filterListsmergeAllis target interval not in msaSlice!i( smsaSlicesselfs targetPaths sourcePathsNonesmatchIntervalssgroupByIntervalssTruessisgroupBySequencessls IndexErrorsKeyError(sselfsmsaSlices targetPaths sourcePathsmatchIntervalsslssi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__Gs      cKs¦|itjo|i|ifgSn!|itjotdƒ‚ng}xN|iD]C\}}}}|i t |i||ƒt |i||ƒfƒqWW|SdS(s*get list of (srcPath,destPath) 1:1 matchessno matchIntervals information!N(sselfsmatchIntervalssNones sourcePaths targetPathsFalses ValueErrorslssrcStartssrcEnds destStartsdestEndsappends absoluteSlice(sselfsmergeAllskwargsssrcEndsls destStartssrcStartsdestEnd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysitemsVs 5cCsC|itjotdƒ‚n/|itjpt|iƒdjogSn|idd}|idd}g}xÂ|idD]³}|d|jot |i ||dƒ}nt}|d|jot |i ||dƒ}nt}|tj p |tj o|i||fƒn|d}|d}q„W|SdS(s@return list of (srcIval,destIval) representing gaps / insertionssno matchIntervals information!iiiiN(sselfsmatchIntervalssFalses ValueErrorsNoneslenssrcLastsdestLastslsts absoluteSlices sourcePathssrcIvals targetPathsdestIvalsappend(sselfslsdestIvalsdestLaststssrcLastssrcIval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysget_gapsas*& cKsBtgi}|id||D]}||dƒq ~ƒSdS(Ns sourceOnlyi(sitersappends_[1]sselfsitemss sourceOnlyskwargsst(sselfs sourceOnlyskwargss_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__xscCs#|t|iƒt|iƒƒSdS(s:get length of source vs. target interval according to modeN(smodeslensselfs sourcePaths targetPath(sselfsmode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyslength{scCs d} |ii}t|iƒiƒ}|ii}t|iƒiƒ}x||i ƒD]n\} } | i|} | i|}xEtt| ƒƒD]1} || | ||| jo| d7} qŽqŽWqUW| t|i|ƒƒ}|o |djotdƒ‚n|SdS(s9calculate fractional identity for this pairwise alignmentiif1.0s{pIdentity overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.N(snidsselfs sourcePathsstartsstart1sstrsupperss1s targetPathsstart2ss2sitemsssrcPathsdestPathsisrcsidestsxrangeslensisfloatslengthsmodesxs trapOverflows ValueError(sselfsmodes trapOverflowsidestsxsstart2ss2ss1sstart1snidsisdestPathssrcPathsisrc((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys pIdentitys$     f0.90000000000000002ic Kst}xJtt|ƒƒD]6} d}d}x!t| ddƒD] } ||| d7}||| d|| d|| d|| d|| d|| dƒ} t |ƒ| } | |jo|tjp|||djoU|| d|| d|| d|| d|| d|| d||f}n||| d7}q>WqW|tjotSn"|d|jo |d SntSdS(Niiÿÿÿÿiiii(sNonesbesthitsxrangeslenssegmentsisnisnmsjsmodeslsfloats pIdentitys pIdentityMins minAlignSize( sselfssegments pIdentityMins minAlignSizesmodeskwargssnisbesthitsnmsisjsls pIdentity((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyslongestSegment’s&&)/U  cKsQ|ii}t|iƒiƒ}|ii}t|iƒiƒ}t } g}d} x¬|iƒD]ž\} }| i|} |i|}xutt| ƒƒD]a}|| ||||joî| t jo8| || |f\}} ||||f\} }qû| d| |jp|d||jog|i||| || d|| fƒd} | || |f\}} ||||f\} }qû| |} ||}qš| t j o9|i||| || d|| fƒt } d} n| d7} qšWqaW| t j o-|i||| || d|| fƒn|i||SdS(s9calculate fractional identity for this pairwise alignmentiiN(sselfs sourcePathsstartsstart1sstrsupperss1s targetPathsstart2ss2sNonesi1ssegmentsnsitemsssrcPathsdestPathsisrcsidestsxrangeslensisseg1sseg2si2sappendslongestSegmentskwargs(sselfskwargssidestsi2sisstart2ss2sstart1sseg1snsi1ssrcPathsisrcsseg2ssegmentss1sdestPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysconservedSegment¨sB      *)  )  -cCsxd}x*|iƒD]\}}|t|ƒ7}qW|t|i|ƒƒ}|o |djot dƒ‚n|SdS(s;get fraction of aligned letters for this pairwise alignmentif1.0szpAligned overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.N( snidsselfsitemsssrcPathsdestPathslensfloatslengthsmodesxs trapOverflows ValueError(sselfsmodes trapOverflowsdestPathsnidssrcPathsx((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyspAlignedËs (s__name__s __module__s__doc__sNonesFalses__init__sitemssget_gapssTrues__iter__smaxslengths pIdentityslongestSegmentsconservedSegmentspAligned(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys Seq2SeqEdgeBs     #sSeqDBDescriptorcBs tZdZd„Zd„ZRS(s/forwards attribute requests to self.pathForwardcCs ||_dS(N(sattrsself(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ÙscCst|i|iƒSdS(N(sgetattrsobjs pathForwardsselfsattr(sselfsobjsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__Ûs(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqDBDescriptor×s  s SeqDBSlicecBs&tZdZedƒZedƒZRS(s9JUST A WRAPPER FOR SCHEMA TO HANG SHADOW ATTRIBUTES ON...sidsdb(s__name__s __module__s__doc__sSeqDBDescriptorsidsdb(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SeqDBSliceÞs  (s __future__s generatorsstypesssequtilsNOT_ON_SAME_PATHsobjectsReadOnlyAttributesIntervalTransformsLetterEdgeDescriptors LetterEdges absoluteSlices relativeSlices sumSliceIndexsSeqOriDescriptorsPathForwardDescrsAbsIntervalDescrsSeqPathsLengthDescriptors SequenceBasesSequencesdicts SeqFilterDicts Seq2SeqEdgesSeqDBDescriptors SeqDBSlice(s sumSliceIndexsReadOnlyAttributesSeqDBDescriptorsIntervalTransformsAbsIntervalDescrs absoluteSlices generatorss relativeSlices SeqDBSlices Seq2SeqEdgesPathForwardDescrs LetterEdgesLengthDescriptors SeqFilterDictsSeqPathstypessNOT_ON_SAME_PATHsSequencesSeqOriDescriptors SequenceBasesLetterEdgeDescriptor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys?s,  h !  ÿ"•PK Œ.;åµ I~ž~žpygr/sequence.pyo;ò !¨Jc@sŒdklZdkZdkTdZdefd„ƒYZdefd„ƒYZdefd „ƒYZd efd „ƒYZ d „Z d „Z d„Z defd„ƒYZ defd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZd!efd"„ƒYZd#efd$„ƒYZdS(%(s generatorsN(s*iþÿÿÿsReadOnlyAttributecBstZd„Zd„ZRS(NcCs ||_dS(N(sattrsself(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ scCst||iƒSdS(N(sgetattrsobjsselfsattr(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__ s(s__name__s __module__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysReadOnlyAttribute s sIntervalTransformcBs¤tZdZedƒZedƒZeeed„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„Zd„ZRS(sARepresents coordinate transformation from one interval to anothers_srcPaths _destPathcCs·t|ƒtt|ƒƒ|_||_||_|t jo |t jo3yt ||ƒ}Wq~t j o t }q~Xn|t jo(|t jo||}n||_ndS(sMAP FROM srcPath -> destPathN(slensdestPathsfloatssrcPathsselfsscales_srcPaths _destPathsedgeInfosNonesedgeAttrsgetattrsAttributeErrors edgeIndex(sselfssrcPathsdestPathsedgeInfosedgeAttrs edgeIndex((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__s    cCst||iƒSdS(s9transform int srcPath local coord to destPath local coordN(sintsisselfsscale(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysxform,scCst||iƒSdS(s9transform int destPath local coord to srcPath local coordN(sintsisselfsscale(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys xformBack/scCs™|i|ijo"|i|i|i|ifSny>|ii|ijo$|i |i|i |ifSnWntj onXtdƒ‚dS(s2compute srcPath start,stop in ourPath local coordss-sequence mismatch: argument not from this seqN(ssrcPathspathsourPathsstartsstops_reversesAttributeErrors ValueError(sselfssrcPathsourPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getStartStop2s"(cCsJ|i||iƒ\}}t|i|i|ƒ|i|ƒdtƒSdS(s÷Apply this transformation to an interval NB: it is not restricted to the domain of this transform, and thus can extend BEYOND the boundaries of this transform. If you want it clipped use [] interface instead of ().srelativeToStartN( sselfs getStartStopssrcPathsstartsstopsSeqPathsdestPathsxformsTrue(sselfssrcPathsstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__call__<s!cCsJ|i||iƒ\}}t|i|i|ƒ|i|ƒdtƒSdS(sreverse transform an intervalsrelativeToStartN( sselfs getStartStopsdestPathsstartsstopsSeqPathssrcPaths xformBacksTrue(sselfsdestPathsstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysreverseDscCs|||iƒSdS(skintersect srcPath with domain of this transform, then return transform to target domain coordinatesN(sselfssrcPath(sselfssrcPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__Isccs |iVdS(N(sselfssrcPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__Msccs|i|ifVdS(N(sselfssrcPathsdestPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysitemsOscCsHyt|id|ƒSWn)ttfj otd|ƒ‚nXdS(s3provide transparent wrapper for edgeInfo attributessedgeInfos0neither IntervalTransform nor edgeinfo has attr N(sgetattrsselfs__dict__sattrsKeyErrorsAttributeError(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getattr__Qs cCsŸ|iiƒ}|iiƒ}h}x:|iƒD],\}}||d|<|||d|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys repr_dictYs  cCsŒd}t|iƒiƒ}t|iƒiƒ}t|ƒ}d}x?||jo1||||jo|d7}n|d7}qEW|SdS(s>calculate total #identity matches between srcPath and destPathiiN( snidsstrsselfssrcPathsupperssrcsdestPathsdestslensslensi(sselfssrcsslensdestsnidsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys nidentityfs  cCs|itt|iƒƒSdS(s9calculate fractional identity for this pairwise alignmentN(sselfs nidentitysfloatslenssrcPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys percent_idrs(s__name__s __module__s__doc__sReadOnlyAttributessrcPathsdestPathsNones__init__sxforms xformBacks getStartStops__call__sreverses __getitem__s__iter__sitemss __getattr__s repr_dicts nidentitys percent_id(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysIntervalTransforms            sLetterEdgeDescriptorcBstZdZd„ZRS(s-cached dict of sequences traversing this edgecCsDy |iSWn2tj o&|ii|iƒ|_|iSnXdS(N(sedges_seqssAttributeErrorsorigins getEdgeSeqsstarget(sselfsedgesobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__‚s  (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysLetterEdgeDescriptor€s s LetterEdgecBsDtZdZeƒZd„Zd„Zd„Zd„Zd„Z RS(sDrepresents an edge from origin -> target. seqs returns its sequencescCs||_||_dS(N(soriginsselfstarget(sselfsoriginstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__s ccs(x!|iD]}|ii|ƒVq WdS(s<generate origin seqpos for sequences that traverse this edgeN(sselfsseqssseqsorigins getSeqPos(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__s ccs:x3|iD](}|ii|ƒ|ii|ƒfVq WdS(sCgenerate origin,target seqpos for sequences that traverse this edgeN(sselfsseqssseqsorigins getSeqPosstarget(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys iteritems”s cCs[y |i}Wntj otdƒ‚nX|ii|iƒ|ii|iƒfSdS(sNreturn origin,target seqpos for sequence k; raise KeyError if not in this edges0k not a valid sequence: it has no path attributeN(skspathsAttributeErrors TypeErrorsselfsorigins getSeqPosstarget(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__˜s  cCsey2|i|ijo|i|ijodSnWntj onXtt|ƒt|ƒƒSdS(s3two edge objects match if they link identical nodesiN(sselfsoriginsotherstargetsAttributeErrorscmpsid(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__cmp__Ÿs& ( s__name__s __module__s__doc__sLetterEdgeDescriptorsseqss__init__s__iter__s iteritemss __getitem__s__cmp__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys LetterEdgeŠs      cCsly4|djo|i| | ! Sn|i||!SWn1tj o%|tjot||ƒSqhnXdS(s˜get slice of top-level sequence object, in absolute coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForwardiN(sstartsseqs pathForwardsstopsAttributeErrorsNonesslice(sseqsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys absoluteSlice«s  cCs.|djo|| | ! Sn |||!SdS(s“get slice of this sequence object, in relative coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForwardiN(sstartsseqsstop(sseqsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys relativeSlice¸s cCs^|tjo|Sn|tjo d}n||i9}|o||iSn ||iSdS(sÆAdjust index value either relative to myslice.start (positive indexes) or relative to myslice.stop (negative indexes). Handle the case where i is None or myslice is None appropriately. iN(smyslicesNonesisstepsrelativeToStartsstartsstop(sismyslicesrelativeToStart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys sumSliceIndexÁs    sSeqOriDescriptorcBstZdZd„ZRS(s$Get orientation of sequence intervalcCs |idjodSndSdS(Niiiÿÿÿÿ(sseqsstart(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__Ós(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqOriDescriptorÑs sPathForwardDescrcBstZdZd„ZRS(s)get the top-level forward sequence objectcCs)|idjo |iSn |iiSdS(Ni(sseqs orientationspaths_reverse(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__Ûs (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysPathForwardDescrÙs sAbsIntervalDescrcBstZdZd„ZRS(s)get the top-level forward sequence objectcCs:|idjo|i|ifSn|i |i fSdS(Ni(sseqs orientationsstartsstop(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__ãs(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysAbsIntervalDescrás sSeqPathcBs—tZdZeƒZeƒZeƒZde e e e e d„Z d„Z d„Z d„Zd„Zd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zhdd<dd<dd<dd<dd<dd<dd<dd <d d<dd<d!d<d"d"stop means reverse orientation, i.e. (-path)[-stop:-start] start/stop are LOCAL coordinates relative to the specified path By default, start/stop are interpreted in the usual Python slicing way, i.e. a negative start value is interpreted as len(path)-start. The relativeToStart option turns off this behavior, so that negative values are interpreted as negative coordinates in the local coordinate system of path. absoluteCoords option allows intervals to be created using Pygrs internal coordinate convention i.e. -20,-10 --> -(path.pathForward[10:20]) is&cannot create empty sequence interval!iN( s reversePathspathsstopsstartsselfs_reversesNonesabsoluteCoordss pathForwards sumSliceIndexsrelativeToStarts IndexErrorsstep(sselfspathsstartsstopssteps reversePathsrelativeToStartsabsoluteCoords((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ñsB      ,,'  '        cOsCy|iii}Wntj o t}nX||||ŽSdS(s<create a subslice using appropriate class based on containerN( spaths pathForwardsdbsitemSliceClasssklasssAttributeErrorsSeqPathslskwargs(sselfspathslskwargssklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys classySlice$s  cCs|i|||dtƒSdS(s6get slice of top-level sequence, using absolute coordssabsoluteCoordsN(sselfs classySlicesstartsstopsTrue(sselfsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysabsolute_slice+scCs6t|tiƒo=|djot|tdƒ}qPt||ddƒ}nt|tiƒo#|i||i |i |i ƒSn¡t|t ƒo|i |i j otdƒ‚nyO|i|i |i |i t|ƒ|i |i ƒ}h|t||ƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__.s #5 cCse|i|jo |idjot|iƒSn|i|i|i}|djo|SndSdS(Nii( sselfspaths orientationslens_reversesstopsstartsstepsd(sselfsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__len__@s   ccs)x"tt|ƒƒD]}||VqWdS(N(srangeslensselfsi(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__Jsccsd|d}xItdt|ƒƒD]2}||}|h|t||ƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys iteritemsMs   cCsL|i|ijo|i|ijoh|i|i|ireturn dict of sequences that traverse edge from self -> otherN(sselfspathsothersstopsstartsstep(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getEdgeSeqsUs&cCs+|i|ijo|Sntdƒ‚dS(s=get seq interval corresponding to this node in sequence graphsseq not on this path!N(sseqspathsselfsKeyError(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getSeqPos[scCs+t|iƒt|iƒAt|iƒASdS(s,ensure that same seq intervals match in dictN(sidsselfspathshashsstartsstop(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__hash__bscCs]t|tƒ odSn|i|ijo)t|i|if|i|ifƒSntSdS(s-ensure that same seq intervals match in cmp()iÿÿÿÿN( s isinstancesothersSeqPathsselfspathscmpsstartsstopsNOT_ON_SAME_PATH(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__cmp__es )cCs‘t|tƒoI|i|ijo#|i|ijo|i|ijotSqtSn5t|t i ƒo!|i|jo ||ijSndS(N( s isinstancesksSeqPathspathsselfsstartsstopsTruesFalsestypessIntType(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __contains__ps 9cCsw|i|ij otSn|i|ijo|i|ijp#|i|ijo|i|ijotSntSdS(s+check whether two paths on same seq overlapN(sselfspathspsFalsesstartsstopsTrue(sselfsp((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysoverlapszs LcCs«t|tƒo‹|i|ij otSnt|i|iƒ}t|i |i ƒ}||jo1|djo t}n|i |i||ƒSq§tSn t dƒ‚dS(s"find intersection of two intervalsis"SeqPath can only intersect SeqPathN( s isinstancesothersSeqPathsselfspathsNonesmaxsstartsminsstops classySlices TypeError(sselfsothersstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__mul__„s   cCst||ƒSdS(s6return transform from other -> self coordinate systemsN(sIntervalTransformsothersself(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__div__”scCsòy'|iƒtjotdƒ‚nWntj onX||ijoDy |iSWqîtj o&|i|dtƒ|_|iSqîXn^|i djo&|i|i|i |i |i ƒSn(|i|ii|i |i |i ƒSdS(s+return same interval in reverse orientations,protein sequence has no reverse orientation!s reversePathiN( sselfsseqtypesPROTEIN_SEQTYPEs ValueErrorsAttributeErrorspaths_reverses classySlicesTrues orientationsstopsstartsstep(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__neg__˜s" cCs¬|i|ij otdƒ‚n|i|ijo |i}n |i}|i|ijo |i}n |i}|djo t}n|i|i|||iƒSdS(s=return merged interval spanning both self and other intervalss(incompatible intervals cannot be merged.iN( sselfspathsothers ValueErrorsstartsstopsNones classySlicesstep(sselfsothersstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__add__«s      cCsq|i|ij otdƒ‚n|i|ijo|i|_n|i|ijo|i|_n|SdS(s=return merged interval spanning both self and other intervalss(incompatible intervals cannot be merged.N(sselfspathsothers ValueErrorsstartsstop(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iadd__»scCs|i|it|iƒSdS(s.get the sequence interval before this intervalN(sselfs classySlicespathsNonesstart(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysbeforeÄscCs=|idjotdƒ‚n|i|i|itƒSdS(s-get the sequence interval after this intervalis%cannot create empty sequence intervalN(sselfsstops IndexErrors classySlicespathsNone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysafterÇscCs||ijSdS(sHtest whether this constitutes the whole sequence (in either orientation)N(sselfspath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysis_full_lengthÌssastscsgsusnsAsTsCsGsUsNcCs_digi}tt|ƒdddƒD]'}||ii ||||ƒƒq*~ƒSdS(s$get reverse complement of a string ssiiÿÿÿÿN( sjoinsappends_[1]srangeslensssisselfs _complementsget(sselfsssis_[1]((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysreverse_complementÓscCsu|i}y |iSWnZtj oNy|iiSWqqtj o*tt|dd!ƒƒ|_|iSqqXnXdS(s'Get the sequence type for this sequenceii(N(sselfs pathForwardspaths_seqtypesAttributeErrorsdbs guess_seqtypesstr(sselfspath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysseqtypeØs  cCs^|idjo|ii|i|iƒSn.|iii|i |i ƒ}|i|ƒSdS(sIstring for this sequence interval; use reverse complement if necessary...iN( sselfs orientationspathsstrslicesstartsstops_reversesssreverse_complement(sselfss((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__str__äs  cCsty|ii}Wntj o d}nX|idjod||i |i fSnd||i|ifSdS(Ns@NONAMEis -%s[%d:%d]s %s[%d:%d](sselfs pathForwardsidsAttributeErrors orientationsstopsstart(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__repr__ës cCsdy|ii}Wntj o|i}nXhd|<d|i<d|i<d|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys repr_dictös (&s__name__s __module__s__doc__sSeqOriDescriptors orientationsPathForwardDescrs pathForwardsAbsIntervalDescrs _abs_intervalsNonesFalses__init__s classySlicesabsolute_slices __getitem__s__len__s__iter__s iteritemss getEdgeSeqss getSeqPoss__hash__s__cmp__s __contains__soverlapss__mul__s__div__s__neg__s__add__s__iadd__sbeforesaftersis_full_lengths _complementsreverse_complementsseqtypes__str__s__repr__s repr_dict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqPathês>    3               r   sLengthDescriptorcBstZdZd„ZRS(s+property that just returns length of objectcCst|ƒSdS(N(slensseq(sselfsseqsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__s(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysLengthDescriptorÿs s SequenceBasecBsMtZdZdZeƒZdZdZd„Zd„Z d„Z d„Z RS(sKbase sequence type assumes there will be a seq attribute providing sequenceiicCs ||_dS(N(sselfspath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ scCs ||_dS(s(change this sequence to the string N(sseqsself(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysupdatescCst|iƒSdS(s6default: get the whole self.seq and compute its lengthN(slensselfsseq(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__len__scCs|i||!SdS(s5default method assumes self.seq is a sliceable stringN(sselfsseqsstartsstop(sselfsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysstrslices( s__name__s __module__s__doc__sstartsLengthDescriptorsstopssteps orientations__init__supdates__len__sstrslice(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SequenceBases     sSequencecBstZdZd„ZRS(s@default sequence class initialized with a sequence string and IDcCs#ti|ƒ||_||_dS(N(s SequenceBases__init__sselfsidsssseq(sselfsssid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__s  (s__name__s __module__s__doc__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSequences s SeqFilterDictcBs5tZdZgd„Zd„Zd„Zd„ZRS(s·stores a set of intervals, either on init or via self[ival]=junk; self[ival] returns intersection of ival and the overlapping interval in self if any; otherwise raise KeyErrorcCs,ti|ƒx|D]}t||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__$s  cCsdyti||iƒ}Wntj otdƒ‚nX||}|tjo t‚n|SdS(Nsseq not in dict( sdicts __getitem__sselfskspathsivalsKeyErrorsresultsNone(sselfsksresultsival((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__)s   cCsti||i|ƒdS(N(sdicts __setitem__sselfsivalspath(sselfsivalsjunk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __setitem__2scCsti|ƒSdS(N(sdicts itervaluessself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__4s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s__iter__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SeqFilterDict s   s Seq2SeqEdgecBsƒtZdZeed„Zed„Zd„Zed„Z e d„Z e ed„Z dde d „Z d „Ze ed „ZRS( sMaps two sequence regions onto each other, using a list of scalar transformations. Can handle indels within the mapping.cCs«||_||_|tj o||_||_ns|id|gdtƒ}|i |ƒ}y|dd|_Wnt j ot dƒ‚nX|dd|_dS(Ns filterListsmergeAllis target interval not in msaSlice!i( smsaSlicesselfs targetPaths sourcePathsNonesmatchIntervalssgroupByIntervalssTruessisgroupBySequencessls IndexErrorsKeyError(sselfsmsaSlices targetPaths sourcePathsmatchIntervalsslssi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__Gs      cKs¦|itjo|i|ifgSn!|itjotdƒ‚ng}xN|iD]C\}}}}|i t |i||ƒt |i||ƒfƒqWW|SdS(s*get list of (srcPath,destPath) 1:1 matchessno matchIntervals information!N(sselfsmatchIntervalssNones sourcePaths targetPathsFalses ValueErrorslssrcStartssrcEnds destStartsdestEndsappends absoluteSlice(sselfsmergeAllskwargsssrcEndsls destStartssrcStartsdestEnd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysitemsVs 5cCsC|itjotdƒ‚n/|itjpt|iƒdjogSn|idd}|idd}g}xÂ|idD]³}|d|jot |i ||dƒ}nt}|d|jot |i ||dƒ}nt}|tj p |tj o|i||fƒn|d}|d}q„W|SdS(s@return list of (srcIval,destIval) representing gaps / insertionssno matchIntervals information!iiiiN(sselfsmatchIntervalssFalses ValueErrorsNoneslenssrcLastsdestLastslsts absoluteSlices sourcePathssrcIvals targetPathsdestIvalsappend(sselfslsdestIvalsdestLaststssrcLastssrcIval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysget_gapsas*& cKsBtgi}|id||D]}||dƒq ~ƒSdS(Ns sourceOnlyi(sitersappends_[1]sselfsitemss sourceOnlyskwargsst(sselfs sourceOnlyskwargss_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__xscCs#|t|iƒt|iƒƒSdS(s:get length of source vs. target interval according to modeN(smodeslensselfs sourcePaths targetPath(sselfsmode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyslength{scCs d} |ii}t|iƒiƒ}|ii}t|iƒiƒ}x||i ƒD]n\} } | i|} | i|}xEtt| ƒƒD]1} || | ||| jo| d7} qŽqŽWqUW| t|i|ƒƒ}|o |djotdƒ‚n|SdS(s9calculate fractional identity for this pairwise alignmentiif1.0s{pIdentity overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.N(snidsselfs sourcePathsstartsstart1sstrsupperss1s targetPathsstart2ss2sitemsssrcPathsdestPathsisrcsidestsxrangeslensisfloatslengthsmodesxs trapOverflows ValueError(sselfsmodes trapOverflowsidestsxsstart2ss2ss1sstart1snidsisdestPathssrcPathsisrc((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys pIdentitys$     f0.90000000000000002ic Kst}xJtt|ƒƒD]6} d}d}x!t| ddƒD] } ||| d7}||| d|| d|| d|| d|| d|| dƒ} t |ƒ| } | |jo|tjp|||djoU|| d|| d|| d|| d|| d|| d||f}n||| d7}q>WqW|tjotSn"|d|jo |d SntSdS(Niiÿÿÿÿiiii(sNonesbesthitsxrangeslenssegmentsisnisnmsjsmodeslsfloats pIdentitys pIdentityMins minAlignSize( sselfssegments pIdentityMins minAlignSizesmodeskwargssnisbesthitsnmsisjsls pIdentity((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyslongestSegment’s&&)/U  cKsQ|ii}t|iƒiƒ}|ii}t|iƒiƒ}t } g}d} x¬|iƒD]ž\} }| i|} |i|}xutt| ƒƒD]a}|| ||||joî| t jo8| || |f\}} ||||f\} }qû| d| |jp|d||jog|i||| || d|| fƒd} | || |f\}} ||||f\} }qû| |} ||}qš| t j o9|i||| || d|| fƒt } d} n| d7} qšWqaW| t j o-|i||| || d|| fƒn|i||SdS(s9calculate fractional identity for this pairwise alignmentiiN(sselfs sourcePathsstartsstart1sstrsupperss1s targetPathsstart2ss2sNonesi1ssegmentsnsitemsssrcPathsdestPathsisrcsidestsxrangeslensisseg1sseg2si2sappendslongestSegmentskwargs(sselfskwargssidestsi2sisstart2ss2sstart1sseg1snsi1ssrcPathsisrcsseg2ssegmentss1sdestPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysconservedSegment¨sB      *)  )  -cCsxd}x*|iƒD]\}}|t|ƒ7}qW|t|i|ƒƒ}|o |djot dƒ‚n|SdS(s;get fraction of aligned letters for this pairwise alignmentif1.0szpAligned overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.N( snidsselfsitemsssrcPathsdestPathslensfloatslengthsmodesxs trapOverflows ValueError(sselfsmodes trapOverflowsdestPathsnidssrcPathsx((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyspAlignedËs (s__name__s __module__s__doc__sNonesFalses__init__sitemssget_gapssTrues__iter__smaxslengths pIdentityslongestSegmentsconservedSegmentspAligned(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys Seq2SeqEdgeBs     #sSeqDBDescriptorcBs tZdZd„Zd„ZRS(s/forwards attribute requests to self.pathForwardcCs ||_dS(N(sattrsself(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ÙscCst|i|iƒSdS(N(sgetattrsobjs pathForwardsselfsattr(sselfsobjsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__Ûs(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqDBDescriptor×s  s SeqDBSlicecBs&tZdZedƒZedƒZRS(s9JUST A WRAPPER FOR SCHEMA TO HANG SHADOW ATTRIBUTES ON...sidsdb(s__name__s __module__s__doc__sSeqDBDescriptorsidsdb(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SeqDBSliceÞs  (s __future__s generatorsstypesssequtilsNOT_ON_SAME_PATHsobjectsReadOnlyAttributesIntervalTransformsLetterEdgeDescriptors LetterEdges absoluteSlices relativeSlices sumSliceIndexsSeqOriDescriptorsPathForwardDescrsAbsIntervalDescrsSeqPathsLengthDescriptors SequenceBasesSequencesdicts SeqFilterDicts Seq2SeqEdgesSeqDBDescriptors SeqDBSlice(s sumSliceIndexsReadOnlyAttributesSeqDBDescriptorsIntervalTransformsAbsIntervalDescrs absoluteSlices generatorss relativeSlices SeqDBSlices Seq2SeqEdgesPathForwardDescrs LetterEdgesLengthDescriptors SeqFilterDictsSeqPathstypessNOT_ON_SAME_PATHsSequencesSeqOriDescriptors SequenceBasesLetterEdgeDescriptor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys?s,  h !  ÿ"•PK6j$;?~¿Ohhpygr/sequtil.py DNA_SEQTYPE=0 RNA_SEQTYPE=1 PROTEIN_SEQTYPE=2 def guess_seqtype(s): dna_letters='AaTtUuGgCcNn' ndna=0 nU=0 nT=0 for l in s: if l in dna_letters: ndna += 1 if l=='U' or l=='u': nU += 1 elif l=='T' or l=='t': nT += 1 ratio=ndna/float(len(s)) if ratio>0.85: if nT>nU: return DNA_SEQTYPE else: return RNA_SEQTYPE else: return PROTEIN_SEQTYPE seq_id_counter=0 def new_seq_id(): global seq_id_counter seq_id_counter += 1 return str(seq_id_counter-1) def write_fasta(ofile,s,chunk=60,id=None,reformatter=None): "Trivial FASTA output" if id is None: try: id = str(s.id) except AttributeError: id = new_seq_id() ofile.write('>' + id + '\n') seq = str(s) if reformatter is not None: # APPLY THE DESIRED REFORMATTING seq = reformatter(seq) end = len(seq) pos = 0 while 1: ofile.write(seq[pos:pos+chunk] + '\n') pos += chunk if pos >= end: break return id # IN CASE CALLER WANTS TEMP ID WE MAY HAVE ASSIGNED def read_fasta(ifile): "iterate over id,title,seq from stream ifile" id = None isEmpty = True for line in ifile: if '>' == line[0]: if id is not None and len(seq) > 0: yield id,title,seq isEmpty = False id = line[1:].split()[0] title = line[len(id)+2:] seq = '' elif id is not None: # READ SEQUENCE for word in line.split(): # GET RID OF WHITESPACE seq += word if id is not None and len(seq) > 0: yield id,title,seq elif isEmpty: raise IOError('no readable sequence in FASTA file!') def read_fasta_one_line(ifile): # @CTB deprecated; remove "read a single sequence line, return id,title,seq" id = None seq = '' while True: line = ifile.readline(1024) # READ AT MOST 1KB if line == '': # EOF break elif '>' == line[0]: id = line[1:].split()[0] title = line[len(id)+2:] elif id is not None: # READ SEQUENCE for word in line.split(): # GET RID OF WHITESPACE seq += word if len(seq)>0: return id,title,seq raise IOError('no readable sequence in FASTA file!') def read_fasta_lengths(ifile): "Generate sequence ID,length from stream ifile" id = None seqLength = 0 isEmpty = True for line in ifile: if '>' == line[0]: if id is not None and seqLength > 0: yield id,seqLength isEmpty = False id = line[1:].split()[0] seqLength = 0 elif id is not None: # READ SEQUENCE for word in line.split(): # GET RID OF WHITESPACE seqLength += len(word) if id is not None and seqLength > 0: yield id,seqLength elif isEmpty: raise IOError('no readable sequence in FASTA file!') class AATranslation(object): 'customizable translation class' geneticCode = dict(TTY='F', TTR='L', TCN='S', TAY='Y', TGY='C', TGG='W', CTN='L', CCN='P', CAY='H', CAR='Q', CGN='R', ATY='I', ATA='I', ATG='M', ACN='T', AAY='N', AAR='K', AGY='S', AGR='R', GTN='V', GCN='A', GAY='D', GAR='E', GGN='G', TAR='*', TGA='*') def __init__(self): 'initialize our translation dictionary by applying N,Y,R codes' geneticCode = self.geneticCode.copy() for codon,aa in self.geneticCode.items(): if codon[2] == 'N': geneticCode[codon[:2]+'A'] = aa geneticCode[codon[:2]+'T'] = aa geneticCode[codon[:2]+'G'] = aa geneticCode[codon[:2]+'C'] = aa elif codon[2] == 'Y': geneticCode[codon[:2]+'T'] = aa geneticCode[codon[:2]+'C'] = aa elif codon[2] == 'R': geneticCode[codon[:2]+'A'] = aa geneticCode[codon[:2]+'G'] = aa self.geneticCode = geneticCode def __call__(self, s): 'translate nucleotide string s to amino acid string' s = s.upper() s = s.replace('U', 'T') l = [] for i in range(0, len(s), 3): try: l.append(self.geneticCode[s[i:i+3]]) except KeyError: l.append('X') # uninterpretable return ''.join(l) translate_orf = AATranslation() # default translation function PKŒ.;ÎΤDLLpygr/sequtil.pyc;ò èu¡Jc@szdZdZdZd„Zdad„Zdeed„Zd„Zd„Z d „Z d e fd „ƒYZ e ƒZ d S( iiicCsÜd}d}d}d}xy|D]q}||jo|d7}n|djp |djo|d7}q|djp |djo|d7}qqW|tt|ƒƒ}|djo||jot SqØt Snt SdS( Ns AaTtUuGgCcNniisUsusTstf0.84999999999999998( s dna_letterssndnasnUsnTssslsfloatslensratios DNA_SEQTYPEs RNA_SEQTYPEsPROTEIN_SEQTYPE(sssratiosndnas dna_lettersslsnTsnU((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys guess_seqtypes$   cCstd7attdƒSdS(Ni(sseq_id_countersstr(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys new_seq_ids i<cCsâ|tjo6yt|iƒ}WqCtj otƒ}qCXn|id|dƒt|ƒ}|tj o||ƒ}nt |ƒ}d}xDno<|i||||!dƒ||7}||joPq–qW|SdS(sTrivial FASTA outputs>s iiN(sidsNonesstrsssAttributeErrors new_seq_idsofileswritesseqs reformatterslensendsposschunk(sofilessschunksids reformattersendsseqspos((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys write_fasta"s&       ccst}t}xº|D]²}d|djoi|tj ot|ƒdjo|||fVt }n|di ƒd}|t|ƒd}d}q|tj o%x"|i ƒD]}||7}q­WqqW|tj ot|ƒdjo|||fVn|ot dƒ‚ndS(s+iterate over id,title,seq from stream ifiles>iiiss#no readable sequence in FASTA file!N( sNonesidsTruesisEmptysifileslineslensseqstitlesFalsessplitswordsIOError(sifilesseqstitlesisEmptyswordslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys read_fasta7s(       cCsßt}d}xÀto¸|idƒ}|djoPqd|djo,|diƒd}|t|ƒd}q|tj oIx|iƒD]}||7}qŽWt|ƒdjo|||fSqÊqqWt dƒ‚dS( s0read a single sequence line, return id,title,seqsis>iiis#no readable sequence in FASTA file!N( sNonesidsseqsTruesifilesreadlineslinessplitslenstitleswordsIOError(sifileswordsseqstitleslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pysread_fasta_one_lineKs$   ccsût}d}t}x£|D]›}d|djoL|tj o |djo||fVt}n|diƒd}d}q|tj o+x(|iƒD]}|t |ƒ7}q–WqqW|tj o |djo||fVn|ot dƒ‚ndS(s-Generate sequence ID,length from stream ifileis>is#no readable sequence in FASTA file!N( sNonesids seqLengthsTruesisEmptysifileslinesFalsessplitswordslensIOError(sifiles seqLengthsisEmptyswordslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pysread_fasta_lengths]s(     s AATranslationc5BsÅtZdZeddddddddd d d d d ddddddddddddddddddddd d!dd"dd#d$d%d&d'd(d)d*d+d,d-d.d/d.ƒZd0„Zd1„ZRS(2scustomizable translation classsTTYsFsTTRsLsTCNsSsTAYsYsTGYsCsTGGsWsCTNsCCNsPsCAYsHsCARsQsCGNsRsATYsIsATAsATGsMsACNsTsAAYsNsAARsKsAGYsAGRsGTNsVsGCNsAsGAYsDsGARsEsGGNsGsTARs*sTGAcCs |iiƒ}xì|iiƒD]Û\}}|ddjoL|||d d<|||d d<|||d d<|||d ds iiN(sidsNonesstrsssAttributeErrors new_seq_idsofileswritesseqs reformatterslensendsposschunk(sofilessschunksids reformattersendsseqspos((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys write_fasta"s&       ccst}t}xº|D]²}d|djoi|tj ot|ƒdjo|||fVt }n|di ƒd}|t|ƒd}d}q|tj o%x"|i ƒD]}||7}q­WqqW|tj ot|ƒdjo|||fVn|ot dƒ‚ndS(s+iterate over id,title,seq from stream ifiles>iiiss#no readable sequence in FASTA file!N( sNonesidsTruesisEmptysifileslineslensseqstitlesFalsessplitswordsIOError(sifilesseqstitlesisEmptyswordslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys read_fasta7s(       cCsßt}d}xÀto¸|idƒ}|djoPqd|djo,|diƒd}|t|ƒd}q|tj oIx|iƒD]}||7}qŽWt|ƒdjo|||fSqÊqqWt dƒ‚dS( s0read a single sequence line, return id,title,seqsis>iiis#no readable sequence in FASTA file!N( sNonesidsseqsTruesifilesreadlineslinessplitslenstitleswordsIOError(sifileswordsseqstitleslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pysread_fasta_one_lineKs$   ccsût}d}t}x£|D]›}d|djoL|tj o |djo||fVt}n|diƒd}d}q|tj o+x(|iƒD]}|t |ƒ7}q–WqqW|tj o |djo||fVn|ot dƒ‚ndS(s-Generate sequence ID,length from stream ifileis>is#no readable sequence in FASTA file!N( sNonesids seqLengthsTruesisEmptysifileslinesFalsessplitswordslensIOError(sifiles seqLengthsisEmptyswordslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pysread_fasta_lengths]s(     s AATranslationc5BsÅtZdZeddddddddd d d d d ddddddddddddddddddddd d!dd"dd#d$d%d&d'd(d)d*d+d,d-d.d/d.ƒZd0„Zd1„ZRS(2scustomizable translation classsTTYsFsTTRsLsTCNsSsTAYsYsTGYsCsTGGsWsCTNsCCNsPsCAYsHsCARsQsCGNsRsATYsIsATAsATGsMsACNsTsAAYsNsAARsKsAGYsAGRsGTNsVsGCNsAsGAYsDsGARsEsGGNsGsTARs*sTGAcCs |iiƒ}xì|iiƒD]Û\}}|ddjoL|||d d<|||d d<|||d d<|||d d1: name = argList[0] # USE 1ST ARG AS TABLE NAME argnames = ('host','user','passwd') # READ ARGS IN THIS ORDER kwargs = kwargs.copy() # a copy we can overwrite kwargs.update(list_to_dict(argnames, argList[1:])) serverInfo = DBServerInfo(**kwargs) return name,serverInfo.cursor(),serverInfo def mysql_connect(connect=None, configFile=None, useStreaming=False, **args): """return connection and cursor objects, using .my.cnf if necessary""" kwargs = args.copy() # a copy we can modify if 'user' not in kwargs and configFile is None: #Find where config file is osname = platform.system() if osname in('Microsoft', 'Windows'): # Machine is a Windows box paths = [] try: # handle case where WINDIR not defined by Windows... windir = os.environ['WINDIR'] paths += [(windir, 'my.ini'), (windir, 'my.cnf')] except KeyError: pass try: sysdrv = os.environ['SYSTEMDRIVE'] paths += [(sysdrv, os.path.sep + 'my.ini'), (sysdrv, os.path.sep + 'my.cnf')] except KeyError: pass if len(paths) > 0: configFile = get_valid_path(*paths) else: # treat as normal platform with home directories configFile = os.path.join(os.path.expanduser('~'), '.my.cnf') # allows for a local mysql local configuration file to be read # from the current directory configFile = configFile or os.path.join( os.getcwd(), 'mysql.cnf' ) if configFile and os.path.exists(configFile): kwargs['read_default_file'] = configFile connect = None # force it to use MySQLdb if connect is None: import MySQLdb connect = MySQLdb.connect kwargs['compress'] = True if useStreaming: # use server side cursors for scalable result sets try: from MySQLdb import cursors kwargs['cursorclass'] = cursors.SSCursor except (ImportError, AttributeError): pass conn = connect(**kwargs) cursor = conn.cursor() return conn,cursor _mysqlMacros = dict(IGNORE='ignore', REPLACE='replace', AUTO_INCREMENT='AUTO_INCREMENT', SUBSTRING='substring', SUBSTR_FROM='FROM', SUBSTR_FOR='FOR') def mysql_table_schema(self, analyzeSchema=True): 'retrieve table schema from a MySQL database, save on self' import MySQLdb self._format_query = SQLFormatDict(MySQLdb.paramstyle, _mysqlMacros) if not analyzeSchema: return self.clear_schema() # reset settings and dictionaries self.cursor.execute('describe %s' % self.name) # get info about columns columns = self.cursor.fetchall() self.cursor.execute('select * from %s limit 1' % self.name) # descriptions for icol,c in enumerate(columns): field = c[0] self.columnName.append(field) # list of columns in same order as table if c[3] == "PRI": # record as primary key if self.primary_key is None: self.primary_key = field else: try: self.primary_key.append(field) except AttributeError: self.primary_key = [self.primary_key,field] if c[1][:3].lower() == 'int': self.usesIntID = True else: self.usesIntID = False elif c[3] == "MUL": self.indexed[field] = icol self.description[field] = self.cursor.description[icol] self.columnType[field] = c[1] # SQL COLUMN TYPE _sqliteMacros = dict(IGNORE='or ignore', REPLACE='insert or replace', AUTO_INCREMENT='', SUBSTRING='substr', SUBSTR_FROM=',', SUBSTR_FOR=',') def import_sqlite(): 'import sqlite3 (for Python 2.5+) or pysqlite2 for earlier Python versions' try: import sqlite3 as sqlite except ImportError: from pysqlite2 import dbapi2 as sqlite return sqlite def sqlite_table_schema(self, analyzeSchema=True): 'retrieve table schema from a sqlite3 database, save on self' sqlite = import_sqlite() self._format_query = SQLFormatDict(sqlite.paramstyle, _sqliteMacros) if not analyzeSchema: return self.clear_schema() # reset settings and dictionaries self.cursor.execute('PRAGMA table_info("%s")' % self.name) columns = self.cursor.fetchall() self.cursor.execute('select * from %s limit 1' % self.name) # descriptions for icol,c in enumerate(columns): field = c[1] self.columnName.append(field) # list of columns in same order as table self.description[field] = self.cursor.description[icol] self.columnType[field] = c[2] # SQL COLUMN TYPE self.cursor.execute('select name from sqlite_master where tbl_name="%s" and type="index" and sql is null' % self.name) # get primary key / unique indexes for indexname in self.cursor.fetchall(): # search indexes for primary key self.cursor.execute('PRAGMA index_info("%s")' % indexname) l = self.cursor.fetchall() # get list of columns in this index if len(l) == 1: # assume 1st single-column unique index is primary key! self.primary_key = l[0][2] break # done searching for primary key! if self.primary_key is None: # grrr, INTEGER PRIMARY KEY handled differently self.cursor.execute('select sql from sqlite_master where tbl_name="%s" and type="table"' % self.name) sql = self.cursor.fetchall()[0][0] for columnSQL in sql[sql.index('(') + 1 :].split(','): if 'primary key' in columnSQL.lower(): # must be the primary key! col = columnSQL.split()[0] # get column name if col in self.columnType: self.primary_key = col break # done searching for primary key! else: raise ValueError('unknown primary key %s in table %s' % (col,self.name)) if self.primary_key is not None: # check its type if self.columnType[self.primary_key] == 'int' or \ self.columnType[self.primary_key] == 'integer': self.usesIntID = True else: self.usesIntID = False class SQLFormatDict(object): '''Perform SQL keyword replacements for maintaining compatibility across a wide range of SQL backends. Uses Python dict-based string format function to do simple string replacements, and also to convert params list to the paramstyle required for this interface. Create by passing a dict of macros and the db-api paramstyle: sfd = SQLFormatDict("qmark", substitutionDict) Then transform queries+params as follows; input should be "format" style: sql,params = sfd("select * from foo where id=%s and val=%s", (myID,myVal)) cursor.execute(sql, params) ''' _paramFormats = dict(pyformat='%%(%d)s', numeric=':%d', named=':%d', qmark='(ignore)', format='(ignore)') def __init__(self, paramstyle, substitutionDict={}): self.substitutionDict = substitutionDict.copy() self.paramstyle = paramstyle self.paramFormat = self._paramFormats[paramstyle] self.makeDict = (paramstyle == 'pyformat' or paramstyle == 'named') if paramstyle == 'qmark': # handle these as simple substitution self.substitutionDict['?'] = '?' elif paramstyle == 'format': self.substitutionDict['?'] = '%s' def __getitem__(self, k): 'apply correct substitution for this SQL interface' try: return self.substitutionDict[k] # apply our substitutions except KeyError: pass if k == '?': # sequential parameter s = self.paramFormat % self.iparam self.iparam += 1 # advance to the next parameter return s raise KeyError('unknown macro: %s' % k) def __call__(self, sql, paramList): 'returns corrected sql,params for this interface' self.iparam = 1 # DB-ABI param indexing begins at 1 sql = sql.replace('%s', '%(?)s') # convert format into pyformat s = sql % self # apply all %(x)s replacements in sql if self.makeDict: # construct a params dict paramDict = {} for i,param in enumerate(paramList): paramDict[str(i + 1)] = param #DB-ABI param indexing begins at 1 return s,paramDict else: # just return the original params list return s,paramList def get_table_schema(self, analyzeSchema=True): 'run the right schema function based on type of db server connection' try: modname = self.cursor.__class__.__module__ except AttributeError: raise ValueError('no cursor object or module information!') try: schema_func = self._schemaModuleDict[modname] except KeyError: raise KeyError('''unknown db module: %s. Use _schemaModuleDict attribute to supply a method for obtaining table schema for this module''' % modname) schema_func(self, analyzeSchema) # run the schema function _schemaModuleDict = {'MySQLdb.cursors':mysql_table_schema, 'pysqlite2.dbapi2':sqlite_table_schema, 'sqlite3':sqlite_table_schema} class SQLTableBase(object, UserDict.DictMixin): "Store information about an SQL table as dict keyed by primary key" _schemaModuleDict = _schemaModuleDict # default module list get_table_schema = get_table_schema def __init__(self,name,cursor=None,itemClass=None,attrAlias=None, clusterKey=None,createTable=None,graph=None,maxCache=None, arraysize=1024, itemSliceClass=None, dropIfExists=False, serverInfo=None, autoGC=True, orderBy=None, writeable=False, iterSQL=None, iterColumns=None, **kwargs): if autoGC: # automatically garbage collect unused objects self._weakValueDict = RecentValueDictionary(autoGC) # object cache else: self._weakValueDict = {} self.autoGC = autoGC self.orderBy = orderBy if orderBy and serverInfo and serverInfo._serverType == 'mysql': if iterSQL and iterColumns: # both required for mysql! self.iterSQL, self.iterColumns = iterSQL, iterColumns else: raise ValueError('For MySQL tables with orderBy, you MUST specify iterSQL and iterColumns as well!') self.writeable = writeable if cursor is None: if serverInfo is not None: # get cursor from serverInfo cursor = serverInfo.cursor() else: # try to read connection info from name or config file name,cursor,serverInfo = get_name_cursor(name,**kwargs) else: warnings.warn("""The cursor argument is deprecated. Use serverInfo instead! """, DeprecationWarning, stacklevel=2) self.cursor = cursor if createTable is not None: # RUN COMMAND TO CREATE THIS TABLE if dropIfExists: # get rid of any existing table cursor.execute('drop table if exists ' + name) self.get_table_schema(False) # check dbtype, init _format_query sql,params = self._format_query(createTable, ()) # apply macros cursor.execute(sql) # create the table self.name = name if graph is not None: self.graph = graph if maxCache is not None: self.maxCache = maxCache if arraysize is not None: self.arraysize = arraysize cursor.arraysize = arraysize self.get_table_schema() # get schema of columns to serve as attrs self.data = {} # map of all attributes, including aliases for icol,field in enumerate(self.columnName): self.data[field] = icol # 1st add mappings to columns try: self.data['id']=self.data[self.primary_key] except (KeyError,TypeError): pass if hasattr(self,'_attr_alias'): # apply attribute aliases for this class self.addAttrAlias(False,**self._attr_alias) self.objclass(itemClass) # NEED TO SUBCLASS OUR ITEM CLASS if itemSliceClass is not None: self.itemSliceClass = itemSliceClass get_bound_subclass(self, 'itemSliceClass', self.name) # need to subclass itemSliceClass if attrAlias is not None: # ADD ATTRIBUTE ALIASES self.attrAlias = attrAlias # RECORD FOR PICKLING PURPOSES self.data.update(attrAlias) if clusterKey is not None: self.clusterKey=clusterKey if serverInfo is not None: self.serverInfo = serverInfo def __len__(self): self._select(selectCols='count(*)') return self.cursor.fetchone()[0] def __hash__(self): return id(self) def __cmp__(self, other): 'only match self and no other!' if self is other: return 0 else: return cmp(id(self), id(other)) _pickleAttrs = dict(name=0, clusterKey=0, maxCache=0, arraysize=0, attrAlias=0, serverInfo=0, autoGC=0, orderBy=0, writeable=0, iterSQL=0, iterColumns=0) __getstate__ = standard_getstate def __setstate__(self,state): # default cursor provisioning by worldbase is deprecated! ## if 'serverInfo' not in state: # hmm, no address for db server? ## try: # SEE IF WE CAN GET CURSOR DIRECTLY FROM RESOURCE DATABASE ## from Data import getResource ## state['cursor'] = getResource.getTableCursor(state['name']) ## except ImportError: ## pass # FAILED, SO TRY TO GET A CURSOR IN THE USUAL WAYS... self.__init__(**state) def __repr__(self): return '' def clear_schema(self): 'reset all schema information for this table' self.description={} self.columnName = [] self.columnType = {} self.usesIntID = None self.primary_key = None self.indexed = {} def _attrSQL(self,attr,sqlColumn=False,columnNumber=False): "Translate python attribute name to appropriate SQL expression" try: # MAKE SURE THIS ATTRIBUTE CAN BE MAPPED TO DATABASE EXPRESSION field=self.data[attr] except KeyError: raise AttributeError('attribute %s not a valid column or alias in %s' % (attr,self.name)) if sqlColumn: # ENSURE THAT THIS TRULY MAPS TO A COLUMN NAME IN THE DB try: # CHECK IF field IS COLUMN NUMBER return self.columnName[field] # RETURN SQL COLUMN NAME except TypeError: try: # CHECK IF field IS SQL COLUMN NAME return self.columnName[self.data[field]] # THIS WILL JUST RETURN field... except (KeyError,TypeError): raise AttributeError('attribute %s does not map to an SQL column in %s' % (attr,self.name)) if columnNumber: try: # CHECK IF field IS A COLUMN NUMBER return field+0 # ONLY RETURN AN INTEGER except TypeError: try: # CHECK IF field IS ITSELF THE SQL COLUMN NAME return self.data[field]+0 # ONLY RETURN AN INTEGER except (KeyError,TypeError): raise ValueError('attribute %s does not map to a SQL column!' % attr) if isinstance(field,types.StringType): attr=field # USE ALIASED EXPRESSION FOR DATABASE SELECT INSTEAD OF attr elif attr=='id': attr=self.primary_key return attr def addAttrAlias(self,saveToPickle=True,**kwargs): """Add new attributes as aliases of existing attributes. They can be specified either as named args: t.addAttrAlias(newattr=oldattr) or by passing a dictionary kwargs whose keys are newattr and values are oldattr: t.addAttrAlias(**kwargs) saveToPickle=True forces these aliases to be saved if object is pickled. """ if saveToPickle: self.attrAlias.update(kwargs) for key,val in kwargs.items(): try: # 1st CHECK WHETHER val IS AN EXISTING COLUMN / ALIAS self.data[val]+0 # CHECK WHETHER val MAPS TO A COLUMN NUMBER raise KeyError # YES, val IS ACTUAL SQL COLUMN NAME, SO SAVE IT DIRECTLY except TypeError: # val IS ITSELF AN ALIAS self.data[key] = self.data[val] # SO MAP TO WHAT IT MAPS TO except KeyError: # TREAT AS ALIAS TO SQL EXPRESSION self.data[key] = val def objclass(self,oclass=None): "Create class representing a row in this table by subclassing oclass, adding data" if oclass is not None: # use this as our base itemClass self.itemClass = oclass if self.writeable: self.itemClass = self.itemClass._RWClass # use its writeable version oclass = get_bound_subclass(self, 'itemClass', self.name, subclassArgs=dict(db=self)) # bind itemClass if issubclass(oclass, TupleO): oclass._attrcol = self.data # BIND ATTRIBUTE LIST TO TUPLEO INTERFACE if hasattr(oclass,'_tableclass') and not isinstance(self,oclass._tableclass): self.__class__=oclass._tableclass # ROW CLASS CAN OVERRIDE OUR CURRENT TABLE CLASS def _select(self, whereClause='', params=(), selectCols='t1.*', cursor=None, orderBy='', limit=''): 'execute the specified query but do not fetch' sql,params = self._format_query('select %s from %s t1 %s %s %s' % (selectCols, self.name, whereClause, orderBy, limit), params) if cursor is None: self.cursor.execute(sql, params) else: cursor.execute(sql, params) def select(self,whereClause,params=None,oclass=None,selectCols='t1.*'): "Generate the list of objects that satisfy the database SELECT" if oclass is None: oclass=self.itemClass self._select(whereClause,params,selectCols) l=self.cursor.fetchall() for t in l: yield self.cacheItem(t,oclass) def query(self,**kwargs): 'query for intersection of all specified kwargs, returned as iterator' criteria = [] params = [] for k,v in kwargs.items(): # CONSTRUCT THE LIST OF WHERE CLAUSES if v is None: # CONVERT TO SQL NULL TEST criteria.append('%s IS NULL' % self._attrSQL(k)) else: # TEST FOR EQUALITY criteria.append('%s=%%s' % self._attrSQL(k)) params.append(v) return self.select('where '+' and '.join(criteria),params) def _update(self,row_id,col,val): 'update a single field in the specified row to the specified value' sql,params = self._format_query('update %s set %s=%%s where %s=%%s' %(self.name,col,self.primary_key), (val,row_id)) self.cursor.execute(sql, params) def getID(self,t): try: return t[self.data['id']] # GET ID FROM TUPLE except TypeError: # treat as alias return t[self.data[self.data['id']]] def cacheItem(self,t,oclass): 'get obj from cache if possible, or construct from tuple' try: id=self.getID(t) except KeyError: # NO PRIMARY KEY? IGNORE THE CACHE. return oclass(t) try: # IF ALREADY LOADED IN OUR DICTIONARY, JUST RETURN THAT ENTRY return self._weakValueDict[id] except KeyError: pass o = oclass(t) self._weakValueDict[id] = o # CACHE THIS ITEM IN OUR DICTIONARY return o def cache_items(self,rows,oclass=None): if oclass is None: oclass=self.itemClass for t in rows: yield self.cacheItem(t,oclass) def foreignKey(self,attr,k): 'get iterator for objects with specified foreign key value' return self.select('where %s=%%s'%attr,(k,)) def limit_cache(self): 'APPLY maxCache LIMIT TO CACHE SIZE' try: if self.maxCache [(source,target),...]''' _distinct_key='edge_id' _pickleAttrs = SQLTableMultiNoCache._pickleAttrs.copy() _pickleAttrs.update(dict(graph=0)) def keys(self): self.cursor.execute('select %s,%s,%s from %s where %s is not null order by %s,%s' %(self._attrSQL('source_id'),self._attrSQL('target_id'), self._attrSQL('edge_id'),self.name, self._attrSQL('target_id'),self._attrSQL('source_id'), self._attrSQL('target_id'))) l = [] # PREFETCH ALL ROWS, SINCE CURSOR MAY BE REUSED for source_id,target_id,edge_id in self.cursor.fetchall(): l.append((self.graph.unpack_source(source_id), self.graph.unpack_target(target_id), self.graph.unpack_edge(edge_id))) return l __call__=keys def __iter__(self): return iter(self.keys()) def __getitem__(self,edge): sql,params = self._format_query('select %s,%s from %s where %s=%%s' %(self._attrSQL('source_id'), self._attrSQL('target_id'), self.name, self._attrSQL(self._distinct_key)), (self.graph.pack_edge(edge),)) self.cursor.execute(sql, params) l = [] # PREFETCH ALL ROWS, SINCE CURSOR MAY BE REUSED for source_id,target_id in self.cursor.fetchall(): l.append((self.graph.unpack_source(source_id), self.graph.unpack_target(target_id))) return l class SQLEdgeDict(object): '2nd level graph interface to SQL database' def __init__(self,fromNode,table): self.fromNode=fromNode self.table=table if not hasattr(self.table,'allowMissingNodes'): sql,params = self.table._format_query('select %s from %s where %s=%%s limit 1' %(self.table.sourceSQL, self.table.name, self.table.sourceSQL), (self.fromNode,)) self.table.cursor.execute(sql, params) if len(self.table.cursor.fetchall())<1: raise KeyError('node not in graph!') def __getitem__(self,target): sql,params = self.table._format_query('select %s from %s where %s=%%s and %s=%%s limit 2' %(self.table.edgeSQL, self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode, self.table.pack_target(target))) self.table.cursor.execute(sql, params) l = self.table.cursor.fetchmany(2) # get at most two rows if len(l) != 1: raise KeyError('either no edge from source to target or not unique!') try: return self.table.unpack_edge(l[0][0]) # RETURN EDGE except IndexError: raise KeyError('no edge from node to target') def __setitem__(self,target,edge): sql,params = self.table._format_query('replace into %s values (%%s,%%s,%%s)' %self.table.name, (self.fromNode, self.table.pack_target(target), self.table.pack_edge(edge))) self.table.cursor.execute(sql, params) if not hasattr(self.table,'sourceDB') or \ (hasattr(self.table,'targetDB') and self.table.sourceDB is self.table.targetDB): self.table += target # ADD AS NODE TO GRAPH def __iadd__(self,target): self[target] = None return self # iadd MUST RETURN self! def __delitem__(self,target): sql,params = self.table._format_query('delete from %s where %s=%%s and %s=%%s' %(self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode, self.table.pack_target(target))) self.table.cursor.execute(sql, params) if self.table.cursor.rowcount < 1: # no rows deleted? raise KeyError('no edge from node to target') def iterator_query(self): sql,params = self.table._format_query('select %s,%s from %s where %s=%%s and %s is not null' %(self.table.targetSQL, self.table.edgeSQL, self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode,)) self.table.cursor.execute(sql, params) return self.table.cursor.fetchall() def keys(self): return [self.table.unpack_target(target_id) for target_id,edge_id in self.iterator_query()] def values(self): return [self.table.unpack_edge(edge_id) for target_id,edge_id in self.iterator_query()] def edges(self): return [(self.table.unpack_source(self.fromNode),self.table.unpack_target(target_id), self.table.unpack_edge(edge_id)) for target_id,edge_id in self.iterator_query()] def items(self): return [(self.table.unpack_target(target_id),self.table.unpack_edge(edge_id)) for target_id,edge_id in self.iterator_query()] def __iter__(self): return iter(self.keys()) def itervalues(self): return iter(self.values()) def iteritems(self): return iter(self.items()) def __len__(self): return len(self.keys()) __cmp__ = graph_cmp class SQLEdgelessDict(SQLEdgeDict): 'for SQLGraph tables that lack edge_id column' def __getitem__(self,target): sql,params = self.table._format_query('select %s from %s where %s=%%s and %s=%%s limit 2' %(self.table.targetSQL, self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode, self.table.pack_target(target))) self.table.cursor.execute(sql, params) l = self.table.cursor.fetchmany(2) if len(l) != 1: raise KeyError('either no edge from source to target or not unique!') return None # no edge info! def iterator_query(self): sql,params = self.table._format_query('select %s from %s where %s=%%s and %s is not null' %(self.table.targetSQL, self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode,)) self.table.cursor.execute(sql, params) return [(t[0],None) for t in self.table.cursor.fetchall()] SQLEdgeDict._edgelessClass = SQLEdgelessDict class SQLGraphEdgeDescriptor(object): 'provide an SQLEdges interface on demand' def __get__(self,obj,objtype): try: attrAlias=obj.attrAlias.copy() except AttributeError: return SQLEdges(obj.name, obj.cursor, graph=obj) else: return SQLEdges(obj.name, obj.cursor, attrAlias=attrAlias, graph=obj) def getColumnTypes(createTable,attrAlias={},defaultColumnType='int', columnAttrs=('source','target','edge'),**kwargs): 'return list of [(colname,coltype),...] for source,target,edge' l = [] for attr in columnAttrs: try: attrName = attrAlias[attr+'_id'] except KeyError: attrName = attr+'_id' try: # SEE IF USER SPECIFIED A DESIRED TYPE l.append((attrName,createTable[attr+'_id'])) continue except (KeyError,TypeError): pass try: # get type info from primary key for that database db = kwargs[attr+'DB'] if db is None: raise KeyError # FORCE IT TO USE DEFAULT TYPE except KeyError: pass else: # INFER THE COLUMN TYPE FROM THE ASSOCIATED DATABASE KEYS... it = iter(db) try: # GET ONE IDENTIFIER FROM THE DATABASE k = it.next() except StopIteration: # TABLE IS EMPTY, SO READ SQL TYPE FROM db OBJECT try: l.append((attrName,db.columnType[db.primary_key])) continue except AttributeError: pass else: # GET THE TYPE FROM THIS IDENTIFIER if isinstance(k,int) or isinstance(k,long): l.append((attrName,'int')) continue elif isinstance(k,str): l.append((attrName,'varchar(32)')) continue else: raise ValueError('SQLGraph node / edge must be int or str!') l.append((attrName,defaultColumnType)) logger.warn('no type info found for %s, so using default: %s' % (attrName, defaultColumnType)) return l class SQLGraph(SQLTableMultiNoCache): '''provide a graph interface via a SQL table. Key capabilities are: - setitem with an empty dictionary: a dummy operation - getitem with a key that exists: return a placeholder - setitem with non empty placeholder: again a dummy operation EXAMPLE TABLE SCHEMA: create table mygraph (source_id int not null,target_id int,edge_id int, unique(source_id,target_id)); ''' _distinct_key='source_id' _pickleAttrs = SQLTableMultiNoCache._pickleAttrs.copy() _pickleAttrs.update(dict(sourceDB=0,targetDB=0,edgeDB=0,allowMissingNodes=0)) _edgeClass = SQLEdgeDict def __init__(self,name,*l,**kwargs): graphArgs,tableArgs = split_kwargs(kwargs, ('attrAlias','defaultColumnType','columnAttrs', 'sourceDB','targetDB','edgeDB','simpleKeys','unpack_edge', 'edgeDictClass','graph')) if 'createTable' in kwargs: # CREATE A SCHEMA FOR THIS TABLE c = getColumnTypes(**kwargs) tableArgs['createTable'] = \ 'create table %s (%s %s not null,%s %s,%s %s,unique(%s,%s))' \ % (name,c[0][0],c[0][1],c[1][0],c[1][1],c[2][0],c[2][1],c[0][0],c[1][0]) try: self.allowMissingNodes = kwargs['allowMissingNodes'] except KeyError: pass SQLTableMultiNoCache.__init__(self,name,*l,**tableArgs) self.sourceSQL = self._attrSQL('source_id') self.targetSQL = self._attrSQL('target_id') try: self.edgeSQL = self._attrSQL('edge_id') except AttributeError: self.edgeSQL = None self._edgeClass = self._edgeClass._edgelessClass save_graph_db_refs(self,**kwargs) def __getitem__(self,k): return self._edgeClass(self.pack_source(k),self) def __iadd__(self,k): sql,params = self._format_query('delete from %s where %s=%%s and %s is null' % (self.name,self.sourceSQL,self.targetSQL), (self.pack_source(k),)) self.cursor.execute(sql, params) sql,params = self._format_query('insert %%(IGNORE)s into %s values (%%s,NULL,NULL)' % self.name,(self.pack_source(k),)) self.cursor.execute(sql, params) return self # iadd MUST RETURN SELF! def __isub__(self,k): sql,params = self._format_query('delete from %s where %s=%%s' % (self.name,self.sourceSQL), (self.pack_source(k),)) self.cursor.execute(sql, params) if self.cursor.rowcount == 0: raise KeyError('node not found in graph') return self # iadd MUST RETURN SELF! __setitem__ = graph_setitem def __contains__(self,k): sql,params = self._format_query('select * from %s where %s=%%s limit 1' %(self.name,self.sourceSQL), (self.pack_source(k),)) self.cursor.execute(sql, params) l = self.cursor.fetchmany(2) return len(l) > 0 def __invert__(self): 'get an interface to the inverse graph mapping' try: # CACHED return self._inverse except AttributeError: # CONSTRUCT INTERFACE TO INVERSE MAPPING attrAlias = dict(source_id=self.targetSQL, # SWAP SOURCE & TARGET target_id=self.sourceSQL, edge_id=self.edgeSQL) if self.edgeSQL is None: # no edge interface del attrAlias['edge_id'] self._inverse=SQLGraph(self.name,self.cursor, attrAlias=attrAlias, **graph_db_inverse_refs(self)) self._inverse._inverse=self return self._inverse def __iter__(self): for k in SQLTableMultiNoCache.__iter__(self): yield self.unpack_source(k) def iteritems(self): for k in SQLTableMultiNoCache.__iter__(self): yield (self.unpack_source(k), self._edgeClass(k, self)) def itervalues(self): for k in SQLTableMultiNoCache.__iter__(self): yield self._edgeClass(k, self) def keys(self): return [self.unpack_source(k) for k in SQLTableMultiNoCache.keys(self)] def values(self): return list(self.itervalues()) def items(self): return list(self.iteritems()) edges=SQLGraphEdgeDescriptor() update = update_graph def __len__(self): 'get number of source nodes in graph' self.cursor.execute('select count(distinct %s) from %s' %(self.sourceSQL,self.name)) return self.cursor.fetchone()[0] __cmp__ = graph_cmp override_rich_cmp(locals()) # MUST OVERRIDE __eq__ ETC. TO USE OUR __cmp__! ## def __cmp__(self,other): ## node = () ## n = 0 ## d = None ## it = iter(self.edges) ## while True: ## try: ## source,target,edge = it.next() ## except StopIteration: ## source = None ## if source!=node: ## if d is not None: ## diff = cmp(n_target,len(d)) ## if diff!=0: ## return diff ## if source is None: ## break ## node = source ## n += 1 # COUNT SOURCE NODES ## n_target = 0 ## try: ## d = other[node] ## except KeyError: ## return 1 ## try: ## diff = cmp(edge,d[target]) ## except KeyError: ## return 1 ## if diff!=0: ## return diff ## n_target += 1 # COUNT TARGET NODES FOR THIS SOURCE ## return cmp(n,len(other)) add_standard_packing_methods(locals()) ############ PACK / UNPACK METHODS class SQLIDGraph(SQLGraph): add_trivial_packing_methods(locals()) SQLGraph._IDGraphClass = SQLIDGraph class SQLEdgeDictClustered(dict): 'simple cache for 2nd level dictionary of target_id:edge_id' def __init__(self,g,fromNode): self.g=g self.fromNode=fromNode dict.__init__(self) def __iadd__(self,l): for target_id,edge_id in l: dict.__setitem__(self,target_id,edge_id) return self # iadd MUST RETURN SELF! class SQLEdgesClusteredDescr(object): def __get__(self,obj,objtype): e=SQLEdgesClustered(obj.table,obj.edge_id,obj.source_id,obj.target_id, graph=obj,**graph_db_inverse_refs(obj,True)) for source_id,d in obj.d.iteritems(): # COPY EDGE CACHE e.load([(edge_id,source_id,target_id) for (target_id,edge_id) in d.iteritems()]) return e class SQLGraphClustered(object): 'SQL graph with clustered caching -- loads an entire cluster at a time' _edgeDictClass=SQLEdgeDictClustered def __init__(self,table,source_id='source_id',target_id='target_id', edge_id='edge_id',clusterKey=None,**kwargs): import types if isinstance(table,types.StringType): # CREATE THE TABLE INTERFACE if clusterKey is None: raise ValueError('you must provide a clusterKey argument!') if 'createTable' in kwargs: # CREATE A SCHEMA FOR THIS TABLE c = getColumnTypes(attrAlias=dict(source_id=source_id,target_id=target_id, edge_id=edge_id),**kwargs) kwargs['createTable'] = \ 'create table %s (%s %s not null,%s %s,%s %s,unique(%s,%s))' \ % (table,c[0][0],c[0][1],c[1][0],c[1][1], c[2][0],c[2][1],c[0][0],c[1][0]) table = SQLTableClustered(table,clusterKey=clusterKey,**kwargs) self.table=table self.source_id=source_id self.target_id=target_id self.edge_id=edge_id self.d={} save_graph_db_refs(self,**kwargs) _pickleAttrs = dict(table=0,source_id=0,target_id=0,edge_id=0,sourceDB=0,targetDB=0, edgeDB=0) def __getstate__(self): state = standard_getstate(self) state['d'] = {} # UNPICKLE SHOULD RESTORE GRAPH WITH EMPTY CACHE return state def __getitem__(self,k): 'get edgeDict for source node k, from cache or by loading its cluster' try: # GET DIRECTLY FROM CACHE return self.d[k] except KeyError: if hasattr(self,'_isLoaded'): raise # ENTIRE GRAPH LOADED, SO k REALLY NOT IN THIS GRAPH # HAVE TO LOAD THE ENTIRE CLUSTER CONTAINING THIS NODE sql,params = self.table._format_query('select t2.%s,t2.%s,t2.%s from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s group by t2.%s' %(self.source_id,self.target_id, self.edge_id,self.table.name, self.table.name,self.source_id, self.table.clusterKey,self.table.clusterKey, self.table.primary_key), (self.pack_source(k),)) self.table.cursor.execute(sql, params) self.load(self.table.cursor.fetchall()) # CACHE THIS CLUSTER return self.d[k] # RETURN EDGE DICT FOR THIS NODE def load(self,l=None,unpack=True): 'load the specified rows (or all, if None provided) into local cache' if l is None: try: # IF ALREADY LOADED, NO NEED TO DO ANYTHING return self._isLoaded except AttributeError: pass self.table.cursor.execute('select %s,%s,%s from %s' %(self.source_id,self.target_id, self.edge_id,self.table.name)) l=self.table.cursor.fetchall() self._isLoaded=True self.d.clear() # CLEAR OUR CACHE AS load() WILL REPLICATE EVERYTHING for source,target,edge in l: # SAVE TO OUR CACHE if unpack: source = self.unpack_source(source) target = self.unpack_target(target) edge = self.unpack_edge(edge) try: self.d[source] += [(target,edge)] except KeyError: d = self._edgeDictClass(self,source) d += [(target,edge)] self.d[source] = d def __invert__(self): 'interface to reverse graph mapping' try: return self._inverse # INVERSE MAP ALREADY EXISTS except AttributeError: pass # JUST CREATE INTERFACE WITH SWAPPED TARGET & SOURCE self._inverse=SQLGraphClustered(self.table,self.target_id,self.source_id, self.edge_id,**graph_db_inverse_refs(self)) self._inverse._inverse=self for source,d in self.d.iteritems(): # INVERT OUR CACHE self._inverse.load([(target,source,edge) for (target,edge) in d.iteritems()],unpack=False) return self._inverse edges=SQLEdgesClusteredDescr() # CONSTRUCT EDGE INTERFACE ON DEMAND update = update_graph add_standard_packing_methods(locals()) ############ PACK / UNPACK METHODS def __iter__(self): ################# ITERATORS 'uses db select; does not force load' return iter(self.keys()) def keys(self): 'uses db select; does not force load' self.table.cursor.execute('select distinct(%s) from %s' %(self.source_id,self.table.name)) return [self.unpack_source(t[0]) for t in self.table.cursor.fetchall()] methodFactory(['iteritems','items','itervalues','values'], 'lambda self:(self.load(),self.d.%s())[1]',locals()) def __contains__(self,k): try: x=self[k] return True except KeyError: return False class SQLIDGraphClustered(SQLGraphClustered): add_trivial_packing_methods(locals()) SQLGraphClustered._IDGraphClass = SQLIDGraphClustered class SQLEdgesClustered(SQLGraphClustered): 'edges interface for SQLGraphClustered' _edgeDictClass = list _pickleAttrs = SQLGraphClustered._pickleAttrs.copy() _pickleAttrs.update(dict(graph=0)) def keys(self): self.load() result = [] for edge_id,l in self.d.iteritems(): for source_id,target_id in l: result.append((self.graph.unpack_source(source_id), self.graph.unpack_target(target_id), self.graph.unpack_edge(edge_id))) return result class ForeignKeyInverse(object): 'map each key to a single value according to its foreign key' def __init__(self,g): self.g = g def __getitem__(self,obj): self.check_obj(obj) source_id = getattr(obj,self.g.keyColumn) if source_id is None: return None return self.g.sourceDB[source_id] def __setitem__(self,obj,source): self.check_obj(obj) if source is not None: self.g[source][obj] = None # ENSURES ALL THE RIGHT CACHING OPERATIONS DONE else: # DELETE PRE-EXISTING EDGE IF PRESENT if not hasattr(obj,'_localOnly'): # ONLY CACHE, DON'T SAVE TO DATABASE old_source = self[obj] if old_source is not None: del self.g[old_source][obj] def check_obj(self,obj): 'raise KeyError if obj not from this db' try: if obj.db is not self.g.targetDB: raise AttributeError except AttributeError: raise KeyError('key is not from targetDB of this graph!') def __contains__(self,obj): try: self.check_obj(obj) return True except KeyError: return False def __iter__(self): return self.g.targetDB.itervalues() def keys(self): return self.g.targetDB.values() def iteritems(self): for obj in self: source_id = getattr(obj,self.g.keyColumn) if source_id is None: yield obj,None else: yield obj,self.g.sourceDB[source_id] def items(self): return list(self.iteritems()) def itervalues(self): for obj,val in self.iteritems(): yield val def values(self): return list(self.itervalues()) def __invert__(self): return self.g class ForeignKeyEdge(dict): '''edge interface to a foreign key in an SQL table. Caches dict of target nodes in itself; provides dict interface. Adds or deletes edges by setting foreign key values in the table''' def __init__(self,g,k): dict.__init__(self) self.g = g self.src = k for v in g.targetDB.select('where %s=%%s' % g.keyColumn,(k.id,)): # SEARCH THE DB dict.__setitem__(self,v,None) # SAVE IN CACHE def __setitem__(self,dest,v): if not hasattr(dest,'db') or dest.db is not self.g.targetDB: raise KeyError('dest is not in the targetDB bound to this graph!') if v is not None: raise ValueError('sorry,this graph cannot store edge information!') if not hasattr(dest,'_localOnly'): # ONLY CACHE, DON'T SAVE TO DATABASE old_source = self.g._inverse[dest] # CHECK FOR PRE-EXISTING EDGE if old_source is not None: # REMOVE OLD EDGE FROM CACHE dict.__delitem__(self.g[old_source],dest) #self.g.targetDB._update(dest.id,self.g.keyColumn,self.src.id) # SAVE TO DB setattr(dest,self.g.keyColumn,self.src.id) # SAVE TO DB ATTRIBUTE dict.__setitem__(self,dest,None) # SAVE IN CACHE def __delitem__(self,dest): #self.g.targetDB._update(dest.id,self.g.keyColumn,None) # REMOVE FOREIGN KEY VALUE setattr(dest,self.g.keyColumn,None) # SAVE TO DB ATTRIBUTE dict.__delitem__(self,dest) # REMOVE FROM CACHE class ForeignKeyGraph(object, UserDict.DictMixin): '''graph interface to a foreign key in an SQL table Caches dict of target nodes in itself; provides dict interface. ''' def __init__(self, sourceDB, targetDB, keyColumn, autoGC=True, **kwargs): '''sourceDB is any database of source nodes; targetDB must be an SQL database of target nodes; keyColumn is the foreign key column name in targetDB for looking up sourceDB IDs.''' if autoGC: # automatically garbage collect unused objects self._weakValueDict = RecentValueDictionary(autoGC) # object cache else: self._weakValueDict = {} self.autoGC = autoGC self.sourceDB = sourceDB self.targetDB = targetDB self.keyColumn = keyColumn self._inverse = ForeignKeyInverse(self) _pickleAttrs = dict(sourceDB=0, targetDB=0, keyColumn=0, autoGC=0) __getstate__ = standard_getstate ########### SUPPORT FOR PICKLING __setstate__ = standard_setstate def _inverse_schema(self): 'provide custom schema rule for inverting this graph... just use keyColumn!' return dict(invert=True,uniqueMapping=True) def __getitem__(self,k): if not hasattr(k,'db') or k.db is not self.sourceDB: raise KeyError('object is not in the sourceDB bound to this graph!') try: return self._weakValueDict[k.id] # get from cache except KeyError: pass d = ForeignKeyEdge(self,k) self._weakValueDict[k.id] = d # save in cache return d def __setitem__(self, k, v): raise KeyError('''do not save as g[k]=v. Instead follow a graph interface: g[src]+=dest, or g[src][dest]=None (no edge info allowed)''') def __delitem__(self, k): raise KeyError('''Instead of del g[k], follow a graph interface: del g[src][dest]''') def keys(self): return self.sourceDB.values() __invert__ = standard_invert def describeDBTables(name,cursor,idDict): """ Get table info about database via , and store primary keys in idDict, along with a list of the tables each key indexes. """ cursor.execute('use %s' % name) cursor.execute('show tables') tables={} l=[c[0] for c in cursor.fetchall()] for t in l: tname=name+'.'+t o=SQLTable(tname,cursor) tables[tname]=o for f in o.description: if f==o.primary_key: idDict.setdefault(f, []).append(o) elif f[-3:]=='_id' and f not in idDict: idDict[f]=[] return tables def indexIDs(tables,idDict=None): "Get an index of primary keys in the dictionary." if idDict==None: idDict={} for o in tables.values(): if o.primary_key: if o.primary_key not in idDict: idDict[o.primary_key]=[] idDict[o.primary_key].append(o) # KEEP LIST OF TABLES WITH THIS PRIMARY KEY for f in o.description: if f[-3:]=='_id' and f not in idDict: idDict[f]=[] return idDict def suffixSubset(tables,suffix): "Filter table index for those matching a specific suffix" subset={} for name,t in tables.items(): if name.endswith(suffix): subset[name]=t return subset PRIMARY_KEY=1 def graphDBTables(tables,idDict): g=dictgraph() for t in tables.values(): for f in t.description: if f==t.primary_key: edgeInfo=PRIMARY_KEY else: edgeInfo=None g.setEdge(f,t,edgeInfo) g.setEdge(t,f,edgeInfo) return g SQLTypeTranslation= {types.StringType:'varchar(32)', types.IntType:'int', types.FloatType:'float'} def createTableFromRepr(rows,tableName,cursor,typeTranslation=None, optionalDict=None,indexDict=()): """Save rows into SQL tableName using cursor, with optional translations of columns to specific SQL types (specified by typeTranslation dict). - optionDict can specify columns that are allowed to be NULL. - indexDict can specify columns that must be indexed; columns whose names end in _id will be indexed by default. - rows must be an iterator which in turn returns dictionaries, each representing a tuple of values (indexed by their column names). """ try: row=rows.next() # GET 1ST ROW TO EXTRACT COLUMN INFO except StopIteration: return # IF rows EMPTY, NO NEED TO SAVE ANYTHING, SO JUST RETURN try: createTableFromRow(cursor, tableName,row,typeTranslation, optionalDict,indexDict) except: pass storeRow(cursor,tableName,row) # SAVE OUR FIRST ROW for row in rows: # NOW SAVE ALL THE ROWS storeRow(cursor,tableName,row) def createTableFromRow(cursor, tableName, row,typeTranslation=None, optionalDict=None,indexDict=()): create_defs=[] for col,val in row.items(): # PREPARE SQL TYPES FOR COLUMNS coltype=None if typeTranslation!=None and col in typeTranslation: coltype=typeTranslation[col] # USER-SUPPLIED TRANSLATION elif type(val) in SQLTypeTranslation: coltype=SQLTypeTranslation[type(val)] else: # SEARCH FOR A COMPATIBLE TYPE for t in SQLTypeTranslation: if isinstance(val,t): coltype=SQLTypeTranslation[t] break if coltype==None: raise TypeError("Don't know SQL type to use for %s" % col) create_def='%s %s' %(col,coltype) if optionalDict==None or col not in optionalDict: create_def+=' not null' create_defs.append(create_def) for col in row: # CREATE INDEXES FOR ID COLUMNS if col[-3:]=='_id' or col in indexDict: create_defs.append('index(%s)' % col) cmd='create table if not exists %s (%s)' % (tableName,','.join(create_defs)) cursor.execute(cmd) # CREATE THE TABLE IN THE DATABASE def storeRow(cursor, tableName, row): row_format=','.join(len(row)*['%s']) cmd='insert into %s values (%s)' % (tableName,row_format) cursor.execute(cmd,tuple(row.values())) def storeRowDelayed(cursor, tableName, row): row_format=','.join(len(row)*['%s']) cmd='insert delayed into %s values (%s)' % (tableName,row_format) cursor.execute(cmd,tuple(row.values())) class TableGroup(dict): 'provide attribute access to dbname qualified tablenames' def __init__(self,db='test',suffix=None,**kw): dict.__init__(self) self.db=db if suffix is not None: self.suffix=suffix for k,v in kw.items(): if v is not None and '.' not in v: v=self.db+'.'+v # ADD DATABASE NAME AS PREFIX self[k]=v def __getattr__(self,k): return self[k] def sqlite_connect(*args, **kwargs): sqlite = import_sqlite() connection = sqlite.connect(*args, **kwargs) cursor = connection.cursor() return connection, cursor class DBServerInfo(object): 'picklable reference to a database server' def __init__(self, moduleName='MySQLdb', serverSideCursors=False, blockIterators=True, *args, **kwargs): try: self.__class__ = _DBServerModuleDict[moduleName] except KeyError: raise ValueError('Module name not found in _DBServerModuleDict: '\ + moduleName) self.moduleName = moduleName self.args = args # connection arguments self.kwargs = kwargs self.serverSideCursors = serverSideCursors self.custom_iter_keys = blockIterators if self.serverSideCursors and not self.custom_iter_keys: raise ValueError('serverSideCursors=True requires blockIterators=True!') def cursor(self): """returns cursor associated with the DB server info (reused)""" try: return self._cursor except AttributeError: self._start_connection() return self._cursor def new_cursor(self, arraysize=None): """returns a NEW cursor; you must close it yourself! """ if not hasattr(self, '_connection'): self._start_connection() cursor = self._connection.cursor() if arraysize is not None: cursor.arraysize = arraysize return cursor def close(self): """Close file containing this database""" self._cursor.close() self._connection.close() del self._cursor del self._connection def __getstate__(self): """return all picklable arguments""" return dict(args=self.args, kwargs=self.kwargs, moduleName=self.moduleName, serverSideCursors=self.serverSideCursors, custom_iter_keys=self.custom_iter_keys) class MySQLServerInfo(DBServerInfo): 'customized for MySQLdb SSCursor support via new_cursor()' _serverType = 'mysql' def _start_connection(self): self._connection,self._cursor = mysql_connect(*self.args, **self.kwargs) def new_cursor(self, arraysize=None): 'provide streaming cursor support' if not self.serverSideCursors: # use regular MySQLdb cursor return DBServerInfo.new_cursor(self, arraysize) try: conn = self._conn_sscursor except AttributeError: self._conn_sscursor,cursor = mysql_connect(useStreaming=True, *self.args, **self.kwargs) else: cursor = self._conn_sscursor.cursor() if arraysize is not None: cursor.arraysize = arraysize return cursor def close(self): DBServerInfo.close(self) try: self._conn_sscursor.close() del self._conn_sscursor except AttributeError: pass def iter_keys(self, db, cursor, map_f=iter, cache_f=lambda x:[t[0] for t in x], **kwargs): block_iterator = BlockIterator(db, cursor, **kwargs) try: cache_f = block_iterator.cache_f except AttributeError: pass return db.generic_iterator(cursor=cursor, cache_f=cache_f, map_f=map_f, fetch_f=block_iterator) class CursorCloser(object): """container for ensuring cursor.close() is called, when this obj deleted. For Python 2.5+, we could replace this with a try... finally clause in a generator function such as generic_iterator(); see PEP 342 or What's New in Python 2.5. """ def __init__(self, cursor): self.cursor = cursor def __del__(self): self.cursor.close() class BlockIterator(CursorCloser): 'workaround for MySQLdb iteration horrible performance' def __init__(self, db, cursor, selectCols, whereClause='', **kwargs): self.db = db self.cursor = cursor self.selectCols = selectCols self.kwargs = kwargs self.whereClause = '' if kwargs['orderBy']: # use iterSQL/iterColumns for WHERE / SELECT self.whereSQL = db.iterSQL if selectCols == '*': # extracting all columns self.whereParams = [db.data[col] for col in db.iterColumns] else: # selectCols is single column iterColumns = list(db.iterColumns) try: # if selectCols in db.iterColumns, just use that i = iterColumns.index(selectCols) except ValueError: # have to append selectCols i = len(db.iterColumns) iterColumns += [selectCols] self.selectCols = ','.join(iterColumns) self.whereParams = range(len(db.iterColumns)) if i > 0: # need to extract desired column self.cache_f = lambda x:[t[i] for t in x] else: # just use primary key self.whereSQL = 'WHERE %s>%%s' % self.db.primary_key self.whereParams = (db.data['id'],) self.params = () self.done = False def __call__(self): 'get the next block of data' if self.done: return () self.db._select(self.whereClause, self.params, cursor=self.cursor, limit='LIMIT %s' % self.cursor.arraysize, selectCols=self.selectCols, **(self.kwargs)) rows = self.cursor.fetchall() if len(rows) < self.cursor.arraysize: # iteration complete self.done = True return rows lastrow = rows[-1] # extract params from the last row in this block if len(lastrow) > 1: self.params = [lastrow[icol] for icol in self.whereParams] else: self.params = lastrow self.whereClause = self.whereSQL return rows class SQLiteServerInfo(DBServerInfo): """picklable reference to a sqlite database""" _serverType = 'sqlite' def __init__(self, database, *args, **kwargs): """Takes same arguments as sqlite3.connect()""" DBServerInfo.__init__(self, 'sqlite3', # save abs path! database=SourceFileName(database), *args, **kwargs) def _start_connection(self): self._connection,self._cursor = sqlite_connect(*self.args, **self.kwargs) def __getstate__(self): database = self.kwargs.get('database', False) or self.args[0] if database == ':memory:': raise ValueError('SQLite in-memory database is not picklable!') return DBServerInfo.__getstate__(self) # list of DBServerInfo subclasses for different modules _DBServerModuleDict = dict(MySQLdb=MySQLServerInfo, sqlite3=SQLiteServerInfo) class MapView(object, UserDict.DictMixin): 'general purpose 1:1 mapping defined by any SQL query' def __init__(self, sourceDB, targetDB, viewSQL, cursor=None, serverInfo=None, inverseSQL=None, **kwargs): self.sourceDB = sourceDB self.targetDB = targetDB self.viewSQL = viewSQL self.inverseSQL = inverseSQL if cursor is None: if serverInfo is not None: # get cursor from serverInfo cursor = serverInfo.cursor() else: try: # can we get it from our other db? serverInfo = sourceDB.serverInfo except AttributeError: raise ValueError('you must provide serverInfo or cursor!') else: cursor = serverInfo.cursor() self.cursor = cursor self.serverInfo = serverInfo self.get_sql_format(False) # get sql formatter for this db interface _schemaModuleDict = _schemaModuleDict # default module list get_sql_format = get_table_schema def __getitem__(self, k): if not hasattr(k,'db') or k.db is not self.sourceDB: raise KeyError('object is not in the sourceDB bound to this map!') sql,params = self._format_query(self.viewSQL, (k.id,)) self.cursor.execute(sql, params) # formatted for this db interface t = self.cursor.fetchmany(2) # get at most two rows if len(t) != 1: raise KeyError('%s not found in MapView, or not unique' % str(k)) return self.targetDB[t[0][0]] # get the corresponding object _pickleAttrs = dict(sourceDB=0, targetDB=0, viewSQL=0, serverInfo=0, inverseSQL=0) __getstate__ = standard_getstate __setstate__ = standard_setstate __setitem__ = __delitem__ = clear = pop = popitem = update = \ setdefault = read_only_error def __iter__(self): 'only yield sourceDB items that are actually in this mapping!' for k in self.sourceDB.itervalues(): try: self[k] yield k except KeyError: pass def keys(self): return [k for k in self] # don't use list(self); causes infinite loop! def __invert__(self): try: return self._inverse except AttributeError: if self.inverseSQL is None: raise ValueError('this MapView has no inverseSQL!') self._inverse = self.__class__(self.targetDB, self.sourceDB, self.inverseSQL, self.cursor, serverInfo=self.serverInfo, inverseSQL=self.viewSQL) self._inverse._inverse = self return self._inverse class GraphViewEdgeDict(UserDict.DictMixin): 'edge dictionary for GraphView: just pre-loaded on init' def __init__(self, g, k): self.g = g self.k = k sql,params = self.g._format_query(self.g.viewSQL, (k.id,)) self.g.cursor.execute(sql, params) # run the query l = self.g.cursor.fetchall() # get results if len(l) <= 0: raise KeyError('key %s not in GraphView' % k.id) self.targets = [t[0] for t in l] # preserve order of the results d = {} # also keep targetID:edgeID mapping if self.g.edgeDB is not None: # save with edge info for t in l: d[t[0]] = t[1] else: for t in l: d[t[0]] = None self.targetDict = d def __len__(self): return len(self.targets) def __iter__(self): for k in self.targets: yield self.g.targetDB[k] def keys(self): return list(self) def iteritems(self): if self.g.edgeDB is not None: # save with edge info for k in self.targets: yield (self.g.targetDB[k], self.g.edgeDB[self.targetDict[k]]) else: # just save the list of targets, no edge info for k in self.targets: yield (self.g.targetDB[k], None) def __getitem__(self, o, exitIfFound=False): 'for the specified target object, return its associated edge object' try: if o.db is not self.g.targetDB: raise KeyError('key is not part of targetDB!') edgeID = self.targetDict[o.id] except AttributeError: raise KeyError('key has no id or db attribute?!') if exitIfFound: return if self.g.edgeDB is not None: # return the edge object return self.g.edgeDB[edgeID] else: # no edge info return None def __contains__(self, o): try: self.__getitem__(o, True) # raise KeyError if not found return True except KeyError: return False __setitem__ = __delitem__ = clear = pop = popitem = update = \ setdefault = read_only_error class GraphView(MapView): 'general purpose graph interface defined by any SQL query' def __init__(self, sourceDB, targetDB, viewSQL, cursor=None, edgeDB=None, **kwargs): 'if edgeDB not None, viewSQL query must return (targetID,edgeID) tuples' self.edgeDB = edgeDB MapView.__init__(self, sourceDB, targetDB, viewSQL, cursor, **kwargs) def __getitem__(self, k): if not hasattr(k,'db') or k.db is not self.sourceDB: raise KeyError('object is not in the sourceDB bound to this map!') return GraphViewEdgeDict(self, k) _pickleAttrs = MapView._pickleAttrs.copy() _pickleAttrs.update(dict(edgeDB=0)) # @CTB move to sqlgraph.py? class SQLSequence(SQLRow, SequenceBase): """Transparent access to a DB row representing a sequence. Use attrAlias dict to rename 'length' to something else. """ def _init_subclass(cls, db, **kwargs): db.seqInfoDict = db # db will act as its own seqInfoDict SQLRow._init_subclass(db=db, **kwargs) _init_subclass = classmethod(_init_subclass) def __init__(self, id): SQLRow.__init__(self, id) SequenceBase.__init__(self) def __len__(self): return self.length def strslice(self,start,end): "Efficient access to slice of a sequence, useful for huge contigs" return self._select('%%(SUBSTRING)s(%s %%(SUBSTR_FROM)s %d %%(SUBSTR_FOR)s %d)' %(self.db._attrSQL('seq'),start+1,end-start)) class DNASQLSequence(SQLSequence): _seqtype=DNA_SEQTYPE class RNASQLSequence(SQLSequence): _seqtype=RNA_SEQTYPE class ProteinSQLSequence(SQLSequence): _seqtype=PROTEIN_SEQTYPE PKŒ.;}óŽp˜æ˜æpygr/sqlgraph.pyc;ò ɪJc @södklZdkTdklZlZlZlZdkZdk l Z l Z l Z l Z lZlZlZlZlZlZlZlZdkZdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZ defd„ƒYZ!d„Z"d„Z#d„Z$defd„ƒYZ%d„Z&de%fd„ƒYZ'e'e%_(defd„ƒYZ)de)fd„ƒYZ*e*e)_+defd„ƒYZ,de,fd „ƒYZ-e-e,_(d!„Z.e/d"„Z0e/e/e1d#„Z2e3d$d%d&d'd(d(d)d*d+d,d-d.ƒZ4e5d/„Z6e3d$d0d&d1d(d2d)d3d+d4d-d4ƒZ7d5„Z8e5d6„Z9d7efd8„ƒYZ:e5d9„Z;hd:e6<d;e9<d<e9„ƒYZ>d2e/d?„Z?e/d2e@d@„e/dA„ZAdBe>fdC„ƒYZBd2dD„ZCdEeBfdF„ƒYZDdGefdH„ƒYZEdIe>fdJ„ƒYZFeFe,_GdKe>fdL„ƒYZHdMeHfdN„ƒYZIdOefdP„ƒYZJdQeJfdR„ƒYZKeKeJ_LdSefdT„ƒYZMhdUdVdWdXfdY„ZNdZeHfd[„ƒYZOd\eOfd]„ƒYZPePeO_Qd^e3fd_„ƒYZRd`efda„ƒYZSdbefdc„ƒYZTddeTfde„ƒYZUeUeT_QdfeTfdg„ƒYZVdhefdi„ƒYZWdje3fdk„ƒYZXdleei=fdm„ƒYZYdn„ZZe/do„Z[dp„Z\dqZ]dr„Z^hei_ds<ei`dU<eiadtbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__scCs|i|iSdS(N(sobjs_datasselfsicol(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__scCstdƒ‚dS(Nsthis database is read-only!(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleDescriptors   sTupleIDDescriptorcBstZd„ZRS(NcCstdƒ‚dS(NsGYou cannot change obj.id directly. Instead, use db[newID] = obj(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__s(s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleIDDescriptorssTupleDescriptorRWcBs tZdZd„Zd„ZRS(s'read-write interface to named attributecCs5||_|i||_|i|dtƒ|_dS(Ns sqlColumn(sattrsselfsdbsdatasicols_attrSQLsTruesattrSQL(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__!s cCs3|ii|i|i|ƒ|i|i|ƒdS(N( sobjsdbs_updatesidsselfsattrSQLsvals save_localsattr(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__%s(s__name__s __module__s__doc__s__init__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleDescriptorRWs  s SQLDescriptorcBs)tZdZd„Zd„Zd„ZRS(s/return attribute value by querying the databasecCs|i|ƒ|_dS(N(sdbs_attrSQLsattrsselfs selectSQL(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__+scCs|i|iƒSdS(N(sobjs_selectsselfs selectSQL(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__-scCstdƒ‚dS(Nsthis database is read-only!(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__/s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLDescriptor)s   sSQLDescriptorRWcBstZdZd„ZRS(s7writeable proxy to corresponding column in the databasecCs |ii|i|i|ƒdS(N(sobjsdbs_updatesidsselfs selectSQLsval(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__4s(s__name__s __module__s__doc__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLDescriptorRW2s sReadOnlyDescriptorcBs)tZdZd„Zd„Zd„ZRS(s/enforce read-only policy, e.g. for ID attributecCsd||_dS(Ns_(sattrsself(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__9scCst||iƒSdS(N(sgetattrsobjsselfsattr(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__;scCstd|iƒ‚dS(Nsattribute %s is read-only!(sAttributeErrorsselfsattr(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__=s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysReadOnlyDescriptor7s   cCs´|iid||ii|iif|ifƒ\}}|ii i ||ƒ|ii i dƒ}t |ƒdjo,td|iit|iƒ|fƒ‚n|ddSdS(s4return value from SQL expression applied to this rows&select %s from %s where %s=%%s limit 2iis"%s[%s].%s not found, or not uniqueiN(srowsdbs _format_queryswhatsnames primary_keysidssqlsparamsscursorsexecutes fetchmanystslensKeyErrorsstr(srowswhatsparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect_from_rowAs%,cCs­x¦|iD]›}|djo#t|||i||ƒƒq ny|i|dtƒWn/tj o#t|||i ||ƒƒq Xt|||i ||ƒƒq WdS(s!add descriptors for db attributessids columnNumberN( sdbsdatasattrssetattrsclss _idDescriptors_attrSQLsTruesAttributeErrors_sqlDescriptors_columnDescriptor(sclssdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinit_row_subclassMs  !cCs|iiiƒSdS(s+get list of column names as our attributes N(sselfsdbsdataskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysdir_rowZssTupleOcBsAtZdZeZeZeZe e ƒZ e Z eZd„ZRS(sæProvides attribute interface to a database tuple. Storing the data as a tuple instead of a standard Python object (which is stored using __dict__) uses about five-fold less memory and is also much faster (the tuples returned from the DB API fetch are simply referenced by the TupleO, with no need to copy their individual values into __dict__). This class follows the 'subclass binding' pattern, which means that instead of using __getattr__ to process all attribute requests (which is un-modular and leads to all sorts of trouble), we follow Python's new model for customizing attribute access, namely Descriptors. We use classutil.get_bound_subclass() to automatically create a subclass of this class, calling its _init_subclass() class method to add all the descriptors needed for the database table to which it is bound. See the Pygr Developer Guide section of the docs for a complete discussion of the subclass binding pattern.cCs ||_dS(N(sdatasselfs_data(sselfsdata((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__xs(s__name__s __module__s__doc__sTupleDescriptors_columnDescriptorsTupleIDDescriptors _idDescriptors SQLDescriptors_sqlDescriptors classmethodsinit_row_subclasss_init_subclasssselect_from_rows_selectsdir_rows__dir__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleO^s  cKsT|ii|ƒy|d}Wn"tj o|iiƒ}nX|i|ƒdS(s0insert tuple into db and cache its rowID on selfsidN( sselfsdbs_insertslskwargssrowIDsKeyErrors get_insert_idscache_id(sselfslskwargssrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinsert_and_cache_id{ssTupleORWcBs8tZdZeZeZed„Zd„Zd„Z RS(sread-write version of TupleOcKsE| o||_dSn|ii|ƒ|_|i|i|dS(N(snewRowsdatasselfs_datasdbstuple_from_dictskwargssinsert_and_cache_id(sselfsdatasnewRowskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ˆs  cCs|id|ƒdS(Nsid(sselfs save_localsrow_id(sselfsrow_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscache_idŽscCsW|i|}y||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys save_locals  ( s__name__s __module__s__doc__sTupleDescriptorRWs_columnDescriptorsinsert_and_cache_idsFalses__init__scache_ids save_local(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleORW„s   sColumnDescriptorcBs,tZdZed„Zd„Zd„ZRS(sDread-write interface to column in a database, cached in obj.__dict__cCsE||_|i|dtƒ|_||_|o|i|_ndS(Ns sqlColumn( sattrsselfsdbs_attrSQLsTruescolsreadOnlys_readOnlyClasss __class__(sselfsdbsattrsreadOnly((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__œs   cCsÎy|i|iSWnµtj o©|i|iijo t‚n|ii d|ii|i f|iƒ|ii i ƒ}t|ƒdjotdƒ‚n|dd|i|i<|ddSnXdS(Ns where %s=%%sisdb row not found or not unique!i(sobjs__dict__sselfsattrsKeyErrorscolsdbs primary_keysAttributeErrors_selectsidscursorsfetchallslslen(sselfsobjsobjtypesl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__¢s )cCsEt|dƒ o |ii|i|i|ƒn||i|i build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__®s (s__name__s __module__s__doc__sFalses__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysColumnDescriptoršs   sReadOnlyColumnDesccBstZd„ZRS(NcCstdƒ‚dS(Ns-The ID of a database object is not writeable.(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__¼s(s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysReadOnlyColumnDesc»ssSQLRowcBs?tZdZeZZeZee ƒZ e Z e Zd„ZRS(s·Provide transparent interface to a row in the database: attribute access will be mapped to SELECT of the appropriate column, but data is not cached on this object. cCs ||_dS(N(srowIDsselfs_id(sselfsrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Ìs(s__name__s __module__s__doc__s SQLDescriptors_columnDescriptors_sqlDescriptorsReadOnlyDescriptors _idDescriptors classmethodsinit_row_subclasss_init_subclasssselect_from_rows_selectsdir_rows__dir__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLRowÂs   sSQLRowRWcBs/tZdZeZeZed„Zd„ZRS(sread-write version of SQLRowcKs?| o|i|ƒSn|ii|ƒ}|i||dS(N( snewRowsselfscache_idsrowIDsdbstuple_from_dictskwargsslsinsert_and_cache_id(sselfsrowIDsnewRowskwargssl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ÔscCs ||_dS(N(srowIDsselfs_id(sselfsrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscache_idÙs( s__name__s __module__s__doc__sSQLDescriptorRWs_columnDescriptorsinsert_and_cache_idsFalses__init__scache_id(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLRowRWÐs  cCsTh}xCt|ƒD]5\}}y||||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys list_to_dictàs  cKs–|tj of|iƒ}t|ƒdjoC|d}dddf}|iƒ}|it ||dƒƒqsnt |}||i ƒ|fSdS(s¶get table name and cursor by parsing name or using configFile. If neither provided, will try to get via your MySQL config file. If connect is None, will use MySQLdb.connect()iishostsuserspasswdN( snamesNonessplitsargListslensargnamesskwargsscopysupdates list_to_dicts DBServerInfos serverInfoscursor(snameskwargssargnamess serverInfosargList((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_name_cursorës    " c Ks|iƒ}d|jo |tjo tiƒ} | ddfjoÇg}y-t i d} || df| dfg7}Wnt j onXyAt i d} || t iidf| t iidfg7}Wnt j onXt|ƒdjot|Œ}q-q1t iit iid ƒd ƒ}n|pt iit iƒd ƒ}|ot ii|ƒo||d ydkl}|i|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys mysql_connectùsH     4%"         sIGNOREsignoresREPLACEsreplacesAUTO_INCREMENTs SUBSTRINGs substrings SUBSTR_FROMsFROMs SUBSTR_FORsFORcCs™dk}t|itƒ|_| odSn|iƒ|ii d|i ƒ|ii ƒ}|ii d|i ƒxt |ƒD]\}}|d}|ii|ƒ|ddjoŽ|itjo ||_n=y|ii|ƒWn%tj o|i|g|_nX|dd iƒdjo t|_qit|_n#|dd jo||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysmysql_table_schema)s6       s or ignoresinsert or replacesssubstrs,cCs8y dk}Wn tj odkl}nX|SdS(sIimport sqlite3 (for Python 2.5+) or pysqlite2 for earlier Python versionsN(sdbapi2(ssqlite3ssqlites ImportErrors pysqlite2sdbapi2(ssqlite((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys import_sqliteKs  c Csxtƒ}t|itƒ|_| odSn|iƒ|i i d|i ƒ|i i ƒ} |i i d|i ƒx\t| ƒD]N\} }|d}|ii|ƒ|i i| |i|<|d|i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssqlite_table_schemaSsL     ! %. s SQLFormatDictc BsStZdZeddddddddddƒZhd „Zd „Zd „ZRS( sGPerform SQL keyword replacements for maintaining compatibility across a wide range of SQL backends. Uses Python dict-based string format function to do simple string replacements, and also to convert params list to the paramstyle required for this interface. Create by passing a dict of macros and the db-api paramstyle: sfd = SQLFormatDict("qmark", substitutionDict) Then transform queries+params as follows; input should be "format" style: sql,params = sfd("select * from foo where id=%s and val=%s", (myID,myVal)) cursor.execute(sql, params) spyformats%%(%d)ssnumerics:%dsnamedsqmarks(ignore)sformatcCs„|iƒ|_||_|i||_|djp |dj|_|djod|idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Šs   cCsmy|i|SWntj onX|djo'|i|i}|id7_|Sntd|ƒ‚dS(s1apply correct substitution for this SQL interfaces?isunknown macro: %sN(sselfssubstitutionDictsksKeyErrors paramFormatsiparamss(sselfskss((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__“s cCs‚d|_|iddƒ}||}|ioEh}x.t|ƒD] \}}||t |dƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__call__žs    (s__name__s __module__s__doc__sdicts _paramFormatss__init__s __getitem__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLFormatDict|s  cCs}y|iii}Wntj otdƒ‚nXy|i|}Wn#t j ot d|ƒ‚nX|||ƒdS(sCrun the right schema function based on type of db server connections'no cursor object or module information!s„unknown db module: %s. Use _schemaModuleDict attribute to supply a method for obtaining table schema for this moduleN( sselfscursors __class__s __module__smodnamesAttributeErrors ValueErrors_schemaModuleDicts schema_funcsKeyErrors analyzeSchema(sselfs analyzeSchemasmodnames schema_func((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_table_schema«ssMySQLdb.cursorsspysqlite2.dbapi2ssqlite3s SQLTableBasecBsÙtZdZeZeZeeeeeeedeeeeeeeed„Zd„Z d„Z d„Z e ddddd dd dd dd dd dddddddddƒ Z eZd„Zd„Zd„Zeed„Zed„Zed„Zdfdeddd„Zeedd„Zd„Zd„Zd„Zd„Zed „Zd!„Zd"„Zd#„Zeeee ed$„Z!d%„Z"d&„Z#d'„Z$d(„Z%d)„Z&d*„Z'd+„Z(d,„Z)RS(-sAStore information about an SQL table as dict keyed by primary keyicKsô| ot| ƒ|_n h|_| |_||_|o| o | idjo:|o|o||f\|_|_qt dƒ‚n||_ |t jo9| t j o| i ƒ}qòt ||\}}} ntidtddƒ||_ |t j oR| o|id|ƒn|itƒ|i|fƒ\}}|i|ƒn||_|t j o ||_n|t j o ||_n| t j o| |_| |_n|iƒh|_x*t|i ƒD]\}}||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Âsj                              cCs%|iddƒ|iiƒdSdS(Ns selectColsscount(*)i(sselfs_selectscursorsfetchone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__scCst|ƒSdS(N(sidsself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__hash__scCs2||jodSntt|ƒt|ƒƒSdS(sonly match self and no other!iN(sselfsotherscmpsid(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__cmp__s snameis clusterKeysmaxCaches arraysizes attrAliass serverInfosautoGCsorderBys writeablesiterSQLs iterColumnscCs|i|dS(N(sselfs__init__sstate(sselfsstate((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setstate__scCsd|idSdS(Ns (sselfsname(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__repr__scCs:h|_g|_h|_t|_t|_h|_dS(s+reset all schema information for this tableN(sselfs descriptions columnNames columnTypesNones usesIntIDs primary_keysindexed(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clear_schemas     cCsfy|i|}Wn,tj o td||ifƒ‚nX|oty|i|SWq»t j oRy|i|i|SWq·tt fj o td||ifƒ‚q·Xq»Xn|oey |dSWq't j oFy|i|dSWq#tt fj ot d|ƒ‚q#Xq'Xnt |t iƒo |}n|djo |i}n|SdS(s=Translate python attribute name to appropriate SQL expressions.attribute %s not a valid column or alias in %ss0attribute %s does not map to an SQL column in %sis*attribute %s does not map to a SQL column!sidN(sselfsdatasattrsfieldsKeyErrorsAttributeErrorsnames sqlColumns columnNames TypeErrors columnNumbers ValueErrors isinstancestypess StringTypes primary_key(sselfsattrs sqlColumns columnNumbersfield((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_attrSQL$s4'    cKsž|o|ii|ƒnx||iƒD]n\}}y|i|dt ‚Wq(t j o|i||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasAs  cCs³|tj o ||_n|io|ii|_nt|d|idtd|ƒƒ}t |t ƒo|i |_ nt |dƒot||iƒ o|i|_ndS(sPCreate class representing a row in this table by subclassing oclass, adding datas itemClasss subclassArgssdbs _tableclassN(soclasssNonesselfs itemClasss writeables_RWClasssget_bound_subclasssnamesdicts issubclasssTupleOsdatas_attrcolshasattrs isinstances _tableclasss __class__(sselfsoclass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysobjclassTs   $sst1.*cCsf|id||i|||f|ƒ\}}|t jo|i i ||ƒn|i ||ƒdS(s,execute the specified query but do not fetchsselect %s from %s t1 %s %s %sN( sselfs _format_querys selectColssnames whereClausesorderByslimitsparamsssqlscursorsNonesexecute(sselfs whereClausesparamss selectColsscursorsorderByslimitssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_select`s  ccsa|tjo |i}n|i|||ƒ|ii ƒ}x|D]}|i ||ƒVqCWdS(s=Generate the list of objects that satisfy the database SELECTN( soclasssNonesselfs itemClasss_selects whereClausesparamss selectColsscursorsfetchallslsts cacheItem(sselfs whereClausesparamssoclasss selectColsslst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselectjs  cKsœg}g}xl|iƒD]^\}}|tjo|id|i |ƒƒq|id|i |ƒƒ|i|ƒqW|i ddi |ƒ|ƒSdS(sDquery for intersection of all specified kwargs, returned as iterators %s IS NULLs%s=%%sswhere s and N( scriteriasparamsskwargssitemssksvsNonesappendsselfs_attrSQLsselectsjoin(sselfskwargsscriteriasparamssvsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysqueryrs  cCsH|id|i||if||fƒ\}}|i i ||ƒdS(sAupdate a single field in the specified row to the specified values!update %s set %s=%%s where %s=%%sN( sselfs _format_querysnamescols primary_keysvalsrow_idssqlsparamsscursorsexecute(sselfsrow_idscolsvalsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_update}scCsCy||idSWn)tj o||i|idSnXdS(Nsid(stsselfsdatas TypeError(sselfst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetIDƒscCsyy|i|ƒ}Wntj o||ƒSnXy|i|SWntj onX||ƒ}||i|<|SdS(s7get obj from cache if possible, or construct from tupleN(sselfsgetIDstsidsKeyErrorsoclasss_weakValueDictso(sselfstsoclasssosid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys cacheItemˆs  ccs?|tjo |i}nx|D]}|i||ƒVq!WdS(N(soclasssNonesselfs itemClasssrowssts cacheItem(sselfsrowssoclassst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys cache_items•s   cCs|id||fƒSdS(s9get iterator for objects with specified foreign key values where %s=%%sN(sselfsselectsattrsk(sselfsattrsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys foreignKeyšscCsHy.|it|iƒjo|iiƒnWntj onXdS(s"APPLY maxCache LIMIT TO CACHE SIZEN(sselfsmaxCacheslens_weakValueDictsclearsAttributeError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys limit_caches cCs;y|ii}Wntj o tSnX||iƒSdS(s4Return a new cursor object, or None if not possible N(sselfs serverInfos new_cursorsAttributeErrorsNones arraysize(sselfs new_cursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_new_cursor¥s  ccs°|tjo*|tjo|ii}q7|i}n|tjo |i}nxXtoP|iƒ|ƒ}t |ƒdjoPnx|||ƒƒD] }|Vq™WqTWdS(sgeneric iterator that runs fetch, cache and map functions. cursorHolder is used only to keep a ref in this function's locals, so that if it is prematurely terminated (by deleting its iterator), cursorHolder.__del__() will close the cursor.iN( sfetch_fsNonescursorsselfs fetchmanyscache_fs cache_itemssTrues limit_cachesrowsslensmap_fsv(sselfscursorsfetch_fscache_fsmap_fs cursorHoldersrowssv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgeneric_iterator­s        cCsltgt|iƒ}xK|iiƒD]:\}}y||||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pystuple_from_dictÁs  cCsqtgt|iƒ}xP|iiƒD]?\}}yt ||ƒ||transform object attributes into tuple for storing in databaseN( sNoneslensselfs descriptionslsdatasitemsscolsicolsgetattrsobjsAttributeErrors TypeError(sselfsobjslsicolscol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pystuple_from_objÊs  cCs^d|iddidgt|ƒƒd}|i||ƒ\}}|i i ||ƒdS(sxinsert tuple into the database. Note this uses the MySQL extension REPLACE, which overwrites any duplicate key.s%(REPLACE)s into s values (s,s%ss)N( sselfsnamesjoinslenslsss _format_queryssqlsparamsscursorsexecute(sselfslsssparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_insertÓs/cCs |i|ƒ}|i|ƒdS(s5insert new row by transforming obj to tuple of valuesN(sselfstuple_from_objsobjsls_insert(sselfsobjsl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinsertÚscCsWy|ii}Wntj otdƒ‚nX|tjotdƒ‚n|SdS(s-get the primary key value for the last INSERTs your db lacks lastrowid support?s/lastrowid is None so cannot get ID from INSERT!N(sselfscursors lastrowidsauto_idsAttributeErrorsNotImplementedErrorsNones ValueError(sselfsauto_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys get_insert_idÞs cKsK|i otdƒ‚n|itdt|}||i|i <|SdS(s=return a new record with the assigned attributes, added to DBsthis database is read only!snewRowN( sselfs writeables ValueErrors itemClasssNonesTrueskwargssobjs_weakValueDictsid(sselfskwargssobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysnewçs  cCs|iiƒdS(sempty the cacheN(sselfs_weakValueDictsclear(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clear_cacheîscCs|i otdƒ‚n|id|i|if|fƒ\}}|i i ||ƒy|i |=Wnt j onXdS(Nsthis database is read only!sdelete from %s where %s=%%s( sselfs writeables ValueErrors _format_querysnames primary_keyskssqlsparamsscursorsexecutes_weakValueDictsKeyError(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__ñs (*s__name__s __module__s__doc__s_schemaModuleDictsget_table_schemasNonesFalsesTrues__init__s__len__s__hash__s__cmp__sdicts _pickleAttrssstandard_getstates __getstate__s __setstate__s__repr__s clear_schemas_attrSQLs addAttrAliassobjclasss_selectsselectsquerys_updatesgetIDs cacheItems cache_itemss foreignKeys limit_cachesget_new_cursorsitersgeneric_iteratorstuple_from_dictstuple_from_objs_insertsinserts get_insert_idsnews clear_caches __delitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLTableBase¾sH 9?                  cCsš|tjo |i}n|djo |itj o |i}n|iid||i|fƒgi }|ii ƒD]}||dƒq{~SdS(s#uses db select; does not force loadssselect %s from %s %siN( s selectColssNonesselfs primary_keys queryOptionsorderByscursorsexecutesnamesappends_[1]sfetchallst(sselfs queryOptions selectColss_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetKeysüs    cCs)gi}|D]}||dƒq~S(Ni(sappends_[1]sxst(sxs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssc Ks&|tjo |i}n|djo |itj o |i}n|iƒ}|ot|idƒo |ii o2|ii ||d|d|d|d||Sq"|id|d|d|||id|d|d|dt|ƒƒSn/|tj ot|ƒƒSnt|iƒƒSd S( s8guarantee correct iteration insulated from other queriesss iter_keyss selectColssmap_fsorderByscache_fscursors cursorHolderN(s selectColssNonesselfs primary_keysorderBysget_new_cursorscursorshasattrs serverInfoscustom_iter_keyss iter_keyssmap_fscache_fskwargss_selectsgeneric_iterators CursorClosersget_fsiterskeys(sselfs selectColssorderBysmap_fscache_fsget_fskwargsscursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iter_keyss&        sSQLTablecBsbtZdZeZeZeZe d„Z d„Z d„Z d„Z d„Zd„Zd„ZRS(sNProvide on-the-fly access to rows in the database, caching the results in dictcCs˜y |iSWntj onX|tjo |i}n|iid|iƒ|ii ƒ}h|_ x|D]}|i ||ƒqqWt|_dS(sLoad all data from the tablesselect * from %sN(sselfs _isLoadedsAttributeErrorsoclasssNones itemClassscursorsexecutesnamesfetchallsls_weakValueDictsts cacheItemsTrue(sselfsoclassslst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysload&s    cCsÐy|i|SWnºtj o®|id|i|if|fƒ\}}|i i ||ƒ|i i dƒ}t |ƒdjo#tdt|ƒ|ifƒ‚n|iƒ|i|d|iƒSnXdS(Ns%select * from %s where %s=%%s limit 2iis!%s not found in %s, or not uniquei(sselfs_weakValueDictsksKeyErrors _format_querysnames primary_keyssqlsparamsscursorsexecutes fetchmanyslslensstrs limit_caches cacheItems itemClass(sselfskslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__5s# cCsÊ|i otdƒ‚ny|i|j o t‚nWntj otdƒ‚nXy$|i}|tjo t‚nWntj on X||i=|i |ƒ|i |ƒ||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__As"      cCs=|iƒgi}|D]}||||fƒq~SdS(s'forces load of entire table into memoryN(sselfsloadsappends_[1]sk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsTs c Cs)t|dddtdtd|iƒSdS(sAuses arraysize / maxCache and fetchmany() to manage data transfers selectColss*scache_fsmap_fsget_fN(s iter_keyssselfsNonesgenerate_itemssitems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsXscCs7|iƒgi}|D]}|||ƒq~SdS(s'forces load of entire table into memoryN(sselfsloadsappends_[1]sk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvalues\s cCs#t|dddtd|iƒSdS(sAuses arraysize / maxCache and fetchmany() to manage data transfers selectColss*scache_fsget_fN(s iter_keyssselfsNonesvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervalues`s(s__name__s __module__s__doc__sTupleOs itemClasssgetKeysskeyss iter_keyss__iter__sNonesloads __getitem__s __setitem__sitemss iteritemssvaluess itervalues(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTable!s      cCsY|iid|i|i|fƒgi}|iiƒD]}||dƒq:~SdS(s#uses db select; does not force loadsselect distinct %s from %s %siN( sselfscursorsexecutes clusterKeysnames queryOptionsappends_[1]sfetchallst(sselfs queryOptions_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetClusterKeysds#sSQLTableClusteredcBs2tZdZd„Zd„Zd„Zd„ZRS(s{use clusterKey to load a whole cluster of rows at once, specifically, all rows that share the same clusterKey value.cOs€|iƒ}t|d%%s or (%s=%%s and %s>%%s)( skwargsscopysFalsesSQLTables__init__sselfsargssorderBys clusterKeys primary_keys iterColumnssiterSQL(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ns   cCst|d|iƒSdS(Ns order by %s(sgetClusterKeyssselfs clusterKey(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clusterkeysyscCsÁy|i|SWn«tj oŸ|id|i|i|i|i|if|fƒ\}}|i i ||ƒ|i i ƒ}|iƒx!|D]}|i||iƒqW|i|SnXdS(Ns<select t2.* from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s(sselfs_weakValueDictsksKeyErrors _format_querysnames primary_keys clusterKeyssqlsparamsscursorsexecutesfetchallsls limit_cachests cacheItems itemClass(sselfskslsparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__{s+ cCs(|iƒ|id|i|fƒSdS(s1iterate over all items from the specified clusters where %s=%%sN(sselfs limit_cachesselects clusterKeys cluster_id(sselfs cluster_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iterclusterˆs (s__name__s __module__s__doc__s__init__s clusterkeyss __getitem__s itercluster(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableClusteredks   sSQLForeignRelationcBs tZdZd„Zd„ZRS(s7mapping based on matching a foreign key in an SQL tablecCs||_||_dS(N(stablesselfskeyName(sselfstableskeyName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s cCs~g}x7|iid|i|ifƒD]}|i|ƒq)Wt |ƒdjo#t dt |ƒ|i fƒ‚n|SdS(s3get list of objects o with getattr(o,keyName)==k.ids where %s=%%sis%s not found in %sN( slsselfstablesselectskeyNamesksidsosappendslensKeyErrorsstrsname(sselfskslso((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__’s##(s__name__s __module__s__doc__s__init__s __getitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLForeignRelations  sSQLTableNoCachecBsMtZdZeZeZeZd„Z d„Z d„Z d„Z d„Z RS(sÇProvide on-the-fly access to rows in the database; values are simply an object interface (SQLRow) to back-end db query. Row data are not stored locally, but always accessed by querying the dbcCs |dSdS(Ni(st(sselfst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetID£scCs)ti||||i|idƒƒSdS(Nsid(s SQLTableBasesselectsselfs whereClausesparamssoclasss_attrSQL(sselfs whereClausesparams((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect¤scCs¢y|i|SWnŒtj o€|id|i|f|iƒ|iidƒ}t |ƒdjotd|ƒ‚n|i |ƒ}||i|<|SnXdS(Ns where %s=%%siis id %s non-existent or not unique( sselfs_weakValueDictsksKeyErrors_selects primary_keyscursors fetchmanystslens itemClassso(sselfsksost((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__§s  cCsÚ|i otdƒ‚ny|i|j o t‚nWntj otdƒ‚nXy ||=Wntj onXy|i|i =Wntj onX|i |i |i |ƒ|i |ƒ||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__³s$   cKs|ii|ƒdS(N(sselfsdatasupdateskwargs(sselfskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasÆs(s__name__s __module__s__doc__sSQLRows itemClasssgetKeysskeyss iter_keyss__iter__sgetIDsselects __getitem__s __setitem__s addAttrAlias(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableNoCacheœs    sSQLTableMultiNoCachecBsGtZdZeZdZd„Zd„Zd„Zd„Z d„Z RS(sGTrivial on-the-fly access for table with key that returns multiple rowssidcOssti|||Ž|i|iƒ|_|i o<d|i|if|_d|i|_ |if|_ ndS(NsGROUP BY %s ORDER BY %ss WHERE %s>%%s( s SQLTableBases__init__sselfsargsskwargss_attrSQLs _distinct_keys distinct_keysorderBysiterSQLs iterColumns(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Ðs  cCst|d|iƒSdS(Ns selectCols(sgetKeyssselfs distinct_key(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysØscCst|d|iƒSdS(Ns selectCols(s iter_keyssselfs distinct_key(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__Úsccsx|id|i|i|iƒf|fƒ\}}|ii ||ƒ|ii ƒ}x|D]}|i |ƒVq]WdS(Nsselect * from %s where %s=%%s(sselfs _format_querysnames_attrSQLs _distinct_keysidssqlsparamsscursorsexecutesfetchallslsrows itemClass(sselfsidslsparamsssqlsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Üs"cKs|ii|ƒdS(N(sselfsdatasupdateskwargs(sselfskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasãs( s__name__s __module__s__doc__sTupleOs itemClasss _distinct_keys__init__skeyss__iter__s __getitem__s addAttrAlias(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableMultiNoCacheÌs     sSQLEdgescBsZtZdZdZeiiƒZeieddƒƒd„Z e Z d„Z d„Z RS(sfprovide iterator over edges as (source,target,edge) and getitem[edge] --> [(source,target),...]sedge_idsgraphic CsÍ|iid|idƒ|idƒ|idƒ|i|idƒ|idƒ|idƒfƒg}xZ|iiƒD]I\}}}|i |i i |ƒ|i i |ƒ|i i|ƒfƒqxW|SdS(Ns;select %s,%s,%s from %s where %s is not null order by %s,%ss source_ids target_idsedge_id(sselfscursorsexecutes_attrSQLsnameslsfetchalls source_ids target_idsedge_idsappendsgraphs unpack_sources unpack_targets unpack_edge(sselfs source_ids target_idslsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysîs b>cCst|iƒƒSdS(N(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__ûscCsÄ|id|idƒ|idƒ|i|i|iƒf|ii|ƒfƒ\}}|i i ||ƒg}xH|i i ƒD]7\}}|i|ii|ƒ|ii|ƒfƒqW|SdS(Ns!select %s,%s from %s where %s=%%ss source_ids target_id(sselfs _format_querys_attrSQLsnames _distinct_keysgraphs pack_edgesedgessqlsparamsscursorsexecuteslsfetchalls source_ids target_idsappends unpack_sources unpack_target(sselfsedges target_idslsparamsssqls source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ýs: /( s__name__s __module__s__doc__s _distinct_keysSQLTableMultiNoCaches _pickleAttrsscopysupdatesdictskeyss__call__s__iter__s __getitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesès   s SQLEdgeDictcBs’tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„ZeZRS(s)2nd level graph interface to SQL databasecCs³||_||_t|idƒ o‰|iid|ii|ii|iif|ifƒ\}}|ii i ||ƒt |ii i ƒƒdjot dƒ‚q¯ndS(NsallowMissingNodess&select %s from %s where %s=%%s limit 1isnode not in graph!(sfromNodesselfstableshasattrs _format_querys sourceSQLsnamessqlsparamsscursorsexecuteslensfetchallsKeyError(sselfsfromNodestablesparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s  +cCsè|iid|ii|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii idƒ}t|ƒdjotdƒ‚ny|ii|ddƒSWntj otdƒ‚nXdS(Ns1select %s from %s where %s=%%s and %s=%%s limit 2iis3either no edge from source to target or not unique!isno edge from node to target(sselfstables _format_querysedgeSQLsnames sourceSQLs targetSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutes fetchmanyslslensKeyErrors unpack_edges IndexError(sselfstargetslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__s4$cCs¶|iid|ii|i|ii|ƒ|ii|ƒfƒ\}}|ii i ||ƒt |idƒ p)t |idƒo|ii|iijo|i|7_ndS(Ns$replace into %s values (%%s,%%s,%%s)ssourceDBstargetDB(sselfstables _format_querysnamesfromNodes pack_targetstargets pack_edgesedgessqlsparamsscursorsexecuteshasattrssourceDBstargetDB(sselfstargetsedgesparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__+s 3@cCst||<|SdS(N(sNonesselfstarget(sselfstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__6s cCs|iid|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii i djotdƒ‚ndS(Ns&delete from %s where %s=%%s and %s=%%sisno edge from node to target(sselfstables _format_querysnames sourceSQLs targetSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutesrowcountsKeyError(sselfstargetsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__9s +$cCs||iid|ii|ii|ii|ii|iif|ifƒ\}}|ii i ||ƒ|ii i ƒSdS(Ns4select %s,%s from %s where %s=%%s and %s is not null( sselfstables _format_querys targetSQLsedgeSQLsnames sourceSQLsfromNodessqlsparamsscursorsexecutesfetchall(sselfsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysiterator_queryDs=cCsAgi}|iƒD]"\}}||ii|ƒƒq~SdS(N(sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_target(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysNscCsAgi}|iƒD]"\}}||ii|ƒƒq~SdS(N(sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesQscCsegi}|iƒD]F\}}||ii|iƒ|ii |ƒ|ii |ƒfƒq~SdS(N( sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_sourcesfromNodes unpack_targets unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysedgesTscCsSgi}|iƒD]4\}}||ii|ƒ|ii|ƒfƒq~SdS(N( sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_targets unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsXscCst|iƒƒSdS(N(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__[scCst|iƒƒSdS(N(sitersselfsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervalues\scCst|iƒƒSdS(N(sitersselfsitems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritems]scCst|iƒƒSdS(N(slensselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__^s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s__iadd__s __delitem__siterator_queryskeyssvaluessedgessitemss__iter__s itervaluess iteritemss__len__s graph_cmps__cmp__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLEdgeDict s           sSQLEdgelessDictcBs tZdZd„Zd„ZRS(s,for SQLGraph tables that lack edge_id columncCs®|iid|ii|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii i dƒ}t|ƒdjotdƒ‚ntSdS(Ns1select %s from %s where %s=%%s and %s=%%s limit 2iis3either no edge from source to target or not unique!(sselfstables _format_querys targetSQLsnames sourceSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutes fetchmanyslslensKeyErrorsNone(sselfstargetslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ds4$cCsž|iid|ii|ii|ii|iif|ifƒ\}}|ii i ||ƒgi }|ii i ƒD]}||dtfƒqy~SdS(Ns1select %s from %s where %s=%%s and %s is not nulli(sselfstables _format_querys targetSQLsnames sourceSQLsfromNodessqlsparamsscursorsexecutesappends_[1]sfetchallstsNone(sselfs_[1]sparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysiterator_queryqs4(s__name__s __module__s__doc__s __getitem__siterator_query(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgelessDictbs  sSQLGraphEdgeDescriptorcBstZdZd„ZRS(s'provide an SQLEdges interface on demandcCsey|iiƒ}Wn,tj o t|i|id|ƒSn!Xt|i|id|d|ƒSdS(Nsgraphs attrAlias(sobjs attrAliasscopysAttributeErrorsSQLEdgessnamescursor(sselfsobjsobjtypes attrAlias((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__s (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphEdgeDescriptor}s sintssourcestargetsedgec KsÔg} xÃ|D]»}y||d} Wntj o|d} nXy"| i| ||dfƒw Wnttfj onXy)||d}|t jo t‚nWntj onÞXt |ƒ}y|iƒ}WnMtj oAy$| i| |i|ifƒw Wqžtj oqžXnrXt|tƒp t|tƒo| i| dfƒq n7t|tƒo| i| dfƒq n tdƒ‚| i| |fƒtid| |fƒq W| SdS(s=return list of [(colname,coltype),...] for source,target,edges_idsDBsints varchar(32)s(SQLGraph node / edge must be int or str!s/no type info found for %s, so using default: %sN(sls columnAttrssattrs attrAliassattrNamesKeyErrorsappends createTables TypeErrorskwargssdbsNonesitersitsnextsks StopIterations columnTypes primary_keysAttributeErrors isinstancesintslongsstrs ValueErrorsdefaultColumnTypesloggerswarn( s createTables attrAliassdefaultColumnTypes columnAttrsskwargssdbsitsattrskslsattrName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetColumnTypesˆsL     sSQLGraphc BsûtZdZdZeiiƒZeieddddddddƒƒe Z d„Z d„Z d „Z d „ZeZd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„ZeƒZeZd„ZeZee ƒƒe!e ƒƒRS(s¡provide a graph interface via a SQL table. Key capabilities are: - setitem with an empty dictionary: a dummy operation - getitem with a key that exists: return a placeholder - setitem with non empty placeholder: again a dummy operation EXAMPLE TABLE SCHEMA: create table mygraph (source_id int not null,target_id int,edge_id int, unique(source_id,target_id)); s source_idssourceDBistargetDBsedgeDBsallowMissingNodesc Osot|ddddddddd d f ƒ\}}d |joyt|}d ||d d |d d|dd |dd|dd |dd|d d |dd f |d build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Äs$-  m cCs|i|i|ƒ|ƒSdS(N(sselfs _edgeClasss pack_sourcesk(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ÚscCs“|id|i|i|if|i|ƒfƒ\}}|i i ||ƒ|id|i|i|ƒfƒ\}}|i i ||ƒ|SdS(Ns*delete from %s where %s=%%s and %s is nulls1insert %%(IGNORE)s into %s values (%%s,NULL,NULL)( sselfs _format_querysnames sourceSQLs targetSQLs pack_sourceskssqlsparamsscursorsexecute(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__ÜscCsr|id|i|if|i|ƒfƒ\}}|ii ||ƒ|ii djot dƒ‚n|SdS(Nsdelete from %s where %s=%%sisnode not found in graph( sselfs _format_querysnames sourceSQLs pack_sourceskssqlsparamsscursorsexecutesrowcountsKeyError(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__isub__ås cCsm|id|i|if|i|ƒfƒ\}}|ii ||ƒ|ii dƒ}t |ƒdjSdS(Ns%select * from %s where %s=%%s limit 1ii( sselfs _format_querysnames sourceSQLs pack_sourceskssqlsparamsscursorsexecutes fetchmanyslslen(sselfskslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__îs cCsžy |iSWnŒtj o€td|id|id|iƒ}|itjo |d=nt |i |i d|t |ƒ|_||i_|iSnXdS(s-get an interface to the inverse graph mappings source_ids target_idsedge_ids attrAliasN( sselfs_inversesAttributeErrorsdicts targetSQLs sourceSQLsedgeSQLs attrAliassNonesSQLGraphsnamescursorsgraph_db_inverse_refs(sselfs attrAlias((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__õs     ccs+x$ti|ƒD]}|i|ƒVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks unpack_source(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__sccs=x6ti|ƒD]%}|i|ƒ|i||ƒfVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks unpack_sources _edgeClass(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemssccs.x'ti|ƒD]}|i||ƒVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks _edgeClass(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervalues scCs;gi}ti|ƒD]}||i|ƒƒq~SdS(N(sappends_[1]sSQLTableMultiNoCacheskeyssselfsks unpack_source(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys scCst|iƒƒSdS(N(slistsselfs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesscCst|iƒƒSdS(N(slistsselfs iteritems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsscCs5|iid|i|ifƒ|iiƒdSdS(s#get number of source nodes in graphs!select count(distinct %s) from %siN(sselfscursorsexecutes sourceSQLsnamesfetchone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__s ("s__name__s __module__s__doc__s _distinct_keysSQLTableMultiNoCaches _pickleAttrsscopysupdatesdicts SQLEdgeDicts _edgeClasss__init__s __getitem__s__iadd__s__isub__s graph_setitems __setitem__s __contains__s __invert__s__iter__s iteritemss itervaluesskeyssvaluessitemssSQLGraphEdgeDescriptorsedgess update_graphs__len__s graph_cmps__cmp__soverride_rich_cmpslocalssadd_standard_packing_methods(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraph·s0 (              "s SQLIDGraphcBstZeeƒƒRS(N(s__name__s __module__sadd_trivial_packing_methodsslocals(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLIDGraph=ssSQLEdgeDictClusteredcBs tZdZd„Zd„ZRS(s:simple cache for 2nd level dictionary of target_id:edge_idcCs#||_||_ti|ƒdS(N(sgsselfsfromNodesdicts__init__(sselfsgsfromNode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Es  cCs2x'|D]\}}ti|||ƒqW|SdS(N(sls target_idsedge_idsdicts __setitem__sself(sselfsls target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__Is (s__name__s __module__s__doc__s__init__s__iadd__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgeDictClusteredCs  sSQLEdgesClusteredDescrcBstZd„ZRS(Nc Csžt|i|i|i|id|t|tƒ}x`|i i ƒD]O\}}|i gi }|i ƒD]\}}||||fƒqi~ƒqCW|SdS(Nsgraph(sSQLEdgesClusteredsobjstablesedge_ids source_ids target_idsgraph_db_inverse_refssTruesesds iteritemssloadsappends_[1]( sselfsobjsobjtypes_[1]sesds target_ids source_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__Os  G(s__name__s __module__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesClusteredDescrNssSQLGraphClusteredcBsÜtZdZeZddded„Zeddddddddddddd dƒZd „Z d „Z ee d „Z d „Z eƒZeZeeƒƒd„Zd„Zeddddgdeƒƒd„ZRS(sESQL graph with clustered caching -- loads an entire cluster at a times source_ids target_idsedge_idc Ks1dk}t||iƒo×|tjotdƒ‚nd|jo”tdt d|d|d|ƒ|}d||dd|dd |d d|d d |d d|d d |dd|d df |dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Zs   m     stableissourceDBstargetDBsedgeDBcCst|ƒ}h|d<|SdS(Nsd(sstandard_getstatesselfsstate(sselfsstate((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__ps  c Csêy|i|SWn*tj ot|dƒo‚q<nX|iid|i|i|i |ii |ii |i|ii |ii |ii f |i |ƒfƒ\}}|iii||ƒ|i|iiiƒƒ|i|SdS(sDget edgeDict for source node k, from cache or by loading its clusters _isLoadedsXselect t2.%s,t2.%s,t2.%s from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s group by t2.%sN(sselfsdsksKeyErrorshasattrstables _format_querys source_ids target_idsedge_idsnames clusterKeys primary_keys pack_sourcessqlsparamsscursorsexecutesloadsfetchall(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ts UcCsJ|tjoy |iSWntj onX|iiid|i|i |i |ii fƒ|iii ƒ}t |_|iiƒnx·|D]¯\}}}|o1|i|ƒ}|i|ƒ}|i|ƒ}ny |i|c||fg7build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysload†s,  2  cCsÑy |iSWntj onXt|i|i|i|it|ƒ|_||i_xi|i i ƒD]X\}}|ii gi }|i ƒD]\}}||||fƒq“~dtƒqjW|iSdS(s"interface to reverse graph mappingsunpackN(sselfs_inversesAttributeErrorsSQLGraphClusteredstables target_ids source_idsedge_idsgraph_db_inverse_refssds iteritemsssourcesloadsappends_[1]stargetsedgesFalse(sselfsdssourcesedges_[1]starget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__žs   BcCst|iƒƒSdS(s#uses db select; does not force loadN(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__¯scCsh|iiid|i|iifƒgi}|iiiƒD]}||i |dƒƒq@~SdS(s#uses db select; does not force loadsselect distinct(%s) from %siN( sselfstablescursorsexecutes source_idsnamesappends_[1]sfetchallsts unpack_source(sselfs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys²s&s iteritemssitemss itervaluessvaluess(lambda self:(self.load(),self.d.%s())[1]cCs0y||}tSWntj o tSnXdS(N(sselfsksxsTruesKeyErrorsFalse(sselfsksx((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__ºs  (s__name__s __module__s__doc__sSQLEdgeDictClustereds_edgeDictClasssNones__init__sdicts _pickleAttrss __getstate__s __getitem__sTruesloads __invert__sSQLEdgesClusteredDescrsedgess update_graphsupdatesadd_standard_packing_methodsslocalss__iter__skeyss methodFactorys __contains__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphClusteredWs" '         sSQLIDGraphClusteredcBstZeeƒƒRS(N(s__name__s __module__sadd_trivial_packing_methodsslocals(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLIDGraphClusteredÁssSQLEdgesClusteredcBsBtZdZeZeiiƒZeie ddƒƒd„Z RS(s%edges interface for SQLGraphClusteredsgraphicCs‰|iƒg}xn|iiƒD]]\}}xN|D]F\}}|i |i i |ƒ|i i |ƒ|i i |ƒfƒq3Wq W|SdS(N(sselfsloadsresultsds iteritemssedge_idsls source_ids target_idsappendsgraphs unpack_sources unpack_targets unpack_edge(sselfs target_idslsresultsedge_ids source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysÊs   B( s__name__s __module__s__doc__slists_edgeDictClasssSQLGraphClustereds _pickleAttrsscopysupdatesdictskeys(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesClusteredÅs sForeignKeyInversecBsztZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „ZRS( s;map each key to a single value according to its foreign keycCs ||_dS(N(sgsself(sselfsg((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ÖscCsI|i|ƒt||iiƒ}|tjotSn|ii|SdS(N( sselfs check_objsobjsgetattrsgs keyColumns source_idsNonessourceDB(sselfsobjs source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Øs   cCsq|i|ƒ|tj ot|i||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__Þs    cCsJy$|i|iij o t‚nWntj otdƒ‚nXdS(s&raise KeyError if obj not from this dbs'key is not from targetDB of this graph!N(sobjsdbsselfsgstargetDBsAttributeErrorsKeyError(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys check_objçs cCs3y|i|ƒtSWntj o tSnXdS(N(sselfs check_objsobjsTruesKeyErrorsFalse(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__îs  cCs|iiiƒSdS(N(sselfsgstargetDBs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__ôscCs|iiiƒSdS(N(sselfsgstargetDBsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysösccsYxR|D]J}t||iiƒ}|tjo|tfVq||ii|fVqWdS(N(sselfsobjsgetattrsgs keyColumns source_idsNonessourceDB(sselfs source_idsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsøs  cCst|iƒƒSdS(N(slistsselfs iteritems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsÿsccs%x|iƒD]\}}|Vq WdS(N(sselfs iteritemssobjsval(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluess cCst|iƒƒSdS(N(slistsselfs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesscCs |iSdS(N(sselfsg(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s check_objs __contains__s__iter__skeyss iteritemssitemss itervaluessvaluess __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyInverseÔs           sForeignKeyEdgecBs)tZdZd„Zd„Zd„ZRS(s±edge interface to a foreign key in an SQL table. Caches dict of target nodes in itself; provides dict interface. Adds or deletes edges by setting foreign key values in the tablecCscti|ƒ||_||_x=|iid|i|i fƒD]}ti ||t ƒqBWdS(Ns where %s=%%s( sdicts__init__sselfsgskssrcstargetDBsselects keyColumnsidsvs __setitem__sNone(sselfsgsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ s    #cCsÔt|dƒ p|i|iij otdƒ‚n|tj ot dƒ‚nt|dƒ o<|ii |}|tj ot i |i||ƒq¡nt||ii|iiƒt i||tƒdS(Nsdbs0dest is not in the targetDB bound to this graph!s/sorry,this graph cannot store edge information!s _localOnly(shasattrsdestsdbsselfsgstargetDBsKeyErrorsvsNones ValueErrors_inverses old_sourcesdicts __delitem__ssetattrs keyColumnssrcsids __setitem__(sselfsdestsvs old_source((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__s'  cCs*t||iitƒti||ƒdS(N(ssetattrsdestsselfsgs keyColumnsNonesdicts __delitem__(sselfsdest((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__s(s__name__s __module__s__doc__s__init__s __setitem__s __delitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyEdge s   sForeignKeyGraphc BsztZdZed„ZeddddddddƒZeZe Z d„Z d„Z d „Z d „Zd „ZeZRS( sugraph interface to a foreign key in an SQL table Caches dict of target nodes in itself; provides dict interface. cKsZ|ot|ƒ|_n h|_||_||_||_||_t|ƒ|_dS(s­sourceDB is any database of source nodes; targetDB must be an SQL database of target nodes; keyColumn is the foreign key column name in targetDB for looking up sourceDB IDs.N( sautoGCsRecentValueDictionarysselfs_weakValueDictssourceDBstargetDBs keyColumnsForeignKeyInverses_inverse(sselfssourceDBstargetDBs keyColumnsautoGCskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__(s     ssourceDBistargetDBs keyColumnsautoGCcCstdtdtƒSdS(sJprovide custom schema rule for inverting this graph... just use keyColumn!sinverts uniqueMappingN(sdictsTrue(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_inverse_schema8scCsƒt|dƒ p|i|ij otdƒ‚ny|i|iSWntj onXt||ƒ}||i|i<|SdS(Nsdbs2object is not in the sourceDB bound to this graph!( shasattrsksdbsselfssourceDBsKeyErrors_weakValueDictsidsForeignKeyEdgesd(sselfsksd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__;s$cCstdƒ‚dS(Nssdo not save as g[k]=v. Instead follow a graph interface: g[src]+=dest, or g[src][dest]=None (no edge info allowed)(sKeyError(sselfsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__EscCstdƒ‚dS(Ns?Instead of del g[k], follow a graph interface: del g[src][dest](sKeyError(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__HscCs|iiƒSdS(N(sselfssourceDBsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysKs(s__name__s __module__s__doc__sTrues__init__sdicts _pickleAttrssstandard_getstates __getstate__sstandard_setstates __setstate__s_inverse_schemas __getitem__s __setitem__s __delitem__skeyssstandard_inverts __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyGraph$s  !    c Cs|id|ƒ|idƒh}gi}|iƒD]}||dƒq8~}x¢|D]š} |d| } t | |ƒ}||| via , and store primary keys in idDict, along with a list of the tables each key indexes. suse %ss show tablesis.iýÿÿÿs_idN(scursorsexecutesnamestablessappends_[1]sfetchallscslststnamesSQLTablesos descriptionsfs primary_keysidDicts setdefault( snamescursorsidDictstablesscsfslsos_[1]stnamest((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysdescribeDBTablesOs" 1  cCs¹|tjo h}nx—|iƒD]‰}|io9|i|jog||i dictionary.iýÿÿÿs_idN( sidDictsNonestablessvaluessos primary_keysappends descriptionsf(stablessidDictsosf((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysindexIDses     cCsIh}x8|iƒD]*\}}|i|ƒo|||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys suffixSubsetus icCs‚tƒ}xn|iƒD]`}xW|iD]L}||ijo t}nt }|i |||ƒ|i |||ƒq&WqW|SdS(N( s dictgraphsgstablessvaluessts descriptionsfs primary_keys PRIMARY_KEYsedgeInfosNonessetEdge(stablessidDictsgsfsedgeInfost((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys graphDBTables€s    s varchar(32)sfloatcCs†y|iƒ}Wntj o dSnXyt||||||ƒWnnXt |||ƒx|D]}t |||ƒqhWdS(sûSave rows into SQL tableName using cursor, with optional translations of columns to specific SQL types (specified by typeTranslation dict). - optionDict can specify columns that are allowed to be NULL. - indexDict can specify columns that must be indexed; columns whose names end in _id will be indexed by default. - rows must be an iterator which in turn returns dictionaries, each representing a tuple of values (indexed by their column names). N( srowssnextsrows StopIterationscreateTableFromRowscursors tableNamestypeTranslations optionalDicts indexDictsstoreRow(srowss tableNamescursorstypeTranslations optionalDicts indexDictsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscreateTableFromReprs  c Cs|g}x|iƒD]÷\} }t} |tjo | |jo|| } nXt|ƒt jot t|ƒ} n1x-t D]%} t || ƒot | } Pq{q{W| tjot d| ƒ‚nd| | f}|tjp | |jo|d7}n|i|ƒqWxA|D]9} | ddjp | |jo|id| ƒqqWd|di|ƒf} |i| ƒdS( Ns!Don't know SQL type to use for %ss%s %ss not nulliýÿÿÿs_ids index(%s)s"create table if not exists %s (%s)s,(s create_defssrowsitemsscolsvalsNonescoltypestypeTranslationstypesSQLTypeTranslationsts isinstances TypeErrors create_defs optionalDictsappends indexDicts tableNamesjoinscmdscursorsexecute( scursors tableNamesrowstypeTranslations optionalDicts indexDicts create_defssvals create_defscmdstscoltypescol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscreateTableFromRow©s2    cCsLdit|ƒdgƒ}d||f}|i|t|i ƒƒƒdS(Ns,s%ssinsert into %s values (%s)( sjoinslensrows row_formats tableNamescmdscursorsexecutestuplesvalues(scursors tableNamesrows row_formatscmd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstoreRowÄscCsLdit|ƒdgƒ}d||f}|i|t|i ƒƒƒdS(Ns,s%ss"insert delayed into %s values (%s)( sjoinslensrows row_formats tableNamescmdscursorsexecutestuplesvalues(scursors tableNamesrows row_formatscmd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstoreRowDelayedÉss TableGroupcBs&tZdZded„Zd„ZRS(s7provide attribute access to dbname qualified tablenamesstestcKsŠti|ƒ||_|tj o ||_nxS|iƒD]E\}}|tj o d|jo|id|}n|||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Ñs     cCs ||SdS(N(sselfsk(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getattr__Ús(s__name__s __module__s__doc__sNones__init__s __getattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys TableGroupÏs  cOs5tƒ}|i||Ž}|iƒ}||fSdS(N(s import_sqlitessqlitesconnectsargsskwargss connectionscursor(sargsskwargsssqlitescursors connection((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssqlite_connectÝs  s DBServerInfocBsGtZdZdeed„Zd„Zed„Zd„Z d„Z RS(s(picklable reference to a database serversMySQLdbcOsyt||_Wn#tj otd|ƒ‚nX||_||_||_||_||_ |io|i otdƒ‚ndS(Ns.Module name not found in _DBServerModuleDict: s4serverSideCursors=True requires blockIterators=True!( s_DBServerModuleDicts moduleNamesselfs __class__sKeyErrors ValueErrorsargsskwargssserverSideCursorssblockIteratorsscustom_iter_keys(sselfs moduleNamesserverSideCursorssblockIteratorssargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ås     cCs6y |iSWn$tj o|iƒ|iSnXdS(s:returns cursor associated with the DB server info (reused)N(sselfs_cursorsAttributeErrors_start_connection(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscursorôs   cCsPt|dƒ o|iƒn|iiƒ}|tj o ||_n|SdS(s2returns a NEW cursor; you must close it yourself! s _connectionN(shasattrsselfs_start_connections _connectionscursors arraysizesNone(sselfs arraysizescursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys new_cursorüs  cCs*|iiƒ|iiƒ|`|`dS(s#Close file containing this databaseN(sselfs_cursorscloses _connection(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscloses   c Cs8td|id|id|id|id|iƒSdS(sreturn all picklable argumentssargsskwargss moduleNamesserverSideCursorsscustom_iter_keysN(sdictsselfsargsskwargss moduleNamesserverSideCursorsscustom_iter_keys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__ s   ( s__name__s __module__s__doc__sFalsesTrues__init__scursorsNones new_cursorscloses __getstate__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys DBServerInfoãs   sMySQLServerInfocBsDtZdZdZd„Zed„Zd„Zed„d„Z RS(s8customized for MySQLdb SSCursor support via new_cursor()smysqlcCs%t|i|iŽ\|_|_dS(N(s mysql_connectsselfsargsskwargss _connections_cursor(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_start_connectionscCs—|i oti||ƒSny |i}Wn7tj o+tdt |i |i Ž\|_}nX|ii ƒ}|t j o ||_n|SdS(s provide streaming cursor supports useStreamingN(sselfsserverSideCursorss DBServerInfos new_cursors arraysizes_conn_sscursorsconnsAttributeErrors mysql_connectsTruesargsskwargsscursorsNone(sselfs arraysizescursorsconn((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys new_cursors  )  cCs>ti|ƒy|iiƒ|`Wntj onXdS(N(s DBServerInfosclosesselfs_conn_sscursorsAttributeError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysclose's    cCs)gi}|D]}||dƒq~S(Ni(sappends_[1]sxst(sxs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys/sc Ks[t|||}y |i}Wntj onX|id|d|d|d|ƒSdS(Nscursorscache_fsmap_fsfetch_f( s BlockIteratorsdbscursorskwargssblock_iteratorscache_fsAttributeErrorsgeneric_iteratorsmap_f(sselfsdbscursorsmap_fscache_fskwargssblock_iterator((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iter_keys.s ( s__name__s __module__s__doc__s _serverTypes_start_connectionsNones new_cursorsclosesiters iter_keys(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMySQLServerInfos    s CursorClosercBs tZdZd„Zd„ZRS(söcontainer for ensuring cursor.close() is called, when this obj deleted. For Python 2.5+, we could replace this with a try... finally clause in a generator function such as generic_iterator(); see PEP 342 or What's New in Python 2.5. cCs ||_dS(N(scursorsself(sselfscursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__=scCs|iiƒdS(N(sselfscursorsclose(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__del__?s(s__name__s __module__s__doc__s__init__s__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys CursorCloser8s  s BlockIteratorcBs#tZdZdd„Zd„ZRS(s5workaround for MySQLdb iteration horrible performancesc  sg||_||_||_||_d|_|doó|i|_|djo8gi}|i D]} ||i | ƒqb~|_ qQt|i ƒ}y|i|ƒ‰Wn/tj o#t|i ƒ‰||g7}nXdi|ƒ|_tt|i ƒƒ|_ ˆdjo‡d†|_qQn'd|ii|_|i df|_ f|_t|_dS( NssorderBys*s,ics)gi}|D]}||ˆƒq~S(N(sappends_[1]sxstsi(sxs_[1]st(si(s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysXss WHERE %s>%%ssid(sdbsselfscursors selectColsskwargss whereClausesiterSQLswhereSQLsappends_[1]s iterColumnsscolsdatas whereParamsslistsindexsis ValueErrorslensjoinsrangescache_fs primary_keysparamssFalsesdone( sselfsdbscursors selectColss whereClauseskwargss_[1]sis iterColumnsscol((sis>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Ds.        8  c Csû|iofSn|ii|i|id|idd|iid|i|i |ii ƒ}t |ƒ|iijot |_|Sn|d}t |ƒdjo5gi}|iD]}|||ƒqº~|_n ||_|i|_|SdS(sget the next block of datascursorslimitsLIMIT %ss selectColsiÿÿÿÿiN(sselfsdonesdbs_selects whereClausesparamsscursors arraysizes selectColsskwargssfetchallsrowsslensTrueslastrowsappends_[1]s whereParamssicolswhereSQL(sselfsrowss_[1]slastrowsicol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__call___s    5  (s__name__s __module__s__doc__s__init__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys BlockIteratorBs  sSQLiteServerInfocBs/tZdZdZd„Zd„Zd„ZRS(s(picklable reference to a sqlite databasessqlitecOs&ti|ddt|ƒ||ŽdS(s)Takes same arguments as sqlite3.connect()ssqlite3sdatabaseN(s DBServerInfos__init__sselfsSourceFileNamesdatabasesargsskwargs(sselfsdatabasesargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ws cCs%t|i|iŽ\|_|_dS(N(ssqlite_connectsselfsargsskwargss _connections_cursor(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_start_connection|scCsQ|iidtƒp |id}|djotdƒ‚nti|ƒSdS(Nsdatabaseis:memory:s+SQLite in-memory database is not picklable!( sselfskwargssgetsFalsesargssdatabases ValueErrors DBServerInfos __getstate__(sselfsdatabase((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__~s# (s__name__s __module__s__doc__s _serverTypes__init__s_start_connections __getstate__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLiteServerInfots   sMySQLdbsMapViewc Bs¡tZdZeeed„ZeZeZd„Ze ddddddddddƒZ e Z e ZeZZZZZZZd „Zd „Zd „ZRS( s4general purpose 1:1 mapping defined by any SQL querycKs°||_||_||_||_|tjo\|tj o|iƒ}qy |i}Wntj ot dƒ‚qX|iƒ}n||_||_|i t ƒdS(Ns&you must provide serverInfo or cursor!( ssourceDBsselfstargetDBsviewSQLs inverseSQLscursorsNones serverInfosAttributeErrors ValueErrorsget_sql_formatsFalse(sselfssourceDBstargetDBsviewSQLscursors serverInfos inverseSQLskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__‹s         cCs¾t|dƒ p|i|ij otdƒ‚n|i|i|ifƒ\}}|i i ||ƒ|i i dƒ}t|ƒdjotdt|ƒƒ‚n|i|ddSdS(Nsdbs0object is not in the sourceDB bound to this map!iis&%s not found in MapView, or not uniquei(shasattrsksdbsselfssourceDBsKeyErrors _format_querysviewSQLsidssqlsparamsscursorsexecutes fetchmanystslensstrstargetDB(sselfsksparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ s$!ssourceDBistargetDBsviewSQLs serverInfos inverseSQLccsDx=|iiƒD],}y|||VWqtj oqXqWdS(s<only yield sourceDB items that are actually in this mapping!N(sselfssourceDBs itervaluessksKeyError(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__°scCs)gi}|D]}||ƒq~SdS(N(sappends_[1]sselfsk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys¸sc Cs‘y |iSWntj os|itjotdƒ‚n|i|i|i|i|i d|i d|i ƒ|_||i_|iSnXdS(Nsthis MapView has no inverseSQL!s serverInfos inverseSQL( sselfs_inversesAttributeErrors inverseSQLsNones ValueErrors __class__stargetDBssourceDBscursors serverInfosviewSQL(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__ºs    (s__name__s __module__s__doc__sNones__init__s_schemaModuleDictsget_table_schemasget_sql_formats __getitem__sdicts _pickleAttrssstandard_getstates __getstate__sstandard_setstates __setstate__sread_only_errors __setitem__s __delitem__sclearspopspopitemsupdates setdefaults__iter__skeyss __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMapView‰s     sGraphViewEdgeDictcBsntZdZd„Zd„Zd„Zd„Zd„Zed„Z d„Z e Z Z ZZZZZRS(s6edge dictionary for GraphView: just pre-loaded on initc Cs%||_||_|ii|ii|ifƒ\}}|iii ||ƒ|iii ƒ}t |ƒdjot d|iƒ‚ngi}|D]}||dƒq™~|_h}|iitj o'xC|D]}|d||dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__És"  '.cCst|iƒSdS(N(slensselfstargets(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__Úsccs&x|iD]}|ii|Vq WdS(N(sselfstargetssksgstargetDB(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__Üs cCst|ƒSdS(N(slistsself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysßsccs||iitj o=xb|iD]+}|ii||ii|i|fVqWn)x%|iD]}|ii|tfVqZWdS(N(sselfsgsedgeDBsNonestargetsskstargetDBs targetDict(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsás - cCs˜y:|i|iij otdƒ‚n|i|i}Wnt j otdƒ‚nX|odSn|ii t j o|ii |Snt SdS(sBfor the specified target object, return its associated edge objectskey is not part of targetDB!skey has no id or db attribute?!N( sosdbsselfsgstargetDBsKeyErrors targetDictsidsedgeIDsAttributeErrors exitIfFoundsedgeDBsNone(sselfsos exitIfFoundsedgeID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__èscCs6y|i|tƒtSWntj o tSnXdS(N(sselfs __getitem__sosTruesKeyErrorsFalse(sselfso((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__ös (s__name__s __module__s__doc__s__init__s__len__s__iter__skeyss iteritemssFalses __getitem__s __contains__sread_only_errors __setitem__s __delitem__sclearspopspopitemsupdates setdefault(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysGraphViewEdgeDictÇs        s GraphViewcBsKtZdZeed„Zd„ZeiiƒZei e ddƒƒRS(s8general purpose graph interface defined by any SQL querycKs)||_ti||||||dS(sFif edgeDB not None, viewSQL query must return (targetID,edgeID) tuplesN( sedgeDBsselfsMapViews__init__ssourceDBstargetDBsviewSQLscursorskwargs(sselfssourceDBstargetDBsviewSQLscursorsedgeDBskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s cCsEt|dƒ p|i|ij otdƒ‚nt||ƒSdS(Nsdbs0object is not in the sourceDB bound to this map!(shasattrsksdbsselfssourceDBsKeyErrorsGraphViewEdgeDict(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__s$sedgeDBi( s__name__s __module__s__doc__sNones__init__s __getitem__sMapViews _pickleAttrsscopysupdatesdict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys GraphViewÿs  s SQLSequencecBs>tZdZd„ZeeƒZd„Zd„Zd„ZRS(szTransparent access to a DB row representing a sequence. Use attrAlias dict to rename 'length' to something else. cKs ||_tid||dS(Nsdb(sdbs seqInfoDictsSQLRows_init_subclassskwargs(sclssdbskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_init_subclasss cCs!ti||ƒti|ƒdS(N(sSQLRows__init__sselfsids SequenceBase(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__scCs |iSdS(N(sselfslength(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__scCs2|id|iidƒ|d||fƒSdS(s@Efficient access to slice of a sequence, useful for huge contigss9%%(SUBSTRING)s(%s %%(SUBSTR_FROM)s %d %%(SUBSTR_FOR)s %d)sseqiN(sselfs_selectsdbs_attrSQLsstartsend(sselfsstartsend((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstrslices(s__name__s __module__s__doc__s_init_subclasss classmethods__init__s__len__sstrslice(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLSequences     sDNASQLSequencecBstZeZRS(N(s__name__s __module__s DNA_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysDNASQLSequence"ssRNASQLSequencecBstZeZRS(N(s__name__s __module__s RNA_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysRNASQLSequence%ssProteinSQLSequencecBstZeZRS(N(s__name__s __module__sPROTEIN_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysProteinSQLSequence(s(vs __future__s generatorssmappingssequences SequenceBases DNA_SEQTYPEs RNA_SEQTYPEsPROTEIN_SEQTYPEstypess classutils methodFactorysstandard_getstatesoverride_rich_cmpsgenerate_itemssget_bound_subclasssstandard_setstatesget_valid_pathsstandard_invertsRecentValueDictionarysread_only_errorsSourceFileNames split_kwargssossplatformsUserDictswarningssloggersobjectsTupleDescriptorsTupleIDDescriptorsTupleDescriptorRWs SQLDescriptorsSQLDescriptorRWsReadOnlyDescriptorsselect_from_rowsinit_row_subclasssdir_rowsTupleOsinsert_and_cache_idsTupleORWs_RWClasssColumnDescriptorsReadOnlyColumnDescs_readOnlyClasssSQLRowsSQLRowRWs list_to_dictsNonesget_name_cursorsFalses mysql_connectsdicts _mysqlMacrossTruesmysql_table_schemas _sqliteMacross import_sqlitessqlite_table_schemas SQLFormatDictsget_table_schemas_schemaModuleDicts DictMixins SQLTableBasesgetKeyssiters iter_keyssSQLTablesgetClusterKeyssSQLTableClusteredsSQLForeignRelationsSQLTableNoCaches _tableclasssSQLTableMultiNoCachesSQLEdgess SQLEdgeDictsSQLEdgelessDicts_edgelessClasssSQLGraphEdgeDescriptorsgetColumnTypessSQLGraphs SQLIDGraphs _IDGraphClasssSQLEdgeDictClusteredsSQLEdgesClusteredDescrsSQLGraphClusteredsSQLIDGraphClusteredsSQLEdgesClusteredsForeignKeyInversesForeignKeyEdgesForeignKeyGraphsdescribeDBTablessindexIDss suffixSubsets PRIMARY_KEYs graphDBTabless StringTypesIntTypes FloatTypesSQLTypeTranslationscreateTableFromReprscreateTableFromRowsstoreRowsstoreRowDelayeds TableGroupssqlite_connects DBServerInfosMySQLServerInfos CursorClosers BlockIteratorsSQLiteServerInfos_DBServerModuleDictsMapViewsGraphViewEdgeDicts GraphViews SQLSequencesDNASQLSequencesRNASQLSequencesProteinSQLSequence(csProteinSQLSequences iter_keysscreateTableFromReprsMapViewsdir_rowsTupleORWsTupleDescriptorsForeignKeyInversesMySQLServerInfosplatforms_DBServerModuleDicts generatorss mysql_connectsSQLEdgesClusteredsgetClusterKeyssgetColumnTypess suffixSubsetsSQLTableClustereds DBServerInfosForeignKeyEdgesPROTEIN_SEQTYPEsSQLIDGraphClustereds_schemaModuleDictsstandard_getstatesReadOnlyColumnDescsRNASQLSequences SQLFormatDictsstandard_invertsgetKeyssForeignKeyGraphs CursorClosers import_sqlitesSQLEdgess TableGroupsSQLTableMultiNoCachesSQLTablesSQLForeignRelationsReadOnlyDescriptors RNA_SEQTYPEsTupleDescriptorRWsgenerate_itemssSQLTypeTranslationsUserDicts methodFactorysstandard_setstatesSQLEdgelessDictsinit_row_subclasssread_only_errors list_to_dictsColumnDescriptorsSQLEdgesClusteredDescrsselect_from_rowsGraphViewEdgeDictsSQLRowRWs BlockIterators SQLTableBasesossSQLRowsTupleIDDescriptorsstoreRowsSQLDescriptorRWssqlite_table_schemas DNA_SEQTYPEs PRIMARY_KEYs SQLIDGraphs split_kwargss SQLDescriptors _sqliteMacross graphDBTablessmysql_table_schemas _mysqlMacrossSourceFileNamesloggersdescribeDBTablessget_valid_pathsstoreRowDelayedsSQLGraphClusteredsSQLEdgeDictClusteredsindexIDssSQLGraphEdgeDescriptorsSQLiteServerInfosRecentValueDictionaryscreateTableFromRowsinsert_and_cache_idsSQLTableNoCachesTupleOssqlite_connects GraphViewswarningssget_name_cursorsDNASQLSequencesoverride_rich_cmps SQLSequencesget_table_schemasSQLGraphs SQLEdgeDictstypess SequenceBasesget_bound_subclass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys?sÄ  O           !   ,     )/ !ÿ? C "- $V  /†   j 5+    *   1$ 2  >8PK Œ.;}óŽp˜æ˜æpygr/sqlgraph.pyo;ò ɪJc @södklZdkTdklZlZlZlZdkZdk l Z l Z l Z l Z lZlZlZlZlZlZlZlZdkZdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZ defd„ƒYZ!d„Z"d„Z#d„Z$defd„ƒYZ%d„Z&de%fd„ƒYZ'e'e%_(defd„ƒYZ)de)fd„ƒYZ*e*e)_+defd„ƒYZ,de,fd „ƒYZ-e-e,_(d!„Z.e/d"„Z0e/e/e1d#„Z2e3d$d%d&d'd(d(d)d*d+d,d-d.ƒZ4e5d/„Z6e3d$d0d&d1d(d2d)d3d+d4d-d4ƒZ7d5„Z8e5d6„Z9d7efd8„ƒYZ:e5d9„Z;hd:e6<d;e9<d<e9„ƒYZ>d2e/d?„Z?e/d2e@d@„e/dA„ZAdBe>fdC„ƒYZBd2dD„ZCdEeBfdF„ƒYZDdGefdH„ƒYZEdIe>fdJ„ƒYZFeFe,_GdKe>fdL„ƒYZHdMeHfdN„ƒYZIdOefdP„ƒYZJdQeJfdR„ƒYZKeKeJ_LdSefdT„ƒYZMhdUdVdWdXfdY„ZNdZeHfd[„ƒYZOd\eOfd]„ƒYZPePeO_Qd^e3fd_„ƒYZRd`efda„ƒYZSdbefdc„ƒYZTddeTfde„ƒYZUeUeT_QdfeTfdg„ƒYZVdhefdi„ƒYZWdje3fdk„ƒYZXdleei=fdm„ƒYZYdn„ZZe/do„Z[dp„Z\dqZ]dr„Z^hei_ds<ei`dU<eiadtbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__scCs|i|iSdS(N(sobjs_datasselfsicol(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__scCstdƒ‚dS(Nsthis database is read-only!(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleDescriptors   sTupleIDDescriptorcBstZd„ZRS(NcCstdƒ‚dS(NsGYou cannot change obj.id directly. Instead, use db[newID] = obj(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__s(s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleIDDescriptorssTupleDescriptorRWcBs tZdZd„Zd„ZRS(s'read-write interface to named attributecCs5||_|i||_|i|dtƒ|_dS(Ns sqlColumn(sattrsselfsdbsdatasicols_attrSQLsTruesattrSQL(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__!s cCs3|ii|i|i|ƒ|i|i|ƒdS(N( sobjsdbs_updatesidsselfsattrSQLsvals save_localsattr(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__%s(s__name__s __module__s__doc__s__init__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleDescriptorRWs  s SQLDescriptorcBs)tZdZd„Zd„Zd„ZRS(s/return attribute value by querying the databasecCs|i|ƒ|_dS(N(sdbs_attrSQLsattrsselfs selectSQL(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__+scCs|i|iƒSdS(N(sobjs_selectsselfs selectSQL(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__-scCstdƒ‚dS(Nsthis database is read-only!(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__/s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLDescriptor)s   sSQLDescriptorRWcBstZdZd„ZRS(s7writeable proxy to corresponding column in the databasecCs |ii|i|i|ƒdS(N(sobjsdbs_updatesidsselfs selectSQLsval(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__4s(s__name__s __module__s__doc__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLDescriptorRW2s sReadOnlyDescriptorcBs)tZdZd„Zd„Zd„ZRS(s/enforce read-only policy, e.g. for ID attributecCsd||_dS(Ns_(sattrsself(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__9scCst||iƒSdS(N(sgetattrsobjsselfsattr(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__;scCstd|iƒ‚dS(Nsattribute %s is read-only!(sAttributeErrorsselfsattr(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__=s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysReadOnlyDescriptor7s   cCs´|iid||ii|iif|ifƒ\}}|ii i ||ƒ|ii i dƒ}t |ƒdjo,td|iit|iƒ|fƒ‚n|ddSdS(s4return value from SQL expression applied to this rows&select %s from %s where %s=%%s limit 2iis"%s[%s].%s not found, or not uniqueiN(srowsdbs _format_queryswhatsnames primary_keysidssqlsparamsscursorsexecutes fetchmanystslensKeyErrorsstr(srowswhatsparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect_from_rowAs%,cCs­x¦|iD]›}|djo#t|||i||ƒƒq ny|i|dtƒWn/tj o#t|||i ||ƒƒq Xt|||i ||ƒƒq WdS(s!add descriptors for db attributessids columnNumberN( sdbsdatasattrssetattrsclss _idDescriptors_attrSQLsTruesAttributeErrors_sqlDescriptors_columnDescriptor(sclssdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinit_row_subclassMs  !cCs|iiiƒSdS(s+get list of column names as our attributes N(sselfsdbsdataskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysdir_rowZssTupleOcBsAtZdZeZeZeZe e ƒZ e Z eZd„ZRS(sæProvides attribute interface to a database tuple. Storing the data as a tuple instead of a standard Python object (which is stored using __dict__) uses about five-fold less memory and is also much faster (the tuples returned from the DB API fetch are simply referenced by the TupleO, with no need to copy their individual values into __dict__). This class follows the 'subclass binding' pattern, which means that instead of using __getattr__ to process all attribute requests (which is un-modular and leads to all sorts of trouble), we follow Python's new model for customizing attribute access, namely Descriptors. We use classutil.get_bound_subclass() to automatically create a subclass of this class, calling its _init_subclass() class method to add all the descriptors needed for the database table to which it is bound. See the Pygr Developer Guide section of the docs for a complete discussion of the subclass binding pattern.cCs ||_dS(N(sdatasselfs_data(sselfsdata((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__xs(s__name__s __module__s__doc__sTupleDescriptors_columnDescriptorsTupleIDDescriptors _idDescriptors SQLDescriptors_sqlDescriptors classmethodsinit_row_subclasss_init_subclasssselect_from_rows_selectsdir_rows__dir__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleO^s  cKsT|ii|ƒy|d}Wn"tj o|iiƒ}nX|i|ƒdS(s0insert tuple into db and cache its rowID on selfsidN( sselfsdbs_insertslskwargssrowIDsKeyErrors get_insert_idscache_id(sselfslskwargssrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinsert_and_cache_id{ssTupleORWcBs8tZdZeZeZed„Zd„Zd„Z RS(sread-write version of TupleOcKsE| o||_dSn|ii|ƒ|_|i|i|dS(N(snewRowsdatasselfs_datasdbstuple_from_dictskwargssinsert_and_cache_id(sselfsdatasnewRowskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ˆs  cCs|id|ƒdS(Nsid(sselfs save_localsrow_id(sselfsrow_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscache_idŽscCsW|i|}y||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys save_locals  ( s__name__s __module__s__doc__sTupleDescriptorRWs_columnDescriptorsinsert_and_cache_idsFalses__init__scache_ids save_local(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleORW„s   sColumnDescriptorcBs,tZdZed„Zd„Zd„ZRS(sDread-write interface to column in a database, cached in obj.__dict__cCsE||_|i|dtƒ|_||_|o|i|_ndS(Ns sqlColumn( sattrsselfsdbs_attrSQLsTruescolsreadOnlys_readOnlyClasss __class__(sselfsdbsattrsreadOnly((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__œs   cCsÎy|i|iSWnµtj o©|i|iijo t‚n|ii d|ii|i f|iƒ|ii i ƒ}t|ƒdjotdƒ‚n|dd|i|i<|ddSnXdS(Ns where %s=%%sisdb row not found or not unique!i(sobjs__dict__sselfsattrsKeyErrorscolsdbs primary_keysAttributeErrors_selectsidscursorsfetchallslslen(sselfsobjsobjtypesl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__¢s )cCsEt|dƒ o |ii|i|i|ƒn||i|i build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__®s (s__name__s __module__s__doc__sFalses__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysColumnDescriptoršs   sReadOnlyColumnDesccBstZd„ZRS(NcCstdƒ‚dS(Ns-The ID of a database object is not writeable.(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__¼s(s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysReadOnlyColumnDesc»ssSQLRowcBs?tZdZeZZeZee ƒZ e Z e Zd„ZRS(s·Provide transparent interface to a row in the database: attribute access will be mapped to SELECT of the appropriate column, but data is not cached on this object. cCs ||_dS(N(srowIDsselfs_id(sselfsrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Ìs(s__name__s __module__s__doc__s SQLDescriptors_columnDescriptors_sqlDescriptorsReadOnlyDescriptors _idDescriptors classmethodsinit_row_subclasss_init_subclasssselect_from_rows_selectsdir_rows__dir__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLRowÂs   sSQLRowRWcBs/tZdZeZeZed„Zd„ZRS(sread-write version of SQLRowcKs?| o|i|ƒSn|ii|ƒ}|i||dS(N( snewRowsselfscache_idsrowIDsdbstuple_from_dictskwargsslsinsert_and_cache_id(sselfsrowIDsnewRowskwargssl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ÔscCs ||_dS(N(srowIDsselfs_id(sselfsrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscache_idÙs( s__name__s __module__s__doc__sSQLDescriptorRWs_columnDescriptorsinsert_and_cache_idsFalses__init__scache_id(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLRowRWÐs  cCsTh}xCt|ƒD]5\}}y||||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys list_to_dictàs  cKs–|tj of|iƒ}t|ƒdjoC|d}dddf}|iƒ}|it ||dƒƒqsnt |}||i ƒ|fSdS(s¶get table name and cursor by parsing name or using configFile. If neither provided, will try to get via your MySQL config file. If connect is None, will use MySQLdb.connect()iishostsuserspasswdN( snamesNonessplitsargListslensargnamesskwargsscopysupdates list_to_dicts DBServerInfos serverInfoscursor(snameskwargssargnamess serverInfosargList((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_name_cursorës    " c Ks|iƒ}d|jo |tjo tiƒ} | ddfjoÇg}y-t i d} || df| dfg7}Wnt j onXyAt i d} || t iidf| t iidfg7}Wnt j onXt|ƒdjot|Œ}q-q1t iit iid ƒd ƒ}n|pt iit iƒd ƒ}|ot ii|ƒo||d ydkl}|i|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys mysql_connectùsH     4%"         sIGNOREsignoresREPLACEsreplacesAUTO_INCREMENTs SUBSTRINGs substrings SUBSTR_FROMsFROMs SUBSTR_FORsFORcCs™dk}t|itƒ|_| odSn|iƒ|ii d|i ƒ|ii ƒ}|ii d|i ƒxt |ƒD]\}}|d}|ii|ƒ|ddjoŽ|itjo ||_n=y|ii|ƒWn%tj o|i|g|_nX|dd iƒdjo t|_qit|_n#|dd jo||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysmysql_table_schema)s6       s or ignoresinsert or replacesssubstrs,cCs8y dk}Wn tj odkl}nX|SdS(sIimport sqlite3 (for Python 2.5+) or pysqlite2 for earlier Python versionsN(sdbapi2(ssqlite3ssqlites ImportErrors pysqlite2sdbapi2(ssqlite((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys import_sqliteKs  c Csxtƒ}t|itƒ|_| odSn|iƒ|i i d|i ƒ|i i ƒ} |i i d|i ƒx\t| ƒD]N\} }|d}|ii|ƒ|i i| |i|<|d|i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssqlite_table_schemaSsL     ! %. s SQLFormatDictc BsStZdZeddddddddddƒZhd „Zd „Zd „ZRS( sGPerform SQL keyword replacements for maintaining compatibility across a wide range of SQL backends. Uses Python dict-based string format function to do simple string replacements, and also to convert params list to the paramstyle required for this interface. Create by passing a dict of macros and the db-api paramstyle: sfd = SQLFormatDict("qmark", substitutionDict) Then transform queries+params as follows; input should be "format" style: sql,params = sfd("select * from foo where id=%s and val=%s", (myID,myVal)) cursor.execute(sql, params) spyformats%%(%d)ssnumerics:%dsnamedsqmarks(ignore)sformatcCs„|iƒ|_||_|i||_|djp |dj|_|djod|idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Šs   cCsmy|i|SWntj onX|djo'|i|i}|id7_|Sntd|ƒ‚dS(s1apply correct substitution for this SQL interfaces?isunknown macro: %sN(sselfssubstitutionDictsksKeyErrors paramFormatsiparamss(sselfskss((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__“s cCs‚d|_|iddƒ}||}|ioEh}x.t|ƒD] \}}||t |dƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__call__žs    (s__name__s __module__s__doc__sdicts _paramFormatss__init__s __getitem__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLFormatDict|s  cCs}y|iii}Wntj otdƒ‚nXy|i|}Wn#t j ot d|ƒ‚nX|||ƒdS(sCrun the right schema function based on type of db server connections'no cursor object or module information!s„unknown db module: %s. Use _schemaModuleDict attribute to supply a method for obtaining table schema for this moduleN( sselfscursors __class__s __module__smodnamesAttributeErrors ValueErrors_schemaModuleDicts schema_funcsKeyErrors analyzeSchema(sselfs analyzeSchemasmodnames schema_func((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_table_schema«ssMySQLdb.cursorsspysqlite2.dbapi2ssqlite3s SQLTableBasecBsÙtZdZeZeZeeeeeeedeeeeeeeed„Zd„Z d„Z d„Z e ddddd dd dd dd dd dddddddddƒ Z eZd„Zd„Zd„Zeed„Zed„Zed„Zdfdeddd„Zeedd„Zd„Zd„Zd„Zd„Zed „Zd!„Zd"„Zd#„Zeeee ed$„Z!d%„Z"d&„Z#d'„Z$d(„Z%d)„Z&d*„Z'd+„Z(d,„Z)RS(-sAStore information about an SQL table as dict keyed by primary keyicKsô| ot| ƒ|_n h|_| |_||_|o| o | idjo:|o|o||f\|_|_qt dƒ‚n||_ |t jo9| t j o| i ƒ}qòt ||\}}} ntidtddƒ||_ |t j oR| o|id|ƒn|itƒ|i|fƒ\}}|i|ƒn||_|t j o ||_n|t j o ||_n| t j o| |_| |_n|iƒh|_x*t|i ƒD]\}}||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Âsj                              cCs%|iddƒ|iiƒdSdS(Ns selectColsscount(*)i(sselfs_selectscursorsfetchone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__scCst|ƒSdS(N(sidsself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__hash__scCs2||jodSntt|ƒt|ƒƒSdS(sonly match self and no other!iN(sselfsotherscmpsid(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__cmp__s snameis clusterKeysmaxCaches arraysizes attrAliass serverInfosautoGCsorderBys writeablesiterSQLs iterColumnscCs|i|dS(N(sselfs__init__sstate(sselfsstate((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setstate__scCsd|idSdS(Ns (sselfsname(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__repr__scCs:h|_g|_h|_t|_t|_h|_dS(s+reset all schema information for this tableN(sselfs descriptions columnNames columnTypesNones usesIntIDs primary_keysindexed(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clear_schemas     cCsfy|i|}Wn,tj o td||ifƒ‚nX|oty|i|SWq»t j oRy|i|i|SWq·tt fj o td||ifƒ‚q·Xq»Xn|oey |dSWq't j oFy|i|dSWq#tt fj ot d|ƒ‚q#Xq'Xnt |t iƒo |}n|djo |i}n|SdS(s=Translate python attribute name to appropriate SQL expressions.attribute %s not a valid column or alias in %ss0attribute %s does not map to an SQL column in %sis*attribute %s does not map to a SQL column!sidN(sselfsdatasattrsfieldsKeyErrorsAttributeErrorsnames sqlColumns columnNames TypeErrors columnNumbers ValueErrors isinstancestypess StringTypes primary_key(sselfsattrs sqlColumns columnNumbersfield((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_attrSQL$s4'    cKsž|o|ii|ƒnx||iƒD]n\}}y|i|dt ‚Wq(t j o|i||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasAs  cCs³|tj o ||_n|io|ii|_nt|d|idtd|ƒƒ}t |t ƒo|i |_ nt |dƒot||iƒ o|i|_ndS(sPCreate class representing a row in this table by subclassing oclass, adding datas itemClasss subclassArgssdbs _tableclassN(soclasssNonesselfs itemClasss writeables_RWClasssget_bound_subclasssnamesdicts issubclasssTupleOsdatas_attrcolshasattrs isinstances _tableclasss __class__(sselfsoclass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysobjclassTs   $sst1.*cCsf|id||i|||f|ƒ\}}|t jo|i i ||ƒn|i ||ƒdS(s,execute the specified query but do not fetchsselect %s from %s t1 %s %s %sN( sselfs _format_querys selectColssnames whereClausesorderByslimitsparamsssqlscursorsNonesexecute(sselfs whereClausesparamss selectColsscursorsorderByslimitssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_select`s  ccsa|tjo |i}n|i|||ƒ|ii ƒ}x|D]}|i ||ƒVqCWdS(s=Generate the list of objects that satisfy the database SELECTN( soclasssNonesselfs itemClasss_selects whereClausesparamss selectColsscursorsfetchallslsts cacheItem(sselfs whereClausesparamssoclasss selectColsslst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselectjs  cKsœg}g}xl|iƒD]^\}}|tjo|id|i |ƒƒq|id|i |ƒƒ|i|ƒqW|i ddi |ƒ|ƒSdS(sDquery for intersection of all specified kwargs, returned as iterators %s IS NULLs%s=%%sswhere s and N( scriteriasparamsskwargssitemssksvsNonesappendsselfs_attrSQLsselectsjoin(sselfskwargsscriteriasparamssvsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysqueryrs  cCsH|id|i||if||fƒ\}}|i i ||ƒdS(sAupdate a single field in the specified row to the specified values!update %s set %s=%%s where %s=%%sN( sselfs _format_querysnamescols primary_keysvalsrow_idssqlsparamsscursorsexecute(sselfsrow_idscolsvalsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_update}scCsCy||idSWn)tj o||i|idSnXdS(Nsid(stsselfsdatas TypeError(sselfst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetIDƒscCsyy|i|ƒ}Wntj o||ƒSnXy|i|SWntj onX||ƒ}||i|<|SdS(s7get obj from cache if possible, or construct from tupleN(sselfsgetIDstsidsKeyErrorsoclasss_weakValueDictso(sselfstsoclasssosid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys cacheItemˆs  ccs?|tjo |i}nx|D]}|i||ƒVq!WdS(N(soclasssNonesselfs itemClasssrowssts cacheItem(sselfsrowssoclassst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys cache_items•s   cCs|id||fƒSdS(s9get iterator for objects with specified foreign key values where %s=%%sN(sselfsselectsattrsk(sselfsattrsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys foreignKeyšscCsHy.|it|iƒjo|iiƒnWntj onXdS(s"APPLY maxCache LIMIT TO CACHE SIZEN(sselfsmaxCacheslens_weakValueDictsclearsAttributeError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys limit_caches cCs;y|ii}Wntj o tSnX||iƒSdS(s4Return a new cursor object, or None if not possible N(sselfs serverInfos new_cursorsAttributeErrorsNones arraysize(sselfs new_cursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_new_cursor¥s  ccs°|tjo*|tjo|ii}q7|i}n|tjo |i}nxXtoP|iƒ|ƒ}t |ƒdjoPnx|||ƒƒD] }|Vq™WqTWdS(sgeneric iterator that runs fetch, cache and map functions. cursorHolder is used only to keep a ref in this function's locals, so that if it is prematurely terminated (by deleting its iterator), cursorHolder.__del__() will close the cursor.iN( sfetch_fsNonescursorsselfs fetchmanyscache_fs cache_itemssTrues limit_cachesrowsslensmap_fsv(sselfscursorsfetch_fscache_fsmap_fs cursorHoldersrowssv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgeneric_iterator­s        cCsltgt|iƒ}xK|iiƒD]:\}}y||||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pystuple_from_dictÁs  cCsqtgt|iƒ}xP|iiƒD]?\}}yt ||ƒ||transform object attributes into tuple for storing in databaseN( sNoneslensselfs descriptionslsdatasitemsscolsicolsgetattrsobjsAttributeErrors TypeError(sselfsobjslsicolscol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pystuple_from_objÊs  cCs^d|iddidgt|ƒƒd}|i||ƒ\}}|i i ||ƒdS(sxinsert tuple into the database. Note this uses the MySQL extension REPLACE, which overwrites any duplicate key.s%(REPLACE)s into s values (s,s%ss)N( sselfsnamesjoinslenslsss _format_queryssqlsparamsscursorsexecute(sselfslsssparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_insertÓs/cCs |i|ƒ}|i|ƒdS(s5insert new row by transforming obj to tuple of valuesN(sselfstuple_from_objsobjsls_insert(sselfsobjsl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinsertÚscCsWy|ii}Wntj otdƒ‚nX|tjotdƒ‚n|SdS(s-get the primary key value for the last INSERTs your db lacks lastrowid support?s/lastrowid is None so cannot get ID from INSERT!N(sselfscursors lastrowidsauto_idsAttributeErrorsNotImplementedErrorsNones ValueError(sselfsauto_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys get_insert_idÞs cKsK|i otdƒ‚n|itdt|}||i|i <|SdS(s=return a new record with the assigned attributes, added to DBsthis database is read only!snewRowN( sselfs writeables ValueErrors itemClasssNonesTrueskwargssobjs_weakValueDictsid(sselfskwargssobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysnewçs  cCs|iiƒdS(sempty the cacheN(sselfs_weakValueDictsclear(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clear_cacheîscCs|i otdƒ‚n|id|i|if|fƒ\}}|i i ||ƒy|i |=Wnt j onXdS(Nsthis database is read only!sdelete from %s where %s=%%s( sselfs writeables ValueErrors _format_querysnames primary_keyskssqlsparamsscursorsexecutes_weakValueDictsKeyError(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__ñs (*s__name__s __module__s__doc__s_schemaModuleDictsget_table_schemasNonesFalsesTrues__init__s__len__s__hash__s__cmp__sdicts _pickleAttrssstandard_getstates __getstate__s __setstate__s__repr__s clear_schemas_attrSQLs addAttrAliassobjclasss_selectsselectsquerys_updatesgetIDs cacheItems cache_itemss foreignKeys limit_cachesget_new_cursorsitersgeneric_iteratorstuple_from_dictstuple_from_objs_insertsinserts get_insert_idsnews clear_caches __delitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLTableBase¾sH 9?                  cCsš|tjo |i}n|djo |itj o |i}n|iid||i|fƒgi }|ii ƒD]}||dƒq{~SdS(s#uses db select; does not force loadssselect %s from %s %siN( s selectColssNonesselfs primary_keys queryOptionsorderByscursorsexecutesnamesappends_[1]sfetchallst(sselfs queryOptions selectColss_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetKeysüs    cCs)gi}|D]}||dƒq~S(Ni(sappends_[1]sxst(sxs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssc Ks&|tjo |i}n|djo |itj o |i}n|iƒ}|ot|idƒo |ii o2|ii ||d|d|d|d||Sq"|id|d|d|||id|d|d|dt|ƒƒSn/|tj ot|ƒƒSnt|iƒƒSd S( s8guarantee correct iteration insulated from other queriesss iter_keyss selectColssmap_fsorderByscache_fscursors cursorHolderN(s selectColssNonesselfs primary_keysorderBysget_new_cursorscursorshasattrs serverInfoscustom_iter_keyss iter_keyssmap_fscache_fskwargss_selectsgeneric_iterators CursorClosersget_fsiterskeys(sselfs selectColssorderBysmap_fscache_fsget_fskwargsscursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iter_keyss&        sSQLTablecBsbtZdZeZeZeZe d„Z d„Z d„Z d„Z d„Zd„Zd„ZRS(sNProvide on-the-fly access to rows in the database, caching the results in dictcCs˜y |iSWntj onX|tjo |i}n|iid|iƒ|ii ƒ}h|_ x|D]}|i ||ƒqqWt|_dS(sLoad all data from the tablesselect * from %sN(sselfs _isLoadedsAttributeErrorsoclasssNones itemClassscursorsexecutesnamesfetchallsls_weakValueDictsts cacheItemsTrue(sselfsoclassslst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysload&s    cCsÐy|i|SWnºtj o®|id|i|if|fƒ\}}|i i ||ƒ|i i dƒ}t |ƒdjo#tdt|ƒ|ifƒ‚n|iƒ|i|d|iƒSnXdS(Ns%select * from %s where %s=%%s limit 2iis!%s not found in %s, or not uniquei(sselfs_weakValueDictsksKeyErrors _format_querysnames primary_keyssqlsparamsscursorsexecutes fetchmanyslslensstrs limit_caches cacheItems itemClass(sselfskslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__5s# cCsÊ|i otdƒ‚ny|i|j o t‚nWntj otdƒ‚nXy$|i}|tjo t‚nWntj on X||i=|i |ƒ|i |ƒ||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__As"      cCs=|iƒgi}|D]}||||fƒq~SdS(s'forces load of entire table into memoryN(sselfsloadsappends_[1]sk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsTs c Cs)t|dddtdtd|iƒSdS(sAuses arraysize / maxCache and fetchmany() to manage data transfers selectColss*scache_fsmap_fsget_fN(s iter_keyssselfsNonesgenerate_itemssitems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsXscCs7|iƒgi}|D]}|||ƒq~SdS(s'forces load of entire table into memoryN(sselfsloadsappends_[1]sk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvalues\s cCs#t|dddtd|iƒSdS(sAuses arraysize / maxCache and fetchmany() to manage data transfers selectColss*scache_fsget_fN(s iter_keyssselfsNonesvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervalues`s(s__name__s __module__s__doc__sTupleOs itemClasssgetKeysskeyss iter_keyss__iter__sNonesloads __getitem__s __setitem__sitemss iteritemssvaluess itervalues(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTable!s      cCsY|iid|i|i|fƒgi}|iiƒD]}||dƒq:~SdS(s#uses db select; does not force loadsselect distinct %s from %s %siN( sselfscursorsexecutes clusterKeysnames queryOptionsappends_[1]sfetchallst(sselfs queryOptions_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetClusterKeysds#sSQLTableClusteredcBs2tZdZd„Zd„Zd„Zd„ZRS(s{use clusterKey to load a whole cluster of rows at once, specifically, all rows that share the same clusterKey value.cOs€|iƒ}t|d%%s or (%s=%%s and %s>%%s)( skwargsscopysFalsesSQLTables__init__sselfsargssorderBys clusterKeys primary_keys iterColumnssiterSQL(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ns   cCst|d|iƒSdS(Ns order by %s(sgetClusterKeyssselfs clusterKey(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clusterkeysyscCsÁy|i|SWn«tj oŸ|id|i|i|i|i|if|fƒ\}}|i i ||ƒ|i i ƒ}|iƒx!|D]}|i||iƒqW|i|SnXdS(Ns<select t2.* from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s(sselfs_weakValueDictsksKeyErrors _format_querysnames primary_keys clusterKeyssqlsparamsscursorsexecutesfetchallsls limit_cachests cacheItems itemClass(sselfskslsparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__{s+ cCs(|iƒ|id|i|fƒSdS(s1iterate over all items from the specified clusters where %s=%%sN(sselfs limit_cachesselects clusterKeys cluster_id(sselfs cluster_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iterclusterˆs (s__name__s __module__s__doc__s__init__s clusterkeyss __getitem__s itercluster(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableClusteredks   sSQLForeignRelationcBs tZdZd„Zd„ZRS(s7mapping based on matching a foreign key in an SQL tablecCs||_||_dS(N(stablesselfskeyName(sselfstableskeyName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s cCs~g}x7|iid|i|ifƒD]}|i|ƒq)Wt |ƒdjo#t dt |ƒ|i fƒ‚n|SdS(s3get list of objects o with getattr(o,keyName)==k.ids where %s=%%sis%s not found in %sN( slsselfstablesselectskeyNamesksidsosappendslensKeyErrorsstrsname(sselfskslso((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__’s##(s__name__s __module__s__doc__s__init__s __getitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLForeignRelations  sSQLTableNoCachecBsMtZdZeZeZeZd„Z d„Z d„Z d„Z d„Z RS(sÇProvide on-the-fly access to rows in the database; values are simply an object interface (SQLRow) to back-end db query. Row data are not stored locally, but always accessed by querying the dbcCs |dSdS(Ni(st(sselfst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetID£scCs)ti||||i|idƒƒSdS(Nsid(s SQLTableBasesselectsselfs whereClausesparamssoclasss_attrSQL(sselfs whereClausesparams((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect¤scCs¢y|i|SWnŒtj o€|id|i|f|iƒ|iidƒ}t |ƒdjotd|ƒ‚n|i |ƒ}||i|<|SnXdS(Ns where %s=%%siis id %s non-existent or not unique( sselfs_weakValueDictsksKeyErrors_selects primary_keyscursors fetchmanystslens itemClassso(sselfsksost((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__§s  cCsÚ|i otdƒ‚ny|i|j o t‚nWntj otdƒ‚nXy ||=Wntj onXy|i|i =Wntj onX|i |i |i |ƒ|i |ƒ||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__³s$   cKs|ii|ƒdS(N(sselfsdatasupdateskwargs(sselfskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasÆs(s__name__s __module__s__doc__sSQLRows itemClasssgetKeysskeyss iter_keyss__iter__sgetIDsselects __getitem__s __setitem__s addAttrAlias(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableNoCacheœs    sSQLTableMultiNoCachecBsGtZdZeZdZd„Zd„Zd„Zd„Z d„Z RS(sGTrivial on-the-fly access for table with key that returns multiple rowssidcOssti|||Ž|i|iƒ|_|i o<d|i|if|_d|i|_ |if|_ ndS(NsGROUP BY %s ORDER BY %ss WHERE %s>%%s( s SQLTableBases__init__sselfsargsskwargss_attrSQLs _distinct_keys distinct_keysorderBysiterSQLs iterColumns(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Ðs  cCst|d|iƒSdS(Ns selectCols(sgetKeyssselfs distinct_key(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysØscCst|d|iƒSdS(Ns selectCols(s iter_keyssselfs distinct_key(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__Úsccsx|id|i|i|iƒf|fƒ\}}|ii ||ƒ|ii ƒ}x|D]}|i |ƒVq]WdS(Nsselect * from %s where %s=%%s(sselfs _format_querysnames_attrSQLs _distinct_keysidssqlsparamsscursorsexecutesfetchallslsrows itemClass(sselfsidslsparamsssqlsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Üs"cKs|ii|ƒdS(N(sselfsdatasupdateskwargs(sselfskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasãs( s__name__s __module__s__doc__sTupleOs itemClasss _distinct_keys__init__skeyss__iter__s __getitem__s addAttrAlias(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableMultiNoCacheÌs     sSQLEdgescBsZtZdZdZeiiƒZeieddƒƒd„Z e Z d„Z d„Z RS(sfprovide iterator over edges as (source,target,edge) and getitem[edge] --> [(source,target),...]sedge_idsgraphic CsÍ|iid|idƒ|idƒ|idƒ|i|idƒ|idƒ|idƒfƒg}xZ|iiƒD]I\}}}|i |i i |ƒ|i i |ƒ|i i|ƒfƒqxW|SdS(Ns;select %s,%s,%s from %s where %s is not null order by %s,%ss source_ids target_idsedge_id(sselfscursorsexecutes_attrSQLsnameslsfetchalls source_ids target_idsedge_idsappendsgraphs unpack_sources unpack_targets unpack_edge(sselfs source_ids target_idslsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysîs b>cCst|iƒƒSdS(N(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__ûscCsÄ|id|idƒ|idƒ|i|i|iƒf|ii|ƒfƒ\}}|i i ||ƒg}xH|i i ƒD]7\}}|i|ii|ƒ|ii|ƒfƒqW|SdS(Ns!select %s,%s from %s where %s=%%ss source_ids target_id(sselfs _format_querys_attrSQLsnames _distinct_keysgraphs pack_edgesedgessqlsparamsscursorsexecuteslsfetchalls source_ids target_idsappends unpack_sources unpack_target(sselfsedges target_idslsparamsssqls source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ýs: /( s__name__s __module__s__doc__s _distinct_keysSQLTableMultiNoCaches _pickleAttrsscopysupdatesdictskeyss__call__s__iter__s __getitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesès   s SQLEdgeDictcBs’tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„ZeZRS(s)2nd level graph interface to SQL databasecCs³||_||_t|idƒ o‰|iid|ii|ii|iif|ifƒ\}}|ii i ||ƒt |ii i ƒƒdjot dƒ‚q¯ndS(NsallowMissingNodess&select %s from %s where %s=%%s limit 1isnode not in graph!(sfromNodesselfstableshasattrs _format_querys sourceSQLsnamessqlsparamsscursorsexecuteslensfetchallsKeyError(sselfsfromNodestablesparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s  +cCsè|iid|ii|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii idƒ}t|ƒdjotdƒ‚ny|ii|ddƒSWntj otdƒ‚nXdS(Ns1select %s from %s where %s=%%s and %s=%%s limit 2iis3either no edge from source to target or not unique!isno edge from node to target(sselfstables _format_querysedgeSQLsnames sourceSQLs targetSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutes fetchmanyslslensKeyErrors unpack_edges IndexError(sselfstargetslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__s4$cCs¶|iid|ii|i|ii|ƒ|ii|ƒfƒ\}}|ii i ||ƒt |idƒ p)t |idƒo|ii|iijo|i|7_ndS(Ns$replace into %s values (%%s,%%s,%%s)ssourceDBstargetDB(sselfstables _format_querysnamesfromNodes pack_targetstargets pack_edgesedgessqlsparamsscursorsexecuteshasattrssourceDBstargetDB(sselfstargetsedgesparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__+s 3@cCst||<|SdS(N(sNonesselfstarget(sselfstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__6s cCs|iid|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii i djotdƒ‚ndS(Ns&delete from %s where %s=%%s and %s=%%sisno edge from node to target(sselfstables _format_querysnames sourceSQLs targetSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutesrowcountsKeyError(sselfstargetsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__9s +$cCs||iid|ii|ii|ii|ii|iif|ifƒ\}}|ii i ||ƒ|ii i ƒSdS(Ns4select %s,%s from %s where %s=%%s and %s is not null( sselfstables _format_querys targetSQLsedgeSQLsnames sourceSQLsfromNodessqlsparamsscursorsexecutesfetchall(sselfsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysiterator_queryDs=cCsAgi}|iƒD]"\}}||ii|ƒƒq~SdS(N(sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_target(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysNscCsAgi}|iƒD]"\}}||ii|ƒƒq~SdS(N(sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesQscCsegi}|iƒD]F\}}||ii|iƒ|ii |ƒ|ii |ƒfƒq~SdS(N( sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_sourcesfromNodes unpack_targets unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysedgesTscCsSgi}|iƒD]4\}}||ii|ƒ|ii|ƒfƒq~SdS(N( sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_targets unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsXscCst|iƒƒSdS(N(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__[scCst|iƒƒSdS(N(sitersselfsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervalues\scCst|iƒƒSdS(N(sitersselfsitems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritems]scCst|iƒƒSdS(N(slensselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__^s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s__iadd__s __delitem__siterator_queryskeyssvaluessedgessitemss__iter__s itervaluess iteritemss__len__s graph_cmps__cmp__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLEdgeDict s           sSQLEdgelessDictcBs tZdZd„Zd„ZRS(s,for SQLGraph tables that lack edge_id columncCs®|iid|ii|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii i dƒ}t|ƒdjotdƒ‚ntSdS(Ns1select %s from %s where %s=%%s and %s=%%s limit 2iis3either no edge from source to target or not unique!(sselfstables _format_querys targetSQLsnames sourceSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutes fetchmanyslslensKeyErrorsNone(sselfstargetslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ds4$cCsž|iid|ii|ii|ii|iif|ifƒ\}}|ii i ||ƒgi }|ii i ƒD]}||dtfƒqy~SdS(Ns1select %s from %s where %s=%%s and %s is not nulli(sselfstables _format_querys targetSQLsnames sourceSQLsfromNodessqlsparamsscursorsexecutesappends_[1]sfetchallstsNone(sselfs_[1]sparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysiterator_queryqs4(s__name__s __module__s__doc__s __getitem__siterator_query(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgelessDictbs  sSQLGraphEdgeDescriptorcBstZdZd„ZRS(s'provide an SQLEdges interface on demandcCsey|iiƒ}Wn,tj o t|i|id|ƒSn!Xt|i|id|d|ƒSdS(Nsgraphs attrAlias(sobjs attrAliasscopysAttributeErrorsSQLEdgessnamescursor(sselfsobjsobjtypes attrAlias((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__s (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphEdgeDescriptor}s sintssourcestargetsedgec KsÔg} xÃ|D]»}y||d} Wntj o|d} nXy"| i| ||dfƒw Wnttfj onXy)||d}|t jo t‚nWntj onÞXt |ƒ}y|iƒ}WnMtj oAy$| i| |i|ifƒw Wqžtj oqžXnrXt|tƒp t|tƒo| i| dfƒq n7t|tƒo| i| dfƒq n tdƒ‚| i| |fƒtid| |fƒq W| SdS(s=return list of [(colname,coltype),...] for source,target,edges_idsDBsints varchar(32)s(SQLGraph node / edge must be int or str!s/no type info found for %s, so using default: %sN(sls columnAttrssattrs attrAliassattrNamesKeyErrorsappends createTables TypeErrorskwargssdbsNonesitersitsnextsks StopIterations columnTypes primary_keysAttributeErrors isinstancesintslongsstrs ValueErrorsdefaultColumnTypesloggerswarn( s createTables attrAliassdefaultColumnTypes columnAttrsskwargssdbsitsattrskslsattrName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetColumnTypesˆsL     sSQLGraphc BsûtZdZdZeiiƒZeieddddddddƒƒe Z d„Z d„Z d „Z d „ZeZd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„ZeƒZeZd„ZeZee ƒƒe!e ƒƒRS(s¡provide a graph interface via a SQL table. Key capabilities are: - setitem with an empty dictionary: a dummy operation - getitem with a key that exists: return a placeholder - setitem with non empty placeholder: again a dummy operation EXAMPLE TABLE SCHEMA: create table mygraph (source_id int not null,target_id int,edge_id int, unique(source_id,target_id)); s source_idssourceDBistargetDBsedgeDBsallowMissingNodesc Osot|ddddddddd d f ƒ\}}d |joyt|}d ||d d |d d|dd |dd|dd |dd|d d |dd f |d build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Äs$-  m cCs|i|i|ƒ|ƒSdS(N(sselfs _edgeClasss pack_sourcesk(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ÚscCs“|id|i|i|if|i|ƒfƒ\}}|i i ||ƒ|id|i|i|ƒfƒ\}}|i i ||ƒ|SdS(Ns*delete from %s where %s=%%s and %s is nulls1insert %%(IGNORE)s into %s values (%%s,NULL,NULL)( sselfs _format_querysnames sourceSQLs targetSQLs pack_sourceskssqlsparamsscursorsexecute(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__ÜscCsr|id|i|if|i|ƒfƒ\}}|ii ||ƒ|ii djot dƒ‚n|SdS(Nsdelete from %s where %s=%%sisnode not found in graph( sselfs _format_querysnames sourceSQLs pack_sourceskssqlsparamsscursorsexecutesrowcountsKeyError(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__isub__ås cCsm|id|i|if|i|ƒfƒ\}}|ii ||ƒ|ii dƒ}t |ƒdjSdS(Ns%select * from %s where %s=%%s limit 1ii( sselfs _format_querysnames sourceSQLs pack_sourceskssqlsparamsscursorsexecutes fetchmanyslslen(sselfskslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__îs cCsžy |iSWnŒtj o€td|id|id|iƒ}|itjo |d=nt |i |i d|t |ƒ|_||i_|iSnXdS(s-get an interface to the inverse graph mappings source_ids target_idsedge_ids attrAliasN( sselfs_inversesAttributeErrorsdicts targetSQLs sourceSQLsedgeSQLs attrAliassNonesSQLGraphsnamescursorsgraph_db_inverse_refs(sselfs attrAlias((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__õs     ccs+x$ti|ƒD]}|i|ƒVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks unpack_source(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__sccs=x6ti|ƒD]%}|i|ƒ|i||ƒfVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks unpack_sources _edgeClass(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemssccs.x'ti|ƒD]}|i||ƒVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks _edgeClass(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervalues scCs;gi}ti|ƒD]}||i|ƒƒq~SdS(N(sappends_[1]sSQLTableMultiNoCacheskeyssselfsks unpack_source(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys scCst|iƒƒSdS(N(slistsselfs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesscCst|iƒƒSdS(N(slistsselfs iteritems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsscCs5|iid|i|ifƒ|iiƒdSdS(s#get number of source nodes in graphs!select count(distinct %s) from %siN(sselfscursorsexecutes sourceSQLsnamesfetchone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__s ("s__name__s __module__s__doc__s _distinct_keysSQLTableMultiNoCaches _pickleAttrsscopysupdatesdicts SQLEdgeDicts _edgeClasss__init__s __getitem__s__iadd__s__isub__s graph_setitems __setitem__s __contains__s __invert__s__iter__s iteritemss itervaluesskeyssvaluessitemssSQLGraphEdgeDescriptorsedgess update_graphs__len__s graph_cmps__cmp__soverride_rich_cmpslocalssadd_standard_packing_methods(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraph·s0 (              "s SQLIDGraphcBstZeeƒƒRS(N(s__name__s __module__sadd_trivial_packing_methodsslocals(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLIDGraph=ssSQLEdgeDictClusteredcBs tZdZd„Zd„ZRS(s:simple cache for 2nd level dictionary of target_id:edge_idcCs#||_||_ti|ƒdS(N(sgsselfsfromNodesdicts__init__(sselfsgsfromNode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Es  cCs2x'|D]\}}ti|||ƒqW|SdS(N(sls target_idsedge_idsdicts __setitem__sself(sselfsls target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__Is (s__name__s __module__s__doc__s__init__s__iadd__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgeDictClusteredCs  sSQLEdgesClusteredDescrcBstZd„ZRS(Nc Csžt|i|i|i|id|t|tƒ}x`|i i ƒD]O\}}|i gi }|i ƒD]\}}||||fƒqi~ƒqCW|SdS(Nsgraph(sSQLEdgesClusteredsobjstablesedge_ids source_ids target_idsgraph_db_inverse_refssTruesesds iteritemssloadsappends_[1]( sselfsobjsobjtypes_[1]sesds target_ids source_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__Os  G(s__name__s __module__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesClusteredDescrNssSQLGraphClusteredcBsÜtZdZeZddded„Zeddddddddddddd dƒZd „Z d „Z ee d „Z d „Z eƒZeZeeƒƒd„Zd„Zeddddgdeƒƒd„ZRS(sESQL graph with clustered caching -- loads an entire cluster at a times source_ids target_idsedge_idc Ks1dk}t||iƒo×|tjotdƒ‚nd|jo”tdt d|d|d|ƒ|}d||dd|dd |d d|d d |d d|d d |dd|d df |dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Zs   m     stableissourceDBstargetDBsedgeDBcCst|ƒ}h|d<|SdS(Nsd(sstandard_getstatesselfsstate(sselfsstate((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__ps  c Csêy|i|SWn*tj ot|dƒo‚q<nX|iid|i|i|i |ii |ii |i|ii |ii |ii f |i |ƒfƒ\}}|iii||ƒ|i|iiiƒƒ|i|SdS(sDget edgeDict for source node k, from cache or by loading its clusters _isLoadedsXselect t2.%s,t2.%s,t2.%s from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s group by t2.%sN(sselfsdsksKeyErrorshasattrstables _format_querys source_ids target_idsedge_idsnames clusterKeys primary_keys pack_sourcessqlsparamsscursorsexecutesloadsfetchall(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ts UcCsJ|tjoy |iSWntj onX|iiid|i|i |i |ii fƒ|iii ƒ}t |_|iiƒnx·|D]¯\}}}|o1|i|ƒ}|i|ƒ}|i|ƒ}ny |i|c||fg7build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysload†s,  2  cCsÑy |iSWntj onXt|i|i|i|it|ƒ|_||i_xi|i i ƒD]X\}}|ii gi }|i ƒD]\}}||||fƒq“~dtƒqjW|iSdS(s"interface to reverse graph mappingsunpackN(sselfs_inversesAttributeErrorsSQLGraphClusteredstables target_ids source_idsedge_idsgraph_db_inverse_refssds iteritemsssourcesloadsappends_[1]stargetsedgesFalse(sselfsdssourcesedges_[1]starget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__žs   BcCst|iƒƒSdS(s#uses db select; does not force loadN(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__¯scCsh|iiid|i|iifƒgi}|iiiƒD]}||i |dƒƒq@~SdS(s#uses db select; does not force loadsselect distinct(%s) from %siN( sselfstablescursorsexecutes source_idsnamesappends_[1]sfetchallsts unpack_source(sselfs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys²s&s iteritemssitemss itervaluessvaluess(lambda self:(self.load(),self.d.%s())[1]cCs0y||}tSWntj o tSnXdS(N(sselfsksxsTruesKeyErrorsFalse(sselfsksx((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__ºs  (s__name__s __module__s__doc__sSQLEdgeDictClustereds_edgeDictClasssNones__init__sdicts _pickleAttrss __getstate__s __getitem__sTruesloads __invert__sSQLEdgesClusteredDescrsedgess update_graphsupdatesadd_standard_packing_methodsslocalss__iter__skeyss methodFactorys __contains__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphClusteredWs" '         sSQLIDGraphClusteredcBstZeeƒƒRS(N(s__name__s __module__sadd_trivial_packing_methodsslocals(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLIDGraphClusteredÁssSQLEdgesClusteredcBsBtZdZeZeiiƒZeie ddƒƒd„Z RS(s%edges interface for SQLGraphClusteredsgraphicCs‰|iƒg}xn|iiƒD]]\}}xN|D]F\}}|i |i i |ƒ|i i |ƒ|i i |ƒfƒq3Wq W|SdS(N(sselfsloadsresultsds iteritemssedge_idsls source_ids target_idsappendsgraphs unpack_sources unpack_targets unpack_edge(sselfs target_idslsresultsedge_ids source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysÊs   B( s__name__s __module__s__doc__slists_edgeDictClasssSQLGraphClustereds _pickleAttrsscopysupdatesdictskeys(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesClusteredÅs sForeignKeyInversecBsztZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „ZRS( s;map each key to a single value according to its foreign keycCs ||_dS(N(sgsself(sselfsg((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ÖscCsI|i|ƒt||iiƒ}|tjotSn|ii|SdS(N( sselfs check_objsobjsgetattrsgs keyColumns source_idsNonessourceDB(sselfsobjs source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Øs   cCsq|i|ƒ|tj ot|i||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__Þs    cCsJy$|i|iij o t‚nWntj otdƒ‚nXdS(s&raise KeyError if obj not from this dbs'key is not from targetDB of this graph!N(sobjsdbsselfsgstargetDBsAttributeErrorsKeyError(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys check_objçs cCs3y|i|ƒtSWntj o tSnXdS(N(sselfs check_objsobjsTruesKeyErrorsFalse(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__îs  cCs|iiiƒSdS(N(sselfsgstargetDBs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__ôscCs|iiiƒSdS(N(sselfsgstargetDBsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysösccsYxR|D]J}t||iiƒ}|tjo|tfVq||ii|fVqWdS(N(sselfsobjsgetattrsgs keyColumns source_idsNonessourceDB(sselfs source_idsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsøs  cCst|iƒƒSdS(N(slistsselfs iteritems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsÿsccs%x|iƒD]\}}|Vq WdS(N(sselfs iteritemssobjsval(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluess cCst|iƒƒSdS(N(slistsselfs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesscCs |iSdS(N(sselfsg(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s check_objs __contains__s__iter__skeyss iteritemssitemss itervaluessvaluess __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyInverseÔs           sForeignKeyEdgecBs)tZdZd„Zd„Zd„ZRS(s±edge interface to a foreign key in an SQL table. Caches dict of target nodes in itself; provides dict interface. Adds or deletes edges by setting foreign key values in the tablecCscti|ƒ||_||_x=|iid|i|i fƒD]}ti ||t ƒqBWdS(Ns where %s=%%s( sdicts__init__sselfsgskssrcstargetDBsselects keyColumnsidsvs __setitem__sNone(sselfsgsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ s    #cCsÔt|dƒ p|i|iij otdƒ‚n|tj ot dƒ‚nt|dƒ o<|ii |}|tj ot i |i||ƒq¡nt||ii|iiƒt i||tƒdS(Nsdbs0dest is not in the targetDB bound to this graph!s/sorry,this graph cannot store edge information!s _localOnly(shasattrsdestsdbsselfsgstargetDBsKeyErrorsvsNones ValueErrors_inverses old_sourcesdicts __delitem__ssetattrs keyColumnssrcsids __setitem__(sselfsdestsvs old_source((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__s'  cCs*t||iitƒti||ƒdS(N(ssetattrsdestsselfsgs keyColumnsNonesdicts __delitem__(sselfsdest((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__s(s__name__s __module__s__doc__s__init__s __setitem__s __delitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyEdge s   sForeignKeyGraphc BsztZdZed„ZeddddddddƒZeZe Z d„Z d„Z d „Z d „Zd „ZeZRS( sugraph interface to a foreign key in an SQL table Caches dict of target nodes in itself; provides dict interface. cKsZ|ot|ƒ|_n h|_||_||_||_||_t|ƒ|_dS(s­sourceDB is any database of source nodes; targetDB must be an SQL database of target nodes; keyColumn is the foreign key column name in targetDB for looking up sourceDB IDs.N( sautoGCsRecentValueDictionarysselfs_weakValueDictssourceDBstargetDBs keyColumnsForeignKeyInverses_inverse(sselfssourceDBstargetDBs keyColumnsautoGCskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__(s     ssourceDBistargetDBs keyColumnsautoGCcCstdtdtƒSdS(sJprovide custom schema rule for inverting this graph... just use keyColumn!sinverts uniqueMappingN(sdictsTrue(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_inverse_schema8scCsƒt|dƒ p|i|ij otdƒ‚ny|i|iSWntj onXt||ƒ}||i|i<|SdS(Nsdbs2object is not in the sourceDB bound to this graph!( shasattrsksdbsselfssourceDBsKeyErrors_weakValueDictsidsForeignKeyEdgesd(sselfsksd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__;s$cCstdƒ‚dS(Nssdo not save as g[k]=v. Instead follow a graph interface: g[src]+=dest, or g[src][dest]=None (no edge info allowed)(sKeyError(sselfsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__EscCstdƒ‚dS(Ns?Instead of del g[k], follow a graph interface: del g[src][dest](sKeyError(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__HscCs|iiƒSdS(N(sselfssourceDBsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysKs(s__name__s __module__s__doc__sTrues__init__sdicts _pickleAttrssstandard_getstates __getstate__sstandard_setstates __setstate__s_inverse_schemas __getitem__s __setitem__s __delitem__skeyssstandard_inverts __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyGraph$s  !    c Cs|id|ƒ|idƒh}gi}|iƒD]}||dƒq8~}x¢|D]š} |d| } t | |ƒ}||| via , and store primary keys in idDict, along with a list of the tables each key indexes. suse %ss show tablesis.iýÿÿÿs_idN(scursorsexecutesnamestablessappends_[1]sfetchallscslststnamesSQLTablesos descriptionsfs primary_keysidDicts setdefault( snamescursorsidDictstablesscsfslsos_[1]stnamest((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysdescribeDBTablesOs" 1  cCs¹|tjo h}nx—|iƒD]‰}|io9|i|jog||i dictionary.iýÿÿÿs_idN( sidDictsNonestablessvaluessos primary_keysappends descriptionsf(stablessidDictsosf((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysindexIDses     cCsIh}x8|iƒD]*\}}|i|ƒo|||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys suffixSubsetus icCs‚tƒ}xn|iƒD]`}xW|iD]L}||ijo t}nt }|i |||ƒ|i |||ƒq&WqW|SdS(N( s dictgraphsgstablessvaluessts descriptionsfs primary_keys PRIMARY_KEYsedgeInfosNonessetEdge(stablessidDictsgsfsedgeInfost((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys graphDBTables€s    s varchar(32)sfloatcCs†y|iƒ}Wntj o dSnXyt||||||ƒWnnXt |||ƒx|D]}t |||ƒqhWdS(sûSave rows into SQL tableName using cursor, with optional translations of columns to specific SQL types (specified by typeTranslation dict). - optionDict can specify columns that are allowed to be NULL. - indexDict can specify columns that must be indexed; columns whose names end in _id will be indexed by default. - rows must be an iterator which in turn returns dictionaries, each representing a tuple of values (indexed by their column names). N( srowssnextsrows StopIterationscreateTableFromRowscursors tableNamestypeTranslations optionalDicts indexDictsstoreRow(srowss tableNamescursorstypeTranslations optionalDicts indexDictsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscreateTableFromReprs  c Cs|g}x|iƒD]÷\} }t} |tjo | |jo|| } nXt|ƒt jot t|ƒ} n1x-t D]%} t || ƒot | } Pq{q{W| tjot d| ƒ‚nd| | f}|tjp | |jo|d7}n|i|ƒqWxA|D]9} | ddjp | |jo|id| ƒqqWd|di|ƒf} |i| ƒdS( Ns!Don't know SQL type to use for %ss%s %ss not nulliýÿÿÿs_ids index(%s)s"create table if not exists %s (%s)s,(s create_defssrowsitemsscolsvalsNonescoltypestypeTranslationstypesSQLTypeTranslationsts isinstances TypeErrors create_defs optionalDictsappends indexDicts tableNamesjoinscmdscursorsexecute( scursors tableNamesrowstypeTranslations optionalDicts indexDicts create_defssvals create_defscmdstscoltypescol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscreateTableFromRow©s2    cCsLdit|ƒdgƒ}d||f}|i|t|i ƒƒƒdS(Ns,s%ssinsert into %s values (%s)( sjoinslensrows row_formats tableNamescmdscursorsexecutestuplesvalues(scursors tableNamesrows row_formatscmd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstoreRowÄscCsLdit|ƒdgƒ}d||f}|i|t|i ƒƒƒdS(Ns,s%ss"insert delayed into %s values (%s)( sjoinslensrows row_formats tableNamescmdscursorsexecutestuplesvalues(scursors tableNamesrows row_formatscmd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstoreRowDelayedÉss TableGroupcBs&tZdZded„Zd„ZRS(s7provide attribute access to dbname qualified tablenamesstestcKsŠti|ƒ||_|tj o ||_nxS|iƒD]E\}}|tj o d|jo|id|}n|||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Ñs     cCs ||SdS(N(sselfsk(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getattr__Ús(s__name__s __module__s__doc__sNones__init__s __getattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys TableGroupÏs  cOs5tƒ}|i||Ž}|iƒ}||fSdS(N(s import_sqlitessqlitesconnectsargsskwargss connectionscursor(sargsskwargsssqlitescursors connection((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssqlite_connectÝs  s DBServerInfocBsGtZdZdeed„Zd„Zed„Zd„Z d„Z RS(s(picklable reference to a database serversMySQLdbcOsyt||_Wn#tj otd|ƒ‚nX||_||_||_||_||_ |io|i otdƒ‚ndS(Ns.Module name not found in _DBServerModuleDict: s4serverSideCursors=True requires blockIterators=True!( s_DBServerModuleDicts moduleNamesselfs __class__sKeyErrors ValueErrorsargsskwargssserverSideCursorssblockIteratorsscustom_iter_keys(sselfs moduleNamesserverSideCursorssblockIteratorssargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ås     cCs6y |iSWn$tj o|iƒ|iSnXdS(s:returns cursor associated with the DB server info (reused)N(sselfs_cursorsAttributeErrors_start_connection(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscursorôs   cCsPt|dƒ o|iƒn|iiƒ}|tj o ||_n|SdS(s2returns a NEW cursor; you must close it yourself! s _connectionN(shasattrsselfs_start_connections _connectionscursors arraysizesNone(sselfs arraysizescursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys new_cursorüs  cCs*|iiƒ|iiƒ|`|`dS(s#Close file containing this databaseN(sselfs_cursorscloses _connection(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscloses   c Cs8td|id|id|id|id|iƒSdS(sreturn all picklable argumentssargsskwargss moduleNamesserverSideCursorsscustom_iter_keysN(sdictsselfsargsskwargss moduleNamesserverSideCursorsscustom_iter_keys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__ s   ( s__name__s __module__s__doc__sFalsesTrues__init__scursorsNones new_cursorscloses __getstate__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys DBServerInfoãs   sMySQLServerInfocBsDtZdZdZd„Zed„Zd„Zed„d„Z RS(s8customized for MySQLdb SSCursor support via new_cursor()smysqlcCs%t|i|iŽ\|_|_dS(N(s mysql_connectsselfsargsskwargss _connections_cursor(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_start_connectionscCs—|i oti||ƒSny |i}Wn7tj o+tdt |i |i Ž\|_}nX|ii ƒ}|t j o ||_n|SdS(s provide streaming cursor supports useStreamingN(sselfsserverSideCursorss DBServerInfos new_cursors arraysizes_conn_sscursorsconnsAttributeErrors mysql_connectsTruesargsskwargsscursorsNone(sselfs arraysizescursorsconn((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys new_cursors  )  cCs>ti|ƒy|iiƒ|`Wntj onXdS(N(s DBServerInfosclosesselfs_conn_sscursorsAttributeError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysclose's    cCs)gi}|D]}||dƒq~S(Ni(sappends_[1]sxst(sxs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys/sc Ks[t|||}y |i}Wntj onX|id|d|d|d|ƒSdS(Nscursorscache_fsmap_fsfetch_f( s BlockIteratorsdbscursorskwargssblock_iteratorscache_fsAttributeErrorsgeneric_iteratorsmap_f(sselfsdbscursorsmap_fscache_fskwargssblock_iterator((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iter_keys.s ( s__name__s __module__s__doc__s _serverTypes_start_connectionsNones new_cursorsclosesiters iter_keys(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMySQLServerInfos    s CursorClosercBs tZdZd„Zd„ZRS(söcontainer for ensuring cursor.close() is called, when this obj deleted. For Python 2.5+, we could replace this with a try... finally clause in a generator function such as generic_iterator(); see PEP 342 or What's New in Python 2.5. cCs ||_dS(N(scursorsself(sselfscursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__=scCs|iiƒdS(N(sselfscursorsclose(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__del__?s(s__name__s __module__s__doc__s__init__s__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys CursorCloser8s  s BlockIteratorcBs#tZdZdd„Zd„ZRS(s5workaround for MySQLdb iteration horrible performancesc  sg||_||_||_||_d|_|doó|i|_|djo8gi}|i D]} ||i | ƒqb~|_ qQt|i ƒ}y|i|ƒ‰Wn/tj o#t|i ƒ‰||g7}nXdi|ƒ|_tt|i ƒƒ|_ ˆdjo‡d†|_qQn'd|ii|_|i df|_ f|_t|_dS( NssorderBys*s,ics)gi}|D]}||ˆƒq~S(N(sappends_[1]sxstsi(sxs_[1]st(si(s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysXss WHERE %s>%%ssid(sdbsselfscursors selectColsskwargss whereClausesiterSQLswhereSQLsappends_[1]s iterColumnsscolsdatas whereParamsslistsindexsis ValueErrorslensjoinsrangescache_fs primary_keysparamssFalsesdone( sselfsdbscursors selectColss whereClauseskwargss_[1]sis iterColumnsscol((sis>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Ds.        8  c Csû|iofSn|ii|i|id|idd|iid|i|i |ii ƒ}t |ƒ|iijot |_|Sn|d}t |ƒdjo5gi}|iD]}|||ƒqº~|_n ||_|i|_|SdS(sget the next block of datascursorslimitsLIMIT %ss selectColsiÿÿÿÿiN(sselfsdonesdbs_selects whereClausesparamsscursors arraysizes selectColsskwargssfetchallsrowsslensTrueslastrowsappends_[1]s whereParamssicolswhereSQL(sselfsrowss_[1]slastrowsicol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__call___s    5  (s__name__s __module__s__doc__s__init__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys BlockIteratorBs  sSQLiteServerInfocBs/tZdZdZd„Zd„Zd„ZRS(s(picklable reference to a sqlite databasessqlitecOs&ti|ddt|ƒ||ŽdS(s)Takes same arguments as sqlite3.connect()ssqlite3sdatabaseN(s DBServerInfos__init__sselfsSourceFileNamesdatabasesargsskwargs(sselfsdatabasesargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ws cCs%t|i|iŽ\|_|_dS(N(ssqlite_connectsselfsargsskwargss _connections_cursor(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_start_connection|scCsQ|iidtƒp |id}|djotdƒ‚nti|ƒSdS(Nsdatabaseis:memory:s+SQLite in-memory database is not picklable!( sselfskwargssgetsFalsesargssdatabases ValueErrors DBServerInfos __getstate__(sselfsdatabase((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__~s# (s__name__s __module__s__doc__s _serverTypes__init__s_start_connections __getstate__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLiteServerInfots   sMySQLdbsMapViewc Bs¡tZdZeeed„ZeZeZd„Ze ddddddddddƒZ e Z e ZeZZZZZZZd „Zd „Zd „ZRS( s4general purpose 1:1 mapping defined by any SQL querycKs°||_||_||_||_|tjo\|tj o|iƒ}qy |i}Wntj ot dƒ‚qX|iƒ}n||_||_|i t ƒdS(Ns&you must provide serverInfo or cursor!( ssourceDBsselfstargetDBsviewSQLs inverseSQLscursorsNones serverInfosAttributeErrors ValueErrorsget_sql_formatsFalse(sselfssourceDBstargetDBsviewSQLscursors serverInfos inverseSQLskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__‹s         cCs¾t|dƒ p|i|ij otdƒ‚n|i|i|ifƒ\}}|i i ||ƒ|i i dƒ}t|ƒdjotdt|ƒƒ‚n|i|ddSdS(Nsdbs0object is not in the sourceDB bound to this map!iis&%s not found in MapView, or not uniquei(shasattrsksdbsselfssourceDBsKeyErrors _format_querysviewSQLsidssqlsparamsscursorsexecutes fetchmanystslensstrstargetDB(sselfsksparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ s$!ssourceDBistargetDBsviewSQLs serverInfos inverseSQLccsDx=|iiƒD],}y|||VWqtj oqXqWdS(s<only yield sourceDB items that are actually in this mapping!N(sselfssourceDBs itervaluessksKeyError(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__°scCs)gi}|D]}||ƒq~SdS(N(sappends_[1]sselfsk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys¸sc Cs‘y |iSWntj os|itjotdƒ‚n|i|i|i|i|i d|i d|i ƒ|_||i_|iSnXdS(Nsthis MapView has no inverseSQL!s serverInfos inverseSQL( sselfs_inversesAttributeErrors inverseSQLsNones ValueErrors __class__stargetDBssourceDBscursors serverInfosviewSQL(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__ºs    (s__name__s __module__s__doc__sNones__init__s_schemaModuleDictsget_table_schemasget_sql_formats __getitem__sdicts _pickleAttrssstandard_getstates __getstate__sstandard_setstates __setstate__sread_only_errors __setitem__s __delitem__sclearspopspopitemsupdates setdefaults__iter__skeyss __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMapView‰s     sGraphViewEdgeDictcBsntZdZd„Zd„Zd„Zd„Zd„Zed„Z d„Z e Z Z ZZZZZRS(s6edge dictionary for GraphView: just pre-loaded on initc Cs%||_||_|ii|ii|ifƒ\}}|iii ||ƒ|iii ƒ}t |ƒdjot d|iƒ‚ngi}|D]}||dƒq™~|_h}|iitj o'xC|D]}|d||dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__És"  '.cCst|iƒSdS(N(slensselfstargets(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__Úsccs&x|iD]}|ii|Vq WdS(N(sselfstargetssksgstargetDB(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__Üs cCst|ƒSdS(N(slistsself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysßsccs||iitj o=xb|iD]+}|ii||ii|i|fVqWn)x%|iD]}|ii|tfVqZWdS(N(sselfsgsedgeDBsNonestargetsskstargetDBs targetDict(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsás - cCs˜y:|i|iij otdƒ‚n|i|i}Wnt j otdƒ‚nX|odSn|ii t j o|ii |Snt SdS(sBfor the specified target object, return its associated edge objectskey is not part of targetDB!skey has no id or db attribute?!N( sosdbsselfsgstargetDBsKeyErrors targetDictsidsedgeIDsAttributeErrors exitIfFoundsedgeDBsNone(sselfsos exitIfFoundsedgeID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__èscCs6y|i|tƒtSWntj o tSnXdS(N(sselfs __getitem__sosTruesKeyErrorsFalse(sselfso((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__ös (s__name__s __module__s__doc__s__init__s__len__s__iter__skeyss iteritemssFalses __getitem__s __contains__sread_only_errors __setitem__s __delitem__sclearspopspopitemsupdates setdefault(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysGraphViewEdgeDictÇs        s GraphViewcBsKtZdZeed„Zd„ZeiiƒZei e ddƒƒRS(s8general purpose graph interface defined by any SQL querycKs)||_ti||||||dS(sFif edgeDB not None, viewSQL query must return (targetID,edgeID) tuplesN( sedgeDBsselfsMapViews__init__ssourceDBstargetDBsviewSQLscursorskwargs(sselfssourceDBstargetDBsviewSQLscursorsedgeDBskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s cCsEt|dƒ p|i|ij otdƒ‚nt||ƒSdS(Nsdbs0object is not in the sourceDB bound to this map!(shasattrsksdbsselfssourceDBsKeyErrorsGraphViewEdgeDict(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__s$sedgeDBi( s__name__s __module__s__doc__sNones__init__s __getitem__sMapViews _pickleAttrsscopysupdatesdict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys GraphViewÿs  s SQLSequencecBs>tZdZd„ZeeƒZd„Zd„Zd„ZRS(szTransparent access to a DB row representing a sequence. Use attrAlias dict to rename 'length' to something else. cKs ||_tid||dS(Nsdb(sdbs seqInfoDictsSQLRows_init_subclassskwargs(sclssdbskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_init_subclasss cCs!ti||ƒti|ƒdS(N(sSQLRows__init__sselfsids SequenceBase(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__scCs |iSdS(N(sselfslength(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__scCs2|id|iidƒ|d||fƒSdS(s@Efficient access to slice of a sequence, useful for huge contigss9%%(SUBSTRING)s(%s %%(SUBSTR_FROM)s %d %%(SUBSTR_FOR)s %d)sseqiN(sselfs_selectsdbs_attrSQLsstartsend(sselfsstartsend((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstrslices(s__name__s __module__s__doc__s_init_subclasss classmethods__init__s__len__sstrslice(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLSequences     sDNASQLSequencecBstZeZRS(N(s__name__s __module__s DNA_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysDNASQLSequence"ssRNASQLSequencecBstZeZRS(N(s__name__s __module__s RNA_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysRNASQLSequence%ssProteinSQLSequencecBstZeZRS(N(s__name__s __module__sPROTEIN_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysProteinSQLSequence(s(vs __future__s generatorssmappingssequences SequenceBases DNA_SEQTYPEs RNA_SEQTYPEsPROTEIN_SEQTYPEstypess classutils methodFactorysstandard_getstatesoverride_rich_cmpsgenerate_itemssget_bound_subclasssstandard_setstatesget_valid_pathsstandard_invertsRecentValueDictionarysread_only_errorsSourceFileNames split_kwargssossplatformsUserDictswarningssloggersobjectsTupleDescriptorsTupleIDDescriptorsTupleDescriptorRWs SQLDescriptorsSQLDescriptorRWsReadOnlyDescriptorsselect_from_rowsinit_row_subclasssdir_rowsTupleOsinsert_and_cache_idsTupleORWs_RWClasssColumnDescriptorsReadOnlyColumnDescs_readOnlyClasssSQLRowsSQLRowRWs list_to_dictsNonesget_name_cursorsFalses mysql_connectsdicts _mysqlMacrossTruesmysql_table_schemas _sqliteMacross import_sqlitessqlite_table_schemas SQLFormatDictsget_table_schemas_schemaModuleDicts DictMixins SQLTableBasesgetKeyssiters iter_keyssSQLTablesgetClusterKeyssSQLTableClusteredsSQLForeignRelationsSQLTableNoCaches _tableclasssSQLTableMultiNoCachesSQLEdgess SQLEdgeDictsSQLEdgelessDicts_edgelessClasssSQLGraphEdgeDescriptorsgetColumnTypessSQLGraphs SQLIDGraphs _IDGraphClasssSQLEdgeDictClusteredsSQLEdgesClusteredDescrsSQLGraphClusteredsSQLIDGraphClusteredsSQLEdgesClusteredsForeignKeyInversesForeignKeyEdgesForeignKeyGraphsdescribeDBTablessindexIDss suffixSubsets PRIMARY_KEYs graphDBTabless StringTypesIntTypes FloatTypesSQLTypeTranslationscreateTableFromReprscreateTableFromRowsstoreRowsstoreRowDelayeds TableGroupssqlite_connects DBServerInfosMySQLServerInfos CursorClosers BlockIteratorsSQLiteServerInfos_DBServerModuleDictsMapViewsGraphViewEdgeDicts GraphViews SQLSequencesDNASQLSequencesRNASQLSequencesProteinSQLSequence(csProteinSQLSequences iter_keysscreateTableFromReprsMapViewsdir_rowsTupleORWsTupleDescriptorsForeignKeyInversesMySQLServerInfosplatforms_DBServerModuleDicts generatorss mysql_connectsSQLEdgesClusteredsgetClusterKeyssgetColumnTypess suffixSubsetsSQLTableClustereds DBServerInfosForeignKeyEdgesPROTEIN_SEQTYPEsSQLIDGraphClustereds_schemaModuleDictsstandard_getstatesReadOnlyColumnDescsRNASQLSequences SQLFormatDictsstandard_invertsgetKeyssForeignKeyGraphs CursorClosers import_sqlitesSQLEdgess TableGroupsSQLTableMultiNoCachesSQLTablesSQLForeignRelationsReadOnlyDescriptors RNA_SEQTYPEsTupleDescriptorRWsgenerate_itemssSQLTypeTranslationsUserDicts methodFactorysstandard_setstatesSQLEdgelessDictsinit_row_subclasssread_only_errors list_to_dictsColumnDescriptorsSQLEdgesClusteredDescrsselect_from_rowsGraphViewEdgeDictsSQLRowRWs BlockIterators SQLTableBasesossSQLRowsTupleIDDescriptorsstoreRowsSQLDescriptorRWssqlite_table_schemas DNA_SEQTYPEs PRIMARY_KEYs SQLIDGraphs split_kwargss SQLDescriptors _sqliteMacross graphDBTablessmysql_table_schemas _mysqlMacrossSourceFileNamesloggersdescribeDBTablessget_valid_pathsstoreRowDelayedsSQLGraphClusteredsSQLEdgeDictClusteredsindexIDssSQLGraphEdgeDescriptorsSQLiteServerInfosRecentValueDictionaryscreateTableFromRowsinsert_and_cache_idsSQLTableNoCachesTupleOssqlite_connects GraphViewswarningssget_name_cursorsDNASQLSequencesoverride_rich_cmps SQLSequencesget_table_schemasSQLGraphs SQLEdgeDictstypess SequenceBasesget_bound_subclass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys?sÄ  O           !   ,     )/ !ÿ? C "- $V  /†   j 5+    *   1$ 2  >8PK6j$; Æ­››pygr/translationDB.pyfrom seqdb import SequenceDB, BasicSeqInfoDict from annotation import AnnotationDB, TranslationAnnot, TranslationAnnotSlice import classutil, sequence import UserDict class SeqTranslator(sequence.SequenceBase): """Translator object for positive or minus strand of a sequence. Slicing returns TranslationAnnotSlice of the appropriate TranslationAnnot representing one of the six possible frames for this sequence.""" def __init__(self, db, id, reversePath=None): self.id = id sequence.SequenceBase.__init__(self) if reversePath: # create top-level object for reverse strand self.orientation = -1 self.start = -len(self) self.stop = 0 self._reverse = reversePath if self.id not in self.db.seqDB: raise KeyError('sequence %s not in db %s' % (self.id, self.db)) def __getitem__(self, k): """get TranslationAnnotSlice for coordinates given by slice k """ start = k.start # deal with [:stop] slices if start is None: start = self.start stop = k.stop # deal with [start:] slices if stop is None: stop = self.stop annoID = self._get_anno_id(start) a = self.db.annodb[annoID] # get TranslationAnnot object s = a.sequence # corresponding nucleotide region return a[(start - s.start) / 3: (stop - s.start) / 3] def absolute_slice(self, start, stop): """get protein slice in absolute nucleotide coords; perform negation before slicing """ if start<0: return (-self)[start:stop] else: return self[start:stop] def __len__(self): return self.db.seqInfoDict[self.id].length def __neg__(self): """get SeqTranslator for the opposite strand """ try: return self._reverse except AttributeError: self._reverse = self.__class__(self.db, self.id, reversePath=self) return self._reverse def _get_anno_id(self, start): """get annotation ID for frame starting at start """ if self.orientation > 0: # positive strand return '%s:%d' % (self.id, start % 3) else: # negative strand return '%s:-%d' % (self.id, (-start) % 3) def iter_frames(self): 'iterate over the 6 possible frames, yielding TranslationAnnot' for frame in ('0', '1', '2', '-0', '-1', '-2'): yield self.db.annodb['%s:%s' % (self.id, frame)] def __repr__(self): return 'SeqTranslator(' + sequence.SequenceBase.__repr__(self) + ')' class TranslationDB(SequenceDB): """Provides an automatic translation interface for a nucleotide sequence database: slicing of top-level sequence objects will return the corresponding TranslationAnnotSlice for that slice, i.e. the translated protein sequence, rather than the nucleotide sequence. """ itemClass = SeqTranslator _seqtype = sequence.DNA_SEQTYPE def __init__(self, seqDB, **kwargs): self.seqDB = seqDB try: self.seqInfoDict = seqDB.seqInfoDict except AttributeError: self.seqInfoDict = BasicSeqInfoDict(seqDB) self.annodb = AnnotationDB(SixFrameInfo(seqDB), seqDB, itemClass=TranslationAnnot, itemSliceClass=TranslationAnnotSlice, sliceAttrDict=dict(id=0,start=1,stop=2), checkFirstID=False) SequenceDB.__init__(self, **kwargs) class SixFrameInfo(object, UserDict.DictMixin): """Dictionary of slice info for all six frames of each seq in seqDB. """ def __init__(self, seqDB): self.seqDB = seqDB def __getitem__(self, k): "convert ID of form seqID:frame into slice info tuple" i = k.rfind(':') if i<0: raise KeyError('invalid TranslationInfo key: %s' % (k,)) seqID = k[:i] length = len(self.seqDB[seqID]) # sequence length frame = int(k[i+1:]) if k[i+1] == '-': # negative frame -0, -1, or -2 return (seqID, -(length - ((length + frame) % 3)), frame) else: # positive frame 0, 1 or 2 return (seqID, frame, length - ((length - frame) % 3)) def __len__(self): return 6 * len(self.seqDB) def __iter__(self): for seqID in self.seqDB: for frame in (':0', ':1', ':2', ':-0', ':-1', ':-2'): yield seqID + frame def keys(self): return list(self) # these methods should not be implemented for read-only database. clear = setdefault = pop = popitem = copy = update = \ classutil.read_only_error def get_translation_db(seqDB): """Use cached seqDB.translationDB if already present, or create it """ try: return seqDB.translationDB except AttributeError: # create a new TranslationAnnot DB tdb = TranslationDB(seqDB) try: seqDB.translationDB = tdb except AttributeError: pass # won't let us cache? Just hand back the TranslationDB return tdb PKŒ.;õLõç ç pygr/translationDB.pyc;ò èu¡Jc@sŸdklZlZdklZlZlZdkZdkZdk Z dei fd„ƒYZ defd„ƒYZ de e ifd„ƒYZd „ZdS( (s SequenceDBsBasicSeqInfoDict(s AnnotationDBsTranslationAnnotsTranslationAnnotSliceNs SeqTranslatorcBsYtZdZed„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z RS( sÒTranslator object for positive or minus strand of a sequence. Slicing returns TranslationAnnotSlice of the appropriate TranslationAnnot representing one of the six possible frames for this sequence.cCs‰||_tii|ƒ|o/d|_t|ƒ |_d|_ ||_ n|i|i i jo t d|i|i fƒ‚ndS(Niÿÿÿÿissequence %s not in db %s(sidsselfssequences SequenceBases__init__s reversePaths orientationslensstartsstops_reversesdbsseqDBsKeyError(sselfsdbsids reversePath((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__ s    cCs“|i}|tjo |i}n|i}|tjo |i}n|i|ƒ}|ii|}|i }|||id||id!SdS(s;get TranslationAnnotSlice for coordinates given by slice k iN( sksstartsNonesselfsstops _get_anno_idsannoIDsdbsannodbsassequencess(sselfsksasstopsannoIDsstartss((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys __getitem__s       cCs,|djo| ||!Sn |||!SdS(sYget protein slice in absolute nucleotide coords; perform negation before slicing iN(sstartsselfsstop(sselfsstartsstop((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pysabsolute_slice&s cCs|ii|iiSdS(N(sselfsdbs seqInfoDictsidslength(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__len__.scCsMy |iSWn;tj o/|i|i|id|ƒ|_|iSnXdS(s*get SeqTranslator for the opposite strand s reversePathN(sselfs_reversesAttributeErrors __class__sdbsid(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__neg__1s cCsC|idjod|i|dfSnd|i| dfSdS(s.get annotation ID for frame starting at start is%s:%dis%s:-%dN(sselfs orientationsidsstart(sselfsstart((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys _get_anno_id:sccsBx;ddddddfD]!}|iid|i|fVqWdS( s=iterate over the 6 possible frames, yielding TranslationAnnots0s1s2s-0s-1s-2s%s:%sN(sframesselfsdbsannodbsid(sselfsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys iter_framesAscCsdtii|ƒdSdS(NsSeqTranslator(s)(ssequences SequenceBases__repr__sself(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__repr__Fs( s__name__s __module__s__doc__sNones__init__s __getitem__sabsolute_slices__len__s__neg__s _get_anno_ids iter_framess__repr__(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys SeqTranslators      s TranslationDBcBs&tZdZeZeiZd„ZRS(sProvides an automatic translation interface for a nucleotide sequence database: slicing of top-level sequence objects will return the corresponding TranslationAnnotSlice for that slice, i.e. the translated protein sequence, rather than the nucleotide sequence. cKs—||_y|i|_Wn"tj ot|ƒ|_nXtt|ƒ|dtdtdt dddddd ƒd t ƒ|_ t i ||dS( Ns itemClasssitemSliceClasss sliceAttrDictsidisstartisstopis checkFirstID(sseqDBsselfs seqInfoDictsAttributeErrorsBasicSeqInfoDicts AnnotationDBs SixFrameInfosTranslationAnnotsTranslationAnnotSlicesdictsFalsesannodbs SequenceDBs__init__skwargs(sselfsseqDBskwargs((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__Qs ( s__name__s __module__s__doc__s SeqTranslators itemClassssequences DNA_SEQTYPEs_seqtypes__init__(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys TranslationDBIs  s SixFrameInfocBsXtZdZd„Zd„Zd„Zd„Zd„Zei Z Z Z Z ZZRS(sBDictionary of slice info for all six frames of each seq in seqDB. cCs ||_dS(N(sseqDBsself(sselfsseqDB((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__bscCs´|idƒ}|djotd|fƒ‚n|| }t|i|ƒ}t ||dƒ}||ddjo||||d |fSn|||||dfSdS(s4convert ID of form seqID:frame into slice info tuples:isinvalid TranslationInfo key: %sis-iN( sksrfindsisKeyErrorsseqIDslensselfsseqDBslengthsintsframe(sselfsksislengthsseqIDsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys __getitem__es  cCsdt|iƒSdS(Ni(slensselfsseqDB(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__len__rsccsCx<|iD]1}x(ddddddfD]}||Vq)Wq WdS(Ns:0s:1s:2s:-0s:-1s:-2(sselfsseqDBsseqIDsframe(sselfsseqIDsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__iter__us  cCst|ƒSdS(N(slistsself(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pyskeyszs(s__name__s __module__s__doc__s__init__s __getitem__s__len__s__iter__skeyss classutilsread_only_errorsclears setdefaultspopspopitemscopysupdate(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys SixFrameInfo`s     cCsXy |iSWnFtj o:t|ƒ}y ||_Wntj onX|SnXdS(s@Use cached seqDB.translationDB if already present, or create it N(sseqDBs translationDBsAttributeErrors TranslationDBstdb(sseqDBstdb((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pysget_translation_dbs   (sseqdbs SequenceDBsBasicSeqInfoDicts annotations AnnotationDBsTranslationAnnotsTranslationAnnotSlices classutilssequencesUserDicts SequenceBases SeqTranslators TranslationDBsobjects DictMixins SixFrameInfosget_translation_db( sTranslationAnnotssequencesUserDicts TranslationDBs SixFrameInfos AnnotationDBs SeqTranslators SequenceDBsget_translation_dbsTranslationAnnotSlicesBasicSeqInfoDicts classutil((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys?s B!PK Œ.;õLõç ç pygr/translationDB.pyo;ò èu¡Jc@sŸdklZlZdklZlZlZdkZdkZdk Z dei fd„ƒYZ defd„ƒYZ de e ifd„ƒYZd „ZdS( (s SequenceDBsBasicSeqInfoDict(s AnnotationDBsTranslationAnnotsTranslationAnnotSliceNs SeqTranslatorcBsYtZdZed„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z RS( sÒTranslator object for positive or minus strand of a sequence. Slicing returns TranslationAnnotSlice of the appropriate TranslationAnnot representing one of the six possible frames for this sequence.cCs‰||_tii|ƒ|o/d|_t|ƒ |_d|_ ||_ n|i|i i jo t d|i|i fƒ‚ndS(Niÿÿÿÿissequence %s not in db %s(sidsselfssequences SequenceBases__init__s reversePaths orientationslensstartsstops_reversesdbsseqDBsKeyError(sselfsdbsids reversePath((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__ s    cCs“|i}|tjo |i}n|i}|tjo |i}n|i|ƒ}|ii|}|i }|||id||id!SdS(s;get TranslationAnnotSlice for coordinates given by slice k iN( sksstartsNonesselfsstops _get_anno_idsannoIDsdbsannodbsassequencess(sselfsksasstopsannoIDsstartss((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys __getitem__s       cCs,|djo| ||!Sn |||!SdS(sYget protein slice in absolute nucleotide coords; perform negation before slicing iN(sstartsselfsstop(sselfsstartsstop((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pysabsolute_slice&s cCs|ii|iiSdS(N(sselfsdbs seqInfoDictsidslength(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__len__.scCsMy |iSWn;tj o/|i|i|id|ƒ|_|iSnXdS(s*get SeqTranslator for the opposite strand s reversePathN(sselfs_reversesAttributeErrors __class__sdbsid(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__neg__1s cCsC|idjod|i|dfSnd|i| dfSdS(s.get annotation ID for frame starting at start is%s:%dis%s:-%dN(sselfs orientationsidsstart(sselfsstart((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys _get_anno_id:sccsBx;ddddddfD]!}|iid|i|fVqWdS( s=iterate over the 6 possible frames, yielding TranslationAnnots0s1s2s-0s-1s-2s%s:%sN(sframesselfsdbsannodbsid(sselfsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys iter_framesAscCsdtii|ƒdSdS(NsSeqTranslator(s)(ssequences SequenceBases__repr__sself(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__repr__Fs( s__name__s __module__s__doc__sNones__init__s __getitem__sabsolute_slices__len__s__neg__s _get_anno_ids iter_framess__repr__(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys SeqTranslators      s TranslationDBcBs&tZdZeZeiZd„ZRS(sProvides an automatic translation interface for a nucleotide sequence database: slicing of top-level sequence objects will return the corresponding TranslationAnnotSlice for that slice, i.e. the translated protein sequence, rather than the nucleotide sequence. cKs—||_y|i|_Wn"tj ot|ƒ|_nXtt|ƒ|dtdtdt dddddd ƒd t ƒ|_ t i ||dS( Ns itemClasssitemSliceClasss sliceAttrDictsidisstartisstopis checkFirstID(sseqDBsselfs seqInfoDictsAttributeErrorsBasicSeqInfoDicts AnnotationDBs SixFrameInfosTranslationAnnotsTranslationAnnotSlicesdictsFalsesannodbs SequenceDBs__init__skwargs(sselfsseqDBskwargs((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__Qs ( s__name__s __module__s__doc__s SeqTranslators itemClassssequences DNA_SEQTYPEs_seqtypes__init__(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys TranslationDBIs  s SixFrameInfocBsXtZdZd„Zd„Zd„Zd„Zd„Zei Z Z Z Z ZZRS(sBDictionary of slice info for all six frames of each seq in seqDB. cCs ||_dS(N(sseqDBsself(sselfsseqDB((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__bscCs´|idƒ}|djotd|fƒ‚n|| }t|i|ƒ}t ||dƒ}||ddjo||||d |fSn|||||dfSdS(s4convert ID of form seqID:frame into slice info tuples:isinvalid TranslationInfo key: %sis-iN( sksrfindsisKeyErrorsseqIDslensselfsseqDBslengthsintsframe(sselfsksislengthsseqIDsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys __getitem__es  cCsdt|iƒSdS(Ni(slensselfsseqDB(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__len__rsccsCx<|iD]1}x(ddddddfD]}||Vq)Wq WdS(Ns:0s:1s:2s:-0s:-1s:-2(sselfsseqDBsseqIDsframe(sselfsseqIDsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__iter__us  cCst|ƒSdS(N(slistsself(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pyskeyszs(s__name__s __module__s__doc__s__init__s __getitem__s__len__s__iter__skeyss classutilsread_only_errorsclears setdefaultspopspopitemscopysupdate(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys SixFrameInfo`s     cCsXy |iSWnFtj o:t|ƒ}y ||_Wntj onX|SnXdS(s@Use cached seqDB.translationDB if already present, or create it N(sseqDBs translationDBsAttributeErrors TranslationDBstdb(sseqDBstdb((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pysget_translation_dbs   (sseqdbs SequenceDBsBasicSeqInfoDicts annotations AnnotationDBsTranslationAnnotsTranslationAnnotSlices classutilssequencesUserDicts SequenceBases SeqTranslators TranslationDBsobjects DictMixins SixFrameInfosget_translation_db( sTranslationAnnotssequencesUserDicts TranslationDBs SixFrameInfos AnnotationDBs SeqTranslators SequenceDBsget_translation_dbsTranslationAnnotSlicesBasicSeqInfoDicts classutil((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys?s B!PK6j$;ðï4F pygr/xnestedlist.pyimport cnestedlist from nlmsa_utils import EmptySliceError,EmptySlice import sequence class NLMSAServer(cnestedlist.NLMSA): 'serves NLMSA via serializable method calls for XMLRPC' xmlrpc_methods={'getSlice':0,'getInfo':0} def getSlice(self,seqID,start,stop): 'perform an interval query and return results as raw ivals' try: seq=self.seqDict[seqID] nlmsa_id,ns,offset=self.seqs[seq] # GET UNION INFO FOR THIS SEQ except KeyError: return '' # failure code ival=sequence.absoluteSlice(seq,start,stop) # GET THE INTERVAL try: myslice=self[ival] # DO THE QUERY except EmptySliceError: return 'EMPTY' except KeyError: return '' # FAILURE CODE ivals=myslice.rawIvals() # GET RAW INTERVAL DATA d={} d[nlmsa_id]=self.seqs.IDdict[str(nlmsa_id)] # SAVE INDEX INFO FOR SOURCE SEQ for v in ivals: # SAVE INDEX INFO FOR TARGET SEQS id=v[2] # target_id NLMSA_ID if not self.seqlist.is_lpo(id): # ONLY NON-LPO SEQS STORED IN THIS INDEX d[id]=self.seqs.IDdict[str(id)] l=[(key,val) for key,val in d.items()] # XMLRPC CAN'T HANDLE int DICT, SO USE LIST return nlmsa_id,ivals,l # LIST OF ALIGNED IVALS, LIST OF (nlmsa_id,(seqID,nsID)) def getInfo(self): 'return list of tuples describing NLMSASequences in this NLMSA' l=[] for ns in self.seqlist: l.append((ns.id,ns.is_lpo,ns.length,ns.is_union)) return l class NLMSAClient(cnestedlist.NLMSA): 'client for accessing NLMSAServer via XMLRPC' def __init__(self,url=None,name=None,idDictClass=dict,**kwargs): cnestedlist.NLMSA.__init__(self,mode='xmlrpc',idDictClass=idDictClass,**kwargs) import coordinator self.server=coordinator.get_connection(url,name) # GET CONNECTION TO THE SERVER self.url=url self.name=name l=self.server.getInfo() # READ NS INFO TABLE for nsID,is_lpo,nsLength,is_union in l: ns=cnestedlist.NLMSASequence(self,None,None,'onDemand',is_union,nsLength) # is_lpo AUTOMATIC self.addToSeqlist(ns) # ADD THIS TO THE INDEX def close(self): pass # required interface, but nothing to do def doSlice(self,seq): 'getSlice from the server, and create an NLMSASlice object from results' result=self.server.getSlice(self.seqs.getSeqID(seq),seq.start,seq.stop) if result=='': raise KeyError('this interval is not aligned!') elif result == 'EMPTY': raise EmptySliceError id,l,d=result for nlmsaID,(seqID,nsID) in d: # SAVE SEQ INFO TO INDEX self.seqs.saveSeq(seqID,nsID,0,nlmsaID) return id,l # HAND BACK THE RAW INTEGER INTERVAL DATA def __getitem__(self,k): 'directly call slice without any ID lookup -- will be done server-side' try: return cnestedlist.NLMSASlice(self.seqlist[0],k.start,k.stop,-1,-1,k) except EmptySliceError: return EmptySlice(k) def __getstate__(self): return dict(url=self.url,name=self.name,seqDict=self.seqDict) PKŒ.;2 ,mpygr/xnestedlist.pyc;ò èu¡Jc@s[dkZdklZlZdkZdeifd„ƒYZdeifd„ƒYZdS(N(sEmptySliceErrors EmptySlices NLMSAServercBs8tZdZhdd<dd'ss Bio.MSA.UCSC.c sÛ|tjo d„}n|tjo‡d†}ndkl}dkl} t||||| ƒ}xC|i ƒD]5\}} || ƒ} ||ƒ| _| ||d ,scs ˆ|d S(Niýÿÿÿ(s resourceStemsx(sx(s resourceStem(sLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pys.s(s NLMSABuilder(s SourceURLiüÿÿÿ(s worldbaseN(sfileDocumentersNones fileNamerspygr.nlmsa_utilss NLMSABuilderspygr.downloaders SourceURLscatalog_downloadssurls fileFiltersdsitemssresIDsosnlmsas__doc__spygrs worldbases add_resourcescommit( surls fileFilters resourceStemsfileDocumenters fileNamersresIDsds worldbases NLMSABuilders SourceURLsosnlmsa((s resourceStemsLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pyssave_NLMSA_downloaders's$            N(scatalog_downloadssNonessave_NLMSA_downloaders(scatalog_downloadsssave_NLMSA_downloaders((sLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pys?s $PKŒ.;‡=OV­ ­ pygr/apps/catalog_downloads.pyo;ò ɪJc@s%d„Zd„deed„ZdS(cCsódk} dk} dk} | i|ƒ}z5| i| iƒƒ} | i |i ƒƒ| i }Wd|i ƒXh}|ddjo|d7}nxV|D]N} || ƒo;|| i|| ƒƒ}|| ƒ|_|||| ƒ'ss Bio.MSA.UCSC.c sÛ|tjo d„}n|tjo‡d†}ndkl}dkl} t||||| ƒ}xC|i ƒD]5\}} || ƒ} ||ƒ| _| ||d ,scs ˆ|d S(Niýÿÿÿ(s resourceStemsx(sx(s resourceStem(sLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pys.s(s NLMSABuilder(s SourceURLiüÿÿÿ(s worldbaseN(sfileDocumentersNones fileNamerspygr.nlmsa_utilss NLMSABuilderspygr.downloaders SourceURLscatalog_downloadssurls fileFiltersdsitemssresIDsosnlmsas__doc__spygrs worldbases add_resourcescommit( surls fileFilters resourceStemsfileDocumenters fileNamersresIDsds worldbases NLMSABuilders SourceURLsosnlmsa((s resourceStemsLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pyssave_NLMSA_downloaders's$            N(scatalog_downloadssNonessave_NLMSA_downloaders(scatalog_downloadsssave_NLMSA_downloaders((sLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pys?s $PK`x+;’¬‰    pygr/apps/leelabdb.pyimport MySQLdb import os from splicegraph import * spliceCalcs={'HUMAN_SPLICE_03': TableGroup(db='HUMAN_SPLICE_03',suffix='JUN03',clusters='cluster_JUN03', exons='exon_formJUN03',splices='splice_verification_JUN03', genomic='genomic_cluster_JUN03',mrna='mrna_seqJUN03', protein='protein_seqJUN03'), 'HUMAN_SPLICE': TableGroup(db='HUMAN_SPLICE',suffix='jan02',clusters='cluster_jan02', exons='HUMAN_ISOFORMS.exon_form_4',splices='splice_verification_jan02', genomic='genomic_cluster_jan02',mrna='HUMAN_ISOFORMS.mrna_seq_4', protein='HUMAN_ISOFORMS.protein_seq_4'), 'MOUSE_SPLICE': TableGroup(db='MOUSE_SPLICE',suffix='jan02',clusters='cluster_jan02', exons='MOUSE_ISOFORMS.exon_form_2',splices='splice_verification_jan02', genomic='genomic_cluster_jan02',mrna='MOUSE_ISOFORMS.mrna_seq_2', protein='MOUSE_ISOFORMS.protein_seq_2'), 'MOUSE_SPLICE_03': TableGroup(db='MOUSE_SPLICE_03',suffix='JUN03',clusters='cluster_JUN03', exons='exon_formJUN03',splices='splice_verification_JUN03', genomic='genomic_cluster_JUN03',mrna='mrna_seqJUN03', protein='protein_seqJUN03') } def getUserCursor(db): 'get a cursor as the current user' db=MySQLdb.connect(db=db,read_default_file=os.environ['HOME']+'/.my.cnf',compress=True) return db.cursor() def getSpliceGraphFromDB(dbgroup,loadAll=False): """load data from MySQL using the designated database table group. If loadAll true, then load the entire splice graph into memory.""" cursor=getUserCursor(dbgroup.db) import sys print >>sys.stderr,'Reading database schema...' idDict={} tables=describeDBTables(dbgroup.db,cursor,idDict) if hasattr(dbgroup,'suffix'): tables=suffixSubset(tables,dbgroup.suffix) # SET OF TABLES ENDING IN JUN03 idDict=indexIDs(tables) # CREATE AN INDEX OF THEIR PRIMARY KEYS for t in dbgroup.values(): if t is not None and '.' in t and t not in tables: # THIS TABLE COMES FROM ANOTHER DATABASE... tables[t]=SQLTable(t,cursor) # SO GET IT FROM OTHER DATABASE # LOAD DATA & BUILD THE SPLICE GRAPH return loadSpliceGraph(tables,dbgroup.clusters,dbgroup.exons,dbgroup.splices, dbgroup.genomic,dbgroup.mrna,dbgroup.protein,loadAll) def localCopy(localFile,cpCommand): 'if not already present on local file location, run cpCommand' if not os.access(localFile,os.R_OK): cmd=cpCommand % localFile print 'copying data:',cmd exit_code=os.system(cmd) if exit_code!=0: raise OSError((exit_code,'command failed: %s' % cmd)) return localFile PKŒ.;®@ pygr/apps/leelabdb.pyc;ò ɪJc@s1dkZdkZdkThdedddddddd d d d d ddddƒ<deddddddddd dd dddddƒ<deddddddddd dd dddddƒ<dedddddddd d d d d ddddƒ0: if(rev): align[-(lpoStart+len(ival)):-lpoStart]=seq[seqStart:seqStart+len(ival)] else: align[lpoStart:lpoStart+len(ival)]=seq[seqStart:seqStart+len(ival)] seqStart+=len(ival) lpoStart+=len(ival)+1 s=fh.readline().split() maf2nclist(['chrX.maf',],'testdb/chrX') PKŒ.;|,÷ÍÍpygr/apps/maf2nclist.pyc;ò ɪJc@s4dkTdkTd„Zd„ZedgdƒdS((s*cCsöt|dƒ}h}xÌ|D]Ä}t|dƒ}|iƒi ƒddjod|‚n|iƒ}xu|om|i ƒ}t |ƒdjp|ddjon*|ddjot |||ƒndS|iƒ}qkWqW|iƒ|SdS(Nswsris##mafs(Error processing %s: Invalid file formats#sa(s NLMSALetterssstemsalignsseqssmaffilessisopensfsreadlinessplitslslaslensstoreMAFrecordsbuild(smaffilessstemsfsisalignslaslsseqs((sEbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2nclist.pys maf2nclists&  $ c Cs‹|iƒiƒ}|idi}xbt|ƒdjo|ddjo=|}t |dƒ}y||d}Wn%t|dƒ}|||d0: uid+=string.letters[cum%alen] cum/=alen uid+=string.letters[cum%alen] self._vid+=1 return AnonSequence(slen,uid) def _dump(self,alignTab,sequenceTab=None): for row in self.mAlign.repr_dict(): alignTab.write('\t'.join(map(lambda x:str(x), row.values()))+'\n'); if(sequenceTab): for s in self.sequences.values(): for inter in s.known_int(): sequenceTab.write('\t'.join(map(lambda x:str(x), inter.values()))+'\n') del self.mAlign del self.sequences self.mAlign=PathMapping() self.sequences={} def parseIntoDB(self,filehandle,cursor,alignTab,sequenceTab=None, update=None): """parses the .maf filehandle into database using cursors""" c=filehandle.tell() filehandle.seek(0,2) filesize=filehandle.tell() filehandle.seek(c) l=filehandle.readline(); rc=0 count=0 if l.split()[0]!='##maf': return else: self.setpar(l.split()[1:]) l=filehandle.readline() while l: la = l.split(); ## print la if(len(la)==0 or la[0]=='#'): ## print "skipping" 1 elif(la[0]=='a'): ## print "reading alignment" count+=1 self.readalign(la[1:],filehandle) self._dump(alignTab,sequenceTab) if(update and not count%1000): cursor.execute(update %(int(filehandle.tell()*100./filesize))) else: ## print "end of records" return l=filehandle.readline() PKŒ.; .v¸vvpygr/apps/maf2VSgraph.pyc;ò ɪJc@sMdklZdkTdkTdkZd„Zd„Zdfd„ƒYZdS((s generators(s*Nccsád}d}d}xvtt|ƒƒD]b}||djoK||jo&|||||||||!fVn|d}|d7}q%q%W|djodSn|d}||jo&|||||||||!fVndS(Nis-i(sbeginsgapssendsrangeslenss(sssbeginsendsgaps((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys refIntervalss &    cCs½hdd<dd<dd<dd<dd<dd<dd<d d <d d <dd<d d<d d <}d igi}|ddd…D]}||i||ƒƒq“~ƒSdS(NsastscsgsusnsAsTsCsGsUsNsiÿÿÿÿ(scomplsjoinsappends_[1]ssscsget(sss_[1]scscompl((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pysreverse_complementsrs MafParsercBs_tZdZhZdd„Zd„Zd„Zd„Zd„Ze d„Z e e d„Z RS( sì Parses .maf files as defined by the Haussler dataset. The results of parsing are available as pathmapping between the sequences in the alignment. The sequences themselves are assumed unknown and use AnonSequence class. scCs+tƒ|_h|_||_d|_dS(Ni(s PathMappingsselfsmAligns sequencessvbases_vid(sselfsvbase((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys__init__$s   cCs7x0|D](}|idƒ\}}||i|:437cCsÒ|iƒ}|iƒddjodSn|i|iƒdƒ|iƒ}x}|ou|iƒ}t|ƒdjp|ddjodn.|ddjo|i|d|ƒndS|iƒ}qQWdS(sparses the .maf filehandle is##mafNis#sa( s filehandlesreadlineslssplitsselfssetparslaslens readalign(sselfs filehandleslasl((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pysparseQs   $cCsŽttiƒ}|i}|i}x5||djo#|ti||7}||:}q$W|ti||7}|id7_t ||ƒSdS(Nii( slensstringsletterssalensselfsvbasesuids_vidscums AnonSequencesslen(sselfsslensuidsalenscum((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys_vseqis  cCsÓxC|iiƒD]2}|iditd„|iƒƒƒdƒqW|oax^|i iƒD]I}x@|i ƒD]2}|iditd„|iƒƒƒdƒqpWq]Wn|`|` tƒ|_h|_ dS(Ns cCs t|ƒS(N(sstrsx(sx((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pysvss (sselfsmAligns repr_dictsrowsalignTabswritesjoinsmapsvaluess sequenceTabs sequencessss known_intsinters PathMapping(sselfsalignTabs sequenceTabsssintersrow((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys_dumpts0 8 c Csi|iƒ}|iddƒ|iƒ} |i|ƒ|iƒ} d} d}| i ƒddjodSn|i | i ƒdƒ|iƒ} xÓ| oË| i ƒ}t |ƒdjp|ddjodn„|ddjon|d7}|i|d|ƒ|i||ƒ|o |d o)|i|t|iƒd | ƒƒqTndS|iƒ} q’WdS( s6parses the .maf filehandle into database using cursorsiis##mafNis#saièf100.0(s filehandlestellscsseeksfilesizesreadlineslsrcscountssplitsselfssetparslaslens readaligns_dumpsalignTabs sequenceTabsupdatescursorsexecutesint( sselfs filehandlescursorsalignTabs sequenceTabsupdatescountscslasrcslsfilesize((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys parseIntoDB‚s2      $ -( s__name__s __module__s__doc__soptionss__init__ssetpars readalignsparses_vseqsNones_dumps parseIntoDB(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys MafParsers    !  (s __future__s generatorssseqrefs pygr.seqdbsstrings refIntervalssreverse_complements MafParser(s MafParsersreverse_complements generatorssstrings refIntervals((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys?s    PK Œ.; .v¸vvpygr/apps/maf2VSgraph.pyo;ò ɪJc@sMdklZdkTdkTdkZd„Zd„Zdfd„ƒYZdS((s generators(s*Nccsád}d}d}xvtt|ƒƒD]b}||djoK||jo&|||||||||!fVn|d}|d7}q%q%W|djodSn|d}||jo&|||||||||!fVndS(Nis-i(sbeginsgapssendsrangeslenss(sssbeginsendsgaps((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys refIntervalss &    cCs½hdd<dd<dd<dd<dd<dd<dd<d d <d d <dd<d d<d d <}d igi}|ddd…D]}||i||ƒƒq“~ƒSdS(NsastscsgsusnsAsTsCsGsUsNsiÿÿÿÿ(scomplsjoinsappends_[1]ssscsget(sss_[1]scscompl((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pysreverse_complementsrs MafParsercBs_tZdZhZdd„Zd„Zd„Zd„Zd„Ze d„Z e e d„Z RS( sì Parses .maf files as defined by the Haussler dataset. The results of parsing are available as pathmapping between the sequences in the alignment. The sequences themselves are assumed unknown and use AnonSequence class. scCs+tƒ|_h|_||_d|_dS(Ni(s PathMappingsselfsmAligns sequencessvbases_vid(sselfsvbase((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys__init__$s   cCs7x0|D](}|idƒ\}}||i|:437cCsÒ|iƒ}|iƒddjodSn|i|iƒdƒ|iƒ}x}|ou|iƒ}t|ƒdjp|ddjodn.|ddjo|i|d|ƒndS|iƒ}qQWdS(sparses the .maf filehandle is##mafNis#sa( s filehandlesreadlineslssplitsselfssetparslaslens readalign(sselfs filehandleslasl((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pysparseQs   $cCsŽttiƒ}|i}|i}x5||djo#|ti||7}||:}q$W|ti||7}|id7_t ||ƒSdS(Nii( slensstringsletterssalensselfsvbasesuids_vidscums AnonSequencesslen(sselfsslensuidsalenscum((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys_vseqis  cCsÓxC|iiƒD]2}|iditd„|iƒƒƒdƒqW|oax^|i iƒD]I}x@|i ƒD]2}|iditd„|iƒƒƒdƒqpWq]Wn|`|` tƒ|_h|_ dS(Ns cCs t|ƒS(N(sstrsx(sx((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pysvss (sselfsmAligns repr_dictsrowsalignTabswritesjoinsmapsvaluess sequenceTabs sequencessss known_intsinters PathMapping(sselfsalignTabs sequenceTabsssintersrow((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys_dumpts0 8 c Csi|iƒ}|iddƒ|iƒ} |i|ƒ|iƒ} d} d}| i ƒddjodSn|i | i ƒdƒ|iƒ} xÓ| oË| i ƒ}t |ƒdjp|ddjodn„|ddjon|d7}|i|d|ƒ|i||ƒ|o |d o)|i|t|iƒd | ƒƒqTndS|iƒ} q’WdS( s6parses the .maf filehandle into database using cursorsiis##mafNis#saièf100.0(s filehandlestellscsseeksfilesizesreadlineslsrcscountssplitsselfssetparslaslens readaligns_dumpsalignTabs sequenceTabsupdatescursorsexecutesint( sselfs filehandlescursorsalignTabs sequenceTabsupdatescountscslasrcslsfilesize((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys parseIntoDB‚s2      $ -( s__name__s __module__s__doc__soptionss__init__ssetpars readalignsparses_vseqsNones_dumps parseIntoDB(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys MafParsers    !  (s __future__s generatorssseqrefs pygr.seqdbsstrings refIntervalssreverse_complements MafParser(s MafParsersreverse_complements generatorssstrings refIntervals((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys?s    PK`x+;Øiþ þ pygr/apps/seqref.pyfrom __future__ import generators from pygr.sequence import * #from pathquery import * class AnonSequence(Sequence): """Defines a sequence class with unknown sequence, but known length""" def __init__(self, length, id): s='' self.known=list() Sequence.__init__(self,s,id) self.stop=length def seqsplice(self,s,start,end): (begin,stop,step)=slice(start,end).indices(self.stop) if(startend: self.known+=[(s[::-1],start,stop)] def known_int(self): for u in self.known: yield {'src_id':self.id,'start':u[1],'end':u[2],'seq':u[0]} class ReferenceSequence(Sequence): """Defines a reference sequence class that is subscriptable by other sequences. If sequence ids match the resulting sequnce will reference this class. This is useful for coordinate transforms when an unknown sequence intervals are transformed to known sequence""" def __init__(self, s,id): Sequence.__init__(self,s,id) def __getitem__(self,iv): if(isinstance(iv,SeqPath)): if(iv.id==self.id): s=self[iv.start:iv.stop:iv.step] s.orientation=iv.orientation return s else: return SeqPath.__getitem__(self,iv) def mapCoordinates(self, obj): m=PathMapping2() for ival in obj: m[ival]=self[ival] return m class UnkSequence(SeqPath): """Defines a sequence class for pure interval manipulation. No sequence information (i.e. length, or seq itself) is needed. """ def __init__(self,id,start=0,end=0,step=1,orientation=1): self.id=id SeqPath.__init__(self,id) self.start=start self.stop=end self.step=step self.orientation=orientation if(self.start is not None and self.stop is not None and self.start>self.stop): t=self.start if(self.stop>=0): self.start=self.stop+1 else: self.start=self.stop if(t>=0): self.stop=t+1 else: self.stop=t self.orientation=-self.orientation def __getitem__(self,k): if isinstance(k,types.SliceType): (start,stop,step)=(k.start,k.stop,k.step) if k.step==None: step=1 elif isinstance(k,types.IntType): start=k stop=k+1 if(k==-1): stop=None step=1 return self[start:stop:step] else: raise KeyError('requires a slice object or integer key') if self.step==1 and stop!=None: return UnkSequence(self.id,self.start+start*self.step, self.start+stop*self.step, self.step*step,self.orientation) else: return UnkSequence(self.id,start,stop,step,self.orientation) PKŒ.;G½‚.55pygr/apps/seqref.pyc;ò ɪJc@sZdklZdkTdefd„ƒYZdefd„ƒYZdefd„ƒYZdS( (s generators(s*s AnonSequencecBs)tZdZd„Zd„Zd„ZRS(sDDefines a sequence class with unknown sequence, but known lengthcCs2d}tƒ|_ti|||ƒ||_dS(Ns( ssslistsselfsknownsSequences__init__sidslengthsstop(sselfslengthsidss((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/seqref.pys__init__s cCst||ƒi|iƒ\}}}||jo|i|||fg7_n:||jo,|i|ddd…||fg7_ndS(Niÿÿÿÿ( sslicesstartsendsindicessselfsstopsbeginsstepsknownss(sselfsssstartsendsbeginsstopsstep((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/seqref.pys seqsplices $  ccsOxH|iD]=}hd|i<d|d<d|d<d|dyti||ƒSWn#tj oti||ƒSnXdS(s>both parent classes have getattr, so have to call them both...N(sTupleOs __getattr__sselfsattrsAttributeErrorsSeqPath(sselfsattr((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys __getattr__Gs (s__name__s __module__s__init__s __getattr__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysExonFormBs sSplicecBstZRS(N(s__name__s __module__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysSpliceNsc sýtƒ‰tƒ‰tƒ}tƒ}tƒ}dtfd„ƒY} ||}|i | ƒ|t j o||}|i tƒnt }|t j oAdtfd„ƒY} ||} | i | ƒ| iddƒnt } ||} t|df|df|d ffƒt_| i tƒ|od | GH| itƒn||}d tf‡‡d †ƒY}|i |ƒ|od |GH|i|ƒn||}|i t"ƒ|o$d |GH|it"ƒd GHx(|i#ƒD]}ˆ|7‰ˆ|7‰qØWdGHxT| i#ƒD]F}||i&}y|i'|7_'||7}Wqt(j oqXqWdGHxJ|i#ƒD]<} y|| i&}Wnt*j oqdX|i!| 7_!qdWdGHx(|i#ƒD]}t+|||ƒq¶Wn|| ||||||| ˆˆf SdS(sK Build a splice graph from the specified SQL tables representing gene clusters, exon forms, and splices. Each table must be specified as a DB.TABLENAME string. These tables are loaded into memory. The splice graph is built based on exact match of exon ends and splice ends. In addition, also builds alt5Graph (exons that match at start, but differ at end) and alt3Graph (exons that match at end, but differ at start). Loads all cluster, exon and splice data if loadAll is True. Returns tuple: clusters,exons,splices,spliceGraph,alt5Graph,alt3Graph sYiGenomicSequencecBstZd„ZRS(NcCs|idƒSdS(Ns length(seq)(sselfs_select(sself((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys__len__js(s__name__s __module__s__len__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysYiGenomicSequenceissYiProteinSQLSequencecBstZd„ZRS(NcCs |iSdS(N(sselfsprotein_length(sself((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys__len__vs(s__name__s __module__s__len__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysYiProteinSQLSequenceussseqs protein_seqsnextsalt5salt3s Loading %s...sClustercs&tZeˆdfˆdffƒZRS(Nsexonsssplices(s__name__s __module__s SchemaDicts clusterExonssclusterSplicess__class_schema__((s clusterExonssclusterSplices(sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysCluster†ssAdding clusters to graph...sAdding exons to graph...sAdding splices to graph...sBuilding splice graph...N(,s dictGraphs clusterExonssclusterSplicess spliceGraphsalt5salt3sDNASQLSequencesYiGenomicSequencesjun03s genomic_seq_tsgsobjclasss mrna_seq_tsNonesmrnas SQLSequences protein_seq_tsProteinSQLSequencesYiProteinSQLSequencesproteins addAttrAliassexon_ts exon_formss SchemaDictsExonForms__class_schema__sloadAllsloads cluster_tsclusterssTupleOsClusterssplice_tssplicessSplicesvaluesscses cluster_idsexonss IndexErrorsssKeyErrorsbuildClusterSpliceGraph(sjun03s cluster_tsexon_tssplice_ts genomic_seq_ts mrna_seq_ts protein_seq_tsloadAllssplicessYiGenomicSequencesproteinsYiProteinSQLSequencesss exon_formssclusterssalt5salt3s clusterExonssclusterSplicesscsesgsClustersmrnas spliceGraph((s clusterExonssclusterSplicessFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysloadSpliceGraphRs~              *                N( s pygr.sqlgraphs pygr.sequences pygr.seqdbsbuildClusterSpliceGraphs loadClustersTupleOsSeqPathsExonFormsSplicesNonesTruesloadSpliceGraph(s loadClustersSplicesbuildClusterSpliceGraphsExonFormsloadSpliceGraph((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys?s .  PK Œ.;˜`1‡‡pygr/apps/splicegraph.pyo;ò ɪJc@sldkTdkTdkTd„Zd„Zdeefd„ƒYZdefd„ƒYZe e e d„Z dS( (s*c Cs8h}h}g}x{|iD]p} | i|jog|| iyti||ƒSWn#tj oti||ƒSnXdS(s>both parent classes have getattr, so have to call them both...N(sTupleOs __getattr__sselfsattrsAttributeErrorsSeqPath(sselfsattr((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys __getattr__Gs (s__name__s __module__s__init__s __getattr__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysExonFormBs sSplicecBstZRS(N(s__name__s __module__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysSpliceNsc sýtƒ‰tƒ‰tƒ}tƒ}tƒ}dtfd„ƒY} ||}|i | ƒ|t j o||}|i tƒnt }|t j oAdtfd„ƒY} ||} | i | ƒ| iddƒnt } ||} t|df|df|d ffƒt_| i tƒ|od | GH| itƒn||}d tf‡‡d †ƒY}|i |ƒ|od |GH|i|ƒn||}|i t"ƒ|o$d |GH|it"ƒd GHx(|i#ƒD]}ˆ|7‰ˆ|7‰qØWdGHxT| i#ƒD]F}||i&}y|i'|7_'||7}Wqt(j oqXqWdGHxJ|i#ƒD]<} y|| i&}Wnt*j oqdX|i!| 7_!qdWdGHx(|i#ƒD]}t+|||ƒq¶Wn|| ||||||| ˆˆf SdS(sK Build a splice graph from the specified SQL tables representing gene clusters, exon forms, and splices. Each table must be specified as a DB.TABLENAME string. These tables are loaded into memory. The splice graph is built based on exact match of exon ends and splice ends. In addition, also builds alt5Graph (exons that match at start, but differ at end) and alt3Graph (exons that match at end, but differ at start). Loads all cluster, exon and splice data if loadAll is True. Returns tuple: clusters,exons,splices,spliceGraph,alt5Graph,alt3Graph sYiGenomicSequencecBstZd„ZRS(NcCs|idƒSdS(Ns length(seq)(sselfs_select(sself((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys__len__js(s__name__s __module__s__len__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysYiGenomicSequenceissYiProteinSQLSequencecBstZd„ZRS(NcCs |iSdS(N(sselfsprotein_length(sself((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys__len__vs(s__name__s __module__s__len__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysYiProteinSQLSequenceussseqs protein_seqsnextsalt5salt3s Loading %s...sClustercs&tZeˆdfˆdffƒZRS(Nsexonsssplices(s__name__s __module__s SchemaDicts clusterExonssclusterSplicess__class_schema__((s clusterExonssclusterSplices(sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysCluster†ssAdding clusters to graph...sAdding exons to graph...sAdding splices to graph...sBuilding splice graph...N(,s dictGraphs clusterExonssclusterSplicess spliceGraphsalt5salt3sDNASQLSequencesYiGenomicSequencesjun03s genomic_seq_tsgsobjclasss mrna_seq_tsNonesmrnas SQLSequences protein_seq_tsProteinSQLSequencesYiProteinSQLSequencesproteins addAttrAliassexon_ts exon_formss SchemaDictsExonForms__class_schema__sloadAllsloads cluster_tsclusterssTupleOsClusterssplice_tssplicessSplicesvaluesscses cluster_idsexonss IndexErrorsssKeyErrorsbuildClusterSpliceGraph(sjun03s cluster_tsexon_tssplice_ts genomic_seq_ts mrna_seq_ts protein_seq_tsloadAllssplicessYiGenomicSequencesproteinsYiProteinSQLSequencesss exon_formssclusterssalt5salt3s clusterExonssclusterSplicesscsesgsClustersmrnas spliceGraph((s clusterExonssclusterSplicessFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysloadSpliceGraphRs~              *                N( s pygr.sqlgraphs pygr.sequences pygr.seqdbsbuildClusterSpliceGraphs loadClustersTupleOsSeqPathsExonFormsSplicesNonesTruesloadSpliceGraph(s loadClustersSplicesbuildClusterSpliceGraphsExonFormsloadSpliceGraph((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys?s .  PKœŒ.;“×2¤EGG-INFO/dependency_links.txtPK Œ.;ÍÒ11¤<EGG-INFO/native_libs.txtPK Œ.;“×2¤£EGG-INFO/not-zip-safePKœŒ.;ØÁ»èžž¤×EGG-INFO/PKG-INFOPKœŒ.;»Eˆ  ¤¤EGG-INFO/SOURCES.txtPKœŒ.; ׃™¤ãEGG-INFO/top_level.txtPK`x+;2ó\œJJ¤pygr/__init__.pyPKŒ.;«ô¨¨¤”pygr/__init__.pycPKŒ.;«ô¨¨¤kpygr/__init__.pyoPK`x+;î)·å E E¤B pygr/annotation.pyPKŒ.; ¨Põqõq¤fpygr/annotation.pycPKŒ.; ¨Põqõq¤8Øpygr/annotation.pyoPK`x+;¸¤•TT ¤^Jpygr/blast.pyPKŒ.;ÛY¶íéhéh¤¢žpygr/blast.pycPK Œ.;ÛY¶íéhéh¤·pygr/blast.pyoPK Œ.;‘‹ ¤Ìppygr/cdict.pyPK Œ.;sMM¤ rpygr/cdict.pycPK Œ.;sMM¤ƒtpygr/cdict.pyoPKiŒ.;m½Ã¸¸ ¤üvpygr/cdict.soPK5u);3Pù%íZíZ¤ßpygr/classutil.pyPKŒ.;üésJ€J€¤ûêpygr/classutil.pycPK Œ.;üésJ€J€¤ukpygr/classutil.pyoPK Œ.;Èå¤ïëpygr/cnestedlist.pyPK Œ.;wšë__¤9ípygr/cnestedlist.pycPK Œ.;wšë__¤Êïpygr/cnestedlist.pyoPK”Œ.;†¸  ¤[òpygr/cnestedlist.soPK2M*;ÂÑ6UÔUÔ¤Œ´pygr/coordinator.pyPKŒ.;yöÄ´ûüûü¤‰pygr/coordinator.pycPK Œ.;yöÄ´ûüûü¤?†pygr/coordinator.pyoPK`x+;ʧkÀh h ¤lƒpygr/Data.pyPKŒ.;Ò½É-- ¤þŒpygr/Data.pycPK Œ.;Ò½É-- ¤V›pygr/Data.pyoPKu);uâ xcc¤®©pygr/dbfile.pyPKŒ.;!!w((¤=¾pygr/dbfile.pycPK Œ.;!!w((¤’Ûpygr/dbfile.pyoPK6j$;PëX#­"­"¤çøpygr/downloader.pyPKŒ.;%ôzc²,²,¤Äpygr/downloader.pycPK Œ.;%ôzc²,²,¤§Hpygr/downloader.pyoPKŒ|;þ„Hè,t,t¤Šupygr/graphquery.pyPKŒ.;"|ÔÓ„Ó„¤æépygr/graphquery.pycPK Œ.;"|ÔÓ„Ó„¤ênpygr/graphquery.pyoPK6j$;‘ߪ33¤îópygr/logger.pyPKŒ.;:¨ßEÇ Ç ¤Müpygr/logger.pycPK Œ.;:¨ßEÇ Ç ¤Apygr/logger.pyoPK6j$;¸ªá{{¤5pygr/mapping.pyPKŒ.;ñmÜ ˆÖˆÖ¤ypygr/mapping.pycPK Œ.;ñmÜ ˆÖˆÖ¤/dpygr/mapping.pyoPK5u);áŠÏà¢ý¢ý¤å:pygr/metabase.pyPKŒ.;@ ±$ÈQÈQ¤µ8pygr/metabase.pycPK Œ.;@ ±$ÈQÈQ¤¬Špygr/metabase.pyoPK6j$;Ë n:çDçD¤£Üpygr/nlmsa_utils.pyPKŒ.;¶b£f£f¤»! pygr/nlmsa_utils.pycPK Œ.;¶b£f£f¤ˆ pygr/nlmsa_utils.pyoPK6j$;Ì{Ñ Ñ ¤eï pygr/parse_blast.pyPKŒ.;¸«ã€Î'Î'¤g!pygr/parse_blast.pycPK Œ.;¸«ã€Î'Î'¤g8!pygr/parse_blast.pyoPKŒ|;;*G]]¤g`!pygr/schema.pyPKŒ.;ÖT''¤ðu!pygr/schema.pycPK Œ.;ÖT''¤D‘!pygr/schema.pyoPK6j$;t ™a¾¥¾¥ ¤˜¬!pygr/seqdb.pyPKŒ.;«'ÇÕàà¤R"pygr/seqdb.pycPK Œ.;«'ÇÕàà¤Æ2#pygr/seqdb.pyoPK Œ.;“H¤ $pygr/seqfmt.pyPK Œ.;¥•jÈPP¤K$pygr/seqfmt.pycPK Œ.;¥•jÈPP¤È$pygr/seqfmt.pyoPKcŒ.;<1/~~¤E$pygr/seqfmt.soPK5u);Xˆ { {¤…—$pygr/sequence.pyPKŒ.;åµ I~ž~ž¤½%pygr/sequence.pycPK Œ.;åµ I~ž~ž¤j±%pygr/sequence.pyoPK6j$;?~¿Ohh¤P&pygr/sequtil.pyPKŒ.;ÎΤDLL¤¬b&pygr/sequtil.pycPK Œ.;ÎΤDLL¤&|&pygr/sequtil.pyoPKcx+;Ʋ)çØhØh¤ •&pygr/sqlgraph.pyPKŒ.;}óŽp˜æ˜æ¤¦þ'pygr/sqlgraph.pycPK Œ.;}óŽp˜æ˜æ¤må)pygr/sqlgraph.pyoPK6j$; Æ­››¤4Ì+pygr/translationDB.pyPKŒ.;õLõç ç ¤á+pygr/translationDB.pycPK Œ.;õLõç ç ¤,pygr/translationDB.pyoPK6j$;ðï4F ¤8#,pygr/xnestedlist.pyPKŒ.;2 ,m¤ø/,pygr/xnestedlist.pycPK Œ.;2 ,m¤FD,pygr/xnestedlist.pyoPK`x+;ÿ³ee¤”X,pygr/apps/__init__.pyPKŒ.;Ñí×ìýý¤,Y,pygr/apps/__init__.pycPKŒ.;Ñí×ìýý¤]Z,pygr/apps/__init__.pyoPK`x+;™Ýƒá¼ ¼ ¤Ž[,pygr/apps/catalog_downloads.pyPKŒ.;‡=OV­ ­ ¤†e,pygr/apps/catalog_downloads.pycPKŒ.;‡=OV­ ­ ¤ps,pygr/apps/catalog_downloads.pyoPK`x+;’¬‰    ¤Z,pygr/apps/leelabdb.pyPKŒ.;®@ ¤-,pygr/apps/leelabdb.pycPKŒ.;®@ ¤â™,pygr/apps/leelabdb.pyoPK`x+; ˨ò¨¨¤—¦,pygr/apps/maf2nclist.pyPKŒ.;|,÷Íͤt¬,pygr/apps/maf2nclist.pycPKŒ.;|,÷Íͤw´,pygr/apps/maf2nclist.pyoPK`x+;ñ[m°uu¤z¼,pygr/apps/maf2VSgraph.pyPKŒ.; .v¸vv¤%Ñ,pygr/apps/maf2VSgraph.pycPK Œ.; .v¸vv¤Òì,pygr/apps/maf2VSgraph.pyoPK`x+;Øiþ þ ¤-pygr/apps/seqref.pyPKŒ.;G½‚.55¤®-pygr/apps/seqref.pycPK Œ.;G½‚.55¤)-pygr/apps/seqref.pyoPK`x+;D¤ÂÇǤ|=-pygr/apps/splicegraph.pyPKŒ.;˜`1‡‡¤yW-pygr/apps/splicegraph.pycPK Œ.;˜`1‡‡¤7v-pygr/apps/splicegraph.pyoPKff·õ”-