BoolNet/0000755000176200001440000000000012122272240011606 5ustar liggesusersBoolNet/MD50000644000176200001440000001511612122272240012122 0ustar liggesusers8edd93d4bab32172c716410f1b152ed5 *DESCRIPTION a3f97565777d3e7d6fa0b6525b37c9dc *NAMESPACE 43dae0a83fdb00cd9a55693b0cc39f95 *R/attractorsToLaTeX.R 0e037f01fa88a832cb43d3a9d5e9f5dd *R/binarizeTimeSeries.R 6f0fd254b9797de877b13cdef6bedc44 *R/chooseNetwork.R 8fedce95c2aedd72c7ab350dbb27b413 *R/edgeDetector.R 5bdd9330e2e924f6673be5d18c25366d *R/fixGenes.R 34e979b0b7116e8b05c10af080b5ac4e *R/generateRandomNKNetwork.R a4996d93c018a412a00add98e5f4ad4e *R/generateState.R f80b8bfabc624f82d5ae2856605a4702 *R/generateTimeSeries.R 2883b41dbb100377bb988e9074f7eb13 *R/getAttractorSequence.R d916f1db165444d374d7517776bed77e *R/getAttractors.R c243d4d818c7faac5eb71d3f79a67cc9 *R/getBasinOfAttraction.R de7218e6ee192b7d2e93d3621a37fcbb *R/getPathToAttractor.R 1ab4ae1e73f453d85512103d077667d6 *R/getStateSummary.R a45f67785e1846f8482c9ff10debd95c *R/getTransitionProbabilities.R e6d1b2c4f16abcb5970173c7f7ef280a *R/getTransitionTable.R a1bb3168d41f445e1f9924d3762f44e2 *R/helpers.R 8517f43a094682b71a547df8b3fa3f50 *R/loadBioTapestry.R 95c250e7e7c6c4063f1a39e106cb8295 *R/loadNetwork.R 40ef9d4e8ab8c66d0135d134ca321e91 *R/loadSBML.R 6cf426b55ed4fda07a34c45609d5db0c *R/markovSimulation.R 025678125cdb1ee32fde3531d4f09511 *R/parseBooleanFunction.R 41c21fcab38d434e2de877d79d435b59 *R/perturbNetwork.R 6bc3921a711f1a759252dee898d64f8b *R/plotAttractors.R dddbf2166ac469e0f2b8bf81864a0ebb *R/plotNetworkWiring.R a04b208788b419584a8af04ec41c6b6c *R/plotPBNTransitions.R 858deb28ebd41071bdd1a93aba4ea744 *R/plotSequence.R 54fa924a8c5a3494fb1faf7f9bfbf6ac *R/plotStateGraph.R 3c84f69a1018a2b15123bc4a3e7b6296 *R/print.AttractorInfo.R bd5b5182c9a4321e0051be7f40bcbf6f *R/print.BooleanNetwork.R 09ac08c8cb2ef098c96a86de93e5ad7c *R/print.BooleanStateInfo.R 8d47aaddb2e451a4202110a5fc029782 *R/print.MarkovSimulation.R 6cc5b06ed784cbb901ebefed27370285 *R/print.ProbabilisticBooleanNetwork.R 2943627a6599f050826dd4b02ef3b722 *R/print.TransitionTable.R e6e6011809d5058819fb8b34a6d17b21 *R/reconstructNetwork.R 76191c54fc190fe45442b1883e5208b1 *R/saveNetwork.R f9055460bc6913f7919a51f6371164d9 *R/scanStatistic.R ff5dff17d01495d7cbf4858210828a9d *R/sequenceToLaTeX.R 418ca33fa4586b1532e67a765f66b600 *R/simplifyNetwork.R f6271d6e195aaf18a117a60a889b92f7 *R/stateTransition.R faee255056f4ad4607a43c46e7c9101b *R/testNetworkProperties.R ed4c8d17bbef54aaca1917bfadc8b6ee *R/toPajek.R 48af2a5511d3a07c63763a38b280474d *R/toSBML.R 98f1852c4cdae662fb15a186a90c98bb *R/zeta.R 6323b9a68ede50d320ceffa342711988 *data/cellcycle.rda 2162a3dfd9f29f06223413307dd177c8 *data/examplePBN.rda 8919de127f7ee2391900468a36c5dcd4 *data/yeastTimeSeries.rda 62409980eecaca8e52f1d495f499d6bd *inst/CITATION 27a515041d9b83b70ec4ef9179f42402 *inst/NEWS.Rd 38c801eb4cb67c7db0b85ccf88dffc7d *inst/doc/BoolNet_package_vignette.Snw 66c98ffd50ae052da7458c3abcf685ed *inst/doc/BoolNet_package_vignette.bib 6b44949026f172580f981c712a30891a *inst/doc/BoolNet_package_vignette.pdf ec64012a9d59619ca10f7ec773a5ecc5 *inst/doc/attractor1.pdf 462943d1a5e8c9e9e2c8016b1123ae4c *inst/doc/attractor2.pdf 182f17338132fdac2a557f97ce9d5161 *inst/doc/basinsize.pdf cbc02d945670e5381418720262b10955 *inst/doc/biotap_initval.png 530409792bed5d5a53140e85554b9d61 *inst/doc/biotap_logic.png d4a2fcf1d0a873afde1c021019649014 *inst/doc/biotap_model.png e02e5fea28346a3d8162b4feaa6ffb05 *inst/doc/biotap_sim_properties.png 27bccf40991bbe762bc274cbd7874f40 *inst/doc/example.btp 6205344ebd21ac18f56cd007d41db949 *inst/doc/indegree.pdf 278b58af8e047bce2f4da4ec56c43102 *inst/doc/indegree_kl.pdf d6aa77a2d43960ebb98c288990d3fe41 *inst/doc/pajek.png 6281e84e63e0fa1cfd41266f7fc642de *inst/doc/pbntransitions.pdf afa4bc65fe533ee9ffdeb8808caa76c1 *inst/doc/piecewisestategraph.pdf 79f46d5824454f2f2cef54b3709962a5 *inst/doc/robustness.pdf 68193e412ead38e34addce0b1e505f4a *inst/doc/sequence.pdf 9cdaa6def60436caa3b3ac2b0e918a0c *inst/doc/stategraph.pdf 99c3cfee3a4d14bcf7dd0b4aac27916b *inst/doc/wiring.pdf d86a9a94edb2c17de545b0d529d440ad *inst/doc/wiring_biotap.pdf 06deccc84e915061749c7e6518f1bccd *man/BoolNet-package.Rd d678fa847d47f0d430737f1ced2a43dd *man/attractorsToLaTeX.Rd 3461bfd43dd57a88d01d83df611f95c0 *man/binarizeTimeSeries.Rd 3623b2fe85476af5336cf7e220c1d60e *man/cellcycle.Rd 56915bfdbf214e7ad18124c230328d2c *man/chooseNetwork.Rd 7914c426e149300046dfce5ca9517777 *man/examplePBN.Rd d3024f8953aba3e68e0fd2b87a3a284b *man/fixGenes.Rd 3e6c5fd8b2c5d5e0cb0b8857afe0941e *man/generateRandomNKNetwork.Rd b39f6dcecac5916ae668e3baf5f7d575 *man/generateState.Rd aabaee93d2141f24082e785cccda9c67 *man/generateTimeSeries.Rd 61132c105569a7a91b8ff6c212135dc8 *man/getAttractorSequence.Rd a09cf023a3e880e303eba0220488a216 *man/getAttractors.Rd 37525a1c61ad4c97c6457c5b1462e662 *man/getBasinOfAttraction.Rd b3982cdc1b1cac176a41e01db04cecfa *man/getPathToAttractor.Rd 7ff770bb1a6cd2f607879b7440ee5bee *man/getStateSummary.Rd 87053d20084edd33f1c2fe2c2a4f9787 *man/getTransitionProbabilities.Rd d13b00988178bf5916afd5d42420a78e *man/getTransitionTable.Rd 217722d582556d2afd2b56634f060ae4 *man/loadBioTapestry.Rd 024e7ba158ac6f60eb944d98373df59e *man/loadNetwork.Rd fbdbe70e7ec6d7c06014899c6f43ab3c *man/loadSBML.Rd e6d111802bb3f2c9809112102307a6b0 *man/markovSimulation.Rd ded95935c60346bd4a76529c5938992d *man/perturbNetwork.Rd 9e9a654367d61c64698e6c841e142c88 *man/plotAttractors.Rd afcdb5a1246882b58b770edbbba7940c *man/plotNetworkWiring.Rd 9ba39e20433ffd9cfa5c29a6293a9ae2 *man/plotPBNTransitions.Rd b7e411eead137d04ecd21265f8fe88bf *man/plotSequence.Rd 0be64e2169945202d9fd359434eee4c6 *man/plotStateGraph.Rd 5f379a9e2b4a9a418d8b665af74757be *man/print.AttractorInfo.Rd e0b2b98da9c074e4e30dd73d57dae9da *man/print.BooleanNetwork.Rd b480ee06d8d8c2ade8ad0b5c89a13a7e *man/print.MarkovSimulation.Rd d03ef8645e4d3ad814798e882167aa8d *man/print.ProbabilisticBooleanNetwork.Rd d6e7961146750c9b36106a8d280a1c09 *man/print.TransitionTable.Rd a04d2632a4f3c1af824705713bc20a3d *man/reconstructNetwork.Rd ab6fec99e4c1b186071b291307f64f37 *man/saveNetwork.Rd ae64cec722c56f19abd96854b02d5000 *man/sequenceToLaTeX.Rd d67ace4fa49e6b2821310c36ac491a5e *man/simplifyNetwork.Rd 68e41359ee75eed8688523aa904b961f *man/stateTransition.Rd 839cb9abac605660c7f5c0eabac3385f *man/testNetworkProperties.Rd 0a34bb4024f6cc4f71efcafcae40fc00 *man/toPajek.Rd e5149163eb73190448023911b498586b *man/toSBML.Rd 7ffc48740e826cbf5c56c11fb8dfe9df *man/yeastTimeSeries.Rd 7f69f84671c0a40697057520f03f2ecf *src/boolean_network.c 5e6f2933daf6b58c94e740e16fd026cc *src/common.c 61c4c73990f441c97f4774837ce40b0f *src/common.h 5674df722e778f810c1fe326e27d53bf *src/probabilistic_boolean_network.c 686e443cfcfa3f597ea866bc25c356e7 *src/random.h 31cc7ec675c0399d69b068e501a2bbd7 *src/reconstruct_network.c 460b4e88a7af5ba2c60231ca9f3644c8 *src/uthash.h BoolNet/src/0000755000176200001440000000000012122071104012371 5ustar liggesusersBoolNet/src/uthash.h0000654000176200001440000016264112122071104014051 0ustar liggesusers/* Copyright (c) 2003-2011, Troy D. Hanson http://uthash.sourceforge.net All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UTHASH_H #define UTHASH_H #include /* memcmp,strlen */ #include /* ptrdiff_t */ #include /* exit() */ /* These macros use decltype or the earlier __typeof GNU extension. As decltype is only available in newer compilers (VS2010 or gcc 4.3+ when compiling c++ source) this code uses whatever method is needed or, for VS2008 where neither is available, uses casting workarounds. */ #ifdef _MSC_VER /* MS compiler */ #if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ #define DECLTYPE(x) (decltype(x)) #else /* VS2008 or older (or VS2010 in C mode) */ #define NO_DECLTYPE #define DECLTYPE(x) #endif #else /* GNU, Sun and other compilers */ #define DECLTYPE(x) (__typeof(x)) #endif #ifdef NO_DECLTYPE #define DECLTYPE_ASSIGN(dst,src) \ do { \ char **_da_dst = (char**)(&(dst)); \ *_da_dst = (char*)(src); \ } while(0) #else #define DECLTYPE_ASSIGN(dst,src) \ do { \ (dst) = DECLTYPE(dst)(src); \ } while(0) #endif /* a number of the hash function use uint32_t which isn't defined on win32 */ #ifdef _MSC_VER typedef unsigned int uint32_t; typedef unsigned char uint8_t; #else #include /* uint32_t */ #endif #define UTHASH_VERSION 1.9.4 //Modified by C. Muessel for use in R #define uthash_fatal(msg) error(msg) /* fatal error (out of memory,etc) */ #define uthash_malloc(sz) malloc(sz) /* malloc fcn */ #define uthash_free(ptr,sz) free(ptr) /* free fcn */ #define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ #define uthash_expand_fyi(tbl) /* can be defined to log expands */ /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS 32 /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS_LOG2 5 /* lg2 of initial number of buckets */ #define HASH_BKT_CAPACITY_THRESH 10 /* expand when bucket count reaches */ /* calculate the element whose hash handle address is hhe */ #define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) #define HASH_FIND(hh,head,keyptr,keylen,out) \ do { \ unsigned _hf_bkt,_hf_hashv; \ out=NULL; \ if (head) { \ HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv)) { \ HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ keyptr,keylen,out); \ } \ } \ } while (0) #ifdef HASH_BLOOM #define HASH_BLOOM_BITLEN (1ULL << HASH_BLOOM) #define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8) + ((HASH_BLOOM_BITLEN%8) ? 1:0) #define HASH_BLOOM_MAKE(tbl) \ do { \ (tbl)->bloom_nbits = HASH_BLOOM; \ (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \ memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \ (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ } while (0); #define HASH_BLOOM_FREE(tbl) \ do { \ uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ } while (0); #define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8] |= (1U << ((idx)%8))) #define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8] & (1U << ((idx)%8))) #define HASH_BLOOM_ADD(tbl,hashv) \ HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) #define HASH_BLOOM_TEST(tbl,hashv) \ HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) #else #define HASH_BLOOM_MAKE(tbl) #define HASH_BLOOM_FREE(tbl) #define HASH_BLOOM_ADD(tbl,hashv) #define HASH_BLOOM_TEST(tbl,hashv) (1) #endif #define HASH_MAKE_TABLE(hh,head) \ do { \ (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ sizeof(UT_hash_table)); \ if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ (head)->hh.tbl->tail = &((head)->hh); \ (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl->buckets, 0, \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ HASH_BLOOM_MAKE((head)->hh.tbl); \ (head)->hh.tbl->signature = HASH_SIGNATURE; \ } while(0) #define HASH_ADD(hh,head,fieldname,keylen_in,add) \ HASH_ADD_KEYPTR(hh,head,&((add)->fieldname),keylen_in,add) #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ do { \ unsigned _ha_bkt; \ (add)->hh.next = NULL; \ (add)->hh.key = (char*)keyptr; \ (add)->hh.keylen = keylen_in; \ if (!(head)) { \ head = (add); \ (head)->hh.prev = NULL; \ HASH_MAKE_TABLE(hh,head); \ } else { \ (head)->hh.tbl->tail->next = (add); \ (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ (head)->hh.tbl->tail = &((add)->hh); \ } \ (head)->hh.tbl->num_items++; \ (add)->hh.tbl = (head)->hh.tbl; \ HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ (add)->hh.hashv, _ha_bkt); \ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \ HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \ HASH_FSCK(hh,head); \ } while(0) #define HASH_TO_BKT( hashv, num_bkts, bkt ) \ do { \ bkt = ((hashv) & ((num_bkts) - 1)); \ } while(0) /* delete "delptr" from the hash table. * "the usual" patch-up process for the app-order doubly-linked-list. * The use of _hd_hh_del below deserves special explanation. * These used to be expressed using (delptr) but that led to a bug * if someone used the same symbol for the head and deletee, like * HASH_DELETE(hh,users,users); * We want that to work, but by changing the head (users) below * we were forfeiting our ability to further refer to the deletee (users) * in the patch-up process. Solution: use scratch space to * copy the deletee pointer, then the latter references are via that * scratch pointer rather than through the repointed (users) symbol. */ #define HASH_DELETE(hh,head,delptr) \ do { \ unsigned _hd_bkt; \ struct UT_hash_handle *_hd_hh_del; \ if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ HASH_BLOOM_FREE((head)->hh.tbl); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ head = NULL; \ } else { \ _hd_hh_del = &((delptr)->hh); \ if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \ (head)->hh.tbl->tail = \ (UT_hash_handle*)((char*)((delptr)->hh.prev) + \ (head)->hh.tbl->hho); \ } \ if ((delptr)->hh.prev) { \ ((UT_hash_handle*)((char*)((delptr)->hh.prev) + \ (head)->hh.tbl->hho))->next = (delptr)->hh.next; \ } else { \ DECLTYPE_ASSIGN(head,(delptr)->hh.next); \ } \ if (_hd_hh_del->next) { \ ((UT_hash_handle*)((char*)_hd_hh_del->next + \ (head)->hh.tbl->hho))->prev = \ _hd_hh_del->prev; \ } \ HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ (head)->hh.tbl->num_items--; \ } \ HASH_FSCK(hh,head); \ } while (0) /* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ #define HASH_FIND_STR(head,findstr,out) \ HASH_FIND(hh,head,findstr,strlen(findstr),out) #define HASH_ADD_STR(head,strfield,add) \ HASH_ADD(hh,head,strfield,strlen(add->strfield),add) #define HASH_FIND_INT(head,findint,out) \ HASH_FIND(hh,head,findint,sizeof(int),out) #define HASH_ADD_INT(head,intfield,add) \ HASH_ADD(hh,head,intfield,sizeof(int),add) #define HASH_FIND_PTR(head,findptr,out) \ HASH_FIND(hh,head,findptr,sizeof(void *),out) #define HASH_ADD_PTR(head,ptrfield,add) \ HASH_ADD(hh,head,ptrfield,sizeof(void *),add) #define HASH_DEL(head,delptr) \ HASH_DELETE(hh,head,delptr) /* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. */ #ifdef HASH_DEBUG #define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) #define HASH_FSCK(hh,head) \ do { \ unsigned _bkt_i; \ unsigned _count, _bkt_count; \ char *_prev; \ struct UT_hash_handle *_thh; \ if (head) { \ _count = 0; \ for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \ _bkt_count = 0; \ _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ _prev = NULL; \ while (_thh) { \ if (_prev != (char*)(_thh->hh_prev)) { \ HASH_OOPS("invalid hh_prev %p, actual %p\n", \ _thh->hh_prev, _prev ); \ } \ _bkt_count++; \ _prev = (char*)(_thh); \ _thh = _thh->hh_next; \ } \ _count += _bkt_count; \ if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ HASH_OOPS("invalid bucket count %d, actual %d\n", \ (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ } \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("invalid hh item count %d, actual %d\n", \ (head)->hh.tbl->num_items, _count ); \ } \ /* traverse hh in app order; check next/prev integrity, count */ \ _count = 0; \ _prev = NULL; \ _thh = &(head)->hh; \ while (_thh) { \ _count++; \ if (_prev !=(char*)(_thh->prev)) { \ HASH_OOPS("invalid prev %p, actual %p\n", \ _thh->prev, _prev ); \ } \ _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ _thh = ( _thh->next ? (UT_hash_handle*)((char*)(_thh->next) + \ (head)->hh.tbl->hho) : NULL ); \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("invalid app item count %d, actual %d\n", \ (head)->hh.tbl->num_items, _count ); \ } \ } \ } while (0) #else #define HASH_FSCK(hh,head) #endif /* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to * the descriptor to which this macro is defined for tuning the hash function. * The app can #include to get the prototype for write(2). */ #ifdef HASH_EMIT_KEYS #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ do { \ unsigned _klen = fieldlen; \ write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ write(HASH_EMIT_KEYS, keyptr, fieldlen); \ } while (0) #else #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) #endif /* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */ #ifdef HASH_FUNCTION #define HASH_FCN HASH_FUNCTION #else #define HASH_FCN HASH_JEN #endif /* The Bernstein hash function, used in Perl prior to v5.6 */ #define HASH_BER(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _hb_keylen=keylen; \ char *_hb_key=(char*)(key); \ (hashv) = 0; \ while (_hb_keylen--) { (hashv) = ((hashv) * 33) + *_hb_key++; } \ bkt = (hashv) & (num_bkts-1); \ } while (0) /* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */ #define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _sx_i; \ char *_hs_key=(char*)(key); \ hashv = 0; \ for(_sx_i=0; _sx_i < keylen; _sx_i++) \ hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ bkt = hashv & (num_bkts-1); \ } while (0) #define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _fn_i; \ char *_hf_key=(char*)(key); \ hashv = 2166136261UL; \ for(_fn_i=0; _fn_i < keylen; _fn_i++) \ hashv = (hashv * 16777619) ^ _hf_key[_fn_i]; \ bkt = hashv & (num_bkts-1); \ } while(0); #define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _ho_i; \ char *_ho_key=(char*)(key); \ hashv = 0; \ for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ hashv += _ho_key[_ho_i]; \ hashv += (hashv << 10); \ hashv ^= (hashv >> 6); \ } \ hashv += (hashv << 3); \ hashv ^= (hashv >> 11); \ hashv += (hashv << 15); \ bkt = hashv & (num_bkts-1); \ } while(0) #define HASH_JEN_MIX(a,b,c) \ do { \ a -= b; a -= c; a ^= ( c >> 13 ); \ b -= c; b -= a; b ^= ( a << 8 ); \ c -= a; c -= b; c ^= ( b >> 13 ); \ a -= b; a -= c; a ^= ( c >> 12 ); \ b -= c; b -= a; b ^= ( a << 16 ); \ c -= a; c -= b; c ^= ( b >> 5 ); \ a -= b; a -= c; a ^= ( c >> 3 ); \ b -= c; b -= a; b ^= ( a << 10 ); \ c -= a; c -= b; c ^= ( b >> 15 ); \ } while (0) #define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _hj_i,_hj_j,_hj_k; \ char *_hj_key=(char*)(key); \ hashv = 0xfeedbeef; \ _hj_i = _hj_j = 0x9e3779b9; \ _hj_k = keylen; \ while (_hj_k >= 12) { \ _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ + ( (unsigned)_hj_key[2] << 16 ) \ + ( (unsigned)_hj_key[3] << 24 ) ); \ _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ + ( (unsigned)_hj_key[6] << 16 ) \ + ( (unsigned)_hj_key[7] << 24 ) ); \ hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ + ( (unsigned)_hj_key[10] << 16 ) \ + ( (unsigned)_hj_key[11] << 24 ) ); \ \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ \ _hj_key += 12; \ _hj_k -= 12; \ } \ hashv += keylen; \ switch ( _hj_k ) { \ case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \ case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \ case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \ case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \ case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \ case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \ case 5: _hj_j += _hj_key[4]; \ case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \ case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \ case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \ case 1: _hj_i += _hj_key[0]; \ } \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ bkt = hashv & (num_bkts-1); \ } while(0) /* The Paul Hsieh hash function */ #undef get16bits #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) #define get16bits(d) (*((const uint16_t *) (d))) #endif #if !defined (get16bits) #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ +(uint32_t)(((const uint8_t *)(d))[0]) ) #endif #define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \ do { \ char *_sfh_key=(char*)(key); \ uint32_t _sfh_tmp, _sfh_len = keylen; \ \ int _sfh_rem = _sfh_len & 3; \ _sfh_len >>= 2; \ hashv = 0xcafebabe; \ \ /* Main loop */ \ for (;_sfh_len > 0; _sfh_len--) { \ hashv += get16bits (_sfh_key); \ _sfh_tmp = (get16bits (_sfh_key+2) << 11) ^ hashv; \ hashv = (hashv << 16) ^ _sfh_tmp; \ _sfh_key += 2*sizeof (uint16_t); \ hashv += hashv >> 11; \ } \ \ /* Handle end cases */ \ switch (_sfh_rem) { \ case 3: hashv += get16bits (_sfh_key); \ hashv ^= hashv << 16; \ hashv ^= _sfh_key[sizeof (uint16_t)] << 18; \ hashv += hashv >> 11; \ break; \ case 2: hashv += get16bits (_sfh_key); \ hashv ^= hashv << 11; \ hashv += hashv >> 17; \ break; \ case 1: hashv += *_sfh_key; \ hashv ^= hashv << 10; \ hashv += hashv >> 1; \ } \ \ /* Force "avalanching" of final 127 bits */ \ hashv ^= hashv << 3; \ hashv += hashv >> 5; \ hashv ^= hashv << 4; \ hashv += hashv >> 17; \ hashv ^= hashv << 25; \ hashv += hashv >> 6; \ bkt = hashv & (num_bkts-1); \ } while(0); #ifdef HASH_USING_NO_STRICT_ALIASING /* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads. * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error. * MurmurHash uses the faster approach only on CPU's where we know it's safe. * * Note the preprocessor built-in defines can be emitted using: * * gcc -m64 -dM -E - < /dev/null (on gcc) * cc -## a.c (where a.c is a simple test file) (Sun Studio) */ #if (defined(__i386__) || defined(__x86_64__)) #define MUR_GETBLOCK(p,i) p[i] #else /* non intel */ #define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 0x3) == 0) #define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 0x3) == 1) #define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 0x3) == 2) #define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 0x3) == 3) #define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL)) #if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__)) #define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24)) #define MUR_TWO_TWO(p) ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16)) #define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >> 8)) #else /* assume little endian non-intel */ #define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24)) #define MUR_TWO_TWO(p) ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16)) #define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) << 8)) #endif #define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) : \ (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \ (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) : \ MUR_ONE_THREE(p)))) #endif #define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) #define MUR_FMIX(_h) \ do { \ _h ^= _h >> 16; \ _h *= 0x85ebca6b; \ _h ^= _h >> 13; \ _h *= 0xc2b2ae35l; \ _h ^= _h >> 16; \ } while(0) #define HASH_MUR(key,keylen,num_bkts,hashv,bkt) \ do { \ const uint8_t *_mur_data = (const uint8_t*)(key); \ const int _mur_nblocks = (keylen) / 4; \ uint32_t _mur_h1 = 0xf88D5353; \ uint32_t _mur_c1 = 0xcc9e2d51; \ uint32_t _mur_c2 = 0x1b873593; \ const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+_mur_nblocks*4); \ int _mur_i; \ for(_mur_i = -_mur_nblocks; _mur_i; _mur_i++) { \ uint32_t _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i); \ _mur_k1 *= _mur_c1; \ _mur_k1 = MUR_ROTL32(_mur_k1,15); \ _mur_k1 *= _mur_c2; \ \ _mur_h1 ^= _mur_k1; \ _mur_h1 = MUR_ROTL32(_mur_h1,13); \ _mur_h1 = _mur_h1*5+0xe6546b64; \ } \ const uint8_t *_mur_tail = (const uint8_t*)(_mur_data + _mur_nblocks*4); \ uint32_t _mur_k1=0; \ switch((keylen) & 3) { \ case 3: _mur_k1 ^= _mur_tail[2] << 16; \ case 2: _mur_k1 ^= _mur_tail[1] << 8; \ case 1: _mur_k1 ^= _mur_tail[0]; \ _mur_k1 *= _mur_c1; \ _mur_k1 = MUR_ROTL32(_mur_k1,15); \ _mur_k1 *= _mur_c2; \ _mur_h1 ^= _mur_k1; \ } \ _mur_h1 ^= (keylen); \ MUR_FMIX(_mur_h1); \ hashv = _mur_h1; \ bkt = hashv & (num_bkts-1); \ } while(0) #endif /* HASH_USING_NO_STRICT_ALIASING */ /* key comparison function; return 0 if keys equal */ #define HASH_KEYCMP(a,b,len) memcmp(a,b,len) /* iterate over items in a known bucket to find desired item */ #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ do { \ if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \ else out=NULL; \ while (out) { \ if (out->hh.keylen == keylen_in) { \ if ((HASH_KEYCMP(out->hh.key,keyptr,keylen_in)) == 0) break; \ } \ if (out->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,out->hh.hh_next)); \ else out = NULL; \ } \ } while(0) /* add an item to a bucket */ #define HASH_ADD_TO_BKT(head,addhh) \ do { \ head.count++; \ (addhh)->hh_next = head.hh_head; \ (addhh)->hh_prev = NULL; \ if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \ (head).hh_head=addhh; \ if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \ && (addhh)->tbl->noexpand != 1) { \ HASH_EXPAND_BUCKETS((addhh)->tbl); \ } \ } while(0) /* remove an item from a given bucket */ #define HASH_DEL_IN_BKT(hh,head,hh_del) \ (head).count--; \ if ((head).hh_head == hh_del) { \ (head).hh_head = hh_del->hh_next; \ } \ if (hh_del->hh_prev) { \ hh_del->hh_prev->hh_next = hh_del->hh_next; \ } \ if (hh_del->hh_next) { \ hh_del->hh_next->hh_prev = hh_del->hh_prev; \ } /* Bucket expansion has the effect of doubling the number of buckets * and redistributing the items into the new buckets. Ideally the * items will distribute more or less evenly into the new buckets * (the extent to which this is true is a measure of the quality of * the hash function as it applies to the key domain). * * With the items distributed into more buckets, the chain length * (item count) in each bucket is reduced. Thus by expanding buckets * the hash keeps a bound on the chain length. This bounded chain * length is the essence of how a hash provides constant time lookup. * * The calculation of tbl->ideal_chain_maxlen below deserves some * explanation. First, keep in mind that we're calculating the ideal * maximum chain length based on the *new* (doubled) bucket count. * In fractions this is just n/b (n=number of items,b=new num buckets). * Since the ideal chain length is an integer, we want to calculate * ceil(n/b). We don't depend on floating point arithmetic in this * hash, so to calculate ceil(n/b) with integers we could write * * ceil(n/b) = (n/b) + ((n%b)?1:0) * * and in fact a previous version of this hash did just that. * But now we have improved things a bit by recognizing that b is * always a power of two. We keep its base 2 log handy (call it lb), * so now we can write this with a bit shift and logical AND: * * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) * */ #define HASH_EXPAND_BUCKETS(tbl) \ do { \ unsigned _he_bkt; \ unsigned _he_bkt_i; \ struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ memset(_he_new_buckets, 0, \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ tbl->ideal_chain_maxlen = \ (tbl->num_items >> (tbl->log2_num_buckets+1)) + \ ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \ tbl->nonideal_items = 0; \ for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ { \ _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ while (_he_thh) { \ _he_hh_nxt = _he_thh->hh_next; \ HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \ _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ tbl->nonideal_items++; \ _he_newbkt->expand_mult = _he_newbkt->count / \ tbl->ideal_chain_maxlen; \ } \ _he_thh->hh_prev = NULL; \ _he_thh->hh_next = _he_newbkt->hh_head; \ if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \ _he_thh; \ _he_newbkt->hh_head = _he_thh; \ _he_thh = _he_hh_nxt; \ } \ } \ uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ tbl->num_buckets *= 2; \ tbl->log2_num_buckets++; \ tbl->buckets = _he_new_buckets; \ tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ (tbl->ineff_expands+1) : 0; \ if (tbl->ineff_expands > 1) { \ tbl->noexpand=1; \ uthash_noexpand_fyi(tbl); \ } \ uthash_expand_fyi(tbl); \ } while(0) /* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ /* Note that HASH_SORT assumes the hash handle name to be hh. * HASH_SRT was added to allow the hash handle name to be passed in. */ #define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) #define HASH_SRT(hh,head,cmpfcn) \ do { \ unsigned _hs_i; \ unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ if (head) { \ _hs_insize = 1; \ _hs_looping = 1; \ _hs_list = &((head)->hh); \ while (_hs_looping) { \ _hs_p = _hs_list; \ _hs_list = NULL; \ _hs_tail = NULL; \ _hs_nmerges = 0; \ while (_hs_p) { \ _hs_nmerges++; \ _hs_q = _hs_p; \ _hs_psize = 0; \ for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \ _hs_psize++; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ if (! (_hs_q) ) break; \ } \ _hs_qsize = _hs_insize; \ while ((_hs_psize > 0) || ((_hs_qsize > 0) && _hs_q )) { \ if (_hs_psize == 0) { \ _hs_e = _hs_q; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_qsize--; \ } else if ( (_hs_qsize == 0) || !(_hs_q) ) { \ _hs_e = _hs_p; \ _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ ((void*)((char*)(_hs_p->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_psize--; \ } else if (( \ cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \ DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \ ) <= 0) { \ _hs_e = _hs_p; \ _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ ((void*)((char*)(_hs_p->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_psize--; \ } else { \ _hs_e = _hs_q; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_qsize--; \ } \ if ( _hs_tail ) { \ _hs_tail->next = ((_hs_e) ? \ ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \ } else { \ _hs_list = _hs_e; \ } \ _hs_e->prev = ((_hs_tail) ? \ ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \ _hs_tail = _hs_e; \ } \ _hs_p = _hs_q; \ } \ _hs_tail->next = NULL; \ if ( _hs_nmerges <= 1 ) { \ _hs_looping=0; \ (head)->hh.tbl->tail = _hs_tail; \ DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ } \ _hs_insize *= 2; \ } \ HASH_FSCK(hh,head); \ } \ } while (0) /* This function selects items from one hash into another hash. * The end result is that the selected items have dual presence * in both hashes. There is no copy of the items made; rather * they are added into the new hash through a secondary hash * hash handle that must be present in the structure. */ #define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ do { \ unsigned _src_bkt, _dst_bkt; \ void *_last_elt=NULL, *_elt; \ UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ if (src) { \ for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ _src_hh; \ _src_hh = _src_hh->hh_next) { \ _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ if (cond(_elt)) { \ _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \ _dst_hh->key = _src_hh->key; \ _dst_hh->keylen = _src_hh->keylen; \ _dst_hh->hashv = _src_hh->hashv; \ _dst_hh->prev = _last_elt; \ _dst_hh->next = NULL; \ if (_last_elt_hh) { _last_elt_hh->next = _elt; } \ if (!dst) { \ DECLTYPE_ASSIGN(dst,_elt); \ HASH_MAKE_TABLE(hh_dst,dst); \ } else { \ _dst_hh->tbl = (dst)->hh_dst.tbl; \ } \ HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \ (dst)->hh_dst.tbl->num_items++; \ _last_elt = _elt; \ _last_elt_hh = _dst_hh; \ } \ } \ } \ } \ HASH_FSCK(hh_dst,dst); \ } while (0) #define HASH_CLEAR(hh,head) \ do { \ if (head) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ HASH_BLOOM_FREE((head)->hh.tbl); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head)=NULL; \ } \ } while(0) #ifdef NO_DECLTYPE #define HASH_ITER(hh,head,el,tmp) \ for((el)=(head), (*(char**)(&(tmp)))=(char*)((head)?(head)->hh.next:NULL); \ el; (el)=(tmp),(*(char**)(&(tmp)))=(char*)((tmp)?(tmp)->hh.next:NULL)) #else #define HASH_ITER(hh,head,el,tmp) \ for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL); \ el; (el)=(tmp),(tmp)=DECLTYPE(el)((tmp)?(tmp)->hh.next:NULL)) #endif /* obtain a count of items in the hash */ #define HASH_COUNT(head) HASH_CNT(hh,head) #define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0) typedef struct UT_hash_bucket { struct UT_hash_handle *hh_head; unsigned count; /* expand_mult is normally set to 0. In this situation, the max chain length * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If * the bucket's chain exceeds this length, bucket expansion is triggered). * However, setting expand_mult to a non-zero value delays bucket expansion * (that would be triggered by additions to this particular bucket) * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. * (The multiplier is simply expand_mult+1). The whole idea of this * multiplier is to reduce bucket expansions, since they are expensive, in * situations where we know that a particular bucket tends to be overused. * It is better to let its chain length grow to a longer yet-still-bounded * value, than to do an O(n) bucket expansion too often. */ unsigned expand_mult; } UT_hash_bucket; /* random signature used only to find hash tables in external analysis */ #define HASH_SIGNATURE 0xa0111fe1 #define HASH_BLOOM_SIGNATURE 0xb12220f2 typedef struct UT_hash_table { UT_hash_bucket *buckets; unsigned num_buckets, log2_num_buckets; unsigned num_items; struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ /* in an ideal situation (all buckets used equally), no bucket would have * more than ceil(#items/#buckets) items. that's the ideal chain length. */ unsigned ideal_chain_maxlen; /* nonideal_items is the number of items in the hash whose chain position * exceeds the ideal chain maxlen. these items pay the penalty for an uneven * hash distribution; reaching them in a chain traversal takes >ideal steps */ unsigned nonideal_items; /* ineffective expands occur when a bucket doubling was performed, but * afterward, more than half the items in the hash had nonideal chain * positions. If this happens on two consecutive expansions we inhibit any * further expansion, as it's not helping; this happens when the hash * function isn't a good fit for the key domain. When expansion is inhibited * the hash will still work, albeit no longer in constant time. */ unsigned ineff_expands, noexpand; uint32_t signature; /* used only to find hash tables in external analysis */ #ifdef HASH_BLOOM uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ uint8_t *bloom_bv; char bloom_nbits; #endif } UT_hash_table; typedef struct UT_hash_handle { struct UT_hash_table *tbl; void *prev; /* prev element in app order */ void *next; /* next element in app order */ struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ struct UT_hash_handle *hh_next; /* next hh in bucket order */ void *key; /* ptr to enclosing struct's key */ unsigned keylen; /* enclosing struct's key len */ unsigned hashv; /* result of hash-fcn(key) */ } UT_hash_handle; #endif /* UTHASH_H */ BoolNet/src/reconstruct_network.c0000654000176200001440000006042212122071104016666 0ustar liggesusers/** * C code for the reconstruction of Boolean networks * * This is part of the BooleanNetwork R package. * * Copyright 2009/2010 by Christoph Müssel * * Contact christoph.muessel@uni-ulm.de * */ #include #include #include #include #include #include #include #include "common.h" /** * Structure for lists of * transition functions for * the return value of reconstruction functions */ typedef struct FLE { // the number of input genes unsigned int k; // the indices of the input genes unsigned int * inputGenes; // a bit vector containing the transition function unsigned int * transitionFunction; // the next element in the list struct FLE * next; } FunctionListElement; /** * Structure to build an internal stack * of functions. This is used to determine * all equally-rated functions recursively */ typedef struct FSE { // the bit position to be processed next unsigned int pos; // the (incomplete) transition function unsigned int * transitionFunction; // the next element on the stack struct FSE * next; } FunctionStackElement; /** * Add a new element to the function list specified by . * Set the corresponding values , and * by copying the supplied values. * is the number of elements needed for the transition function vector. * Returns the new list element. */ static inline FunctionListElement * addFunctionListElement(FunctionListElement ** root, unsigned int k, unsigned int transitionFunctionSize, unsigned int * inputGenes, unsigned int * transitionFunction) { FunctionListElement * el = CALLOC(1,sizeof(FunctionListElement)); el->k = k; el->inputGenes = CALLOC(k,sizeof(unsigned int)); memcpy(el->inputGenes,inputGenes,sizeof(unsigned int) * k); el->transitionFunction = CALLOC(transitionFunctionSize,sizeof(unsigned int)); memcpy(el->transitionFunction,transitionFunction,sizeof(unsigned int) * transitionFunctionSize); el->next = *root; *root = el; return el; } /** * Free all elements of the list */ void freeFunctionList(FunctionListElement ** root) { if (*root == NULL) return; FunctionListElement * current = *root; do { FunctionListElement * next = current->next; FREE(current->inputGenes); FREE(current->transitionFunction); FREE(current); current = next; } while(current != NULL); *root = NULL; } /** * Push a new element on top of the stack . * and describe the data to be pushed. * These elements are copied. * is the number of elements of . * Returns the new stack element. */ static inline FunctionStackElement * pushFunctionStackElement(FunctionStackElement ** stack, unsigned int * transitionFunction, unsigned int transitionFunctionSize, unsigned int pos) { FunctionStackElement * el = CALLOC(1,sizeof(FunctionStackElement)); el->pos = pos; el->transitionFunction = CALLOC(transitionFunctionSize,sizeof(unsigned int)); memcpy(el->transitionFunction,transitionFunction,sizeof(unsigned int) * transitionFunctionSize); el->next = *stack; *stack = el; return el; } /** * Remove the top-level element from . */ static inline void deleteFunctionStackElement(FunctionStackElement ** stack) { FunctionStackElement * el = *stack; *stack = (*stack)->next; FREE(el->transitionFunction); FREE(el); } /** * A function that iteratively returns all choose combinations of input genes * if called multiple times. * The function receives an input array containing the previous combination. * Before the first call, this combination must be initialized to {k-1, k-2, ... , 0}, * and must be set to 0. * After each call, contains the next combination. If all combinations have been * listed, the function returns false, otherwise true. */ static inline bool nextCombination(unsigned int * comb, unsigned int * pos, unsigned int k, unsigned int n) { bool posChanged = false; // find the first position that has not been set // to its maximum number while(comb[*pos] == n - *pos - 1 && *pos < k) { ++ *pos; posChanged = true; } if (*pos == k) // all elements have been listed return false; if (posChanged) // reset lower-order positions, and increase // the position found previously { unsigned int i; ++comb[*pos]; for (i = *pos; i > 0; --i) comb[i-1] = comb[i] + 1; *pos = 0; } else // the current position has not been set to its maximum value // => increase it ++comb[*pos]; return true; } /** * Lähdesmäki's best-fit extension algorithm to infer Boolean networks * from time series. * is an array of time series. Here, * consecutive array entries describe one state, thus * the array size is . * is the number of genes in the time series. * is the maximum number of inputs a function can have. * receives one list of possible functions for each gene, and * stores the error of these functions on the time series. */ void bestFitExtension(unsigned int * inputStates, unsigned int * outputStates, unsigned int numStates, unsigned int numGenes, unsigned int maxK, FunctionListElement ** result, unsigned int * errors, bool allSolutions) { unsigned int i; unsigned int numElts; // calculate block size in time series array if (numGenes % BITS_PER_BLOCK_32 == 0) numElts = numGenes / BITS_PER_BLOCK_32; else numElts = numGenes / BITS_PER_BLOCK_32 + 1; // store the lengths of the current best solutions for // each gene - initialized with maximum value. unsigned int bestLength[numGenes]; memset(bestLength,0xFF,sizeof(unsigned int) * numGenes); for (i = 0; i < numGenes; ++i) // iterate over genes { // set error to maximum errors[i] = ~0; unsigned int k, s; // check for constant genes unsigned int geneVal = GET_BIT(outputStates[i/BITS_PER_BLOCK_32],i % BITS_PER_BLOCK_32); bool isConst = true; unsigned int const0Err = (geneVal > 0), const1Err = (geneVal == 0); for (s = 1; s < numStates; ++s) { unsigned int nextBit = GET_BIT(outputStates[s*numElts + i/BITS_PER_BLOCK_32],i % BITS_PER_BLOCK_32); if (nextBit != geneVal) { isConst = false; } if (nextBit) ++const0Err; else ++const1Err; } if (isConst) // gene is constant => simplest function already found! { unsigned int inputGenes = -1; addFunctionListElement(&result[i],1,1,&inputGenes,&geneVal); errors[i] = 0; bestLength[i] = 0; } else { if (const0Err <= const1Err) { unsigned int inputGenes = -1; unsigned int val = 0; addFunctionListElement(&result[i],1,1,&inputGenes,&val); errors[i] = const0Err; bestLength[i] = 0; } if (const1Err <= const0Err) { unsigned int inputGenes = -1; unsigned int val = 1; addFunctionListElement(&result[i],1,1,&inputGenes,&val); errors[i] = const1Err; bestLength[i] = 0; } } for (k = 1; k <= maxK; ++k) // iterate over possible numbers of inputs { if (errors[i] == 0 && !allSolutions) break; // initialize gene combination vector unsigned int comb[k]; unsigned int j; for (j = 0; j < k; ++j) comb[j] = k - j - 1; unsigned int pos = 0; // calculate the number of array elements needed // to represent the output of a function unsigned int array_sz = 1 << k; unsigned int numEltsFunc; if (array_sz % BITS_PER_BLOCK_32 == 0) numEltsFunc = array_sz / BITS_PER_BLOCK_32; else numEltsFunc = array_sz / BITS_PER_BLOCK_32 + 1; unsigned int c_0[array_sz]; unsigned int c_1[array_sz]; do { R_CheckUserInterrupt(); memset(c_0,0,sizeof(unsigned int) * array_sz); memset(c_1,0,sizeof(unsigned int) * array_sz); for (s = 0; s < numStates; ++s) // iterate over states and count errors { unsigned int input = 0, bit; for (bit = 0; bit < k; ++bit) // build input by transferring the bits of the input genes // in the current state into a condensed input value { input |= (GET_BIT(inputStates[s * numElts + comb[bit]/BITS_PER_BLOCK_32],comb[bit] % BITS_PER_BLOCK_32)) << bit; } // determine the response value after a state transition unsigned int response = GET_BIT(outputStates[s * numElts + i/BITS_PER_BLOCK_32],i % BITS_PER_BLOCK_32); if (response == 0) ++c_1[input]; else ++c_0[input]; } unsigned int f[numEltsFunc]; memset(f,0,sizeof(unsigned int) * numEltsFunc); unsigned int error = 0, c; for (c = 0; c < array_sz; ++c) { if (c_0[c] > c_1[c]) error += c_1[c]; else error += c_0[c]; } if (error < errors[i]) // the new solution is better than all previously found solutions // => reset the solution list and the best error { errors[i] = error; bestLength[i] = k; freeFunctionList(&result[i]); } if (error <= errors[i] && (bestLength[i] >= k || allSolutions)) { // create a stack of possible functions to be able // to split up if the 0-error and the 1-error at a certain position // are equal FunctionStackElement * stack = NULL; // start with an element initialized to zero, // and first examine the 0-th position unsigned int f[numEltsFunc]; memset(f,0,sizeof(unsigned int) * numEltsFunc); pushFunctionStackElement(&stack,f,numEltsFunc,0); do { R_CheckUserInterrupt(); // get top-level stack element FunctionStackElement * el = stack; if (el->pos == array_sz) // the top-level element on the stack is a complete function // => clean it up { // create a new element in the result function list containing the // completed function on the stack addFunctionListElement(&result[i],k,numEltsFunc,comb,el->transitionFunction); // remove the completed function from the stack deleteFunctionStackElement(&stack); } else if (c_1[el->pos] == c_0[el->pos]) // the 0-error and the 1-error are equal // => create two solution branches, one with the -th bit set to 1 // and one with the -th bit set to 0 { // create a new element on the stack with the -th bit set to 1 FunctionStackElement * new = pushFunctionStackElement(&stack,el->transitionFunction, numEltsFunc,el->pos+1); new->transitionFunction[el->pos / BITS_PER_BLOCK_32] |= 1 << (el->pos % BITS_PER_BLOCK_32); // increment the position of the old element, which remains on the stack // with the -th bit set to 0 (due to initialization) ++el->pos; } else if (c_1[el->pos] < c_0[el->pos]) // the error is lower if the -th bit is set to 1 { // set the -th bit of the top-level stack element to 1, // and increment the position to be examined el->transitionFunction[el->pos / BITS_PER_BLOCK_32] |= 1 << (el->pos % BITS_PER_BLOCK_32); ++el->pos; } else // the error is lower if the -th bit is set to 0 { // due to initialization, the -th bit is already set to 0 // => increment the position to be examined ++el->pos; } } // terminate if all stack elements have been completed while (stack != NULL); } } // get next input gene combination vector while(nextCombination(comb,&pos,k,numGenes)); } } } /** * Calculate the entropy of a set of genes (gene_1,...,gene_n) * specified by . * All values less than specify genes in the input states, and values greater or * equal to specify genes in the output states. * and contain states, each consisting * of array elements. * The table counting the occurrences of gene value combinations is returned in , which * must be initialized to a size of 2^. * The return value is the entropy H(gene1,...,gene_n). */ static inline double entropy(unsigned int * inputStates, unsigned int * outputStates, unsigned int numStates, unsigned int elementsPerEntry, unsigned int numGenes, unsigned int * chosenIndices, unsigned int numChosenIndices, unsigned int * table) { unsigned int numEntries = 1 << numChosenIndices; // reset table to 0 memset(table,0,sizeof(unsigned int) * numEntries); unsigned int state; for (state = 0; state < numStates; ++state) { unsigned int tableIndex = 0, geneIndex; for (geneIndex = 0; geneIndex < numChosenIndices; ++geneIndex) // count the number of occurrences of gene value combinations { // encode the index of the table element to be increased if (chosenIndices[geneIndex] < numGenes) // this is a gene in the input states { unsigned int chosenIndex = chosenIndices[geneIndex]; tableIndex |= (GET_BIT(inputStates[state * elementsPerEntry + chosenIndex/BITS_PER_BLOCK_32],chosenIndex % BITS_PER_BLOCK_32)) << geneIndex; } else // this is a gene in the output states { unsigned int chosenIndex = chosenIndices[geneIndex] - numGenes; tableIndex |= (GET_BIT(outputStates[state * elementsPerEntry + chosenIndex/BITS_PER_BLOCK_32],chosenIndex % BITS_PER_BLOCK_32)) << geneIndex; } } // increase the corresponding table entry ++table[tableIndex]; } // calculate entropy double result = 0.0; unsigned int tableIndex; for (tableIndex = 0; tableIndex < numEntries; ++tableIndex) { if (table[tableIndex] != 0) result += ((double)table[tableIndex])/numStates*log2(((double)table[tableIndex])/numStates); } return -result; } /** * Liang's REVEAL algorithm for reconstruction of Boolean networks. * This version is enhanced for dealing with inconsistent samples by * taking the solutions that produce the minimum error. * is an array of time series. Here, * consecutive array entries describe one state, thus * the array size is . * is the number of genes in the time series. * is the maximum number of inputs a function can have. * receives one list of possible functions for each gene, and * stores the error of these functions on the time series. */ void reveal(unsigned int * inputStates, unsigned int * outputStates, unsigned int numStates, unsigned int numGenes, unsigned int maxK, FunctionListElement ** result, unsigned int * errors, bool allSolutions) { unsigned int i; unsigned int numElts; // calculate block size in time series array if (numGenes % BITS_PER_BLOCK_32 == 0) numElts = numGenes / BITS_PER_BLOCK_32; else numElts = numGenes / BITS_PER_BLOCK_32 + 1; for (i = 0; i < numGenes; ++i) // iterate over genes { // set error to maximum // Note: in REVEAL, is only used as an indicator // whether a solution has been found, i.e. it is 0 if // a solution was found, and anything else otherwise. errors[i] = ~0; unsigned int k, s; // check for constant genes unsigned int geneVal = GET_BIT(outputStates[i/BITS_PER_BLOCK_32],i % BITS_PER_BLOCK_32); bool isConst = true; for (s = 1; s < numStates; ++s) { if (GET_BIT(outputStates[s*numElts + i/BITS_PER_BLOCK_32],i % BITS_PER_BLOCK_32) != geneVal) { isConst = false; break; } } if (isConst) // gene is constant => simplest function already found! { unsigned int inputGenes = -1; addFunctionListElement(&result[i],1,1,&inputGenes,&geneVal); errors[i] = 0; } for (k = 1; k <= maxK; ++k) // iterate over possible numbers of inputs { if (errors[i] == 0 && !allSolutions) break; // initialize gene combination vector unsigned int comb[k]; unsigned int j; for (j = 0; j < k; ++j) comb[j] = k - j - 1; unsigned int pos = 0; // calculate the number of array elements needed // to represent the output of a function unsigned int array_sz = 1 << k; unsigned int numEltsFunc; if (array_sz % BITS_PER_BLOCK_32 == 0) numEltsFunc = array_sz / BITS_PER_BLOCK_32; else numEltsFunc = array_sz / BITS_PER_BLOCK_32 + 1; do { R_CheckUserInterrupt(); // calculate entropy of input genes unsigned int table_input[array_sz]; double entropy_input = entropy(inputStates, outputStates, numStates, numElts, numGenes, comb, k, table_input); // calculate entropy of the combination of input genes and output value unsigned int comb_output[k+1]; memcpy(comb_output,comb,sizeof(unsigned int) * k); comb_output[k] = numGenes + i; unsigned int table_output[1 << (k+1)]; double entropy_all = entropy(inputStates, outputStates, numStates, numElts, numGenes, comb_output, k+1, table_output); if (fabs(entropy_input - entropy_all) < 1E-6) // the two entropies are the same => output is fully explained by input { // a solution has been found => set errors to 0 so that // the algorithm does not search for higher k's errors[i] = 0; FunctionStackElement * stack = NULL; // start with an element initialized to zero, // and first examine the 0-th position unsigned int f[numEltsFunc]; memset(f,0,sizeof(unsigned int) * numEltsFunc); pushFunctionStackElement(&stack,f,numEltsFunc,0); do { R_CheckUserInterrupt(); // get top-level stack element FunctionStackElement * el = stack; if (el->pos == array_sz) // the top-level element on the stack is a complete function // => clean it up { // create a new element in the result function list containing the // completed function on the stack addFunctionListElement(&result[i],k,numEltsFunc,comb,el->transitionFunction); // remove the completed function from the stack deleteFunctionStackElement(&stack); } else if (table_input[el->pos] == 0 || table_output[el->pos | (1 << k)] == table_output[el->pos]) // no information is available if the -th bit must be set to one or zero // => create two solution branches, one with the -th bit set to 1 // and one with the -th bit set to 0 { // create a new element on the stack with the -th bit set to 1 FunctionStackElement * new = pushFunctionStackElement(&stack,el->transitionFunction, numEltsFunc,el->pos+1); new->transitionFunction[el->pos / BITS_PER_BLOCK_32] |= 1 << (el->pos % BITS_PER_BLOCK_32); // increment the position of the old element, which remains on the stack // with the -th bit set to 0 (due to initialization) ++el->pos; } else if (table_output[el->pos | (1 << k)] > table_output[el->pos]) // the -th bit must be set to 1 { // set the -th bit of the top-level stack element to 1, // and increment the position to be examined el->transitionFunction[el->pos / BITS_PER_BLOCK_32] |= 1 << (el->pos % BITS_PER_BLOCK_32); ++el->pos; } else // the -th bit must be set to 0 { // due to initialization, the -th bit is already set to 0 // => increment the position to be examined ++el->pos; } } while (stack != NULL); } } // get next input gene combination vector while(nextCombination(comb,&pos,k,numGenes)); } } } /** * R Wrapper for bestFitExtension() and reveal() * contains an array of * binary * values, where consecutive values form one state. * specifies the number of states in the array. * is the highest number of input genes for a function. * If is 0, bestFitExtension is called. If is 1, reveal() is called. * Returns a list of lists. The outer list has elements, and the inner * list has one element for each equally-rated function for the current gene. Each of these * elements consists of a vector of input genes, the function as a binary vector, and * the error this function makes on the input time series. */ SEXP reconstructNetwork_R(SEXP inputStates, SEXP outputStates, SEXP numberOfStates, SEXP maxK, SEXP method, SEXP allSolutions) { int * _inputStates = INTEGER(inputStates); int * _outputStates = INTEGER(outputStates); int _numberOfStates = *INTEGER(numberOfStates); int _maxK = *INTEGER(maxK); int _method = *INTEGER(method); int _allSolutions = *INTEGER(allSolutions); unsigned int numGenes = length(inputStates) / _numberOfStates; unsigned int numElts; if (numGenes % BITS_PER_BLOCK_32 == 0) numElts = numGenes / BITS_PER_BLOCK_32; else numElts = numGenes / BITS_PER_BLOCK_32 + 1; unsigned int encodedInputStates[numElts * _numberOfStates]; memset(encodedInputStates,0,numElts * _numberOfStates * sizeof(unsigned int)); unsigned int encodedOutputStates[numElts * _numberOfStates]; memset(encodedOutputStates,0,numElts * _numberOfStates * sizeof(unsigned int)); unsigned int state,gene; for (state = 0; state < _numberOfStates; ++state) // binary encoding of input states { for (gene = 0; gene < numGenes; ++gene) encodedInputStates[(numElts * state) + gene / BITS_PER_BLOCK_32] |= (_inputStates[state*numGenes + gene] << (gene % BITS_PER_BLOCK_32)); } for (state = 0; state < _numberOfStates; ++state) // binary encoding of output states { for (gene = 0; gene < numGenes; ++gene) encodedOutputStates[(numElts * state) + gene / BITS_PER_BLOCK_32] |= (_outputStates[state*numGenes + gene] << (gene % BITS_PER_BLOCK_32)); } FunctionListElement ** res = CALLOC(numGenes,sizeof(FunctionListElement *)); unsigned int * errors = CALLOC(numGenes,sizeof(unsigned int)); if (_method == 0) // perform Lähdesmäki's best-fit extension bestFitExtension(encodedInputStates,encodedOutputStates, _numberOfStates,numGenes,_maxK,res,errors,_allSolutions); else // start REVEAL algorithm reveal(encodedInputStates,encodedOutputStates, _numberOfStates,numGenes,_maxK,res,errors,_allSolutions); // for (gene = 0; gene < numGenes; ++gene) // { // printf("Gene %d\n",gene+1); // FunctionListElement * cur = res[gene]; // while (cur != NULL) // { // printf("Input: "); // unsigned int k; // for (k = 0; k < cur->k; ++k) // printf("%d ",cur->inputGenes[k] + 1); // printf("\nFunction: "); // for (k = 0; k < (1 << cur->k); ++k) // printf("%d",GET_BIT(cur->transitionFunction[k / BITS_PER_BLOCK_32],k%BITS_PER_BLOCK_32)); // printf("\nError: %d\n\n",errors[gene]); // cur = cur->next; // } // } // pack R objects SEXP resSXP; PROTECT(resSXP = allocList(numGenes)); SEXP listPos1 = resSXP; for(gene = 0; gene < numGenes; ++gene) { SEXP geneSXP; unsigned int listLength = 0; FunctionListElement * cur = res[gene]; while (cur != NULL) { ++listLength; cur = cur->next; } PROTECT(geneSXP = allocList(listLength)); cur = res[gene]; unsigned int i; SEXP listPos2 = geneSXP; for (i = 0; i < listLength; ++i) { SEXP entrySXP,inputSXP,funcSXP,errorSXP; PROTECT(entrySXP = allocList(3)); SET_TAG(entrySXP, install("input")); SET_TAG(CDR(entrySXP), install("func")); SET_TAG(CDR(CDR(entrySXP)), install("error")); PROTECT(inputSXP = allocVector(INTSXP,cur->k)); int * array = INTEGER(inputSXP); unsigned int j; unsigned int numBits; if (cur->k == 1 && cur->inputGenes[0] == -1) { numBits = 1; array[0] = 0; } else { numBits = 1 << cur->k; for (j = 0; j < cur->k; j++) array[j] = cur->inputGenes[cur->k - j - 1] + 1; } SETCAR(entrySXP,inputSXP); UNPROTECT(1); PROTECT(funcSXP = allocVector(INTSXP,numBits)); array = INTEGER(funcSXP); dec2bin(array,(int*)cur->transitionFunction,(int*)&numBits); SETCADR(entrySXP,funcSXP); UNPROTECT(1); PROTECT(errorSXP = allocVector(INTSXP,1)); array = INTEGER(errorSXP); *array = errors[gene]; SETCADDR(entrySXP,errorSXP); UNPROTECT(1); SETCAR(listPos2,entrySXP); UNPROTECT(1); listPos2 = CDR(listPos2); cur = cur->next; } UNPROTECT(1); SETCAR(listPos1,geneSXP); listPos1 = CDR(listPos1); } UNPROTECT(1); // free resources for (gene = 0; gene < numGenes; ++gene) freeFunctionList(&res[gene]); FREE(errors); FREE(res); return resSXP; } BoolNet/src/random.h0000654000176200001440000000064712122071104014032 0ustar liggesusers#ifndef RANDOM_H_ #define RANDOM_H_ #include /** * This header contains wrapper methods to generate random numbers. */ /** * Returns a random double in [0,1) */ static inline double doublerand_1() { return unif_rand(); } /** * Returns a random integer value in [0,maxVal-1] */ static inline unsigned int intrand(unsigned int maxVal) { return (unsigned int)(unif_rand() * maxVal); } #endif /*RANDOM_H_*/ BoolNet/src/probabilistic_boolean_network.c0000654000176200001440000004532012122071104020640 0ustar liggesusers/** * C code for Markov simulations of Probabilistic Boolean Networks * * This is part of the BooleanNetwork R package. * * Copyright 2009/2010 by Christoph Müssel * * Contact christoph.muessel@uni-ulm.de * */ #include "uthash.h" #include "common.h" #include #include #include #include #include #include #include #define MATRIX_POOL_SIZE 1024 typedef struct { int * inputGenes; int * transitionFunction; unsigned int numGenes; double probability; unsigned int functionIndex; } PBNFunction; /** * Internal structure describing a Boolean network */ typedef struct { // the number of genes in the network unsigned int numGenes; // the number of non-fixed genes in the network unsigned int numNonFixedGenes; // a vector specifying whether the genes are fixed: // -1 means the gene is not fixed, 1 and 0 means the // genes are fixed to the corresponding values int * fixedGenes; // an index array with the -th entry // specifying the bit position of the -th gene // in a state array - this is not always equal to , // as fixed genes are not stored unsigned int * nonFixedGeneBits; // an array containing an array of transition functions for each gene PBNFunction ** transitionFunctions; // the lengths of the arrays in unsigned int * numFunctionsPerGene; } ProbabilisticBooleanNetwork; /** * An entry in the state probability matrix */ typedef struct { // the initial state // (next state is the index of the matrix array) unsigned int state; // the probability for this state transition double probability; // used by the hash table UT_hash_handle hh; } MatrixEntry; /* * Structure that maintains a sparse matrix */ typedef struct { MatrixEntry ** matrix; ArrayListElement * entryPool; unsigned int poolArraySize; unsigned int currentEntry; } SparseMatrix; /* * Initialize a matrix with columns * maintaining an entry pool with arrays of size * */ static inline SparseMatrix * allocSparseMatrix(unsigned int numCols, unsigned int poolArraySize) { SparseMatrix * res = CALLOC(1, sizeof(SparseMatrix)); res->matrix = CALLOC(numCols, sizeof(MatrixEntry *)); memset(res->matrix,0,sizeof(MatrixEntry *) * numCols); res->poolArraySize = poolArraySize; res->currentEntry = 0; res->entryPool = NULL; return res; } /** * Calculate a transition table with one entry for each state. Each entry consists of * one bit per (non-fixed) function in . * receives the number of elements in the table. * receives the number of array elements occupied by one state. * Returns an array of states. */ unsigned int * probabilisticTransitionTable(ProbabilisticBooleanNetwork * net, unsigned int * tableSize, unsigned int * numElements) { // determine number of fixed genes unsigned int totalFunctionCount = 0; unsigned int i, j, k, numNonFixed = 0; for (i = 0; i < net->numGenes; ++i) { if (net->fixedGenes[i] == -1) { totalFunctionCount += net->numFunctionsPerGene[i]; ++numNonFixed; } } if (totalFunctionCount % BITS_PER_BLOCK_32 == 0) *numElements = totalFunctionCount / BITS_PER_BLOCK_32; else *numElements = totalFunctionCount / BITS_PER_BLOCK_32 + 1; // allocate truth table with 2^(non-fixed genes) elements *tableSize = (1 << numNonFixed); unsigned int * table = CALLOC(*tableSize * *numElements,sizeof(unsigned int)); if (table == 0) { Rf_error("Too few memory available!"); } unsigned int initialState = 0; // calculate state transitions for(initialState = 0; initialState < *tableSize; ++initialState) { R_CheckUserInterrupt(); //state is simply the binary encoding of the counter //calculate transitions for (i = 0; i < net->numGenes; ++i) { if (net->fixedGenes[i] == -1) { for (j = 0; j < net->numFunctionsPerGene[i]; ++j) { PBNFunction * current = &net->transitionFunctions[i][j]; unsigned int inputdec = 0; for (k = 0; k < current->numGenes; ++k) { if (current->inputGenes[k]) // if the input of the function is not 0 (constant gene), take input bit { unsigned int gene = current->inputGenes[k] - 1; unsigned int bit; if (net->fixedGenes[gene] == -1) bit = (GET_BIT(initialState, net->nonFixedGeneBits[gene])); else // fixed genes are not encoded in the states // => take them from fixedGenes vector bit = net->fixedGenes[gene]; inputdec |= bit << (current->numGenes - k - 1); } } int transition = current->transitionFunction[inputdec]; if(transition != -1) // apply transition function table[initialState * *numElements + current->functionIndex / BITS_PER_BLOCK_32] |= (transition << (current->functionIndex % BITS_PER_BLOCK_32)); else // this is a dummy function for a constant gene // => value does not change table[initialState * *numElements + current->functionIndex / BITS_PER_BLOCK_32] |= (GET_BIT(initialState, net->nonFixedGeneBits[i]) << (current->functionIndex % BITS_PER_BLOCK_32)); } } } } return table; } /** * Calculate combinations of function indices. * is an array containing the numbers of functions for each gene. * is the previous function combination from which the next * combination is calculated. * is the number of functions. * Returns false if there are no more combinations, and true otherwise. */ static inline bool nextFunctionCombination(unsigned int * maxVals, unsigned int * combination, unsigned int size) { unsigned int i; while(true) { for (i = 0; i < size; ++i) { ++combination[i]; if (combination[i] < maxVals[i]) return true; else { if (i == size - 1) return false; else combination[i] = 0; } } } } /** * Add to the element of whose start state is , * or add the corresponding element to the hash table */ static inline void addToMatrixEntry(SparseMatrix * matrix, unsigned int column, unsigned int state, double value) { MatrixEntry * entry; HASH_FIND_INT(matrix->matrix[column], &state, entry); if (entry == NULL) // add a new hash table entry { if (matrix->currentEntry % matrix->poolArraySize == 0) allocNewArray(&matrix->entryPool, matrix->poolArraySize, sizeof(MatrixEntry)); entry = &(((MatrixEntry *)matrix->entryPool->array)[matrix->currentEntry % matrix->poolArraySize]); ++matrix->currentEntry; entry->probability = 0.0; entry->state = state; HASH_ADD_INT(matrix->matrix[column],state,entry); } // increment probability entry->probability += value; } /** * Extract a state from the combined transition table of all functions
* depending on the function combination . * is the number of array elements occupied by one state. * is the state for which the successor state is looked up. * holds the network information. * Returns the extracted state as an integer. */ static inline unsigned int extractState(unsigned int * table, unsigned int numElements, unsigned int initialState, unsigned int * combination, ProbabilisticBooleanNetwork * net) { unsigned int i, j, res = 0; for (i = 0, j = 0; i < net->numGenes; ++i) { if (net->fixedGenes[i] == -1) // exclude fixed genes { unsigned int functionIndex = net->transitionFunctions[i][combination[j]].functionIndex; // insert the th bit at the next position res |= (GET_BIT(table[initialState * numElements + functionIndex / BITS_PER_BLOCK_32], functionIndex % BITS_PER_BLOCK_32)) << net->nonFixedGeneBits[i]; ++j; } } return res; } /** * Free all hash tables in the matrix array * and the array itself. * is the number of columns of the matrix. */ void freeMatrix(SparseMatrix * matrix) { /* unsigned int i; for (i = 0; i < size; ++i) { MatrixEntry * entry; // FREE hash table while(matrix[i]) { entry = matrix[i]; HASH_DEL(matrix[i],entry); FREE(entry); } }*/ FREE(matrix->matrix); freeArrayList(matrix->entryPool); // free array FREE(matrix); } /** * Start a Markov chain simulation on network by performing matrix multiplications. * receives the number of elements in the returned probability vector. * is the matrix of state transition probabilities with columns. * is an optional vector with encoded start states. */ double * markovSimulation(ProbabilisticBooleanNetwork * net, unsigned int numIterations, unsigned int * outcomeSize, SparseMatrix ** stateProbabilities, unsigned int * startStates, unsigned int numStartStates) { unsigned int tableSize = 0, numElements = 0, i, k; // calculate combined transition table unsigned int * table = probabilisticTransitionTable(net,&tableSize,&numElements); SparseMatrix * matrix = allocSparseMatrix(tableSize, MATRIX_POOL_SIZE); *stateProbabilities = matrix; unsigned int combination[net->numNonFixedGenes]; memset(combination,0,sizeof(unsigned int) * net->numNonFixedGenes); unsigned int maxCombination[net->numNonFixedGenes]; unsigned int geneIndices[net->numNonFixedGenes]; // write array with numbers of functions for (i = 0; i < net->numGenes; ++i) { if (net->fixedGenes[i] == -1) { maxCombination[net->nonFixedGeneBits[i]] = net->numFunctionsPerGene[i]; geneIndices[net->nonFixedGeneBits[i]] = i; } } // set up transition probability matrix do // iterate over all possible function combinations { double probability = net->transitionFunctions[geneIndices[0]][combination[0]].probability; for (i = 1; i < net->numNonFixedGenes; ++i) probability *= net->transitionFunctions[geneIndices[i]][combination[i]].probability; for (i = 0; i < tableSize; ++i) // add probabilities for all reached states in the transition table { R_CheckUserInterrupt(); unsigned int state = extractState(table,numElements,i,combination,net); addToMatrixEntry(matrix,state,i,probability); } } while (nextFunctionCombination(maxCombination,combination,net->numNonFixedGenes)); FREE(table); double * outcome = CALLOC(tableSize,sizeof(double)); double * oldOutcome = CALLOC(tableSize,sizeof(double)); *outcomeSize = tableSize; if (numStartStates == 0) // no start states => equal probability for all states { for (i = 0; i < tableSize; ++i) { outcome[i] = 1.0/tableSize; } } else // start states supplied => equal probability for all supplied states { for (i = 0; i < numStartStates; ++i) { outcome[startStates[i]] = 1.0/numStartStates; } } for (k = 0; k < numIterations; ++k) // perform matrix multiplications { R_CheckUserInterrupt(); memcpy(oldOutcome,outcome,sizeof(double) * tableSize); for (i = 0; i < tableSize; ++i) { MatrixEntry * entry; outcome[i] = 0.0; for(entry = matrix->matrix[i]; entry != NULL; entry=entry->hh.next) { outcome[i] += oldOutcome[entry->state] * entry->probability; } } } FREE(oldOutcome); return outcome; } /** * R wrapper for the Markov simulation. * is a concatenated integer vector of the input genes for all functions. * is used to split up into the single function inputs. * contains the truth table result columns of all functions and is * split up according to . * specifies whether genes are fixed (0,1) or not (-1). * is a vector specifying which function belongs to which gene. * is a vector of probabilities for the functions. * is the number of matrix multiplications to be performed. * is an optional vector of start states (otherwise all states are considered). * is the value below which values are considered to be 0. * specifies whether the result should contain a transition table * Returns a list containing a data frame of important states and their probabilities * and, optionally, the transition table. */ SEXP markovSimulation_R(SEXP inputGenes, SEXP inputGenePositions, SEXP transitionFunctions, SEXP transitionFunctionPositions, SEXP fixedGenes, SEXP functionAssignment, SEXP probabilities, SEXP numSteps, SEXP startStates, SEXP cutoff, SEXP returnTable) { ProbabilisticBooleanNetwork network; int * _inputGenes = INTEGER(inputGenes); int * _inputGenePositions = INTEGER(inputGenePositions); int * _transitionFunctions = INTEGER(transitionFunctions); int * _transitionFunctionPositions = INTEGER(transitionFunctionPositions); int * _functionAssignment = INTEGER(functionAssignment); double * _probabilities = REAL(probabilities); int _numSteps = *INTEGER(numSteps); int * _startStates = NULL; if (!isNull(startStates)) _startStates = INTEGER(startStates); double _cutoff = *REAL(cutoff); bool _returnTable = (bool)(*INTEGER(returnTable)); unsigned int i, j; network.numGenes = length(fixedGenes); network.fixedGenes = CALLOC(network.numGenes,sizeof(int)); memcpy(network.fixedGenes,INTEGER(fixedGenes),sizeof(unsigned int) * network.numGenes); network.nonFixedGeneBits = CALLOC(network.numGenes,sizeof(unsigned int)); // determine which genes are not fixed network.numNonFixedGenes = 0; for(i = 0; i < network.numGenes; i++) { if(network.fixedGenes[i] == -1) { network.nonFixedGeneBits[i] = network.numNonFixedGenes++; } } network.numFunctionsPerGene = CALLOC(network.numGenes,sizeof(unsigned int)); network.transitionFunctions = CALLOC(network.numGenes,sizeof(PBNFunction *)); // count number of functions per gene for (i = 0; i < length(functionAssignment); ++i) { ++network.numFunctionsPerGene[_functionAssignment[i]]; } // allocate function vectors for (i = 0; i < network.numGenes; ++i) { network.transitionFunctions[i] = CALLOC(network.numFunctionsPerGene[i],sizeof(PBNFunction)); } unsigned int functionCounter[network.numGenes]; memset(functionCounter,0,sizeof(unsigned int) * network.numGenes); unsigned int functionIndex = 0; for (i = 0; i < length(functionAssignment); ++i) // decode functions { PBNFunction * current = &network.transitionFunctions[_functionAssignment[i]] [functionCounter[_functionAssignment[i]]++]; unsigned int numInputs = _inputGenePositions[i+1] - _inputGenePositions[i]; current->inputGenes = CALLOC(numInputs,sizeof(int)); memcpy(current->inputGenes,&_inputGenes[_inputGenePositions[i]],numInputs*sizeof(int)); current->numGenes = numInputs; current->transitionFunction = CALLOC(1 << numInputs,sizeof(int)); memcpy(current->transitionFunction,&_transitionFunctions[_transitionFunctionPositions[i]], (1 << numInputs)*sizeof(int)); current->probability = _probabilities[i]; if (network.fixedGenes[_functionAssignment[i]] == -1) { current->functionIndex = functionIndex++; } else { current->functionIndex = ~0; } } unsigned int startStateElements; if (network.numGenes % (sizeof(unsigned int) * 8) == 0) { startStateElements = network.numGenes / BITS_PER_BLOCK_32; } else { startStateElements = network.numGenes / BITS_PER_BLOCK_32 + 1; } // decode start states (remove fixed genes) unsigned int numStartStates; if (isNull(startStates)) numStartStates = 0; else numStartStates = length(startStates)/startStateElements; unsigned int decodedStartStates[numStartStates]; for (i = 0; i < numStartStates; ++i) { decodedStartStates[i] = 0; for (j = 0; j < network.numGenes; ++j) { if (network.fixedGenes[j] == -1) { decodedStartStates[i] |= GET_BIT(_startStates[i * startStateElements + j / BITS_PER_BLOCK_32], j % BITS_PER_BLOCK_32) << network.nonFixedGeneBits[j]; } } } unsigned int outcomeSize = 0; SparseMatrix * matrix; // perform simulation double * outcome = markovSimulation(&network,_numSteps,&outcomeSize,&matrix, decodedStartStates,numStartStates); // determine number of non-zero results unsigned int nonZero = 0; for (i = 0; i < outcomeSize; ++i) { if (outcome[i] > _cutoff) ++nonZero; } // encode results SEXP resSXP, stateSXP, probSXP; if (_returnTable) PROTECT(resSXP = allocList(5)); else PROTECT(resSXP = allocList(2)); PROTECT(stateSXP = allocVector(INTSXP,nonZero*startStateElements)); PROTECT(probSXP = allocVector(REALSXP,nonZero)); int * states = INTEGER(stateSXP); double * prob = REAL(probSXP); //return R_NilValue; for (i = 0, j = 0; i < outcomeSize; ++i) // encode states with non-zero probability { if (outcome[i] > _cutoff) { prob[j] = outcome[i]; states[j*startStateElements] = i; // re-encode fixed genes insertFixedGenes((unsigned int *)&states[j*startStateElements],network.fixedGenes,network.numGenes); ++j; } } SET_TAG(resSXP, install("states")); SET_TAG(CDR(resSXP), install("probabilities")); SETCAR(resSXP,stateSXP); SETCADR(resSXP,probSXP); if (_returnTable) // encode the transition table { SET_TAG(CDR(CDR(resSXP)), install("initialStates")); SET_TAG(CDR(CDR(CDR(resSXP))), install("nextStates")); SET_TAG(CDR(CDR(CDR(CDR(resSXP)))), install("transitionProbabilities")); //calculate size of transition table unsigned int tableSize = 0; for (i = 0; i < outcomeSize; ++i) { MatrixEntry * entry; for(entry = matrix->matrix[i]; entry != NULL; entry=entry->hh.next) { ++tableSize; } } SEXP initialStateSXP, nextStateSXP, transitionProbSXP; PROTECT(initialStateSXP = allocVector(INTSXP,tableSize * startStateElements)); PROTECT(nextStateSXP = allocVector(INTSXP,tableSize * startStateElements)); PROTECT(transitionProbSXP = allocVector(REALSXP,tableSize)); unsigned int * initialStates = (unsigned int *)INTEGER(initialStateSXP); unsigned int * nextStates = (unsigned int *)INTEGER(nextStateSXP); double * transitionProbs = (double *)REAL(transitionProbSXP); // encode non-zero states in transition matrix j = 0; for (i = 0; i < outcomeSize; ++i) { MatrixEntry * entry; for(entry = matrix->matrix[i]; entry != NULL; entry=entry->hh.next) { initialStates[j * startStateElements] = entry->state; insertFixedGenes(&initialStates[j*startStateElements],network.fixedGenes,network.numGenes); nextStates[j * startStateElements] = i; insertFixedGenes(&nextStates[j*startStateElements],network.fixedGenes,network.numGenes); transitionProbs[j] = entry->probability; ++j; } } SETCADDR(resSXP,initialStateSXP); SETCADDDR(resSXP,nextStateSXP); SETCADDDR(CDR(resSXP),transitionProbSXP); UNPROTECT(3); } UNPROTECT(3); freeMatrix(matrix); FREE(outcome); return resSXP; } BoolNet/src/common.h0000654000176200001440000000741712122071104014044 0ustar liggesusers#ifndef COMMON_H #define COMMON_H #include #include "uthash.h" /** * Common structures and definitions */ // the number of bits that can be stored in one component of a 32-bit state array #define BITS_PER_BLOCK_32 (sizeof(unsigned int) * 8) // Retrieve the -th bit in #define GET_BIT(x,i) (((x) & (1 << (i))) != 0) // Set the -th bit in to 1 #define SET_BIT(x,i) ((x) | (1 << (i))) // Set the -th bit in to 0 #define CLEAR_BIT(x,i) ((x) & (~(1 << (i)))) // Set the -th bit in to #define SET_BIT_TO_VAL(x,i,v) (((x) & (~(1 << (i)))) | ((v) << (i))) typedef struct { // a pointer to the allocated memory void * ptr; // used by the hash table UT_hash_handle hh; } AllocatedMemory; // map that stores all allocated memory pointers // to free them on interrupt extern AllocatedMemory * memoryMap; /** * Custom function to allocate memory that stores * the pointers in the global map. */ static inline void* CALLOC(unsigned int n, unsigned int sz) { void * ptr = calloc(n, sz); AllocatedMemory * m = calloc(1, sizeof(AllocatedMemory)); m->ptr = ptr; HASH_ADD_PTR(memoryMap, ptr, m); return ptr; } /** * Custom function to free memory that was * allocated using CALLOC(). */ static inline void FREE(void * ptr) { AllocatedMemory * m; HASH_FIND_PTR(memoryMap, &ptr, m); HASH_DEL(memoryMap, m); free(m); free(ptr); } /** * Free all remaining memory blocks stored in * the global map. */ extern void freeAllMemory(); /** * A structure that provides flexible * large array blocks as a list of arrays */ typedef struct ALE { void * array; struct ALE * next; } ArrayListElement; static inline void allocNewArray(ArrayListElement ** head, unsigned int numElements, unsigned int elementSize) { ArrayListElement * el = CALLOC(1, sizeof(ArrayListElement)); el->array = CALLOC(numElements, elementSize); el->next = *head; *head = el; } /* * Free an array list . */ static inline void freeArrayList(ArrayListElement * head) { ArrayListElement * current = head; while (current != NULL) { ArrayListElement * next = current->next; FREE(current->array); FREE(current); current = next; } } /** * Encode a vector of binary values in an integer. * The rightmost element in is the leftmost bit in * is an array of elements, and points * to an integer to which the result is written. */ extern void bin2dec(int *dec, int *bin, int *numBits); /** * Decode an integer to a vector of binary values. * The rightmost element in is the leftmost bit in * points to the result vector, is a number * to be decoded, and is the number of bits/elements in bin */ extern void dec2bin(int *bin, int *dec, int *numBits); /** * Inserts values of fixed genes into states - this is required as * fixed genes are not encoded in the internal state representations. * is a pointer to a state to be corrected. * is an array specifying which genes are fixed, as contained in * the BooleanNetwork structure. * is the length of . * The function changes the state pointed to by and has no return value. */ extern void insertFixedGenes(unsigned int * value, int* fixedGenes, unsigned int numGenes); /** * Removes values of fixed genes from states - this is required as * fixed genes are not encoded in the internal state representations. * is a pointer to a state to be corrected. * is an array specifying which genes are fixed, as contained in * the BooleanNetwork structure. * is the length of . * The function changes the state pointed to by and has no return value. */ extern void removeFixedGenes(unsigned int * value, int* fixedGenes, unsigned int numGenes); #endif BoolNet/src/common.c0000654000176200001440000000717712122071104014042 0ustar liggesusers#include "common.h" #include #include AllocatedMemory * memoryMap = NULL; /** * Common utilities for the BoolNet package * * This is part of the BooleanNetwork R package. * * Copyright 2009/2010 by Christoph Müssel and Zhou Dao * * Contact christoph.muessel@uni-ulm.de */ void freeAllMemory() { AllocatedMemory * m, * tmp; HASH_ITER(hh, memoryMap, m, tmp) { HASH_DEL(memoryMap, m); free(m->ptr); free(m); } //Rprintf("Freed all memory\n"); } /** * Encode a vector of binary values in an integer. * The rightmost element in is the leftmost bit in * is an array of elements, and points * to an integer to which the result is written. */ void bin2dec(int *dec, int *bin, int *numBits) { // clear output first unsigned int numElts; if (*numBits % BITS_PER_BLOCK_32 == 0) numElts = *numBits / BITS_PER_BLOCK_32; else numElts = *numBits / BITS_PER_BLOCK_32 + 1; memset(dec,0,numElts*sizeof(int)); // decode input and write binary integers unsigned int * unsigned_dec = (unsigned int *) dec; unsigned int i; for(i = 0; i < *numBits; ++i) { unsigned_dec[i / BITS_PER_BLOCK_32] |= (bin[i] << (i % BITS_PER_BLOCK_32)); } } /** * Decode an integer to a vector of binary values. * The rightmost element in is the leftmost bit in * points to the result vector, is a number * to be decoded, and is the number of bits/elements in bin */ void dec2bin(int *bin, int *dec, int *numBits) { unsigned int i; unsigned int * unsigned_dec = (unsigned int *) dec; for(i = 0; i < *numBits; ++i) if( (unsigned_dec[i / BITS_PER_BLOCK_32] & (1 << (i % BITS_PER_BLOCK_32))) != 0) bin[i] = 1; else bin[i] = 0; } /** * Inserts values of fixed genes into states - this is required as * fixed genes are not encoded in the internal state representations. * is a pointer to a state to be corrected. * is an array specifying which genes are fixed, as contained in * the BooleanNetwork structure. * is the length of . * The function changes the state pointed to by and has no return value. */ void insertFixedGenes(unsigned int * value, int* fixedGenes, unsigned int numGenes) { unsigned int tmp[numGenes]; unsigned int i, j = 0; // build an array of Boolean values for the genes for (i = 0; i < numGenes; ++i) { if (fixedGenes[i] != -1) // this gene is fixed { tmp[i] = fixedGenes[i]; } else // not a fixed gene => take value from original state { tmp[i] = ((value[j / BITS_PER_BLOCK_32] & (1 << (j % BITS_PER_BLOCK_32))) != 0) ? 1 : 0; ++j; } } // re-encode Boolean array to integer value bin2dec((int *)value,(int*)tmp,(int*)&numGenes); } /** * Removes values of fixed genes from states - this is required as * fixed genes are not encoded in the internal state representations. * is a pointer to a state to be corrected. * is an array specifying which genes are fixed, as contained in * the BooleanNetwork structure. * is the length of . * The function changes the state pointed to by and has no return value. */ void removeFixedGenes(unsigned int * value, int* fixedGenes, unsigned int numGenes) { unsigned int tmp[numGenes]; memset(tmp,0,sizeof(unsigned int) * numGenes); unsigned int i, j = 0; // build an array of Boolean values for the genes for (i = 0; i < numGenes; ++i) { if (fixedGenes[i] == -1) { tmp[j] = ((value[i / BITS_PER_BLOCK_32] & (1 << (i % BITS_PER_BLOCK_32))) != 0) ? 1 : 0; ++j; } } // re-encode Boolean array to integer value bin2dec((int *)value,(int*)tmp,(int*)&numGenes); } BoolNet/src/boolean_network.c0000654000176200001440000014701612122071104015737 0ustar liggesusers/** * C code to identify attractors in Boolean networks * * This is part of the BooleanNetwork R package. * * Copyright 2009/2010 by Christoph Müssel and Zhou Dao * * Contact christoph.muessel@uni-ulm.de * */ #include #include #include #include #include #include #include #include "random.h" #include "common.h" #include /** * Identification of attractors */ #define SYNC_MODE 0 #define ASYNC_MODE_RANDOM 1 #define NODE_ARRAY_SIZE 1024 /** * Internal structure describing a Boolean network */ typedef struct { // the number of genes in the network unsigned int numGenes; // a vector specifying whether the genes are fixed: // -1 means the gene is not fixed, 1 and 0 means the // genes are fixed to the corresponding values int * fixedGenes; // an index array with the -th entry // specifying the bit position of the -th gene // in a state array - this is not always equal to , // as fixed genes are not stored unsigned int * nonFixedGeneBits; // a vector encoding the input genes for all transition functions. int * inputGenes; // a vector of indices to split up for the single // gene transition functions. int * inputGenePositions; // a vector encoding the return values of all transition functions int * transitionFunctions; // a vector of indices to split up for the single // genes. int * transitionFunctionPositions; } BooleanNetwork; typedef struct TTE { unsigned int * initialState; unsigned int * nextState; struct TTE * next; } TransitionTableEntry; /** * Structure that internally describes an attractor */ typedef struct Attractor { // an array of states the attractor consists of unsigned int *involvedStates; // if this is a complex attractor, // the transitions of the attractor are stored here TransitionTableEntry * table; // the number of elements in
unsigned int transitionTableSize; // the number of array elements for one entry of // - i.e. for more than 32 genes, successive // array elements form one entry. unsigned int numElementsPerEntry; // the number of states in int length; // the number of states in the basin of attraction unsigned int basinSize; // list pointer to the next element struct Attractor *next; } Attractor, *pAttractor; /** * A structure holding all information * retrieved by the algorithms in this file */ typedef struct { // the number of elements in the following three arrays unsigned long long tableSize; // the states before the transition - can be NULL unsigned int *initialStates; // the resulting states of the transition table unsigned int *table; // the number of array elements for one entry of the table // - i.e. for more than 32 genes, successive // array elements in
and form one table entry. unsigned int numElementsPerEntry; // the attractors the corresponding states belong to unsigned int *attractorAssignment; // the number of transitions needed to go from the original state // (before transition, not stored here as it is defined by the order) // to the attractor unsigned int *stepsToAttractor; // the list of attractors pAttractor attractorList; } AttractorInfo, *pAttractorInfo; /** * A structure saving search trees for states. * State trees are employed if a non-exhaustive search is * conducted to provide an efficient method to lookup * states that have already been visited. */ typedef struct STN { // The left child node (containing "smaller" states) struct STN * leftChild; // The right child node (containing "larger" states) struct STN * rightChild; union { // In case of synchronous networks: struct { // The node holding the next state after a transition has // been applied to the current state struct STN * successor; // The basin of attraction to which the state belongs unsigned int attractorAssignment; // The number of transitions required to enter the attractor unsigned int stepsToAttractor; } sync; // In case of asynchronous networks: struct { // An array of all successor nodes struct STN ** successors; // The number of successor states unsigned int numSuccessors; // Dummy variable unsigned int unused; } async; } type; // The state itself - a set of binary-encoded integers with // elements unsigned int * data; } StateTreeNode; typedef struct { StateTreeNode * root; unsigned int arraySize; unsigned int nodeCount; unsigned int numElements; unsigned int successorPos; ArrayListElement * nodeArrays; ArrayListElement * dataArrays; ArrayListElement * successorArrays; } StateTree; void stateTransition(unsigned int * currentState, unsigned int * nextState, BooleanNetwork * net); /** * Allocate a new AttractorInfo structure for states */ pAttractorInfo allocAttractorInfo(unsigned long long tableSize, unsigned int numGenes) { pAttractorInfo res = (pAttractorInfo)CALLOC(1,sizeof(AttractorInfo)); if ((numGenes % BITS_PER_BLOCK_32) == 0) res->numElementsPerEntry = numGenes/BITS_PER_BLOCK_32; else res->numElementsPerEntry = numGenes/BITS_PER_BLOCK_32 + 1; res->table = NULL; res->tableSize = tableSize; res->initialStates = NULL; res->table = (unsigned int*) CALLOC(tableSize * res->numElementsPerEntry,sizeof(unsigned int)); res->attractorAssignment = (unsigned int*) CALLOC(tableSize,sizeof(unsigned int)); res->stepsToAttractor = (unsigned int*) CALLOC(tableSize,sizeof(unsigned int)); return res; } /** * Free a list of attractor structures */ void freeAttractorList(pAttractor p) { do { pAttractor next = p->next; if (p->involvedStates != NULL) FREE(p->involvedStates); FREE(p); p = next; } while(p != NULL); } /** * Free an AttractorInfo structure including * all sub-elements and the attractor list */ void freeAttractorInfo(pAttractorInfo p) { if (p->initialStates != 0) FREE(p->initialStates); FREE(p->table); FREE(p->attractorAssignment); FREE(p->stepsToAttractor); freeAttractorList(p->attractorList); FREE(p); } /** * Insert a new transition from to into
. * is the number of array elements occupied by a state. */ TransitionTableEntry * insertNewTransition(TransitionTableEntry ** table, unsigned int * initialState, unsigned int * nextState, unsigned int numElements) { TransitionTableEntry * entry = (TransitionTableEntry *)CALLOC(1,sizeof(TransitionTableEntry)); entry->initialState = CALLOC(numElements,sizeof(unsigned int)); entry->nextState = CALLOC(numElements,sizeof(unsigned int)); memcpy(entry->initialState,initialState,numElements*sizeof(unsigned int)); memcpy(entry->nextState,nextState,numElements*sizeof(unsigned int)); entry->next = *table; *table = entry; return entry; } /** * Free a list-type transition table as used in complex attractors */ void freeTransitionTableEntry(TransitionTableEntry * t) { do { TransitionTableEntry * next = t->next; FREE(t->initialState); FREE(t->nextState); FREE(t); t = next; } while (t != NULL); } static inline StateTree * allocStateTree(unsigned int numElements, unsigned int arraySize) { StateTree * tree = CALLOC(1, sizeof(StateTree)); tree->root = NULL; tree->arraySize = arraySize; tree->successorPos = 0; tree->nodeCount = 0; tree->nodeArrays = NULL; tree->dataArrays = NULL; tree->successorArrays = NULL; tree->numElements = numElements; return(tree); } static inline void newNodeArray(StateTree * tree) { allocNewArray(&tree->nodeArrays, tree->arraySize, sizeof(StateTreeNode)); allocNewArray(&tree->dataArrays, tree->arraySize * tree->numElements, sizeof(unsigned int)); } static inline void newSuccessorArray(StateTree * tree) { allocNewArray(&tree->successorArrays, tree->arraySize, sizeof(StateTreeNode *)); tree->successorPos = 0; } static inline void freeStateTree(StateTree * tree) { freeArrayList(tree->nodeArrays); freeArrayList(tree->dataArrays); freeArrayList(tree->successorArrays); FREE(tree); } /** * Allocate a new node of a state tree. * and are pointers to the * left and right subtrees. * is the state reached after a state transition. * is an array of binary-encoded integers of length * describing the state. * is the basin of attraction the state belongs to, * and is the number of transitions required to enter * the attractor. * * Returns a state tree node with the supplied values. */ static inline StateTreeNode * allocTreeNode(StateTree * tree, StateTreeNode * leftChild, StateTreeNode * rightChild, StateTreeNode * successor, unsigned int * data, unsigned int numElements, unsigned int attractorAssignment, unsigned int stepsToAttractor) { if (tree->nodeCount % tree->arraySize == 0) newNodeArray(tree); StateTreeNode * res = &(((StateTreeNode *)tree->nodeArrays->array)[tree->nodeCount % tree->arraySize]); res->leftChild = leftChild; res->rightChild = rightChild; res->type.sync.successor = successor; res->data = &(((unsigned int *)tree->dataArrays->array) [(tree->nodeCount % tree->arraySize) * tree->numElements]); memcpy(res->data,data,numElements*sizeof(unsigned int)); res->type.sync.attractorAssignment = attractorAssignment; res->type.sync.stepsToAttractor = stepsToAttractor; ++tree->nodeCount; return res; } static inline StateTreeNode ** reserveSuccessorArray(StateTree * tree, unsigned int numSuccessors) { if (tree->successorArrays == NULL || tree->successorPos + numSuccessors >= tree->arraySize) newSuccessorArray(tree); StateTreeNode ** res = &(((StateTreeNode **)tree->successorArrays->array)[tree->successorPos]); tree->successorPos += numSuccessors; return res; } /** * Recursive helper function for findNode() */ StateTreeNode * findNodeRec(StateTree * tree, StateTreeNode * parent, unsigned int * data, unsigned int numElements, bool * found) { unsigned int direction = 0; int i; for (i = numElements - 1; i >= 0; --i) { if (data[i] > parent->data[i]) { direction = 1; break; } if (data[i] < parent->data[i]) { direction = 2; break; } } switch(direction) { case 0: *found = true; return parent; case 1: if (parent->rightChild == 0) { parent->rightChild = allocTreeNode(tree, 0,0,0,data,numElements,0,0); *found = false; return parent->rightChild; } else return findNodeRec(tree, parent->rightChild,data,numElements,found); case 2: if (parent->leftChild == 0) { parent->leftChild = allocTreeNode(tree, 0,0,0,data,numElements,0,0); *found = false; return parent->leftChild; } else return findNodeRec(tree, parent->leftChild,data,numElements,found); } // should never be reached return 0; } /** * Recursively find the node corresponding to state in the state tree , * or insert the node if it does not exist. * is the size of the state vector . * The return value of indicates whether the element previously existed in the tree * * Returns the (possibly newly created) node belonging to . If the tree is empty, * is set to this node. */ StateTreeNode * findNode(StateTree * tree, unsigned int * data, unsigned int numElements, bool * found) { if (tree->root == 0) { tree->root = allocTreeNode(tree, 0,0,0,data,numElements,0,0); *found = false; return tree->root; } return findNodeRec(tree, tree->root,data,numElements, found); } /** * Returns the successor of the supplied state node . * If the state transition has not yet been calculated, * a new node is inserted into the tree . * is the number of array elements required to store one state. * describes the network for which a state transition is performed. * is a counter to be increased when a new state is identified */ StateTreeNode * findSuccessor(StateTree * tree, StateTreeNode * current, unsigned int numElementsPerEntry, BooleanNetwork * net, unsigned int * basinCounter) { bool found; if (current->type.sync.successor == 0) // the state does not exist => calculate state transition and insert it { unsigned int nextState[numElementsPerEntry]; stateTransition(current->data,nextState,net); current->type.sync.successor = findNode(tree,nextState,numElementsPerEntry, &found); ++ *basinCounter; } return current->type.sync.successor; } /** * Traverse the tree supplied by in-order, and write the values * of the tree nodes to the corresponding arrays , *
, , and . * is the number of array elements allocated by one state. * is the current value of the node counter used for the array indices * and increased during recursion. This should be initially set to 0. */ void inOrderSerializeTree(StateTreeNode * root, unsigned int * initialStates, unsigned int * table, unsigned int * attractorAssignment, unsigned int * stepsToAttractor, unsigned int numElements, unsigned int * nodeNo) { R_CheckUserInterrupt(); if (root->leftChild != 0) // recursive descent of left subtree inOrderSerializeTree(root->leftChild,initialStates,table,attractorAssignment, stepsToAttractor,numElements,nodeNo); // write the state itself memcpy(&initialStates[numElements* (*nodeNo)],root->data,numElements*sizeof(unsigned int)); memcpy(&table[numElements* (*nodeNo)],root->type.sync.successor->data,numElements*sizeof(unsigned int)); attractorAssignment[*nodeNo] = root->type.sync.attractorAssignment; stepsToAttractor[*nodeNo] = root->type.sync.stepsToAttractor; *nodeNo = *nodeNo + 1; if (root->rightChild != 0) // recursive descent of right subtree inOrderSerializeTree(root->rightChild,initialStates,table,attractorAssignment, stepsToAttractor,numElements,nodeNo); } /** * Free a state tree supplied by recursively. * If , is assumed to be an array and freed */ /* void freeTreeNode(StateTreeNode * node, bool freeSuccessorArray) { if (node->leftChild != 0) freeTreeNode(node->leftChild, freeSuccessorArray); if (node->rightChild != 0) freeTreeNode(node->rightChild, freeSuccessorArray); if (freeSuccessorArray) FREE(node->type.async.successors); FREE(node->data); FREE(node); --nodeCount; } */ /** * Make a transition from to the next state. * is a binary-coded integer with used bits. * is an array of values specifying whether gene is fixed (0 or 1) or not (-1). * provides the input genes for all transition functions and can be split up * for a single function according to . * provides the truth tables for all transition functions and can be split up * for a single function according to . * * The return value is the next state, encoded in a single integer. */ void stateTransition(unsigned int * currentState, unsigned int * nextState, BooleanNetwork * net) { unsigned int i = 0, k = 0, idx = 0; unsigned int elementsPerEntry; if (net->numGenes % BITS_PER_BLOCK_32 == 0) { elementsPerEntry = net->numGenes / BITS_PER_BLOCK_32; } else { elementsPerEntry = net->numGenes / BITS_PER_BLOCK_32 + 1; } for (i = 0; i < elementsPerEntry; ++i) nextState[i] = 0; for (i = 1; i <= net->numGenes; ++i) { if (net->fixedGenes[i-1] == -1) // the gene is not fixed { unsigned long long inputdec = 0; for (k = net->inputGenePositions[i-1]; k < net->inputGenePositions[i]; k++) { if (net->inputGenes[k]) // if the input of the function is not 0 (constant gene), take input bit { unsigned int gene = net->inputGenes[k] - 1; unsigned int bit; if (net->fixedGenes[gene] == -1) bit = (GET_BIT(currentState[net->nonFixedGeneBits[gene] / BITS_PER_BLOCK_32], net->nonFixedGeneBits[gene] % BITS_PER_BLOCK_32)); else // fixed genes are not encoded in the states // => take them from fixedGenes vector bit = net->fixedGenes[gene]; inputdec |= bit << (net->inputGenePositions[i] - k - 1); } } // determine transition function int transition = net->transitionFunctions[net->transitionFunctionPositions[i-1] + inputdec]; if(transition != -1) // apply transition function nextState[idx / BITS_PER_BLOCK_32] |= (transition << (idx % BITS_PER_BLOCK_32)); else // this is a dummy function for a constant gene // => value does not change nextState[idx / BITS_PER_BLOCK_32] |= (GET_BIT(currentState[idx / BITS_PER_BLOCK_32], idx % BITS_PER_BLOCK_32) << (idx % BITS_PER_BLOCK_32)); //(GET_BIT(currentState[(i-1) / BITS_PER_BLOCK_32], // (i-1) % BITS_PER_BLOCK_32) << (idx % BITS_PER_BLOCK_32)); ++idx; } } } /** * Retrieves the result column of the state transition table. * specifies the total number of genes. * is an array of values specifying whether gene is fixed (0 or 1) or not (-1). * provides the input genes for all transition functions and can be split up * for a single function according to . * provides the truth tables for all transition functions and can be split up * for a single function according to . */ unsigned long long * getTransitionTable(BooleanNetwork * net) { unsigned long long i = 0; // determine number of fixed genes int numFixed = 0; for( i = 0; i < net->numGenes; i++) if(net->fixedGenes[i] != -1) ++numFixed; int numNonFixed = net->numGenes - numFixed; // allocate truth table with 2^(non-fixed genes) elements unsigned long long numberOfElements = pow(2,numNonFixed); unsigned long long * table = CALLOC(numberOfElements,sizeof(unsigned long long)); if (table == 0) { Rf_error("Too few memory available!"); } unsigned long long initialState = 0; // calculate state transitions for(initialState = 0; initialState < numberOfElements; ++initialState) { R_CheckUserInterrupt(); //state is simply the binary encoding of the counter //calculate transition table[initialState] = 0; stateTransition((unsigned int *)&initialState, (unsigned int *)&table[initialState], net); } return table; } /** * Retrieves attractors from a given transition table
with entries. * * Returns a list of attractors - the last element of this list is empty! */ pAttractorInfo getAttractors(unsigned long long * table, unsigned int numberOfStates, unsigned int numberOfGenes) { unsigned long long i; unsigned int current_attractor = 0, elementsPerEntry; if (numberOfGenes <= 32) { elementsPerEntry = 1; } else { elementsPerEntry = 2; } pAttractorInfo result = allocAttractorInfo(numberOfStates,numberOfGenes); for (i = 0; i < numberOfStates; ++i) { memcpy(&result->table[i],&table[i],sizeof(unsigned int) * elementsPerEntry); } pAttractor attractorHead, attractorList,tmpList; attractorHead = attractorList = (pAttractor) CALLOC(1,sizeof(Attractor)); attractorList->next = NULL; for(i = 0; i < numberOfStates; i++) { R_CheckUserInterrupt(); if(!result->attractorAssignment[i]) // the current state has not yet been visited { // first attractor has number 1 current_attractor++; unsigned long long begin = i; unsigned int steps = 0; while(!result->attractorAssignment[begin]) // iterate while no attractor has been assigned { ++steps; // first simply count steps until attractor is reached // - to get the distance to the attractor, this number is // later subtracted from the maximum distance result->stepsToAttractor[begin] = steps; result->attractorAssignment[begin] = current_attractor; // perform a state transition begin = table[begin]; } if(current_attractor == result->attractorAssignment[begin]) //calculate length and basin size of new attractor { attractorList->basinSize = steps; // fix the number of steps to the attractor by calculating // the maximum distance and subtracting the current value from it int maxstep = result->stepsToAttractor[begin]; int rec = 0; unsigned long long tmp = i; while(tmp != begin) { rec++; result->stepsToAttractor[tmp] = maxstep - result->stepsToAttractor[tmp]; tmp = table[tmp]; } attractorList->length = steps - rec; attractorList->involvedStates = (unsigned int *) CALLOC(attractorList->length * elementsPerEntry,sizeof(unsigned int)); attractorList->numElementsPerEntry = elementsPerEntry; int a=0; do { result->stepsToAttractor[tmp] = 0; //attractorList->involvedStates[a++] = tmp; memcpy(&attractorList->involvedStates[a],&tmp,elementsPerEntry*sizeof(unsigned int)); tmp = table[tmp]; a += elementsPerEntry; } while(tmp != begin); /* set steps of attractors to 0; add attractor stub information */ //generate a next attractor space attractorList->next = (pAttractor)CALLOC(1,sizeof(Attractor)); attractorList = attractorList->next; attractorList->next = NULL; } else //update existing attractor { // reset attractor number current_attractor--; // assign states to attractor basin, and // correct the numbers of steps to the attractor unsigned long long tmp = i; int maxstp = result->stepsToAttractor[begin] + steps; while(tmp != begin) { result->attractorAssignment[tmp] = result->attractorAssignment[begin]; result->stepsToAttractor[tmp] = maxstp - result->stepsToAttractor[tmp] + 1; tmp = table[tmp]; } // update basin size in attractor record tmpList = attractorHead; for (tmp = 1; tmp < result->attractorAssignment[begin]; tmp++) tmpList = tmpList->next; tmpList->basinSize = tmpList->basinSize + steps; } } } result->attractorList = attractorHead; FREE(table); return result; } /** * Retrieves attractors only for a given set of input states supplied in . * Here, numGenes / 32)> consecutive array entries describe one state, thus * the array size is numGenes / 32) * numberOfStates> * describes the network structure. */ pAttractorInfo getAttractorsForStates(unsigned int * selectedStates, unsigned int numberOfStates, BooleanNetwork * net) { unsigned long long i; unsigned int current_attractor = 0, elementsPerEntry; bool found; // calculate the number of array elements required for one state // (depending on the number of genes) if (net->numGenes % (sizeof(unsigned int) * 8) == 0) { elementsPerEntry = net->numGenes / BITS_PER_BLOCK_32; } else { elementsPerEntry = net->numGenes / BITS_PER_BLOCK_32 + 1; } // all states are stored in a tree for fast search StateTree * stateTree = allocStateTree(elementsPerEntry, NODE_ARRAY_SIZE); pAttractor attractorHead, attractorList,tmpList; attractorHead = attractorList = (pAttractor) CALLOC(1,sizeof(Attractor)); attractorList->next = NULL; for(i = 0; i < numberOfStates; i++) { // check whether the current state is already in the state tree, otherwise insert it StateTreeNode * currentState = findNode(stateTree,&selectedStates[i*elementsPerEntry],elementsPerEntry,&found); if(!currentState->type.sync.attractorAssignment) // the current state has not yet been visited { // first attractor has number 1 current_attractor++; unsigned int steps = 0; unsigned int basinSize = 0; while(!currentState->type.sync.attractorAssignment) // iterate while no attractor has been assigned { R_CheckUserInterrupt(); ++steps; // first simply count steps until attractor is reached // - to get the distance to the attractor, this number is // later subtracted from the maximum distance currentState->type.sync.stepsToAttractor = steps; currentState->type.sync.attractorAssignment = current_attractor; // perform a state transition currentState = findSuccessor(stateTree,currentState,elementsPerEntry,net,&basinSize); } if(current_attractor == currentState->type.sync.attractorAssignment) //calculate length and basin size of new attractor { attractorList->basinSize = steps; // fix the number of steps to the attractor by calculating // the maximum distance and subtracting the current value from it int maxstep = currentState->type.sync.stepsToAttractor; int rec = 0; StateTreeNode * tmp = findNode(stateTree,&selectedStates[i*elementsPerEntry],elementsPerEntry,&found); while(memcmp(tmp->data,currentState->data,elementsPerEntry*sizeof(unsigned int))) { R_CheckUserInterrupt(); rec++; tmp->type.sync.stepsToAttractor = maxstep - tmp->type.sync.stepsToAttractor; // perform a state transition tmp = findSuccessor(stateTree,tmp,elementsPerEntry,net,&basinSize); } attractorList->length = steps - rec; attractorList->involvedStates = (unsigned int *) CALLOC(attractorList->length * elementsPerEntry,sizeof(unsigned int)); attractorList->numElementsPerEntry = elementsPerEntry; int a=0; do { R_CheckUserInterrupt(); tmp->type.sync.stepsToAttractor = 0; memcpy(&attractorList->involvedStates[a],tmp->data,elementsPerEntry*sizeof(unsigned int)); tmp = findSuccessor(stateTree,tmp,elementsPerEntry,net,&basinSize); a += elementsPerEntry; } while(memcmp(tmp->data,currentState->data,elementsPerEntry*sizeof(unsigned int))); //generate a next attractor space attractorList->next = (pAttractor)CALLOC(1,sizeof(Attractor)); attractorList = attractorList->next; attractorList->next = NULL; } else //update existing attractor { // reset attractor number current_attractor--; // assign states to attractor basin, and // correct the numbers of steps to the attractor StateTreeNode * tmp = findNode(stateTree,&selectedStates[i*elementsPerEntry],elementsPerEntry,&found); int maxstp = currentState->type.sync.stepsToAttractor + steps; while(memcmp(tmp->data,currentState->data,elementsPerEntry*sizeof(unsigned int))) { R_CheckUserInterrupt(); tmp->type.sync.attractorAssignment = currentState->type.sync.attractorAssignment; tmp->type.sync.stepsToAttractor = maxstp - tmp->type.sync.stepsToAttractor + 1; //perform a state transition tmp = findSuccessor(stateTree,tmp,elementsPerEntry,net,&basinSize); } // update basin size in attractor record tmpList = attractorHead; unsigned int i; for (i = 1; i < currentState->type.sync.attractorAssignment; ++i) tmpList = tmpList->next; tmpList->basinSize = tmpList->basinSize + basinSize; } } } pAttractorInfo result = allocAttractorInfo(stateTree->nodeCount,net->numGenes); result->attractorList = attractorHead; result->initialStates = CALLOC(result->tableSize * elementsPerEntry,sizeof(unsigned int)); unsigned int nodeNo = 0; // build a series of arrays by in-order traversing the tree inOrderSerializeTree(stateTree->root, result->initialStates, result->table, result->attractorAssignment, result->stepsToAttractor, elementsPerEntry, &nodeNo); freeStateTree(stateTree); return result; } /** * Identification of attractors in asynchronous networks */ typedef struct SSE { unsigned int * state; struct SSE * next; } StateStackElement; /** * Push a new element on top of the stack . * is the state to push onto the stack and has elements. * Returns the new stack element. */ static inline StateStackElement * pushStateStackElement(StateStackElement ** stack, unsigned int * state, unsigned int numElements) { StateStackElement * el = CALLOC(1,sizeof(StateStackElement)); el->state = CALLOC(numElements,sizeof(unsigned int)); memcpy(el->state,state,sizeof(unsigned int) * numElements); el->next = *stack; *stack = el; return el; } /** * Remove the top-level element from . */ static inline void deleteStateStackElement(StateStackElement ** stack) { StateStackElement * el = *stack; *stack = (*stack)->next; FREE(el->state); FREE(el); } /** * Applies the transition function belonging to gene to state . * holds the network information. * The result is returned in . */ static inline void applySingleFunction(unsigned int * currentState, unsigned int geneIdx, BooleanNetwork * net) { unsigned int k = 0; if (net->fixedGenes[geneIdx] == -1) // the gene is not fixed { unsigned long long inputdec = 0; for (k = net->inputGenePositions[geneIdx]; k < net->inputGenePositions[geneIdx+1]; k++) { if (net->inputGenes[k]) // if the input of the function is not 0 (constant gene), take input bit { unsigned int gene = net->inputGenes[k] - 1; unsigned int bit; if (net->fixedGenes[gene] == -1) bit = (GET_BIT(currentState[gene / BITS_PER_BLOCK_32], gene % BITS_PER_BLOCK_32)); else // fixed genes are not encoded in the states // => take them from fixedGenes vector bit = net->fixedGenes[gene]; inputdec |= bit << (net->inputGenePositions[geneIdx+1] - k - 1); } } // determine transition function int transition = net->transitionFunctions[net->transitionFunctionPositions[geneIdx] + inputdec]; currentState[geneIdx / BITS_PER_BLOCK_32] = CLEAR_BIT(currentState[geneIdx / BITS_PER_BLOCK_32], geneIdx % BITS_PER_BLOCK_32); if(transition != -1) // apply transition function currentState[geneIdx / BITS_PER_BLOCK_32] |= (transition << (geneIdx % BITS_PER_BLOCK_32)); else // this is a dummy function for a constant gene // => value does not change currentState[geneIdx / BITS_PER_BLOCK_32] |= (GET_BIT(currentState[geneIdx / BITS_PER_BLOCK_32], geneIdx % BITS_PER_BLOCK_32) << (geneIdx % BITS_PER_BLOCK_32)); } } /** * Calculate a random asynchronous state transition for . * If is not NULL, this is a vector specifying * the cumulative distribution function of the probabilities of genes * to be chosen for a transition. Otherwise, each gene has equal probability. */ static inline void asynchronousStateTransition(unsigned int * currentState, double * probabilities, BooleanNetwork * net) { unsigned int numElts, i; if (net->numGenes % BITS_PER_BLOCK_32 == 0) numElts = net->numGenes / BITS_PER_BLOCK_32; else numElts = net->numGenes / BITS_PER_BLOCK_32 + 1; if (probabilities == NULL) // uniform gene selection { unsigned int r; // ensure that no fixed gene is chosen do { r = intrand(net->numGenes); } while (net->fixedGenes[r] != -1); // make a transition with the chosen gene applySingleFunction(currentState,r,net); } else { double r = doublerand_1(); // find the last index in the cumulative distribution that // is less than for (i = 0; i < net->numGenes; ++i) { if (probabilities[i] < r && probabilities[i+1] >= r) break; } // make a transition with the chosen gene applySingleFunction(currentState,i,net); } } /** * Calculate the forward reachable set of . * is the number of array elements used to represent one state. * If is true, self loops are only considered if there are no other possible transitions. * holds the network information. * Returns the resulting state tree (set).. */ StateTree * buildAsynchronousStateSet(unsigned int * startState, unsigned int numElements, bool avoidSelfLoops, BooleanNetwork * net) { StateTree * res = allocStateTree(numElements, NODE_ARRAY_SIZE); StateStackElement * stack = NULL; unsigned int i; bool found=false, newNodes=false; // push the start state onto the stack pushStateStackElement(&stack,startState,numElements); do // iterate while stack is not empty (depth-first search) { R_CheckUserInterrupt(); unsigned int origstate[numElements]; memcpy(origstate,stack->state,sizeof(unsigned int) * numElements); // remove the top-level stack element deleteStateStackElement(&stack); StateTreeNode * current = findNode(res,origstate,numElements,&found); StateTreeNode ** successors; unsigned int numSuccessors; if (avoidSelfLoops) // try to find successor states that do not lead to the initial state { unsigned int successorStates[net->numGenes*numElements]; for (i = 0; i < net->numGenes; ++i) // first, calculate all successors { memcpy(&successorStates[i*numElements],origstate,sizeof(unsigned int) * numElements); applySingleFunction(&successorStates[i*numElements],i,net); } unsigned int numNonSelfLoops = 0; bool noSelfLoop[net->numGenes]; for (i = 0; i < net->numGenes; ++i) // now, check which of the successor states are the same as the initial state { if (memcmp(&successorStates[i*numElements],origstate,sizeof(unsigned int) * numElements) != 0) { ++numNonSelfLoops; noSelfLoop[i] = true; } else noSelfLoop[i] = false; } if (numNonSelfLoops == 0) // all transitions are self loops // => accept self loop { successors = reserveSuccessorArray(res,1); numSuccessors = 1; successors[0] = findNode(res,successorStates,numElements,&found); if (!found) pushStateStackElement(&stack,successorStates,numElements); } else // there is at least one transition that is no self loop // => do not accept self loops { successors = reserveSuccessorArray(res, numNonSelfLoops); numSuccessors = numNonSelfLoops; unsigned int j; for (i = 0, j = 0; i < net->numGenes; ++i) { if (noSelfLoop[i]) // create successor in tree { successors[j++] = findNode(res,&successorStates[i*numElements],numElements,&found); newNodes = newNodes | !found; if (!found) pushStateStackElement(&stack,&successorStates[i*numElements],numElements); } } } } else // self loops are allowed { unsigned int state[numElements]; successors = reserveSuccessorArray(res,net->numGenes); numSuccessors = net->numGenes; for (i = 0; i < net->numGenes; ++i) // calculate all successors { memcpy(state,origstate,sizeof(unsigned int) * numElements); applySingleFunction(state,i,net); successors[i] = findNode(res,state,numElements,&found); newNodes = newNodes | !found; if (!found) pushStateStackElement(&stack,state,numElements); } } current->type.async.successors = successors; current->type.async.numSuccessors = numSuccessors; } while (stack != NULL); // return the number of elements in the state set return res; } /** * Recursively retrieve an array of states from a tree * and store it to is the number of array elements used to represent one state. * is the current array entry to be written and should be initialized to 0. */ void getStateSet(StateTreeNode * root, unsigned int * states, unsigned int numElements, unsigned int * nodeNo) { if (root->leftChild != 0) // recursive descent of left subtree getStateSet(root->leftChild,states,numElements,nodeNo); // write the state itself memcpy(&states[numElements* (*nodeNo)],root->data,numElements*sizeof(unsigned int)); *nodeNo = *nodeNo + 1; if (root->rightChild != 0) // recursive descent of right subtree getStateSet(root->rightChild,states,numElements,nodeNo); } /** * Recursively extract the transition table from a state set * and store it to a list of transitions
. * is the number of array elements used to represent one state. * receives the size of the resulting table. */ void getLooseAttractorTransitionTable(StateTreeNode * root, TransitionTableEntry ** table, unsigned int numElements, unsigned int * size) { if (root->leftChild != 0) // recursive descent of left subtree getLooseAttractorTransitionTable(root->leftChild,table,numElements,size); bool duplicate[root->type.async.numSuccessors]; memset(duplicate,0,sizeof(bool)*root->type.async.numSuccessors); unsigned int i, j; // check for duplicate transitions for (i = 0; i < root->type.async.numSuccessors; ++i) { for (j = i + 1; j < root->type.async.numSuccessors; ++j) { if (memcmp(&root->type.async.successors[i * numElements], &root->type.async.successors[j * numElements], sizeof(unsigned int) * numElements) == 0) duplicate[j] = true; } } // copy the unique transitions to the table for (i = 0; i < root->type.async.numSuccessors; ++i) { if (!duplicate[i]) { insertNewTransition(table,root->data,root->type.async.successors[i]->data,numElements); ++ *size; } } if (root->rightChild != 0) // recursive descent of right subtree getLooseAttractorTransitionTable(root->rightChild,table,numElements, size); } /** * Validate whether a set with states is a true attractor. * If is true, self loops are only considered if there are no other possible transitions. * holds the network information. */ bool validateAttractor(unsigned int * attractor, unsigned int attractorLength, bool avoidSelfLoops,BooleanNetwork * net) { unsigned int numElts, i; if (net->numGenes % BITS_PER_BLOCK_32 == 0) numElts = net->numGenes / BITS_PER_BLOCK_32; else numElts = net->numGenes / BITS_PER_BLOCK_32 + 1; for (i = 0; i < attractorLength; ++i) // iterate over states { StateTree * set = buildAsynchronousStateSet(&attractor[i*numElts],numElts,avoidSelfLoops,net); if (set->nodeCount != attractorLength) { freeStateTree(set); return false; } unsigned int size_set = set->nodeCount; unsigned int states_set[numElts * size_set]; unsigned int nodeNo = 0; getStateSet(set->root,states_set,numElts,&nodeNo); freeStateTree(set); // compare forward reachable set to original set if (memcmp(states_set,attractor,sizeof(unsigned int) * numElts * size_set) != 0) // no attractor return false; } return true; } /** * Calculate complex/loose attractors by performing random transitions from * the states supplied in . * If is true, self loops are only considered if there are no other possible transitions. * If is not NULL, this vector holds the probabilities for each gene to be chosen * for a transition. */ pAttractorInfo getLooseAttractors(unsigned int * selectedStates, unsigned int numberOfStates, BooleanNetwork * net, unsigned int randomSteps, bool avoidSelfLoops, double * probabilities) { // attractor list has empty dummy element at the end pAttractor attractorList = CALLOC(1,sizeof(Attractor)); unsigned int numElts, i, j; if (net->numGenes % BITS_PER_BLOCK_32 == 0) numElts = net->numGenes / BITS_PER_BLOCK_32; else numElts = net->numGenes / BITS_PER_BLOCK_32 + 1; // if probabilities for the genes are supplied, exclude fixed genes (if any) // and recalculate probabilities double * pProbabilities = NULL; double convertedProbabilities[net->numGenes + 1]; if (probabilities != NULL) { convertedProbabilities[0] = 0.0; double probabilitySum = 0.0; for (i = 0; i < net->numGenes; ++i) { if (net->fixedGenes[i] == -1) probabilitySum += probabilities[i]; } for (i = 0; i < net->numGenes; ++i) { if (net->fixedGenes[i] == -1) convertedProbabilities[i+1] = convertedProbabilities[i] + probabilities[i]/probabilitySum; else convertedProbabilities[i+1] = convertedProbabilities[i]; } pProbabilities = convertedProbabilities; } for (i = 0; i < numberOfStates; ++i) // iterate over supplied start states { unsigned int currentState[numElts]; memcpy(currentState,&selectedStates[i*numElts],sizeof(unsigned int) * numElts); unsigned int t = 0; for (j = randomSteps; j > 0; --j) // perform random state transitions // to reach a potential attractor { asynchronousStateTransition(currentState,pProbabilities,net); ++t; } // calculate forward reachable set of end state StateTree * set = buildAsynchronousStateSet(currentState,numElts,avoidSelfLoops,net); unsigned int states_set[numElts * set->nodeCount]; unsigned int nodeNo = 0; getStateSet(set->root,states_set,numElts,&nodeNo); // search for the current potential attractor in the attractor list bool found = false; pAttractor current = attractorList; while (current != NULL && !found) { found = ((set->nodeCount == current->length) && (memcmp(states_set,current->involvedStates,sizeof(unsigned int) * numElts * set->nodeCount) == 0)); current = current->next; } if (!found) // the potential attractor does not yet exist in the result list { if (validateAttractor(states_set,set->nodeCount,avoidSelfLoops,net)) // check whether this is a true attractor { pAttractor attractor = CALLOC(1,sizeof(Attractor)); attractor->numElementsPerEntry = numElts; attractor->length = set->nodeCount; attractor->involvedStates = CALLOC(numElts * set->nodeCount,sizeof(unsigned int)); memcpy(attractor->involvedStates,states_set,sizeof(unsigned int) * numElts * set->nodeCount); attractor->transitionTableSize = 0; if (set->nodeCount != 1) // if this is a steady-state attractor, no need to store transition table! getLooseAttractorTransitionTable(set->root,&attractor->table,numElts,&(attractor->transitionTableSize)); attractor->next = attractorList; attractorList = attractor; } } freeStateTree(set); } pAttractorInfo res = allocAttractorInfo(0,net->numGenes); res->attractorList = attractorList; return res; } /** * The R wrapper function for getAttractors. * Arguments: * inputGenes An integer vector containing the concatenated input gene lists * of *all* transition functions * inputGenePositions A vector of positions to split up for each transition function * transitionFunctions The concatenated truth table result columns of the transition functions of all genes. * transitionFunctionPositions A vector of positions to split up for each transition function. * fixedGenes A vector that contains -1 for all genes that can be both ON and OFF, 1 for genes that are always ON, * and 0 for genes that are always OFF. * specialInitializations A matrix of special initializations supplied by the user. The first row contains the genes, * the second row contains the corresponding initialization values. * startStates An optional array of encoded states used to initialize the heuristics * (not needed for exhaustive search) * networkType An integer that determines whether a synchronous or asynchronous search is performed * geneProbabilities For asynchronous search, the probabilities of each gene to be chosen for update * randomSteps For asynchronous search, the number of random transitions performed to reach a potential attractor * avoidSelfLoops If set to true, self loops are only allowed if no other transitions are possible, which reduces the * number of edges in the attractors * returnTable If set to true and networkType is synchronous, the transition table is included in the return value. */ SEXP getAttractors_R(SEXP inputGenes, SEXP inputGenePositions, SEXP transitionFunctions, SEXP transitionFunctionPositions, SEXP fixedGenes, SEXP startStates, SEXP networkType, SEXP geneProbabilities, SEXP randomSteps, SEXP avoidSelfLoops, SEXP returnTable) { GetRNGstate(); // decode information in SEXP for use in C BooleanNetwork network; network.numGenes = length(fixedGenes); network.inputGenes = INTEGER(inputGenes); network.inputGenePositions = INTEGER(inputGenePositions); network.transitionFunctions = INTEGER(transitionFunctions); network.transitionFunctionPositions = INTEGER(transitionFunctionPositions); network.fixedGenes = INTEGER(fixedGenes); network.nonFixedGeneBits = CALLOC(network.numGenes,sizeof(unsigned int)); int _networkType = *INTEGER(networkType); int _randomSteps = *INTEGER(randomSteps); bool _returnTable = (bool)(*INTEGER(returnTable)); bool _avoidSelfLoops = (bool)(*INTEGER(avoidSelfLoops)); double * _probabilities = NULL; if (!isNull(geneProbabilities) && length(geneProbabilities) > 0) _probabilities = REAL(geneProbabilities); // count fixed genes, and create an index array for non-fixed genes: // contains the bit positions in a state // at which the -th gene is stored - this is different from // as fixed genes are not stored unsigned int numNonFixed = 0, i; for(i = 0; i < network.numGenes; i++) { if(network.fixedGenes[i] == -1) { network.nonFixedGeneBits[i] = numNonFixed++; } } pAttractorInfo res; if (isNull(startStates) || length(startStates) == 0) // no start states supplied => perform exhaustive search { // calculate transition table unsigned long long * table = getTransitionTable(&network); if (table == 0) { PutRNGstate(); return R_NilValue; } unsigned long long numStates = pow(2,numNonFixed); // find attractors res = getAttractors(table, numStates, network.numGenes); } else // start states supplied => only identify attractors for these states { unsigned int numElts; if (network.numGenes % BITS_PER_BLOCK_32 == 0) numElts = network.numGenes / BITS_PER_BLOCK_32; else numElts = network.numGenes / BITS_PER_BLOCK_32 + 1; unsigned int* _startStates = (unsigned int*) INTEGER(startStates); if (_networkType == SYNC_MODE) { for (unsigned int i = 0; i < length(startStates) / numElts; ++i) { removeFixedGenes(&_startStates[i*numElts],network.fixedGenes,network.numGenes); } res = getAttractorsForStates(_startStates, length(startStates) / numElts, &network); } else { res = getLooseAttractors(_startStates, length(startStates) / numElts, &network,_randomSteps, _avoidSelfLoops,_probabilities); } } // pack results in SEXP structure for return value SEXP resSXP; SEXP stateInfoSXP; int* array; // create a result list with two elements (attractors and transition table) PROTECT(resSXP = allocList(2)); SET_TAG(resSXP, install("stateInfo")); SET_TAG(CDR(resSXP), install("attractors")); if (res->tableSize != 0 && _returnTable) { // create a 3-element list for the transition table PROTECT(stateInfoSXP = allocList(4)); SET_TAG(stateInfoSXP, install("table")); SET_TAG(CDR(stateInfoSXP), install("attractorAssignment")); SET_TAG(CDR(CDR(stateInfoSXP)), install("stepsToAttractor")); SET_TAG(CDR(CDR(CDR(stateInfoSXP))), install("initialStates")); // write transition table result column SEXP tableSXP; PROTECT(tableSXP = allocVector(INTSXP,res->tableSize * res->numElementsPerEntry)); array = INTEGER(tableSXP); for (i = 0; i < res->tableSize; ++i) { // the transition table results do not contain fixed genes => insert them insertFixedGenes(&res->table[i*res->numElementsPerEntry],network.fixedGenes,network.numGenes); memcpy(&array[i*res->numElementsPerEntry],&res->table[i*res->numElementsPerEntry], res->numElementsPerEntry * sizeof(unsigned int)); } SETCAR(stateInfoSXP,tableSXP); UNPROTECT(1); // write attractor assignment vector for states in transition table SEXP assignmentSXP; PROTECT(assignmentSXP = allocVector(INTSXP,res->tableSize)); array = INTEGER(assignmentSXP); memcpy(array,res->attractorAssignment,res->tableSize * sizeof(int)); SETCADR(stateInfoSXP,assignmentSXP); UNPROTECT(1); // write a vector with number of transitions from a state to an attractor SEXP stepSXP; PROTECT(stepSXP = allocVector(INTSXP,res->tableSize)); array = INTEGER(stepSXP); memcpy(array,res->stepsToAttractor,res->tableSize * sizeof(int)); SETCADDR(stateInfoSXP,stepSXP); UNPROTECT(1); // if available, write the original states SEXP initialStateSXP; if (res->initialStates == 0) initialStateSXP = R_NilValue; else // if start states are specified, the initial states for each transition have to be saved as well, // as they cannot be inferred by enumeration { PROTECT(initialStateSXP = allocVector(INTSXP,res->tableSize * res->numElementsPerEntry)); array = INTEGER(initialStateSXP); for (i = 0; i < res->tableSize; ++i) { // the transition table results do not contain fixed genes => insert them insertFixedGenes(&res->initialStates[i*res->numElementsPerEntry],network.fixedGenes,network.numGenes); memcpy(&array[i*res->numElementsPerEntry], &res->initialStates[i*res->numElementsPerEntry],res->numElementsPerEntry * sizeof(unsigned int)); } SETCADDDR(stateInfoSXP,initialStateSXP); UNPROTECT(1); } } else { stateInfoSXP = R_NilValue; } // assign to result list SETCAR(resSXP,stateInfoSXP); if (res->tableSize != 0 && _returnTable) UNPROTECT(1); // count attractors unsigned int numAttractors = 0; pAttractor el; for(el = res->attractorList; el->next != NULL; el = el->next) ++numAttractors; // write attractors SEXP attractorsSXP; PROTECT(attractorsSXP = allocList(numAttractors)); SEXP listPos = attractorsSXP; for(el = res->attractorList, i=0; el->next != NULL; el = el->next, ++i) { SEXP attractorSXP; // each attractor is a 2-element list with a list of states included // in the attractor and the size of the basin if (el->transitionTableSize == 0) PROTECT(attractorSXP = allocList(2)); else PROTECT(attractorSXP = allocList(4)); SET_TAG(attractorSXP, install("involvedStates")); SET_TAG(CDR(attractorSXP), install("basinSize")); if (el->transitionTableSize != 0) { SET_TAG(CDR(CDR(attractorSXP)), install("initialStates")); SET_TAG(CDR(CDR(CDR(attractorSXP))), install("nextStates")); } SEXP stateSXP; PROTECT(stateSXP = allocVector(INTSXP,el->length * el->numElementsPerEntry)); array = INTEGER(stateSXP); for (i = 0; i < el->length; ++i) { if (_networkType == SYNC_MODE) // insert fixed gene values, as they are missing in the calculated results insertFixedGenes(&el->involvedStates[i*el->numElementsPerEntry],network.fixedGenes,network.numGenes); memcpy(&array[i*el->numElementsPerEntry], &el->involvedStates[i*el->numElementsPerEntry],el->numElementsPerEntry*sizeof(unsigned int)); } SETCAR(attractorSXP,stateSXP); // write basin size SEXP basinSXP; PROTECT(basinSXP = allocVector(INTSXP,1)); array = INTEGER(basinSXP); array[0] = el->basinSize; SETCADR(attractorSXP,basinSXP); SETCAR(listPos,attractorSXP); if (el->next != NULL) listPos = CDR(listPos); if (el->transitionTableSize != 0) { SEXP attrInitialStateSXP; SEXP attrNextStateSXP; PROTECT(attrInitialStateSXP = allocVector(INTSXP,el->numElementsPerEntry * el->transitionTableSize)); PROTECT(attrNextStateSXP = allocVector(INTSXP,el->numElementsPerEntry * el->transitionTableSize)); unsigned int * initial = (unsigned int*)INTEGER(attrInitialStateSXP); unsigned int * next = (unsigned int*)INTEGER(attrNextStateSXP); TransitionTableEntry * currentState = el->table; for (i = 0; i < el->transitionTableSize; ++i) { memcpy(&initial[i * el->numElementsPerEntry],currentState->initialState, sizeof(unsigned int) * el->numElementsPerEntry); memcpy(&next[i * el->numElementsPerEntry],currentState->nextState, sizeof(unsigned int) * el->numElementsPerEntry); currentState = currentState->next; } SETCADDR(attractorSXP,attrInitialStateSXP); SETCADDDR(attractorSXP,attrNextStateSXP); UNPROTECT(2); } UNPROTECT(3); } UNPROTECT(1); SETCADR(resSXP,attractorsSXP); PutRNGstate(); UNPROTECT(1); // free resources freeAttractorInfo(res); FREE(network.nonFixedGeneBits); return(resSXP); } BoolNet/R/0000755000176200001440000000000012122071104012003 5ustar liggesusersBoolNet/R/zeta.R0000654000176200001440000000141312122071020013066 0ustar liggesusers # Distribution function of the Zeta distribution dzeta <- function(k,gamma=2.5,approx_cutoff=100) { zeta_approx <- sum(sapply(1:approx_cutoff,function(x)1/(x^gamma))) sapply(k,function(k_i) { 1/(k_i^gamma * zeta_approx) }) } # Quantile function of the Zeta distribution qzeta <- function(p,maxK,gamma=2.5,approx_cutoff=100) { vals <- cumsum(dzeta(1:maxK,gamma,approx_cutoff)) sapply(p,function(p_i) { indices <- which(vals > p_i) if (length(indices) == 0) return(NA) else return(indices[1]) }) } # Draw random numbers from the Zeta distribution rzeta <- function(n,maxK,gamma=2.5,approx_cutoff=100) { maxP <- cumsum(dzeta(1:maxK,gamma,approx_cutoff)) p <- runif(min=0,max=maxP,n=n) return(qzeta(p,maxK,gamma,approx_cutoff)) } BoolNet/R/toSBML.R0000644000176200001440000001630212122071020013225 0ustar liggesusers# Indent using tabs. indent <- function(string,count) { if (count == 0) return(string) return(paste(paste(rep("\t",count),collapse=""), string, sep="")) } # Export a Boolean network to an sbml-qual file . # If , a new symbolic representation for the interactions # is generated on the basis of the truth tables (in disjunctive normal form). # Otherwise, the $expression elements of the interactions are parsed. # If is true, constant transition functions are exported for fixed genes # instead of their true transition functions toSBML <- function(network, file, generateDNFs=FALSE, saveFixed = TRUE) { stopifnot(inherits(network,"BooleanNetwork")) parseTrees <- NULL if (generateDNFs == FALSE) # Check whether all interactions have suitable string representations { tryCatch( { # parse the string representations parseTrees <- lapply(network$interactions, function(int)parseBooleanFunction(int$expression)) }, error=function(e) { warning(paste("The transition functions of this network did not contain valid symbolic expressions!", "Generating DNF representations from the truth tables!")) # There was an error parsing a string representation => generate DNFs generateDNFs <<- TRUE }) } if (generateDNFs != FALSE) # build new representations of the functions in disjunctive normal form { network$interactions <- lapply(network$interactions, function(interaction) { table <- allcombn(2, length(interaction$input)) - 1 interaction$expression <- getDNF(interaction$func, network$genes[interaction$input], generateDNFs) return(interaction) }) # parse the DNF representations parseTrees <- lapply(network$interactions, function(int)parseBooleanFunction(int$expression)) } names(parseTrees) <- network$genes # generate a network identifier from the file name id <- sub(".sbml", "", basename(file), fixed=TRUE) id <- gsub("[^a-zA-Z0-9_]+","_",id) # open the file f <- file(file, encoding="UTF-8", open="w") # write document header cat(file=f, "\n") cat(file=f, "\n") cat(file=f, "\t\n", sep="") # write default compartment cat(file=f, "\t\t\n") cat(file=f, "\t\t\t\n") cat(file=f, "\t\t\n") # write genes cat(file=f, "\t\t\n") for (gene in network$genes) { if ((saveFixed && network$fixed[gene] != -1) || network$interactions[[gene]]$input[1] == 0) { if (saveFixed && network$fixed[gene] != -1) level <- network$fixed[gene] else level <- network$interactions[[gene]]$func[1] cat(file=f, "\t\t\t\n", sep="") } else cat(file=f, "\t\t\t\n", sep="") } cat(file=f, "\t\t\n") # write transition functions cat(file=f, "\t\t\n") for (gene in network$genes) { if ((!saveFixed || network$fixed[[gene]] == -1) && network$interactions[[gene]]$input[1] != 0) { cat(file=f, "\t\t\t\n", sep="") cat(file=f, "\t\t\t\t\n") for (i in network$interactions[[gene]]$input) cat(file=f, "\t\t\t\t\t\n", sep="") cat(file=f, "\t\t\t\t\n") cat(file=f, "\t\t\t\t\n") cat(file=f, "\t\t\t\t\t\n", sep="") cat(file=f, "\t\t\t\t\n") cat(file=f, "\t\t\t\t\n") cat(file=f, "\t\t\t\t\t\n") cat(file=f, "\t\t\t\t\t\t\n") parseTree <- parseTrees[[gene]] cat(file=f, MathMLFromParseTree(parseTree, indentLevel=7)) cat(file=f, "\t\t\t\t\t\t\n") cat(file=f, "\t\t\t\t\t\n") cat(file=f, "\t\t\t\t\t\n") cat(file=f, "\t\t\t\t\n") cat(file=f, "\t\t\t\n") } } # finish document cat(file=f, "\t\t\n") cat(file=f, "\t\n") cat(file=f, "\n") close(f) } # Build a MathML representation of a parse tree # that represents a symbolic Boolean expression. # Indentation of the XML nodes starts with . # Returns a string with MathML code. MathMLFromParseTree <- function(tree,indentLevel=0) { res <- switch(tree$type, operator = { if (tree$negated) paste(indent("\n", indentLevel), indent("\n", indentLevel+1), indent("\n" ,indentLevel+1), indent({if (tree$operator=="|"){"\n"} else{"\n"}}, indentLevel+2), paste(sapply(tree$operands,MathMLFromParseTree, indentLevel+2), collapse=""), indent("\n", indentLevel+1), indent("\n", indentLevel), sep="") else paste(indent("\n", indentLevel), indent({if (tree$operator=="|"){"\n"} else{"\n"}}, indentLevel+1), paste(sapply(tree$operands, MathMLFromParseTree, indentLevel+1), collapse=""), indent("\n", indentLevel), sep="") }, atom = { if ((tree$name == "0" && !tree$negated) || (tree$name == "1" && tree$negated)) indent("0\n", indentLevel) else if ((tree$name == "1" && !tree$negated) || (tree$name == "0" && tree$negated)) indent("1\n", indentLevel) else paste(indent("\n",indentLevel), indent("\n", indentLevel+1), indent(paste("",tree$name,"\n",sep=""),indentLevel+1), indent(paste("", {if (tree$negated) 0 else 1}, "\n", sep=""), indentLevel+1), indent("\n",indentLevel), sep="") }) return(res) } BoolNet/R/toPajek.R0000654000176200001440000000147612122071020013531 0ustar liggesusers# Export a state table in to a Pajek graph toPajek <- function (attractorInfo, file="boolean.net", includeLabels=FALSE) { stopifnot(inherits(attractorInfo,"AttractorInfo")) if (is.null(attractorInfo$stateInfo$table)) stop(paste("This AttractorInfo structure does not contain transition table information.", "Please re-run getAttractors() with a synchronous search and returnTable=TRUE!")) graphStruct <- getStateGraphStructure(attractorInfo) sink(file) cat("*Vertices ", length(graphStruct$vertices), "\r\n", sep = "") if (includeLabels) { lapply(1:length(graphStruct$vertices),function(i) cat(i," \"",graphStruct$vertices[i],"\"\r\n",sep="")) } cat("*Arcs\r\n") apply(graphStruct$edges,1,function(edge) cat(edge[1]," ",edge[2]," 1\r\n",sep="")) sink() } BoolNet/R/testNetworkProperties.R0000654000176200001440000002533312122071020016540 0ustar liggesusers# Calculate the Gini index of Gini <- function(x) { n <- length(x) x <- sort(x) 1/(n-1)*(n+1-2*(sum((n+1-(1:n))*x)/sum(x))) } # Test attractor robustness by searching the original attractor # in perturbed copies of . testAttractorRobustness <- function(network,accumulate=TRUE,params=list()) { origAttrs <- getAttractors(network,canonical=TRUE) # decode parameters if (is.null(params$perturb)) perturb <- "functions" else perturb <- params$perturb if (is.null(params$method)) method <- "bitflip" else method <- params$method if (is.null(params$maxNumBits)) maxNumBits <- 1 else maxNumBits <- params$maxNumBits if (is.null(params$numStates)) numStates <- max(1,2^length(network$genes)/100) else numStates <- params$numStates if (is.null(params$simplify)) simplify <- (perturb[1] == "states") else simplify <- params$simplify if (is.null(params$readableFunctions)) readableFunctions <- FALSE else readableFunctions <- params$readableFunctions if (is.null(params$excludeFixed)) excludeFixed <- TRUE else excludeFixed <- params$excludeFixed if (is.null(params$copies)) copies <- 100 else copies <- params$copies perturbationResults <- unlist(sapply(1:copies,function(copy) { # get attractors of perturbed network perturbedAttrs <- getAttractors(perturbNetwork(network, perturb=perturb, method=method, maxNumBits=maxNumBits, numStates=numStates, simplify=simplify, readableFunctions=readableFunctions, excludeFixed=excludeFixed)) # try to find original attractors in perturbed network attractorIndices <- sapply(origAttrs$attractors,function(attractor1) { index <- which(sapply(perturbedAttrs$attractors,function(attractor2) { identical(attractor1,attractor2) })) if (length(index) == 0) NA else index }) return(sum(!is.na(attractorIndices))) })) if (accumulate) # return overall percentage of found attractors return(sum(perturbationResults)/(length(origAttrs$attractors) * copies) * 100) else # return percentage of found attractors for each run return(perturbationResults/(length(origAttrs$attractors)) * 100) } # Calculate the in-degrees of states in the network. # If is true, the in-degrees are accumulated # using the Gini coefficient testIndegree <- function(network,accumulate=TRUE,params) { require(igraph) attr <- getAttractors(network) graph <- plotStateGraph(attr,plotIt=FALSE) # calculate in-degree using igraph if (accumulate) # accumulate using Gini index return(Gini(degree(graph,mode="in",loops=TRUE))) else # return the raw degrees return(degree(graph,mode="in",loops=TRUE)) } # Calculate the Kullback-Leibler distance of # two distributions and . # is the number of bins used for discretization. # is the minimum value to be used instead of zero kullbackLeiblerDistance <- function(x,y,bins=list(),minVal=0.00001) { x <- cut(x,breaks=bins,include.lowest=T,right=F) y <- cut(y,breaks=bins,include.lowest=T,right=F) tx <- table(x) ty <- table(y) tx <- tx/length(x) ty <- ty/length(y) tx[tx < minVal] <- minVal ty[ty < minVal] <- minVal return(sum(tx*(log(tx/ty)))) } # Generic function to test properties of against random networks. # specifies the number of random networks to generate. # is the name of a function that returns a distribution of test values or a test statistic for each network, # which receives as optional parameters. # If is "characteristic", the test function must return a characteristic/test statistic value for each value, and # a histogram of these value is plotted with a line for the original network. # If is "kullback_leibler", a histogram of the Kullback-Leibler distances of the test value distribution for the original network # and the random networks is plotted. # is the desired significance level for in comparison to the random networks. # ,,,, are the corresponding parameters of generateRandomNKNetwork(). # is the title of the plot, <xlab> is its x axis caption, <breaks> is the corresponding histogram parameter, and ... supplies further # graphical parameters testNetworkProperties <- function(network, numRandomNets=100, testFunction="testIndegree", testFunctionParams=list(),accumulation=c("characteristic","kullback_leibler"), sign.level=0.05,drawSignificanceLevel=TRUE, klBins,klMinVal=0.00001, linkage=c("uniform","lattice"), functionGeneration=c("uniform","biased"), simplify=FALSE, noIrrelevantGenes=TRUE, d_lattice=1, zeroBias=0.5, title="", xlab, xlim, breaks=30, ...) { stopifnot(inherits(network,"BooleanNetwork")) if (is.character(testFunction)) testFunctionName <- testFunction else testFunctionName <- "" testFunction <- match.fun(testFunction) accumulate <- (match.arg(accumulation) == "characteristic") origResult <- testFunction(network,accumulate,testFunctionParams) numGenes <- length(network$interactions) inputGenes <- sapply(network$interactions,function(interaction)length(interaction$input)) randomResults <- lapply(1:numRandomNets,function(i) { randomNet <- generateRandomNKNetwork(n=numGenes,k=inputGenes,topology="fixed", linkage=linkage, functionGeneration=functionGeneration, simplify=simplify, noIrrelevantGenes=noIrrelevantGenes, d_lattice=d_lattice, zeroBias=zeroBias) randomRes <- testFunction(randomNet,accumulate,testFunctionParams) return(randomRes) }) if (accumulate) randomResults <- unlist(randomResults) args <- list(...) res <- switch(match.arg(accumulation,c("characteristic","kullback_leibler")), characteristic = { # get one value for each random network, and plot a histogram of these values if (missing(xlab)) { xlab <- switch(testFunctionName, testIndegree = "Gini index of state in-degrees", testAttractorRobustness = "% of original attractors found in perturbed networks", "accumulated results" ) } if (missing(xlim)) { xlim <- switch(testFunctionName, testIndegree = c(0,1), testAttractorRobustness = c(0,100), c(min(c(origResult,randomResults)), max(c(origResult,randomResults))) ) } # calculate p-value pval <- sum(randomResults < origResult) / length(randomResults) # plot histogram if (testFunctionName == "testIndegree" | testFunctionName == "testAttractorRobustness") { r <- hist(randomResults,xlim=xlim,xlab=xlab,main=title,xaxt="n",...) axis(side=1,at=seq(xlim[1],xlim[2],length.out=11)) } else { # plot with default axis r <- hist(randomResults,xlim=xlim,xlab=xlab,main=title,...) } # plot result for original network abline(v=origResult,col="red") text(x=origResult,pos=2,y=max(r$counts)*0.75, labels=paste("> ",round(pval * 100),"%\nof random results",sep=""), col="red",cex=0.75) if (drawSignificanceLevel) # plot line for significance level { quant <- quantile(randomResults,1.0-sign.level) abline(v=quant,col="blue") text(x=quant,pos=2,y=max(r$counts)*0.85, labels=paste((1.0-sign.level) * 100,"% quantile",sep=""), col="blue",cex=0.75) } list(hist=r,pval=1.0-pval,significant=(1.0-pval<=sign.level)) }, kullback_leibler = { # a distribution of values is returned for each network, # plot the Kullback-Leibler distances to the original network if (missing(xlab)) xlab <- "Kullback-Leibler distance" if (missing(klBins)) { bins <- unique(c(origResult,unlist(randomResults))) bins <- c(bins,max(bins) + 1) } else { bins <- unique(c(origResult,unlist(randomResults))) if (klBins < length(bins)) bins <- seq(min(bins),max(bins),length.out=klBins+1) else bins <- c(bins,max(bins) + 1) } vals <- sapply(randomResults,function(results) kullbackLeiblerDistance(origResult,results,bins=bins,minVal=klMinVal)) r <- hist(vals,xlab=xlab,main=title,breaks=breaks,...) list(hist=r) }, stop("'accumulation' must be one of \"characteristic\",\"kullback_leibler\"")) return(res) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/stateTransition.R�������������������������������������������������������������������������0000654�0001762�0000144�00000011175�12122071020�015324� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������stateTransition <- function(network,state,type=c("synchronous","asynchronous","probabilistic"), geneProbabilities, chosenGene, chosenFunctions) { stopifnot(inherits(network,"BooleanNetwork") | inherits(network,"ProbabilisticBooleanNetwork") | inherits(network,"BooleanNetworkCollection")) if (length(state) != length(network$genes)) stop("The state must consist of exactly one value for each gene!") nonFixedIndices = (network$fixed == -1) res <- state if (inherits(network,"BooleanNetwork") & match.arg(type) == "probabilistic") type <- "synchronous" if (!inherits(network,"BooleanNetwork") & length(type) == 3) type <- "probabilistic" if (match.arg(type) == "probabilistic") { if (missing(chosenFunctions) || is.null(chosenFunctions)) { chosenFunctions <- sapply(network$interactions,function(gene) { distr <- c(0,cumsum(sapply(gene,function(func)func$probability))) r <- runif(n=1) idx <- 0 for (i in 1:length(gene)) { if (r > distr[i] & r <= distr[i+1]) { idx <- i break } } idx }) } else if (length(chosenFunctions) != length(network$genes)) stop("Please provide a function index for each gene!") res[nonFixedIndices] <- mapply(function(i,f) { if(network$interactions[[i]][[f]]$input[1] == 0) # this is a constant gene with no transition function return(network$interactions[[i]][[f]]$func[1]) input = state[network$interactions[[i]][[f]]$input] return(network$interactions[[i]][[f]]$func[bin2dec(rev(input),length(input)) + 1]) }, which(nonFixedIndices), chosenFunctions[nonFixedIndices]) } else { if (!inherits(network,"BooleanNetwork")) stop("Please choose type=\"probabilistic\" for a probabilistic Boolean network!") changeIndices <- switch(match.arg(type,c("synchronous","asynchronous","probabilistic")), synchronous = which(nonFixedIndices), asynchronous = { if (missing(chosenGene) || is.null(chosenGene)) { if (missing(geneProbabilities) || is.null(geneProbabilities)) sample(which(nonFixedIndices),1) else { if (length(geneProbabilities) != length(network$genes)) stop("Please supply exactly one probability for each gene!") if (abs(1.0 - sum(geneProbabilities)) > 0.0001) stop("The supplied gene probabilities do not sum up to 1!") if (sum(geneProbabilities[nonFixedIndices]) < 0.0001) stop("There is no non-fixed gene with a probability greater than 0!") geneProbabilities[nonFixedIndices] <- geneProbabilities[nonFixedIndices]/sum(geneProbabilities[nonFixedIndices]) if (sum(nonFixedIndices) != length(network$genes)) geneProbabilities[!nonFixedIndices] <- 0 distr <- c(0,cumsum(geneProbabilities)) r <- runif(n=1) idx <- 0 for (i in 1:length(network$genes)) { if (r > distr[i] & r <= distr[i+1]) { idx <- i break } } idx } } else { if (is.character(chosenGene)) { chosenGeneIdx <- which(network$genes == chosenGene) if (length(chosenGeneIdx) == 0) stop(paste("Gene \"",chosenGene,"\" does not exist in the network!",sep="")) chosenGeneIdx } else chosenGene } }) res[changeIndices] <- sapply(changeIndices,function(i) { if(network$interactions[[i]]$input[1] == 0) # this is a constant gene with no transition function return(network$interactions[[i]]$func[1]) input = state[network$interactions[[i]]$input] return(network$interactions[[i]]$func[bin2dec(rev(input),length(input)) + 1]) }) } res[!nonFixedIndices] = network$fixed[!nonFixedIndices] names(res) <- network$genes return(res) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/simplifyNetwork.R�������������������������������������������������������������������������0000654�0001762�0000144�00000007046�12122071020�015341� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Simplify a Boolean network by dropping all input genes that are not relevant # for the output simplifyNetwork <- function(network,readableFunctions=FALSE) { stopifnot(inherits(network,"BooleanNetwork") | inherits(network,"ProbabilisticBooleanNetwork") | inherits(network,"BooleanNetworkCollection")) if (inherits(network,"BooleanNetwork")) { network$interactions <- mapply(function(interaction, j) { if (interaction$input[1] != 0) # no constant gene { table <- allcombn(2,length(interaction$input)) - 1 dropGenes <- apply(table,2,function(gene) # drop all genes that have no influence on the results, # i.e. the result column is equal for 0 values and 1 values { (identical(interaction$func[gene==1], interaction$func[gene==0])) }) if (sum(!dropGenes) == 0) { network$fixed[j] <<- interaction$func[1] interaction$input <- 0 interaction$func <- interaction$func[1] } else if (sum(dropGenes) > 0) { # update network network$fixed[j] <<- -1 dropFunctionIndices <- unlist(sapply(1:length(dropGenes),function(i) { if(dropGenes[i]) which(table[,i] == 0) else NULL })) interaction$input <- interaction$input[!dropGenes] interaction$func <- interaction$func[-dropFunctionIndices] interaction$expression <- getInteractionString(readableFunctions, interaction$func, network$genes[interaction$input]) } } interaction }, network$interactions, seq_along(network$interactions), SIMPLIFY=FALSE) } else { network$interactions <- lapply(network$interactions,function(gene) lapply(gene,function(interaction) { if (interaction$input[1] != 0) # no constant gene { table <- allcombn(2,length(interaction$input)) - 1 dropGenes <- apply(table,2,function(gene) # drop all genes that have no influence on the results, # i.e. the result column is equal for 0 values and 1 values { (identical(interaction$func[gene==1], interaction$func[gene==0])) }) if (sum(!dropGenes) == 0) { interaction$input <- 0 interaction$func <- interaction$func[1] } else if (sum(dropGenes) > 0) { # update network dropFunctionIndices <- unlist(sapply(1:length(dropGenes),function(i) { if(dropGenes[i]) which(table[,i] == 0) else NULL })) interaction$input <- interaction$input[!dropGenes] interaction$func <- interaction$func[-dropFunctionIndices] interaction$expression <- getInteractionString(readableFunctions, interaction$func, network$genes[interaction$input]) } } interaction })) } return(network) } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/sequenceToLaTeX.R�������������������������������������������������������������������������0000654�0001762�0000144�00000006011�12122071020�015133� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ sequenceToLaTeX <- function(network, startState, includeAttractorStates = c("all","first","none"), sequence, title="", grouping = list(), plotFixed = TRUE, onColor="[gray]{0.9}",offColor="[gray]{0.6}", file="sequence.tex") { if (!missing(network)) { stopifnot(inherits(network,"BooleanNetwork")) if (missing(startState) || !missing(sequence)) stop("Either \"network\" and \"startState\" or \"sequence\" must be provided!") sequence <- getPathToAttractor(network = network, state = startState, includeAttractorStates = includeAttractorStates) numGenes <- length(network$genes) whichFixed <- which(network$fixed != -1) if (plotFixed | (length(whichFixed) == 0)) plotIndices <- 1:numGenes else plotIndices <- (1:numGenes)[-whichFixed] sequence <- sequence[,plotIndices] } else { if (missing(sequence) || !missing(startState)) stop("Either \"network\" and \"startState\" or \"sequence\" must be provided!") } # escape "_" in LaTeX genes = gsub("_", "\\_", colnames(sequence)) # determine list of genes to be plotted # Open output file, and print header sink(file) cat("% Please include packages tabularx and colortbl in your master document:\n", "% \\usepackage{tabularx,colortbl}\n\n\n",sep="") totalMatrix <- t(sequence) colnames(totalMatrix) <- 1:ncol(totalMatrix) if(length(grouping)>0) { # reorder genes according to the supplied groups totalMatrix <- totalMatrix[unlist(grouping$index),] separationPositions <- c(1,cumsum(sapply(grouping$index,length)+1)) } else separationPositions <- c() # output table header cat("\\begin{table}[ht]\n", "\\begin{center}\n", "\\caption{",title,"}\n", "\\begin{tabularx}{\\linewidth}{l", paste(rep(paste(rep(">{\\centering\\arraybackslash}X", ncol(totalMatrix), collapse = " "))),collapse=""), "}\\hline\n", sep="") cat("\\textbf{Time}\t&\t",paste(1:ncol(totalMatrix),collapse="\t&\t"),"\\\\") if(length(grouping) == 0) cat("\\hline\n") else cat("\n") # output active and inactive states for(j in 1:nrow(totalMatrix)) { separator <- which(separationPositions==j) if (length(separator) != 0) { cat("\\hline \\multicolumn{",ncol(totalMatrix) + 1,"}{c}{",grouping$class[separator],"}\\\\ \\hline \n",sep="") } cat("\\textbf{",rownames(totalMatrix)[j],"}\t&\t",sep="") for(i in 1:ncol(totalMatrix)) { if(totalMatrix[j,i] == 1) cat("\\cellcolor",onColor,"1",sep="") else cat("\\cellcolor",offColor,"0",sep="") if (i < ncol(totalMatrix)) cat("\t&\t") } cat("\\\\\n") } cat("\\hline\\end{tabularx}\n\\end{center}\n", "\\end{table}\n\n",sep="") # return a list of accumulated matrices sink() return(totalMatrix) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/scanStatistic.R���������������������������������������������������������������������������0000654�0001762�0000144�00000007222�12122071020�014743� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# determination of P(k,N,w) pval <- function(k,N,w) { return((k/w-N-1)*b(k,N,w)+2*Gb(k,N,w)) } # helper function b<-function(k,N,w) { return(choose(N,k)*w^k*(1-w)^(N-k)) } # helper function Gb<-function(k,N,w) { sum<-0 for(i in k:N) { sum <- sum + b(i,N,w) } return(sum) } # If two significant overlapping windows were found, these windows are # merged. If the windows do not overlap, two different windows are stored # in a list listadapt <- function(lcur,lnew) { if(length(lcur)==0) { lcur=lnew return(lcur) } else { if(lnew[[1]][1]<=lcur[[length(lcur)]][2]) { lcur[[length(lcur)]][2]<-lnew[[1]][2] if(lcur[[length(lcur)]][3]>lnew[[1]][3]) { lcur[[length(lcur)]][3] <- lnew[[1]][3] } return(lcur) } else { lcur<-append(lcur,lnew) return(lcur) } } } # This method searches for data accumulations by shifting a window with # window size <w> across the data and deciding at each position if there # is a data accumulation. To test this, a scan statistic with significance # level <sign.level> is used. scanStatistic <- function(vect, w=0.25, sign.level=0.1) { temp<-vect vect <-unlist(vect) vsort <- sort(vect) N <- length(vect) range <- (max(vect)) - (min(vect)) windowsize <- range*w N <- length(vect) binarizeddata<-temp res<-list() lcur<-list() # shift a fixed window over the data # the window is moved from point to point for(i in 1:length(vect)) { start <- vsort[i] stop <- vsort[i] + windowsize k <- length(vect[(vect >= start) & (vect <= stop)]) p <- pval(k,N,w) if(p>1) { p=0.99 } if(p<=sign.level & p>0 & k >= (N*w-1) & k > 2) { res <- listadapt(res,list(c(start,stop,p))) } } # if no accumulation for a fixed <sign.level> was found, the # binarization is rejected, and we search for a accumulation # with a higher sign.level. if(length(res)==0) { while(TRUE) { sign.level=sign.level+0.05 if(sign.level>2) { binarizeddata<-(sapply(vect,function(x) 0)) return(list(bindata=binarizeddata,thresholds=NA,reject=TRUE)) } for(i in 1:length(vect)) { start <- vsort[i] stop <- vsort[i] + windowsize k <- length(vect[(vect >= start) & (vect <= stop)]) p <- pval(k,N,w) if(p>1) { p=0.99 } if(p<=sign.level & p>0 & k >= (N*w-1) & k > 2) { #res <- append(res,list(c(start=start,stop=stop,pval=p))) res <- listadapt(res,list(c(start,stop,p))) } } if(length(res)!=0) break } reject<-TRUE } else { reject<-FALSE } # search the window with the smallest sign.level. # this window is used for the binarization min=1000 ind=0 for(i in 1:length(res)) { if(res[[i]][3]<min) { ind=i min=res[[i]][3] } } # are more points on the left or on the right side # of the window? Based on this, the binarization is performed bigger <- length(vect[vect > res[[ind]][2]]) smaller <- length(vect[vect < res[[ind]][1]]) if(bigger > smaller) { threshold<-res[[ind]][2] small<-tail(vsort[vsort<=threshold],n=1) big<-vsort[vsort>threshold][1] thres<-(big+small)/2 for(i in 1:length(vect)) { if(vect[i]<=threshold) { binarizeddata[i]<-0 } else { binarizeddata[i]<-1 } } } else { threshold<-res[[ind]][1] small<-tail(vsort[vsort<threshold],n=1) big<-vsort[vsort>=threshold][1] thres<-(big+small)/2 for(i in 1:length(vect)) { if(vect[i]>=threshold) { binarizeddata[i]<-1 } else { binarizeddata[i]<-0 } } } return(list(bindata=binarizeddata,thresholds=as.numeric(thres),reject=reject)) } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/saveNetwork.R�����������������������������������������������������������������������������0000644�0001762�0000144�00000010404�12122071020�014432� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Save <network> to <file> in the BoolNet file format. # If <generateDNFs> is true or a mode of getDNF(), # a new symbolic representation for the interactions # is generated on the basis of the truth tables (in disjunctive normal form). # If <generateDNFs> is false, the $expression elements of the interactions are exported. # If <saveFixed> is true, constant transition functions are exported for fixed genes # instead of their true transition functions saveNetwork <- function(network, file, generateDNFs = FALSE, saveFixed = TRUE) { stopifnot(inherits(network,"BooleanNetwork") | inherits(network,"ProbabilisticBooleanNetwork") | inherits(network,"BooleanNetworkCollection")) expressions <- NULL if (inherits(network,"BooleanNetwork")) { if (generateDNFs == FALSE) # Check whether all interactions have suitable string representations { tryCatch( { # parse the string representations lapply(network$interactions, function(int)parseBooleanFunction(int$expression)) }, error=function(e) { warning(paste("The transition functions of this network did not contain valid symbolic expressions!", "Generating DNF representations from the truth tables!")) # There was an error parsing a string representation => generate DNFs generateDNFs <<- TRUE }) } if (generateDNFs != FALSE) { expressions <- mapply(function(interaction, gene, fixed) { if (!saveFixed || fixed == -1) { table <- allcombn(2, length(interaction$input)) - 1 expression <- getDNF(interaction$func, network$genes[interaction$input], generateDNFs) return(paste(gene, ", ", expression, sep="")) } else return(paste(gene, ", ", fixed, sep="")) }, network$interactions, network$genes, network$fixed) } else { expressions <- mapply(function(interaction, gene, fixed) { if (!saveFixed || fixed == -1) return(paste(gene, ", ", interaction$expression, sep="")) else return(paste(gene, ", ", fixed, sep="")) }, network$interactions, network$genes, network$fixed) } sink(file) cat("targets, factors\n") } else { if (generateDNFs == FALSE) # Check whether all interactions have suitable string representations { tryCatch( { # parse the string representations lapply(network$interactions, function(int)lapply(int, function(func)parseBooleanFunction(func$expression))) }, error=function(e) { warning(paste("The transition functions of this network did not contain valid symbolic expressions!", "Generating DNF representations from the truth tables!")) # There was an error parsing a string representation => generate DNFs generateDNFs <<- TRUE }) } if (generateDNFs != FALSE) { expressions <- mapply(function(interaction, gene, fixed) { if (!saveFixed || fixed == -1) { lapply(interaction, function(func) { table <- allcombn(2, length(func$input)) - 1 expression <- getDNF(func$func, network$genes[func$input], generateDNFs) return(paste(gene, ", ", expression, ", ", func$probability, sep="")) }) } else return(paste(gene, ", ", fixed, ", 1", sep="")) }, network$interactions, network$genes, network$fixed) } else { expressions <- mapply(function(interaction, gene, fixed) { if (!saveFixed || fixed == -1) { lapply(interaction, function(func) { return(paste(gene, ", ", func$expression, ", ", func$probability, sep="")) }) } else return(paste(gene, ", ", fixed, ", 1", sep="")) }, network$interactions, network$genes, network$fixed) } expressions <- unlist(expressions) sink(file) cat("targets, factors, probabilities\n") } cat(paste(expressions, collapse="\n"),"\n",sep="") sink() } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/reconstructNetwork.R����������������������������������������������������������������������0000654�0001762�0000144�00000011045�12122071020�016052� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Reconstruct a Boolean network from a transition table or a list of time series in <measurements>. # If <method> is "bestfit", Lähdesmäki's best-fit extension algorithm is called. # If <method> is "reveal", Liang's REVEAL algorithm is called. # <maxK> specifies the maximum number of input genes of a function. # If <readableFunctions> is true, DNF representations of the functions are generated. reconstructNetwork <- function(measurements,method=c("bestfit","reveal"),maxK=5, readableFunctions=FALSE, allSolutions=FALSE) { if (maxK < 0) stop("maxK must be >= 0!") # determine method to use meth <- switch(match.arg(method,c("bestfit","reveal")), bestfit=0, reveal=1, stop("'method' must be one of \"bestfit\",\"reveal\"")) if (inherits(measurements,"TransitionTable")) # preprocess transition table and call algorithm { numGenes <- (ncol(measurements) - 2) / 2 if (numGenes < maxK) { maxK <- numGenes warning(paste("maxK was chosen greater than the total number of input genes and reset to ",numGenes,"!",sep="")) } on.exit(.C("freeAllMemory", PACKAGE = "BoolNet")) # call C code res <- .Call("reconstructNetwork_R", as.integer(t(as.matrix(measurements[,1:numGenes]))), as.integer(t(as.matrix(measurements[,(numGenes+1):(2*numGenes)]))), as.integer(nrow(measurements)), as.integer(maxK), as.integer(meth), as.integer(allSolutions)) genenames <- sapply(colnames(measurements)[1:numGenes],function(x)strsplit(x,".",fixed=TRUE)[[1]][2]) } else # the measurements are time series { if (!is.null(dim(measurements))) # only one time series => create list measurements <- list(measurements) numGenes <- nrow(measurements[[1]]) if (numGenes < maxK) { maxK <- numGenes warning(paste("maxK was chosen greater than the total number of input genes and reset to ",numGenes,"!",sep="")) } genenames <- rownames(measurements[[1]]) if (is.null(genenames)) genenames <- paste("Gene",1:numGenes) inputStates <- c() outputStates <- c() for (measurement in measurements) # iterate over all time series and build state vectors { if (numGenes != nrow(measurement)) stop("All measurement matrices must contain the same genes!") inputStates <- c(inputStates,as.integer(as.matrix(measurement[,1:(ncol(measurement)-1)]))) outputStates <- c(outputStates,as.integer(as.matrix(measurement[,2:ncol(measurement)]))) } on.exit(.C("freeAllMemory", PACKAGE = "BoolNet")) # call C code res <- .Call("reconstructNetwork_R", inputStates, outputStates, as.integer(length(inputStates) / numGenes), as.integer(maxK), as.integer(meth), as.integer(allSolutions)) } if (any(sapply(res,function(interaction)length(interaction)==0))) # some function lists are empty warning("Some functions could not be inferred. Possibly the input data is noisy or maxK was chosen too small!") # prepare result object res <- list(genes=genenames, interactions=lapply(res,function(gene) lapply(gene,function(interaction) { interaction$expression <- getInteractionString(readableFunctions, interaction$func, genenames[interaction$input]) interaction$probability <- 1.0/length(gene) interaction })), fixed=sapply(res,function(gene) { if (length(gene) == 0) -1 else if (gene[[1]]$input[1] == 0) gene[[1]]$func[1] else -1 })) names(res$interactions) <- res$genes names(res$fixed) <- res$genes class(res) <- c("ProbabilisticBooleanNetwork","BooleanNetworkCollection") if (allSolutions) # simplify functions and remove duplicates { res <- simplifyNetwork(res) res$interactions <- lapply(res$interactions,function(interaction) { duplicates <- duplicated(sapply(interaction,function(func)func$expression)) return(interaction[!duplicates]) }) } return(res) } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/print.TransitionTable.R�������������������������������������������������������������������0000654�0001762�0000144�00000004475�12122071020�016373� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Custom print function for class TransitionTable print.TransitionTable <- function(x, activeOnly=FALSE, ...) { numGenes <- (ncol(x) - 2) / 2 colIndices <- c(1,numGenes,numGenes + 1, 2*numGenes, 2*numGenes + 1, 2*numGenes + 2) genes <- sapply(colnames(x)[1:numGenes],function(n)strsplit(n,".",fixed=TRUE)[[1]][2]) if(activeOnly) { inputStates <- apply(x,1,function(row) { r <- paste(genes[which(row[colIndices[1]:colIndices[2]] == 1)],collapse=", ") if (r == "") r <- "--" r }) outputStates <- apply(x,1,function(row) { r <- paste(genes[which(row[colIndices[3]:colIndices[4]] == 1)],collapse=", ") if (r == "") r <- "--" r }) colWidth <- max(c(sapply(inputStates,nchar),sapply(outputStates,nchar))) align <- "left" } else { inputStates <- apply(x,1,function(row) paste(row[colIndices[1]:colIndices[2]],collapse="")) outputStates <- apply(x,1,function(row) paste(row[colIndices[3]:colIndices[4]],collapse="")) colWidth <- numGenes align <- "right" } binMatrix <- data.frame(inputStates,outputStates, x[,colIndices[5]],x[,colIndices[6]]) cat(format("State",width=max(7,colWidth),justify=align)," ", format("Next state",width=max(11,colWidth + 2),justify=align), format("Attr. basin",width=13,justify="right"), format("# trans. to attr.",width=19,justify="right"),"\n",sep="") apply(binMatrix,1,function(row) { # paste all states of input and output into one string, and put out all columns of the table in a # formatted way cat(format(row[1],width=max(7,colWidth),justify=align), " => ", format(row[2],width=max(11,colWidth + 2),justify=align), format(row[3],width=13,justify="right"), format(row[4],width=19,justify="right"),"\n",sep="") }) if (!activeOnly) cat("\nGenes are encoded in the following order: ",paste(genes,collapse=" "),"\n",sep="") return(invisible(x)) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/print.ProbabilisticBooleanNetwork.R�������������������������������������������������������0000654�0001762�0000144�00000002144�12122071020�020720� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������print.BooleanNetworkCollection <- function(x, ...) { print.ProbabilisticBooleanNetwork(x, ...) } # Custom print function for class ProbabilisticBooleanNetwork print.ProbabilisticBooleanNetwork <- function(x, ...) { cat("Probabilistic Boolean network with",length(x$genes),"genes\n\n") cat("Involved genes:\n",paste(x$genes,collapse=" "),"\n\n",sep="") cat("Transition functions:\n") mapply(function(gene,interaction) { cat("\nAlternative transition functions for gene ",gene,":\n",sep="") # print original expressions read from the files (if available) lapply(interaction,function(func) { cat(gene," = ",func$expression," (probability: ",func$probability,sep="") if (!is.null(func$error)) cat(", error: ",func$error,sep="") cat(")\n") }) }, x$genes,x$interactions) if (sum(x$fixed != -1) > 0) { cat("\nKnocked-out and over-expressed genes:\n") mapply(function(gene,fixed) { if (fixed != -1) cat(gene," = ",fixed,"\n",sep="") }, x$genes,x$fixed) } return(invisible(x)) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/print.MarkovSimulation.R������������������������������������������������������������������0000654�0001762�0000144�00000006023�12122071020�016564� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Custom print function for class MarkovSimulation print.MarkovSimulation <- function(x, activeOnly = FALSE, ...) { genes <- x$genes numGenes <- length(genes) cat("States reached at the end of the simulation:\n") if (activeOnly) { reachedStates <- data.frame(apply(x$reachedStates[,1:numGenes],1,function(state) { r <- paste(genes[which(state == 1)],collapse=", ") if (r == "") r <- "--" r }),x$reachedStates$Probability) colnames(reachedStates) <- c("Active genes", "Probability") print(reachedStates) } else { print(x$reachedStates) } if (!is.null(x$table)) { cat("\nProbabilities of state transitions in the network:\n") transitionProbs <- getTransitionProbabilities(x) colIndices <- c(1,numGenes,numGenes + 1, 2*numGenes, 2*numGenes + 1) if(activeOnly) { inputStates <- apply(transitionProbs,1,function(row) { r <- paste(genes[which(row[colIndices[1]:colIndices[2]] == 1)],collapse=", ") if (r == "") r <- "--" r }) outputStates <- apply(transitionProbs,1,function(row) { r <- paste(genes[which(row[colIndices[3]:colIndices[4]] == 1)],collapse=", ") if (r == "") r <- "--" r }) colWidth <- max(c(sapply(inputStates,nchar),sapply(outputStates,nchar))) align <- "left" } else { inputStates <- apply(transitionProbs,1,function(row) paste(row[colIndices[1]:colIndices[2]],collapse="")) outputStates <- apply(transitionProbs,1,function(row) paste(row[colIndices[3]:colIndices[4]],collapse="")) colWidth <- numGenes align <- "right" } binMatrix <- data.frame(inputStates,outputStates, transitionProbs[,colIndices[5]]) cat(format("State",width=max(7,colWidth),justify=align)," ", format("Next state",width=max(11,colWidth + 2),justify=align), format("Probability",width=13,justify="right"),"\n",sep="") apply(binMatrix,1,function(row) { # paste all states of input and output into one string, and put out all columns of the table in a # formatted way cat(format(row[1],width=max(7,colWidth),justify=align), " => ", format(row[2],width=max(11,colWidth + 2),justify=align), format(row[3],width=13,justify="right"),"\n",sep="") }) } return(invisible(x)) } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/print.BooleanStateInfo.R������������������������������������������������������������������0000654�0001762�0000144�00000000507�12122071020�016455� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Custom print function for class BooleanStateInfo print.BooleanStateInfo <- function(x, activeOnly=FALSE, ...) { # Create a TransitionTable object and print it cat("Transition table of Boolean network\n\n") transitionTable <- .internal.getTransitionTable(x) print(transitionTable, activeOnly=activeOnly, ...) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/print.BooleanNetwork.R��������������������������������������������������������������������0000654�0001762�0000144�00000001330�12122071020�016205� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Custom print function for class BooleanNetwork print.BooleanNetwork <- function(x, ...) { cat("Boolean network with",length(x$genes),"genes\n\n") cat("Involved genes:\n",paste(x$genes,collapse=" "),"\n\n",sep="") cat("Transition functions:\n") mapply(function(gene,interaction) { # print original expressions read from the files (if available) cat(gene," = ",interaction$expression,"\n",sep="") }, x$genes,x$interactions) if (sum(x$fixed != -1) > 0) { cat("\nKnocked-out and over-expressed genes:\n") mapply(function(gene,fixed) { if (fixed != -1) cat(gene," = ",fixed,"\n",sep="") }, x$genes,x$fixed) } return(invisible(x)) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/print.AttractorInfo.R���������������������������������������������������������������������0000654�0001762�0000144�00000007614�12122071020�016046� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Custom print function for class AttractorInfo print.AttractorInfo <- function(x, activeOnly = FALSE, ...) { numGenes <- length(x$stateInfo$genes) attractors <- x$attractors lapply(1:length(attractors),function(i) { if (is.null(attractors[[i]]$initialStates)) # simple attractor { # decode binary representation of states involved in the attractors binMatrix <- matrix(apply(attractors[[i]]$involvedStates,2,function(state) dec2bin(state,numGenes)),nrow=numGenes) # print general information on the attractor if (is.na(attractors[[i]]$basinSize)) cat("Attractor ",i," is a simple attractor consisting of ",ncol(attractors[[i]]$involvedStates), " state(s)",sep="") else cat("Attractor ",i," is a simple attractor consisting of ",ncol(attractors[[i]]$involvedStates), " state(s) and has a basin of ",attractors[[i]]$basinSize, " state(s)",sep="") # print a graphical representation of the attractor cycle if (activeOnly) { cat(".\nActive genes in the attractor state(s):\n") i <- 0 apply(binMatrix,2,function(col) { i <<- i + 1 state <- paste(x$stateInfo$genes[which(col == 1)],collapse=", ") if (state == "") state <- "--" cat("State ",i,": ",state,"\n",sep="") }) cat("\n") } else { cat(":\n\n") cat(" |--<",paste(rep("-",numGenes-1),collapse=""),"|\n",sep="") cat(" V ",paste(rep(" ",numGenes-1),collapse="")," |\n",sep="") apply(binMatrix,2,function(col) { cat(" ",col," |\n",sep="") cat(" | ",paste(rep(" ",numGenes-1),collapse="")," |\n",sep="") }) cat(" V ",paste(rep(" ",numGenes-1),collapse="")," |\n",sep="") cat(" |-->",paste(rep("-",numGenes-1),collapse=""),"|\n\n",sep="") } } else { # print general information on the attractor cat("Attractor ",i," is a complex/loose attractor consisting of ",ncol(attractors[[i]]$involvedStates), " state(s) and ",ncol(attractors[[i]]$initialStates), " transition(s)",sep="") if (activeOnly) { cat(".\nActive genes in the state transitions: \n") initialStates <- t(apply(attractors[[i]]$initialStates,2,function(state) dec2bin(state,numGenes))) nextStates <- t(apply(attractors[[i]]$nextStates,2,function(state) dec2bin(state,numGenes))) binMatrix <- data.frame(initialStates,nextStates) apply(binMatrix,1,function(row) { state1 <- paste(x$stateInfo$genes[which(row[1:numGenes] == 1)],collapse=", ") if (state1 == "") state1 <- "--" state2 <- paste(x$stateInfo$genes[which(row[(numGenes+1):length(row)] == 1)],collapse=", ") if (state2 == "") state2 <- "--" cat(state1," => ",state2,"\n",sep="") }) } else { cat(":\n\n") initialStates <- apply(attractors[[i]]$initialStates,2,function(state) paste(dec2bin(state,numGenes),collapse="")) nextStates <- apply(attractors[[i]]$nextStates,2,function(state) paste(dec2bin(state,numGenes),collapse="")) binMatrix <- data.frame(initialStates,nextStates) apply(binMatrix,1,function(row) { cat(row[1]," => ",row[2],"\n",sep="") }) } } if (!activeOnly) cat("\nGenes are encoded in the following order: ",paste(x$stateInfo$genes,collapse=" "),"\n\n",sep="") }) return(invisible(x)) } ��������������������������������������������������������������������������������������������������������������������BoolNet/R/plotStateGraph.R��������������������������������������������������������������������������0000654�0001762�0000144�00000011317�12122071020�015070� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Plots a graph that visualizes the state transitions and attractor basins. <attractorInfo> is an object # of class AttractorInfo. This requires the igraph package. # If <highlightAttractors> is set, attractor edges are drawn bold. # If <colorBasins> is true, each basin is drawn in a different color. # Colors can be provided in <colorSet>. # <layout> specifies the graph layouting function. # If <piecewise> is true, subgraphs are layouted separately. # <basin.lty> and <attractor.lty> specify the line types used to draw states in the basins # and in the attractors (if <highlightAttractor> is set). # If <plotIt> is not set, only the igraph object is returned, but no graph is plotted. # ... provides further graphical parameters for the plot. # Returns an object of class igraph plotStateGraph <- function(attractorInfo,highlightAttractors=TRUE,colorBasins=TRUE,colorSet, drawLegend=TRUE,drawLabels=FALSE,layout=layout.fruchterman.reingold, piecewise=FALSE,basin.lty=2,attractor.lty=1,plotIt=TRUE,...) { stopifnot(inherits(attractorInfo,"AttractorInfo")) if (!require(igraph)) stop("Please install the igraph package before using this function!") if (installed.packages()["igraph","Version"] < package_version("0.6")) bias <- 1 else bias <- 0 if (is.null(attractorInfo$stateInfo$table)) stop(paste("This AttractorInfo structure does not contain transition table information.", "Please re-run getAttractors() with a synchronous search and returnTable=TRUE!")) graphStruct <- getStateGraphStructure(attractorInfo) res <- graph.edgelist(el=graphStruct$edges - bias) res <- set.vertex.attribute(res,"name",value=graphStruct$vertices) # determine nodes and edges that belong to attractors attractorIndices <- which(attractorInfo$stateInfo$stepsToAttractor == 0) attractorEdgeIndices <- which(apply(graphStruct$edges,1, function(edge)((edge[1] %in% attractorIndices) & (edge[2] %in% attractorIndices)))) - bias # set default edge width and line type res <- set.edge.attribute(res,"width",value=0.9) res <- set.edge.attribute(res,"lty",value=basin.lty) if (highlightAttractors) { # set different edge width and line type for attractor edges res <- set.edge.attribute(res,"width",index=attractorEdgeIndices,value=2) res <- set.edge.attribute(res,"lty",index=attractorEdgeIndices,value=attractor.lty) } if (missing(colorSet)) { # define default colors colorSet <- c("blue","green","red","darkgoldenrod","gold","brown","cyan", "purple","orange","seagreen","tomato","darkgray","chocolate", "maroon","darkgreen","gray12","blue4","cadetblue","darkgoldenrod4", "burlywood2") } args <- list(...) # check for certain graphical parameters in ... # that have different default values in this plot if (is.null(args$vertex.size)) args$vertex.size <- 2 if (is.null(args$edge.arrow.mode)) args$edge.arrow.mode <- 0 if (is.null(args$vertex.label.cex)) args$vertex.label.cex <- 0.5 if (is.null(args$vertex.label.dist)) args$vertex.label.dist <- 1 if (colorBasins) { for (attractor in 1:length(attractorInfo$attractors)) { # determine nodes and edges belonging to the basin of <attractor> basinIndices <- which(attractorInfo$stateInfo$attractorAssignment == attractor) # change vertex color res <- set.vertex.attribute(res,"color",basinIndices - bias, value=colorSet[(attractor-1) %% length(colorSet) + 1]) if (drawLabels) res <- set.vertex.attribute(res,"label.color",basinIndices - bias, value=colorSet[(attractor-1) %% length(colorSet) + 1]) basinEdgeIndices <- which(apply(graphStruct$edges,1, function(edge)((edge[1] %in% basinIndices) & (edge[2] %in% basinIndices)))) - bias # change edge color res <- set.edge.attribute(res,"color",index=basinEdgeIndices, value=colorSet[(attractor-1) %% length(colorSet) + 1]) } } if(plotIt) { if (drawLabels) labels <- graphStruct$vertices else labels <- NA if (piecewise) layout <- piecewise.layout(res, layout) plot(res,vertex.size=args$vertex.size,layout=layout, edge.arrow.mode=args$edge.arrow.mode, vertex.label=labels,vertex.label.cex=args$vertex.label.cex, vertex.label.dist=args$vertex.label.dist, ...) if (colorBasins & drawLegend) legend(x="bottomleft",pch=15,ncol=1, col=colorSet[0:(length(attractorInfo$attractors) - 1) %% length(colorSet) + 1], legend = paste("Attractor",1:length(attractorInfo$attractors)), cex=0.5) } return(invisible(res)) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/plotSequence.R����������������������������������������������������������������������������0000654�0001762�0000144�00000011436�12122071020�014600� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������plotSequence <- function(network, startState, includeAttractorStates = c("all","first","none"), sequence, title = "", mode=c("table","graph"), plotFixed = TRUE, grouping = list(), onColor="green",offColor="red", layout, drawLabels=TRUE, drawLegend=TRUE, ...) { if (!missing(network)) { stopifnot(inherits(network,"BooleanNetwork")) if (missing(startState) || !missing(sequence)) stop("Either \"network\" and \"startState\" or \"sequence\" must be provided!") sequence <- getPathToAttractor(network = network, state = startState, includeAttractorStates = includeAttractorStates) numGenes <- length(network$genes) if (match.arg(mode,c("table","graph")) == "table") { whichFixed <- which(network$fixed != -1) if (plotFixed | (length(whichFixed) == 0)) plotIndices <- 1:numGenes else plotIndices <- (1:numGenes)[-whichFixed] sequence <- sequence[,plotIndices,drop=FALSE] } } else { if (missing(sequence) || !missing(startState)) stop("Either \"network\" and \"startState\" or \"sequence\" must be provided!") } switch(match.arg(mode,c("table","graph")), table = { # build accumulated matrix totalMatrix <- t(sequence) if(length(grouping)>0) # reorder genes according to the supplied groups totalMatrix = totalMatrix[unlist(grouping$index),,drop=FALSE] colnames(totalMatrix) <- 1:ncol(totalMatrix) # initialize with empty plot plot(c(),c(),xlim=c(0,ncol(totalMatrix)),ylim=c(-2,nrow(totalMatrix)),xlab="",ylab="", axes=FALSE, ...) axis(3,c(0,(1:ncol(totalMatrix))-0.5),c("t=",colnames(totalMatrix)), lty="blank", yaxt='s', xaxt='s', xaxs="i") axis(2,(1:nrow(totalMatrix))-0.5,rownames(totalMatrix), yaxt='s', xaxt='s', xaxs="i", las=2) # plot active and inactive states for(i in 1:ncol(totalMatrix)) for(j in 1:nrow(totalMatrix)) { if(totalMatrix[j,i] == 1) rect(i-1,j-1,i,j,col=onColor,border="gold") else rect(i-1,j-1,i,j,col=offColor,border="gold") } if(length(grouping)>0) # draw separators between groups, and print group names { sepPos = cumsum(sapply(grouping$index,length)) abline(h=sepPos[-length(sepPos)],col="black",lwd=3) text(ncol(totalMatrix)/2,sepPos-0.5,grouping$class,cex=0.9) } if (drawLegend) legend(x="bottomright",pch=c(15,15), col=c(onColor,offColor), legend = c("active","inactive"), cex=0.7, horiz=T) return(totalMatrix) }, graph = { if (!require(igraph)) stop("Please install the igraph package before using the \"graph\" mode of this function!") args <- list(...) if (is.null(args$vertex.size)) args$vertex.size <- 2 if (is.null(args$edge.arrow.mode)) args$edge.arrow.mode <- 0 if (is.null(args$rescale)) args$rescale <- !missing(layout) if (is.null(args$vertex.label.cex)) args$vertex.label.cex <- 0.75 if (is.null(args$vertex.label.dist)) args$vertex.label.dist <- 0.25 if (is.null(args$vertex.label.degree)) args$vertex.label.degree <- -pi/2 if (is.null(args$vertex.color)) args$vertex.color <- "grey" if (is.null(args$edge.arrow.size)) args$edge.arrow.size <- 0.5 if (missing(layout)) layout <- matrix(c(seq(-1,1,length.out=nrow(sequence)), rep(0,nrow(sequence))), ncol=2) states <- apply(sequence,1,paste,collapse="") nodes <- data.frame(unique(states),stringsAsFactors=FALSE) if (length(states) > 1) { initialStates <- states[1:(length(states) - 1)] nextStates <- states[2:length(states)] edgeMatrix <- data.frame(initialStates,nextStates) } else { edgeMatrix <- data.frame(matrix(nrow=0,ncol=2)) } graph <- graph.data.frame(edgeMatrix,vertices=nodes,directed=TRUE) if (drawLabels) labels <- nodes[,1] else labels <- NA plot(graph,layout=layout,vertex.label=labels,vertex.label.cex=args$vertex.label.cex, vertex.size=args$vertex.size, vertex.color=args$vertex.color, vertex.label.dist=args$vertex.label.dist, vertex.label.degree=args$vertex.label.degree, edge.arrow.size=args$edge.arrow.size, rescale=args$rescale, main=title,...) return(graph) }) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/plotPBNTransitions.R����������������������������������������������������������������������0000654�0001762�0000144�00000007353�12122071020�015710� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Plots a graph of the transitions in a probabilistic Boolean network. # <markovSimulation> is the result of a Markov simulation with returnTable=TRUE. # If stateSubset is specified, only transitions between states in the set are considered. # If <drawProbabilities> is true, the edges are annotated with probabilities. # If <drawStateLabels> is true, the states are annotated with their gene values. # <layout> specifies the igraph layout to be used. # If <plotIt> is false, only the graph is returned, and nothing is plotted. # ... specifies further parameters to igraph. plotPBNTransitions <- function(markovSimulation,stateSubset, drawProbabilities=TRUE,drawStateLabels=TRUE, layout=layout.fruchterman.reingold, plotIt=TRUE,...) { stopifnot(inherits(markovSimulation,"MarkovSimulation")) if (!require(igraph)) stop("Please install the igraph package before using this function!") if (is.null(markovSimulation$table)) stop(paste("The supplied simulation result does not contain transition information.", "Please re-run markovSimulation() with returnTable=TRUE!")) # assemble edges from table edgeMatrix <- data.frame(apply(markovSimulation$table$initialStates,2, function(x)paste(dec2bin(x,length(markovSimulation$genes)),collapse="")), apply(markovSimulation$table$nextStates,2, function(x)paste(dec2bin(x,length(markovSimulation$genes)),collapse=""))) if (!missing(stateSubset)) { # determine edges to be excluded based on the subset stateSubset <- sapply(stateSubset,function(x)paste(x,collapse="")) keepIndices <- apply(edgeMatrix,1,function(row) { (length(intersect(row,stateSubset)) == length(unique(row))) }) # drop edges edgeMatrix <- edgeMatrix[keepIndices,] probabilities <- markovSimulation$table$probabilities[keepIndices] } else probabilities <- markovSimulation$table$probabilities # determine set of vertices vertices <- as.data.frame(as.character(unique(c(as.character(edgeMatrix[,1]), as.character(edgeMatrix[,2]))))) # build graph graph <- graph.data.frame(edgeMatrix,vertices=vertices,directed=TRUE) if (drawProbabilities) graph <- set.edge.attribute(graph,"label",value=paste(" ",probabilities)) if (drawStateLabels) label <- as.character(vertices[,1]) else label <- NA if (plotIt) { # set default values for further graphical parameters args <- list(...) if (is.null(args$vertex.size)) args$vertex.size <- 2 if (is.null(args$edge.arrow.mode)) args$edge.arrow.mode <- 0 if (is.null(args$vertex.label.cex)) args$vertex.label.cex <- 0.75 if (is.null(args$edge.label.cex)) args$edge.label.cex <- 0.75 if (is.null(args$vertex.label.dist)) args$vertex.label.dist <- 1 if (is.null(args$vertex.color)) args$vertex.color <- "grey" if (is.null(args$edge.label.color)) args$edge.label.color <- "green" if (is.null(args$edge.arrow.size)) args$edge.arrow.size <- 0.5 # plot it plot(graph,vertex.label=label,layout=layout,vertex.label.cex=args$vertex.label.cex, vertex.size=args$vertex.size,vertex.color=args$vertex.color, vertex.label.dist = args$vertex.label.dist, edge.arrow.size=args$edge.arrow.size, edge.label.color=args$edge.label.color, edge.label.cex=args$edge.label.cex,...) } # return the igraph object return(invisible(graph)) } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/plotNetworkWiring.R�����������������������������������������������������������������������0000654�0001762�0000144�00000004630�12122071020�015637� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Plot a wiring graph of the network <network> with the supplied # graphical parameters. # Requires igraph. # Returns the igraph structure representing the wiring graph. plotNetworkWiring <- function(network,layout=layout.fruchterman.reingold,plotIt=TRUE,...) { stopifnot(inherits(network,"ProbabilisticBooleanNetwork") | inherits(network,"BooleanNetworkCollection") | inherits(network,"BooleanNetwork")) if (!require(igraph)) stop("Please install the igraph package before using this function!") if (installed.packages()["igraph","Version"] < package_version("0.6")) bias <- 1 else bias <- 0 edgeList <- c() # construct list of edges from interactions if (inherits(network,"BooleanNetwork")) # deterministic network { for (i in 1:length(network$genes)) { if (network$interactions[[i]]$input[1] != 0) # no edges for constant genes { edgeList <- rbind(edgeList, cbind(network$interactions[[i]]$input, rep(i,length(network$interactions[[i]]$input)))) } } } else # probabilistic network { for (i in 1:length(network$genes)) { for (j in 1:length(network$interactions[[i]])) { if (network$interactions[[i]][[j]]$input[1] != 0) # no edges for constant genes { edgeList <- rbind(edgeList, cbind(network$interactions[[i]][[j]]$input, rep(i,length(network$interactions[[i]][[j]]$input)))) } } } } # build graph from edge list res <- graph.data.frame(edgeList-bias,directed=TRUE,vertices=as.data.frame((1:length(network$genes)) - bias)) res <- set.vertex.attribute(res,"name",value=network$genes) args <- list(...) # check for certain graphical parameters in ... # that have different default values in this plot if (is.null(args$vertex.color)) args$vertex.color <- "grey" if (is.null(args$edge.arrow.size)) args$edge.arrow.size <- 0.5 if (is.null(args$vertex.label.cex)) args$vertex.label.cex <- 0.7 if (is.null(args$vertex.size)) args$vertex.size <- 18 if (plotIt) { plot(res,vertex.label=network$genes,vertex.label.cex=args$vertex.label.cex, vertex.size=args$vertex.size,vertex.color=args$vertex.color, edge.arrow.size=args$edge.arrow.size, layout=layout,...) } return(invisible(res)) } ��������������������������������������������������������������������������������������������������������BoolNet/R/plotAttractors.R��������������������������������������������������������������������������0000654�0001762�0000144�00000016334�12122071020�015160� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Plot state tables of all attractors in <attractorInfo>. # Genes are grouped according to <grouping>. # An additional title can be supplied in <title>. # If <plotFixed> is set, fixed variables are included in the plot. # <onColor> and <offColor> specify the colors of ON/1 and OFF/0 states. plotAttractors <- function (attractorInfo, subset, title = "", mode=c("table","graph"), grouping = list(), plotFixed = TRUE, onColor="green",offColor="red", layout=layout.circle, drawLabels=TRUE, drawLegend=TRUE, ...) { stopifnot(inherits(attractorInfo,"AttractorInfo")) numGenes <- length(attractorInfo$stateInfo$genes) if (missing(subset)) subset <- 1:length(attractorInfo$attractors) else if (any(subset > length(attractorInfo$attractors))) stop("You specified an attractor index that is greater than the total number of attractors in 'subset'!") switch(match.arg(mode,c("table","graph")), table = { # determine list of genes to be plotted whichFixed <- which(attractorInfo$stateInfo$fixedGenes != -1) if (plotFixed | (length(whichFixed) == 0)) plotIndices <- 1:numGenes else plotIndices <- (1:numGenes)[-whichFixed] # convert decimal state numbers to binary state matrices (one for each attractor) binMatrices <- lapply(attractorInfo$attractors,function(attractor) { res <- matrix(apply(attractor$involvedStates,2,function(state) dec2bin(state,numGenes)[plotIndices]),nrow=length(plotIndices)) }) # count the numbers of attractors with equal lengths attractorLengths <- sapply(attractorInfo$attractors,function(attractor) { if (is.null(attractor$initialStates)) # simple attractor ncol(attractor$involvedStates) else # complex attractor => extra treatment -1 }) lengthTable <- table(attractorLengths) lengthTable <- lengthTable[as.integer(names(lengthTable)) != -1] res <- lapply(1:length(lengthTable),function(i) # accumulate all attractors with equal length in one matrix and plot them { len <- as.integer(names(lengthTable)[i]) if (length(intersect(which(attractorLengths == len),subset)) > 0) { cnt <- lengthTable[i] # build accumulated matrix totalMatrix <- c() for (mat in binMatrices[intersect(which(attractorLengths == len),subset)]) { totalMatrix <- cbind(totalMatrix,mat) } rownames(totalMatrix) <- attractorInfo$stateInfo$genes[plotIndices] colnames(totalMatrix) <- sapply(intersect(which(attractorLengths == len),subset),function(i)paste("Attr",i,".",1:len,sep="")) if(length(grouping)>0) # reorder genes according to the supplied groups totalMatrix = totalMatrix[unlist(grouping$index),,drop=FALSE] # initialize with empty plot plot(c(),c(),xlim=c(0,len*cnt),ylim=c(-2,nrow(totalMatrix)+1),xlab="",ylab="", axes=FALSE,main=paste(title, "Attractors with ",len," state(s)",sep="")) axis(2,(1:nrow(totalMatrix))-0.5,rownames(totalMatrix), yaxt='s', las=2) # plot active and inactive states for(i in 1:ncol(totalMatrix)) for(j in 1:nrow(totalMatrix)) { if(totalMatrix[j,i] == 1) rect(i-1,j-1,i,j,col=onColor,border="gold") else rect(i-1,j-1,i,j,col=offColor,border="gold") } # draw vertical separators between attractors sep = seq(0,ncol(totalMatrix),by=len) abline(v = sep[-1],col="white",lwd=3) # output frequency of attractor (basin size / number of states) freq <- round(sapply(attractorInfo$attractors[intersect(which(attractorLengths == len),subset)], function(attractor)attractor$basinSize/ncol(attractorInfo$stateInfo$table)) * 100,2) if (!isTRUE(all(is.na(freq)))) { text(sep[1:(length(sep)-1)] + len/2, rep(0.4+nrow(totalMatrix),ncol(totalMatrix)), paste(freq,"%",sep=""),cex=.75,font=3) } if(length(grouping)>0) # draw separators between groups, and print group names { sepPos = cumsum(sapply(grouping$index,length)) abline(h=sepPos[-length(sepPos)],col="black",lwd=3) text(ncol(totalMatrix)/2,sepPos-0.5,grouping$class,cex=0.9) } if (drawLegend) legend(x="bottomright", pch=c(15,15), col=c(onColor,offColor), legend = c("active","inactive"), cex=0.7, horiz=T) totalMatrix } }) # return a list of accumulated matrices names(res) <- names(lengthTable) return(res) }, graph = { if (!require(igraph)) stop("Please install the igraph package before using the \"graph\" mode of this function!") args <- list(...) if (is.null(args$vertex.size)) args$vertex.size <- 2 if (is.null(args$edge.arrow.mode)) args$edge.arrow.mode <- 0 if (is.null(args$vertex.label.cex)) args$vertex.label.cex <- 0.75 if (is.null(args$vertex.label.dist)) args$vertex.label.dist <- 1 if (is.null(args$vertex.color)) args$vertex.color <- "grey" if (is.null(args$edge.arrow.size)) args$edge.arrow.size <- 0.5 lapply(attractorInfo$attractors[subset],function(attractor) { nodes <- data.frame(apply(attractor$involvedStates,2,function(state) paste(dec2bin(state,numGenes),collapse="")), stringsAsFactors=FALSE) if (!is.null(attractor$initialStates)) # asynchronous complex attractor { initialStates <- apply(attractor$initialStates,2,function(state) paste(dec2bin(state,numGenes),collapse="")) nextStates <- apply(attractor$nextStates,2,function(state) paste(dec2bin(state,numGenes),collapse="")) } else { initialStates <- apply(attractor$involvedStates,2,function(state) paste(dec2bin(state,numGenes),collapse="")) if (length(initialStates) == 1) # steady state nextStates <- initialStates else # synchronous attractor with more than one state nextStates <- initialStates[c(2:length(initialStates),1)] } edgeMatrix <- data.frame(initialStates,nextStates) graph <- graph.data.frame(edgeMatrix,vertices=nodes,directed=TRUE) if (drawLabels) labels <- nodes[,1] else labels <- NA plot(graph,layout=layout,vertex.label=labels,vertex.label.cex=args$vertex.label.cex, vertex.size=args$vertex.size,vertex.color=args$vertex.color, vertex.label.dist=args$vertex.label.dist, edge.arrow.size=args$edge.arrow.size, main=title,...) graph }) }) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/perturbNetwork.R��������������������������������������������������������������������������0000654�0001762�0000144�00000022124�12122071020�015162� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Randomly perturb a supplied network. # <perturb="functions"> perturbs the functions associated with the genes directly. # <perturb="states"> perturbs a maximum of <numStates> states # in the transition table resulting from the functions. # <method="bitflip"> randomly flips up to <maxNumBits> in the functions or states. # <method="shuffle"> randomly permutes the bits in the functions or states. # If <simplify> is set, the perturbed network is simplified to remove irrelevant input functions. # If <excludeFixed> is set, fixed genes are excluded from the perturbations and stay as they are. perturbNetwork <- function(network,perturb=c("functions","states"),method=c("bitflip","shuffle"), simplify=(perturb[1]=="states"),readableFunctions=FALSE,excludeFixed=TRUE, maxNumBits=1,numStates=max(1,2^length(network$genes)/100)) { stopifnot(inherits(network,"BooleanNetwork") | inherits(network,"ProbabilisticBooleanNetwork") | inherits(network,"BooleanNetworkCollection")) fixedGenes <- which(network$fixed != -1) if (inherits(network,"BooleanNetwork")) # deterministic network { switch(match.arg(perturb,c("functions","states")), functions= switch(match.arg(method,c("bitflip","shuffle")), bitflip = { # choose the function to be perturbed if (length(fixedGenes) > 0 & excludeFixed) functionIdx <- sample((1:length(network$interactions))[-fixedGenes],size=1) else functionIdx <- sample(1:length(network$interactions),size=1) # choose the indices of the truth table to be flipped flipIndices <- sample(1:length(network$interactions[[functionIdx]]$func), size=runif(n=1,min=1, max=min(maxNumBits, length(network$interactions[[functionIdx]]$func))), replace=FALSE) # flip the bits network$interactions[[functionIdx]]$func[flipIndices] <- as.integer(!network$interactions[[functionIdx]]$func[flipIndices]) network$interactions[[functionIdx]]$expression <- getInteractionString(readableFunctions, network$interactions[[functionIdx]]$func, network$genes[network$interactions[[functionIdx]]$input]) }, shuffle= { # choose the function to be perturbed if (length(fixedGenes) > 0 & excludeFixed) functionIdx <- sample((1:length(network$interactions))[-fixedGenes],size=1) else functionIdx <- sample(1:length(network$interactions),size=1) # draw a random permutation of bit positions flipIndices <- sample(1:length(network$interactions[[functionIdx]]$func), size=length(network$interactions[[functionIdx]]$func), replace=FALSE) # permute the bits network$interactions[[functionIdx]]$func <- network$interactions[[functionIdx]]$func[flipIndices] network$interactions[[functionIdx]]$expression <- getInteractionString(readableFunctions, network$interactions[[functionIdx]]$func, network$genes[network$interactions[[functionIdx]]$input]) }, stop("'method' must be one of \"bitflip\",\"shuffle\"")), states = { # turn off gene fixing - otherwise reverse-engineering of the transition table is not possible oldFixed <- network$fixed network$fixed <- rep(-1,length(network$genes)) names(network$fixed) <- network$genes # calculate transition table table <- t(sapply(getAttractors(network)$stateInfo$table,dec2bin,length(network$genes))) # determine the states to be perturbed statesToChange <- sample(1:nrow(table),min(numStates,nrow(table)),replace=FALSE) lapply(statesToChange,function(state) { # choose the indices of the states that are allowed to be changed flipIndices <- 1:length(network$genes) if (length(fixedGenes) > 0 & excludeFixed) flipIndices <- flipIndices[-fixedGenes] switch(match.arg(method,c("bitflip","shuffle")), bitflip = { # choose the actual indices to be changed flipIndex <- sample(flipIndices, size=runif(n=1,min=1, max=min(maxNumBits, length(flipIndices))), replace=FALSE) # flip the bits at these positions table[state,flipIndex] <<- as.integer(!table[state,flipIndex]) }, shuffle = { # determine a permutation of the bit indices flipIndex <- sample(flipIndices, size=length(flipIndices), replace=FALSE) # permute the state table[state,] <<- as.integer(table[state,flipIndex]) }, stop("'method' must be one of \"bitflip\",\"shuffle\"") ) NULL}) # restore network by assigning the columns of the state table to the corresponding genes network$interactions <- apply(table,2,function(gene) { input = 1:length(network$genes) # encoding is reversed in the transition table input <- input[length(input):1] list(input=input, func=gene, expression= getInteractionString(readableFunctions, gene, network$genes[input])) }) # reactivate fixed genes network$fixed <- oldFixed }, stop("'perturb' must be one of \"functions\",\"states\"")) } else # probabilistic network { if (match.arg(perturb) != "functions") stop("In probabilistic Boolean networks, only perturb=functions is allowed!") switch(match.arg(method,c("bitflip","shuffle")), bitflip = { # choose the gene and the function to be perturbed if (length(fixedGenes) > 0 & excludeFixed) geneIdx <- sample((1:length(network$interactions))[-fixedGenes],size=1) else geneIdx <- sample(1:length(network$interactions),size=1) functionIdx <- sample(1:length(network$interactions[[geneIdx]]),size=1) # choose the indices of the truth table to be flipped flipIndices <- sample(1:length(network$interactions[[geneIdx]][[functionIdx]]$func), size=runif(n=1,min=1, max=min(maxNumBits, length(network$interactions[[geneIdx]][[functionIdx]]$func))), replace=FALSE) # flip the bits network$interactions[[geneIdx]][[functionIdx]]$func[flipIndices] <- as.integer(!network$interactions[[geneIdx]][[functionIdx]]$func[flipIndices]) network$interactions[[geneIdx]][[functionIdx]]$expression <- getInteractionString(readableFunctions, network$interactions[[geneIdx]][[functionIdx]]$func, network$genes[network$interactions[[geneIdx]][[functionIdx]]$input]) }, shuffle= { # choose the function to be perturbed if (length(fixedGenes) > 0 & excludeFixed) geneIdx <- sample((1:length(network$interactions))[-fixedGenes],size=1) else geneIdx <- sample(1:length(network$interactions),size=1) functionIdx <- sample(1:length(network$interactions[[geneIdx]]),size=1) # draw a random permutation of bit positions flipIndices <- sample(1:length(network$interactions[[geneIdx]][[functionIdx]]$func), size=length(network$interactions[[geneIdx]][[functionIdx]]$func), replace=FALSE) # permute the bits network$interactions[[geneIdx]][[functionIdx]]$func <- network$interactions[[geneIdx]][[functionIdx]]$func[flipIndices] network$interactions[[geneIdx]][[functionIdx]]$expression <- getInteractionString(readableFunctions, network$interactions[[geneIdx]][[functionIdx]]$func, network$genes[network$interactions[[geneIdx]][[functionIdx]]$input]) }, stop("'method' must be one of \"bitflip\",\"shuffle\"")) } # simplify the network if necessary if (simplify) network <- simplifyNetwork(network,readableFunctions) return(network) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/parseBooleanFunction.R��������������������������������������������������������������������0000644�0001762�0000144�00000010315�12122071020�016243� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Split up <expression> into symbols. # Returns a vector of symbols. scan <- function(expression) { # add extra whitespace to brackets and operators expression <- gsub("("," ( ", expression, fixed=TRUE) expression <- gsub(")"," ) ", expression, fixed=TRUE) expression <- gsub("!"," ! ", expression, fixed=TRUE) expression <- gsub("&"," & ", expression, fixed=TRUE) expression <- gsub("|"," | ", expression, fixed=TRUE) # strip multiple whitespace characters expression <- gsub("[ ]+", " ", expression) expression <- gsub("^[ ]+", "", expression) expression <- gsub("[ ]+$", "", expression) # split up at whitespace positions res <- strsplit(expression, " ", fixed=TRUE)[[1]] return(res) } # Parse a Boolean function in <expression>, # and build a corresponding parse tree. parseBooleanFunction <- function(expression) { # internal function to step forward one symbol advanceSymbol <- function() { pos <<- pos + 1 if (pos > length(symbols)) return(NA) else return(symbols[pos]) } # internal function to parse a sub-expression in brackets parseExpression <- function() { operators <- c() children <- c() symb <- advanceSymbol() while (TRUE) { if (symb == "(") # a new sub-expression children[[length(children)+1]] <- parseExpression() else if (symb == "!") # a negation children[[length(children)+1]] <- parseNegation() else if (symb %in% c(")","&","|")) # something unexpected happened stop(paste("Unexpected symbol:",symb)) else # an atom (variable or constant) children[[length(children)+1]] <- list(type="atom",name=symb, negated=FALSE) symb <- advanceSymbol() if (is.na(symb) || symb == ")") # end of expression was reached break if (!symb %in% c("&","|")) stop("Operator expected!") operators <- c(operators,symb) symb <- advanceSymbol() } if (length(children) == 1) # an operator with only one child return(children[[1]]) else if (length(unique(operators)) == 1) # an n-ary operator return(list(type="operator",operator=operators[1], negated=FALSE, operands=children)) else # a mixture of multiple operators => ensure correct precedence { i <- 1 startPos <- NA operators <- c(operators, "|") operands <- list() while (i <= length(operators)) # identify AND operators and move them to a subtree { if (operators[i] == "&" && is.na(startPos)) # start of a conjunction startPos <- i if (operators[i] == "|" && !is.na(startPos)) # end of a conjunction => create subtree { subOp <- list(type="operator", operator="&", negated=FALSE, operands=children[startPos:i]) operands[[length(operands)+1]] <- subOp startPos <- NA } else if (is.na(startPos)) operands[[length(operands)+1]] <- children[[i]] i <- i + 1 } return(list(type="operator",operator="|", negated=FALSE, operands=operands)) } } # Internal function to parse a negation parseNegation <- function() { symb <- advanceSymbol() if (symb == "(") { res <- parseExpression() } else if (symb %in% c(")","&","|")) stop(paste("Unexpected symbol:",symb)) else res <- list(type="atom",name=symb) res$negated = TRUE return(res) } symbols <- scan(expression) pos <- 0 return(parseExpression()) } # Currently unused - # Regenerate the expression string # from the parse tree <tree> stringFromParseTree <- function(tree) { res <- switch(tree$type, operator = { paste({if (tree$negated) "!" else ""}, "(", paste(sapply(tree$operands,stringFromParseTree), collapse=paste(" ",tree$operator," ",sep="")), ")", sep="") }, atom = paste({if (tree$negated) "!" else ""}, tree$name, sep="")) return(res) } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/markovSimulation.R������������������������������������������������������������������������0000654�0001762�0000144�00000012337�12122071020�015476� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Perform a Markov chain simulation with <numIterations> iterations/matrix multiplications on <network>. # If <startStates> is supplied, probabilities for all other start states will be set to 0. # All probabilities below <cutoff> are regarded as zero. markovSimulation <- function(network, numIterations=1000, startStates=list(), cutoff=0.001, returnTable=TRUE) { stopifnot(inherits(network,"ProbabilisticBooleanNetwork") | inherits(network,"BooleanNetworkCollection") | inherits(network,"BooleanNetwork")) if (sum(network$fixed == -1) > 32) stop("A Markov chain simulation with more than 32 non-fixed genes is not supported!") # the C code requires all interactions to be coded into one vector: if (inherits(network,"BooleanNetwork")) # deterministic network { # Assemble all input gene lists in one list <inputGenes>, and remember the split positions in <inputGenePositions>. inputGenes <- as.integer(unlist(lapply(network$interactions,function(interaction)interaction$input))) inputGenePositions <- as.integer(cumsum(c(0,sapply(network$interactions, function(interaction)length(interaction$input))))) # Do the same for the transition functions. transitionFunctions <- as.integer(unlist(lapply(network$interactions,function(interaction)interaction$func))) transitionFunctionPositions <- as.integer(cumsum(c(0,sapply(network$interactions, function(interaction)length(interaction$func))))) probabilities <- as.double(rep(1.0,length(network$genes))) functionAssignment <- as.integer(0:(length(network$genes)-1)) } else # probabilistic network { wrongProb <- sapply(network$interactions,function(interaction) abs(1.0-sum(sapply(interaction,function(func)func$probability))) > 0.0001) if (any(wrongProb)) stop(paste("The probabilities of gene(s) ",paste(network$genes[wrongProb],collapse=", ")," do not sum up to 1!",sep="")) # Assemble all input gene lists in one list <inputGenes>, and remember the split positions in <inputGenePositions>. inputGenes <- as.integer(unlist(lapply(network$interactions,function(interaction)lapply(interaction,function(singleFunc)singleFunc$input)))) inputGenePositions <- as.integer(cumsum(c(0,unlist(lapply(network$interactions, function(interaction)lapply(interaction,function(singleFunc)length(singleFunc$input))))))) # Do the same for the transition functions. transitionFunctions <- as.integer(unlist(lapply(network$interactions,function(interaction)lapply(interaction,function(singleFunc)singleFunc$func)))) transitionFunctionPositions <- as.integer(cumsum(c(0,unlist(lapply(network$interactions, function(interaction)lapply(interaction,function(singleFunc)length(singleFunc$func))))))) probabilities <- as.double(unlist(lapply(network$interactions,function(interaction)lapply(interaction,function(singleFunc)singleFunc$probability)))) functionAssignment <- as.integer(unlist(mapply(function(index,interaction)rep(index,length(interaction)),0:(length(network$interactions )- 1), network$interactions))) } # check whether the start states are allowed # by comparing the values of the fixed genes fixedGenes <- which(network$fixed != -1) if (length(startStates) > 0) { statesValid <- sapply(startStates,function(state) { isTRUE(all(state[fixedGenes] == network$fixed[fixedGenes])) }) if (!isTRUE(all(statesValid))) warning("Some of the supplied start states did not match the restrictions of the fixed genes and were removed!") startStates <- startStates[statesValid] } convertedStartStates <- NULL if (length(startStates) > 0) convertedStartStates <- sapply(startStates,function(x)bin2dec(x,length(network$genes))) on.exit(.C("freeAllMemory", PACKAGE = "BoolNet")) # call C code res <- .Call("markovSimulation_R", inputGenes,inputGenePositions, transitionFunctions,transitionFunctionPositions, as.integer(network$fixed), functionAssignment, probabilities, as.integer(numIterations), convertedStartStates, as.double(cutoff), as.integer(returnTable), PACKAGE="BoolNet") if (length(network$genes) %% 32 == 0) numElementsPerEntry <- as.integer(length(network$genes) / 32) else numElementsPerEntry <- as.integer(length(network$genes) / 32 + 1) # build result matrix reachedStates <- data.frame(t(sapply(res$states,function(state)dec2bin(state,length(network$genes)))),res$probabilities) colnames(reachedStates) <- c(network$genes,"Probability") if (returnTable) { initialStates <- matrix(res$initialStates,nrow=numElementsPerEntry) nextStates <- matrix(res$nextStates,nrow=numElementsPerEntry) res <- list(reachedStates=reachedStates, table=list(initialStates=initialStates,nextStates=nextStates,probabilities=res$transitionProbabilities), genes=network$genes) } else { res <- list(reachedStates=reachedStates, table=NULL, genes=network$genes) } class(res) <- "MarkovSimulation" return(res) } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/loadSBML.R��������������������������������������������������������������������������������0000644�0001762�0000144�00000043226�12122071020�013527� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Check whether N is an integer using # a regular expression. check.integer <- function(N) { !length(grep("[^[:digit:]]", as.character(N))) } # Parse an SBML species list in <rootNode>. # Returns a list containing a map of gene ids to gene names, # a vector specifying which genes are fixed # and a vector of initial levels. parseSBMLSpecies <- function(rootNode) { genes <- c() fixed <- c() initialLevels <- c() # iterate over species for (species in xmlChildren(rootNode)) { attrs <- xmlAttrs(species) # if available, use the "name" attribute as the gene name # (and replace unsuitable characters by underscores) # otherwise use the gene id. if (is.na(attrs["name"]) || attrs["name"] == "") # for better compatibility with CoLoMoTo, # remove "s_" at the beginning of identifiers name <- sub("^s_","",attrs["id"]) else name <- gsub("[^a-zA-Z0-9_]+","_",attrs["name"]) # gene names must be unique if (name %in% genes) { suffix <- 1 while (paste(name,suffix,sep="_") %in% genes) suffix <- suffix + 1 warning(paste("Duplicate gene \"",name,"\", renaming to ", name,"_",suffix,"!",sep="")) name <- paste(name,suffix,sep="_") } # Reject logical networks with more than two values for a gene if (!is.na(attrs["maxLevel"]) && as.integer(attrs["maxLevel"]) > 1) stop(paste("BoolNet supports only binary genes, but gene \"", name,"\" has a maximum level of ",attrs["maxLevel"],"!", sep="")) # build a lookup table id -> gene name genes[attrs["id"]] <- name if (!is.na(attrs["constant"]) && tolower(attrs["constant"]) == "true") # if the gene is constant, save its initial level in the "fixed" vector { if (is.na(attrs["initialLevel"])) stop(paste("Gene \"", name, "\" is constant, but no initial level is supplied!", sep="")) fixed[name] <- TRUE } else # this gene is not constant fixed[name] <- FALSE initialLevels[name] <- as.integer(attrs["initialLevel"]) } return(list(genes = genes, fixed = fixed, initialLevels = initialLevels)) } # Parse a list of transitions in <rootNode>. # Here, <genes> is the result of parseSBMLSpecies() # containing a map of gene ids/assignments, a vector # specifying fixed genes and a vector of initial levels. # Returns a list of interactions in the format # of class BooleanNetwork parseSBMLTransitions <- function(rootNode, genes) { # iterate over all transitions transitions <- xmlApply(rootNode,function(transition) { # parse inputs inputList <- xmlFindNode(transition, "listOfInputs") if (is.null(inputList)) { inputs <- c() } else { inputList <- inputList[[1]] inputs <- c() inputThresholds <- c() # iterate over inputs for (input in xmlChildren(inputList)) { attrs <- xmlAttrs(input) id <- attrs["qualitativeSpecies"] # verify gene name in species list if (is.na(genes$genes[id])) stop(paste("Unknown input \"",id,"\"!",sep="")) else inputs <- union(inputs, id) # check whether attributes of the input are compatible # with Boolean logic if (tolower(attrs["transitionEffect"]) != "none") stop(paste("Transition effect for input gene \"",id,"\" is \"", attrs["transitionEffect"],"\", expected \"none\"!", sep="")) if (!is.na(attrs["thresholdLevel"]) && !is.na(attrs["id"])) # if a threshold level has been specified, save it with the # corresponding ID for later use in the MathML terms { inputThresholds[attrs["id"]] <- as.integer(attrs["thresholdLevel"]) if (inputThresholds[attrs["id"]] > 1) stop("Threshold levels must be 0 or 1!") } } } # parse outputs outputList <- xmlFindNode(transition, "listOfOutputs") outputs <- c() if (!is.null(outputList)) { outputList <- outputList[[1]] for (output in xmlChildren(outputList)) # iterate over outputs { attrs <- xmlAttrs(output) id <- attrs["qualitativeSpecies"] # verify gene list in species list if (is.na(genes$genes[id])) stop(paste("Unknown output ",id,"!",sep="")) else outputs <- union(outputs, id) # check whether attributes of the output are compatible # with Boolean logic if (tolower(attrs["transitionEffect"]) != "assignmentlevel") stop(paste("Transition effect for output gene \"",id,"\" is \"", attrs["transitionEffect"],"\", expected \"assignmentLevel\"!", sep="")) if (!is.na(attrs["outputLevel"])) stop("Output levels for transitions are not supported in Boolean models!") } } # parse function terms functionTermList <- xmlFindNode(transition, "listOfFunctionTerms", throwError=TRUE)[[1]] transitionFunction <- parseSBMLFunctionTerms(functionTermList, genes$genes[inputs], inputThresholds) return(list(inputs=inputs, outputs=outputs, transitionFunction=transitionFunction)) }) # now convert the read data to the BoolNet interaction format interactions <- lapply(names(genes$genes), function(gene) { # identify the transitions linked to each gene linkedTransitions <- which(sapply(transitions, function(transition)gene %in% transition$output)) if (length(linkedTransitions) == 0) # no transitions are assigned to this gene { if (!genes$fixed[genes$gene[gene]]) { if (is.na(genes$initialLevels[genes$gene[gene]])) { # a non-constant gene should have a transition or an initial level warning(paste("There is no transition and no initial level for the non-constant gene \"", gene,"\"! Assuming an input!",sep="")) return(list(input=which(names(genes$genes) == gene), func=c(0,1), expression=genes$gene[gene])) } else warning(paste("There is no transition for the non-constant gene \"", gene,"\"! Setting it to a constant ", genes$initialLevels[genes$gene[gene]], "!" ,sep="")) } # build a constant interaction return(list(input=0, func=genes$initialLevels[genes$gene[gene]], expression=as.character(genes$initialLevels[genes$gene[gene]]))) } else { if (length(linkedTransitions) > 1) # multiple transitions per gene are not allowed, as these may be conflicting { stop(paste("Gene \"",gene,"\" is affected by multiple transitions!",sep="")) } if (genes$fixed[genes$gene[gene]]) # a constant gene should not be the output of a transition stop(paste("Gene \"",gene,"\" has been specified as constant, but there is a transition!",sep="")) # parse the Boolean expression, and generate an interaction with # the corresponding truth table return(generateInteraction(transitions[[linkedTransitions]]$transitionFunction, genes$genes[transitions[[linkedTransitions]]$input], genes$genes)) } }) names(interactions) <- genes$genes return(interactions) } # Parse a list of function terms in <rootNode>, where <genes> specifies # the assignment of gene identifiers to gene names, # and <inputThresholds> specifies the assignment of threshold identifiers # to values (see also parseMathML()). # Returns a single character string representing the function term # as an R expression. parseSBMLFunctionTerms <- function(rootNode, genes, inputThresholds) { # iterate over function terms functionTerms <- xmlApply(rootNode, function(term) { attrs <- xmlAttrs(term) outputLevel <- as.integer(attrs["resultLevel"]) if (outputLevel > 1) stop("The result level of a function term must be 0 or 1!") if (tolower(xmlName(term)) == "defaultterm") # this is the default term => no expression { return(list(term="",outputLevel=outputLevel)) } else # parse the MathML expression in the function term { math <- xmlFindNode(term, "math", throwError=TRUE)[[1]][[1]] return(list(term=parseMathML(math, genes, inputThresholds), outputLevel=outputLevel)) } }) # build lists of terms with result 0 (negative terms) # and terms with result 1 (positive term) posTerms <- c() negTerms <- c() defaultValue <- NA for (term in functionTerms) { if (term$term != "") { if (term$outputLevel == 0) { negTerms <- c(negTerms, term$term) } else { posTerms <- c(posTerms, term$term) } } else defaultValue <- term$outputLevel } if (is.na(defaultValue)) stop("Missing default term in transition!") if (defaultValue == 0) # if the default is 0, the result is a DNF of the positive terms { if (length(posTerms) > 0) totalTerm <- paste(posTerms, collapse=" | ") else totalTerm <- "0" if (length(negTerms) > 0) # if the default value is 0, additional negative terms are ignored, # as they should be part of the default value # (otherwise this is a contradiction to the positive terms) warning("Potentially contradictory terms in a transition have been ignored!") } else # if the default value is 1, the result is a negated DNF of the negative terms { if (length(negTerms) > 0) totalTerm <- paste("!(",paste(negTerms, collapse=" | "),")",sep="") else totalTerm <- "1" if (length(posTerms) > 0) # if the default value is 1, additional positive terms are ignored, # as they should be part of the default value # (otherwise this is a contradiction to the negative terms) warning("Potentially contradictory terms in a transition have been ignored!") } return(totalTerm) } # Recursively parse the MathML expression in <rootNode>. # Here, valid identifiers are the gene names in <names(genes)> # and the input thresholds in <names(inputThresholds)>, # which are replaced by the corresponding values. # Returns an R expression string representing the MathML expression. parseMathML <- function(rootNode, genes, inputThresholds) { name <- xmlName(rootNode) if (name == "apply") # a bracket { operator <- xmlName(xmlChildren(rootNode)[[1]]) children <- sapply(xmlChildren(rootNode)[-1],parseMathML, genes, inputThresholds) if (operator == "and" || operator == "times") { # treat "and" and "times" equally, but warn if (operator == "times") warning("Interpreting \"times\" operator as a logical \"and\"!") return(paste("(",paste(children, collapse = " & "),")",sep="")) } else if (operator == "or" || operator == "plus") { # treat "or" and "plus" equally, but warn if (operator == "plus") warning("Interpreting \"plus\" operator as a logical \"or\"!") return(paste("(",paste(children, collapse = " | "),")",sep="")) } else if (operator == "xor") { # convert XOR to a DNF by pasting all odd entries in the truth table tt <- allcombn(2, length(children)) - 1 tt <- apply(tt,1,function(x)sum(x) %/% 2 == 1) return(paste("(",getDNF(tt, children),")",sep="")) } else if (operator %in% c ("eq", "neq", "gt", "lt", "geq", "leq")) { # comparison operators have to be converted to Boolean logic if (length(children) != 2) stop(paste("Operator \"",operator,"\" requires two operands!",sep="")) # check which of the child expressions are constant isConst <- sapply(children,function(x) { check.integer(x) }) if (all(isConst)) # two constants are compared (this does not really make sense!) { children <- as.integer(children) return(as.integer(switch(operator, eq = {children[1] == children[2]}, neq = {children[1] != children[2]}, gt = {children[1] > children[2]}, lt = {children[1] < children[2]}, geq = {children[1] >= children[2]}, leq = {children[1] <= children[2]} ))) } else if (any(isConst)) # one constant and one variable are compared { constChild <- as.integer(children[isConst]) varChild <- children[!isConst] return(switch(operator, eq = { if (constChild == 1) varChild else paste("!",varChild,sep="") }, neq = { if (constChild == 0) varChild else paste("!",varChild,sep="") }, gt = { if (constChild == 1) "0" else varChild }, lt = { if (constChild == 0) "0" else paste("!",varChild,sep="") }, geq = { if (constChild == 0) "1" else varChild }, leq = { if (constChild == 1) "1" else paste("!",varChild,sep="") } )) } else # two variables are compared { return(switch(operator, eq = { paste("((",children[1]," & ",children[2],") | ", "(!",children[1]," & !",children[2],"))", sep="") }, neq = { paste("((",children[1]," & !",children[2],") | ", "(!",children[1]," & ",children[2],"))", sep="") }, gt = { paste("(",children[1]," & !",children[2],")", sep="") }, lt = { paste("(!",children[1]," & ",children[2],")", sep="") }, geq = { paste("(",children[1], " | !",children[2],")", sep="") }, leq = { paste("(!",children[1], " | ",children[2],")", sep="") } )) } } else if (operator == "not") { if (length(children) > 2) stop("Multiple arguments supplied to unary operator \"neg\"!") return(paste("!",children, sep="")) } else # an unsupported symbol has been specified stop(paste("Unsupported math symbol: ", operator,"!",sep="")) } else if (name == "ci") # this is a gene identifier or a threshold level { id <- trim(xmlValue(rootNode)) if (!(id %in% names(genes))) { if (!(id %in% names(inputThresholds))) # neither threshold identifier nor gene stop(paste("Unspecified input \"",id,"\" in transition function!",sep="")) else # this is a threshold identifier return(inputThresholds[id]) } # this is a gene return(genes[id]) } else if (name == "cn") # this is a constant { # convert value and ensure it is Boolean attrs <- xmlAttrs(rootNode) if (!is.null(attrs) && !is.na(attrs["type"]) && tolower(attrs["type"]) != "integer") stop("\"cn\" nodes must be of type \"integer\"!") val <- trim(xmlValue(rootNode)) if (!check.integer(val) || !(as.integer(val) %in% c(0,1))) stop("\"cn\" nodes must be 0 or 1!") return(val) } else if (name == "true") return("1") else if (name == "false") return("0") else # an unsupported symbol has been specified stop(paste("Unsupported math symbol: ", name,"!",sep="")) } # Import the sbml-qual document <file> loadSBML <- function(file) { if (!require(XML)) stop("Please install the XML package before using this function!") # load XML document doc <- xmlRoot(xmlParse(file)) # remove comments from the document suppressWarnings(comments <- getNodeSet(doc,"//comment()")) if (length(comments) > 0) removeNodes(comments) # do various checks to ensure this is an sbml-qual document if (xmlName(doc) != "sbml") stop("Not an SBML document!") if (as.integer(xmlAttrs(doc)["level"]) > 3 || as.integer(xmlAttrs(doc)["version"]) > 1) warning("This import is designed for documents up to SBML level 3 version 1!") if (is.null(xmlNamespaces(doc)$qual)) stop("This document does not import the sbml-qual package!") model <- xmlFindNode(doc, "model", throwError=TRUE)[[1]] # compartments are ignored # parse species species <- xmlFindNode(model, "listOfQualitativeSpecies", throwError=TRUE)[[1]] genes <- parseSBMLSpecies(species) # parse transitions transitions <- xmlFindNode(model, "listOfTransitions", throwError=TRUE)[[1]] interactions <- parseSBMLTransitions(transitions, genes) # create BooleanNetwork structure res <- list(genes = genes$genes, fixed = sapply(interactions,function(i) { if (i$input[1] == 0) i$func[1] else -1 }), interactions = interactions) class(res) <- "BooleanNetwork" return(res) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/loadNetwork.R�����������������������������������������������������������������������������0000654�0001762�0000144�00000007236�12122071020�014425� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Load a network in a specified rule description language # from file <file>. # <bodySeparator> is the character that separates targets and factors # <lowercaseGenes> specifies whether gene names are converted to lower case loadNetwork <- function(file, bodySeparator=",", lowercaseGenes=FALSE) { op <- c("!","&", "\\|", "\\(", "\\)") func <- readLines(file,-1)[-1] func <- func[sapply(func, function(str)substr(str,1,1) != "#")] if (lowercaseGenes) func <- tolower(func) func <- func[nchar(func) > 0] # / in a gene name disturbs parsing func <- gsub("/","_",func) tmp <- unname(lapply(func,function(x){strsplit(x,bodySeparator)[[1]]})) targets <- sapply(tmp,function(rule)rule[1]) factors <- sapply(tmp,function(rule)rule[2]) probabilities <- sapply(tmp,function(rule) { if (length(rule) >= 3) as.numeric(rule[3]) else 1.0 }) factors.tmp <- lapply(factors,function(x) # extract gene names from Boolean expressions { # replace operators by spaces sapply(op,function(y) { x <<- gsub(y," ",x) }) # create a list of involved factors tmp <- strsplit(x," ")[[1]] tmp <- unique(tmp[tmp != ""]) }) # create list of all gene names in both sides of the functions genes <- unique(c(targets,unname(unlist(factors.tmp)))) isProbabilistic <- (length(unique(targets)) < length(targets)) # extract "real" gene names from the list, drop constants suppressWarnings(genes <- genes[is.na(as.integer(genes))]) fixed <- rep(-1,length(genes)) names(fixed) <- genes interactions <- list() for(i in 1:length(targets)) { target <- targets[i] inputGenes <- factors.tmp[[i]] interaction <- list() if(suppressWarnings(is.na(as.integer(inputGenes[1])))) # the input is not a number { interaction <- generateInteraction(factors[i], inputGenes, genes) } else # this is a constant gene { if (!isProbabilistic) fixed[target] <- as.integer(inputGenes) interaction <- list(input=0,func=as.integer(inputGenes),expression = inputGenes) } if (isProbabilistic) { interaction$probability <- probabilities[i] interactions[[target]][[length(interactions[[target]]) + 1]] <- interaction } else interactions[[target]] <- interaction } onlyInputs <- setdiff(genes,targets) if(length(onlyInputs) > 0) # some genes are only used as inputs, but are not involved in the network # -> create dummy input and function { for(gene in onlyInputs) { warning(paste("There is no transition function for gene \"", gene,"\"! Assuming an input!",sep="")) if (isProbabilistic) interactions[[gene]][[1]] = list(list(input = length(interactions)+1,func=c(0,1), expression = gene)) else interactions[[gene]] = list(input = length(interactions)+1,func=c(0,1), expression = gene) } } if (isProbabilistic) { wrongProb <- sapply(interactions,function(interaction) abs(1.0-sum(sapply(interaction,function(func)func$probability))) > 0.0001) if (any(wrongProb)) stop(paste("The probabilities of gene(s) ",paste(genes[wrongProb],collapse=", ")," do not sum up to 1!",sep="")) } res <- list(interactions = interactions, genes = genes, fixed = fixed) if (isProbabilistic) class(res) <- c("ProbabilisticBooleanNetwork","BooleanNetworkCollection") else class(res) <- "BooleanNetwork" return(res) } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/loadBioTapestry.R�������������������������������������������������������������������������0000654�0001762�0000144�00000020625�12122071020�015236� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Parse all nodes in <rootNode> # (i.e., all nodes of a certain type), # and write them to a list parseGeneAttrs <- function(rootNode) { i <- 0 res <- xmlApply(rootNode,function(child) { i <<- i + 1 attrs <- xmlAttrs(child) name <- unname(attrs["name"]) if (name == "" | is.na(name)) name <- paste(xmlName(child),i,sep="_") # find the "simulationLogic" node, which contains # the necessary logic information logic <- xmlFindNode(child,"simulationLogic") initVal <- NULL if (is.null(logic)) { warning(paste("Gene ",name," does not specify a simulation logic, assuming AND!",sep="")) logic <- "AND" } else { # try to find initial values in the simulation parameters logic <- logic[[1]] params <- xmlFindNode(logic,"simParameters") if (!is.null(params)) { for (param in xmlChildren(params[[1]])) { pa <- xmlAttrs(param) if (pa["name"] == "initVal") { initVal <- as.numeric(pa["value"]) if (initVal != 0 & initVal != 1) # only 0 and 1 are allowed for the initialization { warning("Initial value for gene ",name," is neither 0 nor 1 and is ignored!",sep="") initVal <- NULL } break } } } # get the Boolean function of the node logic <- unname(xmlAttrs(logic)["type"]) } list(id=unname(attrs["id"]),name=name,logic=logic,initVal=initVal,inputs=NULL) }) } # Parse all types of nodes (genes, signals, etc) parseAllGenes <- function(rootNode) { genes <- unlist(xmlApply(rootNode,parseGeneAttrs),recursive=FALSE) names(genes) <- lapply(genes,function(gene)gene$id) return(genes) } # Parse the links in the children of <node> and insert them # into the input lists of the genes parseAllLinks <- function(rootNode,geneList) { for (link in xmlChildren(rootNode)) { attrs <- xmlAttrs(link) if (is.na(attrs["sign"])) # a link with unspecified direction (inhibition or activation) was found { warning(paste("The link between \"",geneList[[attrs["src"]]]$name, "\" and \"",geneList[[attrs["targ"]]]$name, "\" is not specified as an enhancer or suppressor and is therefore ignored!",sep="")) } else { geneList[[attrs["targ"]]]$input[[length(geneList[[attrs["targ"]]]$input) + 1]] <- list(input=unname(attrs["src"]),sign=attrs["sign"]) } } return(geneList) } # Load a BioTapestry file (*.btp) from <file> # and convert it to a Boolean network loadBioTapestry <- function(file) { if (!require(XML)) stop("Please install the XML package before using this function!") doc <- xmlRoot(xmlTreeParse(file)) # detect the "genome" XML node which holds the nodes and links of the network genome <- xmlFindNode(doc,"genome",throwError=TRUE)[[1]] # find the "nodes" node that contains all genes/inputs/etc nodes <- xmlFindNode(genome,"nodes",throwError=TRUE)[[1]] # read in genes geneList <- parseAllGenes(nodes) # find the "links" node that contains the links/dependencies links <- xmlFindNode(genome,"links",throwError=TRUE)[[1]] # add links to gene list geneList <- parseAllLinks(links,geneList) # build up network structure genes <- unname(sapply(geneList,function(gene)gene$name)) geneIds <- names(geneList) fixed <- rep(-1,length(genes)) i <- 0 interactions <- lapply(geneList,function(gene) { i <<- i + 1 input <- sapply(gene$input,function(inp) { which(geneIds == inp$input) }) if (length(input) == 0) { if (!is.null(gene$initVal)) # input-only gene without fixed value (=> depending on itself) { input <- 0 func <- gene$initVal fixed[i] <<- func expr <- func } else # input-only gene with fixed value { input <- i func <- c(0,1) expr <- gene$name } } else # dependent gene { # determine signs/negations of genes inputSigns <- sapply(gene$input,function(inp)inp$sign) tt <- as.matrix(allcombn(2,length(input)) - 1) func <- as.integer(switch(gene$logic, AND = { # calculate truth table for AND apply(tt,1,function(assignment) { res <- 1 for (i in 1:length(assignment)) { if (inputSigns[i] == "+") res <- res & assignment[i] else res <- res & !assignment[i] if (!res) break } res }) }, OR = { # calculate truth table for OR apply(tt,1,function(assignment) { res <- 0 for (i in 1:length(assignment)) { if (inputSigns[i] == "+") res <- res | assignment[i] else res <- res | !assignment[i] if (res) break } res }) }, XOR = { # calculate truth table for XOR apply(tt,1,function(assignment) { res <- assignment[1] for (i in 2:length(assignment)) { res <- xor(res,assignment[i]) } res }) }, stop(paste("Unknown Boolean operator \"",gene$logic,"\"!",sep="")) )) # get string representation of the input gene literals literals <- mapply(function(gene,sign) { if (sign == "+") gene else paste("!",gene,sep="") }, genes[input], inputSigns) # get string representation of function expr <- switch(gene$logic, AND = { paste(literals,collapse=" & ") }, OR = { paste(literals,collapse=" | ") }, XOR = { getDNF(func,genes[input]) } ) } return(list(input=input,func=func,expression=expr)) }) names(interactions) <- genes names(fixed) <- genes net <- list(genes=genes,interactions=interactions,fixed=fixed) class(net) <- "BooleanNetwork" return(net) } �����������������������������������������������������������������������������������������������������������BoolNet/R/helpers.R���������������������������������������������������������������������������������0000654�0001762�0000144�00000022276�12122071020�013577� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Encode a vector of binary values <bin> with <len> bits # to a decimal number bin2dec <- function(bin,len) { if (len %% 32 == 0) numElts <- as.integer(len / 32) else numElts <- as.integer(len / 32) + 1 dec = rep(0,numElts) dec = .C("bin2dec",as.integer(dec),as.integer(bin),as.integer(len))[[1]] } # Decode the <len> low-order bits of <dec> to a vector of binary values, # where the first entry is the least significant bit dec2bin <- function(dec,len) { bin = rep(0,len) bin = .C("dec2bin",as.integer(bin),as.integer(dec),as.integer(len),NAOK=TRUE)[[1]] } # Generate a list of all assignments of n variables with N possible values allcombn <- function(N,n) { rownum = N^n sapply(n:1,function(i) { rep(1:N,each=N^(i-1),len=rownum) }) } # Get DNF representation of a truth table <truthTable> # using the gene names in <genes>. # If <mode> is "canonical", build a canonical DNF. # If <mode> is "short", join terms to reduce the DNF getDNF <- function(truthTable, genes, mode = c("short","canonical")) { if (mode[1] == TRUE) mode <- (if (length(genes) <= 12) "short" else "canonical") mode <- match.arg(mode, c("short","canonical")) # check for constant functions if (isTRUE(all.equal(truthTable,rep(0,length(truthTable))))) return("0") else if (isTRUE(all.equal(truthTable,rep(1,length(truthTable))))) return("1") # generate truth table entries <- allcombn(2,length(genes)) - 1 colnames(entries) <- genes if (mode == "short") { # heuristic minimization # the 1 terms that need to be covered uncoveredEntries <- which(truthTable == 1) # current conjunction list conjunctions <- list() while (length(uncoveredEntries) > 0) { # take an uncovered entry and expand it currentEntry <- entries[uncoveredEntries[1],] for (gene in genes) # test for each gene whether it can be eliminated from the term { geneIdx <- which(names(currentEntry) == gene) candidate <- currentEntry[-geneIdx] condition <- rep(TRUE,length(truthTable)) for (i in seq_along(candidate)) { condition <- condition & (entries[,names(candidate)[i]] == candidate[i]) } if (length(unique(truthTable[condition])) == 1) # eliminate gene currentEntry <- currentEntry[-geneIdx] } # determine which truth table result entries are now covered eliminatedEntries <- rep(TRUE,length(truthTable)) for (i in seq_along(currentEntry)) { eliminatedEntries <- eliminatedEntries & (entries[,names(currentEntry)[i]] == currentEntry[i]) } uncoveredEntries <- setdiff(uncoveredEntries, which(eliminatedEntries)) # remember conjunction conjunctions <- c(conjunctions, list(currentEntry)) } return(paste(paste("(",sapply(conjunctions, function(conj) { paste(mapply(function(gene, val) { if (val == 1) return(gene) else return(paste("!",gene,sep="")) }, names(conj), conj), collapse=" & ") }), ")", sep=""), collapse=" | ")) } else { # canonical DNF conjunctions <- apply(entries[truthTable==1,,drop=FALSE],1,function(conj) { paste("(",paste(sapply(seq_along(conj),function(lit) { if (conj[lit]) genes[lit] else paste("!",genes[lit],sep="") }),collapse=" & "),")",sep="") }) return(paste(conjunctions[conjunctions != ""],collapse = " | ")) } } # Retrieves a string representation of an interaction function by either # building a DNF (if <readableFunction> is false) # or returning an unspecific function description # (if <readableFunction> is true or "canonical" or "short"). # <truthTable> contains the result column of the interaction's truth table, and # <genes> contains the names of the involved genes. getInteractionString <- function(readableFunctions,truthTable,genes) { if (readableFunctions != FALSE) getDNF(truthTable,genes, readableFunctions) else { if (isTRUE(all.equal(truthTable,rep(0,length(truthTable))))) return("0") else if (isTRUE(all.equal(truthTable,rep(1,length(truthTable))))) return("1") else paste("<f(", paste(genes,collapse=","),"){", paste(truthTable,collapse=""),"}>", sep="") } } # Retrieves an internal graph representation of a state table # in <attractorInfo> # The vertices are the states, and the edges are the transitions. # Returns a list with a $vertices vector and a 2-column $edges matrix. getStateGraphStructure <- function(attractorInfo) { numRows <- ncol(attractorInfo$stateInfo$table) fixedGenes <- which(attractorInfo$stateInfo$fixedGenes != -1) nonFixedGenes <- which(attractorInfo$stateInfo$fixedGenes == -1) if (is.null(attractorInfo$stateInfo$initialStates)) { inputStates <- matrix(ncol=length(attractorInfo$stateInfo$genes),nrow=2^length(nonFixedGenes)) # encode the initial states # first, encode the changing part by calculating all combinations temp <- allcombn(2,length(nonFixedGenes)) - 1 inputStates[,nonFixedGenes] <- temp[,ncol(temp):1] if (length(fixedGenes) > 0) # if there are fixed genes, encode their values inputStates[,fixedGenes] <- sapply(attractorInfo$stateInfo$fixedGenes[fixedGenes], function(value)rep(value,2^length(nonFixedGenes))) } else { inputStates <- t(apply(attractorInfo$stateInfo$initialStates,2,dec2bin,length(attractorInfo$stateInfo$genes))) } inputStates <- apply(inputStates,1,function(state)paste(state,collapse="")) # build "hash table" of state numbers stateHash <- 1:length(inputStates) names(stateHash) <- inputStates # encode output states outputStates <- apply(attractorInfo$stateInfo$table,2,function(state) { bin <- paste(dec2bin(state,length(attractorInfo$stateInfo$genes)),collapse="") }) return(list(vertices=inputStates,edges=cbind(1:length(inputStates), sapply(outputStates,function(state)stateHash[state])))) } # Reorders a matrix of states <stateMatrix> (with each column being one state) # in a canonical way such that the "smallest" state is the first. # This makes attractor representations unique. canonicalStateOrder <- function(stateMatrix) { smallestIndex <- -1 smallestVal <- rep(Inf,nrow(stateMatrix)) for (i in 1:ncol(stateMatrix)) # iterate over states { for (j in 1:nrow(stateMatrix)) # iterate over elements of encoded state { if (stateMatrix[j,i] < smallestVal[j]) # determine new minimum { smallestVal <- stateMatrix[,i] smallestIndex <- i break } else { if (stateMatrix[j,i] > smallestVal[j]) break } } } if (smallestIndex != 1) # rearrange matrix return(cbind(stateMatrix[,smallestIndex:ncol(stateMatrix),drop=FALSE], stateMatrix[,(1:(smallestIndex-1)),drop=FALSE])) else return(stateMatrix) } # Find a child node named <name> # of <node>, or return NULL if such a node # does not exist. # If <throwError>, throw an error if the node does not exist. xmlFindNode <- function(node,name,throwError=FALSE) { indices <- which(xmlSApply(node, xmlName) == name) if (length(indices) == 0) { if (throwError) stop(paste("Node \"",name,"\" is required, but missing!", sep="")) else return(NULL) } return(xmlChildren(node)[indices]) } # Remove leading and trailing whitespace characters from <string> trim <- function(string) { string <- gsub("^[ ]+", "", string) string <- gsub("[ ]+$", "", string) return(string) } # Generate an interaction by parsing <expressionString> # and building the corresponding truth table. # Here, <inputGenes> are the names of the inputs, # and <allGenes> is a list of all genes in the network. # Returns an interaction as used in the BooleanNetwork class. generateInteraction <- function(expressionString, inputGenes, allGenes) { # strip leading and trailing whitespace characters expressionString <- trim(expressionString) if (length(inputGenes) > 0) { inputIndices <- match(inputGenes, allGenes) names(inputIndices) <- inputGenes inputIndices <- sort(inputIndices) truthTable <- as.matrix(allcombn(2,length(inputIndices)) - 1) for (gene in inputGenes) { assign(gene, truthTable[,which(names(inputIndices) == gene)]) } } else inputIndices <- 0 tryCatch( interaction <- list(input = unname(inputIndices), func = as.numeric(eval(parse(text=expressionString))), expression = expressionString), error = function(err) { stop(paste("An error was detected while parsing an expression: ", err$message, "\nExpression: \"", expressionString,"\"", sep="")) }) if (length(interaction$func) == 1 && length(inputGenes) > 0) { warning("There seems to be a constant function that has specified inputs!") interaction$func <- rep(interaction$func, nrow(truthTable)) } return(interaction) } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/getTransitionTable.R����������������������������������������������������������������������0000654�0001762�0000144�00000003576�12122071020�015741� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Retrieves the transition table of an AttractorInfo structure # in a readable way getTransitionTable <- function(attractorInfo) { stopifnot(inherits(attractorInfo,"AttractorInfo")) if (is.null(attractorInfo$stateInfo$table)) stop(paste("This AttractorInfo structure does not contain transition table information.", "Please re-run getAttractors() with a synchronous search and returnTable=TRUE!")) return(.internal.getTransitionTable(attractorInfo$stateInfo)) } # Internally used to extract the information from the <stateInfo> subcomponent # of AttractorInfo .internal.getTransitionTable <- function(stateInfo) { fixedGenes <- which(stateInfo$fixedGenes != -1) nonFixedGenes <- which(stateInfo$fixedGenes == -1) if (!is.null(stateInfo$initialStates)) { initialStates <- t(apply(stateInfo$initialStates,2,dec2bin,length(stateInfo$genes))) } else { initialStates <- matrix(ncol=length(stateInfo$genes),nrow=2^length(nonFixedGenes)) # encode the initial states # first, encode the changing part by calculating all combinations temp <- allcombn(2,length(nonFixedGenes)) - 1 initialStates[,nonFixedGenes] <- temp[,ncol(temp):1] if (length(fixedGenes) > 0) # if there are fixed genes, encode their values initialStates[,fixedGenes] <- sapply(stateInfo$fixedGenes[fixedGenes], function(value)rep(value,2^length(nonFixedGenes))) } # build return structure of class TransitionTable res <- data.frame(initialStates, t(apply(stateInfo$table,2,dec2bin,length(stateInfo$genes))), stateInfo$attractorAssignment,stateInfo$stepsToAttractor) colnames(res) <- c(paste("initialState.",stateInfo$genes,sep=""), paste("nextState.",stateInfo$genes,sep=""), "attractorAssignment","transitionsToAttractor") class(res) <- c("TransitionTable","data.frame") return(res) } ����������������������������������������������������������������������������������������������������������������������������������BoolNet/R/getTransitionProbabilities.R��������������������������������������������������������������0000654�0001762�0000144�00000001777�12122071020�017503� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Builds a matrix of transitions and their probabilities from <markovSimulation> getTransitionProbabilities <- function(markovSimulation) { stopifnot(inherits(markovSimulation,"MarkovSimulation")) if (is.null(markovSimulation$table)) stop(paste("The supplied simulation result does not contain transition information.", "Please re-run markovSimulation() with returnTable=TRUE!")) initialStates <- t(apply(markovSimulation$table$initialStates,2,dec2bin,length(markovSimulation$genes))) nextStates <- t(apply(markovSimulation$table$nextStates,2,dec2bin,length(markovSimulation$genes))) idx <- order(apply(initialStates,1,function(x)paste(x,collapse=""))) res <- data.frame(initialStates,nextStates,markovSimulation$table$probabilities) res <- res[idx,] rownames(res) <- NULL colnames(res) <- c(paste("initialState.",markovSimulation$genes,sep=""), paste("nextState.",markovSimulation$genes,sep=""), "probability") return(res) } �BoolNet/R/getStateSummary.R�������������������������������������������������������������������������0000654�0001762�0000144�00000003726�12122071020�015272� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Summarize information on a state <state>, specified as a vector of # Boolean values. Information is taken from the state tables in <attractorInfo>. # The function outputs the corresponding attractor, the distance to the basin, # and the next state. getStateSummary <- function(attractorInfo,state) { stopifnot(inherits(attractorInfo,"AttractorInfo")) if (length(state) != length(attractorInfo$stateInfo$genes)) stop("State must have one element for each gene!") if (is.null(attractorInfo$stateInfo$table)) stop(paste("This AttractorInfo structure does not contain transition table information.", "Please re-run getAttractors() with a synchronous search and returnTable=TRUE!")) if (!is.null(attractorInfo$stateInfo$initialStates)) { stateNo <- bin2dec(state,length(state)) # search element in initial state index stateNo <- which(apply(attractorInfo$stateInfo$initialStates,2,function(x) { isTRUE(all.equal(x,stateNo)) })) } else { # find out the decimal number of the state which is used in the # transition table shortenedState <- state[attractorInfo$stateInfo$fixedGenes == -1] # simply use <stateNo>-th elements if initial states are not provided stateNo <- bin2dec(shortenedState,length(shortenedState)) + 1 } # coerce summary into a one-row dataframe, i.e. create a # TransitionTable object with one element res <- as.data.frame(as.list(unlist(list(state, dec2bin(attractorInfo$stateInfo$table[,stateNo], length(attractorInfo$stateInfo$genes)), attractorInfo$stateInfo$attractorAssignment[stateNo], attractorInfo$stateInfo$stepsToAttractor[stateNo])))) colnames(res) <- c(paste("initialState.",attractorInfo$stateInfo$genes,sep=""), paste("nextState.",attractorInfo$stateInfo$genes,sep=""), "attractorAssignment","transitionsToAttractor") class(res) <- c("TransitionTable","data.frame") return(res) } ������������������������������������������BoolNet/R/getPathToAttractor.R����������������������������������������������������������������������0000654�0001762�0000144�00000004051�12122071020�015707� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������getPathToAttractor <- function(network, state, includeAttractorStates=c("all","first","none")) { stopifnot(inherits(network,"BooleanNetwork") | inherits(network, "AttractorInfo")) if (inherits(network,"BooleanNetwork")) { table <- getTransitionTable(getAttractors(network, startStates=list(state))) } else { if (is.null(network$stateInfo$table)) stop(paste("This AttractorInfo structure does not contain transition table information.", "Please re-run getAttractors() with a synchronous search and returnTable=TRUE!")) table <- getTransitionTable(network) } includeAttractorStates <- match.arg(includeAttractorStates, c("all","first","none")) numGenes <- (ncol(table) - 2) / 2 initialStates <- apply(table[,1:numGenes,drop=FALSE],1,function(x)paste(x,collapse="")) currentState <- state res <- data.frame(matrix(state,nrow=1)) stateCount <- 1 repeat { currentStateIdx <- which(initialStates == paste(currentState,collapse="")) if (length(currentStateIdx) == 0) stop(paste("Could not find state",paste(currentState,collapse=""),"in the transition table!")) # stop depending on "includeAttractorStates" option if ((includeAttractorStates == "all" && stateCount == nrow(table)) || (includeAttractorStates == "first" && table[currentStateIdx,"transitionsToAttractor"] == 0) || (includeAttractorStates == "none" && table[currentStateIdx,"transitionsToAttractor"] <= 1)) break currentState <- as.integer(table[currentStateIdx,(numGenes+1):(2*numGenes)]) res <- rbind(res,currentState) stateCount <- stateCount + 1 } # special case: start state is attractor state and we do not want to include attractor states # => return empty data frame if (includeAttractorStates == "none" && table[currentStateIdx,"transitionsToAttractor"] == 0) { res <- data.frame(matrix(nrow=0,ncol=numGenes)) } colnames(res) <- sapply(colnames(table)[1:numGenes],function(n)strsplit(n,".",fixed=TRUE)[[1]][2]) rownames(res) <- NULL return(res) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/getBasinOfAttraction.R��������������������������������������������������������������������0000654�0001762�0000144�00000001311�12122071020�016172� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Determine the basin of attraction of attractor <attractorNo> in <attractorInfo>. getBasinOfAttraction <- function(attractorInfo,attractorNo) { stopifnot(inherits(attractorInfo,"AttractorInfo")) if (is.null(attractorInfo$stateInfo$table)) stop(paste("This AttractorInfo structure does not contain transition table information.", "Please re-run getAttractors() with a synchronous search and returnTable=TRUE!")) if (missing(attractorNo) || attractorNo <= 0 || attractorNo > length(attractorInfo$attractors)) stop("Please provide a valid attractor number!") table <- getTransitionTable(attractorInfo) return(table[which(table$attractorAssignment == attractorNo),,drop=FALSE]) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/getAttractorSequence.R��������������������������������������������������������������������0000654�0001762�0000144�00000001476�12122071020�016270� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ getAttractorSequence <- function(attractorInfo, attractorNo) { stopifnot(inherits(attractorInfo,"AttractorInfo")) if (missing(attractorNo) || attractorNo <= 0 || attractorNo > length(attractorInfo$attractors)) stop("Please provide a valid attractor number!") if (!is.null(attractorInfo$attractors[[attractorNo]]$initialStates)) stop("A sequence can be obtained for synchronous attractors only!") numGenes <- length(attractorInfo$stateInfo$genes) # decode binary representation of states involved in the attractors binMatrix <- t(matrix(apply(attractorInfo$attractors[[attractorNo]]$involvedStates,2,function(state) dec2bin(state,numGenes)),nrow=numGenes)) colnames(binMatrix) <- attractorInfo$stateInfo$genes return(as.data.frame(binMatrix)) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/getAttractors.R���������������������������������������������������������������������������0000654�0001762�0000144�00000023443�12122071020�014760� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Identify attractors in a Boolean network. # <network> is a BooleanNetwork structure specifying the network. # <method> specifies what kind of search is conducted: "exhaustive" performs a full search over all states, # "random" generates <startStates> random initial states, and "chosen" uses the states supplied in <startStates>. # <genesON> and <genesOFF> are lists of genes to be set to ON/1 or OFF/0 respectively. # If <canonical> is true, states in the attractors are reordered such that the "smallest" state is the first getAttractors <- function (network, type=c("synchronous","asynchronous"), method=c("exhaustive","random","chosen"), startStates=list(), genesON = c(), genesOFF = c(), canonical=TRUE, randomChainLength = 10000, avoidSelfLoops = TRUE, geneProbabilities = NULL, returnTable=TRUE) { stopifnot(inherits(network,"BooleanNetwork")) if (match.arg(type) == "asynchronous" & length(method) == 1 & match.arg(method) == "exhaustive") stop("Asynchronous attractor search cannot be performed in exhaustive search mode!") if (match.arg(type) == "asynchronous" & length(geneProbabilities) > 0 ) { if (length(geneProbabilities) != length(network$genes)) stop("Please supply exactly one probability for each gene!") if (abs(1.0 - sum(geneProbabilities)) > 0.0001) stop("The supplied gene probabilities do not sum up to 1!") } if (length(method) == 3) # if no method is supplied, infer method from the type of <startStates> { if (match.arg(type) == "asynchronous" & length(startStates) == 0) { startStates <- max(round(2 ^ sum(network$fixed == -1) / 20), 5) method = "random" } else if (is.numeric(startStates)) { if (length(startStates) > 1) stop("Please supply either the number of start states or a list of start states in startStates!") else method <- "random" } else if (is.list(startStates) & (length(startStates) > 0)) method = "chosen" else method = "exhaustive" } if ((length(network$genes) > 29) & (match.arg(method) == "exhaustive") & (match.arg(type) == "synchronous")) stop(paste("An exhaustive attractor search is not supported for networks with more than 29 genes!", "Please use a heuristic method or provide start states!")) # fix genes according to genesON and genesOFF if (length(genesON) > 0) { network <- fixGenes(network,genesON,1) } if (length(genesOFF) > 0) { network <- fixGenes(network,genesOFF,0) } fixedPositions <- which(network$fixed != -1) nonFixedPositions <- which(network$fixed == -1) startStates <- switch(match.arg(method,c("exhaustive","random","chosen")), exhaustive = list(), random = { if (!is.numeric(startStates)) stop("Please supply the number of random states in startStates!") if (startStates > (2 ^ length(nonFixedPositions))) # more start states than in the full network { if (match.arg(type) == "synchronous") { list() warning(paste("The number of random states is set larger than the total", "number of states. Performing an exhaustive search!")) } else { warning(paste("The number of random states is set larger than the total ", "number of states! The maximum number of different states is ",2 ^ length(nonFixedPositions)),"!",sep="") startStates = 2 ^ length(nonFixedPositions) } } if (startStates <= (2 ^ length(nonFixedPositions))) # generate random matrix { mat <- matrix(nrow=startStates,ncol=length(network$genes)) if (length(fixedPositions) != 0) # fill fixed positions with the corresponding values mat[,fixedPositions] <- sapply(fixedPositions,function(x) rep(network$fixed[x],startStates)) # generate other positions randomly mat[,nonFixedPositions] <- round(runif(n=startStates*length(nonFixedPositions))) # eliminate duplicates mat <- unique(mat) while (nrow(mat) != startStates) # if duplicates were removed, generate new states until the # desired number of states is reached { vec <- rep(0,length(network$genes)) if (length(fixedPositions) != 0) # fill fixed positions vec[fixedPositions] <- sapply(fixedPositions, function(x)network$fixed[x]) # generate other positions randomly vec[nonFixedPositions] <- round(runif(n=length(nonFixedPositions))) mat <- unique(rbind(mat,vec)) } cat("Using initial states:\n") # print states and form a list res <- lapply(1:nrow(mat),function(i) { cat(paste(mat[i,],collapse=""),"\n",sep="") mat[i,] }) cat("\n") res } }, chosen = { if (!is.list(startStates) | length(startStates) == 0) stop("No start states supplied!") if (!all(sapply(startStates,function(x)(length(x) == length(network$genes))))) stop(paste("Please provide binary vectors with",length(network$genes), "elements in startStates!")) fixedPositions <- which(network$fixed != -1) fixedGenes <- which(network$fixed != -1) statesValid <- sapply(startStates,function(state) { isTRUE(all(state[fixedGenes] == network$fixed[fixedGenes])) }) startStates <- startStates[statesValid] if (!any(statesValid)) stop("None of the supplied start states matched the restrictions of the fixed genes!") if (!all(statesValid)) warning("Some of the supplied start states did not match the restrictions of the fixed genes and were removed!") startStates } ) specialInitialization <- NULL convertedStartStates <- NULL if (length(startStates) > 0) convertedStartStates <- sapply(startStates,function(x)bin2dec(x,length(network$genes))) # the C code requires all interactions to be coded into one vector: # Assemble all input gene lists in one list <inputGenes>, and remember the split positions in <inputGenePositions>. inputGenes <- as.integer(unlist(lapply(network$interactions,function(interaction)interaction$input))) inputGenePositions <- as.integer(cumsum(c(0,sapply(network$interactions, function(interaction)length(interaction$input))))) # Do the same for the transition functions. transitionFunctions <- as.integer(unlist(lapply(network$interactions,function(interaction)interaction$func))) transitionFunctionPositions <- as.integer(cumsum(c(0,sapply(network$interactions, function(interaction)length(interaction$func))))) networkType <- switch(match.arg(type,c("synchronous","asynchronous")), synchronous = 0, asynchronous = 1) on.exit(.C("freeAllMemory", PACKAGE = "BoolNet")) # Call the C code result <- .Call("getAttractors_R",inputGenes,inputGenePositions, transitionFunctions,transitionFunctionPositions, as.integer(network$fixed), as.integer(convertedStartStates), as.integer(networkType), as.double(geneProbabilities), as.integer(randomChainLength), as.integer(avoidSelfLoops), as.integer(returnTable), PACKAGE="BoolNet") if (is.null(result)) stop("An error occurred in external C code!") if (length(result$attractors) == 0) stop("getAttractors() was not able to identify any attractors! Please check the supplied parameters and restart!") if (length(network$genes) %% 32 == 0) numElementsPerEntry <- as.integer(length(network$genes) / 32) else numElementsPerEntry <- as.integer(length(network$genes) / 32 + 1) if (!is.null(result$stateInfo)) { result$stateInfo$table <- matrix(result$stateInfo$table,nrow=numElementsPerEntry) if (!is.null(result$stateInfo$initialStates)) result$stateInfo$initialStates <- matrix(result$stateInfo$initialStates,nrow=numElementsPerEntry) } for (i in 1:length(result$attractors)) { result$attractors[[i]]$involvedStates <- matrix(result$attractors[[i]]$involvedStates,nrow=numElementsPerEntry) if (canonical) # reorder states result$attractors[[i]]$involvedStates <- canonicalStateOrder(result$attractors[[i]]$involvedStates) if (!is.null(result$attractors[[i]]$initialStates)) result$attractors[[i]]$initialStates <- matrix(result$attractors[[i]]$initialStates,nrow=numElementsPerEntry) if (!is.null(result$attractors[[i]]$nextStates)) result$attractors[[i]]$nextStates <- matrix(result$attractors[[i]]$nextStates,nrow=numElementsPerEntry) if (result$attractors[[i]]$basinSize == 0) result$attractors[[i]]$basinSize <- NA } # order attractors according to their lengths attractorLengths <- sapply(result$attractors,function(attractor)ncol(attractor$involvedStates)) reordering <- order(attractorLengths) result$attractors <- result$attractors[reordering] if (!is.null(result$stateInfo)) { inverseOrder <- sapply(1:length(reordering),function(x)which(reordering == x)) result$stateInfo$attractorAssignment <- inverseOrder[result$stateInfo$attractorAssignment] } # extend the resulting structure by additional information, and assign a class result$stateInfo$genes <- network$genes result$stateInfo$fixedGenes <- network$fixed if (!is.null(result$stateInfo$table)) class(result$stateInfo) <- "BooleanStateInfo" class(result) <- "AttractorInfo" return(result) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/generateTimeSeries.R����������������������������������������������������������������������0000654�0001762�0000144�00000002547�12122071020�015720� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ # Generate time series from a Boolean network <network>. # <numSeries> is the number of start states for which time series are generated. # <numMeasurements> is the number of time points for each time series. # <type> is the type of transitions used (synchronous or asynchronous) # If <type> is "asynchronous", <geneProbabilities> describes the # transition probabilities for the genes. # If <noiseLevel> is not 0, Gaussian noise is added to the result. generateTimeSeries <- function(network, numSeries, numMeasurements, type = c("synchronous","asynchronous","probabilistic"), geneProbabilities, noiseLevel = 0.0) { if (missing(geneProbabilities)) geneProbabilities <- NULL ts <- lapply(1:numSeries, function(i) { startState <- round(runif(length(network$genes))) res <- startState for (j in 2:numMeasurements) { startState <- stateTransition(network, startState, type=type, geneProbabilities=geneProbabilities) res <- cbind(res,startState) } colnames(res) <- NULL if (noiseLevel != 0) { res <- res + matrix(rnorm(mean=0, sd=noiseLevel, n = length(res)), nrow=nrow(res)) } rownames(res) <- network$genes colnames(res) <- 1:ncol(res) return(res) }) return(ts) } ���������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/generateState.R���������������������������������������������������������������������������0000654�0001762�0000144�00000001133�12122071020�014715� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������generateState <- function(network, specs, default=0) { stopifnot(inherits(network,"ProbabilisticBooleanNetwork") | inherits(network,"BooleanNetworkCollection") | inherits(network,"BooleanNetwork")) if (!all(names(specs) %in% network$genes)) stop(paste("Undefined gene names:", paste(setdiff(names(specs), network$genes), collapse=", "))) if (!all(specs %in% c(0,1))) stop("Please provide only Boolean values!") state <- rep(default, length(network$genes)) names(state) <- network$genes state[names(specs)] <- specs return(state) } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/generateRandomNKNetwork.R�����������������������������������������������������������������0000654�0001762�0000144�00000010063�12122071020�016662� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������generateRandomNKNetwork <- function(n,k,topology=c("fixed","homogeneous","scale_free"), linkage=c("uniform","lattice"), functionGeneration=c("uniform","biased"), validationFunction, failureIterations=10000, simplify=FALSE, noIrrelevantGenes=TRUE, readableFunctions=FALSE, d_lattice=1, zeroBias=0.5, gamma=2.5, approx_cutoff=100) { k_i_vec <- switch(match.arg(topology), fixed = { if (length(k) == n) k else if (length(k) == 1) rep(k,n) else stop("k must have 1 or n element(s)!") }, homogeneous = round(rpois(n,k)), scale_free = rzeta(n,k,gamma=gamma,approx_cutoff=approx_cutoff), stop("'topology' must be one of \"fixed\",\"homogeneous\"") ) k_i_vec[k_i_vec > n] <- n if ((zeroBias == 0 | zeroBias == 1) & noIrrelevantGenes & any(k_i_vec > 0)) stop("If setting 'zeroBias' to 0 or 1, you must set 'noIrrelevantGenes' to FALSE!") geneNames <- paste("Gene",1:n,sep="") if (!missing(validationFunction)) validationFunction <- match.fun(validationFunction) else validationFunction <- NULL interactions <- mapply(function(i,k_i) { if (k_i == 0) { genes <- 0 func <- round(runif(min=0,max=1,n=1)) } else { table <- allcombn(2,k_i) - 1 genes <- switch(match.arg(linkage,c("uniform","lattice")), uniform = sample(1:n,k_i,replace=FALSE), lattice = { region <- c(max(1,round(i - k_i*d_lattice)):max(1,i-1), min(n,i+1):min(n,round(i + k_i*d_lattice))) sample(region,k_i,replace=FALSE) }, stop("'linkage' must be one of \"uniform\",\"lattice\"")) containsIrrelevant <- TRUE validFunction <- TRUE counter <- 0 while((!validFunction) || containsIrrelevant) { func <- switch(match.arg(functionGeneration,c("uniform","biased")), uniform = round(runif(min=0,max=1,n=2^k_i)), biased = as.integer(runif(min=0,max=1,n=2^k_i) > zeroBias), stop("'functionGeneration' must be one of \"uniform\",\"biased\"")) if (noIrrelevantGenes) { dropGenes <- apply(table,2,function(gene) # determine all genes that have no influence on the results, # i.e. the result column is equal for 0 values and 1 values { (identical(func[gene==1], func[gene==0])) }) containsIrrelevant <- (sum(dropGenes) > 0) } else containsIrrelevant <- FALSE if (!is.null(validationFunction)) validFunction <- validationFunction(table, func) counter <- counter + 1 if (counter > failureIterations) stop(paste("Could not find a transition function matching the restrictions of", "\"validationFunction\" in", failureIterations, " runs.", "Change \"validationFunction\" or increase \"failureIterations\"!")) } } return(list(input=genes,func=func, expression=getInteractionString(readableFunctions, func,geneNames[genes]))) },1:length(k_i_vec),k_i_vec,SIMPLIFY=FALSE) fixed <- sapply(interactions,function(i) { if (i$input[1] == 0) i$func[1] else -1 }) names(fixed) <- geneNames names(interactions) <- geneNames net <- list(genes=geneNames,interactions=interactions,fixed=fixed) class(net) <- "BooleanNetwork" if (simplify) net <- simplifyNetwork(net,readableFunctions) return(net) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/fixGenes.R��������������������������������������������������������������������������������0000654�0001762�0000144�00000001343�12122071020�013675� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Sets the genes in <fixIndices> to the values in <values> # and returns the customized copy of <network> fixGenes <- function(network,fixIndices,values) { stopifnot(inherits(network,"BooleanNetwork") | inherits(network,"ProbabilisticBooleanNetwork") | inherits(network,"BooleanNetworkCollection")) if (length(fixIndices) != length(values) && length(values) != 1) stop("fixIndices and values must have the same number of elements, or values must have 1 element!") if (any(is.na(network$fixed[fixIndices]))) stop("fixIndices contains invalid indices!") if (any(values != 0 & values != 1 & values != -1)) stop("Please supply only 0, 1, or -1 in values!") network$fixed[fixIndices] <- values return(network) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/edgeDetector.R����������������������������������������������������������������������������0000654�0001762�0000144�00000003471�12122071020�014527� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Provides several methods to binarize a vector consisting of real values. # The methods are edge-detector-based. With <edge>="firstEdge", # the first "significant" edge in the sorted data is the threshold for the binarization. # With the <scaling> factor, the size of the first edge can be adapted. # The "maxEdge" method searches for the edge with the highest gradient. edgeDetector <- function(vector,scaling=1,edge=c("firstEdge","maxEdge")) { distance<-c() binarizeddata<-vector #sort data sortedvector<-sort(vector) #distance calculation for(i in 1:(length(vector)-1)) { distance[i]<-sortedvector[i+1]-sortedvector[i] } switch(match.arg(edge), #the index of the first edge with distance[i]>threshold is determined firstEdge= { threshold<-scaling*((sortedvector[length(vector)]-sortedvector[1])/((length(vector)-1))) index <- 0 for(i in 1:(length(vector)-1)) { if(distance[i]>threshold) { index<-i break } } }, #the index of the edge with the maximal gradient is determined maxEdge= { index <- which.max(distance) }, stop("'method' must be one of \"firstEdge\",\"maxEdge\"") ) #based on the edge index, the binarization is performed if(index!=0) { for(i in 1:(length(vector))) { if(vector[i]>=sortedvector[index+1]) binarizeddata[i]<-1 else binarizeddata[i]<-0 } threshold=(sortedvector[index+1]+sortedvector[index])/2 return(list(bindata=binarizeddata,thresholds=as.numeric(threshold))) } else #if no edge was found, a vector consisting of zeros is returned { binarizeddata<-(sapply(vector,function(x) 0)) return(list(bindata=binarizeddata,thresholds=NA)) } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/chooseNetwork.R���������������������������������������������������������������������������0000654�0001762�0000144�00000001755�12122071020�014766� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Creates a deterministic Boolean network from a Probabilistic Boolean network # by choosing the functions specified in <functionIndices> from the # network <probabilisticNetwork>. chooseNetwork <- function(probabilisticNetwork,functionIndices) { stopifnot(inherits(probabilisticNetwork,"ProbabilisticBooleanNetwork") | inherits(probabilisticNetwork,"BooleanNetworkCollection")) if (length(functionIndices) != length(probabilisticNetwork$genes)) stop("Please provide a vector of function indices for each gene!") interactions <- mapply(function(interaction,index) { list(input=interaction[[index]]$input, func=interaction[[index]]$func, expression=interaction[[index]]$expression) }, probabilisticNetwork$interactions,functionIndices,SIMPLIFY=FALSE) res <- list(genes=probabilisticNetwork$genes, interactions=interactions, fixed=probabilisticNetwork$fixed) class(res) <- "BooleanNetwork" return(res) } �������������������BoolNet/R/binarizeTimeSeries.R����������������������������������������������������������������������0000654�0001762�0000144�00000017022�12122071020�015723� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Several binarization methods for time series. <measurements> is a list of matrices with the # genes in the rows, each specifying one time series. # If <method> is "kmeans", k-means binarization is used. # <nstart> and <iter.max> are the corresponding parameters for k-means. This clustering # is employed for binarization. # If <method> is "edgeDetector", an edge detector is used for binarization. # If <method> is "edgeDetector" and <edge> is "firstEdge", # the first "significant" edge in the sorted data is the threshold for the binarization. # If <edge> is "maxEdge", the algorithm searches for the edge with the highest gradient. # With the <scaling> factor, the size of the first edge can be adapted. # If <method> is "scanStatistic", a scan statistic is used to binarize the data # If <dropInsignificant> is true, insignificant genes (that are not recommended by the statistic) are removed. # Returns a list containing the binarized matrix list and (for k-means) a vector # of thresholds and (for scan statistic) a vector specifying genes to remove. binarizeTimeSeries <- function(measurements, method=c("kmeans","edgeDetector","scanStatistic"), nstart=100, iter.max=1000, edge=c("firstEdge","maxEdge"), scaling=1, windowSize=0.25, sign.level=0.1, dropInsignificant=FALSE) { if (!is.null(dim(measurements))) fullData <- measurements else # in case of list, paste all matrices before clustering { fullData <- measurements[[1]] for (m in measurements[-1]) { fullData <- cbind(fullData,m) } } #switch between the different methods switch(match.arg(method), kmeans={ cluster <- apply(fullData,1,function(gene) # cluster data using k-means { cl_res <- kmeans(gene, 2, nstart=nstart,iter.max=iter.max) if (cl_res$centers[1] > cl_res$centers[2]) # exchange clusters if necessary, so that smaller numbers # are binarized to 0, and larger numbers are binarized to 1 group <- abs(cl_res$cluster-2) else group <- cl_res$cluster-1 # calculate the binarization threshold threshold <- min(cl_res$centers) + dist(cl_res$centers)[1]/2 list(bin=group, threshold=threshold) }) if (is.null(dim(measurements))) # split up the collated binarized measurements into a list of matrices of the original size { startIndex <- 0 binarizedTimeSeries <- lapply(measurements,function(m) { currentSplit <- (startIndex+1):(startIndex+ncol(m)) startIndex <<- startIndex + ncol(m) t(sapply(cluster,function(cl) cl$bin[currentSplit])) }) } else { binarizedTimeSeries <- t(sapply(cluster,function(cl) cl$bin)) } #colnames(binarizedTimeSeries)<-colnames(fullData) return(list(binarizedMeasurements=binarizedTimeSeries, thresholds=sapply(cluster,function(cl)cl$threshold))) }, edgeDetector={ #switch between the different edgedetectors switch(match.arg(edge), firstEdge={ cluster <- apply(fullData,1,function(gene) # cluster data using edgedetector { cl_res <- edgeDetector(gene,scaling,edge="firstEdge") list(bin=cl_res$bindata,thresholds=cl_res$thresholds) }) if (is.null(dim(measurements))) # split up the collated binarized measurements into a list of matrices of the original size { startIndex <- 0 binarizedTimeSeries <- lapply(measurements,function(m) { currentSplit <- (startIndex+1):(startIndex+ncol(m)) startIndex <<- startIndex + ncol(m) t(sapply(cluster,function(cl) cl$bin[currentSplit])) }) threshlist<-sapply(cluster,function(cl) cl$thresholds) } else { binarizedTimeSeries <- t(sapply(cluster,function(cl) cl$bin)) threshlist<-sapply(cluster,function(cl) cl$thresholds) } return(list(binarizedMeasurements=binarizedTimeSeries,thresholds= threshlist)) }, maxEdge={ cluster <- apply(fullData,1,function(gene) # cluster data using edgedetector { cl_res <- edgeDetector(gene,edge="maxEdge") list(bin=cl_res$bindata,thresholds=cl_res$thresholds) }) if (is.null(dim(measurements))) # split up the collated binarized measurements into a list of matrices of the original size { startIndex <- 0 binarizedTimeSeries <- lapply(measurements,function(m) { currentSplit <- (startIndex+1):(startIndex+ncol(m)) startIndex <<- startIndex + ncol(m) t(sapply(cluster,function(cl) cl$bin[currentSplit])) }) threshlist<-sapply(cluster,function(cl) cl$thresholds) } else { binarizedTimeSeries <- t(sapply(cluster,function(cl) cl$bin)) threshlist<-sapply(cluster,function(cl) cl$thresholds) } return(list(binarizedMeasurements=binarizedTimeSeries,thresholds= threshlist)) }, stop("'method' must be one of \"firstEdge\",\"maxEdge\"") ) }, scanStatistic={ cluster <- apply(fullData,1,function(gene) # cluster data using scanStatistic { cl_res <- scanStatistic(gene,windowSize,sign.level) list(bin= cl_res$bindata,thresholds=cl_res$thresholds,reject=cl_res$reject) }) significant <- sapply(cluster,function(cl)(cl$reject==FALSE)) # remove not recommended genes if (dropInsignificant) { significant <- sapply(cluster,function(cl)(cl$reject==FALSE)) cluster <- cluster[significant] } if (is.null(dim(measurements))) # split up the collated binarized measurements into a list of matrices of the original size { startIndex <- 0 binarizedTimeSeries <- lapply(measurements,function(m) { currentSplit <- (startIndex+1):(startIndex+ncol(m)) startIndex <<- startIndex + ncol(m) t(sapply(cluster,function(cl) cl$bin[currentSplit])) }) rejectlist<-sapply(cluster,function(cl) cl$reject) threshlist<-sapply(cluster,function(cl) cl$thresholds) } else { binarizedTimeSeries <- t(sapply(cluster,function(cl) cl$bin)) rejectlist<-sapply(cluster,function(cl) cl$reject) threshlist<-sapply(cluster,function(cl) cl$thresholds) } if(any(rejectlist)) { warning("The following genes show a uniform behaviour and should possibly be excluded from binarization:", paste(rownames(fullData)[!significant],collapse=" ")) } return(list(binarizedMeasurements=binarizedTimeSeries,thresholds=threshlist,reject=rejectlist)) }, stop("'method' must be one of \"kmeans\",\"edgeDetector\",\"scanStatistic\"") ) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/R/attractorsToLaTeX.R�����������������������������������������������������������������������0000654�0001762�0000144�00000012405�12122071020�015515� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Create LaTeX state tables of all attractors in <attractorInfo>. # Genes are grouped according to <grouping>. # An additional title can be supplied in <title>. # If <plotFixed> is set, fixed variables are included in the plot. # <onColor> and <offColor> specify the colors of ON/1 and OFF/0 states. # <file> is the name of the output LaTeX document. attractorsToLaTeX <- function (attractorInfo, subset, title = "", grouping = list(), plotFixed = TRUE, onColor="[gray]{0.9}",offColor="[gray]{0.6}", file="attractors.tex") { stopifnot(inherits(attractorInfo,"AttractorInfo")) if (missing(subset)) subset <- 1:length(attractorInfo$attractors) else if (any(subset > length(attractorInfo$attractors))) stop("You specified an attractor index that is greater than the total number of attractors in 'subset'!") numGenes <- length(attractorInfo$stateInfo$genes) # escape "_" in LaTeX genes = gsub("_", "\\_", attractorInfo$stateInfo$genes) # determine list of genes to be plotted whichFixed <- which(attractorInfo$stateInfo$fixedGenes != -1) if (plotFixed | (length(whichFixed) == 0)) plotIndices <- 1:numGenes else plotIndices <- (1:numGenes)[-whichFixed] # convert decimal state numbers to binary state matrices (one for each attractor) binMatrices <- lapply(attractorInfo$attractors,function(attractor) { res <- matrix(apply(attractor$involvedStates,2,function(state) dec2bin(state,numGenes)[plotIndices]),nrow=length(plotIndices)) }) # count the numbers of attractors with equal lengths attractorLengths <- sapply(attractorInfo$attractors,function(attractor) { if (is.null(attractor$initialStates)) # simple attractor ncol(attractor$involvedStates) else # complex attractor => extra treatment -1 }) lengthTable <- table(attractorLengths) lengthTable <- lengthTable[as.integer(names(lengthTable)) != -1] # Open output file, and print header sink(file) cat("% Please include packages tabularx and colortbl in your master document:\n", "% \\usepackage{tabularx,colortbl}\n\n\n",sep="") res <- lapply(1:length(lengthTable),function(i) # accumulate all attractors with equal length in one matrix and plot them { len <- as.integer(names(lengthTable)[i]) if (length(intersect(which(attractorLengths == len),subset)) > 0) { cnt <- lengthTable[i] # build accumulated matrix totalMatrix <- c() for (mat in binMatrices[intersect(which(attractorLengths == len),subset)]) { totalMatrix <- cbind(totalMatrix,mat) } rownames(totalMatrix) <- attractorInfo$stateInfo$genes[plotIndices] colnames(totalMatrix) <- sapply(intersect(which(attractorLengths == len),subset),function(i)paste("Attr",i,".",1:len,sep="")) if(length(grouping)>0) { # reorder genes according to the supplied groups totalMatrix <- totalMatrix[unlist(grouping$index),] separationPositions <- c(1,cumsum(sapply(grouping$index,length)+1)) } else separationPositions <- c() # output table header cat("\\begin{table}[ht]\n", "\\begin{center}\n", "\\caption{", title, "Attractors with ",len," state(s)}\n", "\\begin{tabularx}{\\linewidth}{l", paste(rep(paste(rep(">{\\centering\\arraybackslash}X", len), collapse = " "),length(intersect(which(attractorLengths == len),subset))),collapse="|"), "}\\hline\n", sep="") cat("\t&\t",paste(paste("\\multicolumn{",len,"}{c}{Attr. ",intersect(which(attractorLengths == len),subset),"}", sep=""),collapse="\t&\t"),"\\\\\n") # output active and inactive states for(j in 1:nrow(totalMatrix)) { separator <- which(separationPositions==j) if (length(separator) != 0) { cat("\\hline \\multicolumn{",ncol(totalMatrix) + 1,"}{c}{",grouping$class[separator],"}\\\\ \\hline \n",sep="") } cat("\\textbf{",rownames(totalMatrix)[j],"}\t&\t",sep="") for(i in 1:ncol(totalMatrix)) { if(totalMatrix[j,i] == 1) cat("\\cellcolor",onColor,"1",sep="") else cat("\\cellcolor",offColor,"0",sep="") if (i < ncol(totalMatrix)) cat("\t&\t") } cat("\\\\\n") } # output frequency of attractor (basin size / number of states) freq <- round(sapply(attractorInfo$attractors[intersect(which(attractorLengths == len),subset)], function(attractor)attractor$basinSize/ncol(attractorInfo$stateInfo$table)) * 100,2) if (!isTRUE(all(is.na(freq)))) { cat("\\hline Freq.\t&\t",paste(paste("\\multicolumn{",len,"}{c}{",freq,"\\%}", sep=""),collapse="\t&\t"),"\\\\\n") } cat("\\hline\\end{tabularx}\n\\end{center}\n", "\\end{table}\n\n",sep="") totalMatrix } }) # return a list of accumulated matrices sink() names(res) <- names(lengthTable) return(res) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/NAMESPACE�����������������������������������������������������������������������������������0000654�0001762�0000144�00000001547�12122071021�013027� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������useDynLib(BoolNet) S3method(print, AttractorInfo) S3method(print, BooleanNetwork) S3method(print, BooleanNetworkCollection) S3method(print, ProbabilisticBooleanNetwork) S3method(print, BooleanStateInfo) S3method(print, TransitionTable) S3method(print, MarkovSimulation) export( loadNetwork, loadBioTapestry, loadSBML, saveNetwork, getAttractors, plotAttractors, plotSequence, plotStateGraph, plotNetworkWiring, plotPBNTransitions, attractorsToLaTeX, sequenceToLaTeX, stateTransition, getAttractorSequence, getTransitionTable, getStateSummary, getBasinOfAttraction, getPathToAttractor, getTransitionProbabilities, toPajek, toSBML, generateRandomNKNetwork, generateState, generateTimeSeries, perturbNetwork, simplifyNetwork, reconstructNetwork, chooseNetwork, fixGenes, binarizeTimeSeries, markovSimulation, testNetworkProperties, testAttractorRobustness, testIndegree) ���������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/����������������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�12122071104�012355� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/yeastTimeSeries.Rd����������������������������������������������������������������������0000654�0001762�0000144�00000002627�12122071021�015771� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{yeastTimeSeries} \alias{yeastTimeSeries} \docType{data} \title{ Yeast cell cycle time series data } \description{ Preprocessed time series measurements of four genes from the yeast cell cycle data by Spellman et al. } \usage{data(yeastTimeSeries)} \format{ A matrix with 14 measurements for the genes Fhk2, Swi5, Sic1, and Clb1. Each gene is a row of the matrix, and each column is a measurement. } \details{ The data were obtained from the web site of the yeast cell cycle analysis project at \url{http://genome-www.stanford.edu/cellcycle}. The time series synchronized with the elutriation method were extracted for the genes Fhk2, Swi5, SIC1, and Clb1. In a preprocessing step, missing values were imputed by taking the means of the measurements of the same genes at neighbouring time points. } \source{ P. T. Spellman, G. Sherlock, M. Q. Zhang, V. R. Iyer, K. Anders, M. B. Eisen, P. O. Brown, D. Botstein, B. Futcher (1998), Comprehensive Identification of Cell Cycle-regulated Genes of the Yeast Saccharomyces cerevisiae by Microarray Hybridization. Molecular Biology of the Cell 9(12):3273--3297. Yeast cell cycle analysis project web site: \url{http://genome-www.stanford.edu/cellcycle} } \examples{ data(yeastTimeSeries) # the data set is stored in a variable called 'yeastTimeSeries' print(yeastTimeSeries) } \keyword{datasets yeast cell cycle time series binarization binarize} ���������������������������������������������������������������������������������������������������������BoolNet/man/toSBML.Rd�������������������������������������������������������������������������������0000644�0001762�0000144�00000004320�12122071021�013741� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{toSBML} \alias{toSBML} \title{ Export a network to SBML } \description{ Exports a synchronous or asynchronous Boolean network to SBML with the \code{sbml-qual} extension package. } \usage{ toSBML(network, file, generateDNFs = FALSE, saveFixed = TRUE) } \arguments{ \item{network}{ An object of class \code{BooleanNetwork} to be exported } \item{file}{ The name of the SBML file to be created } \item{generateDNFs}{ This parameter specifies whether formulae in Disjunctive Normal Form are exported instead of the expressions that describe the transition functions. If set to FALSE, the original expressions are exported. If set to "canonical", a canonical Disjunctive Normal Form is generated from each truth table. If set to "short", the canonical DNF is minimized by joining terms (which can be time-consuming for functions with many inputs). If set to TRUE, a short DNF is generated for functions with up to 12 inputs, and a canonical DNF is generated for functions with more than 12 inputs. } \item{saveFixed}{ If set to TRUE, knock-outs and overexpression of genes override their transition functions. That is, if a gene in the network is fixed to 0 or 1, this value is exported, regardless of the transition function. If set to FALSE, the transition function is exported. Defaults to TRUE. } } \details{ The export creates an SBML file describing a general logical model that corresponds to the Boolean network. Importing tools must support the \code{sbml-qual} extension package version 1.0. The export translates the expressions that describe the network transition functions to a MathML description. If these expressions cannot be parsed or \code{generateDNFs} is true, a DNF representation of the transition functions is generated and exported. } \references{ \url{http://sbml.org/Community/Wiki/SBML_Level_3_Proposals/Qualitative_Models} } \seealso{ \code{\link{loadSBML}}, \code{\link{loadNetwork}}, \code{\link{saveNetwork}}, \code{\link{toPajek}} } \examples{ # load the cell cycle network data(cellcycle) # export the network to SBML toSBML(cellcycle, file="cellcycle.sbml") # reimport the model print(loadSBML("cellcycle.sbml")) } \keyword{SBML Boolean network file export} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/toPajek.Rd������������������������������������������������������������������������������0000654�0001762�0000144�00000002575�12122071021�014251� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{toPajek} \Rdversion{1.1} \alias{toPajek} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Export a network to the Pajek file format } \description{ Exports a network to the Pajek file format to visualize transition trajectories. For more information on Pajek, please refer to \url{http://pajek.imfm.si/doku.php} } \usage{ toPajek(attractorInfo, file = "boolean.net", includeLabels=FALSE) } \arguments{ \item{attractorInfo}{ An object of class \code{AttractorInfo}, as returned by \code{\link{getAttractors}}. As the transition table information in this structure is required, \code{getAttractors} must be called in synchronous mode and with \code{returnTable} set to TRUE. } \item{file}{ The name of the output file for Pajek. Defaults to "boolean.net". } \item{includeLabels}{ If set to true, the vertices of the graph in the output file are labeled with the binary encodings of the states. Defaults to FALSE. } } \value{ This function has no return value. } \seealso{ \code{\link{getAttractors}}, \code{\link{toSBML}} } \examples{ # load example data data(cellcycle) # get attractors attractors <- getAttractors(cellcycle) # export to Pajek toPajek(attractors, file="pajek_export.net") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Pajek Boolean network attractor cycle basin transition state graph} �����������������������������������������������������������������������������������������������������������������������������������BoolNet/man/testNetworkProperties.Rd����������������������������������������������������������������0000654�0001762�0000144�00000022175�12122071021�017260� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{testNetworkProperties} \alias{testNetworkProperties} \alias{testIndegree} \alias{testAttractorRobustness} \title{ Test properties of networks by comparing them to random networks } \description{ This is a general function designed to determine unique properties of biological networks by comparing them to a set of randomly generated networks with similar structure. } \usage{ testNetworkProperties(network, numRandomNets = 100, testFunction = "testIndegree", testFunctionParams = list(), accumulation = c("characteristic", "kullback_leibler"), sign.level = 0.05, drawSignificanceLevel = TRUE, klBins, klMinVal = 1e-05, linkage = c("uniform", "lattice"), functionGeneration = c("uniform", "biased"), simplify = FALSE, noIrrelevantGenes = TRUE, d_lattice = 1, zeroBias = 0.5, title = "", xlab, xlim, breaks = 30, ...) } \arguments{ \item{network}{ A network structure of class \code{BooleanNetwork} } \item{numRandomNets}{ The number of random networks to generate for comparison } \item{testFunction}{ The name of a function that calculates characteristic values that describe properties of the network. There are two built-in functions: "testIndegree" calculates the in-degrees of states in the network, and "testAttractorRobustness" counts the occurrences of attractors in perturbed copies. It is possible to supply user-defined functions here. See Details. } \item{testFunctionParams}{ A list of parameters to \code{testFunction}. The elements of the list depend on the chosen function. } \item{accumulation}{ If "characteristic" is chosen, the test function is required to return a single value that describes the network. In this case, a histogram of these values in random networks is plotted, and the value of the original network is inserted as a vertical line. If "kullback_leibler" is chosen, the test function can return a vector of values which is regarded as a sample from a probability distribution. In this case, the Kullback-Leibler distances of the distributions from the original network and each of the random networks are calculated and plotted in a histogram. The Kullback-Leibler distance measures the difference between two probability distributions. In this case, the resulting histogram shows the distribution of differences between the original network and randomly generated networks. } \item{sign.level}{ if \code{accumulation="characteristic"}, this specifies a significance level for a computer-intensive test. The test is significant if the characteristic value is greater than at least \code{(1-sign.level)*100}\% of the characteristic values of the random networks } \item{drawSignificanceLevel}{ If \code{accumulation="characteristic"} and this is true, a vertical line is plotted for the significance level in the histogram. } \item{linkage, functionGeneration, simplify, noIrrelevantGenes, d_lattice, zeroBias}{ The corresponding parameters of \code{\link{generateRandomNKNetwork}} used to generate the random networks. This allows for customization of the network generation process. The three remaining parameters of \code{\link{generateRandomNKNetwork}} are set to values that ensure structural similarity to the original network: The parameters \code{n} and \code{k} are set to the corresponding values of the original network, and \code{topology="fixed"}. } \item{klBins}{ If \code{accumulation="kullback_leibler"}, the number of bins used to discretize the samples for the Kullback-Leibler distance calculations. By default, each unique value in the samples has its own bin, i.e. no further discretization is performed. The influence of discretization on the resulting histogram may be high. } \item{klMinVal}{ If \code{accumulation="kullback_leibler"}, this defines the minimum probability for the calculation of the Kullback-Leibler distance to ensure stability of the results. } \item{title}{ The title of the plots. This is empty by default. } \item{xlab}{ Customizes label of the x axis of the histogram. For the built-in test functions, the x axis label is set automatically. } \item{xlim}{ Customizes the limits of the x axis of the histogram. For the built-in test functions, suitable values are chosen automatically. } \item{breaks}{ Customizes the number of breaks in the } \item{\dots}{ Further graphical parameters for \code{\link{hist}} } } \details{ This function generically compares properties of biological networks to a set of random networks. It can be extended by supplying custom functions to the parameter \code{testFunction}. Such a function must have the signature \code{function(network, accumulate=TRUE, params)} \describe{ \item{network}{This is the network to test. In the process of the comparison, both the original network and the random networks are passed to the function} \item{accumulate}{If \code{accumulate=TRUE}, the function must return a single value quantifying the examined property of the network. If \code{accumulate=FALSE}, the function can return a vector of values (e.g., one value for each gene/state etc.)} \item{params}{A list of further parameters for the function supplied by the user in \code{testFunctionParams} (see above). This can contain any type of information your test function needs.} } Two built-in functions for synchronous Boolean networks already exist: \describe{ \item{testIndegree}{This function is based on the observation that, often, in biological networks, many state transitions lead to the same states. In other words, there is a small number of "hub" states. In the state graph, this means that the in-degree of some states (i.e., the number of transitions leading to it) is high, while the in-degree of many other states is 0. We observed that random networks do not show this behaviour, thus it may be a distinct property of biological networks. The function does not require any parameter entries in \code{params}. If \code{accumulate=FALSE}, it returns the in-degrees of all synchronous states in the network. If \code{accumulate=TRUE}, the Gini index of the in-degrees is returned as a characteristic value of the network. The Gini index is a measure of inequality. If all states have an in-degree of 1, the Gini index is 0. If all state transitions lead to one single state, the Gini index is 1. This function requires the \pkg{igraph} package for the analysis of the in-degrees. } \item{testAttractorRobustness}{This function tests the robustness of attractors in a network to noise. We expect attractors in a real network to be less susceptible to noise than attractors in randomly generated networks, as biological processes can be assumed to be comparatively stable. The function generates a number of perturbed copies of the network and checks whether the original attractors can still be found in the network. \code{params} can hold a number of parameters: \describe{ \item{copies}{The number of perturbed copies to generate} \item{perturb, method, simplify, readableFunctions, excludeFixed, maxNumBits, numStates}{The corresponding parameters of \code{\link{perturbNetwork}} that influence the way the network is perturbed.} } If \code{accumulate=FALSE}, the function returns a vector of percentages of original attractors found in each of the perturbed copies of the original network. If \code{accumulate=TRUE}, the function returns the overall percentage of original attractors found in all perturbed copies. } } } \value{ The function returns a list with the following elements \item{hist}{The histogram that was plotted. The type of histogram depends on the parameter \code{accumulation}.} \item{pval}{If \code{accumulation="characteristic"}, a p-value for the alternative hypothesis that the test statistic value of the supplied network is greater than the value of a randomly generated network is supplied.} \item{significant}{If \code{accumulation="characteristic"}, this is true for \code{pval < sign.level}.} } \seealso{ \code{\link{generateRandomNKNetwork}}, \code{\link{perturbNetwork}}, \code{\link{plotStateGraph}}, \code{\link{getAttractors}} } \examples{ # load mammalian cell cycle network data(cellcycle) # compare the in-degrees of the states in the # cell cycle network to random networks \donttest{testNetworkProperties(cellcycle, testFunction="testIndegree")} # compare the in-degrees of the states in the # cell cycle network to random networks, # and plot the Kullback-Leibler distances of the 100 experiments \donttest{testNetworkProperties(cellcycle, testFunction="testIndegree", accumulation = "kullback_leibler")} # compare the robustness of attractors in the cell cycle network # to random networks testNetworkProperties(cellcycle, testFunction="testAttractorRobustness", testFunctionParams=list(copies=10)) } \keyword{robustness analysis perturbation in-degree} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/stateTransition.Rd����������������������������������������������������������������������0000654�0001762�0000144�00000006214�12122071021�016041� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{stateTransition} \Rdversion{1.1} \alias{stateTransition} \title{ Perform a transition to the next state } \description{ Calculates the next state in a supplied network for a given current state } \usage{ stateTransition(network, state, type = c("synchronous","asynchronous","probabilistic"), geneProbabilities, chosenGene, chosenFunctions) } \arguments{ \item{network}{ A network structure of class \code{BooleanNetwork} or \code{ProbabilisticBooleanNetwork}. These networks can be read from files by \code{\link{loadNetwork}}, generated by \if{latex}{\cr}\code{\link{generateRandomNKNetwork}}, or reconstructed by \code{\link{reconstructNetwork}}. } \item{state}{ The current state of the network, encoded as a vector with one 0-1 element for each gene. } \item{type}{The type of transition to be performed. If set to "synchronous", all genes are updated using the corresponding transition functions. If set to "asynchronous", only one gene is updated. This gene is either chosen randomly or supplied in parameter \code{chosenGene}. If set to "probabilistic", one transition function is chosen for each gene, and the genes are updated synchronously. The functions are either chosen randomly depending on their probabilities, or they are supplied in parameter \code{chosenFunctions}. Default is "synchronous" for objects of class \code{BooleanNetwork} and "probabilistic" for objects of class \code{ProbabilisticBooleanNetwork}.} \item{geneProbabilities}{An optional vector of probabilities for the genes if \code{type="asynchronous"}. By default, each gene has the same probability to be chosen for the next state transition. These probabilities can be modified by supplying a vector of probabilities for the genes which sums up to one.} \item{chosenGene}{If \code{type="asynchronous"} and this parameter is supplied, no random update is performed. Instead, the gene with the supplied name or index is chosen for the next transition.} \item{chosenFunctions}{If \code{type="probabilistic"}, this parameter can contain a set of function indices for each gene. In this case, transition functions are not chosen randomly, but the provided functions are used in the state transition.} } \value{ The subsequent state of the network, encoded as a vector with one 0-1 element for each gene.} \seealso{ \code{\link{loadNetwork}}, \code{\link{generateRandomNKNetwork}}, \code{\link{generateState}} } \examples{ # load example network data(cellcycle) # calculate a synchronous state transition print(stateTransition(cellcycle, c(1,1,1,1,1,1,1,1,1,1))) # calculate an asynchronous state transition of gene CycA print(stateTransition(cellcycle, c(1,1,1,1,1,1,1,1,1,1), type="asynchronous", chosenGene="CycA")) # load probabilistic network data(examplePBN) # perform a probabilistic state transition print(stateTransition(examplePBN, c(0,1,1), type="probabilistic")) } \keyword{state transition Boolean network synchronous update asynchronous update probabilistic Boolean network PBN transition state} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/simplifyNetwork.Rd����������������������������������������������������������������������0000654�0001762�0000144�00000005331�12122071021�016053� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{simplifyNetwork} \Rdversion{1.1} \alias{simplifyNetwork} \title{ Simplify the functions of a synchronous, asynchronous, or probabilistic Boolean network } \description{ Eliminates irrelevant variables from the inputs of the gene transition functions. This can be useful if the network was generated randomly via \code{\link{generateRandomNKNetwork}} or if it was perturbed via \code{\link{perturbNetwork}}. } \usage{ simplifyNetwork(network, readableFunctions = FALSE) } \arguments{ \item{network}{ A network structure of class \code{BooleanNetwork} or \code{ProbabilisticBooleanNetwork}. These networks can be read from files by \code{\link{loadNetwork}}, generated by \if{latex}{\cr}\code{\link{generateRandomNKNetwork}}, or reconstructed by \code{\link{reconstructNetwork}}. } \item{readableFunctions}{ This parameter specifies if readable DNF representations of the transition function truth tables are generated and displayed when the network is printed. If set to FALSE, the truth table result column is displayed. If set to "canonical", a canonical Disjunctive Normal Form is generated from each truth table. If set to "short", the canonical DNF is minimized by joining terms (which can be time-consuming for functions with many inputs). If set to TRUE, a short DNF is generated for functions with up to 12 inputs, and a canonical DNF is generated for functions with more than 12 inputs. } } \details{ The function checks whether the output of a gene transition function is independent from the states of any of the input variables. If this is the case, these input variables are dropped, and the transition function is shortened accordingly. In non-probabilistic Boolean networks (class \code{BooleanNetwork}), constant genes are automatically fixed (e.g. knocked-out or over-expressed). This means that they are always set to the constant value, and states with the complementary value are not considered in transition tables etc. If you would like to change this behaviour, use \code{\link{fixGenes}} to reset the fixing. } \value{ The simplified network of class \code{BooleanNetwork} or \code{ProbabilisticBooleanNetwork}. These classes are described in more detail in \code{\link{loadNetwork}}. } \seealso{ \code{\link{loadNetwork}},\code{\link{generateRandomNKNetwork}}, \code{\link{perturbNetwork}}, \code{\link{reconstructNetwork}}, \code{\link{fixGenes}} } \examples{ # load example data data(cellcycle) # perturb the network perturbedNet <- perturbNetwork(cellcycle, perturb="functions", method="shuffle") print(perturbedNet$interactions) # simplify the network perturbedNet <- simplifyNetwork(perturbedNet) print(perturbedNet$interactions) } \keyword{Boolean network probabilistic Boolean network PBN logic simplify simplification} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/sequenceToLaTeX.Rd����������������������������������������������������������������������0000654�0001762�0000144�00000011674�12122071021�015665� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{sequenceToLaTeX} \alias{sequenceToLaTeX} \alias{sequenceToLaTeX.BooleanNetwork} \alias{sequenceToLaTeX.data.frame} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Create LaTeX table of state sequences } \description{ Exports tables of state sequences (corresponding to the plot generated by \code{\link{plotSequence}} with \code{mode="table"}) to a LaTeX document. } \usage{ sequenceToLaTeX(network, startState, includeAttractorStates = c("all","first","none"), sequence, title = "", grouping = list(), plotFixed = TRUE, onColor="[gray]{0.9}", offColor="[gray]{0.6}", file="sequence.tex") } \arguments{ \item{network}{ An object of class \code{BooleanNetwork} for which a sequence of state transitions is calculated } \item{startState}{ The start state of the sequence } \item{includeAttractorStates}{ Specifies whether the actual attractor states are included in the table or not (see also \code{\link{getPathToAttractor}}). If \code{includeAttractorStates = "all"} (which is the default behaviour), the sequence ends when the attractor was traversed once. If \code{includeAttractorStates = "first"}, only the first state of attractor is added to the sequence. If {includeAttractorStates = "none"}, the sequence ends with the last non-attractor state. } \item{sequence}{ The alternative call to \code{sequenceToLaTeX} requires the specification of the sequence itself instead of the network and the start state. The sequence must be provided as a data frame with the genes in the columns and the successive states in the rows. For example, sequences can be obtained using \code{\link{getPathToAttractor}} or \code{\link{getAttractorSequence}} (however, the specialized function \code{\link{attractorsToLaTeX}} exists for attractors). } \item{title}{ An optional title for the table } \item{plotFixed}{If this is true, genes with fixed values are included in the plot. Otherwise, these genes are not shown. } \item{grouping}{This optional parameter specifies a structure to form groups of genes in the table. This is a list with the following elements: \describe{ \item{class}{A vector of names for the groups. These names will be printed in the region belonging to the group in the tabke.} \item{index}{A list with the same length as \code{class}. Each element is a vector of gene names or gene indices belonging to the group.}} } \item{onColor}{ An optional color value for the 1/ON values in the table. Defaults to dark grey. } \item{offColor}{ An optional color value for the 0/OFF values in the table. Defaults to light grey. } \item{file}{ The file to which the LaTeX document is written. Defaults to "sequence.tex". } } \details{ This function creates a LaTeX table that visualizes a sequence of states in a synchronous network. The output file does not contain a document header and requires the inclusion of the packages \code{tabularx} and \code{colortbl}. The tables have the genes in the rows and the successive states of the sequence in the columns. If not specified otherwise, cells of the table are light grey for 0/OFF values and dark grey for 1/ON values. If \code{grouping} is set, the genes are rearranged according to the indices in the group, horizontal separation lines are plotted between the groups, and the group names are printed. The function can be called with different types of inputs: The user can specify the parameters \code{network}, \code{startState} and \code{includeAttractorStates}), in which case \code{\link{getPathToAttractor}} is called to obtain the sequence. Alternatively, the sequence can be supplied directly as a data frame in the \code{sequence} parameter. } \value{ Returns a matrix corresponding to the table. The matrix has the genes in the rows and the states of the attractors in the columns. If \code{sequence} was supplied, this corresponds to the transposed input whose rows may be rearranged if \code{grouping} was set. } \seealso{ \code{\link{attractorsToLaTeX}}, \code{\link{plotSequence}}, \code{\link{plotAttractors}}, \code{\link{getPathToAttractor}}, \code{\link{getAttractorSequence}}. } \examples{ # load example data data(cellcycle) # alternative 1: supply network and start state # and export sequence to LaTeX sequenceToLaTeX(network=cellcycle, startState=rep(1,10), includeAttractorStates="all", file="sequence.txt") # alternative 2: calculate sequence in advance sequence <- getPathToAttractor(cellcycle, state=rep(1,10), includeAttractorStates="all") sequenceToLaTeX(sequence=sequence, file="sequence.txt") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Boolean network state path sequence LaTeX} ��������������������������������������������������������������������BoolNet/man/saveNetwork.Rd��������������������������������������������������������������������������0000644�0001762�0000144�00000003600�12122071021�015151� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{saveNetwork} \alias{saveNetwork} \title{ Save a network } \description{ Saves synchronous, asynchronous or probabilistic networks in the \pkg{BoolNet} network file format . } \usage{ saveNetwork(network, file, generateDNFs = FALSE, saveFixed = TRUE) } \arguments{ \item{network}{ An object of class \code{BooleanNetwork} to be exported } \item{file}{ The name of the network file to be created } \item{generateDNFs}{ This parameter specifies whether formulae in Disjunctive Normal Form are exported instead of the expressions that describe the transition functions. If set to FALSE, the original expressions are exported. If set to "canonical", a canonical Disjunctive Normal Form is generated from each truth table. If set to "short", the canonical DNF is minimized by joining terms (which can be time-consuming for functions with many inputs). If set to TRUE, a short DNF is generated for functions with up to 12 inputs, and a canonical DNF is generated for functions with more than 12 inputs. } \item{saveFixed}{ If set to TRUE, knock-outs and overexpression of genes override their transition functions. That is, if a gene in the network is fixed to 0 or 1, this value is saved, regardless of the transition function. If set to FALSE, the transition function is saved. Defaults to TRUE. } } \details{ The network is saved in the \pkg{BoolNet} file format (see \code{\link{loadNetwork}} for details). If the expressions in the transition functions cannot be parsed or \code{generateDNFs} is true, a DNF representation of the transition functions is generated. } \seealso{ \code{\link{loadNetwork}} } \examples{ # load the cell cycle network data(cellcycle) # save it to a file saveNetwork(cellcycle, file="cellcycle.txt") # reload the model print(loadNetwork("cellcycle.txt")) } \keyword{Boolean network probabilistic Boolean network PBN file export} ��������������������������������������������������������������������������������������������������������������������������������BoolNet/man/reconstructNetwork.Rd�������������������������������������������������������������������0000654�0001762�0000144�00000010215�12122071021�016567� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{reconstructNetwork} \alias{reconstructNetwork} \title{ Reconstruct a Boolean network from time series of measurements } \description{ Reconstructs a Boolean network from a set of time series or from a transition table using the best-fit extension algorithm or the REVEAL algorithm. } \usage{ reconstructNetwork(measurements, method = c("bestfit", "reveal"), maxK = 5, readableFunctions = FALSE, allSolutions = FALSE) } \arguments{ \item{measurements}{ This can either be an object of class \code{TransitionTable} as returned by \if{latex}{\cr}\code{\link{getTransitionTable}}, or a set of time series of measurements. In this case, \code{measurements} must be a list of matrices, each corresponding to one time series. Each row of these matrices contains measurements for one gene on a time line, i. e. column \code{i+1} contains the successor states of column \code{i}. The genes must be the same for all matrices in the list. Real-valued time series can be binarized using \code{\link{binarizeTimeSeries}}. } \item{method}{ This specifies the reconstruction algorithm to be used. If set to "bestfit", Laehdesmaeki's Best-Fit Extension algorithm is employed. This algorithm is an improvement of the algorithm by Akutsu et al. with a lower runtime complexity. It determines the functions with a minimal error for each gene. If set to "reveal", Liang's REVEAL algorithm is used. This algorithm searches for relevant input genes using the mutual information between the input genes and the output gene. } \item{maxK}{ The maximum number of input genes for one gene to be tested. Defaults to 5. } \item{readableFunctions}{ If this is true, readable DNF representations of the truth tables of the functions are generated. These DNF are displayed when the network is printed. The DNF representations are not minimized and can thus be very long. If set to FALSE, the truth table result column is displayed. } \item{allSolutions}{ If this is true, all solutions with the minimum error and up to \code{maxK} inputs are returned. By default, \code{allSolutions=FALSE}, which means that only the solutions with both minimum error and minimum \code{k} are returned. } } \details{ Both algorithms iterate over all possible input combinations. While Best-Fit Extension is capable of returning functions that do not perfectly explain the measurements (for example, if there are inconsistent measurements or if \code{maxK} was specified too small), REVEAL only finds functions that explain all measurements. For more information, please refer to the cited publications. } \value{ Returns an object of class \code{ProbabilisticBooleanNetwork}, with each alternative function of a gene having the same probability. The structure is described in detail in \code{\link{loadNetwork}}. In addition to the standard components, each alternative transition function has a component \code{error} which stores the error of the function on the input time series data. If a non-probabilistic network of class \code{BooleanNetwork} is required, a specific Boolean network can be extracted using \code{\link{chooseNetwork}}. } \references{ H. Laehdesmaeki, I. Shmulevich and O. Yli-Harja (2003), On Learning Gene-Regulatory Networks Under the Boolean Network Model. Machine Learning 52:147--167. T. Akutsu, S. Miyano and S. Kuhara (2000). Inferring qualitative relations in genetic networks and metabolic pathways. Bioinformatics 16(8):727--734. S. Liang, S. Fuhrman and R. Somogyi (1998), REVEAL, a general reverse engineering algorithm for inference of genetic network architectures. Pacific Symposium on Biocomputing 3:18--29. } \seealso{ \code{\link{binarizeTimeSeries}}, \code{\link{chooseNetwork}} } \examples{ # load example data data(yeastTimeSeries) # perform binarization with k-means bin <- binarizeTimeSeries(yeastTimeSeries) # reconstruct networks from transition table net <- reconstructNetwork(bin$binarizedMeasurements, method="bestfit", maxK=3) # print reconstructed net print(net) # plot reconstructed net \donttest{plotNetworkWiring(net)} } \keyword{probabilistic Boolean network PBN reconstruction REVEAL best-fit extension} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/print.TransitionTable.Rd����������������������������������������������������������������0000654�0001762�0000144�00000002415�12122071021�017102� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{print.TransitionTable} \Rdversion{1.1} \alias{print.TransitionTable} \alias{print.BooleanStateInfo} \title{ Print a transition table } \description{ Specialized print method to print a transition table with the initial state in the first column, the successor state in the second column, the basin of attraction to which the state leads in the third column, and the number of transitions to the attractor in the fourth column. } \usage{ \method{print}{TransitionTable}(x, activeOnly = FALSE, ...) \method{print}{BooleanStateInfo}(x, activeOnly=FALSE, ...) } \arguments{ \item{x}{ An object of class \code{TransitionTable} or \code{BooleanStateInfo} to be printed } \item{activeOnly}{ If set to true, a state is represented by a list of active genes (i.e., genes which are set to 1). If set to false, a state is represented by a binary vector with one entry for each gene, specifying whether the gene is active or not. Defaults to \code{FALSE}. } \item{\dots}{ Further parameters for the \code{\link{print}} method. Currently not used. } } \value{ Invisibly returns the printed object } \seealso{ \code{\link{print}}, \code{\link{getTransitionTable}}, \code{\link{getBasinOfAttraction}}, \code{\link{getStateSummary}} } \keyword{transition table print} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/print.ProbabilisticBooleanNetwork.Rd����������������������������������������������������0000654�0001762�0000144�00000002500�12122071021�021433� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{print.ProbabilisticBooleanNetwork} \Rdversion{1.1} \alias{print.ProbabilisticBooleanNetwork} \alias{print.BooleanNetworkCollection} \title{ Print a probabilistic Boolean network } \description{ A specialized method to print an object of class \code{ProbabilisticBooleanNetwork}. For backward compatibility, this method also prints objects of class \code{BooleanNetworkCollection}, which have been replaced by \code{ProbabilisticBooleanNetwork}. This prints all alternative transition functions and their probabilities. If the network is the result of a reconstruction from time series measurements, it also outputs the error the functions make on the time series. If genes are knocked-out or over-expressed, these genes are listed below the functions. } \usage{ \method{print}{ProbabilisticBooleanNetwork}(x, ...) \method{print}{BooleanNetworkCollection}(x, ...) } \arguments{ \item{x}{ An object of class \code{ProbabilisticBooleanNetwork} or \code{BooleanNetworkCollection} to be printed } \item{\dots}{ Further parameters for the \code{\link{print}} method. Currently not used. } } \value{ Invisibly returns the printed object } \seealso{ \code{\link{print}}, \code{\link{reconstructNetwork}}, \code{\link{loadNetwork}} } \keyword{network Boolean network probabilistic Boolean network PBN print} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/print.MarkovSimulation.Rd���������������������������������������������������������������0000654�0001762�0000144�00000002464�12122071021�017310� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{print.MarkovSimulation} \alias{print.MarkovSimulation} \title{ Print the results of a Markov chain simulation } \description{ A specialized method to print an object of class \code{MarkovSimulation}. This prints all states that have a non-zero probability to be reached after the number of iterations in the Markov simulation. If the simulation was run with \code{returnTable=TRUE}, it also prints a table of state transitions and their probabilities to be chosen in a single step. } \usage{ \method{print}{MarkovSimulation}(x, activeOnly = FALSE, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ An object of class \code{MarkovSimulation} to be printed } \item{activeOnly}{ If set to true, a state is represented by a list of active genes (i.e., genes which are set to 1). If set to false, a state is represented by a binary vector with one entry for each gene, specifying whether the gene is active or not. Defaults to \code{FALSE}. } \item{\dots}{ Further parameters for the \code{\link{print}} method. Currently not used. } } \value{ Invisibly returns the printed object } \seealso{ \code{\link{print}}, \code{\link{markovSimulation}} } \keyword{print Markov chain simulation probabilistic Boolean network PBN}% __ONLY ONE__ keyword per line ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/print.BooleanNetwork.Rd�����������������������������������������������������������������0000654�0001762�0000144�00000001302�12122071021�016723� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{print.BooleanNetwork} \Rdversion{1.1} \alias{print.BooleanNetwork} \title{ Print a Boolean network } \description{ A specialized method to print an object of class \code{BooleanNetwork}. This prints the transition functions of all genes. If genes are knocked-out or over-expressed, these genes are listed below the functions. } \usage{ \method{print}{BooleanNetwork}(x, ...) } \arguments{ \item{x}{ An object of class \code{BooleanNetwork} to be printed } \item{\dots}{ Further parameters for the \code{\link{print}} method. Currently not used. } } \value{ Invisibly returns the printed object } \seealso{ \code{\link{print}}, \code{\link{loadNetwork}} } \keyword{network Boolean network print} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/print.AttractorInfo.Rd������������������������������������������������������������������0000654�0001762�0000144�00000002305�12122071021�016555� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{print.AttractorInfo} \Rdversion{1.1} \alias{print.AttractorInfo} \title{ Print attractor cycles } \description{ Specialized print method to print the attractor cycles stored in an \code{AttractorInfo} object. For simple or steady-state attractors, the states of the attractors are printed in binary encoding in the order they are reached. For asynchronous complex/loose attractors, the possible transitions of the states in the attractor are printed. The method can print either the full states, or only the active genes of the states. } \usage{ \method{print}{AttractorInfo}(x, activeOnly = FALSE, ...) } \arguments{ \item{x}{ An object of class \code{AttractorInfo} to be printed } \item{activeOnly}{ If set to true, a state is represented by a list of active genes (i.e., genes which are set to 1). If set to false, a state is represented by a binary vector with one entry for each gene, specifying whether the gene is active or not. Defaults to \code{FALSE}. } \item{\dots}{ Further parameters for the \code{\link{print}} method. Currently not used. } } \value{ Invisibly returns the printed object } \seealso{ \code{\link{print}}, \code{\link{getAttractors}} } \keyword{attractor print} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/plotStateGraph.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000007070�12122071021�015610� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{plotStateGraph} \Rdversion{1.1} \alias{plotStateGraph} \title{ Visualize state transitions and attractor basins } \description{ Plots a graph containing all states visited in \code{attractorInfo}, and optionally highlights attractors and basins of attraction. This requires the \pkg{igraph} package. } \usage{ plotStateGraph(attractorInfo, highlightAttractors = TRUE, colorBasins = TRUE, colorSet, drawLegend = TRUE, drawLabels = FALSE, layout = layout.fruchterman.reingold, piecewise = FALSE, basin.lty = 2, attractor.lty = 1, plotIt = TRUE, ...) } \arguments{ \item{attractorInfo}{ An object of class \code{AttractorInfo}, as returned by \code{\link{getAttractors}}. As the transition table information in this structure is required, \code{\link{getAttractors}} must be called in synchronous mode and with \code{returnTable} set to TRUE. } \item{highlightAttractors}{ If this parameter is true, edges in attractors are drawn bold and with a different line type (which can be specified in \code{attractor.lty}). Defaults to TRUE. } \item{colorBasins}{ If set to true, each basin of attraction is drawn in a different color. Colors can be specified in \code{colorSet}. Defaults to TRUE. } \item{colorSet}{ An optional vector specifying the colors to be used for the different attractor basins. If not supplied, a default color set is used. } \item{drawLegend}{ If set to true and \code{colorBasins} is true, a legend for the colors of the basins of attraction is drawn. Defaults to TRUE. } \item{drawLabels}{ If set to true, the binary encodings of the states are drawn beside the vertices of the graph. As this can be confusing for large graphs, the default value is FALSE. } \item{layout}{ A layouting function that determines the placement of the nodes in the graph. Please refer to the \code{\link[igraph]{layout}} manual entry in the \pkg{igraph} package for further details. By default, the Fruchterman-Reingold algorithm is used. } \item{piecewise}{ If set to true, a piecewise layout is used, i.e. the subgraphs corresponding to different basins of attraction are separated and layouted separately. } \item{basin.lty}{ The line type used for edges in a basin of attraction. Defaults to 2 (dashed). } \item{attractor.lty}{ If \code{highlightAttractors} is true, this specifies the line type for edges in an attractor. Defaults to 1 (straight). } \item{plotIt}{ If this is true, a plot is generated. Otherwise, only an object of class \code{igraph} is returned, but no plot is drawn. } \item{\dots}{ Further graphical parameters to be passed to \code{\link[igraph:plot.graph]{plot.igraph}}. } } \details{ This function uses the \code{\link[igraph:plot.graph]{plot.igraph}} function from the \pkg{igraph} package. The plots are customizeable using the \code{\dots} argument. For details on possible parameters, please refer to \code{\link[igraph:plot.common]{igraph.plotting}}. } \value{ Returns an invisible object of class \code{igraph} containing the state graph, including color and line attributes. } \seealso{ \code{\link{getAttractors}}, \code{\link{plotNetworkWiring}}, \code{\link[igraph:plot.common]{igraph.plotting}} } \examples{ # load example data data(cellcycle) # get attractors attractors <- getAttractors(cellcycle) # plot state graph plotStateGraph(attractors, main="Cell cycle network") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Boolean network attractor cycle basin transition state graph plot} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/plotSequence.Rd�������������������������������������������������������������������������0000654�0001762�0000144�00000013746�12122071021�015325� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{plotSequence} \alias{plotSequence} \title{ Plot a sequence of states } \description{ Visualizes sequences of states in synchronous Boolean networks, either by drawing a table of the involved states in two colors, or by drawing a graph of transitions between the successive states. } \usage{ plotSequence(network, startState, includeAttractorStates = c("all","first","none"), sequence, title = "", mode=c("table","graph"), plotFixed = TRUE, grouping = list(), onColor="green", offColor="red", layout, drawLabels=TRUE, drawLegend=TRUE, ...) } \arguments{ \item{network}{ An object of class \code{BooleanNetwork} for which a sequence of state transitions is calculated } \item{startState}{ The start state of the sequence } \item{includeAttractorStates}{ Specifies whether the actual attractor states are included in the plot or not (see also \code{\link{getPathToAttractor}}). If \code{includeAttractorStates = "all"} (which is the default behaviour), the sequence ends when the attractor was traversed once. If \code{includeAttractorStates = "first"}, only the first state of attractor is added to the sequence. If {includeAttractorStates = "none"}, the sequence ends with the last non-attractor state. } \item{sequence}{ The alternative call to \code{plotSequence} requires the specification of the sequence itself instead of the network and the start state. The sequence must be provided as a data frame with the genes in the columns and the successive states in the rows. For example, sequences can be obtained using \code{\link{getPathToAttractor}} or \code{\link{getAttractorSequence}} (however, the specialized plot \code{\link{plotAttractors}} exists for attractors).} \item{title}{ An optional title for the plot } \item{mode}{Switches between two kinds of attractor plots. See Details for more information. Default is "table".} \item{plotFixed}{This optional parameter is only used if \code{mode="table"}. If this is true, genes with fixed values are included in the plot. Otherwise, these genes are not drawn. } \item{grouping}{This optional parameter is only used if \code{mode="table"} and specifies a structure to form groups of genes in the plot. This is a list with the following elements: \describe{ \item{class}{A vector of names for the groups. These names will be printed in the region belonging to the group in the plot.} \item{index}{A list with the same length as \code{class}. Each element is a vector of gene names or gene indices belonging to the group.}} } \item{onColor}{This optional parameter is only used if \code{mode="table"} and specifies the color value for the 1/ON values in the table. Defaults to green. } \item{offColor}{This optional parameter is only used if \code{mode="table"} and specifies the color value for the 0/OFF values in the table. Defaults to red. } \item{layout}{If \code{mode="graph"}, this parameter specifies a layouting function that determines the placement of the nodes in the graph. Please refer to the \code{\link[igraph]{layout}} manual entry in the \pkg{igraph} package for further details. By default, the nodes are placed in a horizontal line. } \item{drawLabels}{This parameter is only relevant if \code{mode="graph"}. It determines whether the nodes of the graph are annotated with the corresponding values of the genes in the attractor states. } \item{drawLegend}{Specifies whether a color key for the ON/OFF states is drawn if \code{mode="table"}. Defaults to \code{TRUE}. } \item{\dots}{ Further graphical parameters to be passed to \code{\link[igraph:plot.graph]{plot.igraph}} if \code{mode="graph"}. } } \details{ This function comprises two different types of plots: The "table" mode visualizes the gene values of the states in the sequence. The figure is a table with the genes in the rows and the successive states of the sequence in the columns. Cells of the table are (by default) red for 0/OFF values and green for 1/ON values. If \code{grouping} is set, the genes are rearranged according to the indices in the group, horizontal separation lines are plotted between the groups, and the group names are printed. The "graph" mode visualizes the transitions between different states. It creates a graph in which the vertices are the states in the sequence and the edges are state transitions among these states. The function can be called with different types of inputs: The user can specify the parameters \code{network}, \code{startState} and \code{includeAttractorStates}), in which case \code{\link{getPathToAttractor}} is called to obtain the sequence. Alternatively, the sequence can be supplied directly as a data frame in the \code{sequence} parameter. } \value{ If \code{mode="table"}, a matrix corresponding to the table is returned. The matrix has the genes in the rows and the states of the attractors in the columns. If \code{sequence} was supplied, this corresponds to the transposed input whose rows may be rearranged if \code{grouping} was set. If \code{mode="graph"}, an object of class \code{igraph} describing the graph for the sequence is returned. } \seealso{ \code{\link{sequenceToLaTeX}}, \code{\link{plotAttractors}}, \code{\link{attractorsToLaTeX}}, \code{\link{getPathToAttractor}}, \code{\link{getAttractorSequence}} } \examples{ # load example data data(cellcycle) # alternative 1: supply network and start state # and plot sequence as a table plotSequence(network=cellcycle, startState=rep(1,10), includeAttractorStates="all") # alternative 2: calculate sequence in advance sequence <- getPathToAttractor(cellcycle, state=rep(1,10), includeAttractorStates="all") # plot sequence as a graph \donttest{plotSequence(sequence=sequence, mode="graph")} } \keyword{Boolean network state path sequence plot} ��������������������������BoolNet/man/plotPBNTransitions.Rd�������������������������������������������������������������������0000654�0001762�0000144�00000005411�12122071021�016420� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{plotPBNTransitions} \alias{plotPBNTransitions} \title{ Visualize the transitions in a probabilistic Boolean network } \description{ Visualizes the state transitions and their probabilities in a probabilistic Boolean network. This takes the transition table information calculated by the \code{\link{markovSimulation}} method. Only transitions with non-zero probability are included in the plot. The function requires the \pkg{igraph} package. } \usage{ plotPBNTransitions(markovSimulation, stateSubset, drawProbabilities = TRUE, drawStateLabels = TRUE, layout = layout.fruchterman.reingold, plotIt = TRUE, ...) } \arguments{ \item{markovSimulation}{ An object of class \code{MarkovSimulation}, as returned by \code{\link{markovSimulation}}. As the transition table information in this structure is required, \code{\link{markovSimulation}} must be called with \code{returnTable} set to TRUE. } \item{stateSubset}{ An optional list of states, where each element of the list must be a vector with a 0/1 entry for each gene. If this argument is supplied, the graph only contains the specified states and transitions between these states. } \item{drawProbabilities}{ If set to true, the edges of the graph are annotated with the probabilities of the corresponding transitions. Default is TRUE. } \item{drawStateLabels}{ If set to true, the vertices of the graph are annotated with the gene values of the corresponding states. Defaults to TRUE. } \item{layout}{ A layouting function that determines the placement of the nodes in the graph. Please refer to the \code{\link[igraph]{layout}} manual entry in the \pkg{igraph} package for further details. By default, the Fruchterman-Reingold algorithm is used. } \item{plotIt}{ If this is true, a plot is generated. Otherwise, only an object of class \code{igraph} is returned, but no plot is drawn. } \item{\dots}{ Further graphical parameters to be passed to \code{\link[igraph:plot.graph]{plot.igraph}}. } } \value{ Returns an invisible object of class \code{igraph} containing the wiring graph. } \details{ This function uses the \code{\link[igraph:plot.graph]{plot.igraph}} function from the \pkg{igraph} package. The plots are customizeable using the \code{\dots} argument. For details on possible parameters, please refer to \code{\link[igraph:plot.common]{igraph.plotting}}. } \seealso{ \code{\link{markovSimulation}} } \examples{ # load example network data(examplePBN) # perform a Markov chain simulation sim <- markovSimulation(examplePBN) # plot the transitions and their probabilities \donttest{plotPBNTransitions(sim)} } \keyword{probabilistic Boolean network PBN Boolean network plot transition graph} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/plotNetworkWiring.Rd��������������������������������������������������������������������0000654�0001762�0000144�00000004036�12122071021�016356� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{plotNetworkWiring} \alias{plotNetworkWiring} \title{ Plot the wiring of a Boolean network } \description{ Plots the wiring of genes (i.e. the gene dependencies) of a synchronous or probabilistic Boolean network. The nodes of the graph are the genes, and the directed edges show the dependencies of the genes. This requires the \pkg{igraph} package. } \usage{ plotNetworkWiring(network, layout = layout.fruchterman.reingold, plotIt = TRUE, ...) } \arguments{ \item{network}{ A network structure of class \code{BooleanNetwork} or \code{ProbabilisticBooleanNetwork}. These networks can be read from files by \code{\link{loadNetwork}}, generated by \if{latex}{\cr}\code{\link{generateRandomNKNetwork}}, or reconstructed by \code{\link{reconstructNetwork}}. } \item{layout}{ A layouting function that determines the placement of the nodes in the graph. Please refer to the \code{\link[igraph]{layout}} manual entry in the \pkg{igraph} package for further details. By default, the Fruchterman-Reingold algorithm is used. } \item{plotIt}{ If this is true, a plot is generated. Otherwise, only an object of class \code{igraph} is returned, but no plot is drawn. } \item{\dots}{ Further graphical parameters to be passed to \code{\link[igraph:plot.graph]{plot.igraph}}. } } \details{ This function uses the \code{\link[igraph:plot.graph]{plot.igraph}} function from the \pkg{igraph} package. The plots are customizeable using the \code{\dots} argument. For details on possible parameters, please refer to \code{\link[igraph:plot.common]{igraph.plotting}}. } \value{ Returns an invisible object of class \code{igraph} containing the wiring graph. } \seealso{ \code{\link{loadNetwork}}, \code{\link{generateRandomNKNetwork}}, \code{\link{reconstructNetwork}}, \code{\link{plotStateGraph}}, \code{\link[igraph:plot.graph]{igraph.plotting}} } \examples{ # load example data data(cellcycle) # plot wiring graph \donttest{plotNetworkWiring(cellcycle)} } \keyword{wiring graph plot Boolean network dependencies} ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/plotAttractors.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000013342�12122071021�015673� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{plotAttractors} \Rdversion{1.1} \alias{plotAttractors} \title{ Plot state tables or transition graphs of attractors } \description{ Visualizes attractors, either by drawing a table of the involved states in two colors, or by drawing a graph of transitions between the states of the attractor. } \usage{ plotAttractors(attractorInfo, subset, title = "", mode = c("table","graph"), grouping = list(), plotFixed = TRUE, onColor = "green", offColor = "red", layout = layout.circle, drawLabels = TRUE, drawLegend = TRUE, ...) } \arguments{ \item{attractorInfo}{ An object of class \code{AttractorInfo}, as returned by \code{\link{getAttractors}} } \item{subset}{An subset of attractors to be plotted. This is a vector of attractor indices in \code{attractorInfo}.} \item{title}{ An optional title for the plot } \item{mode}{Switches between two kinds of attractor plots. See Details for more information. Default is "table".} \item{grouping}{This optional parameter is only used if \code{mode="table"} and specifies a structure to form groups of genes in the plot. This is a list with the following elements: \describe{ \item{class}{A vector of names for the groups. These names will be printed in the region belonging to the group in the plot.} \item{index}{A list with the same length as \code{class}. Each element is a vector of gene names or gene indices belonging to the group.}} } \item{plotFixed}{This optional parameter is only used if \code{mode="table"}. If this is true, genes with fixed values are included in the plot. Otherwise, these genes are not drawn. } \item{onColor}{This optional parameter is only used if \code{mode="table"} and specifies the color value for the 1/ON values in the table. Defaults to green. } \item{offColor}{This optional parameter is only used if \code{mode="table"} and specifies the color value for the 0/OFF values in the table. Defaults to red. } \item{layout}{If \code{mode="graph"}, this parameter specifies a layouting function that determines the placement of the nodes in the graph. Please refer to the \code{\link[igraph]{layout}} manual entry in the \pkg{igraph} package for further details. By default, the circle layout is used. } \item{drawLabels}{This parameter is only relevant if \code{mode="graph"}. It determines whether the nodes of the graph are annotated with the corresponding values of the genes in the attractor states. } \item{drawLegend}{Specifies whether a color key for the ON/OFF states is drawn if \code{mode="table"}. Defaults to \code{TRUE}. } \item{\dots}{ Further graphical parameters to be passed to \code{\link[igraph:plot.graph]{plot.igraph}} if \code{mode="graph"}. } } \details{ This function comprises two different types of plots: The "table" mode visualizes the gene values of the states in the attractor and is only suited for synchronous or steady-state attractors. Complex asynchronous attractors are omitted in this mode. Attractors in \code{attractorInfo} are first grouped by length. Then, a figure is plotted to the currently selected device for each attractor length (i.e. one plot with all attractors consisting of 1 state, one plot with all attractors consisting of 2 states, etc.). This means that on the standard X11 output device, only the last plot is displayed unless you set \code{par(mfrow=c(...))} accordingly. The figure is a table with the genes in the rows and the states of the attractors in the columns. Cells of the table are (by default) red for 0/OFF values and green for 1/ON values. If \code{grouping} is set, the genes are rearranged according to the indices in the group, horizontal separation lines are plotted between the groups, and the group names are printed. The "graph" mode visualizes the transitions between different states. It creates a graph in which the vertices are the states in the attractor and the edges are state transitions among these states. This mode can visualize all kinds of attractors, including complex/loose attractors. One plot is drawn for each attractor. As before, this means that on the standard output device, only the last plot is displayed unless you set \code{par(mfrow=c(...))} accordingly. } \value{ If \code{mode="table"}, a list of matrices corresponding to the tables is returned. Each of these matrices has the genes in the rows and the states of the attractors in the columns. If \code{mode="graph"}, a list of objects of class \code{igraph} is returned. Each of these objects describes the graph for one attractor. } \seealso{ \code{\link{getAttractors}}, \code{\link{attractorsToLaTeX}}, \code{\link{plotSequence}}, \code{\link{sequenceToLaTeX}} } \examples{ # load example data data(cellcycle) # get attractors attractors <- getAttractors(cellcycle) # calculate number of different attractor lengths, # and plot attractors side by side in "table" mode par(mfrow=c(1, length(table(sapply(attractors$attractors, function(attractor) { length(attractor$involvedStates) }))))) plotAttractors(attractors) # plot attractors in "graph" mode par(mfrow=c(1, length(attractors$attractors))) \donttest{plotAttractors(attractors, mode="graph")} # identify asynchronous attractors attractors <- getAttractors(cellcycle, type="asynchronous") # plot attractors in "graph" mode par(mfrow=c(1, length(attractors$attractors))) \donttest{plotAttractors(attractors, mode="graph")} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{LaTeX Boolean network attractor cycle basin transition state graph plot} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/perturbNetwork.Rd�����������������������������������������������������������������������0000654�0001762�0000144�00000007760�12122071021�015712� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{perturbNetwork} \Rdversion{1.1} \alias{perturbNetwork} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Perturb a Boolean network randomly } \description{ Modifies a synchronous, asynchronous, or probabilistic Boolean network by randomly perturbing either the functions for single genes or the state transitions. Random perturbations can be employed to assess the stability of the network. } \usage{ perturbNetwork(network, perturb = c("functions","states"), method = c("bitflip","shuffle"), simplify = (perturb[1]=="states"), readableFunctions = FALSE, excludeFixed = TRUE, maxNumBits = 1, numStates = max(1,2^length(network$genes)/100)) } \arguments{ \item{network}{ A network structure of class \code{BooleanNetwork} or \code{ProbabilisticBooleanNetwork}. These networks can be read from files by \code{\link{loadNetwork}}, generated by \if{latex}{\cr}\code{\link{generateRandomNKNetwork}}, or reconstructed by \code{\link{reconstructNetwork}}. } \item{perturb}{ If set to "functions", a transition function of a single gene is chosen at random and perturbed directly. This is the default mode. If set to "states", the transition table is generated, one or several state transitions are perturbed randomly, and the gene transition functions are rebuilt from the modified transition table. \code{perturb="states"} is only allowed for non-probabilistic networks of class \code{BooleanNetworks}. } \item{method}{ The perturbation method to be applied to the functions or transitions. "bitflip" randomly inverts one or several bits (depending on the value of \code{maxNumBits}). "shuffle" generates a random permutation of the positions in the function or state and rearranges the bits according to this permutation. } \item{simplify}{ If this is true, \code{\link{simplifyNetwork}} is called to simplify the gene transition functions after the perturbation. This removes irrelevant input genes. Defaults to TRUE if \code{perturb} is "states", and to FALSE otherwise. } \item{readableFunctions}{ If this is true, readable DNF representations of the truth tables of the functions are generated. These DNF are displayed when the network is printed. The DNF representations are not minimized and can thus be very long. If set to FALSE, the truth table result column is displayed. } \item{excludeFixed}{ Determines whether fixed variables can also be perturbed (if set to FALSE) or if they are excluded from the perturbation (if set to TRUE). Default is TRUE. } \item{maxNumBits}{ The maximum number of bits to be perturbed in one function or state. Defaults to 1. } \item{numStates}{ The number of states to be perturbed if \code{perturb} is "states". Defaults to 1% of all states. } } \value{ Depending on the input, an object of class \code{BooleanNetwork} or \code{ProbabilisticBooleanNetwork} containing the perturbed copy of the original network is returned. The classes \code{BooleanNetwork} and \code{ProbabilisticBooleanNetwork} are described in more detail in \code{\link{loadNetwork}}. } \seealso{ \code{\link{loadNetwork}}, \code{\link{generateRandomNKNetwork}}, \code{\link{reconstructNetwork}}, \code{\link{simplifyNetwork}}} \examples{ # load example data data(cellcycle) # perturb the network perturbedNet1 <- perturbNetwork(cellcycle, perturb="functions", method="shuffle") perturbedNet2 <- perturbNetwork(cellcycle, perturb="states", method="bitflip") # get attractors print(getAttractors(perturbedNet1)) print(getAttractors(perturbedNet2)) } \references{ Y. Xiao and E. R. Dougherty (2007), The impact of function perturbations in Boolean networks. Bioinformatics 23(10):1265--1273. I. Shmulevich, E. R. Dougherty, W. Zhang (2002), Control of stationary behavior in probabilistic Boolean networks by means of structural intervention. Journal of Biological Systems 10(4):431--445. } \keyword{Boolean network probabilistic Boolean network PBN state perturb perturbation noise robustness} ����������������BoolNet/man/markovSimulation.Rd���������������������������������������������������������������������0000654�0001762�0000144�00000007130�12122071021�016210� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{markovSimulation} \alias{markovSimulation} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Identify important states in probabilistic Boolean networks } \description{ Identifies important states in probabilistic Boolean networks (PBN) using a Markov chain simulation } \usage{ markovSimulation(network, numIterations = 1000, startStates = list(), cutoff = 0.001, returnTable = TRUE) } \arguments{ \item{network}{ An object of class \code{ProbabilisticBooleanNetwork} or \code{BooleanNetwork} whose transitions are simulated } \item{numIterations}{ The number of iterations for the matrix multiplication, which corresponds to the number of state transitions to simulate } \item{startStates}{ An optional list of start states. Each entry of the list must be a vector with a 0/1 value for each gene. If specified, the simulation is restricted to the states reachable from the supplied start states. Otherwise, all states are considered. } \item{cutoff}{ The cutoff value used to determine if a probability is 0. All output probabilities less than or equal to this value are set to 0. } \item{returnTable}{ If set to true, a transition table annotated with the probabilities for the transitions is included in the results. This is required by \code{\link{plotPBNTransitions}} and \code{\link{getTransitionProbabilities}}. } } \details{ The algorithm identifies important states by performing the following steps: First, a Markov matrix is calculated from the set of transition functions, where each entry of the matrix specifies the probability of a state transition from the state belonging to the corresponding row to the state belonging to the corresponding column. A vector is initialized with uniform probability for all states (or -- if specified -- uniform probability for all start states) and repeatedly multiplied with the Markov matrix. The method returns all states with non-zero probability in this vector. See the references for more details. } \value{ An object of class \code{MarkovSimulation} with the following components: \item{reachedStates}{A data frame with one state in each row. The first columns specify the gene values of the state, and the last column holds the probability that the corresponding state is reached after \code{numIterations} transitions. Only states with a probability greater than \code{cutoff} are included in this table.} \item{genes}{A vector of gene names of the input network} \item{table}{If \code{returnTable=TRUE}, this structure holds a table of transitions with the corresponding probabilities that transitions are chosen. This is a list with the following components: \describe{ \item{initialStates}{A matrix of encoded start states of the transitions} \item{nextStates}{The encoded successor states of the transitions} \item{probabilities}{The probabilities that the transitions are chosen in a single step} }} } \references{ I. Shmulevich, E. R. Dougherty, S. Kim, W. Zhang (2002), Probabilistic Boolean networks: a rule-based uncertainty model for gene regulatory networks. Bioinformatics 18(2):261--274. } \seealso{ \code{\link{reconstructNetwork}}, \code{\link{plotPBNTransitions}}, \code{\link{getTransitionProbabilities}} } \examples{ # load example network data(examplePBN) # perform a Markov chain simulation sim <- markovSimulation(examplePBN) # print the relevant states and transition probabilities print(sim) # plot the transitions and their probabilities \donttest{plotPBNTransitions(sim)} } \keyword{probabilistic Boolean network PBN Markov chain } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/loadSBML.Rd�����������������������������������������������������������������������������0000644�0001762�0000144�00000003031�12122071021�014234� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{loadSBML} \alias{loadSBML} \title{ Load an SBML document } \description{ Loads an SBML document that specifies a qualitative model using the \code{sbml-qual} extension package. } \usage{ loadSBML(file) } \arguments{ \item{file}{ The SBML document to be imported } } \details{ The import assumes an SBML level 3 version 1 document with the \code{sbml-qual} extension package version 1.0. \pkg{BoolNet} only supports a subset of the \code{sbml-qual} standard. The function tries to import those documents that describe a logical model with two possible values per species. It does not support general logical models with more than two values per species or Petri nets. Further details on the import: \itemize{ \item{The import supports multiple function terms with the same output for a transition and interprets them as a disjunction, as proposed in the specification.} \item{Comparison operators are converted to the corresponding Boolean expressions.} \item{Compartments are ignored.} } For the import, the \pkg{XML} package is required. } \value{ Returns a structure of class \code{BooleanNetwork}, as described in \code{\link{loadNetwork}}. } \references{ \url{http://sbml.org/Community/Wiki/SBML_Level_3_Proposals/Qualitative_Models} } \seealso{ \code{\link{toSBML}}, \code{\link{loadNetwork}} } \examples{ # load the cell cycle network data(cellcycle) # export the network to SBML toSBML(cellcycle, "cellcycle.sbml") # reimport the model print(loadSBML("cellcycle.sbml")) } \keyword{SBML Boolean network file import} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/loadNetwork.Rd��������������������������������������������������������������������������0000654�0001762�0000144�00000015231�12122071021�015136� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{loadNetwork} \Rdversion{1.1} \alias{loadNetwork} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Load a Boolean network from a file } \description{ Loads a Boolean network or probabilistic Boolean network from a file and converts it to an internal transition table representation. } \usage{ loadNetwork(file, bodySeparator = ",", lowercaseGenes = FALSE) } \arguments{ \item{file}{ The name of the file to be read } \item{bodySeparator}{ An optional separation character to divide the target factors and the formulas. Default is ",". } \item{lowercaseGenes}{ If set to \code{TRUE}, all gene names are converted to lower case, i.e. the gene names are case-insensitive. This corresponds to the behaviour of \pkg{BoolNet} versions prior to 1.5. Defaults to \code{FALSE}. } } \details{ The routine supports a description language based on the Boolean operators AND (&), or (|), and NOT (!). The first line contains a header. In case of a Boolean network with only one function per gene, the header is "targets, functions"; in a probabilistic network, there is an optional third column "probabilities". All subsequent lines contain Boolean rules or comment lines that are omitted by the parser. A rule consists of a target gene, a separator, a Boolean expression to calculate a transition step for the target gene, and an optional probability for the rule (for probabilistic Boolean networks only -- see below). The EBNF description of the network file format is as follows: \preformatted{ Network = Header Newline {Rule Newline | Comment Newline}; Header = "targets" Separator "factors"; Rule = GeneName Separator BooleanExpression [Separator Probability]; Comment = "#" String; BooleanExpression = GeneName | "!" BooleanExpression | "(" BooleanExpression ")" | BooleanExpression " & " BooleanExpression | BooleanExpression " | " BooleanExpression; GeneName = ? A gene name from the list of involved genes ?; Separator = ","; Probability = ? A floating-point number ?; String = ? Any sequence of characters (except a line break) ?; Newline = ? A line break character ?; } If there is exactly one rule for each gene, a Boolean network of class \code{BooleanNetwork} is created. In these networks, constant genes are automatically fixed (e.g. knocked-out or over-expressed). This means that they are always set to the constant value, and states with the complementary value are not considered in transition tables etc. If you would like to change this behaviour, use \code{\link{fixGenes}} to reset the fixing. If two or more rules exist for the same gene, the function returns a probabilistic network of class \code{ProbabilisticBooleanNetwork}. In this case, alternative rules may be annotated with probabilities, which must sum up to 1 for all rules that belong to the same gene. If no probabilities are supplied, uniform distribution is assumed. } \value{ If only one function per gene is specified, a structure of class \code{BooleanNetwork} representing the network is returned. It has the following components: \item{genes}{A vector of gene names involved in the network. This list determines the indices of genes in inputs of functions or in state bit vectors.} \item{interactions}{A list with \code{length(genes)} elements, where the i-th element describes the transition function for the i-th gene. Each element has the following sub-components: \describe{ \item{input}{A vector of indices of the genes that serve as the input of the Boolean transition function. If the function has no input (i.e. the gene is constant), the vector consists of a zero element.} \item{func}{The transition function in truth table representation. This vector has \if{latex}{\cr}\code{2^length(input)} entries, one for each combination of input variables. If the gene is constant, the function is 1 or 0.} \item{expression}{A string representation of the Boolean expression from which the truth table was generated} }} \item{fixed}{A vector specifying which genes are knocked-out or over-expressed. For each gene, there is one element which is set to 0 if the gene is knocked-out, to 1 if the gene is over-expressed, and to -1 if the gene is not fixed at all, i. e. can change its value according to the supplied transition function. Constant genes are automatically set to fixed values.} If there is at least one gene with two or more alternative transition functions, a structure of class \code{ProbabilisticBooleanNetwork} is returned. This structure is similar to \code{BooleanNetwork}, but allows for storing more than one function in an interaction. It consists of the following components: \item{genes}{A vector of gene names involved in the network. This list determines the indices of genes in inputs of functions or in state bit vectors.} \item{interactions}{A list with \code{length(genes)} elements, where the i-th element describes the alternative transition functions for the i-th gene. Each element is a list of transition functions. In this second-level list, each element has the the following sub-components: \describe{ \item{input}{A vector of indices of the genes that serve as the input of the Boolean transition function. If the function has no input (i.e. the gene is constant), the vector consists of a zero element.} \item{func}{The transition function in truth table representation. This vector has \if{latex}{\cr}\code{2^length(input)} entries, one for each combination of input variables. If the gene is constant, the function is -1.} \item{expression}{A string representation of the underlying Boolean expression} \item{probability}{The probability that the corresponding transition function is chosen} }} \item{fixed}{A vector specifying which genes are knocked-out or over-expressed. For each gene, there is one element which is set to 0 if the gene is knocked-out, to 1 if the gene is over-expressed, and to -1 if the gene is not fixed at all, i. e. can change its value according to the supplied transition function. You can knock-out and over-express genes using \code{\link{fixGenes}}.} } \seealso{ \code{\link{getAttractors}}, \code{\link{markovSimulation}}, \code{\link{stateTransition}}, \code{\link{fixGenes}}, \code{\link{loadSBML}} } \examples{ # write example network to file sink("testNet.bn") cat("targets, functions\n") cat("Gene1, !Gene2 | !Gene3\n") cat("Gene2, Gene3 & Gene4\n") cat("Gene3, Gene2 & !Gene1\n") cat("Gene4, 1\n") sink() # read file net <- loadNetwork("testNet.bn") print(net) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Boolean network probabilistic Boolean network PBN file logic parse} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/loadBioTapestry.Rd����������������������������������������������������������������������0000654�0001762�0000144�00000003271�12122071021�015753� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{loadBioTapestry} \alias{loadBioTapestry} \title{ Import a network from BioTapestry } \description{ Imports a Boolean network from a BioTapestry file (*.btp). BioTapestry is an interactive tool for building, visualizing, and simulating gene-regulatory networks, and can be accessed at \url{http://www.biotapestry.org}. } \usage{ loadBioTapestry(file) } \arguments{ \item{file}{ The name of the file to import. This must be a BioTapestry XML file (*.btp). } } \details{ The function builds up a Boolean network by importing the nodes, the links between these nodes, and the simulation parameters of the top-level plot of a BioTapestry file. The BioTapestry network should have the following properties: \itemize{ \item All links should be either enhancers or repressors. Unspecified ("neutral") links are ignored. \item In the simulation parameters, each node should specify the correct logical function (AND, OR, XOR) for its inputs. \item Constant genes can be generated by modeling a gene without any input link and setting the simulation parameter \code{initVal} to 0 or 1. } } \value{ A network of class \code{BooleanNetwork}, as described in \code{\link{loadNetwork}}. } \references{ W. J. R. Longabaugh, E. H. Davidson, H. Bolour (2005), Computational representation of developmental genetic regulatory networks. Developmental Biology 283(1):1--16. } \seealso{ \code{\link{loadNetwork}}, \code{\link{loadSBML}} } \examples{ # import the example BioTapestry file # included in the package vignette exampleFile <- system.file("doc/example.btp", package="BoolNet") net <- loadBioTapestry(exampleFile) # print the imported network print(net) } \keyword{BioTapestry import} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/getTransitionTable.Rd�������������������������������������������������������������������0000654�0001762�0000144�00000003743�12122071021�016454� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{getTransitionTable} \Rdversion{1.1} \alias{getTransitionTable} \title{ Retrieve the transition table of a network } \description{ Retrieves the transition table and additional attractor information of a network. } \usage{ getTransitionTable(attractorInfo) } \arguments{ \item{attractorInfo}{ An object of class \code{AttractorInfo}, as returned by \code{\link{getAttractors}}. As the transition table information in this structure is required, \code{getAttractors} must be called in synchronous mode and with \code{returnTable} set to TRUE. } } \details{ Depending on the configuration of the call to \code{getAttractors} that returned \code{attractorInfo}, this function either returns the complete transition table (for exhaustive synchronous search) or the part of the transition table calculated in a heuristic synchronous search. Asynchronous search is not supported, as no transition table is calculated. } \value{ Returns a generic dataframe of the class \code{TransitionTable}. For n genes, the first n columns code for the original state (in this case, the \code{state} parameter), i.e. each column represents the value of one gene. The next n columns code for the successive state after a transition. The column \code{attractorAssignment} indicates the attractor to the state is assigned, and the column \code{stepsToAttractor} indicates how many transitions are needed from the original state to the attractor. The table has a row for each possible input state. The \code{TransitionTable} class supports pretty printing using the \code{\link{print}} method. } \seealso{ \code{\link{getStateSummary}}, \code{\link{getBasinOfAttraction}}, \code{\link{getAttractors}} } \examples{ # load example data data(cellcycle) # get attractors attractors <- getAttractors(cellcycle) # print the transition table print(getTransitionTable(attractors)) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Boolean network transition transition table state} �����������������������������BoolNet/man/getTransitionProbabilities.Rd�����������������������������������������������������������0000654�0001762�0000144�00000002676�12122071021�020221� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{getTransitionProbabilities} \alias{getTransitionProbabilities} \title{ Get a matrix of transitions and their probabilities in probabilistic Boolean networks } \description{ Retrieves the state transitions and their probabilities in a probabilistic Boolean network. This takes the transition table information calculated by the \code{\link{markovSimulation}} method. } \usage{ getTransitionProbabilities(markovSimulation) } \arguments{ \item{markovSimulation}{ An object of class \code{MarkovSimulation}, as returned by \code{\link{markovSimulation}}. As the transition table information in this structure is required, \code{\link{markovSimulation}} must be called with \code{returnTable} set to TRUE. } } \value{ Returns a data frame with the first \code{n} columns describing the values of the genes before the transition, the next \code{n} columns describing the values of the genes after the transition, and the last column containing the probability of the transition. Here, \code{n} is the number of genes in the underlying network. Only transitions with non-zero probability are included. } \seealso{ \code{\link{markovSimulation}} } \examples{ # load example network data(examplePBN) # perform a Markov chain simulation sim <- markovSimulation(examplePBN) # print out the probability table print(getTransitionProbabilities(sim)) } \keyword{Boolean network probabilistic Boolean network PBN transition probability} ������������������������������������������������������������������BoolNet/man/getStateSummary.Rd����������������������������������������������������������������������0000654�0001762�0000144�00000003533�12122071021�016005� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{getStateSummary} \Rdversion{1.1} \alias{getStateSummary} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Retrieve summary information on a state } \description{ Returns information on the supplied state, i.e. the successive state after a transition, the (synchronous) attractor to which the state leads, and the distance to this attractor. } \usage{ getStateSummary(attractorInfo, state) } \arguments{ \item{attractorInfo}{ An object of class \code{AttractorInfo}, as returned by \code{\link{getAttractors}}. As the transition table information in this structure is required, \code{getAttractors} must be called in synchronous mode and with \code{returnTable} set to TRUE. } \item{state}{ A 0-1 vector with n elements (where n is the number of genes in the underlying networks) describing the state. } } \value{ Returns a generic dataframe of the class \code{TransitionTable}. For n genes, the first n columns code for the original state (in this case, the \code{state} parameter), i.e. each column represents the value of one gene. The next n columns code for the successive state after a transition. The column \code{attractorAssignment} indicates the attractor to the state is assigned, and the column \code{stepsToAttractor} indicates how many transitions are needed from the original state to the attractor. In this case, the table has only one row describing the supplied state. The \code{TransitionTable} class supports pretty printing using the \code{\link{print}} method. } \seealso{ \code{\link{getBasinOfAttraction}}, \code{\link{getTransitionTable}}, \code{\link{getAttractors}} } \examples{ # load example data data(cellcycle) # get attractors attractors <- getAttractors(cellcycle) # print information for an arbitrary state print(getStateSummary(attractors, c(1,1,1,1,1,1,1,1,1,1))) } \keyword{Boolean network transition state} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/getPathToAttractor.Rd�������������������������������������������������������������������0000654�0001762�0000144�00000004617�12122071021�016436� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{getPathToAttractor} \alias{getPathToAttractor} \title{ Get state transitions between a state and its attractor } \description{ Lists the states in the path from a specified state to the corresponding synchronous attractor. } \usage{ getPathToAttractor(network, state, includeAttractorStates = c("all","first","none")) } \arguments{ \item{network}{Either a structure of class \code{BooleanNetwork}, or a structure of class \code{AttractorInfo}. In the former case, a synchronous attractor search starting from \code{state} is conducted. In the latter case, \code{network} must be the result of a call to \code{\link{getAttractors}} with \code{returnTable=TRUE}, and its transition table must include \code{state}. } \item{state}{ A binary vector with exactly one entry per gene in the network. } \item{includeAttractorStates}{ Specifies whether the actual attractor states are included in the resulting table or not. If \code{includeAttractorStates = "all"} (which is the default behaviour), the sequence ends when the attractor was traversed once. If \code{includeAttractorStates = "first"}, only the first state of attractor is added to the sequence. This corresponds to the behaviour prior to \pkg{BoolNet} version 1.5. If {includeAttractorStates = "none"}, the sequence ends with the last non-attractor state. In this case, the sequence can be empty if the start state is an attractor state. } } \value{ Returns a data frame with the genes in the columns. The rows are the successive states from \code{state} to the the corresponding attractor. Depending on \code{includeAttractorStates}, attractor states are included or not. } \seealso{ \code{\link{getAttractors}}, \code{\link{getTransitionTable}}, \code{\link{getBasinOfAttraction}} } \examples{ # load example network data(cellcycle) # get path from a state to its attractor # include all attractor states path <- getPathToAttractor(cellcycle, rep(1,10), includeAttractorStates="all") print(path) # include only the first attractor state path <- getPathToAttractor(cellcycle, rep(1,10), includeAttractorStates="first") print(path) # exclude attractor states path <- getPathToAttractor(cellcycle, rep(1,10), includeAttractorStates="none") print(path) } \keyword{Boolean network sequence path basin attractor} �����������������������������������������������������������������������������������������������������������������BoolNet/man/getBasinOfAttraction.Rd�����������������������������������������������������������������0000654�0001762�0000144�00000004312�12122071021�016715� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{getBasinOfAttraction} \Rdversion{1.1} \alias{getBasinOfAttraction} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Get states in basin of attraction } \description{ Extracts information on all states in the basin of a supplied attractor } \usage{ getBasinOfAttraction(attractorInfo, attractorNo) } \arguments{ \item{attractorInfo}{ An object of class \code{AttractorInfo}, as returned by \code{\link{getAttractors}}. As the transition table information in this structure is required, \code{getAttractors} must be called in synchronous mode and with \code{returnTable} set to TRUE. } \item{attractorNo}{ The index of the attractor in \code{attractorInfo} whose basin should be identified } } \details{ The function outputs a transition table containing only the states that are contained in the basin of attraction, and displays additional information on these states. If \code{attractorInfo} is the result of an exhaustive synchronous attractor search, the complete basin of attraction is returned. If \code{attractorInfo} is the result of a heuristic synchronous search, there is no guarantee that the complete basin of attraction is returned, as only the calculated states are included. Asynchronous search results are not supported, as no transition table is calculated. } \value{ Returns a generic dataframe of the class \code{TransitionTable}. For n genes, the first n columns code for the original state, i.e. each column represents the value of one gene. The next n columns code for the successive state after a transition. The column \code{attractorAssignment} indicates the attractor to the state is assigned (in this case, \code{attractorNo}), and the column \code{stepsToAttractor} indicates how many transitions are needed from the original state to the attractor. The \code{TransitionTable} class supports pretty printing using the \code{\link{print}} method. } \seealso{ \code{\link{getStateSummary}}, \code{\link{getTransitionTable}}, \code{\link{getAttractors}} } \examples{ # load example data data(cellcycle) # get attractors attractors <- getAttractors(cellcycle) # print basin of first attractor print(getBasinOfAttraction(attractors, 1)) } \keyword{Boolean network attractor cycle basin} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/getAttractorSequence.Rd�����������������������������������������������������������������0000654�0001762�0000144�00000002311�12122071021�016774� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{getAttractorSequence} \alias{getAttractorSequence} \title{ Decode the state sequence of a synchronous attractor } \description{ Obtains the sequence of states belonging to a single synchronous attractor from the encoded data in an \code{AttractorInfo} structure. } \usage{ getAttractorSequence(attractorInfo, attractorNo) } \arguments{ \item{attractorInfo}{ An object of class \code{AttractorInfo}, as returned by \code{\link{getAttractors}}. \code{getAttractors} must be called in synchronous mode. } \item{attractorNo}{ The index of the attractor in \code{attractorInfo} whose state sequence should be obtained } } \value{ Returns a data frame with the genes in the columns. The rows are the successive states of the attractor. The successor state of the last state (i.e. the last row) is the first state (i.e. the first row). } \seealso{ \code{\link{getAttractors}}, \code{\link{getPathToAttractor}}, \code{\link{plotSequence}}, \code{\link{sequenceToLaTeX}} } \examples{ # load example data data(cellcycle) # get attractors attractors <- getAttractors(cellcycle) # print basin of 7-state attractor print(getAttractorSequence(attractors, 2)) } \keyword{Boolean network attractor cycle sequence state} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/getAttractors.Rd������������������������������������������������������������������������0000654�0001762�0000144�00000025645�12122071021�015505� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{getAttractors} \Rdversion{1.1} \alias{getAttractors} %- Also NEED an '\alias' for EACH other topic documented here. \title{Identify attractors in a Boolean network} \description{Identifies attractors (cycles) in a supplied Boolean network using synchronous or asynchronous state transitions} \usage{ getAttractors(network, type = c("synchronous","asynchronous"), method = c("exhaustive","random","chosen"), startStates = list(), genesON = c(), genesOFF = c(), canonical = TRUE, randomChainLength = 10000, avoidSelfLoops = TRUE, geneProbabilities = NULL, returnTable = TRUE) } \arguments{ \item{network}{ A network structure of class \code{BooleanNetwork}. These networks can be read from files by \code{\link{loadNetwork}}, generated by \code{\link{generateRandomNKNetwork}}, or reconstructed by \code{\link{reconstructNetwork}}. } \item{type}{ If \code{type="synchronous"}, synchronous state transitions are used, i.e. all genes are updated at the same time. Synchronous attractor search can be performed in an exhaustive manner or using a heuristic that starts from predefined states. If \code{type="asynchronous"}, asynchronous state transitions are performed, i.e. one (randomly chosen) gene is updated in each transition. Steady-state attractors are the same in asynchronous and synchronous networks, but the asynchronous search is also able to identify complex/loose attractors. Asynchronous search relies on a heuristic algorithm that starts from predefined states. See Details for more information on the algorithms. } \item{method}{ The search method to be used. If "exhaustive", attractors are identified by exhaustive search of all 2^n states (where n is the number of genes that are not set to a fixed value). This kind of search is only available for synchronous attractor search, and the maximum number of genes allowed for exhaustive search is 29, as R cannot allocate memory for larger state tables. If \code{method} is "random", \code{startStates} is interpreted as an integer value specifying the number of states to be generated randomly. The algorithm is then initialized with these random states and identifies the attractors to which these states lead. If \code{method} is "chosen", \code{startStates} is interpreted as a list of binary vectors, each specifying one input state. Each vector must have \code{length(network$genes)} elements with 0 or 1 values. The algorithm identifies the attractors to which the supplied states lead. If \code{method} is not supplied, the desired method is inferred from the type of \code{startStates}. By default, if neither \code{method} nor \code{startStates} are provided, an exhaustive search is performed. } \item{startStates}{ The value of \code{startStates} depends on the chosen method. See \code{method} for more details. } \item{genesON}{ A vector of genes whose values are fixed to 1, which reduces the complexity of the search. This is equivalent to a preceding call of \code{\link{fixGenes}}. } \item{genesOFF}{ A vector of genes whose values are fixed to 0, which reduces the complexity of the search. This is equivalent to a preceding call of \code{\link{fixGenes}}. } \item{canonical}{ If set to true, the states in the attractors are rearranged such that the state whose binary encoding makes up the smallest number is the first element of the vector. This ensures that attractors found by different heuristic runs of \code{getAttractors} are comparable, as the cycles may have been entered at different states in different runs of the algorithm. } \item{randomChainLength}{ If \code{type="asynchronous"}, this parameter specifies the number of random transitions performed by the search to enter a potential attractor (see Details). Defaults to 10000. } \item{avoidSelfLoops}{ If \code{type="asynchronous"} and \code{avoidSelfLoops=TRUE}, the asynchronous attractor search only enters self loops (i.e. transitions that result in the same state) if none of the possible transitions can leave the state. This results in attractors with fewer edges. Otherwise, self loops are included in the attractors. By default, self loops are avoided. } \item{geneProbabilities}{ If \code{type="asynchronous"}, this allows to specify probabilities for the genes. By default, each gene has the same probability to be chosen for the next state transition. You can supply a vector of probabilities for each of the genes which sums up to one. } \item{returnTable}{ Specifies whether a transition table is included in the returned \code{AttractorInfo} structure. If \code{type="asynchronous"}, this parameter is ignored, as the asynchronous search never returns a transition table due to the large size. } } \details{ There are three different modes of attractor search: \describe{ \item{Exhaustive synchronous search}{ In this mode, synchronous state transitions are carried out from each of the possible states until an attractor is reached. This identifies all synchronous attractors. } \item{Heuristic synchronous search}{ In contrast to exhaustive synchronous search, only a subset of the possible states is used. From these states, synchronous transitions are carried out until an attractor is reached. This subset is specified in \code{startStates}. } \item{Heuristic asynchronous search}{ This algorithm uses asynchronous state transitions and is able to identify steady-state and complex/loose attractors (see Harvey and Bossomaier, Garg et al.). These attractors are sets of states from which all possible asynchronous transitions lead into a state that is member of the set as well. The heuristic algorithm does the following for each of the input state specified by \code{startStates}: \enumerate{ \item Perform \code{randomChainLength} random asynchronous transitions. After these transitions, the network state is expected to be located in an attractor with a high probability. \item Calculate the forward reachable set of the current state. Then, compare this set to the forward reachable set of all states in the set. If all sets are equal, a complex attractor is found. } } } Printing the return value of \code{getAttractors} using \code{\link{print}} visualizes the identified attractors.} \value{A list of class \code{AttractorInfo} with components \item{attractors}{A list of attractors. Each element is a 2-element list with the following components: \describe{ \item{involvedStates}{A matrix containing the states that make up the attractor. Each column represents one state. The entries are decimal numbers that internally represent the states of the genes. The number of rows depends on the number of genes in the network: The first 32 genes are encoded in the first row, genes 33-64 are encoded in the second row, etc.} \item{initialStates}{This element is only available if an asynchronous search was carried out and this is a complex attractor. In this case, it holds the encoded start states of the transitions in the complex attractor} \item{nextStates}{This element is only available if an asynchronous search was carried out and this is a complex attractor. In this case, it holds the encoded successor states of the transitions in the complex attractor} \item{basinSize}{The number of states in the basin of attraction. Details on the states in the basin can be retrieved via \code{\link{getBasinOfAttraction}}.} }} \item{stateInfo}{A summary structure of class \code{BooleanStateInfo} containing information on the transition table. It has the following components: \describe{ \item{initialStates}{This element is only available if \code{type="synchronous"}, \code{method} is "random" or "chosen", and \code{returnTable=TRUE}. This is a matrix describing the initial states that lead to the states in \code{table} after a state transition. If \code{method} is "exhaustive", this component is \code{NULL}. In this case, the initial states can be inferred, as all states are used. The format of the matrix is described in \code{involvedStates}.} \item{table}{This element is only available if \code{type="synchronous"} and \if{latex}{\cr}\code{returnTable=TRUE}. It holds result vector of the transition table as a matrix with one column for each state. These are encoded bit vectors in decimal numbers as described above.} \item{attractorAssignment}{This element is only available if \code{type="synchronous"} and \code{returnTable=TRUE}. It contains a vector that corresponds to the entries in \code{table} and describes the attractor index in \code{attractors} to which successive transitions from the described state finally lead.} \item{stepsToAttractor}{This element is only available if \code{type="synchronous"} and \code{returnTable=TRUE}. Referring to \code{attractorAssignment}, this is the number of transitions needed to reach the attractor.} \item{genes}{A list of names of the genes in \code{network}.} \item{fixedGenes}{Specifies the fixed genes as in the \code{fixed} component of \code{network}.} } The structure supports pretty printing using the \code{\link{print}} method.} } \references{ S. A. Kauffman (1969), Metabolic stability and epigenesis in randomly constructed nets. J. Theor. Biol. 22:437--467. S. A. Kauffman (1993), The Origins of Order. Oxford University Press. I. Harvey, T. Bossomaier (1997), Time out of joint: Attractors in asynchronous random Boolean networks. Proc. of the Fourth European Conference on Artificial Life, 67--75. A. Garg, A. Di Cara, I. Xenarios, L. Mendoza, G. De Micheli (2008): Synchronous versus asynchronous modeling of gene regulatory networks. Bioinformatics 24(17):1917--1925. } \seealso{ \code{\link{loadNetwork}}, \code{\link{generateRandomNKNetwork}}, \code{\link{plotAttractors}}, \code{\link{attractorsToLaTeX}}, \code{\link{getTransitionTable}}, \code{\link{getBasinOfAttraction}}, \code{\link{getAttractorSequence}}, \code{\link{getStateSummary}}, \code{\link{getPathToAttractor}}, \code{\link{fixGenes}}, \code{\link{generateState}} } \examples{ # load example data data(cellcycle) # get all synchronous attractors by exhaustive search attractors <- getAttractors(cellcycle) # plot attractors side by side par(mfrow=c(2, length(attractors$attractors))) plotAttractors(attractors) # finds the synchronous attractor with 7 states attractors <- getAttractors(cellcycle, method="chosen", startStates=list(rep(1, length(cellcycle$genes)))) plotAttractors(attractors) # finds the attractor with 1 state attractors <- getAttractors(cellcycle, method="chosen", startStates=list(rep(0, length(cellcycle$genes)))) plotAttractors(attractors) # identifies asynchronous attractors attractors <- getAttractors(cellcycle, type="asynchronous", startStates=100) \donttest{plotAttractors(attractors, mode="graph")} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{Boolean network synchronous update asynchronous update attractor cycle basin} �������������������������������������������������������������������������������������������BoolNet/man/generateTimeSeries.Rd�������������������������������������������������������������������0000654�0001762�0000144�00000005277�12122071021�016442� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{generateTimeSeries} \alias{generateTimeSeries} \title{ Generate time series from a network } \description{ Generates time series by simulating successive state transitions from random start states. In addition, the resulting matrices can be perturbed by Gaussian noise. } \usage{ generateTimeSeries(network, numSeries, numMeasurements, type = c("synchronous","asynchronous","probabilistic"), geneProbabilities, noiseLevel = 0) } \arguments{ \item{network}{ An object of class \code{BooleanNetwork} that contains the network for which time series are generated } \item{numSeries}{ The number of random start states used to generate successive series of states, that is, the number of time series matrices to generate } \item{numMeasurements}{ The number of states in each of the time series matrices. The first state of each time series is the randomly generated start state. The remaining \code{numMeasurements - 1} states are obtained by successive state transitions. } \item{type}{ The type of state transitions to be performed (see \code{\link{stateTransition}}) } \item{geneProbabilities}{ An optional vector of probabilities for the genes if \code{type="asynchronous"}. By default, each gene has the same probability to be chosen for the next state transition. These probabilities can be modified by supplying a vector of probabilities for the genes which sums up to one. } \item{noiseLevel}{ If this is non-zero, it specifies the standard deviation of the Gaussian noise which is added to all entries of the time series matrices. By default, no noise is added to the time series. } } \value{ A list of matrices, each corresponding to one time series. Each row of these matrices contains measurements for one gene on a time line, i. e. column \code{i+1} contains the successor states of column \code{i+1}. If \code{noiseLevel} is non-zero, the matrices contain real values, otherwise they contain only 0 and 1. The result format is compatible with the input parameters of \code{\link{binarizeTimeSeries}} \if{latex}{\cr} and \code{\link{reconstructNetwork}}. } \seealso{ \code{\link{stateTransition}}, \code{\link{binarizeTimeSeries}}, \code{\link{reconstructNetwork}} } \examples{ # generate noisy time series from the cell cycle network data(cellcycle) ts <- generateTimeSeries(cellcycle, numSeries=50, numMeasurements=10, noiseLevel=0.1) # binarize the noisy time series bin <- binarizeTimeSeries(ts, method="kmeans")$binarizedMeasurements # reconstruct the network print(reconstructNetwork(bin, method="bestfit")) } \keyword{time series Boolean network synchronous update asynchronous update } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/generateState.Rd������������������������������������������������������������������������0000654�0001762�0000144�00000002535�12122071021�015443� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{generateState} \alias{generateState} \title{ Generate a state vector from single gene values } \description{ This function provides a simple interface to generate full state vectors by specifying only the genes of interest. For example, only those genes that are active can be specified, while the others are set to a default value. } \usage{ generateState(network, specs, default = 0) } \arguments{ \item{network}{ An network of class \code{BooleanNetwork} or \code{ProbabilisticBooleanNetwork} for which a state is generated. } \item{specs}{ A named vector specifying the genes to be set. Here, the names of the elements correspond to the gene names, and the elements correspond to the gene values. } \item{default}{ The default value used for the unspecified genes (usually 0). } } \value{ Returns a full state vector with one entry for each gene of the network. } \seealso{ \code{\link{getAttractors}}, \code{\link{stateTransition}} } \examples{ # load cell cycle network data(cellcycle) # generate a state in which only CycD and CycA are active state <- generateState(cellcycle, c("CycD"=1, "CycA"=1)) print(state) # use the state as a start state for attractor search print(getAttractors(cellcycle, startStates=list(state))) } \keyword{state Boolean network probabilistic Boolean network PBN} �������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/generateRandomNKNetwork.Rd��������������������������������������������������������������0000654�0001762�0000144�00000017403�12122071021�017406� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{generateRandomNKNetwork} \Rdversion{1.1} \alias{generateRandomNKNetwork} \title{ Generate a random N-K Boolean network } \description{ Generates a random N-K Boolean network (see Kauffman, 1969) using different configurations for the topology, the linkage, and the functions. } \usage{ generateRandomNKNetwork(n, k, topology = c("fixed", "homogeneous", "scale_free"), linkage = c("uniform", "lattice"), functionGeneration = c("uniform", "biased"), validationFunction, failureIterations=10000, simplify = FALSE, noIrrelevantGenes=TRUE, readableFunctions = FALSE, d_lattice = 1, zeroBias = 0.5, gamma = 2.5, approx_cutoff = 100) } \arguments{ \item{n}{ The total number of genes in the network } \item{k}{ If this is a single number, this is either the maximum number of genes in the input of a transition function (for \code{topology="fixed"} and \code{topology="scale_free"}) or the mean number of genes in the input of a function (for \code{topology="homogeneous"}). If \code{topology="fixed"}, this can also be a vector with \code{n} elements specifying the number of input genes for each gene separately. } \item{topology}{ If set to "fixed", all transition functions of the network depend on exactly \code{k} input genes (unless there are irrelevant input genes to be removed if \code{simplify=TRUE} and \code{noIrrelevantGenes=FALSE}). If set to "homogeneous", the number of input genes is drawn independently at random from a Poisson distribution with lambda = k. If set to "scale_free", the number of input genes of each function is drawn from a Zeta distribution with parameter \code{gamma}. } \item{linkage}{ If this parameter is "uniform", the actual input genes are drawn uniformly at random from the total \code{k} genes. If set to "lattice", only genes from the neighbourhood \if{latex}{\cr}\code{(i - d_lattice * k_i):(i + d_lattice * k_i)} are taken, which means that all genes are dependent from other genes in the direct neighbourhood. } \item{functionGeneration}{ If set to "uniform", the truth table result column of the function is filled uniformly at random with 0 and 1. If set to "biased", a bias is introduced, where the probability of drawing a 0 is determined by the parameter \code{zeroBias}. } \item{validationFunction}{ An optional function that restricts the generated Boolean functions to certain classes. The function should have two input parameter \code{input} and \code{func} that receive a candidate function. \code{input} is a matrix of 0/1 integer values specifying the input part of the truth table of the candidate function, with the input genes in the columns. Each of the 2^k rows of \code{input} (where k is the number of input genes) corresponds to one entry of \code{func}, which is an integer vector of 0/1 values corresponding to the output of the candidate function. The validation function should return \code{TRUE} if the candidate function is accepted or \code{FALSE} if it is rejected. } \item{failureIterations}{ The maximum number of iterations the generator tries to generate a function that is accepted by \code{validationFunction} before it gives up and throws an error. Defaults to 10000. } \item{simplify}{ If this is true, \code{\link{simplifyNetwork}} is called to simplify the gene transition functions after the perturbation. This removes irrelevant input genes. Should not be used together with \code{noIrrelevantGenes=TRUE}, as this automatically generates a network that cannot be simplified any further. Defaults to FALSE. } \item{noIrrelevantGenes}{ If set to true, gene transition functions are not allowed to contain irrelevant genes, i.e. the functions have exactly the number of input genes determined by the \code{topology} method. This means that the network cannot be simplified any further, and \code{simplify} should be turned off. The default value is TRUE. } \item{readableFunctions}{ This parameter specifies if readable DNF representations of the transition function truth tables are generated and displayed when the network is printed. If set to FALSE, the truth table result column is displayed. If set to "canonical", a canonical Disjunctive Normal Form is generated from each truth table. If set to "short", the canonical DNF is minimized by joining terms (which can be time-consuming for functions with many inputs). If set to TRUE, a short DNF is generated for functions with up to 12 inputs, and a canonical DNF is generated for functions with more than 12 inputs. } \item{d_lattice}{ The dimension parameter for the lattice if \code{linkage="lattice"}. Defaults to 1. } \item{zeroBias}{ The bias parameter for biased functions for \code{functionGeneration="biased"}. Defaults to 0.5 (no bias). } \item{gamma}{ The Gamma parameter of the Zeta distribution for \code{topology="scale_free"}. Default is 2.5. } \item{approx_cutoff}{ This parameter is only used with \code{topology="scale_free"}. It sets the number of iterations in the sum used to approximate the Riemann Zeta function. Defaults to 100. } } \details{ The function supports a high number of different configurations to generate random networks. Several of the parameters are only needed for special configurations. The generated networks have different structural properties. Refer to the literature for more details. Constant genes are automatically fixed (e.g. knocked-out or over-expressed). This means that they are always set to the constant value, and states with the complementary value are not considered in transition tables etc. If you would like to change this behaviour, use \code{\link{fixGenes}} to reset the fixing. } \value{ An object of class \code{BooleanNetwork} containing the generated random network. The class \if{latex}{\cr}\code{BooleanNetwork} is described in more detail in \code{\link{loadNetwork}}. } \references{ S. A. Kauffman (1969), Metabolic stability and epigenesis in randomly constructed nets. J. Theor. Biol. 22:437--467. S. A. Kauffman (1993), The Origins of Order. Oxford University Press. M. Aldana (2003), Boolean dynamics of networks with scale-free topology. Physica D 185: 45--66. M. Aldana and S. Coppersmith and L. P. Kadanoff (2003), Boolean dynamics with random coupling. In E. Kaplan, J. E. Marsden and K. R. Sreenivasan (editors): Perspectives and Problems in Nonlinear Science, Springer. } \seealso{ \code{\link{perturbNetwork}},\code{\link{loadNetwork}}, \code{\link{simplifyNetwork}}, \code{\link{fixGenes}} } \examples{ # generate different random networks net1 <- generateRandomNKNetwork(n=10, k=10, topology="scale_free", linkage="uniform", functionGeneration="uniform", noIrrelevantGenes=FALSE, simplify=TRUE) net2 <- generateRandomNKNetwork(n=10, k=3, topology="homogeneous", linkage="lattice", functionGeneration="uniform", d_lattice=1.5, simplify=TRUE) net3 <- generateRandomNKNetwork(n=10, k=2, topology="fixed", linkage="uniform", functionGeneration="biased", noIrrelevantGenes=FALSE, zeroBias=0.6) # get attractors print(getAttractors(net1)) print(getAttractors(net2)) print(getAttractors(net3)) } \keyword{LaTeX Boolean network attractor cycle random network} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/fixGenes.Rd�����������������������������������������������������������������������������0000654�0001762�0000144�00000003020�12122071021�014406� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{fixGenes} \alias{fixGenes} \title{ Simulate knocked-out or over-expressed genes } \description{ Simulates knocked-out or over-expressed genes by fixing the values of genes to 0 or 1, or turn off knock-out or over-expression of genes. } \usage{ fixGenes(network, fixIndices, values) } \arguments{ \item{network}{ The original network of class \code{BooleanNetwork} or \if{latex}{\cr}\code{ProbabilisticBooleanNetwork} containing the genes to be fixed } \item{fixIndices}{ A vector of names or indices of the genes to be fixed } \item{values}{ Either one single value, or a vector with the same length as \code{fixIndices}. For each gene, a value of 1 means that the gene is always turned on (over-expressed), a value of 0 means that the gene is always turned off (knocked-out), and a value of -1 means that the gene is not fixed. } } \value{ Depending on the input, an object of class \code{BooleanNetwork} or \code{ProbabilisticBooleanNetwork} containing the fixed genes is returned. The classes \code{BooleanNetwork} and \if{latex}{\cr}\code{ProbabilisticBooleanNetwork} is described in more detail in \code{\link{loadNetwork}}. } \seealso{ \code{\link{loadNetwork}}} \examples{ # load example data data(cellcycle) # knock out gene CycD (index 1) net <- fixGenes(cellcycle, 1, 0) # or net <- fixGenes(cellcycle, "CycD", 0) # get attractors by exhaustive search attractors <- getAttractors(net) print(attractors) } \keyword{Boolean network probabilistic Boolean network PBN knock-out over-expression fixed gene fix} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/examplePBN.Rd���������������������������������������������������������������������������0000654�0001762�0000144�00000001671�12122071021�014643� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{examplePBN} \alias{examplePBN} \docType{data} \title{ An artificial probabilistic Boolean network } \description{ An artificial probabilistic Boolean network example introduced by Shmulevich et al. } \usage{data(examplePBN)} \details{ This artificial network is introduced by Shmulevich et al. for a step-by-step description of their Markov chain algorithm. It is included as a general example for a probabilistic Boolean network. The network consists of 3 genes, where gene 1 and gene 3 have two alternative transition functions, and gene 1 has a unique transition function. } \source{ I. Shmulevich, E. R. Dougherty, S. Kim, W. Zhang (2002), Probabilistic Boolean networks: a rule-based uncertainty model for gene regulatory networks. Bioinformatics 18(2):261--274. } \examples{ data(examplePBN) # the network is stored in a variable called 'examplePBN' print(examplePBN) } \keyword{datasets probabilistic Boolean network PBN} �����������������������������������������������������������������������BoolNet/man/chooseNetwork.Rd������������������������������������������������������������������������0000654�0001762�0000144�00000003116�12122071021�015476� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{chooseNetwork} \alias{chooseNetwork} \title{ Extract a single Boolean network from a probabilistic Boolean network } \description{ Creates a \code{BooleanNetwork} object with exactly one function per gene by extracting a specified set of transition functions from a \code{ProbabilisticBooleanNetwork} object. } \usage{ chooseNetwork(probabilisticNetwork, functionIndices) } \arguments{ \item{probabilisticNetwork}{ A \code{ProbabilisticBooleanNetwork} object as returned by \if{latex}{\cr}\code{\link{reconstructNetwork}} or \code{\link{loadNetwork}} } \item{functionIndices}{ A vector of function indices with one entry for each gene } } \value{ Returns an object of class \code{BooleanNetwork} consisting of the transition functions whose indices were specified in \code{functionIndices}. The class \code{BooleanNetwork} is described in more detail in \code{\link{loadNetwork}}. Constant genes are automatically fixed (e.g. knocked-out or over-expressed). This means that they are always set to the constant value, and states with the complementary value are not considered in transition tables etc. If you would like to change this behaviour, use \code{\link{fixGenes}} to reset the fixing. } \seealso{ \code{\link{reconstructNetwork}}, \code{\link{loadNetwork}} } \examples{ # load example data data(examplePBN) # extract a unique network # - always use the first function net <- chooseNetwork(examplePBN, rep(1, length(examplePBN$genes))) # get attractors from this network print(getAttractors(net)) } \keyword{Boolean network probabilistic Boolean network PBN conversion reconstruction} ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/cellcycle.Rd����������������������������������������������������������������������������0000654�0001762�0000144�00000001705�12122071021�014605� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{cellcycle} \alias{cellcycle} \docType{data} \title{ Mammalian cell cycle network } \description{ The mammalian cell cycle network as described by Faure et al. } \usage{data(cellcycle)} \details{ The data consists of a variable \code{cellcycle} of class \code{BooleanNetwork} with 10 genes describing the four phases of the mammalian cell cycle. The network has one steady-state attractor. Furthermore, it has one synchronous attractor with 7 states and one asynchronous complex/loose attractor with 112 states. The class \code{BooleanNetwork} is described in more detail in \code{\link{loadNetwork}}. } \source{ A. Faure, A. Naldi, C. Chaouiya and D. Thieffry (2006), Dynamical analysis of a generic Boolean model for the control of the mammalian cell cycle. Bioinformatics 22(14):e124--e131. } \examples{ data(cellcycle) # the network is stored in a variable called 'cellcycle' print(cellcycle) } \keyword{datasets cell cycle mammalian Boolean network} �����������������������������������������������������������BoolNet/man/BoolNet-package.Rd����������������������������������������������������������������������0000654�0001762�0000144�00000013104�12122071021�015575� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{BoolNet-package} \Rdversion{1.1} \alias{BoolNet-package} \alias{BoolNet} \docType{package} \title{Analyze Boolean networks} \description{Tools for reconstruction, analysis and visualization of synchronous, asynchronous, and probabilistic Boolean networks, in particular for the identification of attractors in gene-regulatory networks} \details{ \tabular{ll}{ Package: \tab BoolNet\cr Type: \tab Package\cr Version: \tab 1.61\cr Date: \tab 2013-03-19\cr License: \tab Artistic-2.0\cr LazyLoad: \tab yes\cr } This package provides useful methods for the construction and generation of Boolean networks and for their analysis. In particular, it is designed for the analysis of gene-regulatory networks. The software supports three types of networks: \describe{ \item{Synchronous Boolean networks}{These networks consist of a set of Boolean variables (genes) \var{X} and a set of transition functions, one for each variable. These transition functions map an input from the set \var{X} to a Boolean value. A state is a vector of values for each of the variables in \var{X}. Then, the next state of the network is calculated by applying \emph{all} transition functions to the state.} \item{Asynchronous Boolean networks}{Asynchronous networks have the same structure as synchronous Boolean networks. Yet, the next state of the network is calculating by choosing only \emph{one} of the transition functions at random and updating the corresponding Boolean variable (gene). This corresponds to the assumption that in a genetic network, gene expression levels are likely to change at different points of time.} \item{Probabilistic Boolean networks}{Probabilistic networks allow for specifying more than one transition function per variable/gene. Each of these functions has a probability to be chosen, where the probabilities of all functions for one variable sum up to 1. Transitions are performed synchronously by choosing one transition function for each gene according to their probabilities and applying them to the current state.} } Networks can be assembled in several ways using \pkg{BoolNet}: The \code{\link{reconstructNetwork}} function infers Boolean networks from time series of measurements using several popular reconstruction algorithms. \code{\link{binarizeTimeSeries}} provides a means of binarizing real-valued time series for these reconstruction algorithms. Boolean networks (synchronous, asynchronous, and probabilistic networks) can also be expressed in a description language and loaded from files using \code{\link{loadNetwork}} or stored to files using \code{\link{saveNetwork}}. Furthermore, networks can be imported from BioTapestry using \code{\link{loadBioTapestry}} and from SBML with the \code{sbml-qual} package using \code{\link{loadSBML}}. The package also includes an export to SBML (see \code{\link{toSBML}}). Via \code{\link{generateRandomNKNetwork}} and \code{\link{perturbNetwork}}, the package supports various methods of generating random networks and perturbing existing networks for robustness analysis. The \code{\link{getAttractors}} function identifies attractor cycles in a synchronous or asynchronous Boolean network. Attractors can be identified by exhaustive search or heuristic methods. The \code{\link{markovSimulation}} function identifies relevant states in probabilistic Boolean networks by performing a Markov chain simulation. The package also provides methods to visualize state transitions and basins of attraction \if{latex}{\cr} (\code{\link{plotPBNTransitions}}, \code{\link{plotStateGraph}}), to plot the wiring of a network \if{latex}{\cr}(\code{\link{plotNetworkWiring}}), to plot attractor state tables (\code{\link{plotAttractors}}) and sequences of states (\code{\link{plotSequence}}), and to export them to LaTeX (\code{\link{attractorsToLaTeX}} and \code{\link{sequenceToLaTeX}}) and Pajek (\code{\link{toPajek}}). Transition tables of the network can be analyzed using \code{\link{getTransitionTable}}. Paths from start states to their corresponding attractors are identified using \code{\link{getPathToAttractor}}. } \author{ Christoph Müssel, Martin Hopfensitz, Dao Zhou, Hans Kestler Maintainer: Hans Kestler <hans.kestler@uni-ulm.de> } \references{ S. A. Kauffman (1969), Metabolic stability and epigenesis in randomly constructed nets. J. Theor. Biol. 22:437--467. S. A. Kauffman (1993), The Origins of Order. Oxford University Press. Further references are listed in the corresponding help sections. } \keyword{package Boolean network probabilistic Boolean network PBN attractor cycle basin transition Markov chain simulation state graph reconstruction} \examples{ ################################## # Example 1: identify attractors # ################################## # load example data data(cellcycle) # get all synchronous attractors by exhaustive search attractors <- getAttractors(cellcycle) # plot attractors side by side par(mfrow=c(2,length(attractors$attractors))) plotAttractors(attractors) # identifies asynchronous attractors attractors <- getAttractors(cellcycle, type="asynchronous", startStates=100) \donttest{plotAttractors(attractors, mode="graph")} #################################### # Example 2: reconstruct a network # #################################### # load example data data(yeastTimeSeries) # perform binarization with k-means bin <- binarizeTimeSeries(yeastTimeSeries) # reconstruct networks from transition table net <- reconstructNetwork(bin$binarizedMeasurements, method="bestfit", maxK=3) # analyze the network using a Markov chain simulation print(markovSimulation(net, returnTable=FALSE)) } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/binarizeTimeSeries.Rd�������������������������������������������������������������������0000654�0001762�0000144�00000013357�12122071021�016451� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{binarizeTimeSeries} \alias{binarizeTimeSeries} \title{ Binarize a set of real-valued time series } \description{ Binarizes a set of real-valued time series using k-means clustering, edge detection, or scan statistics. } \usage{ binarizeTimeSeries(measurements, method = c("kmeans","edgeDetector","scanStatistic"), nstart = 100, iter.max = 1000, edge = c("firstEdge","maxEdge"), scaling = 1, windowSize = 0.25, sign.level = 0.1, dropInsignificant = FALSE) } \arguments{ \item{measurements}{ A list of matrices, each corresponding to one time series. Each row of these matrices contains real-valued measurements for one gene on a time line, i. e. column \code{i+1} contains the successor states of column \code{i+1}. The genes must be the same for all matrices in the list. } \item{method}{The employed binarization technique. "kmeans" uses k-means clustering for binarization. "edgeDetector" searches for a large gradient in the sorted measurements. "scanStatistic" searches for accumulations in the measurements. See Details for descriptions of the techniques.} \item{nstart}{ If \code{method="kmeans"}, this is the number of restarts for k-means. See \code{\link{kmeans}} for details. } \item{iter.max}{ If \code{method="kmeans"}, the maximum number of iterations for k-means. See \code{\link{kmeans}} for details. } \item{edge}{If \code{method="edgeDetector"}, this decides which of the edges is used as a threshold for binarization. If set to "firstEdge",the binarization threshold is the first combination of two successive sorted values whose difference exceeds a predefined value (average gradient * \code{scaling}). The parameter \code{scaling} can be used to adjust this value. If set to "maxEdge", the binarization threshold is the position of the edge with the overall highest gradient.} \item{scaling}{If \code{method="edgeDetector"} and \code{edge="firstEdge"}, this holds the scaling factor used for adjustment of the average gradient.} \item{windowSize}{If \code{method="scanStatistic"}, this specifies the size of the scanning window (see Details). The size is given as a fraction of the whole range of input values for a gene. Default is 0.25.} \item{sign.level}{If \code{method="scanStatistic"}, the significance level used for the scan statistic (see Details). } \item{dropInsignificant}{ If this is set to true, genes whose binarizations are insignificant in the scan statistic (see Details) are removed from the binarized time series. Otherwise, a warning is printed if such genes exist. } } \details{ This method supports three binarization techniques: \describe{ \item{k-means clustering}{For each gene, k-means clusterings are performed to determine a good separation of groups. The values belonging to the cluster with the smaller centroid are set to 0, and the values belonging to the greater centroid are set to 1.} \item{Edge detector}{This approach first sorts the measurements for each gene. In the sorted measurements, the algorithm searches for differences of two successive values that satisfy a predefined condition: If the "firstEdge" method was chosen, the pair of values whose difference exceeds the scaled average gradient of all values is chosen and used as maximum and minimum value of the two groups. If the "maxEdge" method was chosen, the largest difference between two successive values is taken. For details, see Shmulevich et al.} \item{Scan statistic}{The scan statistic assumes that the measurements for each gene are uniformly and independently distributed independently over a certain range. The scan statistic shifts a scanning window across the data and decides for each window position whether there is an unusual accumulation of data points based on an approximated test statistic (see Glaz et al.). The window with the smallest p-value is remembered. The boundaries of this window form two thresholds, from which the value that results in more balanced groups is taken for binarization. Depending on the supplied significance level, gene binarizations are rated according to the p-value of the chosen window.} } } \value{ Returns a list with the following elements: \item{binarizedMeasurements}{A list of matrices with the same structure as \code{measurements} containing the binarized time series measurements} \item{reject}{If \code{method="scanStatistic"}, a Boolean vector indicating for each gene whether the scan statistic algorithm was able to find a significant binarization window (FALSE) or not (TRUE). Rejected genes should probably be excluded from the data.} \item{thresholds}{The thresholds used for binarization} } \references{ I. Shmulevich and W. Zhang (2002), Binary analysis and optimization-based normalization of gene expression data. Bioinformatics 18(4):555--565. J. Glaz, J. Naus, S. Wallenstein (2001), Scan Statistics. New York: Springer. } \seealso{ \code{\link{reconstructNetwork}} } \examples{ # load test data data(yeastTimeSeries) # perform binarization with k-means bin <- binarizeTimeSeries(yeastTimeSeries) print(bin) # perform binarization with scan statistic # - will find and remove 2 insignificant genes! bin <- binarizeTimeSeries(yeastTimeSeries, method="scanStatistic", dropInsignificant=TRUE, sign.level=0.2) print(bin) # perform binarization with edge detector bin <- binarizeTimeSeries(yeastTimeSeries, method="edgeDetector") print(bin) # reconstruct a network from the data reconstructed <- reconstructNetwork(bin$binarizedMeasurements, method="bestfit", maxK=4) print(reconstructed) } \keyword{Boolean network binarization binarize k-means edge detector scan statistic} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/man/attractorsToLaTeX.Rd��������������������������������������������������������������������0000654�0001762�0000144�00000006256�12122071021�016243� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{attractorsToLaTeX} \Rdversion{1.1} \alias{attractorsToLaTeX} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Create LaTeX state table of attractors } \description{ Exports state tables of attractors (corresponding to the plot generated by \code{\link{plotAttractors}} with \code{mode="table"}) to a LaTeX document. } \usage{ attractorsToLaTeX(attractorInfo, subset, title = "", grouping = list(), plotFixed = TRUE, onColor = "[gray]{0.9}", offColor = "[gray]{0.6}", file = "attractors.tex") } \arguments{ \item{attractorInfo}{ An object of class \code{AttractorInfo}, as returned by \code{\link{getAttractors}} } \item{subset}{An subset of attractors to be exported. This is a vector of attractor indices in \code{attractorInfo}.} \item{grouping}{An optional structure to form groups of genes in the plot. This is a list with the following elements: \describe{ \item{class}{A vector of names for the groups. These names will be printed in the region belonging to the group in the table.} \item{index}{A list with the same length as \code{class}. Each element is a vector of gene indices belonging to the group.}} } \item{title}{ An optional title for the plot } \item{plotFixed}{ If this is true, genes with fixed values are included in the plot. Otherwise, these genes are not shown. } \item{onColor}{ An optional color value for the 1/ON values in the table. Defaults to dark grey. } \item{offColor}{ An optional color value for the 0/OFF values in the table. Defaults to light grey. } \item{file}{ The file to which the LaTeX document is written. Defaults to "attractors.tex". } } \details{ This function creates LaTeX tables that visualize the states of synchronous attractors. Asynchronous attractors are ignored. Attractors in \code{attractorInfo} are first grouped by length. Then, a LaTeX table environment is created for each attractor length (i.e. one plot with all attractors consisting of 1 state, one plot with all attractors consisting of 2 states, etc.). The output file does not contain a document header and requires the inclusion of the packages \code{tabularx} and \code{colortbl}. The tables have the genes in the rows and the states of the attractors in the columns. If not specified otherwise, cells of the table are light grey for 0/OFF values and dark grey for 1/ON values. If \code{grouping} is set, the genes are rearranged according to the indices in the group, horizontal separation lines are plotted between the groups, and the group names are printed. } \value{ A list of matrices corresponding to the plots is returned. Each of these matrices has the genes in the rows and the states of the attractors in the columns. } \seealso{ \code{\link{getAttractors}}, \code{\link{plotAttractors}}, \code{\link{sequenceToLaTeX}}, \code{\link{plotSequence}} } \examples{ # load example data data(cellcycle) # get attractors attractors <- getAttractors(cellcycle) # output LaTeX document attractorsToLaTeX(attractors, file="attractors.tex") } \keyword{LaTeX Boolean network attractor cycle basin transition state graph} ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/���������������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�12122071104�012557� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/NEWS.Rd��������������������������������������������������������������������������������0000654�0001762�0000144�00000005443�12122071020�013626� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\name{NEWS} \title{NEWS file for the \pkg{BoolNet} package} \section{Changes in version 1.61}{ \subsection{Modified functions}{ \itemize{ \item{Bugfixes in \code{plotAttractors()} and \code{plotSequence()}.} \item{Fixed compatibility issues with R 3.0 alpha.} } } } \section{Changes in version 1.60}{ \subsection{New functions}{ \itemize{ \item{Support for SBML: \code{loadSBML()} and \code{toSBML()} import from and export to SBML documents with the \code{sbml-qual} extension package.} \item{\code{saveNetwork()} stores networks in the \pkg{BoolNet} file format.} } } \subsection{Modified functions}{ \itemize{ \item{The DNF generator employed by \code{generateRandomNKNetwork()} and \code{simplifyNetwork()} (as well as by the new functions \code{saveNetwork()} and \code{toSBML()}) now supports minimizing the canonical DNFs.} } } } \section{Changes in version 1.51}{ \subsection{Modified functions}{ \itemize{ \item{\pkg{BoolNet} now supports the modified interface of \pkg{igraph} 0.6 in all plotting functions, but is still compatible with older versions of \pkg{igraph}.} \item{\code{loadNetwork()} supports comment lines in the network files.} } } } \section{Changes in version 1.50}{ \subsection{New functions}{ \itemize{ \item{\code{generateTimeSeries()} generates random state sequences from an existing network.} \item{\code{plotSequence()} and \code{sequenceToLaTeX()} plot and export sequences of states similar to \code{plotAttractors()} and \code{attractorsToLaTeX()}.} \item{\code{getAttractorSequence()} extracts the states of a single synchronous attractor from an attractor information structure as a data frame.} \item{\code{generateState()} provides a simple way to specify network states using partial assignments.} } } \subsection{Modified functions}{ \itemize{ \item{\code{getPathToAttractor()} has an additional parameter \code{includeAttractorStates} specifying which attractor states should be included in the path. The default behaviour has been changed to include all attractor states.} \item{\code{generateRandomNKNetwork()} now supports the generation of networks using specific classes of functions. For this purpose, it has two new parameters \code{validationFunction} and \code{failureIterations}.} \item{By default, \code{loadNetwork()} no longer changes gene names to lower case. If this behaviour is desired, it can be reactivated using the new \code{lowercaseGenes} parameter.} \item{\code{stateTransition()} now names the state vector using the gene names.} \item{\code{plotAttractors()} has a new parameter \code{drawLegend} to disable the legend.} \item{The \code{randomChainLength} parameter of \code{getAttractors()} now defaults to 10000.} \item{\code{getAttractors()}, \code{reconstructNetwork()} and \code{markovSimulation()} can now be interrupted by the user.} } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/�����������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�12122071104�013324� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/wiring_biotap.pdf������������������������������������������������������������������0000654�0001762�0000144�00000030242�12122071020�016653� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xmn^7 )l6\1ڢ>iZPv#%R9ާ/iyioK{Mm/yׇ[ּo*WLoヨtwmkuowԚ<TZkIa͵ͰM-6ri}eev{ȧlyۍOY+Ύ\:ZG<X_m~1uX;n=|mG`̴g=n|![#$Dg޴L]o?1n'W\ CQ_9?siu#]nhY*m*Rٛ٨e_nloͧÃx:#ވjKW56^A3&g~1 wuZV}7J"rM gOr )eKE<to___鯯l;rzn _ûDFM \UMXJUft:ˬ}j"pTޥJjߕG0V0i!V:ιjJQ$%ut'Vz}s0 y;))+ V:E|hTZǁRm&G,#^ny' m Tڍ;:SרT*J徆BN l)m°Ro)m|RD,G_z޻J^~>NbVAX7avx,]�"uN5#kռ$)q3 rl3`7[= )5*<vU}y3 n\]!joZtQOjJ-؋ʲDm?ǷozA;(*shL/B @7qUт JwA`Od'?ptJ'N*UsD0t\?d@&[9E4  d7b%$>@ɉB?a7 \00y4爱@ENA4 '~JrhgJӏ7JW !C*DT3T�R$`a,5:U�Y3!X*OTa%uaЅeM{O89~'~ZrH.o EļX.VaFT>>h7֧=iʍCEȴʞLJ7T)d�|ga| q4 дUjYd-olluϕsL_NVqnM8= ðc5( U`_tRU,E]e\8c\U^a+U+K!284Hy3a HaPY 1;R0[cP'r2aww):nw%~1ŕy9X+c¥kr òG4&e`"s/sV}e) qjQfqa? i~X{w>ږ<O ? ֠ Jde9M7DfT5B $Ѫdc x*BhB##oR` <D%;MG@L�Hk;פm76M+M윧 >E5͞c|BP~'sZnK be7B oa#i vϐl2<+Ex3!>IcP1MEأa")ЄM|iU= I?{ y\.ut6#xFm V$&,/~FE1{B򩝈ؖNf &??,X0)pGW�z)B"y5a%Dљ6j!%-MkrZђ]z@my\TTaR#reUѯi}wB-0ojO3 _>ߩY?_H)VMJC[5c?p+F&ܐ5J|]S�i5v? endstream endobj 5 0 obj 2021 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 504 504] /CropBox [85.67331 80.98804 447.1076 435.0598] /BleedBox [0 0 504 504] /TrimBox [0 0 504 504] /ArtBox [0 0 504 504] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F1.0 8 0 R >> >> endobj 9 0 obj << /Length 10 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 10 0 obj 2615 endobj 7 0 obj [ /ICCBased 9 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 11 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 12 0 obj << /Length 13 0 R /Length1 7816 /Filter /FlateDecode >> stream xY x[Օ>>==Ij˶,$ي$Kl9vd9Llgq'vlC%@ %$%l)Iط,UX 00RZB )xhI:-4=ooF{ܳ{{Z@ ob~H􍮷gy@VreyuzE.o�tpid <BZ5,o84tpߴ>7yk{%b׭ːF/d`ڞtȟ�Tf j9�%Pc}24E EOByo2~ {ܬSGK{!" cSg5R=)'蔯u]'i|KvuIC@ۥ\/@rvl?5-SCT6I2sT]T|UnXDY `%(F0Jdar ,@NuąkD.$qA-\PlT1A“#2,گڞ&dز,y�!7JՂ֮yϮyˮѮʮy\HʉCܡiuh" Ռ`,<SIi,\Q-ʰ8A)EiڦyMs{6em 46JeX&v(o(;"hkJ|-EMthQ[S> ^m/`#W@LHHDЋM4܍dd8±%qΜ\nkRtSm&nF &)rF ’Ԋs':=hCG3!%l_Nd(9UR N " mo~f;-<y\"ۓ~ñ^!"w 97 n wvtJV/ ضa3S %alqև;_c[|ʶ0xmA֘Ұ"hmMb[}ëY1ɄV>av^Y. a͇Ó謰9K"lK.VpK q͕pŜQ+ BP( VaLe|`E"L*qu\Cb((VdI FM ږwd='_qrG#ʼndX'ړՋw$ⱃH;EK$Lɹ])r">B`oR'PzѠ=yxQ;"vhb;l[,YL$qJfAz\2{U4ƽ [[%lhg=ax3R%IH;JJ K hҀYk2JIJϪeՋ$Yz7 l`w]wx'y*SrJ}|]žd<=+Vw y?KnceRowe|lv;w e²8w #ol_#7|G_7}m}"}mH}.;~-v=P11A@C|&cz6�P~&>(x v<O6{P Ha.,#%̇Z""nxklamk=9< )8p1Cr=ܑ98ٓ#8aj)mI\ $G 2 U\`Q 7 w �!΃f Kb#ʔUp.z݄y>?yfe273a ?=p8xq$y Te4hCh\#^W0{-#\L61"8v~jRxcZCOíC3Lÿ"J&d [Ȏf<y6 ZĿ\XV؆ a-՟`pDO ч}])j^lW03<!Nٻl{m̅[3dGOƙ4hЏXx bw ނwa ҤYCf2r/9BRJԆ}ztC(=Ƙb`3;]C~vmMӣ+Og3eBo8sG:q/$XB~LЫi8}�'1 J ""$Jf#xY@:q~#]&ɕd'=8}+u&3L,娉Cڎ<LtހGS 0 L Ӌ)b1o2g&3.BvT?dY=bMZ>^n 3-@1}w%<~ELl${}G Ո L z.Js ߘkuJ䬌k?ηؓϙy_$(jM.E7,[BR8kI(D~{'_Y 7=9)IRYe+U1{ɖUcXO *@4rĆܻh-I3'x,q{ 1Ñ_~vR目.m۽ dOu~�+{R]I7=b_% /e)~הInkI =!"#r#.IzM+IAD'$߳lͯ[݃â `N$ttM E4]9ˁ 4D:a2K?QVC"5]y}BľVt3i:יb60f"|K`R3Hn=o;E=gߔNKn)t$.lt;=ʎqB)!R+> by eb8 ư62^? f84ooA[yZ-U82DQ10pw bH @"Qv %- D)4ţkaWrS̒b CPGWFW"V8iOn4M\>f>mؘ.ޑ<46fDO@@4C%E6u`]$" x@1*pYf?B ^לDkDk࠸7̇@Y} P%"h5~8B|~o h%^hH0 G*EFx q}t%t2ix=:g=sy%_S+ȸVTaY)Z ):Z|'SQhNE'1 C)>v4O1oqc_>`r(ahԸH=ƈV*w2[ɽo k'Vۃ`Ш*S Nm*,4S&EBjMQir)8AGb'Лy&ϐS>_EF `,(wT7jCwʹjw$.:Tf^"j6*;oZ",eUx xo,scZ2ӺFuņ0"T!9*3c*2rTkl>�jx)|.ƙƋONBɌx6Np(Đ[[+/_XP*+ܜFU J:1DW3OG}Qjq蜜+m JP⨌2zwo[*?!3<|Brk.Q{ү//O&D(%nE8ʹ \^kVsҕS0 ^c*yjz+85CJT𳐠^~M fx[߯"PI7I`wݍ~KjE̦+BݑpeTvQ@@ 8H7ZƤS?^Y^m+{;.JKvy% YPsݎˇ.Y?Ck{zk<~u9$bD"!CB`9AIRa).YJAaqp\pB2t'拘⒒Ruy(䖗*^uB>.5s<çloӗxe4 uG\"VI"2L擓 fIqTV1xLWr3rk@W1y3jB<kyG z*v99.7o/5 0ݚ>ؼ cd@yH7?E`f;酷nBN>ՙx'9gxX?=_8)9-7zay`.L(NK(a\#cdyF*F1n~P0'6њ'"inB6b>u ?dni{<3#?U/:, =>ZqNTV^9Aqz܍ƍgu% =#sߐPAW(U&FJ# ds#ZȩISlJTDty[m%ѐ[{r5ٍc vpJۋ8f\-3`f1 -`*!E&Vx`2L{�imf:2p;Jps]EKx' c<p1Vj7Q={zO=k9u~U%փ/W@dQEWkb>d/Us!Qdg;hYas+mᠣikYvZivY]U]Wp[d y Ku\aWUqUwJf(<[Zdq#Ո^T?{.(am<9i5LL2>-ӗe&e.-Axe3 6Ti$$R W JZu,e{r9j~glEu:YΈOwR^]iS)o>^Q:t`@VUsG ^SA$ez6spDHDǎ;܏/=^zTrmnSoXoʛ&jɂ [/6Z,+l̃(KT!=ыVW!QVkĭ\t: kKh%TM2cX\Jn'-mNnWv|~v8{Dj΂-{S: p-ݱkaw8'/w{egW.]1gza}RʩGV\e6SʯmїOjg+xqRfΒ''PI)rs]r丄8ih1 c~N~Q,4Na6dn<*mQxA7crz+Tr<X3USi.ZQ8IJJS~D2wΙ:44t 匜UkϹ]9-[I ۹vRnmm)m+TuVY}vhwYۋEbJ /a9~Z ~^/7=bLĥiq s O-10Q +M \IJwQ-i:|b@YǻH85Z'eAibMnOt)iXPSUobil͛,C>g k^uL 0cJRgai~;:,Ϊ1~Ȗ FZ߆Mw~:Ts6XX4<Ի�wj endstream endobj 13 0 obj 5548 endobj 14 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 676 /Descent -250 /Flags 32 /FontBBox [-203 -428 1700 1272] /FontName /HQCMXH+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1721 /XHeight 461 /FontFile2 12 0 R >> endobj 15 0 obj [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 0 0 0 0 0 0 0 500 0 500 0 0 0 278 500 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /HQCMXH+Times-Roman /FontDescriptor 14 0 R /Widths 15 0 R /FirstChar 32 /LastChar 117 /Encoding /MacRomanEncoding >> endobj 16 0 obj (R Graphics Output) endobj 17 0 obj (Mac OS X 10.6.2 Quartz PDFContext) endobj 18 0 obj (R) endobj 19 0 obj (D:20100215163709Z00'00') endobj 1 0 obj << /Title 16 0 R /Producer 17 0 R /Creator 18 0 R /CreationDate 19 0 R /ModDate 19 0 R >> endobj xref 0 20 0000000000 65535 f 0000011787 00000 n 0000002137 00000 n 0000005228 00000 n 0000000022 00000 n 0000002117 00000 n 0000002357 00000 n 0000005193 00000 n 0000011461 00000 n 0000002455 00000 n 0000005172 00000 n 0000005311 00000 n 0000005361 00000 n 0000010999 00000 n 0000011020 00000 n 0000011247 00000 n 0000011637 00000 n 0000011673 00000 n 0000011725 00000 n 0000011745 00000 n trailer << /Size 20 /Root 11 0 R /Info 1 0 R /ID [ <e761c8c7390104470d97e6b99a87632e> <e761c8c7390104470d97e6b99a87632e> ] >> startxref 11892 %%EOF ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/wiring.pdf�������������������������������������������������������������������������0000654�0001762�0000144�00000033103�12122071020�015314� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xKodWpl}m-@3$ 1Ə1?9nu;i 4#Ū:ES3-G{Z=VSJ^jҿiےJ%_O_Jzz)>??ZT{jt`˵K6p{1>r.j^[n8Z-l G^\[*e}IK"K-`$g%WeovYk0[[gۉOP\-qM޴]PAך Y{6e@Kl^Ҙᖷc`Sͼm%s>´E<|zΡݫ{C9L^LǪo@]@ 999Z^'-[#gyp9Q qA;^Fdc6<rN FSs&a=yF7Rl3Yzؗ8k">%<(BP>}^g|y4( w5$2c* ZK٣́~vY {ߕ<Y G84N$=2Mn4Zʼn^6keV7##Z+0̪^ˮ.ZC[s[;ut2&0e"Jݒ]H0],2O!tj˦d^FjuL/bR֠gp]X M1*V̐v8ŀSl1 /;� %Ms^E<T$o}2zF0` k 0-wlJЁORMUƽ RfF nY+S'Xnָ\LeF9Kb|e_|F!+n$H�jߑoJ  rP>ҼNm #P_UtSEψ"Tl?~J~;;vXݡ=Bo:z[muV7f@oiʷQHͥzK=z˸G-}-}Lo)CQz[m]gFtwBzkF-;0)Noh;;-uz{ގ{4Fmuw{' ~sz=z{qOoߣO>f8'Oo;7'>uFﻧwQNus*YW`"OuաUQmZ[TYs]֕0#LWrn6q_8|ZV-+(N1Lr`MKp˷:]` 7N*oq@ }kܷ ozHuF\pFH.\޲vh|B3Ӿsa;f^0o{Z6܅ ^K~ڼPZ܆ա^ >a.t셦 }F\ 8W eDľ/QFk _&)#ڒs+Vrcl{j}L:eduIuaElm(#۴!:R?|Iqk y1�Uf(%D[AJqK'A+*y,:τy)ٷ _0|''QLQYF,EpYx`m80oj6[]˦н&H[mǁK=FFSK1T:%Gr%Qճ I¯Q9EǓe)MX٥0vH1!U؉Щ05;ag<0LC5&aNL<~ ,-TSuPNӃi1e1S u6qyC胲QRS% iQhgtMLsC^ VǍM^gO]*jebW''L7W/iul4KQ|.WMM&$);XNVX,&KSQD6FS].6qSzʏؗݩ<LmO߄՛A�ug++M=u0{/"lHLobB)G  ^Dw?uS # SGI IL:Aދ,+7) (ސg'4Njciw\Fy RB.2܁p 0l0xg%ގDTmԻϏb}$<>#`Fi}_ dXb[GA^|޻A,<ss c8Oy9 @Oqfs]u? bCl ]3Br .P-]آ"bx{Z wg%Urbџ_3fĔ�Wub`,MKdϯ[éBW-IC5%d*ܝ(ҡq�$A4f V+(1v2I3ɲ�.<6^1,DSh$u*ŐvA(Ux|FqUHȐ@`XtE2!9 {ӹӸQg�H<M/7  Fg|qXKՖͺM/?RBݏ}K/NѓK[z7_MJ%]qP㩜,U9O:I endstream endobj 5 0 obj 2678 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 504 504] /CropBox [87.01196 82.32669 445.7689 441.753] /BleedBox [0 0 504 504] /TrimBox [0 0 504 504] /ArtBox [0 0 504 504] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F1.0 8 0 R >> >> endobj 9 0 obj << /Length 10 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 10 0 obj 2615 endobj 7 0 obj [ /ICCBased 9 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 11 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 12 0 obj << /Length 13 0 R /Length1 8836 /Filter /FlateDecode >> stream xY xSUf_ڤI&7I[4ޔe)B [ (( 8REy*ʨ83e(8#<y3MTF|}{9rs+=lzV\хkV Z`Xq [z:(Ž=24##C L}.C[Pj[8*ڋtFۇ,{1[z0V'�3oFa,�2@0(O.;K,jQ<%})<}.bdhїSex)՝z{D)1 $%6bj# NjCmDj4QbAJ 伤# ١"nN}1>BɽM4$0<ڇ}!J~܍#jw`~#bӇ>!ˑj.GHɭNWR HE* +OZz|LM FBIsQ@P$`x_0 wsVhEJL$cVVCC4 (%kBCBúBÚBCKB3wKBo͆_7v5ni6\li6,p|nmH Lwv@; w@a1IzWIm =7&(bh#!�<Yq%]K"Jz(kEXlP՟F8Et4rkR>ZgrP<fuB rE,BRw4U P=M% S[9ğϕ$-I1(I=1ğ c"?ob /_?Ux< <F"~I8|7^?\wO,B!~V$If+tUX~!L|Iq5?+4?#iir\qR)eX y|c8Ǒ Q_iD^i>ccJy/6I~%w9Us\ p~.,YmTZZR3j[5@ .%,'*F%oAp 1PDMi%IٞѐUoNOԭ0%iՑi^gLΤ:[:OM9DC>m=NGKbJkG|Ҵ$%= I~ԃ -J=Pah"4*Em[F-Z\NdViEuYmpkQS|#TaK`-UL#X4> Q&QΎrT,/S3LE<⒌a^yl+6uMt'n]ؑظ@7= ^p&{Mb\x,'awS[n7>4O$߼钶]l]_nkR;m5r[Mr[Mr[J[蛖{~fU] y8{! >|�RϦߦq*�a=d=`}#R8)0zLQXFGބ*h9,PwxSWO@9uЁMIp jH °8u.$DNozlo<t=ؠb+a1,p3ʞABv&{!"<ѤlR,w'8| I,yrڝ>Nc"8E~{y$20Lf9HW y7!jeXbÑ삗5 V Ii'+F2@^ NK߄T#ucWaOwN1wT#:C[hIߘޗ~.Q[mYY V؆ .՟apL؇Bam}�f7sgMN_ޙ~-w=gC �3`t"*>}0pNH>#sG(9FFQ"j #1BOC?D?.bٻAԢԚԺ3'G7<`2v ^+Xȶ1^= 1ۇpmQpp %1ROd2=IAzRl 7~H8`8L& ɗFG9( PՂaj!ZB-cxG4C>BߡHq2_2ǘi/9Fvvʡ֨sWq?Nbsӷ a-u5l&:5yRp&֓d/"c؍}2%(Špb8HOz>?r:96kvl2:FͩXF7I-$ & Ni=bt'dMT'!zPtW|GShJ5YA,T,4B($;İw(y=, 49Dž,hꎇa ӆ8 \q�M oJ䊘GoYhwy<P\�q\-.m?/=nMJ[\֑{:T܆%$5-aOoEe[znCE>e- r vN(2{ЈKs1䔜 ֎\)W!BŇzáP86dOyDN~i̋mq2v3!,T5r[ k>u咄f|#͢0pErzF9*,By:/ZDi:VܒMk !w^y/JBlKXbd`nL0{=A7a@h@ , gJށ0gV:< u1Yztb KGkTaGPE>[;ft$6] )މiHAD-hO1]1sh ÙZ݈Ut u=#yMd$2QFdTdc+Dd=ح86Afz&?#\vX{[ \p忂pտpŞ^p ZF8pf_c>§Fv6W)WA;8|(b`2M: ];wJRK#R;T5K@=aYw/9N-BǙ3f6^~ދ(̪Z*&Ӡe4M95*n2\ τ`pڙԑ4TH b#1J#�&ykI?;rO]cl*+YKch�-,^`w Š)Fmc՜a;):I"zC <Ǥ F{ӐeN=;| K#965nT֓JKE@J9\1rlm9Gl'9?eƝK?)3''\r$^Dc:g:geXj3LPmEL#W#:-MvZr:-aUVUFf[->< n0>v|0489gðB,YѬ3b~cΗJ#JnƬsm%hzk+F$#I3ǂMVJy蜊+'esPSVUm=ud9Q=ܷ= })=wC;YG=~Wj>J:@csFF(H]Rm";kZm:dwMUY.Ӆ9〔I~^r:J6P*m e)87XR钡n9:GbK0cn18ErEJ#*j{=yFn>TM%q@`p̦M*GYug$˱ PYQUUOg6Oc|SַMjN b_lznBl5jK7ְܹcfN\x*n6ߚ<> N'%ݟ?rН%Pcg] $iHP{9)Ǟ/tVK\Coi{R$cgͩYѰ%X8>s: nDͯdL5Xm#s~V5}5&#ܴ pYUg,f(/F[Sq*Q(XU/1BpWS/ {|%uϾL8v8`۩Hݸw/ vmЎsc>x\ke:c.˔KrCyt3|>R]v8#d=.P̳\}LTfj's_kZ"Vq-MRڃ,PuM=sFI1'bA.2ep4 YlFlmʫYd +(dfDz;n%3V?N 0)'O)n[kWR'RӮM4ԍM6XC*4x\+;Wf5$)F{_v&2kpMۃnK<뛛Sxkw7Uck?Kc{cz]*IX Xĵt\StZοMͰ[~*I8PA,]RJ).q޹AsE']7h/ΦTL% \U-tqչ.']\G咩e t0ZMu�sL5cou>0Յ@L]?8p#%<Q3Մ;.y)]TVRb|Fo;hv†0Mvm;)*hUL;x,|+[]\lٸUEA LpɻQ7 j ٬*O?I{MO'd DŽJN]ݶ>=xS^ɗ˄w[~󤦼{ah}9ywRq.9@_\z~߇9viY=Q"I[+QVt4xukE7&)J TabwLWlI *r+:܂,mƈ7x$ .Pߕ@9U2ZFP|eRNJ\C嬸캻^B- Tܶe[{J5P$_zԖ sȜ)Jƀ@#8$4؉SN9G(_%Kct#`;,L֭Q$EB "fz Zu&)8Tf.qcBJ)(\RcIdx䅋r9@/~{A> < .?Q)^S=i hhNFY3jt6CnG SR5ΝvgE{j[7v9}|:7u5K%ۭ]NvWMK*{E^~{D!FFQ%DA >Qvx/~N ܜߧ-@d$)0~ (.IWl8Yf~gqF2&!JZ٥C }F<dQb`qlU5SDg+ krꞔS-kȩ"yzN=RV0,4ۏoޔLuklm>}! <UBRXϦx,WYE䝕)J#4lV.1nTwMuVr:OPey ղ鬥AwMKi.alM#X:g/"SA9!V׷FAיŏxVsDЇrYĂLw]$̽rR1-%{Vl÷/ZZM)+E>1@Qnab5~q%zZ\9uz+u{H{<ў֡, 6ǃ.r,IVȲm.KVfd r(tUct2c5jyĊ=[ۭ΢;.wJ3shƤdo@-QK\ E]QOW˜ImD"-VMTSt5*tF"ѬPv+Vj5ڋS*sUF(4+xC2*X=naրk *ޡYՔ =fbN0ѦLq<1e%р<|1rp _m5# ]H Z g>z4h>a^} IΕF Aatcxx8dwIgRB26%uX椰d֠;4wrFSJX=:Q*ʒ"*h=MOɐ{T屁ШU a LnQ^cW4Io] ٯҽЫda/)Qw'5a~('G-J>CN8g`ےeB3,/R endstream endobj 13 0 obj 6359 endobj 14 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 676 /Descent -250 /Flags 32 /FontBBox [-203 -428 1700 1272] /FontName /MMGWMC+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1721 /XHeight 461 /FontFile2 12 0 R >> endobj 15 0 obj [ 500 500 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 667 0 0 556 0 0 333 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 500 278 0 500 278 0 0 0 0 0 0 0 0 0 0 722 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MMGWMC+Times-Roman /FontDescriptor 14 0 R /Widths 15 0 R /FirstChar 49 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 16 0 obj (R Graphics Output) endobj 17 0 obj (Mac OS X 10.6.2 Quartz PDFContext) endobj 18 0 obj (R) endobj 19 0 obj (D:20100121143926Z00'00') endobj 1 0 obj << /Title 16 0 R /Producer 17 0 R /Creator 18 0 R /CreationDate 19 0 R /ModDate 19 0 R >> endobj xref 0 20 0000000000 65535 f 0000013228 00000 n 0000002794 00000 n 0000005884 00000 n 0000000022 00000 n 0000002774 00000 n 0000003013 00000 n 0000005849 00000 n 0000012902 00000 n 0000003111 00000 n 0000005828 00000 n 0000005967 00000 n 0000006017 00000 n 0000012466 00000 n 0000012487 00000 n 0000012714 00000 n 0000013078 00000 n 0000013114 00000 n 0000013166 00000 n 0000013186 00000 n trailer << /Size 20 /Root 11 0 R /Info 1 0 R /ID [ <a6998cc3c45e5919ec607fa298653aef> <a6998cc3c45e5919ec607fa298653aef> ] >> startxref 13333 %%EOF �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/stategraph.pdf���������������������������������������������������������������������0000654�0001762�0000144�00000065641�12122071021�016174� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 344 /Filter /FlateDecode /N 6 /First 34 >> stream x]Mo@sSӄEh zhlz֒XU!vvg Ba $RC(L! lls<BH1U{maږ:C()##GԲim@ /UVn>'ecmP5$%>a=k*;x\ѡJj># }<_qC7 ,!]*v 6HDUAz] 2H!QV Z 5uRRvuk:۷ ;ᵹd|U}>iz/ٮ?>C endstream endobj 8 0 obj << /Subtype /XML /Type /Metadata /Length 3474 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:56:37 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/"> <xmp:CreateDate>2009-11-12T17:58:24Z</xmp:CreateDate> <xmp:CreatorTool>R</xmp:CreatorTool> <xmp:ModifyDate>2009-11-13T08:52:12+01:00</xmp:ModifyDate> <xmp:MetadataDate>2009-11-13T08:52:12+01:00</xmp:MetadataDate> </rdf:Description> <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> <pdf:Producer>R 2.10.0</pdf:Producer> </rdf:Description> <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"> <dc:format>application/pdf</dc:format> <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">R Graphics Output</rdf:li> </rdf:Alt> </dc:title> </rdf:Description> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"> <xmpMM:DocumentID>uuid:e24c43b8-4c71-564b-8fe5-974247c7f042</xmpMM:DocumentID> <xmpMM:InstanceID>uuid:e9baf475-fcda-b144-989c-aa74f1e77f08</xmpMM:InstanceID> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="w"?>endstream endobj 9 0 obj << /Length 23157 /Filter /FlateDecode >> stream x}ˎe˒|EaDxHĠ+1@xH.~0Sj�wZkßf? [[奄^[}[{қ?Ho?#鏌?_(w[^_]o?>k{?xϝ{+|Kzik7K}QZ?\lwyu%wK7{oC^~>>K:n&oI~}_w{Wz^8v~O}}}˯^:7/3_wNyeJ?#s[̳s;ןgg|~~yy:Oxӯq_rzM=쟿܇q_>ܠ,I7 +7[G>^q=aӻ}_r>` =VR}R8x3[q^2J_ɍ߶m؋2{h5֚og +ޭj}~4Z-{mOR~47j} ,۵c?l_m_yVZ޾ٗp]|ǽ{J]m#6]M{ͫKּ=/d]loV}y0}[_԰Y;C{ֵ%mym 2ZI=o/Pzwm[m|'ֱݼ6\nY+7o<wͶ٦Z-zm>KVx.sF6/~5:Z8fmX p3fƾaVoWt˶۶~[)>ؕO}a߯lʾCgk݁s~Nqc۸s LO@'0$ql?xO3Q<ĸƗ w?pw@o߇bvv! ~m?*ÎogR+l@_˝Zw+B/6og`)q^/a7AWk#i߷mBt/?peG ;+v ZӑSb,12Sey'b<"> KRj7?&? ]m9%uǃ VڷȔl6LoսuUlM> i~b g`ym&(mMm/o2G1%h!9,8gzXj5BS: 'DgĹ&n8b_;DmHuyM5$}Ey#U%^_3h߷TI ͱ\x#~dojt&♜^<t3o7<L*;]%;O̞&utm*X}Coŷ^m=%bK kk`v΋cۭ^j`c Ą%Ι{ItJ*%7ǖ`Xjpuhu  0-#tzxq6~-2[0= 7`4.Y}?=m^DtvF pc Jm*ܷRiǿm;H(+s|(7@^^S"^NDUn7(+<.,CqIcVnf۽(tْt͌֝x.8ѫ:NIc\5>Miћ"Vxi[Ѿ5UT ߯$V(FU2a_CwwAN&<gjR`Wđt N= 0^ ӌ ,D nu]mCtI/9E\*3,BmCx[-(>鞜}܎*oSQ<mUGrz2j;|,}rM~PYQ -jtO d4{ᚪ v.!x ,;ɔL,)-9f;@b{}C]27Q(?g߾ Qm7`%{۩(K tݝWTlL FW8+iҚb'8K/1t|":r }v]LֽMSa҉}+j3%2tط(2nyj."Ӿř]4f:]ʍ~̶9 @X{߰8g[+ 0+ScK /"<e '}"۷:-=mH akKa +6w ȟg:=}ܕ\ ` gK7lÉ UMUYz7zSo%ۇ1p{.r ;YϮ۷U|mosAmGi7ܷ\DpM}Cyy;mX Vp;O2*P>Y:v6ExMwߚSP<PYF)-34f/nkڸ[ Hn;[3{_j=mo2Z4^$@",X8%}Qܲ q!«J4�oѷemJ[j>mpa,k=tкwv uJ[!=$8"5\ɋb!x1~Mc5F 98ޓNنkE 2k6:DԨ3+ R6Y0IߞH8l"/?~¡cMQ*r^h1(Bd55(oZ7LOǣ3Y-ѣOU�-41޷Mܷ|}�V`_%z?^j (}.W)UN|z-nlh.O89GnU6wjc:6.׽# PջI%3F<�t^;ۃsT<rUכ☠뀎ʟ_ӀiIwڈ!O٤Z3 ㄵ-#\݋qIlRaFc ɇ[0DC!hKdl (jz<_2q1cu&"־s+ȜɊUsm#~iƓ^߆e婗ęlʄg1J8os` Ӳࡡ!Ibjf$ 8jgMd#EuX=J]ʧ W47LLVdV}mѽ ݠmPw3 v!'}sh gu$Rogtƹo=^1dcgwɤHxYzM+!'yO;@({=*rtWQWU*62^5s#y@s#ʼnwoh~q#NM#`xZl,SvϿmk�8þ%uL]]r74Ȭ5<X.C]!WsgBq5FXec%}G�|6¿h][yꝇk?D]UwNo6on]xQ/NٲDĩH7鸶V>c=Mr?8?urQG)|U(U|+NϿ"~OCʕt$iO_xJP J#ng,5ok4ygDՎ-NG/S,R[("+N 7O<%9g֕߰oV(x�B!5&$U*) o�lI4Y w%4,dzr.Q &7Ryfe@oKUV*R ȍGxL)I=&1/"o&l34o[웢`'z]@<m7ba7QRR&:K2bgTyn_w 9aƗꬸi!XPw\!(S vZ &�͖oE.Jж˪B p@FvnS {1XBjJ4Ɠ:v26V@UU[s�޷wSoҕ`ߚr2Ͼぐ!7]l)ilBaM˭fBzIh'[ AGX~8Xi~̕DDŷSʙc*n8F %l# m!DŽk'!f/f/bDmE�1Vק#@}N>4t'.�~ֿp}妃@0\^.x`�P{okvKH@1`0U%j5`�WLk^%81U#5`{>Fr2篕|JiώUTEqU@0u 7k{C V?TogxȼV29`t 80Ciґ߾Y쑈?av)k7Yv;]F6u0<:1NVM|Kcȧ ZhB5V/<o_;Rkw|[adxthx rȊGw۩( -?*O'"%E@{/vC %:Ua/fI2@t=*ζ;EcXI/̫o6E F�Lu1w Al^ůMU1[8\G~۷}Ʒ9Ymuv(@Oڹ6n }c}Qm,$UǖvA#oU%Ŏo#tYq o#E}qu\ !;w}Cg-9LXH.i9z\ne]) j@i_X6.\QͨxyS(T,!r;ӄuu1U@-o&홒B^fOu1y޴fbb imV3*3P^!ڗ..2z@[D� إVg~vm$99pIpLKENNd9ouo^Z}hOPYBلKݽEUh _o]10 ;Y˯[ǮSג"f2C<[25i}+ W`wwv=tϤB�Ur*Ѯ31 xW-BdM<oIvv:- >ȿ>mPHn@a%r DB*wy! )T eyb:4�`[N]in˟�OM7 lT!_9Pt nWD�HVj{Px^I[DaAc gosNPܩ,x]d.T_fK:uݚ2tPcHԷ}=5.-E ;@\z k 踺%sO +;t̥@meXKV('y�XLN]'<LG< t <si`)]}ğəSVo *H VQNPJrCeA�Q?Uo)&Q UvJ\�E^M͝i;SL +BUڵmT0^+ pZGϻnfLRą2;C ܛF-10uݒ p_,TRhgQFOc_ ’Q>=_y3s[o*F"/ =4}b<JJG]Rf*DÑ՚u(Tfr )Os] F>Kk~A@^O)S.PG}c-{h`/_�)х58G75pE}[jysL7Č@}#G~m}45oc&|4j|}:Z0,Z҆JsJ1,ך_8obͪ Z_()TsLBPD}x$7}þ5OMvRB64H|kv'PP'i` Vxt& JWQ Ou,笶b.mES5A\/ճ˂/5_;l:!N ^fIm:hM,tHR 39SC>B$ti4$f!<lS@"7]fw�xBm'uʳ|T@-vGy�B;M ufE&u>HM藩�7ɷ-Bp<{" Ntm=?4R#sfo+t¢" EiYac7n˼]bRϣ�+e응N S S|?kk3؎~Qt"!T CV (*k_Q4_{Qt#&cC܅(?�D_hSWZ~_Yv/ʥ]C-&0IVD ut2.�TK!2es*RnoqeG{,nщʕ6ҥud :&b_v#pByLN5<̞KDeKFbqd^sgK"3LN6UaRfļn)�7.H`KiڧtBF.pt 7*fxC׹UTہJu9Ue Q7,*,S/j3ɐG ’]iT%�,WM*%z4n3hy#Z /o:o/"oz7W oNӝoc :E(B("<f%ND&VYF_ߍ·oK; wpO~iN `u2u]G{U[XPH}Dc~A 1w=O}D(w]H�|2pA{I5TTfӫQI$3rr#%yVšmQÓh,]\Q Ԉ#$]u:Ҁ EyYmqx 87 [cۼ[i6?pD2"]kߖ<3~Qߒ:%m=%Ʃ>]}xhi&G:ʍRzXߦd~e~ @B.DZ! gꚂbZ<Ru>MYP_Rzr=)daJ< P9!.NjrYaO=U Is{ :{GWInWQ&6-HIBPyQoƎⶃС4$;WfkSZ''Po^a_=$GJK0(n8*l M53 q5Qm_ȞBfCxÄiO\ ]j%-淃;0i/W_VvJHBf*eD'Y �rZ﨤6^Ҿy#507L3Gk8M"LUZ]G[U <ȩNJۿ6TUK[#դ75y(&K8c7?’/M+g:Ukq_UG!OXȒZvt0j(XV rwmd&tQ,-#Uz%=m 4擛8/3YXSVN@e$K:n-N:Fෝ6^ר–(т[O6 $QrEЪ*L6g i,7۟,`1T'7z ˧dZ&B`D폽7YTYqR!qb ú }"nQ-ct.jp2@tkP'c}90i|s%f v@;UE@fŷqVqKP%8S?A<M̲||(rFq4\l o#-)!�\䤬 NB r ;U kZdSS_ A 3AIcf(�R6Ib [\8Q±LdzOK**K(ב0Ծ!}/` œٷo7,}kg]z{J'z7wG8qH,sR5*Ɵ0$TQGlnE&�]e+׮Ě/cUW O[LN/ΜG5Łq*uCTfҿy|t$j$Ƒ�hlq+`qԘ4|,[s!ǓP98X-9#;eHo^UNe*WL�o})BD=P.fH5_ͭ!4Fv‘⒤l !O"]L=e6 5jNK[ `'[2 noG{qIb;AjD6j gM\.WtoZqIh'XҺ"[eWs ŹBEg3wդ |}#zȱ0j b{C֨h'?TQR>D/'tvwMWw1C{:k{\A?:S݃F)XMQS2U]IA[ x7Gceż[hi#t Irqi~O7zI5] |=YU*rORf {]J%d%`7wbjVRɒ4y$hu} O '~yz( yuJ3_SRzPT/I.9}^6мaKO)pMͰ,~6L@5]yJܴr:/3;І]x6ix**iD>5tܢ�496J*fkD$z^U쏕rAjv? 4GWOZwYtjh^C7U]e6ѵ{nvNIPƾv W7;Im17? .:ƁfId9 By,^)xe6!|a׿sw%I,RuU{zd·L~j?ۋ3ĵJH!�-lso.j?qiTa>FsErYv6PQvҷ\2OyR׍̥ G}$+<jK[oQ3h>acgЍHӟ@XS'K\yp#줔MZ7%o~V kjz!xjjʻ"HY:%� so7Nj񜮝X\tVdKoAnh�m7sΊǔRȵ`-#<]I(ɬB7H%IogKȠT**!5<r:ڒA4/nܮF:YL\S'3]ltӭ{ߒ/\Krʌ̳o 7v][by [w<ں*y3K wd@r4^KNizޙ1GQg]it>ά3GOIQDK%6 sFf°ʜ6씩RwVQӒ�nzs,U PU+L,g8!|m͋"Kk왅 AyUjS AUCeɫb28& 1Q2y&0.UF;J](Ka1x. WXbpoa͢M s6'~rMMlgy>yJ-B8&8J~Rx.M SDGu_*_=|yfyIbåkLosާ2mfnRGu�U_PDI(bߐat3Z#e 5ܹwSuB)hfEvj@'}mJrQL= 7`ص%HߦiFxLqk'E&l 7=s<%:%-A5&:,aw ` &CMscƵoYq{FCځUF#LW�:U+;:ljӛr{Tug69]$,Ws<?eڒs%^ZBw^yEi;E?.-t%Mߒ&+L&4;wi7T|,6"k%uyN݅7{pq띘VMt$53)s ywK>dcF%G_to~z#_;bXl 5^C(0Vw`■29}[Ft/|75 ) N�6E0_;p!PoOwlsœif�*g.@V4zn^ſƼ+ $GhՇ?(KR޲SH?g0}Z:vCb޷ìa7b|L7,OJsu\q8,Ј}aVVv[n;RYQpJT-sJ_8A0U}{t+TT ٝ+5olݿ}72h03:Q~Ks}Sg`ry^:JNZqw5xNCcşWAyLFB4Jc G+խq(^U1 v&3I<K`._ŘNj_8*7@61*3*d ^=ջ>ӄ% o?$d~!I$ 8WSfľei 9N)p?k) }ssSk¬fI~E#*~˝}k*G+r`/IUeM\7NqFQ4)ҍֱ&.0ouQ>T)ms'vݧ, lw\$_dNԼ]0Vr>#.Y7-KΰUewfz+;Oo]mNj\U!); hc$-y Iza ==ehm}UVuatq?Fxr!=8V^. vPT>Ou$ h fS$ ZJwJZ4zUl12Ew{TC}\ ѫ,E!yB, 2E{<|8^剃Vn/*Y |Q/פFo;U".^QYWr?">[7>,SD(IEoK|{Aiw=.Zn1%9RO([Lj6Z騈OΜ /pZ Lv_̧dҁZD,y=LH$ʝN,wn5ɞ$*o9u�cY~'*D nA&I枥@�q9Bdn6_urwCNn"D:;&JuoqA'.bHrŷ(WLIRRb\V&-_ku齞r$  sQ�\'ϻ6X(#c#|96ξM\^XVi)<e^Ӛ)ZW^7\ⱹ_Ճ1#{܈S~%]l ydק]:v{e1Q2߷䘧3M'(A<b^ȨFb<<%mÿ`w ȧrMwzV7zs>5V?q)s\bJl.\=N%)xrRF"o58`~[bں.KF]y*qʸn$+Wl꺹,9a^`D̛$;uDȗ?koZ$KXtUM^Iηz9eaF?:7LMEWUI2�57g&I;S[!dɹ $YqW銚&1ns2Eξ@>4v}�SG`ɒTXx\VXʚ}滧m Ccoa/fr6Q.ם78�f.M,NoPߤW>P;|CB]DB4ZP2�cfyƋ2WI]/8r2[<te̋mǼbkFӨbܡR뜧3&MQU CMUPTM܎?FSɃt,xj}HXBdI\3p'U)"n;"RR$gE5k<NwSV3cv5R`Y0VK:eP(+ֽx^̜2@3LGο`#c:R ;ueQ͟D6#Yd†M)uhɍ@S^QZ'pķMZ(ݸ/.`tq іH#-trM|{Pd#O0_&+v*[)QTPt++%]}W> ]5MU[Xk/x8f9>O>2'ƷTv $}c΅ nyUMGa&k9W){÷0ɝ~wTm`cTl'K*i[ZEk' nS֪>qo#W ԽBUv.}X\;g^> [}oLl^ RJt#j) q&}:޹Ğ_p`h SOp&<^3/~sZR-E UK}3?%;7s3pe'}q*]YRr1KSokq3ħp{";,ֺ>%4L%̻ﻯdsf懜nf-Yl0r^nf.=}ZXx զW p 72B9gRv_T}i&L, NRtX/Ln R{.܅lJ'1O) YƗ)Ǻo& n*gDrs2 hL|Ȑ|Z7\A׷a4mWR#Mekg+I)g8]J>xcU:dBi2YiYxδB졨Q/)y<l2dMAHz1+Zoy}RX }'o.ܕ쬧ֻUD͡^.yy>inhMxTs)ڒStiՐ6M*8I>LvZ@AuRֹ4xN݆2Y@n>z!)8#{O Qx鸷-Ym_o3}*}<U< úS`,``B4Lu+t#{${m k&QLm˺ܮ^LrgtUrհVQꢹF=&ηmۦ(m$$*1J$ S2Y`T2)HphZ=8$ tW}iיᏕwzv)qږȼ3IIX\d{3n hԏD་,s$VmuHc`~ ]!2Ԟ;yp~/n�kkž 5 [կi]3EFiྡ.uZ7x(S^S 毭?7\�?(W} 'q@D\%*(G/t3*Tg)䆓S~ꌝ96/OIJNyA2F}o~:?su'"%>bޫfN AYw Y0Q}9GyAv_+6TSsYKMUVt,U,<`#ZDuҝ4e~ h9j慓EmIuj5 BnOuj5n~~Ѻ~'ӺDYgW;O[X,2oOc6I 4|@jwpczg\<ܐ!?J4?TFL"�i4*ط֎JɘoK™e^?"KEv3L#ӡ#w%ϥL�\K3%v&E]Du޷%jhvvtB:t/M0 ,W:(sv:;%X{4o<>dR"{ШS.}o~6t߼8)\9_߀I?vVp犔Z>LVoT!)�_#7[dm1<;U.J7VJa)R˽o+&}~ #O85wad^’ "P:~j^Lٱ}~U׉'_ ߇Q}{Z Ko\鮐jNeukx4WqPYu^u]f^_ӟzFrie|HkuNJlbYNяv_C35_(':a\<3/ d 6^w%[?m~olj^3vv8?d>]oo,?kkoo߾ݏ}orF}մ˧zO1ayOL>I"c&C_g7ZOJ*gTA{•vu<U-ZDm;ʙgzrv ,gm70N<N2%n9P":*.pf\z.E5̐֓T (qIav]TFpA)^ױtaBXJZO L3K@}ic ZdV;6Q$<Sؾ3bEܯvFQ80 lŅQM|z)Ă_e?)ԓ(?DOIUAhb'p %?G /U:A=~suAk-.65{+gN"{t/yߑK9=,R#1,+N\wAIoɣ.S'U}DEw EO*B'�FU"c r[Tu*f +3H^' qպ�G�1-I|*5*�/QTV6g]b%r"|{<s]"kf.IU(]LLGcx%cZ$\rI`:H3 qB m␢rT2i%|F)@ZפXOn֘ڰ(sq_8I,+؈؉+bh!pra9hRI\ \E]#`sp%)y~ۡ^;#Ѡ.h98YuGڸ(Q}^J1<|O3�5(VGdP],8Ds2SdeG=kvf"Q;-*1|'1}Zehq:4jEws(3T|_dͫ?ީL _4H 捸Z�^GTXGz}%J=ҳ5 uXKzB�88:'[<1eqQyj]<lho7>8ǴF;+ԯ vXztdچgkE�&[XidA#,%7V΁�y;,�sW\7.k,} 8cQQ:lI^)]=K3ο7nˏH<d=8hREyi}8yR\<nAAM0;mrm0!$ xE`K&.j9WJVJw+u"QXϬy*[ȵ&F{W!1k :Yp50X鹤3%(f?_|J4#<mn_X[樿<{x1X*q}wO<rC:#Lu & g?]PGT㔰\} j*uew<qCpL{ᤇ"xЪa-jav~27D+ɵ'E0K͙04Hz(=yvqQI!ϝ9Aj>Pի==TEG@]J8lC$q!GHW@tA4hgGb8!ݟg4I=#8F=0)({6b鯇 - q5aS%FOvG1>"Iq}.1'=cbN# B3oF@#RpAGP۷*wTN˃@>]O=C''Jϸ<,86l(ȑqyG!(%7s6m,>(wű VX(88Ԕ/?t)̰)H)8<հ>lkW5&=+ gpLT<�=zWZK |!N[:R?a[~�0<1@=`p;s >M_:X`5wam8F 8Ėy.pZqxD5CJxT##R$KR &Jc&a<޳s&cwT=!w,#<{OB\,15 *Q0u$V2Fgb#Q#ar JA3l#`VWM ]wJf>t95R'X UxW`VJa ZV ;ʑhOcn!@oj2Ӂ~8GA[qj&NMX29,dt=9I0i"g\Lji(=PrrE8%zUi;K~&+jE}kw8Oד¬ԪԮCS&Vti)gtPkloe:$5Aqy&+~=TMQqZ@5,jGOҎr$+h! ցB-+4@vqY9Zk#.^jҦ D~b md;84OF[ONc CR9(^JAzUOʾlbo.[serOw·"ݤBqZT+l%=; S*? ۡ `oBp$ ՘" y](D,\qvÞqT$86spK zePqqST8II,Q}x~Hql_0;iiTc0Y2<qE?})(X~ ,TAaKC2Uo@Y9Hh[\W4 zM4NH Qq{) +!M;g,iJcZϪ5N(?E0,V1!Db�1f{N6k0֝aJ8Sr6X|02øY CC$Nza=1P<5efq wp*M8 W5էb!e]1xսU Zׄp3tPφ4䒜L405vh> X4V`ar0XO`ҷiӈZXa=4 䠐w5:aY\tQ^^`W{Pڴqvsch=*p0�8Hl2n �L;nߍ"7)RCӪ\ЍP_MDۤU*kO4-|RDC5@R%N˪"X7lPt wDMu~k`x_#6H<oYX9Ԋqvظ~yz=._ R4qaTIPTf\,ruT2̸qQR+m;FT#I;NYш,2-rU$}|zIG4VBy0a|{O3)IWE==;HuT$v>Pi.͸(YkZ\seTfhNIqK+S]jMG@Cx(g(YJA%y "fM4Tj\8qHS<9W;#e,*=!cYnO*joST\=G jdј �LeQx- 3AMqʴ A$ [ba9k J``3Qd0l*仨Q&IUB$@Yk:~JU)�K 9;XX MI^\OViĕ&a8"xR3UvϝcxP:P88l4!=9O=w ~6,v�<O'RDM)H`JxMX5=;Nj2W kaFMQ9GPط) oZҥ^1"IɆEK藁!VUDt]"{fG5N!Ōg٤8bDuq�:`|bF$=ώ0΄AէP|*j*#P/I-l9Qx~θ\EMɸ\ʎBu?;5:t:JjT*vva}/Bȕ<,QV {Oj+ǿ~⣳20 ` CGXO(8J|_LSXaFVR#s6sA=1m@t5(e/~ZaT ݡ?GH4a윫kt\;Q.</%ҕYve}Qӓ9[e\qqPj /Hd\˿ ?\T8IS{n?G{K=]�WA=} Jq3Ȉ/9|~,.9XO'RĨ$h0:-OQ I*Ł9"5P J<~ V Y8k@jir4}G{S|1l]U[KW|3.^*\}7Pf|!Ų玽wW3<= t;KlHK3Ctɱg)ΙFDXԨ҉ o"v 89�̡҉n\aRkd &NDg/=L,,N\ l[rv'W+n,G⾇m U*C;hHN=5/N�@4+N3PM\Ku|FYW@V-MZ$KAy~N|=qV$@(&":/6%̚SrJN03 (qxMP(X %~j? 23P�v môWJ{ Nԗ'.?g3N S8IV$AM~# ;?Bq, 3 Gy8! K_ksAeH "Kd (.3JRz)ҸwbE=n.l ?KR:uq{#I (8ٚK`WjI#Ի +qB! .L09 n=͉.тvJbD|s ޳+vRHcJ,->}OD rP\Z 8up)b65ZUXl#annn{n:+WqbA|@ PnN{~#1j&}$Y=Hؐ09qegVs_@"oR!ӂ~z> K\g{n ƲMOzf1W*gڐ0 D08SG@h;OӐc[ PNKR7>EL#1,RM~(p-`Cėk8Q6,ϰ'8uɰɑ Ld++p;N%'JQ`ʉ8)ɰɽxߧyE6uqmF}SN?FeVWr2ȣ{&ZO ʸ( 0ja>9<.68^%x)Sɩզē{!X0xr=#[ c4*4%9.W}YJ`dv!\Wcy4X# %`Q-BՋl.f@I@N{n' Nʁ;r!Ҥ*y298z'Hq{)eENFZɧI;$'uw~D( W9u0fG*w@t n] K=ݚ4yq"bR|dyr%iBbœ4Ki1$FPaF.!q ^Rqvc꟰U8$AՋ8:WBS Y<G &j,q3٨f}AkAZwş`K a5@; !q7. E1e:U3L !4<Z#=g=iiV揌ހ[sF Ql"8$4V Tr-O7zٝK' ^aVG =Xv ukaG/o{`!9|Õ{6++ؗLT Y(Wc#q#]8^(ǒTsOg 9*Czc qɑΒh ;PI¨)'f<&]z<BH(-3P)ݐa_ Ò :J#;Tŀ3:=wUeV#>dq^?d 䚅uË�S ~FGV3.-/8(P¡!uܐО5Xx\˧Kqqj՗g?5lh,=h!X{L~z=O=h~`W7a( yIS<MQ.hq 2jqc,lAf/N>ٚFHo_GwJ!trا 莸~qCɩU>!#1W`yBSav$KإHYMAI4%N-ԔPRDMz\Nmk(fW$8O94Q˿8�)q=`8?KMrԦ@<>o Pn-lHu"?$=2>?؏f/. J?WrF:qh."Mcvl71}H;q!R994%~69pWh48 $ ]Gı@8#V`?u{r1;ƐTA{"wdKΧ|\gxFضa|. c&Chk<W\ 1qypKlqc1Wj0~u>)-g .CxB0Z}qM]p[zQ"!lvb?[>q 2pM~rLqy1pCgbc2SD ƪǍ &~%ba&L�Ռd>$x@"n<b\Ⱥ 8[l6#i9(cF#ay19Cƶ,>94l=k̏pAqiX}i;c_q%$ąv2@.,=jGP*$!<,08dU&'y풷!\GlXqS&G-`]X9r%4ì'%ՐmwmvA ߄Bb7Ω\<#OTЫCRIJcòդz>?x}Ʊaޣ@80bNz޸3V??vg\ST|R$θ.>@<= JGU~KsR`PX� 'D)aZ�&|@& a{@'Bl-xvLz0ɜ|s=n$R =2ƍ{=]>9G *Dr0P}ȰlWu:k1 ޣ-h@ HYcz6{G�br;x}ͧ* `°`p0/.J6d&=N_z\7wL!AU>x~']wh*z]#''By\C" Wap;P<Q [G%:Tvb (gF3 qޫE6>CCK)PO-qR3 :hI9;$k tI#хa373Ms],.q"pH3lDG]2~L_l98>p)m*�ӐCڬnDzv5/W!r38o "$)t!C&%v ?}/s`u\ d "!;NBv)l4W(&'D.OU�k8`2$?C\�& n rjtE5=SX XS Z@%Q"qEBn�tmɰ "0;,ر,fO%b�X_G4gg+ɣ$@a6NUY8^%R8C7ӟ?ETendstream endobj 10 0 obj << /Type /XRef /Length 38 /Filter /FlateDecode /DecodeParms << /Columns 4 /Predictor 12 >> /W [ 1 2 1 ] /Info 2 0 R /Root 3 0 R /Size 11 /ID [<38fa47c563f5461fa150cf802b2475a1><f4e78006a76a10504afba117f47dd770>] >> stream xcb�&F~ cJg<1PI>�Y endstream endobj startxref 27244 %%EOF �����������������������������������������������������������������������������������������������BoolNet/inst/doc/sequence.pdf�����������������������������������������������������������������������0000654�0001762�0000144�00000033126�12122071020�015632� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xO\!st/=tƛuSSM56/Ęu| :e |Gxwx0<'GИzCLK%4opz\KuX$1N%X3R),1Y"Vk1%Yvҍ2n(;Gs瞉.3t$ 2xxࡈi .7v-侰/;l!G Gͳ'u.Pt1F4\dgGCS h2)NM\Y] {i@˼(Wb@M{N񬪡zhU=,Zkq z>TgB++ 7*ĦiI FlC}>4@IZ~~'`x-;|zN?y8 L 쭤ԶA:CfĵId**2iDZ2gCjVHC@+YL! -RWBj:pKDnC �D }ꨲ`;S䰡ƙ;i+bIr2 ll4A1JtdKzMφUA45WlMruϴ1ѧ(ն֓UeǶ)UUT::{m٫J6JΰW j5/a*ԙ[rj3S7r&7W?TP;%&un֕U'HKCnL?r#.b4iAIopcxfxInӓ!{W endstream endobj 5 0 obj 857 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 504 504] /CropBox [0 67.59843 478.5433 477.874] /BleedBox [0 0 504 504] /TrimBox [0 0 504 504] /ArtBox [0 0 504 504] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F1.0 8 0 R >> >> endobj 9 0 obj << /Length 10 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 10 0 obj 2615 endobj 7 0 obj [ /ICCBased 9 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 11 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 12 0 obj << /Length 13 0 R /Length1 12300 /Filter /FlateDecode >> stream xz{|EUut3~?3L$!!! !/A  HDB0(DdEuyc2,ம*.�/׻ \Wߩ!SUԷN:Ӌ.nAJԉ4nJS,$^amM ^ KE7}v[BH=oIz3B}kKD9qA+d$x<ֶE$xm̛?\5=>�ަ Niߢ>ؾy\0:|$E !́X(p̐oTri^s1~ZnC4cA{K pFPmz*JOnFx'zh;@�bS{;; dţBr5Qoqer#XWǰF l9D2?f"%ᥨm\Pu1bC\8X ů#'u)'B!@NBI\rv/Q7Om\O:"ِ;W]mͮ9b'䮂B+qѕLWZλxsCewlt ""0ދFiCQ =<2X9v:5KCթ_p  =,|*= ZA- J]cx*X$/C&{ 3XHG⟃b}=jī1%YB.X@MhAP?ƎRsvb0_fo][DQq?-h;[hj ?jw6w76hqSKR-wP<wxY uTx7-lm-,mҶ@i[ VsYlvbNm}@;sFéԅM2#RsQ*׉l6r!S͝AX[oL1 QJ$VZNӨInHih+zυ=؉(Ơwp<>^h:N2@z/>f*JAtAQo|O0N@wh[%Y]E$P*(y?>&ލ(q }̧VdF 3y?{fdGp/= }$Lx HEij#ڈ^>߃x H3ŢCU] VQ@(:ǨYĜh%I { Oǰ#8?7Hԑkf,3Y|q[%GȄnޝD=f.;b\݉&G|'9 G@"#'9&̟0p;KXslmw #SƢ zێQ;N+lG;@a-\\X|'kp!r@)ZLH't26&La>˜g3Yձֱm6wC{\7M::f>w^B^rH`u0:ot) }.m؁PhL(ՎR mx uZ2SюcДyPe'Ŗ!F!4ӂ/śqɷ۬hR!I^± ([ì[]Iyod4ݒSE='g x2x2$VKPIf[uGu~[1VBrw7+•]hefPBrZqhZOT i(c|M3U<zȃ uFfƜ0ȉS|,B͍44.4ՇI#K6yæ?7Sn) _eSKWe8KF5nt%xuTƹ )7&Rokn#& qu,!df5(@fNbyE"?AcSC<zB?�" r3F l! Z Q׌B z ݜ|#7h-O8bzxK=F W{]WanO}B:M7tA[V:5Wܒ<>vC&3FGt\AGp|u;> 3)̀42ܕr%wk.w1tgu-mɖPO6^ǻꡆ}5@,feGA2qupFĸ zx*_Rxs̹ sN%jK'TQE묭z'l]t%F3B}DGp8x"&)Aoj5rÛC@Ÿpq!\2S!<6K5¡~A mHD'BxďAG!\/mWշ!<_#<_nr4H;JDxOp͏AxB~IoCx|'Ex !\/7yH;QDxOpݏB_2SG8d [p�~r<aiQ{ s  DGTnrms_B uCzP^xvP̋!.ZϠU4 Er 4}gs;=3p K@7;zdpQFEI7o+�斜[ZCzh(f,v@ iF/x"ƒ/ f"9;m;X'|'=)Bg*4EOspeO   AA!\ A^Q¡Ir4M�]%w:FPm\hAȴÕ!?Jm!3\(wV9F{QioioΠKBM>_F90Ҧb�)R&!=iXy@V;dԨyqCmf0&dcB'}Sځv>p/s[/~ _ƕ_OcտCᔇGܓpp,+X~3dURکSEPiws!yԛO0׺t;&prϢd34d's8u.uk&LcYfYf¡dUoos%%%d:ZIVx U*o+꫽QiIW-֚0ڢ" AZ>_U"pYZZ- hKq~o2/ὐj z^%1xF'l^~ak_-|emsL+<G޳|ѫu]{qҪ19qrP:rTfgd..ΔlB̜W2+ 5[~ (͛xXdY+^H^U-^I(r%WM؈d;|~ bR�ו>s*f1peC�3?ʨ.ڸr%`XgM�'8/S4 :AxuEj_١~c[[z*ܡнǿVeT.x0?c >T3]=([GWMsv0/Gfs@JD&(1!oh%H0 CedQ,Wf_u*+%QЪRJ4E"j�\њtvtR b'i ^ e,.<6zӟ@eè,~lF'rcj.RMֱCG YJXiUInG:̔%U*vh8:<{ LoiF╛#M "؛ ]XJaFwsvR3Ŧ" Kpӱn6L&I^.kOrJ ]}ۑΆϴ74^vW۶;Yꐔa^-<7wDFc 6T-P>TQLb^L٣<d+UCQ+U%[UBtJS1p #"@4` xKu3Yg/r2Xωcf\> ի3v>S +ѻ["'A:S:|chT�ο2wj탿yWOCqṇvl,"$2xA*@x d>-9rX 38y!CRp7I2nwHTLV9̢P[^1D-_WQ&*})5 K-jh8'laT,3` 9UuI oh� Ǻ<e<3ܻ btS':QߏXjo\XH`琊 NQN%ss5K~ZC+u�À43 99I9^kK5Zi<cVbP?cjD-)jVN$~̦c*ʕ,Zܒd<n-@ &VT޻س9?<Mr?&m;5 gԯ}ȌXQtӷuEsmwX}v qVL-.!hPۂ7s fCx V # `C R'q:-L)VhnirM�P}9،@Bؑ EvOWl~Qzu.jԼ81(I `�]�p4$BY؛4j-]w+jX֜>I߾pΓ'c˗RKO{/v:jO]WlA=z}kf rgAN VOeX{:֊JP1@R`بY Idjzk@b^^cqF={5mU@ F[>[gTth^C`~cUXot!`zt=6;YV8ag.2 A9XjU1Yl!Q\GGJD݆MXeMn6F&G̲';+SuCpa#v/0RT2S)}RHVزL }P-k\y?}Fl;:+[ki#H !,&2^`y*'GB&f-`{WZR =m9oz4ooeGwߏ "&ا�z*#q5W9L`<X Ce^ߨ]]gNn`<NkS|N$x63|F&'i̒<t! qӕGؒRK�NM#[%Ѭ0\jCȅ 0w_,2U^\xǬ ٽI9kY4V|?l3&#;rEW.<=1XJ&]}"978LV�WfdpCR#c4>Ռ}zɼݳ+}(5 ja s`^TRAߌ|$.nH2;~cL{YwLoOƮaٓ8)5p?=I^ S0m6=W#BrCp`bRӪyNM8\|%'|y _Rb)a}TRrǰ(ތzvEn,# !@ef%OC [| ɃNz$!ă{& h)x0v{ePnT`9� j=m9gANj=xcɧpj2 iF-t-]Ms.Q)ٳ<!Ü9vLZ[OWWon'3jʣ^Ԯv?c}I8;Q{(k'ICxfpi`Y9 >KK DZDfX+X'uSB0 )} =vtx>]:1h'a?;:ɝWXoJ,.֬]~=iE[�n2رs]]ռ[kfF 8ҡxͤh14V,`gBIMoQW"tj%]C-PQ5Yk +(/1$"W<ԭ^bA>ck?cxxwi55;q-¸ʑRMVb8'I5^'#e%X-N²[Llf9??t~1Q� [(6ړ;ع=v^(?po?/o<2ds4q|?lӌ:7x2ؐl,aEh].S$NoPi "V<Z*sŜADzee挖L8OJ6#HFFbe?s|v"SA85,C΄aT5~=@<ӡyY1J\~)uj(|ɶ?~tHM *?uVdqf+`�ȈF7ii+�t-1<P z7e(O\^%<&= rOly| AΜ KO8.yvsVsy^xtCAUqv5+:܅o֯5#2�Mě�- NIt8$A!Sek|!vӜеտaxܤӫKhRzBỵΜ5Q0SbsŎ!uGRހ Bv BKGП DASђSnxJk` KŦ]?gWnfZ(䌄$,9jHbˬՊAՎA `) :`QWD psW jߘeq Z *̴]liţdX`N=]*- evHkTOvyX}O09MV_4 &hC1g�[T~ĘZ@-=Kj<8YX 4^._k*|Ʋ BwؑEۖLTܳwN=xlew2׏L-g,{a|蟨^)7N ^QfNY"#Q4VAeHb\ anq3GNM: ٠ 9UG/AATk?[WrNkD`Ŕ )6F+ urLK⼑üF2|4Vfd ( &|D*Q#Z {FޗJOÞ+Jgox{7a6-|8Hڴ'a9Hߤn3ca-$�@ x>$m_;5|"J=~IGZaQ`nΏޢhQQ_3ǫK0_ tR n|;qؼpʴ^"\}5LM.ã]f$jmv6?s?NMjbbڍvh-n'ډwqM\J*g6` yCPYxhd0w+~nXm&Pxj.?#1IkEl3" `mlӚLfc:�fp#bܰ gL%yv~хZ0xn.{ЙVsTE͞˱Y=%cJa\ѹ-^.]EKcRGQ:GUJ8xn20|ŔUFcj&WWhY4gFX A':gD-']:tS�ف2J�M h3@^z_n@@v 1 Gi syx5V_�~�|�~�|�_1W' ӑ_:|�|�~�c�ΣX endstream endobj 13 0 obj 8157 endobj 14 0 obj << /Type /FontDescriptor /Ascent 770 /CapHeight 717 /Descent -230 /Flags 32 /FontBBox [-951 -481 1445 1122] /FontName /LMWYFB+Helvetica /ItalicAngle 0 /StemV 0 /AvgWidth -441 /MaxWidth 1500 /XHeight 523 /FontFile2 12 0 R >> endobj 15 0 obj [ 556 556 556 556 556 556 0 556 0 0 0 0 0 584 0 0 0 667 667 722 722 667 611 0 722 0 0 0 0 0 0 0 0 0 722 0 0 722 0 0 0 0 0 0 0 0 0 0 0 556 556 500 556 556 0 0 556 222 0 0 0 0 556 0 556 0 0 0 278 0 500 0 0 500 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LMWYFB+Helvetica /FontDescriptor 14 0 R /Widths 15 0 R /FirstChar 48 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 16 0 obj (R Graphics Output) endobj 17 0 obj (Mac OS X 10.6.8 Quartz PDFContext) endobj 18 0 obj (R) endobj 19 0 obj (D:20120316094553Z00'00') endobj 1 0 obj << /Title 16 0 R /Producer 17 0 R /Creator 18 0 R /CreationDate 19 0 R /ModDate 19 0 R >> endobj xref 0 20 0000000000 65535 f 0000013247 00000 n 0000000972 00000 n 0000004055 00000 n 0000000022 00000 n 0000000953 00000 n 0000001184 00000 n 0000004020 00000 n 0000012923 00000 n 0000001282 00000 n 0000003999 00000 n 0000004138 00000 n 0000004188 00000 n 0000012436 00000 n 0000012457 00000 n 0000012697 00000 n 0000013097 00000 n 0000013133 00000 n 0000013185 00000 n 0000013205 00000 n trailer << /Size 20 /Root 11 0 R /Info 1 0 R /ID [ <7facdbac1cb7d39d15d5ce84eb6a4ee1> <7facdbac1cb7d39d15d5ce84eb6a4ee1> ] >> startxref 13352 %%EOF ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/robustness.pdf���������������������������������������������������������������������0000654�0001762�0000144�00000007562�12122071020�016236� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20100128094245) /ModDate (D:20100128094245) /Title (R Graphics Output) /Producer (R 2.10.0) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream q Q q BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 130.55 18.72 Tm [(% of or) -15 (iginal attr) 10 (actors f) 30 (ound in per) -40 (turbed netw) 10 (or) -15 (ks)] TJ ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 12.96 230.86 Tm (Frequency) Tj ET Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 59.04 87.20 m 59.04 417.97 l S 59.04 87.20 m 51.84 87.20 l S 59.04 153.35 m 51.84 153.35 l S 59.04 219.51 m 51.84 219.51 l S 59.04 285.66 m 51.84 285.66 l S 59.04 351.82 m 51.84 351.82 l S 59.04 417.97 m 51.84 417.97 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 83.86 Tm (0) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 150.02 Tm (5) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 212.84 Tm (10) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 278.99 Tm (15) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 345.14 Tm (20) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 411.30 Tm (25) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 74.40 87.20 38.40 251.38 re S 112.80 87.20 38.40 238.15 re S 151.20 87.20 38.40 291.08 re S 189.60 87.20 38.40 344.00 re S 228.00 87.20 38.40 132.31 re S 266.40 87.20 38.40 52.92 re S 304.80 87.20 38.40 13.23 re S Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 74.40 73.44 m 458.40 73.44 l S 74.40 73.44 m 74.40 66.24 l S 112.80 73.44 m 112.80 66.24 l S 151.20 73.44 m 151.20 66.24 l S 189.60 73.44 m 189.60 66.24 l S 228.00 73.44 m 228.00 66.24 l S 266.40 73.44 m 266.40 66.24 l S 304.80 73.44 m 304.80 66.24 l S 343.20 73.44 m 343.20 66.24 l S 381.60 73.44 m 381.60 66.24 l S 420.00 73.44 m 420.00 66.24 l S 458.40 73.44 m 458.40 66.24 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 71.06 47.52 Tm (0) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 106.13 47.52 Tm (10) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 144.53 47.52 Tm (20) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 182.93 47.52 Tm (30) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 221.33 47.52 Tm (40) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 259.73 47.52 Tm (50) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 298.13 47.52 Tm (60) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 336.53 47.52 Tm (70) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 374.93 47.52 Tm (80) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 413.33 47.52 Tm (90) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 448.39 47.52 Tm (100) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 1.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 272.16 73.44 m 272.16 444.96 l S BT 1.000 0.000 0.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 239.19 350.25 Tm (> 97%) Tj ET BT /F2 1 Tf 9.00 0.00 -0.00 9.00 195.53 339.45 Tm [(of r) 10 (andom results)] TJ ET 0.000 0.000 1.000 RG 266.50 73.44 m 266.50 444.96 l S BT 0.000 0.000 1.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 207.27 377.45 Tm (95% quantile) Tj ET Q endstream endobj 7 0 obj 2793 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <</F2 9 0 R >> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 8 0 R >> endobj xref 0 10 0000000000 65535 f 0000000021 00000 n 0000000164 00000 n 0000003159 00000 n 0000003242 00000 n 0000000213 00000 n 0000000293 00000 n 0000003139 00000 n 0000003323 00000 n 0000003580 00000 n trailer << /Size 10 /Info 1 0 R /Root 2 0 R >> startxref 3676 %%EOF ����������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/piecewisestategraph.pdf������������������������������������������������������������0000654�0001762�0000144�00000107715�12122071021�020071� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x;,˒_HeϮGV9F `f`@Rah[U7 9銇r又o}||~<oߟ||>ǿǏ?׏_7G7>?>>n?翿o~#??׍a?ϏͿ#[>~|o(dv|/?pղu7e9YtLw׿+oaǶoHl4qk`}K>0 m)#!2Oxw/_~.&8²ɯ/Њ>u!(De"d>ʡCk!k;Cs3f"?'/Y+b9�O0 ,;]E(xFHWGIp Q*@WOw ?/3'_7u ?GqG52Og>ߕ^#ߏ_!_r|8dD@FAj)%2s?QX~\ G#?R¿ vc>ԷOVI9J~}˦&vr?\ŏ+-y�?_VX9 Lo =uhRESgYr�|FS$U'bǟOX~RAF�BCR?~Z;?j“ ?9qӝXe+DVk+36Q?ݨ7˃Ų�z(q s, `|3r?�T�-r@Ww;*VPdžX7JhU[ p1pK\(Y?uum2r]tT,ƪe=>9@颻:Sos>X*UQޑ#ݎn:xSeG&h?}aQ9w T,?'<ODY#v\ob>-Ua4ޢA5tYAiYGX'VS�?,v�ip=+F8_ j� 1d~LGSl폨CA)4/OAZ/_.,. ٿFnݨw$k>ʔ1l}+ӨJ?+ò{N1Eݐ&tϩ-ѿK lׇ?L<ZsF tulݏaX;8 <NX�9xvW5kHJWWpC4ho&# h|@81=lL r2xk:*g UWFOht!nOک0M]nu8/0Wx?'gO1pX׀Q|K&h6V0Xʳ-&r[\.bv"qB U"�V4lG|hHMF4n_?dhN <{V\R9v;a K""fsI!(7F_~~ݞv[i1{x A˟(ޣu:aD8O>󏺧EF�D\^>A7w2MePc?f:?3 궯b=4 _d"7{>?e|hߵ_}z*³uCxY?w~!QBtFl;/ �, Az ֆkŌ>E0rY)Jc�'`tU,JdSs@`bMK1%xJ 9j}T*;VDO;78i/�+*KFȐ'ԥIM,*Xǯ;>wHHiSxGBemJw6U΃?5Ɔ-OT?A1@0.jOtEA&O#WV5�FpSMDqhV�7pHn{B̸L1ZVZ*LWngueh<ˀ<r| D+|iX ٍBT%W5sF2̞By* 4x?#6ܺw6Vie\CC9LF5esRޡuq@WGe}r!ANCBz&< J~S�DI޹p9+8o1骢b: d|nWWbhB]OZuU!lz&Xj4EtjURuPL,-&E;E 1ܤVY*P"6տ1?8MS& U+ tYqEʲԻ&#X4UuER"C8um?ꃪLU'Vh5séΒnRXr])TPX @,Վ JK:I{ }Ld/@e&]kn4z6X@Sl7NU'K2]0S:}SƄh(L#X`_}g~ِBT+|o}6ق_KG Ja-]8!#R@%0L=nQ@EnI ۘg n)9u2jR½p iko\KJ0!3]JK� 1\+Z-N` ~%y<>H MCb{4SL7Eʫ(KGv{~3d$¦W3m L]T,�vi],ٖ=~hُOPǓ_qzA.ַi3y6{.P0=_D\Jc85�z_ݨ_p@|yJc/==٥/C^IQž/EB/KR臼Qd&.N� D]e_ & Mv{N@.D,9jH3E$2j٣a^@I#*:zq\h|ȿdIZmŠ@@5Bay u,Y{(&r^g;+}c?bޔDšuHl?T{ˣ&yo jtb%rZɼ#$4h띂2bI'$hP`ǍL<i$7uukƬ*%䚦*ɼ"nU5_m/ Cԡ*0alh:Qxswd>4.g+ (%A1|X m-1_,􁠒T;n";=VIU|zfӂMHٳև&uqv<H^MQ?-%hP{~L$[8OH:c~MlhP wX=\5e:Pg T*:0- X#<UvRhi@y4K|?,M)%[=4qd"rwqh Z|QTVc1ClUXJ,c_V~FHL)?urI4\\ 5@?|@;_WǁZHTYߐC%!Ttz]ϺR8'{,#&1qJsq35f U. r;–-j[HtzDM3FB Q ˜ q!uJ2vտd+_rISUe*]%G ZͲwCD=ju⩐(t}6[$ˠ!(._B+DIyK<ʉcæ>tL �m& ~Ų܏h"wrIfCmD]#1y< 'Wˌ۶©�T�r;fAqY3j~Eg0JPsj"EihAhSQEG@]5bwDu-P#>W :d剒BZ'd Qs]K& R~uaiMz`AiWKبPiυ%eO_DM)}ٴj/̪RM0T*rT�>6:j*YŇ)ҿty/XQ(C?]*VrHf J]c<6Rd]뒔XU1JI(M1`p$B9*[KDKda%ri 2kGaM- Ko RLURC R -ιޱF黱kP~8�>t+ ON$wmg USQW@0)~,f'ȉX`4K8>2,!Ľ&!a2Y2ѡn}$zV4fiT #BK!kJP=+`1;2Sm�r4i~)s£aA=,co6L"5Q}5!dfX8Ramp#S*+ßDn+c6�{)Q?59DE^~gu SP het|ȀLYQq;:Z&A�[7:UҐFI`nXJɌ 1uϢO:@=r(?oUR ۏeH>XW :<@T?`+@Q]涌qC5uAsVvOcnlY8LU:*I9򸲏t;et)P۫I{(!ȥwfvbKde!1F~Am9%Q kn6/A=$?]u2>I|c[WBź٢ٕ:}(Xþc;:jf@F-P/@5 ]xlOɈLT_){gО},Hs2mnj~t{TR �>GDیx";]w!fƄb' o.=L_W8'0QUp1K'gj>>yqI-ȵ5y*96*Y֕V$@R8QwklJRKen|oLp2!s|;FƠ$ ,]KEaZVw5:ZK+`S}G.p? D)V|4K^Ru`6hAvg^G-2XcRL*.7zuT`s6ŢL*;Ee"l(Q A۷uN",f3U׉6ptX!-9)acQ#czyB1dbOkbbchº)Len4+ d{ZYjLMzg3J& WqQI(QB k°sS'.bQ,܅%,J1i͜)f*g \ b%Xx\`YIG9$ZDʏ=ǵE,ԯ]"B-iO[ۧ9-/").x}ތj.* B/]YQb"=De:S;Z<zDT>bZøe;D (AB֜SWb]tW*:ֵa&N´U&B{l4@(5تD^68CG)l_N^,fXWXHܒN*BVk݊%,- "9Tg2 ^ԡ䘯] ܪQpo7RsX PjůjݲTo93wWtA]p9RlrE¯n,2*eU? o%Q]+6M-ק$U FNŋfc麡: +"mÌ cPP}ʠS2aĭ9ڈjqdv)J%ೲ3*S8a-c4ĹVNP[<<LŔNf3[61u]*Q+A+9R%(6gIQ& (IHiw))au I K2C_rO&#M%48ڤ$;o 1&&O#\Wb UM Up8�X*z>3Y>u&iXCrjV+ >Z31842xeObbeڟRԩ)s?vP[*yMPTA'%U65t)1]EQ4~FUQʐ>*PLiɇ+5.9ݧ<@%c3볐gBp%6|vtt"֨錻)մ⋺SJADxhmUP"(L:O\A!9+%b9pP\w(kREKecȶ3QuXT {hX!Wr;ch;PU{?E�#R8MM*BӪb(N&opC5: WWY* eer؆$K�1*U `l;ymZ@*5:)^r%,LĦ Xڕo8gcD uI/eP#Sǧ'Uh +eXȔId5oic{TdB\j;Kob"I-\и]#\PpOQ-HpKaIi(.0{J=;QNfmf#i Zg{=q�)BMBUͨĤfsNe8BV!Tlnvښ\j-eY6YPLe`9zT[nʉChcXXQdj!2b)Id1JjWfGFz Lb^eC.hJA3j>7l>eze!yUhΆrFa]pO֬8FAt�ϔRBV (o`L<4eq(=~ڂIqhKJ#i BR"4eFbRˆR"HmgOugTQ5s :ZJl<˕Usn=5^2JȔj:@&3()7Q|: aľ}'U-L/|vEnj 7bѦLla.In+y1:I g<?UxebΤ%Q jAyGKҳVq<jgl+3$z`k`^-4C˵ںк}}E�zp u)/߀^uQaȁԒfyП><V,츩>$pHjJ֩EX�x5=oqP`>ZZ{/l*M@H"u7?l?AK-Ț.JN@e ['D3gQ#j*4KDP:s145*FbWzJJ Q7G/]) \q*0s1TK0SRWJNi}:. Ac`*RLԅ0a*υrpPƽ*w \jC%HS>±sQ?}2Q�50l8;)QJr[?FUb2YmaJ:4m@�>eJ+\)dVJA(8u]Fs;KD (tڰoFH5 q-5DT B;U2oyZ>$/LiwʒhԺ& [;3]kSE*cdʯLqE3ʃ$ϲn(n~5%;ÖR5LJY,OV&hʒ01\UJ[&eؐZYBTۏR[/E}3kka0ҰuBdu!iTޙR(OX=+Xh$/\uUD;Yܱ'*N^@}FV@l6\ñ%&fN7nXBXcb钉\ 7َpZH*:~4nӜy x{&F.֮*Uo&c4ϫ/Y,R`, -PufM��U_K@5[Ta5_I]+b䎼O-%ve,Lw&"+X m1a2u,B-P C9rpzaSAr\TvVҊ hJ%D)fԺjђƶ?bbb#A/o>s,8J|NΫխ; Mr˪jKEXuF+I+-uQdS< o|V81u1ueTmBpEf^ҡW2e8GCKk6[+$z a*@-eRWJD!%f. ,Xj"T)tVuGBeTpndhEN`]rѝUu(x4\QIa6XK(*b9VHc]qTzzrbPi3 ‡ʄ~RD fuw!I@:ǍM1D3eOU]ΉM,E5]*Y*<OBLc#-##I5SS<�T&%Sp8"McRW7AozO~JU5>Q%J1ln*CĈrUr9S,M[<A{jV8q*C( c7:kxE#Oz"SQC0A`GO$ͩ,$R1BV”T|tV>R J 1<g |g8\R(?pRE{RHIh`€èؽ2 =Sw lVj! [X nj[n&HW/<CN=n-δÔW?F$Qn1&Wη UJ%]4;Lw1b1?lTJI-FK?˨Z?Uzg)8J>&? K òNSglk�n? Jja𗞿 J?8 ]1:#q'iɏs:j2`$7V�KKx0� +ո2TGI$lw|/oSKe> ]Jg9' $\*3P/JY=PeD 醴YNxtR lRI+i*e1zJ4v+{<@\'*gréZ S]=>o*. iUo ~rG8&b/Ea^UMR= èH>?]Jcd33(8\--0}~'[n/u�H5<M U4Ф@OM+)mҖ;1|:e$?D+ Lv�Q9)$R*&NWbv`]rb4T] �*=65b&u0+џ ߺpO=*[:UFQPBhdR݁s(<ѨS@Τ"T8\ ccveXr% ϬC<@02ID̾#UP޻<`JʨK)S!پ^4 M4*ſ8C>L-I~ܷ)1)t8 qhQXTZ"XU(QXX~Ht3UN VuJm~>NӢ ШD+L1lQ)":SR�؅<,T$ _Ʉ[1m50ύbzTk%ԌCC.ӧU}Zrve�mNKs@) $YYwHE } XS`h^$^6yRDLevqƩfS%-?*$$FdRKۏ=El)#Q9ڙî%ɻVXC¦Y)*y_ ,*D'H$&Ţ3ڝ�uU7'o?O@g J*RtQ Q(8PlF5do 0I3>6Z:zPSLq֗WU>Hz?Wn69(RN |X:r᜞DZVu(wRe;ʫZ?\Eriq)"eԠ`CH|)TA!BRSR�&"ОKʣB�#KĊYE;=׃ f.* eӢ(b *|"d1 &^*>\)`Ď gPt*K4kfTr'75M~M2EHsWzZy ?]WVYGH\Z>$έ|O먬 Ӹ^:˨x=mk휨gG;;Ҏ@6YH{sJJyH69`mZ\V4J2hiNB/j4>%8EYP'޳a*ZTO XjB}IIOy9HdAY,`.>!vσ󬖬"dPd0:%}H"`hJ*tO>eb ث Yj,u)]Rݏ' Gw񸰘D.)?]Jԅrf˨z*SO`iX°5i+0d$ͣŕ=A (ȫ O]Lk9@42%vkM?\$qyske`BPITwɸTJcʕх.4:1D^RaKEhALMFjj ǹ" �OzU \.եcWMYS�<J=:*u#cf#X4^4ɩ(iXCc>ٍ &L= PXODO ˶7GLp[hQ?c`|5߰@ĚܶkMi^R yH`\+n QWU#Z iǀdJیeA ʑmpe$B�u V5KV@TubϪTw<!R.WXM9&چHoY'ֽwQSOeHۍH`T �NT9M (*Z1ȯnk<([ILl׊ i6WKDP-N_.ދRD613h`MF@L 'Чmya$ARFV 1UB A!njJ�"QBoaO t`eА,=&?Ed@ "W|ODĺT3Lrp!y Iw]e_p$TLTvDlTxp?5jZ7T]`)|:٣F)gi2+@.<ҝG '(P(PT]*g/}h-yRy(cPARCIm`)50Z=7AӒR*D[qzS/@:c\[.fUz%:I'VIaZlV Z?GdZ^aS�KGSzͼ!\*Ժ{hrC؅xhD).?|H>. x#f;V0fT|T+ pj GX+ O3lF#&�*W*mBǞ<X-nEN,KtK |+adQu:S2eI1&T})!Okq(UT d )[HZ-KQ/fp`~qe>+hU/ u8]3s'bC5jͣmUS�(6 7͕$V�MnG {Hm5uPU˂$D� 00Q.Xƣ9u˨ZUmFA[<kP+8ԓ%MQy8LSr^ a :"B5|O1x�9%{}y LzRj¢@~8< fj# a֋:\=pTI kҡ؀ݥm+rqbRNeizSlLf*J*XX�kūVT׊4-)3*V֊Xa$#<ϲVNcV �TvL3Xh˘V RQ/J6GKc]njD3UdO>()6H0q$JdB/w1V@qvͨ#7跳T?JgPhcBbDů<j,XS+,ߥ-Wy. X>KB0?; H+1/ Ұ$>uO^ 7(Ou*Oe9m"OGaAWnaLUQ(\²D)GRN6\DkLj^nO!e^>LYUR3j|rANDegB"l۲T{*ᓘsLv qrH i W?HDŽXL&fX?Ѵ:X iΫ;vI$3'%/DzQI/4XR:ci/&AE"zWO4NJ3B'Ry"MD\+]A)a S}RT=&#%ʈPJk(~<Yqg "svO%͌\GDQ(>;*gm?~^ ]ɠf;d"t'*tL^iЈԗbp])j7bLLU-=E'K9XFa}?繁HȎ\GX-AYwPOz;u{xPo:zkzWPwhC*Y<6/A2&m6 `v"ZZJZU^ RϘ$۠b2O1ن⛈b{)8+c}>[Դ{6%ʼ[El֎r֕dŕsȴ߿fT1j:*FHa}/lw@k~:d (�x)HB܇P5 -хZ=-o 6J 3JZ _&c _"4ÅrtgCT, Q, L ,Mm"=F(Hјd'y*VlVĩ,?wQ?wt�<z'#&[$;3A1ґ`RbG4bR#׌mܐu:ӈЏ70] Z_V_ ¯(尫<( BqPTuLx9*H6 _w֡,;`ͱ@P>#Rg0kg)nQʁ7֨{/%YQ) PtsN*nY(2fkPu"vz> POCQv9hcT慽jp[_s,~6;ܗV %zg%׎ӼYQM9 R,5AڻҼť2W{H<A3l* yM4Ic ?w:{]SZ)�2H~@,hnj>USp,]$}g=}҅?�l܈)coK#),bS!ӋvZPhGe3%}Ja KBu}zЏhyUT.K!F׽€B1'*$J\ J]YNKLbb ~fzwY0IewLԅbeuX'uiGPPB*U'Vp~oAY*qlѠ:EuLP Pa6pRmٕ !-AXկ4 M*/ qeX\r}rI 40o`75(pL- BXEyvTj|%MD'_"j Ob&?u~lBᄟQ TEG Ul ƕoƯߠMFFlrc \ϴʙdK#;l1*/7H5hسTĨveP9P̝OGf<4\>AY]a +&S{#>?GeU}A�RI} Ď|1ʩHd _XTZ¢Ny nIɣ%l~bԄ%�6:}EDQ@^ٳ=O&ezCm W6N̿3jA~`5o sh N4| ~i=Q`JTGտRšͽGWD4DDKlj$#UԄ Ҩ.wRꤊ@$ eҧi]z(D- La8 8 b}�v]| ACo8*~YG~~(:^thlgW 5dh ՜/-B(R'gURѺGL҉Q C1aȸT'.*GCPl=DFQEXQG<DN*F�w8<!hIL.5L&<?`"kGUJԌ,UbX_F5=YvIcpQbu[u @| ؁Y{e(D�X[xꀛ\wU B r/oXǑGYl.N�@BA�#ELI:TY#G 6jjlˠ64|�hV1u=ՊUܜI)T5(jWUԢXŇ)+>7+TAzܙ^ cn+v�aPAiU3=)+aq` 4]!+p VDՎVY_ac jWbT1%h 9](`~}ՅnZOݾN)hۇu֤&33w (`[(AP-A -j1_ >QUׅ",=H3̵ nKA&`*˨Z&`<_*[=nj/dqTKͳuF6<�wH!TjNj4Q*SoGq-}%E<eRAisXl?iAJ0g%lƔ }a cgw*BSVc5(Lߡ]nV#ULM(QMo VQ SLc@_E 1sq6Z9 .gi)R,:҈Qr"//FJ0x[j~5/؊ρ⌔Lܳ.Brj4PmL)2̜�V[ŀ2S/1(&<)~Ǯ(wj4dIRJ9j{P^Z=G 2&r.} 0\],qT29WMcM$)4jJbXq|Ģ>#;Ѥ0a7Am/,U;T�F*VGj�A;䐈&,՗/qi!@2%>^U5 ؄Z�X>uz/*.J1,6čО>9J4\7&GqeHHqVMaH%!E�\E6C-�eofFC*Pj Dc AgİRZoȨCF,5WnsM wVӮg2B`)Ct憌B[z4֠i&� {bWOPlU}twBTuUo,NNe%zfRIvDDoσPCAn!tsET]ǵꦂZTϴb߃bji)ۂ3Xj8L /AT}p'a4S M*lJWO&e6{5�%%֝P j1A �0$ \-} BIjzL 9)L1 WjQ ?R#TN0;R&S(8zP<o0K,%COQu`h@JΙǖ4ֺ&}Fղ�󃜕[؎Jo;+%D~6&9dvBRr˘Vߐ?xUƠv{@82D>Òy̦g\E33>ǿ,ԅʑfǭC%'hFuJgQp3)+IZ  6/9 g~sGjۍY JŤ.f&h9}|8Frpw/LQF J@_d}D1/a~3mH-"R<\w(Fy T9|Q{1@A9/Z>^H}:?O]L?,pNUlE~`g:]N)qYctO(aFNjz*P|~晝o<KTHAqrB yROh%A?[ك YhJAQƬ)|_X2]qpt]JK4nslJuh~{lzT;$r`m Z?yxBh8)͔ي:]*HYĈ*翔*Y?VAwR G{ HNuTjS-*,pufşCu *Trn5;VeMxOy_RG*I+>ʜ  GKr,2O�,k]Îe1- 'Wi0+%RjJV 0!%CU7 NE:hUB}tXZ$!IeO|Ux i 1 Zg4rR5*T4kO~o}*R!Gۛztߖ'Ϻb?b-P.{ Fn D{eC_}&'k tn>KoE2?F>|{Vپ#}Dp۳LxL2v)(`y'_F ``{el^xM8l_7A1|JBgES? WoIτ65W7ڿe Pg?p6)m>Ewzx<Ԙ`s�ncRM7M_7>ITDϾ7=G:U_?_&juZ o7X>ąLzrQ.̾><]po݄8Pl,=7�6{*Ww9H1oU!>To['=hF X7fc $*6g2BMOz5wн7޶q :#'=ۇ?|KW3Kb~VG:lln_ov?1|E"@sկwғ޺Ɵ$1:gLx^sz፦7 0a/ M!^O4\9p%R=x$|h{78}!eN’DR1^:P>v?pu%8hBOne7)2aibMs_A|掠gfmr>WcMUGe T[q}{ohOgw"i!ڻ8Õ!sd9m݄g Ȣ}#5喆}i؃0tk>RtXytz +fcg|y$|o=#cwy1Ma :oίvll6>;64=H'߷>}H$ᶩf/msgA@C6O~Msaߥ<>{׋o8=}VJG3>?:}ni/ch;[q[^|}j/A'%_p 0Ͼ}rV9,Ӟڞi \!}^ĦRep^|#<_%D'A3>h,r_AC4^ZM~YU3땬^~# _ Unc9H/G q4!~aTIS#2ho2^3 G@eU*-g[?YOb p;_m?W ,ni{ r} -_Z`y΁"madpT Mv.!2v+?O@5:1?AoS}[%?o]栳Ͻ3яi^~eC? <\x3]'}.{y呂=:2O/!,|vv8{-Ylh{?<L=BIRBn6~/&dϫC[ ߛ}C&Mmu$,0]vijl{o$=G |.C{<e3ˠJ5ˏoۗ"ƙėJÞl0fo"us;uOY>ΰJWTe/y9W'1v{S"݄'3f$q. SGdzf;>:@fnS7X|-ݾm9sx΄7}:-R!iCkιco`ߕ8 њB sg~Ww)jshl1Ton�=9~G5Kׁy] wm _/m tg'uU}|,4\K kmջj[o?|ZԱ ^x#4M}x[zP\|b�ϱLuN;ڿw,Af;>K^uz [#kkY)r%ti/2%hQ7HT}3럣Ͼ"Mo2?Z> ΂wx~9K co8?/,cz.h9g,+ɏ^GA>Jx/qO7v/?DMk3OW;)\pz,UhwtiF7>ǡ{b7e<Wlo=P@sgU}۷5gS5{BퟠppSdr\wd&;nbzHLNfMM2::-PY廳lI;>- ߑoڠwLXO"q^NX]#zgO4D~#.@/!;g]]s{zz ~;+u|m1*}yC{ѠD~o*gQ=.]BxNn?bj1[w^9CS={g_R#RoЄHޏl7_zI4E.\?23}+\S:]"qm^fFK iQ㹙ݿ�)=_>_A'^Cyv楮nygb� ׻M6JGO]!0@~=\?I˻0Iŷߋ_ijdFk!_ʡC;_[N,~{6X75ih}Ν¸ O/ϙzޛ{ąw'шʫHWGNSć =FOK'@F۠k">sh?_$h;F*[~|ho{gkK=_IϾIu/YrKM^`A~z~{>v9&eKo(}h]1X>e8 v5CfmsM Gn?:Xj{M}=vߠ+?9c}h\*Hygozzl~*潍%:&^xIws5|/ 4{G˷֙`_<^ExJ%V"I?YF;:#To[>+M '[WB4Р!Ast$lYi|>I#~?Haohy|{ox,Sohϻ \?]opQf:O9X#^z vz"'n[܅J6{yܦxXc܂(;Twפa>HVhjyAKoŸY2z>X\ӯvU.Uގ6+$8{)bGGO[ѐMghފy&9sd乾ځ]p,=m5s,Ո쩯CARq͋"*MU:6%1k!Q>Gku^R݃븮WPK;f9 MRu d~7s<h<rGt]*f1. ?/w_|sl8 TGFugNc}Ҷ2Cw8-m{;<{݋o8I*7 X}ߘBw6鬾OKSZnnlz6un}w3cY^v#Ss8sonq6 _`#2[Ѱ.U<HpdMƀ}6o7?W{Jݗ_`~;M8m{0}lmZ%jmk7g3݌FyIm헿MI> o?&>6Ot |tF[YHv%KWin}-\{"\7xo;K6qӍz&?.V?ҕ;t>kثOoF(/MQߵzg8 dtnWQ|v"bo>i?n?4^ 63=FF9z>+XL|ebe#;a9}%ذ(%xz|Y>x_:oyU b9LjAzݓ؂Y߯|>۵Dz{fnk~Gi~÷^^nnmRdG7? vLs#M55^~eL[ІR]ڔh~[d'H_ E`/W?7~yїO Ӛm< ?f?mIy@#<F!ӈD~$* ZLHw\5o4_10{빭>wc~Gͺw2h|`ŽH6`o/޻2CuЌ4G_~W&k>T>R-b,XLw'^t~S͟<DŽ| ?c;h?/{}&,dz4.*^}G46-?Mg+}&U^z}OzoI51}㸷Yj8+󟁏$Q|A4ݩi=r6>~ +ev{ZbyolM}agK2iA,fmFd}ECWz u95#f=ʀ[.0v>:0ܾ^ߋo45ir(+J:g6T_~օ~yd} ?#_,3YA;kx)<QG~#$=w>&尭u]vklh)Ļs^rqpn7&>nygDZQAa51)? BzcZѢ2gC奟z]!W/H8s@ fs܍>h{FOĜϥwMo4b\;מnP΂2Pچ:l9ZŖ2n.o5}Խ3XGt~ 9T<k&߾Q~)?OSc?<x?'=mm_{;qO_^8#wχLwq_2~X f1pY~q|O{鍤/u@y2^30Eu9Ɠ9gN阋mi^n1~LtIBcГ87}269SZ 39foZ g֝1ھr0 F{Ջo$}/͑W.[d&='⼦e"['Qy)hKl{׋n4?^nCNk@3`'ɛwz񍐗e-ti.%Q)m/e 5gjHrE{ x*m A?<pZo�ЃF&™; 왥}y="N,^s3͟}Kң!w[ɐMw-}\Q}`w-hJ?`ξ' sg:]:X>O_qw3fg/⛝M0=xt?R4*4*5Ks]X[fXѱMe3|>(ߒ;y:^_z$͓AHm^!u'wC(>6߈uG݈uLYf:0\jΕƪ+{mqږ6M`?M<#utJҥ+D&�?l:+z62<w <oMNS;ݕ1Iz{{+/EKo=Mj"Ff1TvTW_\)o6VwȦvI}h>b|o{f-[߸&ʔg~hs'G;ܿ]^x,[O=Gb3P^x+w ҳExͫrzYj= _eǖa]#|9sIKOWY~{D)>}ʘ<<]KMqWw܅fސݚ< vUn/u{( PX{=~f:o d=~Ko}z#/E>GO- beO_MP9zrڶ%̜p$wG/mFj4~ßǹyy'|'tWp&:ޙC^]-W/l|Ho/f3g?| ^GnoswS[k 5zIԁ o4 5�ٰ?F3 cyPX⾹&{ix7ž}l@Ά'9[mX܈gzf9Go3!WIM/٧&@oy=(EA|Ow_| !phAX09zğߙ}9S>NEY&?<?΀>ppD }tq[vd[XD|Dz; <>距Oo7n voMfF{P͵}}|G?ohzǹ~&M/w~ 74 =\6? 7|E?uCEYӎiUx{#Re4^['f(o/Z>W~}\~,_RFoNg <7Ɉ^)0ȼz]Sǰ<sFaj{芰9 7\А0oUxPTkB￰}ENw8?-D`4.dwq~?KQďd񳝃tޙ򧅓x!={ oPߵRnya/}pF]SU?`1pmK^o֦i_PfZL? /[Cb^?>`OM3oDM~w[K}6oC{X|#O-}9,:_?)E!z dQٰ}#Q)6훪"j%J" $.Zӽ:u^i'm?M\= ?OpT~Y6I|1Km|',=n:V`{MӉJėR˻3쥽)dn\}o]f{Ɨz`V+אeӋo$;O#>h^ʩ_}j S^GϋU358}zad| mOfˬuMws _|67D7y ?7w"^lᵗ cwE{ƻ& WOǦ9h~#&?m}ݻ{tT#iƾ𷫓KOEq&roW~Q0twɛ-g;߻Cfe$yG|gF^F{VGzg{gC=˼[?\π*`عn,�Ru%^z#&= 9ǥ9.<zhߣ(҃i {ЗBϹ})vs}jpG}>}t!&;{w\~c$~^|GwYaӤh~s ]b_-/ICL0G{i2Q|f]87$tjo <T;L{ԋo>/wwn|^?L)gS{.,|Mx32?MxtinƧhi?34MОNߟp}FXC҃ivdtc&4~~+IOtw(|ڬuONvO{;\E d\d&4!ɸtwDd/ </,J͐?Ocg_n` *i~xZNߒv'f~/IzAߴE0 oX.@*+fcukԼ_D7ڿW`t;,umQ~Ht3޵(?@?32ھMOh_/l%Ud=0//2`6g?ioxgse}xBo[^gdh?[< '`[C^Xӕz8^x#ks�JR<<~ߧñE,gc=nzO7-cgoߛӇ4n*՗ yimd{t .Z</C{>_-?-d{gm&sk4ޅ_ym:=N]jJ\7D?!sn]⟇_~R!.ol4 o4xsG| !\ y}ŀ_wo(2]CoT}$) ?'n@r8/V*$~)ZA?o^7`s[?^_ +}iۼ2 _\,a5ھ eʡ1>7Ӄy?z@YP?*bgdsn#ᖗ lq/|ͥ|_jL>Cgs?<F}Iy^ 4?gy}äaC ®9l47\N/^*p*s>/47^|C}>24^6$j^EmZSnw:f;~j|hho=z 'B ? zvx ~3]wRhxF*,cN߅]>g O%2 y Vk{wDm=snqW_J5߉XM#± \.{.M}7;5㛔F 篂XQ e/=\N{+sf(n{ O^Hۥv:j=f:NvBw0G'ojEmЧnc퍳,hOR$ՙ*"lz# Gi,Ns cg[mm_ [~ӻC!lіմu>{%ۀn]�Atocu,MB,qlnH[:R/ZΏ޳/=ϮzG@H=6k i툒A F󧫔:894n/70{7B^?~߶ Ҧ%.E7?i yoz ?m>ORIf.wgg1 _� |;6ؙ]#'މ/1Yu9-j.2"ހs5|bWrgv˞:Җc9{{&;}'{oCm0|LEsF΋[1QfI?}5׋o4] ~)1v?!}!"|u ٹt¾=q prV|ߥ mQf}m럃g`^">RNgKe:ܿvG 3З~d2`4QKyqDwⳗj~Tmo?lRg;!h9^~g[A>qmq(?oˮDDŠi7q!(,zވ9~g"aa78^y>kjU&V\/Ľ5]g]OMؾ* Iߨow#Sgg k!{{Ӌox ODW?o&:?L|#k^Hl:n3m ʴӈm>L77T/c|#c{DzVf Maûc<({޽m%Ml‰qZ ўm3a~tRlmO}#ے6gCװ <~G{1Du!#,3w1n@\32~|m̹y?;?ybƥZ?/˅7iJ61#[c"Ml3=~G1_E|Ӈ1{zΏxRd`2Xa}ÂӐ8NJ})|Iu5}g{k:Fj>O@QQK胰O!^*p|w>r6]o.vi*]Hwx"ھ׾*Y&4z>W'㟹P&yo?<ϵ߃Mx՞ym;dz_]߼]. !pvClԠ.2uU7<~+xo:{ h|r;]d.g {[kl҆~Хg2=|z}EO{g;?΃^hkMM~G@ m{FOЧ\2^{vo! Wo_{^LW^c`:ݰYt\J? &ދoJbߔwPc-hь&-w%VVrr{ۋo}8!s,?o&mGet :KY /|7^~#,q If~6x_-8={qhɕy D?c o'=fe[ཾ~?^|@?_TվտQ|dk/#dqzR֫PO?~}g?wq CFGLت:yD3bu|.޴~ys ҧ+Qmb"lpd {m<wLO ϶{8mҫޥFsoaz/߼Eqk{ ` ?=?ۇubiQw 5ߦ>>yQ~PT[zz<H"?~'#W&/3$Y,Oj'z[^~}j9Y܁ a,u>q4Ag3zk|_92R/͗g~ݣOR.ҷ]\c}T+}"{?#L6 endstream endobj 5 0 obj 29952 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 504 504] /CropBox [47.51968 69.6063 467.8347 453.1102] /BleedBox [0 0 504 504] /TrimBox [0 0 504 504] /ArtBox [0 0 504 504] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F1.1 9 0 R >> >> endobj 10 0 obj << /Length 11 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 11 0 obj 2615 endobj 7 0 obj [ /ICCBased 10 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 12 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 13 0 obj << /Length 14 0 R /Length1 2908 /Filter /FlateDecode >> stream xVal[W>g;I4MR=!Y&Yڴ~ܤ 6/yNmq,T�)҄VԎ_$@\@i$? hRԡik̹9nR ~=ss9gom~ 2+kx#</\2|["5ߖ�TvV}; W%m2$׶.vxd?,pu͹BQuJ~|?VolhWpw^&JH8m!H(h!OO"/vN?v,/N[h`nIQ Qa<v5߼Tҷ6]}35oT]gHXra+;rC]}|sͥ3>CX&iRvI=qKue\:¸~:(?--.{1;Nq!C_os$'뽐, pk #))KOo'@C/yO'ϔxO W +(I>? /̄MW˞9ҩfӧ<u3_Ď.P{[8T,!-)|ȕ633"l (s0bC&E>if+5cG ~;͌\٤_Kys x!2QaXhX<s\8R,UjCv ۨYi:U tHl|>g[H4Z0Hykq5ŃZFgj`82yCjUɻK?x->̈XBk䁘ƌ ޿>i"jL{�)Rlq#_4*\1a }ۀ/.p(<y, 5ȨRo/#qwŸ#JYHTciʐj I1f1(;EJ"ʐ(=,W�Z$fU7G-ޓP\iͥ#bDcA7a~}҈j& x5e*׋aG,P .DƇާhPYc{6B-EFXrW}St49m0ڥ!!R34$MMDt(E8)D"G BCUJ#x`Q2<>$j,QvΈFC\<=Ht0oج ΐ9oZ{Y6d{njRt�3^SEO=g̙ܳ{nb|M̚ Q@G֤u{3d9;Z4kV|uk,oOS3ۑݐBr$N/d\+%`\Y& I/6*�-V\+ц^*$]ȑ.uJIΒO<,ɱG@pCA2B�.ݽ+?cf3a3�v*"%dLH؉:J"y)IE$5R@+ bA{6]cBshW,u婇ßUY5>TCA\5_<ã?/5ы#IN τS'l '}x k`06х6:8nx55 {D>Gt}#U=u3'OWzPR}pJtl~/Woz% ߸mzR|&?Js#t7;B/s%gc5]^\v^]Hb endstream endobj 14 0 obj 1784 endobj 15 0 obj << /Type /FontDescriptor /Ascent 814 /CapHeight 723 /Descent -177 /Flags 4 /FontBBox [0 -143 976 814] /FontName /GLGIQZ+ZapfDingbatsITC /ItalicAngle 0 /StemV 0 /AvgWidth 668 /MaxWidth 1016 /XHeight 542 /FontFile2 13 0 R >> endobj 16 0 obj [ 791 ] endobj 17 0 obj << /Length 18 0 R /Filter /FlateDecode >> stream x]n D|C)7TCN?�b! /7z3`X~;r -zcD5€#8S9ԑ _S\af]hJ )Aä6_§xEɾK!SrLJDHqHdY0-ylsҶ/*%ܦ-kU`p endstream endobj 18 0 obj 223 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /GLGIQZ+ZapfDingbatsITC /FontDescriptor 15 0 R /Widths 16 0 R /FirstChar 33 /LastChar 33 /ToUnicode 17 0 R >> endobj 19 0 obj (R Graphics Output) endobj 20 0 obj (Mac OS X 10.6.6 Quartz PDFContext) endobj 21 0 obj (R) endobj 22 0 obj (D:20110411102101Z00'00') endobj 1 0 obj << /Title 19 0 R /Producer 20 0 R /Creator 21 0 R /CreationDate 22 0 R /ModDate 22 0 R >> endobj xref 0 23 0000000000 65535 f 0000036090 00000 n 0000030069 00000 n 0000033161 00000 n 0000000022 00000 n 0000030048 00000 n 0000030288 00000 n 0000033125 00000 n 0000000000 00000 n 0000035771 00000 n 0000030386 00000 n 0000033104 00000 n 0000033244 00000 n 0000033294 00000 n 0000035168 00000 n 0000035189 00000 n 0000035428 00000 n 0000035452 00000 n 0000035751 00000 n 0000035940 00000 n 0000035976 00000 n 0000036028 00000 n 0000036048 00000 n trailer << /Size 23 /Root 12 0 R /Info 1 0 R /ID [ <9117ff7eb22fa2d6d4a580585e0d855b> <9117ff7eb22fa2d6d4a580585e0d855b> ] >> startxref 36195 %%EOF ���������������������������������������������������BoolNet/inst/doc/pbntransitions.pdf�����������������������������������������������������������������0000654�0001762�0000144�00000034031�12122071020�017073� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xˎGE1;{xkk^  C2`i1?Y-).VD0KQ__e=ecQǼ:|Yy_J-wjyޕ,Z> <+}Fc֐itU͕m>c"~: !?e浣kl?b}!x[.ס\hKnuƄnrqkT!e(:7] j"Tyt!e0Eh]?7-L$|amޗCn4~E%Ls|H'xB&e^C4r KX_2Nȡm1@R6$/۹j 1sqYrH_s �6r01#Ǯ.pC9k[\~S kE6vGTدn*ӯl iQbۼU\Qn.{[#YB,֐Fi= r9NDzKɧVnd[+W/sAxqdɺJu^N2M?+HHhS&H`yTjRC '2%)*ySWx`X # Q <\A;\Kqu+HƳ<4/<kWѿN@2>DRdASqxK舻ה&oňF\hDGõ@7"(P90O)("aFU2, PDrύE "R^!In)G#p%˄OBj(-@dW%Ȃ`�qYYTS]𗬈`i�iPV>-[ueY�"%%H$;ZZidL<IѤa?|ҍ(P(JK۸tУ_| q9L T 7``V)oH: V4GYNԕ8v _y5}ðgDkLK(hT&k rè*0tYN&x>b1cyAhTnG$pAo} nbG gpWV]ZfXtra{ 7Ն'LzۙVXORvf!d9!q` SyőkxAR42pQ;2s#[31cL =$A>c`͂C"scXs,UPF5S{$rkC19=@ MFĢ zA(a3 hP dWuV&=QL1 0Vfx}RW|رϱ1�JdžqL3A�TPEg{WCa1"d[<L! q;:sLƖnyf0A_fP&41)GT2oH;� m'jU+,IW6{aƠTj0-J9�Z&=鏀*=dT+N;A@6xܲv,vnaȱʶ8k -P'`4'&2)_:!8'h%ϹtHs8lׅO9H|œ(A &rs瘫%.ыBPmL cFH3 ^e3r T)c?ɓ1yK;UQ6O9j#|) ݈jB'mԥȤp4L c? l!bUG(~1G# ]5 UIYV K@;4u(t\LIe.=0v�#ΜVOᧅ #4!:;@\`]QҦi}rָ=HPy)]Ө@ d w`{_KOָTz^^2P�z֜%\97j* 1sw~ To[,184ۦ+Ct#B6_[(  ;4o o0?pQ}$+?lHb-;_ty7_-?3b^"w!FC"j!m/3b]q 8k 9yǜomF:MJ}.#F:ӈ^ o#RgCϤlF_~qpB[e0~]˲\>}q<4]]% d(H[֬?3W׾ɺ KpnٝarK-#ưꃈDxD/[bD endstream endobj 5 0 obj 2392 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 504 504] /CropBox [85 73.62205 466.4961 454.4488] /BleedBox [0 0 504 504] /TrimBox [0 0 504 504] /ArtBox [0 0 504 504] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F2.1 10 0 R /F1.0 8 0 R >> >> endobj 11 0 obj << /Length 12 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 12 0 obj 2615 endobj 7 0 obj [ /ICCBased 11 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 13 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 14 0 obj << /Length 15 0 R /Length1 2908 /Filter /FlateDecode >> stream xVol[W?g;I'MkzϻuHIֆ6_m?/;=w<X+ U7(҄VtBj4$C\!$Bվ4оBд57v9ss}^_Z:`d0V*#x疮-Mpzyų1�]~en�Rv<>!yDg$#'x~u \]6W앢.VW_XoZ'go֥޼HcF!<mW]DqmluY�vQ_&X }J!"l;-]WT5G[KiՊUaliV$lv4|vH{ze-KعԐvvfK-EXLи3׺Bځqͧk~u\CׂǥF/p7gx`j7n@ Yx 0 򩢟T^W~?ɻ:Pn?]N3j0L& 7ػ-[p[Tٹ/s3OT2qƈ>5}{b #< U"K1 :(pě{ Jẘgk_AE^ъĐ> #1d:b&^ZHη\)WW\�RJXMRH mI,ĠNj;i|U8x]E4O%r9jZf*] Z\Mr^۵l`00Ǿhq٦I5٬^]|KS<R&fD,sr_46y/b mp[eh@܈!.7 X$od-a1&y.]ϡUdfy])E}$Fu(W׹<PX\* ik,ER-a),Yx@IEeU^ Ef9gS<=I,>j\:"fM4Fku&'/&`MRS̚,sv|.V8</Ϭb^t{ j;r{(z7h@"@OKL#UMLa7viFm:d M&IS3nwJa/-N =?yтАnS{[ `sO)Z4A3"DN�(O]9+<3dY9n39^n7O>O|MKI:ak̙ܳn`\M̚ ^@G֠u{di!=]7aԪftuj,gMS3ݐ|b$F/Dlk ~mުKS$ب�4uGRGzt!GvNQR;x+&x;K<.𸇫^Q~btпp~O]5ߏΠN*}ةh1.a'j(uR܏ rOB=Y8b䓃 o{.1\:F"<u?:{7"sԀ׍gp}!'zTO'l }x k` 6х;!ltGp<ن'jGj[DvkSo;ǎL+}jR.lv\!oWv\iuoĶriR.|H}pGci}%>~U a>}+r\h0;/)[7 endstream endobj 15 0 obj 1793 endobj 16 0 obj << /Type /FontDescriptor /Ascent 814 /CapHeight 723 /Descent -177 /Flags 4 /FontBBox [0 -143 976 814] /FontName /BXIWAV+ZapfDingbatsITC /ItalicAngle 0 /StemV 0 /AvgWidth 668 /MaxWidth 1016 /XHeight 542 /FontFile2 14 0 R >> endobj 17 0 obj [ 791 ] endobj 18 0 obj << /Length 19 0 R /Filter /FlateDecode >> stream x]n D|C)7TCN?�b! /7z3`X~;r -zcD5€#8S9ԑ _S\af]hJ )Aä6_§xEɾK!SrLJDHqHdY0-ylsҶ/*%ܦ-kU`p endstream endobj 19 0 obj 223 endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BXIWAV+ZapfDingbatsITC /FontDescriptor 16 0 R /Widths 17 0 R /FirstChar 33 /LastChar 33 /ToUnicode 18 0 R >> endobj 20 0 obj << /Length 21 0 R /Length1 6312 /Filter /FlateDecode >> stream x8 tUNRIwI:Ou!N'$I'i$ &gqCCPi>TV`wXwQ!8[?ٳgw}ݪ\~[Dz`@liY ʣEn_i�U-K(�;շXՆΎ0Wv"!b=+WqQ[&Yޖ.KV/]1!O.USS4 ԰@Ae*�+9r1DQN[7EAߕ"H^H}88l4( \1F&D*OfXœ(TZe1l65k*`{J$^\ۍ= OQʽuPb^쯧,B pЇ>!)*p3b AL:GU"T0Zs P0jD# ,Ҹ/FxcYpԓY )o#F3^S6f^3̿F@oUZ"F74~JL,d3!5dewdY|^:d?::u#u:::RǷ)|r  k-ݻ.)pU;"!^*fM/ Uddh=dc�r88?8lI%0EHoZ$TiIфBpkdy㷿#T$'6$g@¶B%}M(EGCBBp0@~ᲣQP!b~@�}/q ?9 ^Q'E GF ʀ܇d+<qH.f7 {go{F~a3Y EHa j mH~Le<Aac0'l֭h8LJ´wn_(|ez3\jT I" s7s2srKR9&VDk4FQi0o5@謘 *:UrR:|;Cr h(V6JdkB2B_^Ƨ}ܟ{RSR z륒y曚Gg=B>q Ө-nX/lhO=]dtH ؂F{dzh)dz0eKa1jA1 dQp(b:# f{ؠ /`Þ;q{؁ JEHĩ판E"<\XE =f7ٍ {0{g? ڳ ;<VꓶwfeYb2}m2lv Vyx2'2{= ;<M;cݳi2Ϗlmfk֟UVLI[Imyd[M-yy+~YymVXJl=b52C@1_ૡ4|gʕ+] )0�~2�A $w@|/a&Gz\C0ʡL .pjC,8@ KK4hF->C_@lDS?# l<2t7TG�|DB7,N^ y)xlvj @֐'TPgGq8|Muf(%7BV <OoXFa#70V8ć CQ>&B=܄#z#p cfR2,%yV3q*`a@OC,G_1ZbUt=Q5 # z,3a%A،_apDGч l6 1Uڡ:Vw  'ΞyÆ+_e2ڨ0Ў^ǣacw N Iyjr#%'ȷRf6>0=AO1&&b Ev)yl;}V ۂCáC z# ΅&\[v%Cr.?{`A8'зOV#$E*Mj34@I &d-y9H},+,RrH4 XZh]n,M�LSô`)}c*jjT'TU.:gW~.n w~j~ku \H=;(Ƴ"`r'0 2mtYHKMI6% qz]L4pjV1ROReZgȓqk Z~@If$XF2Z#I%oI<c5K︭�qn3^4g)mJǾłc,#wy|<;1zyvLFX-tY#nd>]jq'[,<DY[%VK1qٶ56<{ljo {-75KLW>ن>WJG<)Q[MKP$`e'c- V/mFtNvB=<fu%9ØCc$Df yک H^U^ Zk_qѳŅȶdnSXr1&ceMXjE>W?LP6Er^ _pv?>�چaB~{p.ܼ(/�Yr:tq4"v$Xc7נ5򺙇CCs'.ʦ@dt y8y]65[$ћ|NA=C^=Br^/o sdIt{1$bØ]^/J'<E8e9}A#ϠQwhH9j %D)A @S%@7XVKLZtFSNLˋs #B%G.%.E."<}.#\)?0&X(~~3XaՋ YW:q3$9#c~Ey0QJqON.6@=؇ȠԲjS@2jj@Fј;kָkknq6"E? \n_"as:"!Scs"#D&&EG,~5>*g8U%ťE)$zQ]4ʠᘮcY~1eeys ރ@ [335ilf9bܰYp04chojq2FemL-%SgSe%�pcc]$m0zl|6e aaFx3xCbBQrԒ>)S++-_ҹu[7`MȆGo#/۹ ;#oJ}{^'3=0..]'&6h@[5gәrgxGk5ij.ʈL8EEICdX3d!L/.R*cg]B.8'7$$[J*H8ӚJlE4.?ΘeAX/<sV*%M]z#0U]` q-/zIWN\dP1jC|͠0G1)"DF0 c>AXA$72`Ib5A*f6781tW4фY9ǩ}lylӽ{cucڧt*k#"hpiU:l@^^K纺4D:&U%M)%2iwm-Mov'ƒ-~c'kQxC_3l7=$jpHʹz֬h^H}FdhLNu1Eыb:o9%Z#.Ęd1떤KvfWPn`'-`h `tWU.d|4x8F ':Xҕ} -<utg྅M%B{}37'x*՚6w_[2w3),k{d-s˳˺~-QmQU fMɤDcǻD֐n$t11+bMSB1ͦݕLMI]bESK6]gOkn8?OɞrULGM. ΀n 3(\v@w K"ID doIfJ1[K%բRsب-R`Z) Dpu6 n&ƶ,N(.X-rT֊Hኗ_=zWB24ylMVe94.xVW{n?n8 aW2ZM$K>JHѲSrn; NhH˓c+:`>_k+vx`0*kjq6utki/*;W endstream endobj 21 0 obj 4400 endobj 22 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 676 /Descent -250 /Flags 32 /FontBBox [-203 -428 1700 1272] /FontName /STROED+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1721 /XHeight 461 /FontFile2 20 0 R >> endobj 23 0 obj [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 250 0 500 500 500 500 0 500 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /STROED+Times-Roman /FontDescriptor 22 0 R /Widths 23 0 R /FirstChar 32 /LastChar 53 /Encoding /MacRomanEncoding >> endobj 24 0 obj (R Graphics Output) endobj 25 0 obj (Mac OS X 10.6.8 Quartz PDFContext) endobj 26 0 obj (R) endobj 27 0 obj (D:20111116112917Z00'00') endobj 1 0 obj << /Title 24 0 R /Producer 25 0 R /Creator 26 0 R /CreationDate 27 0 R /ModDate 27 0 R >> endobj xref 0 28 0000000000 65535 f 0000013538 00000 n 0000002508 00000 n 0000005608 00000 n 0000000022 00000 n 0000002488 00000 n 0000002722 00000 n 0000005572 00000 n 0000013213 00000 n 0000000000 00000 n 0000008227 00000 n 0000002833 00000 n 0000005551 00000 n 0000005691 00000 n 0000005741 00000 n 0000007624 00000 n 0000007645 00000 n 0000007884 00000 n 0000007908 00000 n 0000008207 00000 n 0000008397 00000 n 0000012887 00000 n 0000012908 00000 n 0000013135 00000 n 0000013388 00000 n 0000013424 00000 n 0000013476 00000 n 0000013496 00000 n trailer << /Size 28 /Root 13 0 R /Info 1 0 R /ID [ <22e9d1f3920204a6d021e1bbc65fd970> <22e9d1f3920204a6d021e1bbc65fd970> ] >> startxref 13643 %%EOF �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/pajek.png��������������������������������������������������������������������������0000654�0001762�0000144�00000205405�12122071020�015130� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������P���sRGB����gAMA�� a��� pHYs����od��IDATx^}U~.?P� _hӈ4#$ॏ-JJsKD!"nQ!! 5!\B(Y>w昗\k?ڕw9c>YsO^ƷC� ���@��{=\6?O.>#>۾~g��@�� �?<|{" xǗ� ���@��~jCoiE@?!<��@�� ��x o'!r Ǘ��@�� �@7o.Fi7��@�� �@7o-_1пۿx� ���@�� #E?io� ���@��~'_mo� ���@��9_?�@�� ���1_zv/WGGOk{v:�@�� �<|7x_[cK}'W#bs%vݠ_׾o"{ʀ'@�� ���~ѷ}=\,/|},6) ^CHE7|K_ry<yxv:�@�� �</}ޢ-Xl.0wXb9~~}/|W},6^Os3#Wޫ/K>c'ˋ~<ў��@�� 0/wo~bs}|?'<<w鬯}e/Y/)k|z˩ _yY,{g}}$ #<Ogg|G<ȷnMbh02d8OWyRՆ-CT^O>+ГJeIEP?o1l_<Lgր��@�dǢk犗/?{,z% _5_qʗ~gʣ~|bs߿LC׽|z9k^~y˿_EwGы~>y'#G~ÀٟD_Oh֝Gğ*Nj#5?% yG"gVW>Pˊ,<}'-Wq<^]_?<g징y{yD/‚K1֣ �o]~5\,-^bQ[K,J׾/z+?ds1Bxg)#>e/ۘ׿|/= ],%/yr�B˷|2fUFK# <_k׿|۾k?}+W<&8YK4 gz%yyM N\-BM+>s:Oms/Vl.GE{TEa] ���.`y>,/QОc۴Ģt 3__O*x3||XgiηЋh^r#4ñ<k_<YxldQ!W_gSWw/FtaS<?׺[ߍ?`ktb?uu}?5rs^=PqΎQH-O<c^kh?+Y=L±X -REݏ?Α({xOK.:qTE]mC��@`8=yϏ}zvyֻ79=/j^O-O듟{/{_YL+Og{/[5_<}o|͇];t.##_'o|+lu/~xG̥׿{,=t-Z {:}yevW/H>?U=W+UR>�}?XKxjwYx;EϝA35yzX ^ JϬѳu]s>Df-Qu RȅYMmF��@` ;oe׾$Yyyכ\,~K,򄬙/<#dv]ny%\,{h3 MSkE+/7l %x'bN?_{'?Ya+ࢧNٿy#7;|9znW\zWG>sZTߑzx1>:e<A"[+(JK]jL"?Bם/<f ��E~~߰8Q]\&.6˫{/':hZ^9ZbЯW}]>U,O} -Z^W\^L܍jhOcOZ 7򇸊}Os>C^}Ҙe<3 /Y$g?8%˚w~o><|?-Gϭ̊U:+.~>y|H2OX(5Fh?]x< 8x~ 4]ɫ*sY-:�@��3|W~Ǣ2[&.6˫7wW|kC=啿'8_E<_޵&ޙZl.=̏0 Ogǝb~K~cyrݓB^W/Oj?X _p'|oz^//~K}j޺{~sBOP\<[s^zwί.h?Uqŧ/(=@!B{0/~^܅~Y Ry=xɲT^Ve}.[Ȳ..V6^@�� x/XwK,Jm_eoO# /9=xW@Sws:wX4=0O5WLzsԫ~{-#_<o}8_e/wO>g>,FӘe/x:y|7f{Ċb*?`( %Uѣᏻ;_/USX~mY?3O2]!9q+~٧=? g'OE]GAٛtx� �o_z~]obso}w{x,??_Bby^y:~'|ϟjgXs9"W-d4B/zq"׬b=_,WUoyKy1< G.t(n� �N?o WVjv%?W̠ǟ],68w?]i>w󝀦9WM^^? C0>ok_;7~9gy喫Fy;@�� �}{bs7//o~ݓ|wo}ꛟ>_^?h=Yl.cof~;Gw =;x$kb-C8X� �wbsj_ucŲ|>MLC  ���@��Ak͟_?Xl.W wX+^~rf<\,{Q?ľSx� ���@�� #C<��@�� ��od~�@�� ���@ F#V [8^<��@�� �-#Ew?oE? ���@�� p,zZC?x� ���@��D`~ ���@�� p,zZC_{� ���@�&_wO>ɇկO~7$}|I?2!˛-p#;LZV~_ׇv7$Mu+ʆ=q{ OZ0|tU܅ˇ?k-Q H;mDc.�@ ,zZC7~[ԓGj{>̱Oxic^!O7d.#O>1LCưʤ`PIz<SWϏ|eDkPMf6C|YLYBpoS +LP��Xp_wo_QO>__J~'r=y>E!FO`=_+}gO_=?sH4d-BMfO%D;'>>q^1qc`t1X�@�nпoo-^=roxO|}p?-F^0]nj}/7Ww^3(ZۥA>EcYa s~gpWP(<5>OK&H*wvh`Qr}>ӝ^5tz]<Nӽg<E阻@>JIՊŲyT{U7"qwxa/)#WZ5>u7`mU,K[;Hq&ev&gU4#.@�� P@_~ۯ7|חWzŋ<։_'ɯk>Zy`\s>_ܯ/>݅Nޭk=yN|ËK O^Lg<YhO~gP/ F~W:̈U�wK<P�Ϫbnuyrg" u2W5fU3'/ jTYecmGUj'$Y"|{=i/!|OOUڀջ쁩hGڇukd5H ��F`п#?>㵏_Ekַ1/zoۖ'}?}naU02E-xlY~lY,W) E1go1hw^Fy9{ 끿6_K;VţpL=Ly?3jN.Y-.HޏYd]ZM-pG8^~OwJޱg'Eʤt/KnfH30� �Xp_{7~“ױ_wn|s/~{g٘_' 7Eϕ}ÇW5O|3k($pUL(؋Q]3{_vEpo^s^O&37~b 癑:68OC~坆~@,e޾{n7o+) ]hy4VLe5Jx㨍fmt&[i>X@��j=\o7-^^_zs^e19/e"Gg {WY~g:X7|^ƫv,7¬~y/~c?04MP[8{PȍO[P$SSpr)x;pY1gMݪ;gԟ'UûONN;`"Xs&Y{q>S}ꊊsx(Ln~M9SSLv:@�� п?f=/}s?|'?Wɓ|oqS-4_O_{'??>pC;g֞:Y崟w>^m)#&J(<}3T 0'S@IyɯȺ{wÞ<c|X9/řZ<?1t?s#ſ kYCRUYUڕg!<߬7w ,2U{12aS! jqV޳)s,f,ޖgDLL@��п'=͏zL?͝<P[pf-T#b@��Eh跿7o<^<}woh19$V74l:�@�4-;?sUxӋnWܝ|˟A3XnX$a � �Nϡݿwx� ���@��D`�@�� ���@u@�� ���@~ ���@��F���@�� � 3��@�� �nEXF6\� ���@�mQB'x{^hh�@�� ��4~( ���@�� pШ ���@�� hhT�@�� ��C�/@�� ��� 7"~hT �@�� ��XTɏ~՛~?Q1@�� ���@AC?Ш ���@�� !p5?oWΡQM@�� ���@NC?ɏ4KXACb��@�� �N^zy��@�� �Q@�� ���@7]@�� ��"*:ѽ_h+�b@�� ��CNC?ub4�@�� �!PЯy/Ρo>/�@�� �F`QB'?:~[~?QC@�� ���@^C?ɏ4k//<<Q1@�� ���@`QūH^044 @�� ���Gu��@�� �U,tc ÿ:F� ���@��; X'K ez@Cb��@�� �H^?=hhT �@�� ��(h#Ш ���@�� bCCCD��@�� �@G~?p@�� ���*:9w44*<w<�@�� 0wN~3 >4 ?� ���@#bi_hhTI M2m ���@`U,tп]? =CCA8F  pkx@N~Տ*@C7@)h%z` ` �s!FCXTɏ4_hCE [2Dԁ@`~Ϗis~p!8E }lFwL@Cgp �Bwm8gA'~?p}Х@�xSp^9�S!<)~h=/M}SgYXTɏΡ'~?ϒ39tP2Xzq1@�̉@-!AmD`ë!bi}4R{:W3SȮ/f(^p:0�"hD8keN"48vF`QB'?m;vD4t|rorvH�}N(OFLi'e o E ,4={@CTqlH]qH �@}ZL1@�,kG:uF#"ihoVq~d`� J3ё)7ƀ(U,t# ? = ۴߄W{p OS{bD @mi:ĝZg:iH !bix44*Qn>d30Vnb %&YEDɳK⌠,XGo 46^bFf48A v*�d8}şigZ#8*: r :^[E0zAs�)ȐK='a7Uov;U,t24vhߐeڣ"^NPE1��!ihtFC{c9$^WE?p}:Wp_VYd[h*a) �.@ہf Bp]!XTɏΡӿ;{Q�kL7:c.3�s"v1E^1x&D`QB'?ow4)ʥ!Q C詊� "`f#H,soF,XG-?n%MkZCg%�2ί>DCC@H A`QB'??4tSCӣ-FO7UwhnIjh2C[.KľwN~;л% 5tL?0,$-7M�L=A~ NI7E"# ($x[EBC'a@�p\MXhHH.� ,XGG; �1'aQشt'EoS �nO.ȓI蒷jhSy7n9":yUxc g "ё4E)�7$lxN>h@NC?ɏ4{bLmz]׻#A �@@eb(zǟ1,]py�� PN~Y?57obupQdU{~oe0Yw880nEN^ ?gh)MlmZ4 ЛƁ `^syo.٤ F aN~io;='I(3+g p:8}ACq,z,N$34f exbwJ4><j@bxvyz%-` bpGNC3<]gD4t3 W�@C6/='j+Mpڞ5nE }p@[hݺpiƒ@ĔRG949=n!(hoΡ'JU\?QVEgn@J! p UwP$ #@CC@~z,XGз];E)li;e� Ard21䉹"4dwnhHAetf<G!H?Rp̓?'EGu(jz/厎'z0OD4MKhy�'@�� hѦ3mRTaipxbi p=5>e4%etiŇ4 8 @@@Fg(#OCACQ#X~{(WiZ8:S.Z3[,WN'q4pDhs"bCUzUh9x=3n$xciW0 G@h72oiˁ /�EU,t# ?gh"0 3UiQ>�A`[|0>o &rL!!bO#q}@x@`lkvC3ܫ'B4B@R XHQS#tYwQM @`EMl.Ge8WZnA sD ʦ865tO{3^P7( 'sLƏl[T l 0`<fN!G#@:5) f;M#� }?Qng'J1\! 4ɻ;ZxɵAQӵK`<�C#쁀)F"^Q@`b< c7 >70nhHen҈?L�fUww쩡=3ts%`"�4($ag'L;� S>@愶 }WF�ٽjl'k\@>!t拆l ^yS'l) Љ�4t'~ ☙ysX�-)M54_3/.8x+@CJps78^�W<#LsnX�F�xt 苧n]Oɛ3l3b mEun \D .."u[NpC~%DL@`A�epzpr"� $j]CwwUX:@C_'7 Un64 1FFFﯡ�R\p UL7�4 &R!R  �'W2DtFA�vr}HWD6FQ㻢Ż=$~/![3Cb p Ǜb7#7@^FG%g%LR8, 7}2{87g$@Γ2( Wp/G VQ A &/mwN@m:5= =P@~8;.  pac &5`&M @CsQ ]?36H:8(w0{a/ܛ mx*E\:/k}t?\h˧N&Y[$c:e%54sB�\h;o#$9hM,;kf޶1|Ij�n�[XL=kVV-k@g]2z"2VKT@@C4qp @m^q\Q\2J \6Ц5@h0`<5\ Q @ZѱgΛ AC�44j|Mt+C`1|t{Sna4PSFiݭ|,L?C 'm@j` u&FA/`,cHIVh!ف � 28mz=1gNpq*?g^>4h@]<mvy>oy|$qRj}hS#ЦWg2`E ,8;gYmû^BYuϴ鹅Kic#ЬTCV�8<p��4qW -/Uߎ&ۭQD~i#?'c#=SUw@�zD@7ʻ/6NjCg&M?L@ i_oűwk81NWΈ�4vzN./iY 4g$N359eB\*̖l ?jdUΫ7A_UyX- `[hhMlS|g~BA:|,=bQ1 NGMz@hjz㉪0@C:}guxH%C L Ͽ[;b?䶐n݀A Ѓ@yp,2XOD(<8oy1u =Đ)>Ed &%q\PO-&N\'qjxvG@_VЦGPl RI520k,c,Χe4L^e~kmd ݇fO-aSn-L!z׷ްt!tӁ�!� b8Ή[\CuX(0s>g)CUHiTWm֎s#WƟhS'3ЦT>̑n j,)C.Mv(pm h赐i8XF%@ LLQE = TR6{X$e4oA0�]'!SLs?m#6k:Ҕ^.*m~2X\ؓ;OѬ ]f̋W�Kc�@C*A`&;'Eч�xtSӻ~B)) #P[I}oΌd6Et‰Eփ)(X:?#^1f)V8 .LWwٱ:;͏ZF=ƕ3zĴ � }\@ Qh;My;)#4uxPUtBӱθ0T|'E1NgҙU29&Ђ{6ׂͼuRrZhW42&B9x=_!uS!1Šd,K@Cϐ@@C6D`aIIh茼<4~(+pF8꿼 ad*?_!̈́ZbD (^9֐s�ƹ>Wfs:qY6kѷ%>7LFWy[&Z^?Ju5O, JE^:Eb0?)‡"� =aRNfU,zOsN4[&$6^5z}ޯj{:v҇D  l$?:Vd$9+^�4_rI! *"6w>v`<K+¾6젞3^0E.Wص$Pr Uٛ昪Ubh%t+IN0 PD� -2ߒ~&խ&(Ju񢩿Ij훼[?- j+opSqZ}7j3i4=Ӟ<dўj3@u:O44-g԰)͵H:sLV5Gr Tcf߇ܛ5:1Œ5 6cDzAz͆Uf(h6s3C,@C%SU`+REZ-DyıcޛT�7uQ+C} bk*C|zްJ2MACo /7 � �ڣ)Uws* Y^ '^ZWߣ�V\ğ[+1̏@ەsW^G} /\ϿN!4t{jlu(Wz1!?5X&G.]Hmg[M7Gu1 "*+Ofr% l2T8q}3D�|m]eff \N%􋞟yw }K}ZU*q\w1.4m,t` аInLW|S(D-!Tfq.QI!7ss^["B dOk*J"kq@=O6 Q{]tR@܂a]~_.: SA4ғp].Y0_7i=ν1l _8&㜣myzK"� ݞV\ })X F6چue(Zɥ~6..{ۓM̽Y<kFNF5kbBCgetO{@)Ÿe{KMlaf=~H'@svO%h:@0Z3i'0CG3$DyX^5YL #� ݛ~"j4Ā\�F%{\+kJm,yLCV :ۻ0@mϼ6IU6k: RY_ h%tp|%NʦryU܈%2p|n ķbi̬+ �YI;M{?>͍CV:(2k3\'D�z #24uźJFĥ0)Όrj{H5TihQ  P57gG /ŞŸ@L"_TI*B 8c ],stj慌Xb S=LK|I T!؃֍N b9;p:>"tֆ ̘arşyL*2[ܴV:P D 5Y%X+rOCS{[E36 mQCk72ylsxL-D\= L\{=Z tma<G�zX=iJ\)b80z=% 44evz]Ņ;7 }ⷋInEۀWς< B3ChdOĔs!� =,_d붡eɉZk=M " M6WG%֊jx p+Q[.c![lRE{ɢf Nd?K~-W2b_V 7 y'(2Qm4hdA%pѿfcBL5/ Q\ 9)7UX�@~0PF $mM; , GqFIS )#� ](9{4 E6N#;H&8, +P"D[Q �@@#Q +o>̊V 7оUh!8Sw󦪢!� =2uLByATu2W=JTK-52m1є�-5O%s K,ԔN9qRp#@?\&6g@�:d#éO8(@ jũRc\zR+Mq 44ͦ:MUpЖ6*6fv XzpuiZ&߈c!@Cf*"� ]jؔoG$mi�VE+Fr Ϛ{\?^!ZonEL,GlU`\Q`] _4CxMp4gpX:sɑ17�4tYCJBgqZF %jjU R{ѽ\;; 4@OD;840oq;U2AeU0/k=ڨmuyJ<rc)Z=_&'ʀ e]Z4IjvM6�m a'MDh)Ks ~`ʀhL ȸ1�4kGyҰOZm&_{!'wSϙ)$27צ�@Cpj1jz^!k^V#0dR8X#s:4FiFï萨adr . hbɳ>=Ot,KE'oVdSrވE0[N5tH[~aB B.޵='$&`KӾy�]ohh[Cp7 .0˥a?|`)U3'VUŨ)NC iHf̦O�zo=/혷y 0M fSNj {59loP'J\~R-"ˤM }+jhN>3b }#E^Y 0m (cU:xE pB.`5jdogin̔B:}B+d4Dхdf ivZV \0YEd6̽U5 $h$aİhh <InSIUəQb-�La_ hQ*ĩUډD#DUDzb}4yQ(@�Ђ 2)D).9wY-&OI2t3hL fw O05#$BYs"Q(3!XKA(^_� _p9h4[f\fy+O0&ʘ.5qLn@y7'("dѮ@8<67Q>S@Ux%IZКՃq8CoNabؘkaN7rz~cP 5u[T>W |*.y o6$Z`U1XevXE 88/p*<|%y[vMiIht"pNg0@CW%;TZxAG ($/{K+f."k>Vi͕t5 :>W+>`�d$;Ԧ6ۣ<<ugP3;W;h,U#Ɇٵ'%&& elr9E3[T'4啐Pf딇`$pcO2]Ch~dP?1E!>nZ@woY���4t$4Tή78s.v33=L6uTw{T6tܛ9ۡ7@fWz{]xZ sA,T^kG]jhW#oo$LhDsaO˰as 4mߩ p[+ҿ?Ojhf 0% c 3;^�dy%hk;*9}XM&s#|G4ٚkYrd0rs:ӏL@UB9?8 к߈(t7s%h?%`f-S!P,~R6O[7"o ߄Vz9PAJ[696~'a@Cץ)ٿ/4yeh#z+gtFCke- 3CHq.6fυ@9s H"[BDMg2"cws7:(Ijh8n[hj4Wm4k3@-EcS@q n;#a #PBd~)G\MC'96!4tu NIM>:d:vC AHR@D\ h; nX25'S(Xk5`B!Cނjxhg6RfLsϡ# y.o].ycX{ 5!%MIdy#u 2p~7)#1-h\1Q]\9c5`-S`[f!FRrg]Ti-A�%|]?O Uf.Jj>_? 5֠C B`֗ D}m:w Ex^d,m�4tKydvԄ%̙ pSu~+f Y- }K@@YМ _;q_ ~CH54XKc- hƬw>_#f[ Gq/lyyA[- @`KڶIw%\Ϙ|e?L,ʓ33z[l�4t#MnӴZ& ĔΤE"}c r7[Zjnm5 gRCpş_D-$l\o,7�4tc3,nӴ44JuBF'5AS]`8�mBш-Qy:xYn4zئ'c`n̲79qmLs p:>bڬhzmc>I)M1 ,v.jhKۤE0ۊ5F̌�4tcvrT'ZGܞz؍zOƥ1^֦fC\rmC&ѧ QQ+ww81zm1nOwQFi}m̴ pkӟi=噷" X=w ͬMJ6 Ѐ@6Z_XOs5VƚvU9+Ɛ PrIZ\k`f S /ޖs4(KTA{ЫhR=<s˦2\OS<DX{C=sc@CgR�۲!7h/ѓt-GJ&r(�S|MĝrD@PA1FSǷsnJjM�ze&~po@6-g>O9 -fGZ>LMkNƶl6/3wussbP.BE E/ez^Ф)9opOWB-6\ۊ,9->o1sУDjQFLlxrf>Bꁫt ClBCF&A #2 #5Җ+gϚх".K@L2EwORpc#nWCWh_¥ag=mƋ#ōhv8$E@Ї2d6f~L 4qb0+4tٸu^p`nQCzL&JޡJεD-XZ=^@m<V99bselNNr~ E:AC/ފYB.k%s$fs ײkmb~剆et@`!L9*6cH;ISDA;jjML?YsKыI%G}E* MY(.BMzREG!p[z�[!8kMRæ"?WF4�>rw,0!3(a)4'Zb)@z"I0^7B_8kܦxS+ih~ќ"E5PKV4>(NfL~O'b�@ a khhNyТIu|mBzvw:W: |!}1@9R7FsGo5kUJ>YsǨ=k D\mEK[S5u)@$EYQ,MKhhS 5tzy,sݗ�1C5߻(jhz$Bk2"Z%^SMZ8E$0 03\;({vB"sKoU-'bw͔i?/_^_%צ(/[۬Y 87W-kn*Is[?QVi干'@zQ[#CHX8#d'l!M!8Bы;4D?|-stS 7F]DA>MpLjf0QtaIfx+}wp^x8;`%.Y\hn$ZF i+tpVuZ3[:Qh_7jwLS4  mihږq#WE):fs3c3u27Y<ݿT]($ZY4M3)zϧMi9l K.-jh n 3z:uS=Ůn@Ohkf&mB SD@(XXq-OSri+h8Ѽ-n-Sz+&չq"  q%b@C?MPb=HhBLh<3b m>IfUKc7`m!߳Zqf f'ZimSa#DkCvd>rImra@'Y M@k1s7Q7tVӅ\[em:[DΑ_:9Rd$9 À*DUWfF,)r){0hB'ݭaVH#_0~ bZLCy1[wX>={\KL>u声tW6wr52?_\h!{"}|$PKbUq"� ݮy:i;",s 9缆sMf.O4tB0x$3jNZFoA)ԤmMP**)5› &Ƶy -.b\ |Yz|;\Z)5Aij4Q+i͏"ԞD?9FxLYSXM!vFe>նZmbM6s_!WB8!Ѓ5&.J @CǛG]~3f>j{9ⅆ Un? \wjS#2o}fEu6/�trPD6A 8jh}j޴فmZ`C_@$ 6 >qYԛg #pU'A ==6Mm˘|jIƗ NU:`~Mj8v.Rdͦ+^Ԕm{G/;|+!1 gvj='|*m`u!=l2aCPCC*PF8u{Hsp :S5Vާydp3;$fs PsyDZ8uM9rW'4o77{`$jhs{:&)4UJ<2{8)36 gSF 9ujJz@rӠwjx0xRei+z@üY+8 뼘77Ӱ3o!{bl)$ށVucTߒCZZ7" 6!لk#p} ]{ۃ{jz{kы4\fn9Αݘ+56*o1ͨaES+M<nrk&1OeH1\YC]m7k*J*hs+lϢ�Hz5<$\< (yBeO'= `m"7Gg@FQ(;:_ #/\ +tUm\P{f bOSy9vJ_KdwItJwa FYtݨctXAC } W tg@Ԫgɼּ/9L$_b[qeYgxZ3[޺ÓZg?dwK|1L )QȐM:Hp>hퟴ@C9Jҁɉ\% 푩#>ȼJԂEqл$7Ԧ!Bt_ٹπ,5r┢|U|'ߤ8jz FNe5tLSYlگ|$5)5\ 0ͦ)[8g1yL__܉{v@d`zUנ=%`'bӃ51:]9s&5SGU6#k/MnoJC{C\кak L?_;7 ƏB@l(چfWGyu;;K&7kCt;o(ūYn@kkF="'UMLq,;IsU~3L zj! \]W= sot.9׌cѳ 4H4 ƓN2Vnj]FPŰO ݦm:Fou'^<-ܕ[R=sc�őQqhU]ZK߬r9>S&- d4l3b(Q:~+"2pUH iUDۡjc4YgnFC7eQ*gbo"{JP)&kDSs6i=UI07)Msl>ԵyԖAݕ'_(‹\SCkɑlBQ|&sFO4<g'ʼM#(q7fMUDI$SFrH<[ 1Lfg FnirB>;l%f%D wݮX6NaFj_:8\徍SY6m<KȀ& IL4t8k'͋a.\avx UpJ @83'I0 \PCg~6v8Ko6(w 0S\j\RLrסyvLR6[~O./Ĵ[W{pk `^5BQhO O.gf 8F^KihIϯTu[h%C(3e3'!$ȦJ1`dM&ZU5fI'3&\2 `ئb{S_LnҞ3=ӟ]0%`x9u?ˇEv54١m"49Q4Jjh\{KK՚[KU9+BdUf62[\n N ]Exp˵\WM[nh*184)n 2?3F/6<A1`2'F!SWׂk\+ =-4'u \M (!뽲Cs|sYF.w*.oDC{7 {v|V=m~,R l#/5tGJsFmU͢SB6$@2^h,uD -w1 tO b0/Ma$yIy<j29y6\$54f<LjgGj5y .@Q4>65lj`-g3eef#MLHx[o[.w~l(=d8B͹T.8aby"pZD@:E1O[mE3RO'׻t*�j}DcmnYYsxȱV0:+z}nB0rkr2KK&W˃D 9-r~6A14UĞd %>&6ЋŧWJ%z=Mפ-kRD|Og";{i{k8(ԌmEu&Ŷ%0+]&W`UD&;U?q`^<jἝ9.(X%f0 '^T(֟lDİ*Y�R=S ʏVr\e!D{mWi3r<G%'ܝ'<Ѡ{3[Ny SIڡԥ4t)=h*jjoŊ*gU^B&XKD?֫䫻;)! *D0x)UvO9tлQVuCY�/�OM@E;<8Ļ:xmr4ë<Sx{=> (2MP+B3FM\G%ɷX yV25@@ .QOaSqŷCqWn65x` H'(80yUnkbo}]p�j \JC)sl@3%}3%i>kڣibUOCDDgݢis .O\:R6p#E Y斧C2Zol@n \%jүJλ!\PC'/1r&(@Q1b]ʟ*+i}мPO-Eh <DX(yOHsumqLzJGYy=H`yy-s*(IJCmpSnih�]|uz.Sv|]ΌSSD>?d;Hϋ"Z(0|]lK怶0O]pZPoyrbe4kLGG[#;%hKD, pM k^Fg44 5-_]A ]%49zmUHYKVF[7YjSR HG}Z[ݧ[ 0Tt!,W+4\1*i"Z|oMV[њ9m-ܺ-L:&ujm1u1 tV(f7܈ ] p&E+LyִNYc@f}Tq: \<X^ ĥsMAU#HHUa0A�=ĵV(j�Hnؤ'3mSrfl{_$c> uaV(?Eg:"7.cYQl=1/3`p�DçmpFf =ϟtt~ O+wiW3GfӥH1/gXyNyŢE ΔА sW0rF֒6OFzݶC$ͼ&&+(A.)C=7b<^lK%fhG5hm*t>f}u&b3֔/݆͆T.w)nQfK#DPCMdD#lxϱlm. Csw#V~34'C<V̅&GX"^&8P`+qVhh?Z6PQI%D9gyUyŻ<E)XN5)@`B:cj;<1:䪕b';)ьĸ.uN#4i ކA@Bh ڎo1�4FUjh=Vobb1wJ8>Ej8MLmF[h1؛[4藙<"CFb }CzHI.?\X|p/ZQ[y iqrIu=e½1Sy?: \rEhh;uPf"Tmjhًt_AG0LàܥS} \z-k ~ 1ĭ|{ȘJu5%{ͱ͋@/K2V3@Ci2岦L3.mmd<|@IsqΦHS "nCC,̻)Ÿ{^1.񷆀95Vpa89\Gz%Lfc^0ŋ[ۏ h7N 5wLЬ.ݘyEe:z|ݍ晍d0V̓8y2X Of+̵ WHm^m:0,P+N\+l^h9<M^lMu ɥ&/�4t!D&tz2yM&*^4{S-X9&;̭�R"UzWXxkbm ]�Fĥ,@+T-╘vbuj`}74/d;arjS4PLіE-v>qzqu[m9q86?#VZ{R70S1~:h! cR-Fia' `�>U8#HCK|`={ fPi͆�4t6#dy$Py韌Kn{_2P?Y=7 S@@! i9](\-E1I+dOWz[ k|  \`W > (vgჅ � ]oEN噉Lzkz>[!%XswZ �Cb\0g.2)<'K74t2DE:NZ]\a&ӄJoRozЂoW1UXD@Cey"$W2z%,a:ݢ3<Ȍ RwV >oZ]-5'vX�]WGo5ĻNZA;"^N/0h<iY.sM1�z+ShShhAt<h(zki$D'ףi.xO&IӟIfYۻG9"\[g=Vg#BA@o3)oLqMK,!t T}T4 K"2&ˉL{A:u: 5.V0xQŅq9Fq-]!gA Z{xj?P䎆<PFC@[#@[lbnX}Hi3? 8|w5%NɯgL{6 L+M ܨ8u˱ j;<褒=w,~HrMچ=(gBS#Y]_Ri\p8>ZjnЂLļho z4x\\lhټxJ%<.돷x1ʤm`cB qL̓jŷ7oJ:|BmY_rm߁,ݰ_l U4 &N )--Řu\AC{Eۉee+z:löEs%-s>|�h<%e%8R/|ΟEF4K4,NmTzK9bDA5f6O,/�:{ :/kh1敷Ђ ;N?I0!.;m4ǢIrƘ:?_ {ڬ׹ws� M\6eH(h`5ۘҐJ6A ͇&\ACELX@K*$^̌1hfcj6;Ek^$[c'jM0"DezҿFѝbǙW(l?G ^/.i"l<dX"p ͷw( ͢PɈôq&5|ٹ0Y yA7_@(\FM\ Ρ>15wr/A#c*.fD`Q Ђ2H/WNAȏE*}ޱ#=.4/h`;&WtX` n|/Ǝ7@Ђ tDbߙdnJ3g-SEoh p) ]XTVqS)iPMB)n*b]f3Qi#. && pf#y254bA&1y!J:4 ̒o-<W Fv5tQ@s4 &̟7j[ hpQ@9P ~4`FQ - n�ߧb1Ϻx,D|EjcO N eJCsB޺r`BnTC d$`2jO+I>5 (Va4AZ 酵fv 5I[˴qlSXw�E6?J4dLŗ@4`H`pnQC'WqtI&wJ<#աfN;'2Qt&-)q-[ǘΌƋc- Qzpen|5{7JF92}M6•l%L aH p8 ,%I7yQy^ !9Rw0 h{@߆Xlb@[E 4Ȼ@Ik *q^|yάL.7MaCwџ5 ]rk ȮSk`SaE4tLEMnrZ1āb6?Npѫ }Ǥ:f̮2nB!4Gu.lgYX�TQ}}N1ewLW&5[gͣ)B激qP'@y96 3&0 0-ePLKO)hSrMi& jƧ'vN➝$m\Dze,•vy)[qn4w)9MV&us4t ,б6 dxX΅MhX@hMFYynD[oR7C<*M NOF a $'kΤ^mz$гqj2-BŮo[PjKC=kf:c{E1�5tn>WܚCE-p0ʢ x(U}sOz=̺z7ҙTg$uO(-UzcD5yN"j>r2Z?QД5( M Љ5t,wLAYAIҶtgnM q#2C)+ݺj͑mt4M mKĎNGASRI2Q=uB 4t[WҢ9<)A!)C:/K[$˥G~GP歙cFD{at+)Nlsn!.V͗eƂ9&315 ť7h&YYR2jex <,g`1kޒy0 PE4``3{o%i MsZHG*^i{ <ھFXU>?3@0r~ iM/_E끑ȧVCױ}EDj6!="pz 92Ev>6U Wx]V;ڢ+|-d4oio 6^zDF&$uk؃Z.AM;U7'Pn:w#fϗ3D*yH 5WЙ:O}1V&tY׊'egB(X@`ͫ5tR>rʥ-/=yK֭̋LZD2 "pn 0Kpu|kS_d9xH Ab`rpqC D?(.s=ej_=Ż]Sf5ց_MÄ 'Ё+=f:3+ 0U7[1E?=)5np\GvĮॆ`md2qM\[1sZ \ $loD 0 skABaԦ5ۨ vDr[@\:k0I<(32V(i=1, pI*$cg Ǻ[0$N 58wM40uDy^5NAQc+hhR3|sz_BVQ@5OxSW-@"á5X!j*cP�Q&F-&mch@F*;kӚ{<wtZJ:k@3%/iN:[ ;TCR054iӂQ ŗp-npam /yEi`E- `TeWv@@+jLNU y z"e3pGC ׍@_�AB3˘6EZy'jq?x<w&2ZphU; nv/N$w6u@ @ bSYCE9s%zXW+5к,G3gCI`ʭ!pV moX3cj`7B=zq R 4rzLk:X*Т+fh3CJZ8&X.6"{dde)M8k<UjTfa�5tjh~Hz8_:P+s( h׵E&3`88 7n"z'8]\>  \aDhU~) <%zb]|EL7Jn;ȩ8nSyhːVmv,S%vESS Nn:3k(\q 4FZ 5zdiEڑ: 2.HUiQSCwMniRC A Pޢ{@[" ˴+Ny{k.-&�赺6@-ū;R hҝI2\ߚ _ N]>FX0O}A_�ϓ cSj#H&3z nSe6;-^[x[`S4 "*4̭'' Mjh2Hjo{'H3cs k@` 'Фf` -50Ԟd:Qaܢ yO6N11{#55_]JO"xX;EkhܴLC:0Y5t^wn!FppLT=~p iދm8Ԧrv�! ȇ+-Pj> J7>a5ٞOkYZhVGZX$M 0 sk" 3}tG4.M*/c3~O"9du, Y@et\&Y$[2܆p%I1 8Dg\YCϩEТ1VҼ@·|*giM�RbqjY h$#&R]4kuzw�Ir֙L 0e5Ί ̘ᥰ.ʥs|wBa?96;gɝgrpjY:\ {hZ1lSSx7{̵v&9À\SC))rR$KzB8˯#Y�{fg-`҃�Qvh~PEb]ShX|g 'D"\4@(.w ZㄣRNt7K8S%9zFe4v}\t! ^]y{u e(dMaS v^ ~&%@Cw%Ehߴ2=bh%5Wɮ3"$nlf}`R<6XܦYM:h^37h;@7/!,fCjzg (A{&U@@ .1v#ZT `Cbb]Of]&iY_?y>ՈU@-B 绵>^;I(AWy|ij,hw`x,C`hUǯ+{u_"5Kpl<ʲ#̿'}5NY5!;5̩TF@tLcH@d\L�XO)]cQKҪu0W9,k ]e  Dz9$S4sm=ϹW@&1r7LUꙣh8;HG*M1_xc;Zg&8AFe{?Ń#U>qwNlIqL Ff4?"řȄ(@`#ہN0SǼ]K@CCCOB@HIϳzn2N!ʃo m .y)}U3ORhc SjM2([:.9S:P8˜= (@58u[R+`:L{E�_Հ:X\XC+pB(O6Z/'hAChE7}Y3RD`B ݶM>wC4%2뀟v<ߙeLF_O6 *֎i'{U2}xv:+W:A)E/) 75 d9}vb4\N m'>tvykm:}>]8p52/cf'#@CovoPDF'+ABC؍3P)ZKnPNpeq˿M(s2%)M=կ-m!� ݛoL=f„lPC ڥy888Tm <!KPlN(j}tos* hć[63>6ϛ9śY\]>1>3Mx(nOgքQ֦6aI!"&_kWH1��4t{ [m?3B7s{A3'([y"}6o_/Xh4(8 H'9u6Wul9hF`mcFi&?bs/Ϡq8'srƑ9&'Y�<FjE_{,d E׆@@C7(+ Dq'w`%ټ9Fؼ&8>te й/j1uz}RעYڃ*A�=yd*{_ .ɿW.-8>9{"\IU|Yj<܍Qīqs z9 C{u?m K58�B�=&yFu]NEqL7»=Nlz%@--ѻ�@D_^vkodZu) qfaShvvYe pv{3ȻBc);PB '9L7<N<]Om�ۤ!Q<`͙pTbyWEak=?m"j7�4d+5E4Iac[<NBoZr2Qn@ $n*6p;P�Ѵ"'L}T[MZ<8�8 h-y w'*A{: Gn!xoE_i Գv(GooIȯ"Gy=#GScHBx./<)չvSW{@CowG1x,46'tpigघJ>9U<8#<Lז NHe37$vFjtN%:m+y*뉸OJK@j wfD嵱6XZ_٣L)cShl cGo=MK<@m˕QS;S@ӽ[5Dj } 8etU`UJ)uQ۟%W|KRł{Ў]:)3n�+]eA01ZW@$>im0hJ&1 d�Lg̃ zѓΫ3A-Y OX �.yc@ŕw]7S|k*؂Lox45wqzlNGjpL21@ @p7HhM}f\ {*\R-$c,'c65%ambGr-@Ld>F ~'OmaEEVI7rW{Z@tTa@ F�26 7NBzy99J".DKN@d"Ԙ:ZCo-NTQ/*Pmv|S3X}820l_�C-=hH-~n}P^pB@Ch tWmsY@#%-Hr~~l~Ǯ^ţz\]LXaq5bH q^7B&FG!0~@5iױN5Gu39zjKpE#fDSRocӴft(N*h;L ]aJyGcB1 à>uI7`3eS|z\ EQiʠ`DM6%˺P60] 44ճh*'4 ڻ5.NQNO=ݺͻ;n;SLy1� pjKF2ڣlt3N}UUDsyMjы R,j5X- x_[1-pRi bq)B,1R;cx({ 7% }d}j5MMmeNQ&&L5Фl X7et1*N4xrjFғk%ĿaWDwz$ң*PELxasJKnk9=bj%>V; WN\L=Dtwk eiJkh}ܡ3KWśE??= YW1SXҤwP. ]]ri*Ί) DA-:_k$^7 Ǔ$wOG3{ūs^Qt%dw0tOgPsye._ܭ3`7gH<̿} yPk( bE!iы]@7t_jYo쏇OU9g|&x[,"x=7n_c@5oФ8-TNN5B ]Sy_$.n(@1h1-SYSgUZqטZ_#+SXtI 5V6* ]!:U!T8kj居JLR` 5S3ȱcszd$XZ2ΓhuV$R6 ~Hv=b~=+�h~ۭ2Y|ِw&F^,@s:)_.rSwHr0ګt)w dhʺ9$a#p.$+߫YjetC#ъSH?LMgb-XB ӀՐk,|$Poo<`s{OwpTqԜUNJB,e ]]6+{qS}Exz-%Is�<]殒 )3ERPeś8Njd[fN$i~/lj@Sm ցBD5 XHmj%F}SZ2u1@m|}X 4^hÛnU%t>q,&fJJӽ9D_nut3yF~8 +'Ihޒ( Aڼ{Rec&*"zZIGzDV nq{>D{'#3z.LiK+*} ;v[:^πt{)(-L:Fh'ͤ6UA()"bFx.wGѫI:sQҚ~U,ْ %+"&VڦöOQmst -wDgϽ'/TY3_fo^BPvaZW=߂b Q0 ՠ'1cx3˓w.7HC=eYiF . i4/6 QY]6M(=o,2YZӈ58O.g= `k!ss736ȸIRiH.ZS%,$E ~"{0҆@PEh[4t#bN. <?w$c6Ldp! /OmfaEDy0O#` p@A{bn314t+9rE E6O:Ohh 6d<Kʫy)*$:bJ1<MڹjqEd0Πۘ[Iv3)u {yZ٫ucj�/`O"׹ KНX*{F6v9]Y" ϘFvFe4{TlTrOai(Q+?WAx,zwepKH^r/4Ԧ ~;w|XơP 5&ʒ6 %L\A]ggd̞ ݀dbF_RΡ@m2,\&noԻ0(^0&c/JXaI -C,ы!C7mZ\ek̜B@bȬxzKhn9{as[k$P$Ȩmff8P,ZQkLt,@ $;|7ߓ.n㭑j[`QvnlpJihM9S=N; $"z-Sb_<tWyʯtz%@]u3/̶3fԡ+.˔4-vHe ],utF)>WuOZе=oœuG7E$WލtgB4Dff%'SHEDQuvu1! >bMMUc;hw6f1e'9!OurcǒcׂTyEu#kh齲[ h -3TpG^:*C�N\MrNl=sOr J뱱dRNIKz,zc,_Y@UQZ@/CCWL&[؜h BȚD\+XbdM'Ir?c祯NvP̦)4ti 5#i8 J>*^ɝuԑE;M\{\C 鐉j17olphz+1YF@%]o͏s( =bw^4=p4Ρ+ Sz"Skޭp:*"uQp'F1EhU-\G$tE*N&e[c߫uľkIO&_\K`񲁘6?<p;zҁN9tg&d=~\CW8W9TĢoq>+OR^Ykw>*,MZ4Z=w iS(.AAyZ]^=Go[ʝnPg5nA!h֖Mւ@zDEa]( n`"( fɱKb #A~Xn;NHD?+S+t`eSsxzmeZ;kbֻlkyrbwBCW'musdqP.()[к2Z["#BYT^ֵ\7OY5H_=x.ng]gxkyJtl}eWw`G0FU ԛk mנ\q4”;/:6]ThXk"VBoXh)qrǢBt;EeRߺhu6!kY<}HOk3RgS'}ӛMɾvhƄ2iJKW>4t# _@ka5xuDo9nBhC缀&IM?bC6S$&L2VC2!^n|$ w#(ۆWڞS7h&hE}7 Fl1^4]l$!IBC)L9]7zxlS'5g!Ş1À8$3}ȢI] &%G̕DZSk�WT#竆:)E>\[%p쉸^⓸,lJ]BCWYbrI kxmyltqO6酩Q{ZgOA#]& kxD`_zb4d}G {E[gGGeʗc54u(S@wI&1im7$ ݋Yo-DOUJf �f~~z͸L,vqflv\ z<,-ܣznL%%ʑw Lo1q)% c`pjjh][2FO ^ B 4tou󵂻c.82?OQY;c"b4B2ÐU6r(z>īNWs**j4(ԕ*y F͞E[US>}3`%X)E\lnp6$9JVif4t%wLPɭ.+9+ﴦ`nn~4^p_Bgjˇ<j\r,o!FbZG\cf)4JQ{^>$I,R%Mx"-\UԉOiX3od\|i$('S}PY´ ]qр`g"#}SKF|K ?vB0!EM@C44CO4S5AzH#OfÄ^ikW*{aih.Toq EEեWE@(y("8z�s{ӳ|o=(n!./Xxnh+ F!MWu71tϘi 1'Rҷ،Qѥ+q1Q߱@7-�=/j';lIfX?=!ŏz8,Zd*Sн&,B5?K.=5f$nIƦ9x;"1ns4X;R�!ԽXc5OdX%gBb&q^caםHV~=uY<ƞmF<l⼳[rkj%E__iq4Kp2f5U"!K~l^t#.37[I\׌y5Xu##ۊze|l9u-mR+z\ċ;7hGs mU!C%ڶP4Zi3_&)=ͅSUV8;P=mZX,hnlh.]nVe!?xԺ{R5rUn:twyn*Gs&94[6|W ZpknUtWA,Da%RJO1Svyl ] !D ŻK�)hEcUAWޔ4C|3TT`TmuKYM]l̏bnXAaHK웢mqa&d { Tav!{�ZU K4ii2}ЅSojh" /!P>x2;mb A/gAt0o9Rl.Kt݌ <5kfHRmLACW ߿F%ahRnPu fΘ|6w6NjN it>f+i 'Z4Yo;n~|Eť P'mqI >֠E.)9 Z,K(b,c- s`Nk4}{COAmXkǣ5qN<ŀ& #MzAgn18nc{k7I}*w>#^ZI,n _l-μ6ϝ*59s ]Lycpܟk̾)vPWz8rsMϫ/f/.<`oM5?CMjܹ#4H:0HS^-wp#X4|e>xp]kxZ W(pIqusE=*:9�]~I'{5Ĺi ;_i|FжY4SQI&Z)VJת4'QQ^gz-hq)*ŏ9f7G`~;qkĞd>{iY;Lny$v[,!ajiGW1S jv|g=4-& ɨ_SLNXΫs/:ӎFKEMx5&MϗPf=SF6NO,s;LM@usH5dfK1RBL) 3o w U54oüMz-x!'z"3嶜?Nj_J%%SIaˤQ#˂6RYL f #|xNsܚoFWȄ45|(F` 4tB]qi77|ɠֵbv[%0l�9ncN̎j[8\eSC8?T Uu iU\K&fDzH+!tP<SF r,Sn"Bsl9`V `sԔQ3*Z;еU'uΤ9K RGyEO)_uJZ'x[d(6 p³<SED R&qWԭ\qkyLjzYKK ~rPU<sIZ`N-V<Ky4Olvjr{`hxJkk};5F|1atto+Ţ;ݔ7NA5鸣cs`=4p9MQYe,D*U`[U؁}�hu-nSԳMzPCbd`%E^s]o&6zg$,kƨ]~b*{G^gSC|qg*Mw<M#Xj"mYۇ_%ƴK͂Rszlsg^K膢4Vȶ,w.^GBC ߷hR9bSQ21ڷM*aTw y'q!ZD>.ֺ i)fG'�̷L$?3�hq (gp}-ӃVm>03;, =;JC-4QO|jɐZX#;RpjWDr#Ǩqˁ.X|l ‡Qk{x4ț‰p6 ث!IEjJPKb`rm7*v!)??߽~ yoǎOi7xs:L-ͼq,yh/?4]@%ʩ{E6xn@+Nӝk;=Is1Lv5? d4AqNj̀/xһjxoI]EшI&cy&wc,' =,|cjچylP8'n/I~\}. 񬧳Y-}8-A׽0@;V؁VoWE%":{lUqS8r='>q &v[=T&A5O@{t ; 6msygK;� õ LarYnd,naC3o]3GSe͈RÆh>Z>*' ]Dm�~_V<Z9滁iL톬q2{MXhOF]i##{<[tl >�1OdhU}\D (f> i$=qAU-^+ҦH3LlIר}0]% ʈ(i^QŎ 'ŭ/�H�&^a-d 4mw~ AC"mu+j]o"z|dZq zb(MxClo~Mf*G?M*m?\ӫYBq&"9"vӱ ?Ps9-$N1}ԵbrV!xQ{oi0끨-Xnvybƫ@C @l%3EGD6yc2OS꺜"Z<!5*J_/]<t#t 503 dwU#ʘE(=.zoUh?/]#j^ >ifx3m=˧$5|ڲ)z<Dn\L!%xb}{^B_&jbYWn^"U\o[RfU+bp'kRLe22"CR-A]ɗ֌* "-U`kdn 5;afW;'BCwx7=&5Gר3J'ɇ"5Ys\8qm l=3W79ıϽ9jOG9aWQh~n9wF(#'s#h^ ʛfߞ-P ^s֞k5Y = IJ(&q~Zg@bz)nք7Ztf6T.8t*RZm1u@]y7$]HԶyJqA9Ó$paUC}=8duyc|d[k>Eh&4t[mƛYC{D\=a^">_>VB&n4t)&A~N6cy'ح@;h'F0`g<n 6)!nkDۄ VNQ&,^]I{]ӱ^by#"D:"xW40=sA$^rtO̧DIpbT5 b@`mh3=֎WH\?=/@ySC X$'_=ͱz-<jWf[i+rZ=5yXF40[xӚ' =xKi "9 &V-knFK:/^ce6;M>s (覢;r%%AoTm~C@|QSkB.ѬÆI%7C`}%51 .A(QI,0+CCgZHr#(:E>QK5s4{-n|QTJECJ$MŖ(<F@RAEMh-ۍ?D"bVa^{sk<d^pխUzǣL;qH`ICjoی@C&g|1fͬ5TS S&P"#XbIB+vu^{*Υg! "ШBxQiE{8skTlfdL{fSA\gt Ԯ;P?|*`-"T\= iRtoԀ5s\hQbt:BAb:cD)X=\lEU1E6Fqw.wtu~(<4'=6/9W 4SPhNbJnEm b$tZJgĽ(nyW U3dQ[q@CWOQy4;WrfWwH /@܈aIfq3;w|'9a2A^qfL.qa[Y=sO xѻ4*7fc[xs=Փ0rS[hh/{;_AC)qtqh!DAf=O_!+AZZ[/4xoNPb$Zrͼ_ƗpͧG9<ZFybs50�o-qӗm=ܺ:`{OMgnh+44=[il[T>z0=|7ؕns*N eElKch!a^w sN  1{&*^tpmئmOu ~<b#),"A�~,%5g5azQosN,I}- Ω.igj̃7݌CS#^9:O0T.o* Yn'O4iN㢼bM~LUܦY j>ٮskQhÓm7`G>?M3a[U 34 ܥ]~7�[``hN�M?c5{ԜEkM$5s yd}E"sT6lj*Cгzkəܭs{j\6jAɬZ;Tx8 e|/}rb^ӊm9gn.k3Lϥ Zf?킂퉺I78"t-J85xwbaj"7J<K}Y@ kʡ"`FdV_04oH+ҞZhJ-lvRP"Dm-d\wa3G = NԽ/`+ ] m1<Slû0-ap)bd%`hV bN뢅]d�<ı-:Ca0Äpl'?1h[ANMZH h-Kteaihm?Fr(g 6GM#;Ùw%L=LϷA̤\y*<`@ig8(V<3sHM\]f \r}̂~ۼfeF5 cyKw�g.3s݂N b>~fG352 :3&;ίiC޿X1MI 3'u<7)1wo} C"$hYȫgZT0^/!q#&xՌUxEN|Eb) 13tt8f*?U/922[tгed?zshpl@ZBW<WKmȚxx1*z~lf�Toӎ)j͊Ad-){*\SLυG$x�1t'XEk22cbv.3#>nKt`v<2-3p!+t4 GIZި,]j6F;}<BkGZ(NO?i9񵁀-E!rOJiOwZ FCCoitcf78o d!&k}͋Up`676Gngw`}Tn .A_Aۮ-ѼӋ6řYpl'N1CCtnhm65Y}L3^i6xމEf>64hc?ĀZ$(Rr󊜏;]}xxsy?\h;<Uyt dגVйOv%<gs b63=3);I9/VA}b3K]zp-k$*Λ5wk.0PƂ&D e 5gͰ+eQ٦z) WV訯2; mᵼelS3V:MO<죶x.y 93kʯ (MU1mÉ;- [E7}6=^'x G|Nn&-|6 F1~Q{W}Z{n܆tPT ^a@�&e<V^$x;)ȷjns+FhD\fo'+/C(= Ú;|%z O^H[MhԔ qT{p'{ z3K` l򒖡⒵V$EM UACT [\Pw_MІZoS[uCBȦ9@hf.;1 Y-ÔAD -V-H}mY VL唗^$JfxnS_` -Y:S$<ޮ{L M1td~V0ZֹPj! Ll f@C0!@,_í3[: v2:&)j;P�oѓ-0Naf̘b/-;�]TZwjŦ؂^Mr#k#!ASznY#m]Nmb2ﶹYU@CWu1'tjA3Û4!nY:Zj PBI"Syʤ)brAf~#_\r :UXӼn%(ZH#_T)X[W1&�4t[iRZK@ DAkhA^GN@˃* 7^3=ҚKWB.Q!:vҖN 9q5_.8՚uH"<XFk̤x6(j(ϷGR⬱Z wdt>=^/ސwkh"SOƳE:$MDO(5EL֭ b eX,x%]!y˩;JNC D<.2WӃaP7t0}kX7 ) .=a*E0Up[WbF)l#؛3n#cMW7+L\U("I_<+S+=.d\\略4Ii 0\qR =k-@CӏWk,OɈE:QVg#o)|$b_ -8YoVT L^VLڟLw M(1iTEŴEy5Ĥf>!� ݆[kz=Ih8 MoeZun {y*ʇixhGdiCaԪITM!ts> 8x.VM ![ _-{?Zyz|e!R[K"5 / ؍~sDh]TE 2SGdu n:D`?Ն�5g:kR2i(0hd>H)Xk+sSYڔZzq$P[%Zo+5\z\տz)ƔdghhOx'xm;o+>DL_ws1T1yoZ6͸Fr-/Tλ QmgOh⓼gx46 � �ZUMaݸ]MDXL7ڂBR1g3f˴}l ` D;4,:L_KpX ?,I ~lu'Qy^ (;Ӄ.@C]A{K;-bkɡY#;,QAF0Zg fmZSw'5|C ϻ7 3I|ŝB̟ W2)8 !dh5Cb!gLQtD #dthSyg"`6̓s69`>^h^Z(l,9#}2w#O<9UTT*D2!=?dô89 ԣ< -dIr=!sSZ`fʘŘ6p6K-Yo_Cb\MydSop)V3.ϔYb/n$60.(mGze6}fE ͍&仆p*huFm;56)=scM7b`|Zzqh6 lg9;\Nڽ׷y.LUlE@ hSFwHR:_$2ғ,xNҦֺN=8^qr5?6oaϑI~ӥ] zsIB%BS^ufqBߥxEޞAf,u^`B?0қ2hh}D & j.%k 44m@z:R@@Ky#dt|L4ѰF\,4I<VI o\cZ3[,CVQ.]W] os$YPM,8s~ ˻mۚѼ37 y8J_cE}05{G< 󍪮l[u hs+y\Khy 6qK&JU`K擾aX-$ۤOH>=k&549`ZS~Zu>Wx^:-N;Q~Ȁ; / }V hB44?.5LENOoJb:x30k*φV\z%^VB:L($l@ Xq3Yo}n|77�锶ԥ4 }?pW^ pao�f'l[fbo9?kL>: eA17GjigF@T;ɟr:x@;ylXkt �RY@(FWkm񓻷' } ]K%DJ, xWl+ZQ7txrUםM\Q/ubvAYJ愰\r.t梖pm=kes]͓NŅy䃠>.s<4Sc #5sjO_4箊-t3@I{ڜ.XvQ5{Y\3zKl�㌔/in<Z6?s$i^z}+fTދI~ ]j;@\J:p8 z׬mFYړD3ÛN =Db$앇d]9~a"U?qBsk/eIkf ;Fm:= KE*R? %f! &N;L_ZT56,'Xi d^'%y 1S]׳v?q^ )CQ;r.xbJ["n2ǁI^0>'3vN.62XtlkAC"8~k%]2l ǂIy]~cTN;ʥOE|Е (Z԰'{C :ӂ`vCPnD,F<[#7G(.3zT|Q7(O2wܴ2&}Eoug|BK@@BҦX;`[Dw%.#]{~ϻ# GqE>}IKN\=2@CQ!zlqk*j8 ^œN({GF[^. ώےmӓ@I'^yB+ ^-SSd>w -<'<7)46JmIܿQ};eY_N5Zo]؏EsQS|2ՓtN zT3x# uL3Ԋ{�Ȝ޹}^fخ8 菖)[,.�4N de/oָ͕̔e;�~K#QjY4 7UjՂ鰸 -&oF'hӷЦ;oͱcbh<VFWowu7>ӥbe$|p.cQn�\yq=0 eYF;1Sk@{yiPk!Q413I'YO1_8 ހob@!v:DK6;HN:)@H)+C_TLBm9ğ"nvcU&죌\ #1T\za@^gm.k,KdOs!S=Cb\yu�aXF;7Q hj |ɉܛϙXo<XYuʕvuq!>`.(WiOC;7 ->nM}(7Չ{;47 } /M+orG6c\+26vX ><<M naO+42Ufș`!vO>6;v>$ / Jb<Ɲ>u?CB5^ub޴[ B�zvb1ХǛu.IY1xЦ3k}Bew8]f})3iů[T]zZya\(+=54'ͫ"ݦhw ͆�4Ѫ|VUw,(% ;{B0pLY{@`%b ŗ&Ͱ',\({W´U==6ZCEƺ`yyLh-Plc"o>RKpNQ'4pPq7xײՓESͨz{jN܌�&E@WkB.R S KtuE). ؇cPchrmbP�4t-b#+ 9w=hN8_ˀ͍g98LyW&D ؼ ^h \|*V+K=jo|\=)YXD] c@C'9,PK[\y\I@F4n#S^54UKS!z?;/8D sa"z] h"^yRuνG7U{ nGad{<c>�2=P 1 m͙],WB>�Kk$?n4W]mћ<E`bh6lF.8kH< ]FC-)n7l A v989:X>hC`[TF؄dz0 ZDc]/i[\(ѰP'_p`,w.˄hnqPOwf =ګd45-W\׎ zj P6Z𹁀ނ�Όc24J_ 6B0bKz0J<l^OjLC䕺0ފ_e:c>[fpWL6E1f @fFHii\)j=9grL p@4ZؠH6̶?XqZ K>KY 9SzCed"Xyy-d X p gL99 1 h}Ozs͈ _KфBjn꣐4pIΖ9y9'M!يdcjhU!DjaÏXk[.ÁT�Bg~/4, մhhYҏqư\OUhUKq4M_a/F@_y,AC{ID=25ЄmXEEk"'� }|&[ދ깇G҃";+kfw625tt;K40皾ܛ*<ykbz{-9M[;q]"דgmK% HF'F?:a�45~-Z= w&bD ̳U1JKuYUKs"MM\q,Ԑ[-gWS.ko >ǻ-UZSP7}(D)n6hp SD�zOG{ۯx$ km#H!Yx*y#oNAn%Z:#.gQy01rrDaQ & Q[!#ڤ-�s_ �W̟5ȳhˀ'ߊ4v8Ń~yBR vP&_7/@])XtFj/5 -(/htMΕ_E8g$vbϮs2UIK 9oW1KTa"1!W @C76x ^oWΤ\pzp`1LmjFXlɂ1-лzښW-(=`ST|ݭVi)pxDb ]7ozݶhl ψ�4Y__={B![EABRxhy@0S+6ε;K*6̎1^s䍡#_6[)te)d)U)>tS` W&ɅxզF0^a>>e=o `WsHsoVC:dxdZEc8*1dT&"s<!^/f 6TpէG72\\3~dz&6ʄncQ:T}1s1 }R|}<(C= \,zIM&QKq#p#=nSGBohmݦy oj*x~~mm-W/ QJ:C;x؆�4tng@sCB=g;ԜVբ/(xTX|?p^E{$_+5t!ӷhql kԤ*Ob̗h4z*\&\L{Z n=rI`>@CsaSjh-.ڑ^8"Bp-uNO-5!WtxRR{-vfџXp4^/x[rw-Edm VMdɝa) ;KmSj.ZT#^W>W{fmq}yIefjVcF9(oOPDf۰ @ �D)MWu;Q ?/sȈo&6ɻih6pcཅM!$Ξp#ȍаhŬuaʑTm l-U:ފ|$ !o$ڬ۸,c*nSES-"瘬+ 1k7M ?ހ+ h!à N|OPfvZk:րHX{99=17# 2c0~2{&k{A(3ΙTQ^eU2} s6e1"([~NԀgw4yssMzr~\[L&\āU&S}x`Xq=fEy H8Q3"G=Oq81.5gjSCs6&bMmxDޤ3!� } 쩐@C|.2lkh ^cж4Q٢+kV%ɔ5}άam'i,Q.sOl ;KI/^@fM r \k4L <s)hS`||2P#vƶbqEIEdGCsk8E%K]_ XQnQQ7̽/LM/(5440#o(y8Pc�4nP_Kb3+xhdӋLr]$ɸø}FsE\ELi'1x Z>NP1W֚ |Oċp(h `s;vs q)%l AӢO2p۬M`zy1/Z0u :{BdӒY㱆+>N>4=ANۈm.5&Pi:a;k.k3u!>g7\9{%fкoOЦ& )~yIJTcP0ޥvI<.䠠-`bS hqhh.ӫe6r fC�z;l7e1lѼR6Sp4Z4Zf}5EִVxSK,8M FkzE%zZ h|ѫA%ύHbRF � }]jj^AiK E;nD\#͏lF݃z f Wu3L{<J;4*/E(D[oIqJln|44DB@EjH??:�4ٓ[Atν~o?_f޵&!i!-l6f?>yҳ ^>x8ytAfZ=ykĺBw&mC+^X~օ> u=I|}$k <otwiZ6)�. vCRxCVpqT Sp Bn+gi>[FkY]IAJ]C>km|:1ް76ƒعDz”?G<4I>-2g !(~fdznr�DJ4Iѧmm$K?V'6|EzԪ,Z;]Tbni|!5%'f3av&Z7xv7aYN =I"nx‿2ׅz沲Oӌ0UCsQnm[ާ2zS=ARvx�,�Oa$nІ;bH/+\ssfFBnFM!yWw+޽z<hE�z<ҵpZ|�YŽ)T@)XކT{׍ p57!hḥ"ǧP[LZц3(6F#+ڝW؅zZɇ-߼F1X1ᚁ@@cJr+jǝ#obiY<Z$DNVw3mfz:-\2Vlp  X 4g'MA &44שT7M()8v޸ehI MF欤\LC eO m6Z17ia# M(M Kѡ)& u~zAlF Ѣ= P7Mz69DZGhh}n\@[}5I@:,圆4{h;5b6ŖE\Q/ang!#<;^o)gp#eաAPh|x(ۜL'):ݧ!b=ᢹy\0w4GgZ?w K=1YGw&S'*7dv8{des C#P :Cޒe$8Cf(kɼcX--'$b"א|`: pK ̻uhSZEzEt 'A"EhL<&=#!(wztcTZ  Z/5rg yኁcc<qk0ۭ`(VQ5I\>jA΀*ih܇h‚5EP@ay4wZ NԠoe< m:)@I dc&ZR7DeA|7Eic +n=Ps!v x6'"=ךf3hhA Ku Zf3ezؼYN#1VS ]2V?mG5{Ayf;*pS2gK5Z\ b1z׬j} ׽ ,[31pLi(jLWf-BZ[9^=;R q.g=ZD�Li5ـ `ω'צb0"\ \[o mJ�j:Rh߸ObT7f(̉c/<9�6t曑Ӳ^4�ssWJ&NSv@�K gJ2:�O@s+.EhfD"cV1кge(q%Skk-LĄè8M=m7:D\F5)9'+[((S@\:5Kgj @z-'E뤌BcZKD*`pRfoF`٦h9EwszT[s +޹ ƼS#$VTD@C(YwfǤU5I{b6$gMwVIs^5=5;bxS-ַw8=)@QQihO@8)=E 6B�z#`2 T!3c\rHɇ)s9&p<A(Z{EE͊vѫ-̰fm5;\U[3,YSn52u8wWLg@CwtAwD{41GO` /f^3k$T9 hbݭw+�H)7>fky7T6W50v,|*O1,ќМ|ttb{FCǢ;#� 3]Zˈ@Os #ī5 &s'>1zk{ PT.rJn[7mu\D VM b? HԜ~>ЊACS+-/ }dIĤT_&PQCϘc (s m(U**̜~%Fm` v6E@3Gm_蒅M=nbn.#Bԡ\ifa,@C <&~ >[%cE-ű2,o~EwOB@mػjCë[‡? tpY63i[-qՉ@hCurg׽CP<4d%Ela|m<Ku gghn:kh.̸#fТD$\pk[SO?@꠴D$ʟU0qZx kn4/R(qB,IӦv"Űi"� }(^P/&5{cv!DLk[beurJ#D)EHC}HpLvZ(^<K_y?9?I3 c@Cw8t-w6t) =՛cR2(>&<L d؍t@ C+?Z|O5cDPU;}Mл"霠o';0>qi Ms @@ � }j2ZtO!i w4tbAx9f;l$MΦPAk>%ZO󨓃NNİ 5I^C 9\C6' E_<-3aߠKI:nQS 9E$BX(CM&5*6U@_1,IƦd}3͞-i\csәzp0`Bt6RҬd~6tbOJ;4+! N�4I)4t&{_pym .xa*!gJn;qИu|dE3A䛺X=8ovwC@go~ 7rp@}EcD�IJy$b-ebI䉏X)S󦪰044!7,h.I%Mmoy/Jzx?5SNgx6'Wiii3t?bᛝ?oGĖcv@�z\B8**5j n-KMn%uu!y1ϖwj_ t D I7Gs ʦNkpj/h;n 'dΐ^_ͻ, xuU٧qyCSqnYLQ. 8jeHЦҍ mxBB(lI*�J:P"FQ[1q-KWB5wiѬ7rm)hgݧcPtWt�jELFŚLzXœyut84{cu^Ay4oT!$ŴN'Vt*jKVU!VYhsA fTfPCj)Tf8E'Xfr=/r}`Z g~#[k;Τqx`!=,;K1'M_ d(i,Ĵ~t'Ly7t<V U=3//y]-\<@L_]) Џ�4t?S[0IY5 kPtUO,NM0ssu)"M0t%x~Yy}=Ji:O5:Md![y8-dlNnM @@ � }TYz=@ OEt-moU4˕̅z*3zxYu8 G tbe83#] 6/kF^N{#Uw psH?DZӃo ̅P&5LZkkq#@wGwMkm]:)^2א[fBE|CComh[x5k`I f^ Y68e4 .*<@RC=n[hhq~HRV�a!?fdiۤPT(Bu5̛\G |BCӺt6օ&-gBy-E=7k֖t[)֮WByz<罷(jw\^i/\#hk: MǤf]l�~LyP1R/ .?h듌S(: Ŕ66+-FN@BEer]IOq`ї|~h[, I[_@3%OPE76/ņ=Zg y -E,Jdp[5b$ dE{@FlDDz{ "{\Í[C�2~o1ր@3;* 'm+ 3k]`kh%ssO TO e xn(JCognߗl4qy[  ;ytҘnNԹ\gOph!EW SNd ݵ65B.0@R #Y^= x3Ih䲞NkKA{!$ðM&I@ChU( -X[\bt'1c鹪a77r ki:'3ۣy"p6|'NbMyڻ.-]NIHWD A�:e=A sNz7#DL(cO=s ۬Wh[Z1u2i�N ^)^o-dmOH/<\[y\l.M<.X!a@@g֣N]>SuaG'LǤJ~QF\ح5]"@Pu b}!ʥ|.\bw,Pς61 � ݃`f`Ovœ mvV[&h#b qA";Ac+W!erNŇ7XÔC0K,]=͍L׼#ݢEvòF�Uqbb%[`\<u]h~)rYKm %Ot>8 ,4$S.( Qlo^};' hnj0IF } oa,_6FSAIwdmf# 5'I7N4;S&YZh)V1Vrtf j5WRL4$ݘp.cN+ }lV,5%Wp H}4ڈ(q27b6HFC-2 s".τ_&4a0y(JVWǎ4Jb"\"g/F'G�z=hy5=Bdi c3CxtASv ~#0x[@>)I5SG#T\aUz<9p&.qL|eSM*Kσ�4<'BJ~geEOFݽ6j5t놧5tFxVKp9RBz|KM`N fF;A ;ȬCjyy#FL9ŝGJ5'E�z ^16FvY3/z*�OC4;RB0hyf3)ᥛ c͔ *s;69 "d/"|f>@\@C7C Pli9:B?�[X0uLWM˫RUO:w>qە+,?T)Bo!k28<ʈt}+hљϻF;C�b E8"੷]`uiL,∴T5_ CtAL+fCMJ3Ƣ5GG_W/U%5p m:蕼nj!5Aqhkmn.06#vF>VnZCnJkmq7M5/ʼجVYe6YŽYkp&r9eAj%Q{l^+h+eTi-lFq(Bih~>IBC'/=s*/oU ղrU[^Qkhn ׍un>4eA`f 5Cpq:)Ck^Qy27Db魘~SӬMiml`b@C_,g'Fi! (t+o{LBbuVdգ6b ]<+&W/NTm`iGз9F3{Lͺ(؉cX\#ґ̣'BCS}J:d4tЍjez HhuS,2bs+fUL] D�zμ8;ƣ[HQY1mxKLf-AFOQsk@CWIu"%mN;9i{Ǡ/D7hht14f5UԦ @{Bjg0 4SDr,k3_:Wj_QZHNf8's^M Z^i&7M EKF8-PZC&G肓'-{ԆX8f5#\C6ͤe?<:u3JOhMIrl +�4!c#`1;()Y44 j4׳цw.{ ަjub[Orpy$`<y0<[Dbg ;H4-\h%m*֥Y QjyzC0+JU(Wi6(>:ؿ)"XnS=9YIFsOqhZrUj<a%5 V!'.<y 7 bk[ ey ͯ /\oy |%J_ܢaF1� ZVP~L絅tškܢڈ5S"_3uv [R+-WD&A /4AC@�z TaNG1'oR/re,{7˱OڊC&gm]:8ڿ6jC׵ YWl޵Zl& 3 A�2D #0m0B\ŊBf4t_@tE7k@^oZ-0P ("# f iλ°#� }#a쬡\o*fozoMmFs̛4tBї"f%հB i -ʲxwT+>=2c(G! ;G ik6oo -/d4v8HKm_C4z8`LtЄR3xb A�=̽!-PȜ &MQ*\Eqe¦8+/@H t 㹙. e! K̋Xպ͗-_Uf#Eݼg>hӥ kl^O 5ߙb7Ǟf&6#2ˉcJЗd<hQW)0@kӷ %>b M{kSg@Cs)cs~r,,ǀʚY�cIôFyMn&-xN_o!ˈv| Jr"~3<=C,^{|3OڬACBeI̙=) "� J�ev{g*7(r+jhN4yy@Hߞ,Flڣ <Ljh­Ш PF >(O=;>^xw}ݓ].Z%܋u?YW~c( vz,8+5sB!1pPZ҃�4tz{&d=^ Ծ: [#_(jI S97Nd&kA6+]^~@TkY-#g:B/* F4Zk yqtNsk { oܔq >_g"0hxQd(=1HmIW ZN-$dŘ(V(4?L%5y SٹH|`a &@CSW.JbDo%k_7ԡyfZy2op[Qqe=q2M_؆7+ رi AlLNIFfOkOFS%#b g5khff-9ihS yH_!stώ�437D >pavbjYSS6ES{G7R#nB+{'ۥ2jf;x/`ٻ8Ի/xíih/~<5" �( ` σ9_4h|t^mV<5@,j>TjSQa +KC 4ؙ\LI@aح [�ֲoq%g*B:YGz+]"Sq cB&WHш)y]M<4�&fk"`j58bY GjYߢpbLm]wMqz"60[-zOOZrzg^!N>iS � }4ɝN=ej!/qO#H+i7=hikisd~z[@CYv Q.N &^A! aBvyt\<ߪR�AFPjl kh>͏b N׊t~|y7y ^hkU#Q !50ZF*AC{!~\41ۨ`g;|ݎ^/5;g2F�G]0F<!]pܔ>@ڎ=!FLCm뺂!r0I#񰋝Cp5: j,t&gtSXe^S"/?%%M20YC44Nδ}-v2i;M ܼ@B�ul&<;WQ4TO|V4dgH3[DÎBƍ\XC5 zAs7 SCӱPʤg~&l;n0}}+ZtZ;E950`mHV#4$@ �4t%9&@ZxTf^ E.Fw'!))WS^" p kp5+\-^yۜ-C�z9EDGCk 9%nUYy0�zIAǀfVJ^M04tsR0l�48aEaqX Hkqf||0t3 t��48f :k04wHVlIQT@ ]_:S!~=8 h裐Ǻ@sD}tVkIw zDE Mα]Ҽ:  j,*=Ns* Ί/zV+^xxO36l4Ήr@�4t" � bA' SU{9.41{B h BI$¸qr,WYLӵ|vQcW7QS& 4M =ЧH]H>iδsCzˁc"N /!� Xt!qAZ<1CoՅ >8J3&ކ?n@CO8bH{dϡ.yͬp ne44L�4IK@ezϼ"s#/?=(zsr_@Fcv"nͫn%tӁ�XF%�I -nQjSX\ q,s3|J[S"P,% S�>q(1Yx"N{ Br+ׁ6�!� 0 mRvtФ{9,p+c5yo&[-]̠ 5y}UPa9:C_]4/@qj"cˆ�4 c Ђ@|ÀkcaQW�� IDAT\3p ],g$N=EvF�zg" WРI`Ơ54%?n^o6 1c8l�4&@98|к>1Y4"}Hjh8o2zYeбЗJ'<Az}M@V#Bjq\|؟uSCC\~g`[ X�hh�8iICώKqGC)vB,@`r'OOЧtl~/z|ŅZ᧑EtgЖg4gÔk`(@Cϟ#xԃD78ɹZ>l P S.�B�@�i@& +jwp,7ZA\;~0@h$PFC m{ 9?8hY S΀|A�"DG sEϘsuk-i6<"D=4TfÔ1�*` p0mgog9~@ ɛx:|ǬhɶYE@�pQ@"/iLҳ SѶfM �D�IEH@>c5Ow!qu~Ҩp۬B>]0p2:3a5Sn%׫NVe�!,'| �v@�z y*5fh^HTRXfmRma�)0}trϡWeLI/$aKQ<�o$<C@h <VChh얁4Sā�( p[ţ0BCBb�f)<�@`�H-}%kus]H@S У{N<�WG�F|@-=*<83�o!ˈge4z � }#Fe~}"-H[/GǍ � }+F@r@Cς@{|'8;g YBhl1P:EpCC@VL#N "p_k5X@guN?$d, n h[8F� p@Q#>} @-еan za! Ќ�4t3t@C�:,!0%>8hs��#� #wC`@@8,zAs�Sv �]!)W1I41p �@Q[@ClG�ẕ"h��H!ЦRkc p@C`28+E5 YQ#0؊u}@X�2e0�IeG �7fF`oACϜehh�Ap-h7f @CDFo0 L:B>)'M)/<{9nD34snh[4gG y͏IFQ?G@C�8ϑ]xVQ@\@C+_.ƑV#x�s � }<K �qErRpIoh/�΁�9/oc@` H�@C�s6�4.�4􅓋ЀW"b@@>c3pDw+8amџhf~[@�Wp?* hs C�s\0�@ @C!K0Ё��"� =on��>F1� �T@CO8��@�� pO$��@�� 0S� ���@��h$ . ���@�L�4T3@�� ���'@�I@�� ���S!� =U: �@�� � >A"�@�� �T@CO8��@�� pO$��@�� 0S� ���@��h$ . ���@�L�4T3@�� ���'@�I@�� ���S!� =U: �@�� � >A"�@�� �T@CO8��@�� pO$��@�� 0S� ���@��h$ . ���@�L�4T3@�� ���'@�I@�� ���S!� =U: �@�� � >A"�@�� �T@CO8��@�� pO$��@�� 0S� ���@��h$ . ���@�L�4T3@�� ���'@�I@�� ���S!Px� ���@�� #o|Ǔ{^��@�� �@hh ���@��:*^`��@�� �@�� ���u@Cu*��@�� PD^��@�� �@ˁ@�� ���@ =vZ����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/indegree_kl.pdf��������������������������������������������������������������������0000654�0001762�0000144�00000007102�12122071020�016265� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20100128141029) /ModDate (D:20100128141029) /Title (R Graphics Output) /Producer (R 2.10.0) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream q Q q BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 198.50 18.72 Tm [(K) 30 (ullback-Leib) 20 (ler distance)] TJ ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 12.96 230.86 Tm (Frequency) Tj ET Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 88.11 73.44 m 430.97 73.44 l S 88.11 73.44 m 88.11 66.24 l S 156.69 73.44 m 156.69 66.24 l S 225.26 73.44 m 225.26 66.24 l S 293.83 73.44 m 293.83 66.24 l S 362.40 73.44 m 362.40 66.24 l S 430.97 73.44 m 430.97 66.24 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 79.77 47.52 Tm (0.2) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 148.35 47.52 Tm (0.3) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 216.92 47.52 Tm (0.4) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 285.49 47.52 Tm (0.5) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 354.06 47.52 Tm (0.6) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 422.63 47.52 Tm (0.7) Tj ET 59.04 87.20 m 59.04 431.20 l S 59.04 87.20 m 51.84 87.20 l S 59.04 144.53 m 51.84 144.53 l S 59.04 201.87 m 51.84 201.87 l S 59.04 259.20 m 51.84 259.20 l S 59.04 316.53 m 51.84 316.53 l S 59.04 373.87 m 51.84 373.87 l S 59.04 431.20 m 51.84 431.20 l S BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 83.86 Tm (0) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 141.20 Tm (2) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 198.53 Tm (4) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 255.86 Tm (6) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 313.20 Tm (8) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 367.19 Tm (10) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 424.53 Tm (12) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 74.40 87.20 13.71 28.67 re S 88.11 87.20 13.71 57.33 re S 101.83 87.20 13.71 143.33 re S 115.54 87.20 13.71 57.33 re S 129.26 87.20 13.71 229.33 re S 142.97 87.20 13.71 143.33 re S 156.69 87.20 13.71 315.33 re S 170.40 87.20 13.71 344.00 re S 184.11 87.20 13.71 258.00 re S 197.83 87.20 13.71 143.33 re S 211.54 87.20 13.71 172.00 re S 225.26 87.20 13.71 143.33 re S 238.97 87.20 13.71 114.67 re S 252.69 87.20 13.71 114.67 re S 266.40 87.20 13.71 86.00 re S 280.11 87.20 13.71 57.33 re S 293.83 87.20 13.71 114.67 re S 307.54 87.20 13.71 28.67 re S 321.26 87.20 13.71 57.33 re S 334.97 87.20 13.71 28.67 re S 348.69 87.20 13.71 28.67 re S 362.40 87.20 13.71 28.67 re S 376.11 87.20 13.71 28.67 re S 389.83 87.20 13.71 28.67 re S 403.54 87.20 13.71 28.67 re S 417.26 87.20 13.71 57.33 re S 430.97 87.20 13.71 0.00 re S 444.69 87.20 13.71 28.67 re S Q endstream endobj 7 0 obj 2489 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <</F2 9 0 R >> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 8 0 R >> endobj xref 0 10 0000000000 65535 f 0000000021 00000 n 0000000164 00000 n 0000002855 00000 n 0000002938 00000 n 0000000213 00000 n 0000000293 00000 n 0000002835 00000 n 0000003019 00000 n 0000003276 00000 n trailer << /Size 10 /Info 1 0 R /Root 2 0 R >> startxref 3372 %%EOF ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/indegree.pdf�����������������������������������������������������������������������0000654�0001762�0000144�00000007312�12122071021�015603� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20100128134621) /ModDate (D:20100128134621) /Title (R Graphics Output) /Producer (R 2.10.0) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream q Q q BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 187.04 18.72 Tm [(Gini inde) 30 (x of state in-degrees)] TJ ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 12.96 230.86 Tm (Frequency) Tj ET Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 59.04 87.20 m 59.04 440.02 l S 59.04 87.20 m 51.84 87.20 l S 59.04 175.41 m 51.84 175.41 l S 59.04 263.61 m 51.84 263.61 l S 59.04 351.82 m 51.84 351.82 l S 59.04 440.02 m 51.84 440.02 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 83.86 Tm (0) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 168.73 Tm (10) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 256.94 Tm (20) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 345.14 Tm (30) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 433.35 Tm (40) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 304.80 87.20 19.20 8.82 re S 324.00 87.20 19.20 52.92 re S 343.20 87.20 19.20 141.13 re S 362.40 87.20 19.20 344.00 re S 381.60 87.20 19.20 238.15 re S 400.80 87.20 19.20 97.03 re S Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 74.40 73.44 m 458.40 73.44 l S 74.40 73.44 m 74.40 66.24 l S 112.80 73.44 m 112.80 66.24 l S 151.20 73.44 m 151.20 66.24 l S 189.60 73.44 m 189.60 66.24 l S 228.00 73.44 m 228.00 66.24 l S 266.40 73.44 m 266.40 66.24 l S 304.80 73.44 m 304.80 66.24 l S 343.20 73.44 m 343.20 66.24 l S 381.60 73.44 m 381.60 66.24 l S 420.00 73.44 m 420.00 66.24 l S 458.40 73.44 m 458.40 66.24 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 66.06 47.52 Tm (0.0) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 104.46 47.52 Tm (0.1) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 142.86 47.52 Tm (0.2) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 181.26 47.52 Tm (0.3) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 219.66 47.52 Tm (0.4) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 258.06 47.52 Tm (0.5) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 296.46 47.52 Tm (0.6) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 334.86 47.52 Tm (0.7) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 373.26 47.52 Tm (0.8) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 411.66 47.52 Tm (0.9) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 450.06 47.52 Tm (1.0) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 1.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 443.57 73.44 m 443.57 444.96 l S BT 1.000 0.000 0.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 405.60 350.25 Tm (> 100%) Tj ET BT /F2 1 Tf 9.00 0.00 -0.00 9.00 366.93 339.45 Tm [(of r) 10 (andom results)] TJ ET 0.000 0.000 1.000 RG 408.80 73.44 m 408.80 444.96 l S BT 0.000 0.000 1.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 349.57 377.45 Tm (95% quantile) Tj ET Q endstream endobj 7 0 obj 2625 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <</F2 9 0 R >> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 8 0 R >> endobj xref 0 10 0000000000 65535 f 0000000021 00000 n 0000000164 00000 n 0000002991 00000 n 0000003074 00000 n 0000000213 00000 n 0000000293 00000 n 0000002971 00000 n 0000003155 00000 n 0000003412 00000 n trailer << /Size 10 /Info 1 0 R /Root 2 0 R >> startxref 3508 %%EOF ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/example.btp������������������������������������������������������������������������0000654�0001762�0000144�00000026164�12122071020�015475� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<BioTapestry version="3.1" > <workspace x="1" y="0" w="12000" h="9000" /> <startupView/> <fonts> <font name="small" type="serif" isBold="true" isItalic="false" size="20" /> <font name="medium" type="serif" isBold="true" isItalic="false" size="28" /> <font name="cisRegName" type="serif" isBold="true" isItalic="false" size="28" /> <font name="geneName" type="serif" isBold="true" isItalic="false" size="28" /> <font name="link" type="serif" isBold="true" isItalic="false" size="28" /> <font name="mediumLarge" type="sanSerif" isBold="true" isItalic="false" size="30" /> <font name="netModule" type="sanSerif" isBold="true" isItalic="false" size="34" /> <font name="large" type="sanSerif" isBold="true" isItalic="false" size="34" /> <font name="notes" type="sanSerif" isBold="true" isItalic="false" size="34" /> <font name="date" type="sanSerif" isBold="false" isItalic="false" size="25" /> <font name="title" type="sanSerif" isBold="true" isItalic="false" size="32" /> </fonts> <displayOptions /> <colors> <color color="EX-dark-cyan" name="Dark Steel Blue" r="0" g="101" b="128" /> <color color="EX-cyan" name="Cyan" r="0" g="255" b="255" /> <color color="EX-yellow-orange" name="Tangerine" r="255" g="153" b="0" /> <color color="EX-pale-green" name="Pale Green" r="133" g="204" b="102" /> <color color="lightOrange" name="Light Orange" r="244" g="211" b="170" /> <color color="EX-dark-green" name="Dark Green" r="39" g="128" b="0" /> <color color="lightGray" name="Light Gray" r="240" g="240" b="240" /> <color color="EX-pale-red-orange" name="Dark Salmon" r="230" g="156" b="138" /> <color color="lightBlue" name="Light Blue" r="220" g="220" b="240" /> <color color="EX-yellow-green" name="Lime" r="154" g="255" b="0" /> <color color="EX-yellow" name="Gold" r="255" g="203" b="0" /> <color color="EX-dark-gray-purple" name="Dark Blue" r="0" g="25" b="128" /> <color color="yellowGreen" name="Yellow Green" r="246" g="249" b="170" /> <color color="EX-dark-red" name="Deep Ochre" r="140" g="56" b="56" /> <color color="EX-pale-magenta" name="Light Plum" r="211" g="138" b="230" /> <color color="EX-purple" name="Indigo" r="102" g="51" b="255" /> <color color="EX-pale-purple" name="Cornflower Blue" r="149" g="165" b="230" /> <color color="EX-red" name="Bright Red" r="255" g="0" b="0" /> <color color="EX-pale-yellow-green" name="Pale Goldenrod" r="221" g="230" b="138" /> <color color="EX-dark-purple" name="Slate Blue" r="77" g="56" b="140" /> <color color="EX-pale-cyan" name="Aquamarine" r="138" g="230" b="182" /> <color color="EX-pure-blue" name="Blue" r="1" g="0" b="255" /> <color color="inactiveLightBlue" name="Very Light Blue" r="235" g="235" b="250" /> <color color="lightPurple" name="Light Purple" r="235" g="219" b="229" /> <color color="black" name="Black" r="0" g="0" b="0" /> <color color="EX-dark-yellow-green" name="Olive Green" r="115" g="128" b="0" /> <color color="EX-dark-tan" name="Dark Tan" r="166" g="133" b="83" /> <color color="EX-magenta" name="Fuchsia" r="254" g="0" b="255" /> <color color="EX-pale-blue" name="Powder Blue" r="102" g="183" b="204" /> <color color="white" name="White" r="255" g="255" b="255" /> <color color="lightGreen" name="Light Green" r="214" g="239" b="209" /> <color color="inactiveLightGreen" name="Very Light Green" r="230" g="255" b="220" /> <color color="inactiveLightPurple" name="Very Light Purple" r="245" g="229" b="240" /> <color color="EX-orange" name="Pumpkin Orange" r="255" g="103" b="0" /> <color color="inactiveYellowGreen" name="Light Yellow Green" r="255" g="255" b="220" /> <color color="inactiveLightOrange" name="Very Light Orange" r="255" g="230" b="200" /> <color color="EX-medium-magenta" name="Mauve" r="166" g="83" b="166" /> <color color="EX-blue-magenta" name="Bright Purple" r="154" g="0" b="255" /> <color color="EX-green" name="Bright Green" r="1" g="255" b="0" /> <color color="EX-dark-magenta" name="Violet" r="102" g="0" b="128" /> <color color="inactiveLightGray" name="Very Light Gray" r="245" g="245" b="245" /> <color color="EX-pale-blue-magenta" name="Lilac" r="146" g="102" b="204" /> <color color="darkGray" name="Dark Gray" r="150" g="150" b="150" /> <color color="EX-pale-yellow orange" name="Dark Wheat" r="204" g="175" b="102" /> <color color="EX-dark-orange" name="Sienna" r="128" g="92" b="0" /> <color color="EX-blue" name="Sky Blue" r="0" g="152" b="255" /> <color color="EX-pale-red" name="Rose" r="204" g="102" b="153" /> </colors> <images> </images> <userTreePaths> </userTreePaths> <genome name="Full Genome" id="bioTapA" > <rootLongName /> <rootDescription /> <nodes> <boxes> <box name="Input 1" id="3" > <simulationLogic type="AND" > <simParameters> <simParameter name="initVal" value="1" /> </simParameters> </simulationLogic> </box> <box name="Input 2" id="4" > <simulationLogic type="AND" /> </box> </boxes> <genes> <gene name="Gene 1" id="0" > <simulationLogic type="XOR" /> </gene> <gene name="Gene 2" id="1" > <simulationLogic type="AND" /> </gene> <gene name="Gene 3" id="2" > <simulationLogic type="OR" /> </gene> </genes> </nodes> <links> <link label="" src="0" targ="0" sign="-" id="13" targPad="5" /> <link label="" src="0" targ="1" sign="+" id="10" targPad="1" /> <link label="" src="0" targ="2" sign="+" id="12" targPad="2" /> <link label="" src="1" targ="2" sign="+" id="11" targPad="1" /> <link label="" src="2" targ="1" sign="+" id="9" targPad="3" /> <link label="" src="3" targ="0" sign="+" id="6" targPad="0" launchPad="1" /> <link label="" src="4" targ="0" sign="-" id="8" targPad="2" launchPad="1" /> <link label="" src="4" targ="1" sign="-" id="7" targPad="2" launchPad="1" /> </links> <netOverlays> </netOverlays> <notes> </notes> </genome> <genomeInstances> </genomeInstances> <layouts> <layout name="bioTapB" genome="bioTapA" type="free" > <layoutMetadata /> <props> <nprops> <nprop id="0" color="EX-orange" x="5870.0" y="4680.0" orient="right" /> <nprop id="1" color="EX-dark-cyan" x="6440.0" y="4640.0" orient="right" /> <nprop id="2" color="EX-blue" x="6160.0" y="4160.0" orient="right" /> <nprop id="3" color="darkGray" x="5770.0" y="4620.0" orient="right" /> <nprop id="4" color="darkGray" x="5450.0" y="4250.0" orient="right" /> </nprops> <lprops> <linkBus labelX="5200.0" labelY="4280.0" labelDir="" src="0" > <drawStyle color="EX-orange" style="solid" thick="regular" /> <segments> <linkSegment id="3" parent="0" strtX="6000.0" strtY="4690.0" endX="6080.0" endY="4690.0" /> <linkSegment id="2" parent="1" strtX="6000.0" strtY="4640.0" endX="5930.0" endY="4640.0" /> <linkSegment id="1" parent="0" strtX="6000.0" strtY="4690.0" endX="6000.0" endY="4640.0" /> <linkSegment id="0" strtX="6000.0" strtY="4690.0" /> <linkSegment id="7" parent="4" strtX="6080.0" strtY="4390.0" endX="6340.0" endY="4390.0" /> <linkSegment id="6" parent="5" strtX="6080.0" strtY="4130.0" endX="6190.0" endY="4130.0" /> <linkSegment id="5" parent="4" strtX="6080.0" strtY="4390.0" endX="6080.0" endY="4130.0" /> <linkSegment id="4" parent="3" strtX="6080.0" strtY="4690.0" endX="6080.0" endY="4390.0" /> <linkSegment id="9" parent="8" strtX="6340.0" strtY="4630.0" endX="6460.0" endY="4630.0" /> <linkSegment id="8" parent="7" strtX="6340.0" strtY="4390.0" endX="6340.0" endY="4630.0" /> </segments> <drops> <drop ref="*" connectStart="0" /> <drop ref="10" connectEnd="9" /> <drop ref="13" connectEnd="2" /> <drop ref="12" connectEnd="6" /> </drops> </linkBus> <linkBus labelX="4820.0" labelY="4280.0" labelDir="" src="1" > <drawStyle color="EX-dark-cyan" style="solid" thick="regular" /> <segments> <linkSegment id="3" parent="2" strtX="6600.0" strtY="4870.0" endX="6100.0" endY="4870.0" /> <linkSegment id="2" parent="0" strtX="6600.0" strtY="4650.0" endX="6600.0" endY="4870.0" /> <linkSegment id="0" strtX="6600.0" strtY="4650.0" /> <linkSegment id="5" parent="4" strtX="6100.0" strtY="4150.0" endX="6180.0" endY="4150.0" /> <linkSegment id="4" parent="3" strtX="6100.0" strtY="4870.0" endX="6100.0" endY="4150.0" /> </segments> <drops> <drop ref="*" connectStart="0" /> <drop ref="11" connectEnd="5" /> </drops> </linkBus> <linkBus labelX="3220.0" labelY="3790.0" labelDir="" src="3" > <drawStyle color="black" style="solid" thick="regular" /> <segments> <linkSegment id="0" strtX="5880.0" strtY="4620.0" /> </segments> <drops> <drop ref="*" connectStart="0" /> <drop ref="6" connectStart="0" /> </drops> </linkBus> <linkBus labelX="3310.0" labelY="3940.0" labelDir="" src="4" > <drawStyle color="black" style="solid" thick="regular" /> <segments> <linkSegment id="3" parent="0" strtX="5620.0" strtY="4250.0" endX="5620.0" endY="4560.0" /> <linkSegment id="0" strtX="5620.0" strtY="4250.0" /> <linkSegment id="7" parent="6" strtX="6360.0" strtY="4250.0" endX="6360.0" endY="4610.0" /> <linkSegment id="6" parent="0" strtX="5620.0" strtY="4250.0" endX="6360.0" endY="4250.0" /> <linkSegment id="4" parent="3" strtX="5620.0" strtY="4560.0" endX="5900.0" endY="4560.0" /> <linkSegment id="8" parent="7" strtX="6360.0" strtY="4610.0" endX="6470.0" endY="4610.0" /> </segments> <drops> <drop ref="*" connectStart="0" /> <drop ref="7" connectEnd="8" /> <drop ref="8" connectEnd="4" /> </drops> </linkBus> <linkBus labelX="4440.0" labelY="4280.0" labelDir="" src="2" > <drawStyle color="EX-blue" style="solid" thick="regular" /> <segments> <linkSegment id="2" parent="0" strtX="6380.0" strtY="4170.0" endX="6380.0" endY="4590.0" /> <linkSegment id="0" strtX="6380.0" strtY="4170.0" /> <linkSegment id="4" parent="2" strtX="6380.0" strtY="4590.0" endX="6480.0" endY="4590.0" /> </segments> <drops> <drop ref="*" connectStart="0" /> <drop ref="9" connectEnd="4" /> </drops> </linkBus> </lprops> </props> </layout> </layouts> <QPCR threshold="1.6" > </QPCR> <TimeCourseData> </TimeCourseData> <TemporalInputRangeData> </TemporalInputRangeData> </BioTapestry> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/BoolNet_package_vignette.Snw�������������������������������������������������������0000654�0001762�0000144�00000201055�12122071020�020740� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\documentclass[a4paper]{article} \SweaveOpts{keep.source=TRUE} %\VignetteIndexEntry{Detailed introduction to all major features of BoolNet} \usepackage{graphicx} \usepackage{amsmath} \usepackage{hyperref} \setlength{\parindent}{0em} \setlength{\parskip}{0.2em} \title{BoolNet package vignette} \author{Christoph M\"ussel, Martin Hopfensitz, Hans A. Kestler} \widowpenalty=10000 \clubpenalty=10000 \hyphenation{me-thods pro-per-ties re-pre-sen-ta-tion} \begin{document} \maketitle \tableofcontents \clearpage \section{Introduction} \texttt{BoolNet} is an R package that provides tools for assembling, analyzing and visualizing synchronous and asynchronous Boolean networks as well as probabilistic Boolean networks. This document gives an introduction to the usage of the software and includes examples for use cases. \texttt{BoolNet} supports three types of networks: \begin{description} \item[Synchronous Boolean networks]{ consist of a set of Boolean variables \[ X = \left\{X_1, \ldots, X_n \right\} \] and a set of transition functions \[ F=\left\{ f_{1},\ldots,f_{n}\right\}, \] one for each variable. These transition functions map an input of the Boolean variables in $X$ to a Boolean value ($0$ or $1$). We call a Boolean vector $\mathbf{x}(t) = \left(x_1(t), \ldots, x_n(t) \right)$ the {\em state} of the network at time $t$. Then, the next state of the network $\mathbf{x}(t+1)$ is calculated by applying {\em all} transition functions $f_i(\mathbf{x}(t))$. In a biological context, genes can be modeled as Boolean variables ({\em active/expressed} or {\em inactive/not expressed}), and the transition functions model the dependencies among these genes. In the synchronous model, the assumption is that all genes are updated at the same time. This simplification facilitates the analysis of the networks.} \item[Asynchronous Boolean networks]{ have the same structure as synchronous Boolean networks. Yet, at each point of time $t$, only {\em one} of the transition functions $f_i \in F$ is chosen at random, and the corresponding Boolean variable is updated. This corresponds to the assumption that in a genetic network, gene expression levels are likely to change at different points of time. In the most common model, the gene to be updated is chosen uniformly among all genes. Moreover, \texttt{BoolNet} supports specifying non-uniform update probabilities for the genes.} \item[Probabilistic Boolean networks (PBN)]{ allow for specifying more than one transition function per variable/gene. Each of these functions has a probability to be chosen, where the probabilities of all functions for one variable sum up to 1. Formally \[ F=\left\{\left\{\left(f_{11}, p_{11}\right), \ldots, \left(f_{1k_1}, p_{1k_1}\right)\right\}, \ldots, \left\{\left(f_{n1}, p_{n1}\right), \ldots, \left(f_{nk_n}, p_{nk_n}\right)\right\}\right\} \] where $k_i$ is the number of alternative transition functions for variable $i$, and $p_{ij}$ is the probability that function $j$ is chosen for variable $i$. A state transition is performed by selecting one function for each gene based on the probabilities and applying the chosen functions synchronously.} \end{description} In \texttt{BoolNet}, synchronous and asynchronous Boolean networks are modeled in the data structure {\em BooleanNetwork}, and probabilistic networks are modeled in the data structure {\em ProbabilisticBooleanNetwork}. The package provides several methods of constructing networks: Networks can be loaded from files in which human experts describe the dependencies between the genes. Furthermore, they can be reconstructed from time series of gene expression measurements. It is also possible to generate random networks. This can be helpful for the identification of distinct properties of biological networks by comparison to random structures. The different methods of assembling networks are described in Section~\ref{sec:assemblingnetworks}. In Section~\ref{sec:networkanalysis}, tools for the analysis and visualization of network properties are introduced. For synchronous and asynchronous Boolean networks, the most important tool is the identification of attractors. Attractors are cycles of states and are assumed to be associated with the stable states of cell function. Another possibility of identifying relevant states is the included Markov chain simulation. This method is particularly suited for probabilistic networks and calculates the probability that a state is reached after a certain number of iterations. To test the robustness of structural properties of the networks to noise and mismeasurements, the software also includes extensive support for perturbing networks. In this way, it is possible to test these properties in noisy copies of a biological network. In Section~\ref{sec:importexport}, the interaction of \texttt{BoolNet} with related software is described. The necessary steps to import networks from BioTapestry and to export networks to Pajek are outlined. For the examples in the following sections, we assume that the \texttt{BoolNet} package has been properly installed into the R environment. This can be done by typing <<eval=FALSE>>= install.packages("BoolNet") @ into the R console or by the corresponding menu entries in an R GUI. For some of the plots, the \texttt{igraph} package is required and must be installed in your R environment as well. This is analogous to installing \texttt{BoolNet}. For the BioTapestry import, the \texttt{XML} package must be installed. Additionally, the \texttt{BoolNet} package must be loaded via <<>>= library(BoolNet) @ \section{Assembling networks}\label{sec:assemblingnetworks} \subsection{Assembling a network from expert knowledge} A major advantage of Boolean networks is the fact that natural-language statements can easily be transferred into this representation. This allows researchers for building Boolean networks entirely from expert knowledge, for example by collecting statements on gene dependencies from literature and expressing them as Boolean rules. \texttt{BoolNet} is able to read in networks consisting of such rule sets in a standardized text file format. In such a file, each line consists of a target gene and an update rule, usually separated by a comma. Optionally, it is also possible to add a probability for the rule if the file describes a probabilistic network. The first line of such a file is a header \begin{samepage} \begin{verbatim} targets, factors \end{verbatim} or \begin{verbatim} targets, factors, probabilities \end{verbatim} \end{samepage} To illustrate the process of transforming natural-language statements into Boolean rules, we take a look at the mammalian cell cycle network introduced by Faur\'e et al. \cite{faure06}. In Table 1 of this paper, the authors list natural-language statements of gene dependencies and the corresponding Boolean expressions. The following rules are taken from this table. For gene CycD, Faur\'e et al. state: \begin{quote} \textit{CycD is an input, considered as constant.} \end{quote} Transforming this into a Boolean rule is rather simple: CycD does not change its value, which means that its value after a transition only depends on its previous value. Thus, the transition rule is \begin{verbatim} CycD, CycD \end{verbatim} Gene Rb has a more complex description: \begin{quote} \textit{Rb is expressed in the absence of the cyclins, which inhibit it by phosphorylation [...]; it can be expressed in the presence of CycE or CycA if their inhibitory activity is blocked by p27.} \end{quote} As a general rule, inhibition can be represented by a Boolean negation. In the \texttt{BoolNet} file format, a negation is expressed by the \texttt{!} character. The referenced cyclins comprise the genes CycA, CycB, CycD, and CycE. If {\em all} these genes are absent, Rb is expressed -- i.e. if CycA is not expressed {\em and} CycB is not expressed {\em and} CycD is not expressed {\em and} CycE is not expressed. A logical AND is embodied by the \texttt{\&} character. Consequently, the first part of the rule is \begin{verbatim} ! CycA & ! CycB & ! CycD & ! CycE \end{verbatim} In combination with the above statement, the fact that Rb can be expressed in the presence of CycE and CycA if p27 is active means that CycB and CycD must not be active. Thus, the second part of the rule is \begin{verbatim} p27 & ! CycB & ! CycD \end{verbatim} This statement is an exception (or alternative) to the first statement; this can be expressed as a logical OR, for which the \texttt{|} character is used. The complete rule for gene Rb is thus \begin{verbatim} Rb, (! CycA & ! CycB & ! CycD & ! CycE) | (p27 & ! CycB & ! CycD) \end{verbatim} After processing all genes in the table in this way, we get the following network description: \begin{footnotesize} \begin{verbatim} targets, factors CycD, CycD Rb, (! CycA & ! CycB & ! CycD & ! CycE) | (p27 & ! CycB & ! CycD) E2F, (! Rb & ! CycA & ! CycB) | (p27 & ! Rb & ! CycB) CycE, (E2F & ! Rb) CycA, (E2F & ! Rb & ! Cdc20 & ! (Cdh1 & UbcH10)) | (CycA & ! Rb & ! Cdc20 & ! (Cdh1 & UbcH10)) p27, (! CycD & ! CycE & ! CycA & ! CycB) | (p27 & ! (CycE & CycA) & ! CycB &! CycD) Cdc20, CycB Cdh1,(! CycA & ! CycB) | (Cdc20) | (p27 & ! CycB) UbcH10, ! Cdh1 | (Cdh1 & UbcH10 & (Cdc20 | CycA | CycB)) CycB, ! Cdc20 & ! Cdh1 \end{verbatim} \end{footnotesize} Now save this description to a file ``cellcycle.txt'' in your R working directory. The network can be loaded via <<eval=FALSE>>= cellcycle <- loadNetwork("cellcycle.txt") @ The same network is also included in \texttt{BoolNet} as an example and can be accessed via <<>>= data(cellcycle) @ As the above example does not cover all possibilities of the network description language, a full language specification is provided in Section~\ref{sec:appendix}. \subsection{Reconstructing a network from time series} An entirely different approach of assembling a network is to infer rules from series of expression measurements of the involved genes over time. For example, microarray experiments can be conducted at different points of time to cover the expression levels of different cell states. To reconstruct networks from such data, \texttt{BoolNet} includes two reconstruction algorithms, Best-Fit Extension~\cite{laehdesmaeki03} and REVEAL \cite{liang98}. REVEAL requires the inferred functions to match the input time series perfectly, hence it is not always able to reconstruct networks in the presence of noisy and inconsistent measurements. Best-Fit Extension retrieves a set of functions with minimum error on the input and is thus suited for noisy data. In the following, we introduce a tool chain for the reconstruction of a Probabilistic Boolean Network from time series using Best-Fit extension. Microarray measurements are usually represented as matrices of real-valued numbers which, for example, quantify the expression levels of genes. \texttt{BoolNet} includes a real-valued time series of gene measurements from a project to analyze the yeast cell cycle \cite{spellman98} which can be loaded using <<>>= data(yeastTimeSeries) @ This data contains four preselected genes and a series of 14 measurements for each of these genes. In a first step, the real-valued dataset has to be converted to binary data as required by the reconstruction algorithm. \texttt{BoolNet} offers several binarization algorithms in the function \texttt{binarizeTimeSeries()}. We here employ the default method which is based on $k$-means clustering (with $k=2$ for active and inactive): <<>>= binSeries <- binarizeTimeSeries(yeastTimeSeries) @ The returned structure in \texttt{binSeries} has an element \texttt{\$binarizedMeasurements} containing the binary time series, and, depending on the chosen binarization method, some other elements describing parameters of the binarization. To reconstruct the network from this data, we call the Best-Fit Extension algorithm: <<>>= net <- reconstructNetwork(binSeries$binarizedMeasurements, method="bestfit", maxK=4) @ Here, \texttt{maxK} is the maximum number of input genes for a gene examined by the algorithm. The higher this number, the higher is the runtime and memory consumption of the reconstruction. \begin{samepage} We can now take a look at the network using <<>>= net @ \end{samepage} The dependencies among the genes in the network can be visualized using the \texttt{plotNetworkWiring()} function. In this graph, each gene corresponds to a vertex, and the inputs of transition functions correspond to edges. <<>>= plotNetworkWiring(net) @ plots a graph similar to that in Figure~\ref{fig:wiring}. To use this function, you must install the \texttt{igraph} package. \begin{figure}[h] \centering \includegraphics[width=0.65\linewidth]{wiring} \caption{The wiring graph of the reconstructed network. Each node of the graph represents one gene, and each arrow represents a gene dependency.} \label{fig:wiring} \end{figure} A network that involved the same genes was examined by Kim et al. \cite{kim07}. When comparing the wiring graph of our reconstructed network with the reference network presented in Figure~2 of this paper, one observes a very high similarity between the two networks. When \texttt{reconstructNetwork()} discovers multiple functions for a gene with the minimum error on the input data, it includes all of these functions as alternative functions with equal probability. Consequently, the function returns a \texttt{ProbabilisticBooleanNetwork} structure. If you would like to obtain a \texttt{BooleanNetwork} object with only one function per gene from a probabilistic network, you can extract such a network by telling the software which of the functions you would like to use. For example, <<>>= singleNet <- chooseNetwork(net, c(1,2,3,2)) @ creates a Boolean network by extracting the first function of gene Fkh2, the second function of genes Swi5 and Clb1, and the third function of gene Sic1 from the above probabilistic network: <<>>= singleNet @ \texttt{BoolNet} also supports the generation of artificial time series from existing networks: The \texttt{generateTimeSeries()} function generates a set of time series from a network using random start states and optionally adds Gaussian noise. <<eval=FALSE>>= series <- generateTimeSeries(cellcycle, numSeries=100, numMeasurements=10, noiseLevel=0.1) @ generates a list of 100 time series by calculating 10 consecutive transitions from 100 randomly chosen network states in the mammalian cell cycle network. The series are subject to Gaussian noise with a standard deviation of 0.1, such that the result is a list of real-valued matrices. We can now binarize these simulated measurements and try to reconstruct the original network: <<eval=FALSE>>= binSeries <- binarizeTimeSeries(series, method="kmeans") net <- reconstructNetwork(binSeries$binarizedMeasurements, method="bestfit") net @ \enlargethispage{0.5cm} \begin{verbatim} Probabilistic Boolean network with 10 genes Involved genes: CycD Rb E2F CycE CycA p27 Cdc20 Cdh1 UbcH10 CycB Transition functions: Alternative transition functions for gene CycD: CycD = <f(CycD){01}> (probability: 1, error: 0) Alternative transition functions for gene Rb: Rb = <f(CycD,CycE,CycA,p27,CycB){10100010001000100000000000000000}> (probability: 1, error: 0) Alternative transition functions for gene E2F: E2F = <f(Rb,CycA,p27,CycB){1010001000000000}> (probability: 1, error: 0) Alternative transition functions for gene CycE: CycE = <f(Rb,E2F){0100}> (probability: 1, error: 0) Alternative transition functions for gene CycA: CycA = <f(Rb,CycA,Cdc20,Cdh1,UbcH10){10100000111000000000000000000000}> (probability: 0.5, error: 5) CycA = <f(Rb,CycA,Cdc20,Cdh1,UbcH10){10100000111000000000000000000010}> (probability: 0.5, error: 5) Alternative transition functions for gene p27: p27 = <f(CycD,CycE,CycA,p27,CycB){10100010001000000000000000000000}> (probability: 1, error: 0) Alternative transition functions for gene Cdc20: Cdc20 = <f(CycB){01}> (probability: 1, error: 0) Alternative transition functions for gene Cdh1: Cdh1 = <f(CycA,p27,Cdc20,CycB){1011101100111011}> (probability: 1, error: 0) Alternative transition functions for gene UbcH10: UbcH10 = <f(CycA,Cdc20,Cdh1,UbcH10,CycB){11110001111100111111001111110011}> (probability: 0.5, error: 0) UbcH10 = <f(CycA,Cdc20,Cdh1,UbcH10,CycB){11110001111100111111001111110111}> (probability: 0.5, error: 0) Alternative transition functions for gene CycB: CycB = <f(Cdc20,Cdh1){1000}> (probability: 1, error: 0) \end{verbatim} Obviously, the number of generated time series is still to small to reconstruct the network unambiguously. However, the result comes close to the original network. \subsection{Creating random networks} To study structural properties of Boolean networks and to determine the specific properties of biological networks in comparison to arbitrary networks, it is often desirable to generate artificial networks. \texttt{BoolNet} comprises a facility for the generation of random $N$-$K$ networks \cite{kauffman69, kauffman93}. In the standard $N$-$K$ networks, $N$ is the total number of genes, and $K$ is the number of input genes for each gene transition function. Such a network can be generated using <<>>= net <- generateRandomNKNetwork(n=10, k=3) @ This creates a network with 10 genes, each of which has a transition function that depends on 3 genes and whose output is generated uniformly at random. Similarly, one can also specify different numbers of input genes for each gene: <<>>= net <- generateRandomNKNetwork(n=10, k=c(1,2,3,1,3,2,3,2,1,1)) @ \texttt{BoolNet} does not only support this standard case, but allows for different methods of choosing the numbers of input genes (parameter \texttt{topology}), the input genes themselves (parameter \texttt{linkage}), and the transition functions (parameter \texttt{functionGeneration}). In the following, some examples are presented. The command <<>>= net <- generateRandomNKNetwork(n=20, k=20, topology="scale_free") @ determines the numbers of input genes by drawing values from the scale-free Zeta distribution \cite{aldana03}. According to this distribution, most transition functions will have a small number of input genes, but a few transition functions may depend on a high number of genes. The shape of the Zeta distribution can be customized using an additional parameter \texttt{gamma}, which potentially increases the number of input genes when chosen small and vice versa. <<>>= net <- generateRandomNKNetwork(n=10, k=3, linkage="lattice") @ creates a network in which the transition functions of the genes depend on a choice of genes with adjacent indices \cite{aldana03_2}. This leads to networks with highly interdependent genes. It is also possible to influence the truth tables of the functions in several ways. The parameter \texttt{zeroBias} changes the ratio of 1 and 0 returned by the functions: <<>>= net <- generateRandomNKNetwork(n=10, k=3, functionGeneration="biased", zeroBias=0.75) @ generates a network in which the outcome of a transition function is 0 for around 75\% of the inputs. A more intricate way of influencing the function generation is the specification of a validation function. Validation functions can restrict the generated Boolean functions to certain classes by rejecting invalid functions. For example, \emph{canalyzing functions} are expected to be biologically plausible \cite{kauffman04}. A canalyzing function has the property that one input can determine the output value on its own, i.e. if this input is either active or inactive, the output of the function is always the same. We can specify a simple validation function that checks whether a Boolean function is canalyzing: <<>>= isCanalyzing <- function(input, func) { for (i in 1:ncol(input)) # check each input gene { inputGene <- input[,i] for (v in c(0,1)) # test for inputs 0 and 1 whether all output # values are the same { if (length(unique(func[inputGene == v])) == 1) # => this gene can determine the output on its own return(TRUE) } } # the function is not canalyzing return(FALSE) } @ \begin{sloppypar} Here, \texttt{input} is a matrix containing the input part of the transition table, and \texttt{func} is the output of the Boolean function. For each input gene, the function \texttt{isCanalyzing()} compares the output values when the gene is 0 and 1 and checks whether they are all equal. In this case, the function is canalyzing. If a validation function is supplied to \texttt{generateRandomNKNetwork()}, the generator generates Boolean functions until either the validation function returns \texttt{TRUE} or the maximum number of iterations (specified by the parameter \texttt{failureIterations}) is reached, in which case it fails. \end{sloppypar} <<>>= net <- generateRandomNKNetwork(n=10, k=3, validationFunction="isCanalyzing", failureIterations=1000) @ creates a network with 10 genes in which all functions have 3 inputs, of which at least one is canalyzing. By default, \texttt{generateRandomNKNetwork()} creates functions that cannot be simplified, i.e. that do not contain any genes that are irrelevant for the outcome of the function. If desired, this behaviour can be changed by setting \texttt{noIrrelevantGenes} to \texttt{FALSE}. The presented parameters can be combined, and there are further options and parameters, so that a broad variety of networks with different structural properties can be generated. For a full reference of the possible parameters, please refer to the manual. \subsection{Knock-out and overexpression of genes} \texttt{BoolNet} allows for temporarily knocking out and overexpressing genes in a network without touching the transition functions. This means that genes can be set to a fixed value, and in any calculation on the network, this fixed value is taken instead of the value of the corresponding transition function. Knocked-out and overexpressed genes speed up the analysis of the network, as they can be ignored in many calculations. For example, to knock out CycD in the mammalian cell cycle network, we call <<>>= data(cellcycle) knockedOut <- fixGenes(cellcycle, "CycD", 0) @ or alternatively use the gene index <<>>= knockedOut <- fixGenes(cellcycle, 1, 0) @ This sets the gene constantly to 0. To over-express the gene (i.e. to fix it to 1), the corresponding call is <<>>= overExpressed <- fixGenes(cellcycle, "CycD", 1) @ The command <<>>= originalNet <- fixGenes(knockedOut, "CycD", -1) @ reactivates the gene (for both knock and overexpression) and resets the network to its original state. The function also accepts multiple genes in a single call, such as <<>>= newNet <- fixGenes(cellcycle, c("CycD","CycE"), c(0,1)) @ which knocks out CycD and overexpresses CycE. \clearpage \section{Network analysis}\label{sec:networkanalysis} \subsection{Simulation of state transitions} To simulate a state transition and identify successor states of a given state, \texttt{BoolNet} includes the function \texttt{stateTransition()}. The function supports transitions for all three types of networks. The following code performs a synchronous state transition for the state in which all genes are set to 1 on the mammalian cell cycle network: <<>>= data(cellcycle) stateTransition(cellcycle, rep(1,10)) @ To calculate all state transitions in a synchronous network until an attractor is reached, you can call <<>>= path <- getPathToAttractor(cellcycle, rep(0,10)) path @ The returned matrix consists of the subsequent states until an attractor is reached. Depending on the optional parameter \texttt{includeAttractorStates}, the sequence comprises all attractor states, only the first attractor state or none of the attractor states. A sequence can be visualized by plotting a table of state changes: <<eval=FALSE>>= plotSequence(sequence=path) @ \begin{figure}[t] \centering \includegraphics[width=0.6\linewidth]{sequence} \caption{Visualization of a sequence of states. The columns of the table represent consecutive states of the time series. The last state is the steady-state attractor of the network} \label{fig:sequence} \end{figure} The result is depicted in Figure~\ref{fig:sequence}. \texttt{plotSequence()} also includes a shortcut that calculates the sequence directly if a network and a start state are supplied. It also provides an alternative way of visualizing the sequence as a state transition by setting \texttt{mode="graph"}. The function <<eval=FALSE,results=hide>>= sequenceToLaTeX(sequence=path, file="sequence.tex") @ creates a \LaTeX\ table similar to \texttt{plotSequence()} function document. In many cases, start states are defined by a set of active genes. Instead of supplying a full state vector, one can also supply only these active genes using the \texttt{generateState()} function. <<>>= startState <- generateState(cellcycle, specs=c("CycD"=1,"CycA"=1)) stateTransition(cellcycle,startState) @ calculates a state transition starting from a state where only the genes \emph{CycD} and \emph{CycA} are active, while all other genes are inactive (which is controlled by the \texttt{default} parameter of \texttt{generateState()}). A random asynchronous transition is performed using <<echo=FALSE>>= set.seed(54321) @ <<>>= stateTransition(cellcycle, rep(1,10), type="asynchronous") @ In this case, the fifth gene, CycA, was chosen at uniformly at random and updated. \begin{samepage} We can also specify non-uniform probabilities for the genes, for example <<echo=FALSE>>= set.seed(4321) @ <<>>= stateTransition(cellcycle, rep(1,10), type="asynchronous", geneProbabilities=c(0.05,0.05,0.2,0.3,0.05,0.05,0.05,0.05,0.1,0.1)) @ This obviously increases probabilities for the genes 3 and 4 (E2F and CycE) to be chosen. In this case, CycE was chosen for the update. \end{samepage} \enlargethispage{0.5cm} Sometimes you do not want a random update at all, but would like to specify which gene should be chosen for the update. This is possible via <<>>= stateTransition(cellcycle, rep(1,10), type="asynchronous", chosenGene="CycE") @ In probabilistic Boolean networks, a state transition is performed by choosing one of the alternative functions for each gene and applying this set of functions to the current state. The following performs a state transition with a randomly chosen set of functions on the artificial probabilistic Boolean network taken from \cite{shmulevich02} with 3 genes, starting from state (0,1,1): <<echo=FALSE>>= set.seed(432) @ <<>>= data(examplePBN) stateTransition(examplePBN, c(0,1,1), type="probabilistic") @ You may get a different result, as the functions are chosen randomly according to the probabilities stored in the network. If you would like to execute a specific set of transition functions, you can supply this in an additional parameter: <<>>= stateTransition(examplePBN, c(0,1,1), type="probabilistic", chosenFunctions=c(2,1,2)) @ This call uses the second function for gene x1 and x3 and the first function for gene x2. \pagebreak[4] \subsection{Identification of attractors} Attractors are stable cycles of states in a Boolean network. As they comprise the states in which the network resides most of the time, attractors in models of gene-regulatory networks are expected to be linked to phenotypes \cite{kauffman93,li04}. Transitions from all states in a Boolean network eventually lead to an attractor, as the number of states in a network is finite. All states that lead to a certain attractor form its {\em basin of attraction}. \texttt{BoolNet} is able to identify attractors in synchronous and asynchronous Boolean networks. There are three types of attractors in these networks: \begin{description} \item[Simple attractors]{occur in synchronous Boolean networks and consist of a set of states whose synchronous transitions form a cycle.} \item[Complex or loose attractors]{are the counterpart of simple attractors in asynchronous networks. As there is usually more than one possible transition for each state in an asynchronous network, a complex attractor is formed by two or more overlapping loops. Precisely, a complex attractor is a set of states in which all asynchronous state transitions lead to another state in the set, and a state in the set can be reached from all other states in the set.} \item[Steady-state attractors]{are attractors that consist of only one state. All transitions from this state result in the state itself. These attractors are the same both for synchronous and asynchronous update of a network. Steady states are a special case of both simple attractors and complex attractors.} \end{description} The \texttt{getAttractors()} function incorporates several methods for the identification of attractors. We present these methods using the included mammalian cell cycle network as an example. This network has one steady-state attractor, one simple synchronous attractor consisting of 7 states, and one complex asynchronous attractor with 112 states (see \cite{faure06}). We first demonstrate the use of exhaustive synchronous search. This means that the software starts from all possible states of the network and performs synchronous state transitions until a simple or steady-state attractor is reached. \enlargethispage{0.5cm} <<echo=FALSE>>= attr <- getAttractors(cellcycle) @ <<eval=FALSE>>= data(cellcycle) attr <- getAttractors(cellcycle) attr @ \begin{samepage} \begin{verbatim} Attractor 1 is a simple attractor consisting of 1 state(s) and has a basin of 512 state(s): |--<---------| V | 0100010100 | | | V | |-->---------| Genes are encoded in the following order: CycD Rb E2F CycE CycA p27 Cdc20 Cdh1 UbcH10 CycB \end{verbatim} \end{samepage} \begin{verbatim} Attractor 2 is a simple attractor consisting of 7 state(s) and has a basin of 512 state(s): |--<---------| V | 1001100000 | | | 1000100011 | | | 1000101011 | | | 1000001110 | | | 1010000110 | | | 1011000100 | | | 1011100100 | | | V | |-->---------| Genes are encoded in the following order: CycD Rb E2F CycE CycA p27 Cdc20 Cdh1 UbcH10 CycB \end{verbatim} Typing \texttt{attr} calls a special print method that presents the attractor in a human-readable way. Here, a state in an attractor is represented by a binary vector, where each entry of the vector codes for one gene. An alternative is to print only the names of the active genes (i.e., the genes that are set to 1) instead of the full vector by calling the \texttt{print()} method explicitly with a changed parameter: <<eval=FALSE>>= print(attr, activeOnly=TRUE) @ \begin{verbatim} Attractor 1 is a simple attractor consisting of 1 state(s) and has a basin of 512 state(s). Active genes in the attractor state(s): State 1: Rb, p27, Cdh1 Attractor 2 is a simple attractor consisting of 7 state(s) and has a basin of 512 state(s). Active genes in the attractor state(s): State 1: CycD, CycE, CycA State 2: CycD, CycA, UbcH10, CycB State 3: CycD, CycA, Cdc20, UbcH10, CycB State 4: CycD, Cdc20, Cdh1, UbcH10 State 5: CycD, E2F, Cdh1, UbcH10 State 6: CycD, E2F, CycE, Cdh1 State 7: CycD, E2F, CycE, CycA, Cdh1 \end{verbatim} We can see that the search identified both synchronous attractors. The \texttt{AttractorInfo} structure stores the attractors in an encoded form. The function \texttt{getAttractorSequence()} can be used to obtain the sequence of states that constitute a specific synchronous attractor as a table: <<>>= getAttractorSequence(attr, 2) @ retrieves the states that make up the second (i.e., the 7-state attractor) as a data frame with the genes in the columns and the successive states in the rows. The advantage of the exhaustive search method is that the complete transition table is calculated and stored in the return value. This table stores information that is used by a number of analysis methods described below. You can extract the transition table in a data frame and print it out using <<eval=FALSE>>= tt <- getTransitionTable(attr) tt @ \begin{verbatim} State Next state Attr. basin # trans. to attr. 0000000000 => 0110010111 1 4 [...] 1111111111 => 1000001110 2 1 Genes are encoded in the following order: CycD Rb E2F CycE CycA p27 Cdc20 Cdh1 UbcH10 CycB \end{verbatim} In the printed table, the first column denotes the initial state, the second column contains the state after the transition, the first column contains the number of the attractor that is finally reached from this state, and the fourth column lists the number of state transitions required to attain this attractor. A table of the same structure is returned by <<eval=FALSE>>= getBasinOfAttraction(attr, 1) @ which extracts all states from the transition table that belong to the basin of attraction of attractor one (i.e., whose attractor number in column 3 is 1). If you are interested in information on a single state (here: the state with all genes set to 1), you can type <<eval=FALSE>>= getStateSummary(attr, c(1,1,1,1,1,1,1,1,1,1)) @ \begin{verbatim} State Next state Attr. basin # trans. to attr. 1111111111 => 1000001110 2 1 Genes are encoded in the following order: CycD Rb E2F CycE CycA p27 Cdc20 Cdh1 UbcH10 CycB \end{verbatim} The visualization function \texttt{getStateGraph()} makes use of the transition table as well: It plots a transition graph in which the basins of attraction are drawn in different colors, and the attractors are highlighted. The result of <<>>= plotStateGraph(attr) @ is depicted in Figure~\ref{fig:stategraph}. The blue basin belongs to attractor 1, and the green basin belongs to attractor 2. \begin{figure}[p] \centering \includegraphics[width=0.75\linewidth]{stategraph} \caption{The state graph of the mammalian cell cycle network. Each node represents a state of the network, and each arrow is a state transition. The colors mark different basins of attraction. Attractors are highlighted using bold lines.} \label{fig:stategraph} \end{figure} The above call does not ensure that the basins of attraction are clearly separated in the plot. If this is desired, one can choose to use a piecewise layout, which means that the layouting function is applied separately to each basin of attraction, and the basins are drawn side by side. The result of <<>>= plotStateGraph(attr, piecewise=TRUE) @ is depicted in Figure~\ref{fig:piecewisestategraph}. \begin{figure}[p] \centering \includegraphics[width=0.65\linewidth]{piecewisestategraph} \caption{The state graph of the mammalian cell cycle network using a piecewise layout. Each node represents a state of the network, and each arrow is a state transition. The colors mark different basins of attraction. Attractors are highlighted using bold lines.} \label{fig:piecewisestategraph} \end{figure} Exhaustive search consumes a high amount of time and memory with increasing size of the network, which makes it intractable for large networks (\texttt{BoolNet} currently supports networks with up to 29 genes for exhaustive search due to memory restrictions in {\em R}). Therefore, \texttt{BoolNet} also allows for heuristic search of attractors, which works for larger networks as well. Heuristic synchronous search starts from a predefined small set of states and identifies the attractors to which state transitions from these states lead. The start states can either be supplied, or they can be calculated randomly. <<eval=FALSE>>= attr <- getAttractors(cellcycle, method="random", startStates=100) @ chooses 100 random start states for the heuristic search and usually identifies both attractors. <<eval=FALSE>>= attr <- getAttractors(cellcycle, method="chosen", startStates=list(rep(0,10),rep(1,10))) @ starts from the states \texttt{(0,0,0,0,0,0,0,0,0,0)} and \texttt{(1,1,1,1,1,1,1,1,1,1)} and again identifies both synchronous attractors. \begin{sloppypar} For the previous calls, only the subset of the transition table traversed by the heuristic is returned. This means that there is no guarantee that, e.g. \texttt{getBasinOfAttraction()} returns the complete basin of attraction of an attractor in heuristic mode. \end{sloppypar} Synchronous attractors can be visualized by plotting a table of changes of gene values in the states of the attractor: <<eval=FALSE>>= plotAttractors(attr, subset=2) @ plots the state changes of the simple attractor with 7 states, as depicted in Figure~\ref{fig:attractor1}. Similarly, <<eval=FALSE>>= attractorsToLaTeX(attr, subset=2, file="attractors.tex") @ exports the same state table to a \LaTeX\ document. \begin{figure}[t] \centering \includegraphics[width=0.65\linewidth]{attractor1} \caption{Visualization of the state changes in an attractor. The columns of the table represent consecutive states of the attractor. On top, the percentage of states leading to the attractor is supplied.} \label{fig:attractor1} \end{figure} To identify asynchronous attractors, another special heuristic algorithm is included. This algorithm again starts from a small subset of states and makes a number of random transitions to reach an attractor with a high probability. After that, a validation step is performed to analyze whether a complex attractor has been identified. The command <<eval=FALSE>>= attr <- getAttractors(cellcycle, type="asynchronous", method="random", startStates=500) @ conducts an asynchronous search with 500 random start states on the mammalian cell cycle network. In this case, the algorithm has identified both the steady-state attractor and the complex attractor: \enlargethispage{0.5cm} <<eval=FALSE>>= attr @ \begin{verbatim} Attractor 1 is a simple attractor consisting of 1 state(s): |--<---------| V | 0100010100 | | | V | |-->---------| Genes are encoded in the following order: CycD Rb E2F CycE CycA p27 Cdc20 Cdh1 UbcH10 CycB Attractor 2 is a complex/loose attractor consisting of 112 state(s) and 338 transition(s): 1011101111 => 1011101110 [...] 1000000000 => 1010000000 Genes are encoded in the following order: CycD Rb E2F CycE CycA p27 Cdc20 Cdh1 UbcH10 CycB \end{verbatim} For the complex attractor, the involved transitions are printed out. By default, the algorithm tries to avoid self-loops, i.e. transitions that lead to the same state again. This means that self-loop transitions are only allowed if there is no other transition that leads to a different state. If you would like to allow the algorithm to enter self-loops even if transitions to different states are possible, you can call <<eval=FALSE>>= attr <- getAttractors(cellcycle, type="asynchronous", method="random", startStates=500, avoidSelfLoops=FALSE) @ In the resulting complex attractor with 112 states, there are 450 transitions instead of 338 transitions, which is due to the additional self-loops. The asynchronous heuristic search does not return a transition table, such that the above analysis methods cannot be applied here. As there are multiple possible transitions for each state, complex attractors cannot be visualized as in Figure~\ref{fig:attractor1}. For this reason, \texttt{plotAttractors()} supports a graph mode that visualizes the transitions among the states in the attractor: <<eval=FALSE>>= plotAttractors(attr, subset=2, mode="graph", drawLabels=FALSE) @ plots the 112-state attractor as depicted in Figure~\ref{fig:attractor2}. We omit the state labels (i.e. the gene values) due to the high number of states. This plot again requires the \texttt{igraph} package. \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{attractor2} \caption{Graph representation of the complex attractor in the mammalian cell cycle network. Each node represents a state of the complex attractor, and each arrow represents a state transition.} \label{fig:attractor2} \end{figure} \subsection{Markov chain simulations} Another way of identifying relevant states in Boolean networks are Markov chain simulations. Instead of identifying cycles explicitly, these simulations calculate the probability that a certain state is reached after a predefined number of iterations. Of course, states in an attractor have a high probability of being reached if the number of iterations is chosen large enough. Markov chain simulations for probabilistic Boolean networks were introduced by Shmulevich et al. \cite{shmulevich02}. As a special case of probabilistic Boolean networks, these simulations are also suited for synchronous Boolean networks. The following performs a Markov experiment with the predefined number of 1000 iterations on the example PBN described in \cite{shmulevich02}: \enlargethispage{-0.5cm} <<>>= data(examplePBN) sim <- markovSimulation(examplePBN) sim @ Only states with a non-zero probability are listed in the two tables. The first table shows the states that are reached after 1000 iterations. The second table is a transition table annotated with transition probabilities. This table can be suppressed by the parameter \texttt{returnTable=FALSE}. The results correspond exactly to those in \cite{shmulevich02}. If the transition table is included in the simulation results, we can plot a graph of the network: <<>>= plotPBNTransitions(sim) @ This graph is displayed in Figure~\ref{fig:pbntransitions}. The vertices are the states of the graph. The edges represent transitions and are annotated with the corresponding transition probabilities. For this plot, the \texttt{igraph} package must be installed. \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{pbntransitions} \caption{State transition graph of the example probabilistic Boolean network included in \texttt{BoolNet}. Each node represents a state of the network, and each arrow is a possible state transition, annotated by the transition probability.} \label{fig:pbntransitions} \end{figure} We can also use Markov chain simulations to identify the attractor states in the mammalian cell cycle network: \begin{samepage} <<>>= data(cellcycle) sim <- markovSimulation(cellcycle, numIterations=1024, returnTable=FALSE) sim @ \end{samepage} We set the maximum number of iterations to 1024, which is the number of states in the network. In a deterministic network, this guarantees that all states are found. The fourth state in the returned table is the steady-state attractor identified previously. It has a probability of 0.5, as the basin of attraction is exactly half of the states. The other 7 states belong to the simple synchronous attractor. It is also possible to restrict the simulation to a certain set of input states instead of using all possible input states. In the following example, we only consider the state with all genes set to 1, and identify the state belonging to the steady-state attractor again: \begin{samepage} <<>>= sim <- markovSimulation(cellcycle, numIterations=1024, returnTable=FALSE, startStates=list(rep(1,10))) sim @ \end{samepage} \subsection{Perturbation experiments} The generation of perturbed copies of a network is a way to test the robustness of structural properties of the networks to noise and mismeasurements. For example, you could assess the relevance of an attractor by checking whether the same attractor is still found when small random changes are applied to the network. If this is the case, it is less likely that the attractor is an artifact of mismeasurements. \texttt{BoolNet} includes a set of different perturbation options that can be combined. For example, <<>>= data(cellcycle) perturbedNet <- perturbNetwork(cellcycle, perturb="functions", method="bitflip") @ chooses a function of the network at random and flips a single bit in this function. By setting the parameter \texttt{maxNumBits}, you can also flip more than one bit at a time. Instead of flipping bits, <<>>= perturbedNet <- perturbNetwork(cellcycle, perturb="functions", method="shuffle") @ randomly permutes the output values of the chosen transition functions. This preserves the numbers of 0s and 1s, but may change the Boolean function completely. These kinds of perturbations are supported for synchronous and asynchronous networks as well as for probabilistic networks. For synchronous networks, a further perturbation mode is available: <<>>= perturbedNet <- perturbNetwork(cellcycle, perturb="states", method="bitflip", numStates=10) @ Here, \texttt{BoolNet} calculates the complete transition table of the network and then flips a single bit in 10 states of the transition table. From this modified table, a network is reconstructed. Changes of this type only affect a few states (which might not be the case when perturbing the functions directly as above), but possibly several of the transition functions. As in the previous examples, it is also possible to modify the number of bits to be flipped or to choose \texttt{method="shuffle"}. A detailed listing of perturbation experiments is shown on page~\pageref{alg:perturbation}. In this experiment, 1000 perturbed copies of the cell cycle network are created, and the occurrences of the original synchronous attractors are counted in the perturbed copies. \begin{samepage} The results of such an experiment could look like this: \begin{verbatim} Attractors in original network: Attractor 1 is a simple attractor consisting of 1 state(s) and has a basin of 512 state(s): [...] Attractor 2 is a simple attractor consisting of 7 state(s) and has a basin of 512 state(s): [...] Number of occurrences of the original attractors in 1000 perturbed copies of the network: Attractor 1: 622 Attractor 2: 589 \end{verbatim} \end{samepage} We see that the steady-state attractor is slightly more robust to perturbations than the simple attractor with 7 states, as it can be identified in a higher number of perturbed copies. \newpage \enlargethispage{2cm} \begin{footnotesize}\label{alg:perturbation} <<eval=FALSE>>= # Perform a robustness test on a network # by counting the numbers of perturbed networks # containing the attractors of the original net library(BoolNet) # load mammalian cell cycle network data(cellcycle) # get attractors in original network attrs <- getAttractors(cellcycle, canonical=TRUE) # create 1000 perturbed copies of the network and search for attractors perturbationResults <- sapply(1:1000, function(i) { # perturb network and identify attractors perturbedNet <- perturbNetwork(cellcycle, perturb="functions", method="bitflip") perturbedAttrs <- getAttractors(perturbedNet, canonical=TRUE) # check whether the attractors in the original network exist in the perturbed network attractorIndices <- sapply(attrs$attractors,function(attractor1) { index <- which(sapply(perturbedAttrs$attractors, function(attractor2) { identical(attractor1, attractor2) })) if (length(index) == 0) NA else index }) return(attractorIndices) }) # perturbationResults now contains a matrix # with the first 2 columns specifying the indices or the # original attractors in the perturbed network # (or NA if the attractor was not found) and the next 2 # columns counting the numbers of states # in the basin of attraction (or NA if the attractor was not found) # measure the total numbers of occurrences of the original attractors in the perturbed copies numOccurrences <- apply(perturbationResults[1:length(attrs$attractors),,drop=FALSE], 1, function(row)sum(!is.na(row))) # print original attractors cat("Attractors in original network:\n") print(attrs) # print information cat("Number of occurrences of the original attractors", "in 1000 perturbed copies of the network:\n") for (i in 1:length(attrs$attractors)) { cat("Attractor ",i,": ",numOccurrences[i],"\n",sep="") } @ \end{footnotesize} \newpage \subsection{Identifying specific properties of biological networks} The described perturbations could also be used to identify specific properties of real-world networks in comparison to arbitrary (random) networks. For example, one could assume that attractors in biological networks are more robust to perturbations than attractors in random networks with a similar structure, as they should be capable of compensating for small dysfunctions of their components. Similarly to the above code, one could execute a number of random perturbations on the biological network and measure the percentage of original attractors found in the perturbed copies. Afterwards, one could repeat this process on a number of randomly generated networks -- i.e., generate perturbed copies from each of the random networks, and measure the percentage of attractors in the copies. If the percentage of the biological network is higher than most of the percentages of the random network, this suggests that the biological network exhibits a higher robustness. This is a kind of computer-intensive test. \texttt{BoolNet} comprises a generic facility for such computer-intensive tests. This facility already includes two tests for synchronous Boolean networks and can be extended by custom test functions. The outlined example of attractor robustness is one of the integrated functions: <<eval=FALSE>>= data(cellcycle) testNetworkProperties(cellcycle, numRandomNets=100, testFunction="testAttractorRobustness", testFunctionParams = list(copies=100)) @ creates a set of 100 random networks (each with the same number of input genes for the functions as the cell cycle network) and creates 100 perturbed copies for each of these networks and for the cell cycle network. It then measures the percentages of found attractors and plots an histogram of the percentages of the random networks (see Figure~\ref{fig:robustness}). The percentage of the cell cycle network is plotted as a red line, and the 95\% quantile is plotted as a blue line. \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{robustness} \caption{Attractor robustness of randomly generated networks (histogram) in comparison to the mammalian cell cycle network (red line).} \label{fig:robustness} \end{figure} We can see that the average percentage of found attractors is significantly higher in the biological network with a $p$-value of 0.03. A second network property can be tested using a built-in function: When looking at the state graph of a biological network (which can be generated using \texttt{plotStateGraph()}), it can often be observed that many state transitions lead to the same successor states, which means that the dynamics of the network quickly concentrate on a few states after a number of state transitions. We call the number of states whose synchronous state transitions lead to a state $s$ the {\em in-degree} of state $s$. We expect the biological network to have a few states with a high in-degree and many states with a low in-degree. A characteristic to summarize the in-degrees is the Gini index, which is a measure of inhomogeneity. If all states have an in-degree of 1, the Gini index is 0; if all state transitions lead to only one state, the Gini index is 1. <<eval=FALSE>>= testNetworkProperties(cellcycle, numRandomNets=100, testFunction="testIndegree") @ plots an histogram of Gini indices in 100 random networks and draws the Gini index of the cell cycle network as a red line, as depicted in Figure~\ref{fig:indegree}. \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{indegree} \caption{Gini indices of state in-degrees of randomly generated networks (histogram) in comparison to the mammalian cell cycle network (red line)} \label{fig:indegree} \end{figure} The histogram shows that the Gini index of the in-degrees is {\em always} higher in the biological network. This is probably due to the special structure of functions in biological networks. Instead of accumulating the in-degrees using the Gini index, it is also possible to compare the distributions of the in-degrees across the networks. For this purpose, the Kullback-Leibler distances of the in-degrees of the supplied network and each of the random networks are calculated and plotted in a histogram. The Kullback-Leibler distance (also called relative entropy) is an asymetric measure of similarity of two distributions \cite{cover91}. If the distributions are equal, the Kullback-Leibler distance is 0, otherwise it is greater than 0. <<eval=FALSE>>= testNetworkProperties(cellcycle, numRandomNets=100, testFunction="testIndegree", accumulation="kullback_leibler") @ results in the plot displayed in Figure~\ref{fig:indegree_kl}. \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{indegree_kl} \caption{Kullback-Leibler distances of in-degrees of the mammalian cell cycle network and 100 random networks.} \label{fig:indegree_kl} \end{figure} It is possible to switch between the histogram of an accumulated characteristic (e.g. the Gini index) and the histogram of the Kullback-Leibler distances for all tests. You can also easily implement your own tests. To do this, the only thing you have to do is implement a custom testing function that replaces \texttt{testIndegree()} or \texttt{testAttractorRobustness}. Testing functions have the following signature: \begin{verbatim} function(network, accumulate=TRUE, params) \end{verbatim} The first parameter is the network that should be tested. The parameter \texttt{accumulate} specifies whether a single characteristic value (e.g., the Gini index of the in-degrees) should be calculated, or whether a distribution of values (e.g., a vector of all in-degrees) should be returned. The third parameter is a list of further arguments needed by your function. If, for example, we would like to compare the sizes of the basins of attractions of synchronous attractors in biological and random networks, we would write a function like this: \begin{samepage} <<>>= testBasinSizes <- function(network, accumulate=TRUE, params) { attr <- getAttractors(network) basinSizes <- sapply(attr$attractors, function(a) { a$basinSize }) if (accumulate) return(mean(basinSizes)) else return(basinSizes) } @ \end{samepage} This function calculates the mean basin size as a characteristic value if accumulation is required, or returns the sizes of all basins of attraction in a vector otherwise. It does not need any further parameters in \texttt{params}. Now, we can start a test using <<eval=FALSE>>= testNetworkProperties(cellcycle, numRandomNets=1000, testFunction="testBasinSizes", xlab="Average size of basins of attraction") @ to produce the plot shown in Figure~\ref{fig:basinsize}. Apparently, the average basin sizes do not differ as much as the built-in test characteristics between the random networks and the cell cycle network. \begin{figure}[h] \centering \includegraphics[width=0.5\linewidth]{basinsize} \caption{A custom test statistic measuring the basin sizes on randomly generated networks (histogram) and the mammalian cell cycle network (red line).} \label{fig:basinsize} \end{figure} \begin{sloppypar} By writing custom test functions, you can extend the test facility to perform a wide variety computer-intensive test. Of course, it is also possible to plot the Kullback-Leibler distances with such new methods by using \verb+accumulation="kullback_leibler"+. \texttt{testNetworkProperties()} accepts most of the parameters of \texttt{generateRandomNKNetwork()}. If necessary, you can generate more specialized kinds of random networks which resemble the original network in certain aspects, for example by setting a proportion of 0 and 1 in the function outputs similar to the original network using \verb+functionGeneration="biased"+. \end{sloppypar} \clearpage \section{Import and export}\label{sec:importexport} \subsection{Saving networks in the \texttt{BoolNet} file format} Corresponding to the \texttt{loadNetwork()} command, a network can be saved using \texttt{saveNetwork()}. This stores the network in the network file format described in Section~\ref{sec:appendix}. For example, the cell cycle network can be saved using <<>>= saveNetwork(cellcycle, file="cellcycle.txt") @ \begin{sloppypar} The function stores the expressions that describe the transition functions. In some cases, there may not always be a valid symbolic description of the networks (e.g. for networks returned by \texttt{generateRandomNKNetwork()} when the \texttt{readableFunctions} parameter was not set). In this case, \texttt{saveNetwork()} can generate symbolic representations of the transition functions in Disjunctive Normal Form (DNF): \end{sloppypar} <<>>= net <- generateRandomNKNetwork(n=10, k=3, readableFunctions=FALSE) saveNetwork(net, file="randomnet.txt", generateDNF=TRUE) @ The \texttt{generateDNF} parameter can also be used to detail which type of DNF formulae should be exported: \texttt{generateDNF="canonical"} exports canonical DNF formulae. \texttt{generateDNF="short"} minimizes the canonical functions by joining terms. By simply setting \texttt{generateDNF=TRUE}, formulae with up to 12 inputs are minimized, and formulae with more than 12 inputs are exported in a canonical form, as a minization is very time-consuming in this case. \subsection{Import from and export to SBML} \begin{sloppypar} \texttt{BoolNet} provides an interface to the widely used Systems Biology Markup Language (SBML) via the import function \texttt{loadSBML()} and the export function \texttt{saveSBML()}. As the core SBML does not fully support Boolean models, import and export of SBML models is based on the \texttt{sbml-qual} package which extends SBML by several qualitative modeling approaches, such as general logical models and Petri nets. For a full description of \texttt{sbml-qual}, refer to \href{http://sbml.org/Community/Wiki/SBML_Level_3_Proposals/Qualitative_Models}{http://sbml.org/Community/Wiki/SBML\_Level\_3\_Proposals/Qualitative\_Models}. \end{sloppypar} \texttt{BoolNet} only supports a subset of \texttt{sbml-qual}. It can read and write logical models with two possible values for each state, which are equivalent to Boolean networks. Logical models with more than two values for a gene or Petri nets cannot currently be handled by \texttt{BoolNet}. An export to SBML is usually not associated with any loss of information. For example, we can write the cell cycle network to a file and re-import it into \texttt{BoolNet}: \begin{footnotesize} <<>>= toSBML(cellcycle, file="cellcycle.sbml") sbml_cellcycle <- loadSBML("cellcycle.sbml") sbml_cellcycle @ \end{footnotesize} Apart from some additional brackets, the re-imported network coincides with the original network. Similar to the \texttt{saveNetwork()} function, \texttt{toSBML()} exports a symbolic representation of the network transition functionss, which may not always be available. As for \texttt{saveNetwork()}, there is a parameter \texttt{generateDNF} that can be set to generate a symbolic representation in Disjunctive Normal Form from the truth tables. \subsection{Importing networks from BioTapestry} BioTapestry is a widely-used application for visual modeling of gene-regulatory networks \cite{longabaugh05}. It can be freely accessed at \url{http://www.biotapestry.org}. Although its primary purpose is visualization, the software supports specifying logical functions for the genes. \texttt{BoolNet} can read in the top-level (``Full genome'') plot of a BioTapestry file (*.btp) and convert it into a Boolean network. As an example, we assume the following BioTapestry model with 5 genes (2~inputs and 3~dependent genes): \begin{center} \includegraphics[width=0.8\linewidth]{biotap_model} \end{center} The corresponding BioTapestry file is included in \texttt{BoolNet}. You can determine its path using <<eval=FALSE>>= system.file("doc/example.btp", package="BoolNet") @ \label{cmd:example.btp} to access it in BioTapestry or \texttt{BoolNet}. For the import, \texttt{BoolNet} needs to know the type of influence a gene has on another gene. Therefore, imported networks should only use links that are either enhancers or repressors. Neutral links are ignored in the import. We now set further simulation parameters for the model. These parameters are imported by \texttt{BoolNet} to construct the functions of the Boolean network. First, we want to change the function of Gene~2 to \texttt{OR}. Right-click on Gene~2 and choose \texttt{Simulation Properties...}. \begin{center} \includegraphics[width=0.8\linewidth]{biotap_sim_properties} \end{center} In the properties dialog, choose the \texttt{Logic} tab, and select \texttt{OR} for the logical function. \begin{center} \includegraphics[width=0.8\linewidth]{biotap_logic} \end{center} Now set the function of Gene~1 to \texttt{XOR} (exclusive or) in the same way. \begin{samepage} You can also specify initial values for constant genes, i.e., genes with no input links. Choose the simulation properties of Input~1, and change to the \texttt{Parameters} tab. Choose \texttt{initVal} and set it to 1. \begin{center} \includegraphics[width=0.8\linewidth]{biotap_initval} \end{center} \end{samepage} Press Return to store the result, and exit the dialog with \texttt{OK}. This will create a fixed gene with value 1 (i.e., an over-expressed gene) in the \texttt{BoolNet} import. Note that values other than 0 and 1 are ignored by the import, as well as initialization values for non-constant genes. We assume that you save the network to a file ``example.btp'' in your working directory. In \texttt{R}, type <<>>= net <- loadBioTapestry("example.btp") @ to import the network. Alternatively, replace the file name by the command on page~\pageref{cmd:example.btp} to use the file in the package if you do not want to create the file yourself. The imported network looks like this: <<eval=FALSE>>= net @ \begin{verbatim} Boolean network with 5 genes Involved genes: Input 1 Input 2 Gene 1 Gene 2 Gene 3 \end{verbatim} \pagebreak[4] \begin{verbatim} Transition functions: Input 1 = 1 Input 2 = Input 2 Gene 1 = (!Gene 1 & !Input 1 & Input 2) | (!Gene 1 & Input 1 & !Input 2) | (Gene 1 & !Input 1 & !Input 2) | (Gene 1 & Input 1 & Input 2) Gene 2 = Gene 1 & Gene 3 & !Input 2 Gene 3 = Gene 1 | Gene 2 Knocked-out and over-expressed genes: Input 1 = 1 \end{verbatim} We can see that Input~1 is specified as an over-expressed constant gene. Input~2 is modeled as depending only on itself, i.e. it keeps its initial value. Gene~1 is a representation of the XOR function in Disjunctive Normal Form (DNF), using only logical ANDs, logical ORs, and negations. Gene~2 and Gene~3 consist of conjunctions and disjunctions of their inputs respectively. In addition to this textual description, we can visually verify the network by plotting its wiring: <<eval=FALSE>>= plotNetworkWiring(net) @ The resulting plot is shown in Figure~\ref{fig:wiring_biotap}. \enlargethispage{1cm} \begin{figure}[h] \centering \includegraphics[width=0.6\linewidth]{wiring_biotap} \caption{The wiring graph of the imported network specified in BioTapestry.} \label{fig:wiring_biotap} \end{figure} You can now use the imported network just like any other network in \texttt{BoolNet}. \clearpage \subsection{Exporting network simulations to Pajek} For further analysis, network simulations can be exported to Pajek, a Windows application that provides visualization and analysis methods for graph structures \cite{batagelij98}. For more information on Pajek, please refer to \url{http://pajek.imfm.si/doku.php}. The export function writes the state transition graph to a Pajek file (*.net). This requires a synchronous exhaustive attractor search in \texttt{BoolNet} to build the full transition table. To export the mammalian cell cycle network to Pajek, call <<eval=FALSE>>= data(cellcycle) attr <- getAttractors(cellcycle) toPajek(attr, file="cellcycle.net") @ This will export the graph of the state transitions, which is usually sufficient for plotting. If you want to include the state information (i.e., the gene assignment vectors), call <<eval=FALSE>>= toPajek(attr, file="cellcycle.net", includeLabels=TRUE) @ Now, start Pajek, load the network with \texttt{File | Network | Read}, and check out the tools provided by this application. For example, visualizations can be accessed using the menu item \texttt{Draw | Draw}. Figure~\ref{fig:pajek} shows a plot of the cell cycle network with the Kamada-Kawai layout (Menu entry \texttt{Layout | Energy | Kamada-Kawai | Separate Components}). \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{pajek} \caption{A visualization of the mammalian cell cycle network in Pajek.} \label{fig:pajek} \end{figure} \clearpage \bibliographystyle{plain} \bibliography{BoolNet_package_vignette} \section{Appendix}\label{sec:appendix} \subsection{Network file format} This section provides a full language description for the network file format of \texttt{BoolNet}. The language is described in Extended Backus-Naur Form (EBNF). \begin{verbatim} Network = Header Newline {Rule Newline | Comment Newline}; Header = "targets" Separator "factors" [Separator "probabilities"]; Rule = GeneName Separator BooleanExpression [Separator Probability]; Comment = "#" String; BooleanExpression = GeneName | "!" BooleanExpression | "(" BooleanExpression ")" | BooleanExpression " & " BooleanExpression | BooleanExpression " | " BooleanExpression; GeneName = ? A gene name from the list of involved genes ?; Separator = ","; Probability = ? A floating-point number ?; String = ? Any sequence of characters (except a line break) ?; Newline = ? A line break character ?; \end{verbatim} \end{document} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/BoolNet_package_vignette.pdf�������������������������������������������������������0000654�0001762�0000144�00002315152�12122071104�020753� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.5 % 100 0 obj << /Length 1202 /Filter /FlateDecode >> stream xXr7+8Sƒu˛T$ьHCz%nt)Ҧ\8{x %)ׅpN+ʖ]%e jkYh\.GSxnG-[ak  )EVa־N{C}Kz쌡1frC gbP o�oE~89ƣ Ź/Sϸ?Aʧ޿i\1BFF@Ю\\$ɰZ&Œ-8"Lj% ^1cmi-E)kAR7Y D|UZFa% !eլ#j!1񴏜@B"fL*I~Ÿy!2N}6e�ApT@'1]҅+eG*#ÅE0f\QaOq)hSl]ńprB#&{eYKZ�J- =/D" h'AX]Nnw7tПtjoO:R `@8x(1» YDD-o佤dngwM. 4? K�/$ȬG\澢2_DKŠnJ$ѹ㼏遼o6R$5hK_mvmt^f <ܾR6Ts#z5bAȟ4hE{l?lqЛtM Y@ g`w}hv4�>xJGwUHq|suO޶KzEՔ Dt#r4˶ipeSJhTԹ\EnQPtqΛJ(ݜ؆ ]3U2PZAtf'{eh�LXx@'M{xXr:,q!N1½9 4-eqU#1&k O3; ui19b߅h{- g8YN@}@6 oI?p8ON7P[.>DZZŞ|yv")wUeximwK5}&Nu/Gݻ5y&E,uyx0O5hk~jCgi0J+> v|xi endstream endobj 114 0 obj << /Length 3309 /Filter /FlateDecode >> stream xYo=BpN7X) h E,X N_,iԜ}WN85HeԤ\N9釙nfZN;xfsx}ZǪ]항'hrx`5+ GJ>=mGK;VԍЍh gsݴ/Lzyfa~nhX�?l؏u;z1Z Ǎ5 !ό><hOv} ֮ßӞ{W/z}'R(:y_pshA N/ & x %eAXWC|K� ;<3OumA$pm ^K<༚gobEQa vUtZcL%IWw~Q=mw|:1ߣ\-PO+Rn DGV,Bp-}i(kԢ1{ջ{oKȻCmn٣J&<<E2g` ,* :�]MVH&uh/QLp0�|88tF,H�+̏=0z?K ?ϬeYY=(R R3D/,N2JX8 +eDe\'p={,Z<aKI?񣎏w<.UvuZVO3 F-bk([6@2*roCg-vRU!W^l"/KTG r^=9zwVZT(IYi3 wE^[,H vbVhyb^/IieymemN i7!2N& /،־{vD'}b#c\ˋ]pUq �m�UfF'ьlQ2yrǧ@?x1F% Ko3E]ItzF>/cT�ם08UD)NT&)J@k UJNCA=,Wf+\S4]apFkhx]?y+cxcA`R Ⅽäؠ=,O$$r_2?=8|R|qTJ,5.4?@#<Ӝ NFp~e ڣ = ?6! J Uc_<k U;V1!AжPf\ o8% 68<PU8|<~,Z ml2|e䛋NܼHɃc|Upς0cH+"OIE~7b=g$4`JR@*47Zܓ>a d$k7@ʌǺOU1 ֥*pYO Z?0P9f~3*Z -pO zk+i(MtCc xK*`E0PN8t@+3r: ff┟! 1k S+^ω6=nA^x .\Ǿ?* vmL1.p1.@4cX$KQC,idC3RMp`ZNɡv'V$s3xmV4d)lyѬGE4U_]I9gdOƋiįT∨~oݒH�F?T O{=j:UV nV|I+9^BCAIT8$Tvau2ZRxpͥ~@ь6S!HEݦJNSUŠ7<Z�! d~M�bUȠD)[JDU1{au{0TC5ާkt栻hټu=vpY!&r{$MW*/FK,m0T0|}䛇Le)N*A~p0@s+m<<nrJ40M� y\,%5h,y!F߇KI `m$z�Wz^GPSOjցßnT�aVumDPR&ta< a 2B~)qb*Eu E<\#S: sȽ}˾;"]Lj$BTyETBs]�4rq˒BX q acGuBn Ncc; `<x"iHvǾYAˆ" Y$h1$B:ILC>JҲgB$*^� Z8Y2 0iH3&vkZ6-OkF!IX` my1d‡OByNr)seᦔyy^C<{m/Scg0<x(py kQ|DɐY\ͼaSNBTdR^`xӯ\)*|!�4+ڞy#f+|ZUB;in&2>w\5�y%ƝiA z=$P L/hCNޕzۗt>ƒCӗ7ȋ2!- T,oIJH妈fTUNݗ3w^ TӈBp~)^b]ߌ\)�M+B &}G{gH:!r7mt!Jg^qzN6,޻1"ՕUӧѪp\bGݗj8BmZEydP|=(֔,? ɒot-ࢽm%7]J tT)+9p31UR^a /|ޕ -wyqMЇA%[}@ܳ_FeSq818?-IY?O YیUs.$cE5sTX?TuY Z}~K+:*Es ᴈFNCCeN謲j:鮩 7襰4ّuxc+z T`r{&5CZ /D/,ũ?ho԰:266b/C:#�sT×3TWk! S#jVچ+ef'j"b'g _ƨ*!s}�K҅O<-[ϔHk*ї,3!l-:FB_l6 endstream endobj 128 0 obj << /Length 2900 /Filter /FlateDecode >> stream xڝYo}' X1$g @آM $}IJVW"URZΙDId=}?||*OCa%EqR=<?n'uR-4dq0l .w_-i Np:-[{ Aqg }-߱�΁L W+_W~C2FgX'9^?tPenS3 P#IH7 ڞ¹>nKt I|Z8�Fl~eS} wxbrSБx%|HL,h?-:%U7 ((`3xQ ڡV1&$FOt'w{1@6C:g-41c0brW1�,#'bdA"0rSUU*$x=!& 3Eb+QU�%xOH$RS1=$dNXHW8~*Τ`̀bsU^&?L(K92UR(ܣ5Fg!11gBN% f6A%5Ijw@T1u7%q maKԦ?tz^8MX%cg 74BS$;a(ʽ@XVp'{ح{Ҳw\FT_ȓz_\*�DKX_;?!t#Sq;_3F`k՞hOSV5m퇳p鰤6Ɓzջf<vj;Wma,`ڲ^ZxkX(FoiTmBKLm4ԮI@ %4yz>;n4ȁF &`E9;%6,ԪYX]CJX 2n ΝD`ك]0~ٻgpP6='CO^7ޑK*xR 0 voD vxߖW fuNp0TҴ Lgwzw˫b=@Q?_yկZL^ ʀ1~%;cb_=�Eeg6im!ϵ3/6|-Wsu/5dv_"'$/Ug`${S_ǓZPBZٹ:$dD5v=O؝)tLlX<Il G7?fefaD<-VOK5(ʐ^P�buC9yyO`ߝ^KT.[&H@0t XLm?I[F8U$|#ފ=[͉b~lOF a8At>;ꎡQ(MQZ~/9a\j"_at9b.GyRνf8^,% ߚ?jp-, *\D R(+<cM7^| fa0/"x~TaӨ/Ӭr?0A"Edݸ/yYW#b&ͶPpbUV7`T4ODr2<kv;%YPέ=WE'?.H BGԉ5(u)^SNODe:"NrlWQ}!`<)~ƣu_(`ۊ,vde- =N;IV,AjQT |e 'ߚ3DйT-uڹĪ)Cz:I'X$v^hgA L,R'DS6fG8ҫ~Ø@e|� yX_EES8G6- g'W0v[Ґs9Evr}D7zQΨ'+(w s1 R_LK.MׇǽfHY\(UKife'{G:Z0;:F`hPJa씢-h mc$+z\oEowΊI0/t%Zؖ, l3H\MJ,B%�X<RྈAYqLC%d~ sl}aVZ0 5&qjpt NbD.ibhVcP31ZB #sA.9&Yy5iB^/5_d6sa{v4{Фy"Vܤp<%+ TF;%)<`3xhc+>('YXTFOƳ+M\ on t3rz@YݲB8|H 1}ةbfUkIJn>9CdS뻇7WK=C:=[%_>/v„#CN2m%&pV\\3vѴSgk=]9h4?/IΊsUqrtv]Qkv0;{B՚NBv+” cP\%EVK6r*r%Iҵ@A2|;*t|Sjov{ƞPwb.R JKM@[}:,ViDJy<,\)Yos&q5-~s>M -5I̳% o[" W? 3/xAP}GڿpLa ~Hi4'!&\&DDVTaD9AD!t]{4 {s�[imZpfEn]zAi.FY|\Tbm)}P w/BR\_bF6z_hųoSo mAXywEB˸M endstream endobj 133 0 obj << /Length 2249 /Filter /FlateDecode >> stream xYK6W(Te1$Ξf<-![-Ɂ#R+ROm~�%I9 It7]}1+23lE& 0 "SVٯ"5oXbX&o;�;5yơ[|<(/Op{_8fXlY%A^jkqZRiarT5_XfE4_]+rWee?tıw[|spq7T[-H֯6k>ͽ} LYq66b6"g/^"GihwY|-u gME -1v{T 8e ipI\Dgɶ4Y%@EX=rOfiZ {*oĠ[֭# b 70ȃe?y <ZӻO13N¶Cu8Y{r77h~]tcup$ ˭Qz{\M eEXm! Z2{_5} %@,cTkUZ"~P쿝/|#"P:kCwQKv߂l'iAz$/7]jjFUiN$ɶwFe.J8 . tB[#VBNC3dWQ/zrt/M˔%\NwTNt8(&p>by{I:_•�Mbf" GaAXw [xӥ^)NӜ7xrOH݈"ECc#+jb3gB\% 3S3)⾔$v:!lRcv7L~iZsa<rJm:! 9q:GC ”f:HH :d"V 2Y |rᕛ큟T%(Qg$6N%L͚>:yl`vjgM[ԐtwҧTr!{q#UʝLͯUe=fv;"yTcԼ'˒_%O HCRJIY64ޓîI {W[p3=Qj6+qci Z U^4DLwN 3%LrV'<-(?p`Er-!Ί&e9g"6<i87 fY瞿Jo.g%" z = ׊=xJx݂Gk7hrM/�74}DQF+ ^L\j /hH]Zh\s\J&Z2؊I鴂Cq S�8#oӉ؃ӕ2H&z*0,ZQ& #LD e}Q;k6m%&EED*õxkN vtH@jV dSTRiFx0rhpU" w:ۋ۷<|TaȮޥt1yqAA*g!H2cMZwڞ3LTIl+_&"Ap k$9ŞT'l^`Ya&j+?)ݠ (8 ~4L$I_&*4M`=[�6VˆV.s8tz{YYծ|�RL2(NǮSle~OtH;9jY›`w\|`Qy2vA=đ @J?Q.2d| 1!pk< AM/*u'{,GjTpƎX{Y`cnꎃn{#nJ> GE+QH.+ЄRL_Fwۙ7Zs5SU.maQ{@ae{~e sƞC#g!n[e;N{d+kpj9B) ν8"?Qvn79Bց ; Օs C8 DŵVp4ЈG Jku#{TǏ\1Yy Mrx^gQDM&ɼ"ՠĿ�hwlO;/y+jYVjnZKmga<W݋0upq9qJ$|\k_E1=4+\Id,20( qProWoe endstream endobj 142 0 obj << /Length 2576 /Filter /FlateDecode >> stream xڥ]o=BwX<rITQע ӗ\hIBI||.{;=W?=di5 Mgb򴜼nW;_LgQx7WOg&m'|5bT KSAgӅV<޶'yj2//,np5TIˣ?w;?0N|:ߦ> &0I:Y"El!UW?=$ifa 4c[I1O[ҨVO\\|⍠~߸x1=>B ~p7x�x)o 2~JXTI zC5po�6̀c,+L(\unދݐ>1fG�<_^v:�%z @h&(39 'f^m0 &}Ġ rCɊC̹tUFC1rt{t7�8+]qH7IJ4&EMx3u2wGTa`@E*Eag9NΜ'10 @\3<w7C9pXNc5|L-W2(` T?a+yE o.^xl#5~Kd c*TH<~ ?ztd0|)_ddd#Rua72#[)I:1=B?iɏ""R5#xE^䙚?;ȗ(ܒI|l 5B?ғ 3WT*"3rOgdB,0fΏBAwnK]Fhx־SISj[TUbvmIa%`~DL(&эrTǧ dpx/#/KrYH 3Ceqɐ83MsɶΡmPBpC>PZhC-8{�rDFхv'T K3qKN)M)XzCj^cor-٠evŖ@pM&FrG@ȞRJ|sLX^ilX4X&ˢZE1 3j0TS k5 +bvGc_G[v?{0GsRTTwЄuPdD8;�.hTVa^S@΁Gгt-pFxDF(RpJ)k%_\h${Wq jXWȉDRD-}8Be<ϩhQP< eBӓb>`e'qތ Jj>1@٧&d?p =Tk˲0/?xݟ#2\r)=ss|뒭&ϝ nI} -4v1O٨lђI=cIJ}`u<> -ԀG. o%E~3RMgw8MFnedWn7)ֺn2!TwWك^^;"uҡJB5MG|^7 ,8<ƃ&Q!'$U:8S>NdQL}SӝVQjY.ڬWbbcXq{QU-kdWrhG`7d{A;PPAmu=vQAmA*$�#[$ .̭ Pu.Uus,S6yJ䒃~t/pkC&XjD!99c{"]N$@\Pȍ&Vj Ģ )Hs qm E' FSto>*�O]M5FwE|Uk<Wpi*S?/5 Z΃eh IVXS9 +"Y/j 0٘W .+' zo{bThn�8_ik^"�Y5�<�xԤTkmF( ̰;E\> "/oJtrM-J n,Cne"ҥfn.W&;iC wcm)nvJdtZǎ@VJ pY NYx #J~8ϾYց7-o:<\�!m:j4QWna#aH$ӗdJ-UwKy@+nx}f*؟AN%?55/\Oj$"^lj9mlRp=,b|ى)ȺC>Nm"MQ w)Y0Ҭ|a1yJ5zw*sm.F|_1iUp3>4iDS55nFBP/[|hÆhEW^{ YOPuy#/%#)oǢQ2ƶ ܕ7&kX_׍zُepY|oE9hN +oOr| 9eYz?x endstream endobj 153 0 obj << /Length 1684 /Filter /FlateDecode >> stream xYK6WE2R$QϠ)Y4-Zd[k YMZw^f4AH9|C_,<f'a2[\͂02?~a>[g;<p6u~s7R?i+>U^$^i]3FS³^گ~+`=ȋLn(<~KkJaެ9ha%I<sY1*ɝ}I߰D=wa5wmErreBf0Uz{~]2cQ\<aՖ۱a N+0%NyYsX9H8<pw^q77\DB:E}da"nGN{} xGwUHwaKL@Ŗf%r8jUIAFWD>-H(,  $x.1J w#IlH( _v)-W+'?f B HX0g9IȆ:gxqB%`)+oن)fi`D$Y5` ĨfH&BXU }CiGHkrxi邓$\L9X}KXzbw̤W.(<J%t, e%g=nЬ&`;Ԍr5!6?�Z0P8 )WL̝%gsIoL}fS]/Vj4p>V¦!,TܑfHFB640н'VsoёsxyJK+mhAqp~ѹc0h2xbeuq%iGI=i K0RM!}j#v6`0G$-KD^1{9:Gʋ]vDb 1JcJ[g3qާ5b B>}k(*Hv҇_?QI_01/}u „GEq`Zt!:,5KRcF+t28~pTwa΍WLu"P!kc9ry"[{s0Q\ ,<Ȍ]N�>B.D;W;c]RnfM^DhDw @6ǔȐN=wK} <2pry3}O}д}˙:VmhS|@:D)wju9=7H,[4\a?<c6&c_9YCr2D_T9[?K֭IץUp@W<*e'TT Zk~W/eEDM䒠&]S𭾾fFk+1w}FXuJLg:.oy]eXkCJ"?̿WAbxUk2$o(1ZP4ZmWT6uEޮdurF& U-]X;rҵ7dGt tp{$99Ar/ˤN ݓ'4 endstream endobj 157 0 obj << /Length 1639 /Filter /FlateDecode >> stream xڭnFБ"p iE@IRKBJv}ېCJ{ 3oޛ/D&*au=Y݅֩% oIGJfYFJ[F'xAM~?>f<'J0@4 's8U~sr:FtX̷xAFP uA@qǖO4ѕKxU; pTbS/Sup:KmGVK< 27`%2ӯ630 * Ɖ7ȷG E>0}QxQ`YeSլ gӳ]1L'A5_& s+z"}V9ݭ#_�>nzb":81GQdd`RgֵwEZEOEVkP f.B{zOc>ƩiL Iڈ28c:cO8 MɎ*LD1#ӅwBxdH ў3H%oo6&e;ʤB6?,XoKؓoM󯜔D2Tc_(ұԌXu_T*r�EQ�5`pRwaTwx hX;SFt ϺD2׵_ƭs.TA9H!4?"A+9UI`N #6XpaPͨ.}scƋ}Kx)NgQlPqµ'Cpq"F|_( L;+v\LE ߸ڞEl/vGٔЉ^GixM="w)0?q?0afI6Yl Zq?@tDQŐ'vѦZG셆:Xˇ~(UVحÖ{d٭t%w p:Gɿ!EbCZr¥Εyiг^<߄ԅ=q3J]!%qm\R-F vӉ " ~-UM뤱f%u>) Ja+8];R2f8$an3mw&]@r :n/P\P|"bfQatDCl))eovqfC&X/�S3 <h2r"Ƃӌ֔{OT9~0 ^C[SY=eB֏`2Y<'Zab5 u7*GȅޖŁ P%hFֲ?CiCY > '*\. +mPɩ"هSՇfFNk2j}X0 ݗ؜hT_ٕK97~tv&mÏ.1qި=اc sQ^(FTtbwFB˟Kթ5u (Ԙn[ 'uH_;zܢZ۠-~Lnu qn&t5 Y~m]:jJ?{Ȍ_wc.zl`eڏ"3  7S(=G$ 0sY"ݿ_Y endstream endobj 149 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./wiring.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 161 0 R /BBox [87.01196 82.32669 445.7689 441.753] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 162 0 R >>/Font << /F1.0 163 0 R>> >> /Length 2678 /Filter /FlateDecode >> stream xKodWpl}m-@3$ 1Ə1?9nu;i 4#Ū:ES3-G{Z=VSJ^jҿiےJ%_O_Jzz)>??ZT{jt`˵K6p{1>r.j^[n8Z-l G^\[*e}IK"K-`$g%WeovYk0[[gۉOP\-qM޴]PAך Y{6e@Kl^Ҙᖷc`Sͼm%s>´E<|zΡݫ{C9L^LǪo@]@ 999Z^'-[#gyp9Q qA;^Fdc6<rN FSs&a=yF7Rl3Yzؗ8k">%<(BP>}^g|y4( w5$2c* ZK٣́~vY {ߕ<Y G84N$=2Mn4Zʼn^6keV7##Z+0̪^ˮ.ZC[s[;ut2&0e"Jݒ]H0],2O!tj˦d^FjuL/bR֠gp]X M1*V̐v8ŀSl1 /;� %Ms^E<T$o}2zF0` k 0-wlJЁORMUƽ RfF nY+S'Xnָ\LeF9Kb|e_|F!+n$H�jߑoJ  rP>ҼNm #P_UtSEψ"Tl?~J~;;vXݡ=Bo:z[muV7f@oiʷQHͥzK=z˸G-}-}Lo)CQz[m]gFtwBzkF-;0)Noh;;-uz{ގ{4Fmuw{' ~sz=z{qOoߣO>f8'Oo;7'>uFﻧwQNus*YW`"OuաUQmZ[TYs]֕0#LWrn6q_8|ZV-+(N1Lr`MKp˷:]` 7N*oq@ }kܷ ozHuF\pFH.\޲vh|B3Ӿsa;f^0o{Z6܅ ^K~ڼPZ܆ա^ >a.t셦 }F\ 8W eDľ/QFk _&)#ڒs+Vrcl{j}L:eduIuaElm(#۴!:R?|Iqk y1�Uf(%D[AJqK'A+*y,:τy)ٷ _0|''QLQYF,EpYx`m80oj6[]˦н&H[mǁK=FFSK1T:%Gr%Qճ I¯Q9EǓe)MX٥0vH1!U؉Щ05;ag<0LC5&aNL<~ ,-TSuPNӃi1e1S u6qyC胲QRS% iQhgtMLsC^ VǍM^gO]*jebW''L7W/iul4KQ|.WMM&$);XNVX,&KSQD6FS].6qSzʏؗݩ<LmO߄՛A�ug++M=u0{/"lHLobB)G  ^Dw?uS # SGI IL:Aދ,+7) (ސg'4Njciw\Fy RB.2܁p 0l0xg%ގDTmԻϏb}$<>#`Fi}_ dXb[GA^|޻A,<ss c8Oy9 @Oqfs]u? bCl ]3Br .P-]آ"bx{Z wg%Urbџ_3fĔ�Wub`,MKdϯ[éBW-IC5%d*ܝ(ҡq�$A4f V+(1v2I3ɲ�.<6^1,DSh$u*ŐvA(Ux|FqUHȐ@`XtE2!9 {ӹӸQg�H<M/7  Fg|qXKՖͺM/?RBݏ}K/NѓK[z7_MJ%]qP㩜,U9O:I endstream endobj 168 0 obj << /Length 171 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 793 /Length 2367 /Filter /FlateDecode >> stream xڽZmSH_nSW*U,Y.R|Pt%Yr1`6-h===3$ȒX-IAѓS$ I'%Q #(GJZH[Mʑ("Y1x`6d$t dh$9Ft;odD;<dBzLk(@NRa HC 2B ) A+ $eĪ)o_y1 oю.Yσ:G( ),)%"'@9 b j9sFE .<!t1\ %< %l[fh nȲZI0, eFRX h`dzZ %ȵ/9 H[3c:Jhdp# [:a.$ؒ Au<Dr.L뜀dx^En)-[Tx Iߑ/{ ^N!0 �Vd�Dp >!}u\ФI[Te&_я?~/ۺ.WvV}M>ϊQ՗=c [~|9<-]4=O @>IU6m͸eU&EOvw꼜B3uh j(UA/< ~4|)^{T\-fy;|i6Q -6 ܟ-Ί7Ay !7Ie&yQR ӦEz0`nmWe54aEh^WW�VsQͪs7{̴ռ{Ec$r{zh/T b謪M ίoP[ 2m+:y;Eu N~#趭at0穜׏~.]NǨ;z'#Gy3'i4ޭʖ] ˌTzo9H"ߩ鄻h3Rx: ޖe'^bB /\_}CKKKKъhr4ީi;x'NIK'X@ �$k,gH<-=lDQNv@z" Đ,8'1Sޏb}*`2^}8uy3`ŋ"[Q>fCLٌCou"Q3Zj3}56 ,SB=/΁dYnfFpW2"B3fH:2HލrPo]a(ȣYnbũ,b7Č\n`w:,d[KmbK 0x`g]Y4n#&2-,! e l3%|FE6#Qa9uުlτ \g&vl -@: k2 cWV?Ss,Br1>}֧Rᕾ{H;{OK>2CG*?TxHX|TU {|XW#NxGt͖G3$Y+Lx8C u~Vɹ9Y|rr9.e!ߓJ,+|8<Iz*vf|.ȐX/67KFs 6[ۥxS".m˰D˒OD@3lIbwԎea s'ѝl2@y Xt桩@tb=:}zm h)\lF>E A>߷Ae}ΤhSv/$]3kĠc܄ߨ5x&w 00qxy*3͗2 rYɪw&] D؊.E|?<]LSsBIXш ֤I=fqY1l gfDMMD!@0@&!ii6U0<w!rs B )/L-@|feeVr[L|~]_uk! !Ɗ;!hgFv{św|ė=j�'ݝISv?4zk׋/0q0#}|pݿWyxI]{TAoŴh+ήWM{=FPA:TN)XI'w2.}/IC.}ŗY>SE^#3594w!Ww�6j&l3ISq~ђwܛ VONx}kDw¸/U69,Gm7?hib%W@}09q(1˺]bs|o\S><%2 endstream endobj 172 0 obj << /Length 174 0 R /Length1 8836 /Filter /FlateDecode >> stream xY xSUf_ڤI&7I[4ޔe)B [ (( 8REy*ʨ83e(8#<y3MTF|}{9rs+=lzV\хkV Z`Xq [z:(Ž=24##C L}.C[Pj[8*ڋtFۇ,{1[z0V'�3oFa,�2@0(O.;K,jQ<%})<}.bdhїSex)՝z{D)1 $%6bj# NjCmDj4QbAJ 伤# ١"nN}1>BɽM4$0<ڇ}!J~܍#jw`~#bӇ>!ˑj.GHɭNWR HE* +OZz|LM FBIsQ@P$`x_0 wsVhEJL$cVVCC4 (%kBCBúBÚBCKB3wKBo͆_7v5ni6\li6,p|nmH Lwv@; w@a1IzWIm =7&(bh#!�<Yq%]K"Jz(kEXlP՟F8Et4rkR>ZgrP<fuB rE,BRw4U P=M% S[9ğϕ$-I1(I=1ğ c"?ob /_?Ux< <F"~I8|7^?\wO,B!~V$If+tUX~!L|Iq5?+4?#iir\qR)eX y|c8Ǒ Q_iD^i>ccJy/6I~%w9Us\ p~.,YmTZZR3j[5@ .%,'*F%oAp 1PDMi%IٞѐUoNOԭ0%iՑi^gLΤ:[:OM9DC>m=NGKbJkG|Ҵ$%= I~ԃ -J=Pah"4*Em[F-Z\NdViEuYmpkQS|#TaK`-UL#X4> Q&QΎrT,/S3LE<⒌a^yl+6uMt'n]ؑظ@7= ^p&{Mb\x,'awS[n7>4O$߼钶]l]_nkR;m5r[Mr[Mr[J[蛖{~fU] y8{! >|�RϦߦq*�a=d=`}#R8)0zLQXFGބ*h9,PwxSWO@9uЁMIp jH °8u.$DNozlo<t=ؠb+a1,p3ʞABv&{!"<ѤlR,w'8| I,yrڝ>Nc"8E~{y$20Lf9HW y7!jeXbÑ삗5 V Ii'+F2@^ NK߄T#ucWaOwN1wT#:C[hIߘޗ~.Q[mYY V؆ .՟apL؇Bam}�f7sgMN_ޙ~-w=gC �3`t"*>}0pNH>#sG(9FFQ"j #1BOC?D?.bٻAԢԚԺ3'G7<`2v ^+Xȶ1^= 1ۇpmQpp %1ROd2=IAzRl 7~H8`8L& ɗFG9( PՂaj!ZB-cxG4C>BߡHq2_2ǘi/9Fvvʡ֨sWq?Nbsӷ a-u5l&:5yRp&֓d/"c؍}2%(Špb8HOz>?r:96kvl2:FͩXF7I-$ & Ni=bt'dMT'!zPtW|GShJ5YA,T,4B($;İw(y=, 49Dž,hꎇa ӆ8 \q�M oJ䊘GoYhwy<P\�q\-.m?/=nMJ[\֑{:T܆%$5-aOoEe[znCE>e- r vN(2{ЈKs1䔜 ֎\)W!BŇzáP86dOyDN~i̋mq2v3!,T5r[ k>u咄f|#͢0pErzF9*,By:/ZDi:VܒMk !w^y/JBlKXbd`nL0{=A7a@h@ , gJށ0gV:< u1Yztb KGkTaGPE>[;ft$6] )މiHAD-hO1]1sh ÙZ݈Ut u=#yMd$2QFdTdc+Dd=ح86Afz&?#\vX{[ \p忂pտpŞ^p ZF8pf_c>§Fv6W)WA;8|(b`2M: ];wJRK#R;T5K@=aYw/9N-BǙ3f6^~ދ(̪Z*&Ӡe4M95*n2\ τ`pڙԑ4TH b#1J#�&ykI?;rO]cl*+YKch�-,^`w Š)Fmc՜a;):I"zC <Ǥ F{ӐeN=;| K#965nT֓JKE@J9\1rlm9Gl'9?eƝK?)3''\r$^Dc:g:geXj3LPmEL#W#:-MvZr:-aUVUFf[->< n0>v|0489gðB,YѬ3b~cΗJ#JnƬsm%hzk+F$#I3ǂMVJy蜊+'esPSVUm=ud9Q=ܷ= })=wC;YG=~Wj>J:@csFF(H]Rm";kZm:dwMUY.Ӆ9〔I~^r:J6P*m e)87XR钡n9:GbK0cn18ErEJ#*j{=yFn>TM%q@`p̦M*GYug$˱ PYQUUOg6Oc|SַMjN b_lznBl5jK7ְܹcfN\x*n6ߚ<> N'%ݟ?rН%Pcg] $iHP{9)Ǟ/tVK\Coi{R$cgͩYѰ%X8>s: nDͯdL5Xm#s~V5}5&#ܴ pYUg,f(/F[Sq*Q(XU/1BpWS/ {|%uϾL8v8`۩Hݸw/ vmЎsc>x\ke:c.˔KrCyt3|>R]v8#d=.P̳\}LTfj's_kZ"Vq-MRڃ,PuM=sFI1'bA.2ep4 YlFlmʫYd +(dfDz;n%3V?N 0)'O)n[kWR'RӮM4ԍM6XC*4x\+;Wf5$)F{_v&2kpMۃnK<뛛Sxkw7Uck?Kc{cz]*IX Xĵt\StZοMͰ[~*I8PA,]RJ).q޹AsE']7h/ΦTL% \U-tqչ.']\G咩e t0ZMu�sL5cou>0Յ@L]?8p#%<Q3Մ;.y)]TVRb|Fo;hv†0Mvm;)*hUL;x,|+[]\lٸUEA LpɻQ7 j ٬*O?I{MO'd DŽJN]ݶ>=xS^ɗ˄w[~󤦼{ah}9ywRq.9@_\z~߇9viY=Q"I[+QVt4xukE7&)J TabwLWlI *r+:܂,mƈ7x$ .Pߕ@9U2ZFP|eRNJ\C嬸캻^B- Tܶe[{J5P$_zԖ sȜ)Jƀ@#8$4؉SN9G(_%Kct#`;,L֭Q$EB "fz Zu&)8Tf.qcBJ)(\RcIdx䅋r9@/~{A> < .?Q)^S=i hhNFY3jt6CnG SR5ΝvgE{j[7v9}|:7u5K%ۭ]NvWMK*{E^~{D!FFQ%DA >Qvx/~N ܜߧ-@d$)0~ (.IWl8Yf~gqF2&!JZ٥C }F<dQb`qlU5SDg+ krꞔS-kȩ"yzN=RV0,4ۏoޔLuklm>}! <UBRXϦx,WYE䝕)J#4lV.1nTwMuVr:OPey ղ鬥AwMKi.alM#X:g/"SA9!V׷FAיŏxVsDЇrYĂLw]$̽rR1-%{Vl÷/ZZM)+E>1@Qnab5~q%zZ\9uz+u{H{<ў֡, 6ǃ.r,IVȲm.KVfd r(tUct2c5jyĊ=[ۭ΢;.wJ3shƤdo@-QK\ E]QOW˜ImD"-VMTSt5*tF"ѬPv+Vj5ڋS*sUF(4+xC2*X=naրk *ޡYՔ =fbN0ѦLq<1e%р<|1rp _m5# ]H Z g>z4h>a^} IΕF Aatcxx8dwIgRB26%uX椰d֠;4wrFSJX=:Q*ʒ"*h=MOɐ{T屁ШU a LnQ^cW4Io] ٯҽЫda/)Qw'5a~('G-J>CN8g`ےeB3,/R endstream endobj 178 0 obj << /Length 1472 /Filter /FlateDecode >> stream xYo6_a{He+X $m؊ul)d{}ǻ#E}8Uk>0;s>;z~n8]n4-g#1@e h)Vzknmb'f%鸀?-$딺o"žsVЮ "/hK%LyG]J$lch-N+zD+]siκ@K0bb@ʋz\K"Y"vd0ߔ#,$; bP#*#5nKNKkXnRuAk68?yI=g2 }c5GLb'#wp6jiq|tʸWWLߗ_e3m7 NL\Z$j9?)C9ɒH27<J@j6:PEȱtGn(GRKG$);.pi!ԡ` 4o•!be{OŢZZ  J)-Ol\e. ;)/(;0ĵh3I9GC_qWzA7er9QYJ̒,=1LkU^9eiY[iWxv|E qhPWPGRd.<Vۮ(h,2+LLY6XT.:DTN]&/(r|(aAQ\4^0^k xZօ\)Ű w|/Rib7Jl8,xZA0]1+^eCmT9FxBᒽi-YuQfwSbkǥ<cA8-CˮM* _PRRSv핅 BJQɂfqigaMyvu.$CFJp0jOWGoa(ӁPPdT eJXr,AdTWX-cn)זN_TR;+wG}#cseq.{Cs80}L~ITqڮB5d6=Ӣ&sfxo _6>ï|]]<X+c+%?Ttep+.70|eʥ~滣wc(0gI$+tެ  w<3q9 qzEk)?.dIgDEcne"/~BԜwu�U3}TiT%F`qMÿr>q1/S% >ϵAuc s97"pu/ ڴvƴ*< #_zvפ/غ [U>2ލ1OqUY} /LPu%TO2Rg}"uo}ӗFIvJh3#`P*Y00?cӶ&h:;QVy endstream endobj 185 0 obj << /Length 2082 /Filter /FlateDecode >> stream xX[7~WD}J0J%BHT*ۗRT\V{nxI6@U>\(D'H(B=J(Pi4ގLԸoBV𽧹i 2dk! [!RGЮJ3oK{4yw(M 8f:ͷ0!4OVlg9إ9#4‡m/))a%nŀK1XyG&E*!3 lm\}1Ce->ቘ�ۋ)=yD]L|=_p"~5&/<E0G|\!N@@K80ne|'awF<<FҌoكE@GtO@ tzJx<lFj':Qd,R3~]ҡYGEaLL\jMZx[d  ͒ib E C4,Za`O'eG#qܟhcAeX D&O(ʘ jڴ78 '; &4/Y:z4䬖EحYS-X H2Ùf- DNnZB=y!<B%GL-b 5#`&Omrz: Ɲϛ G"Pfb4g7$ <dԱ�<(3(tsv@"Ț$y(F[XԌh1t`b%dBޒb"UE .:1$9j$ ]Xq.�SarD7 ̥O �CkNI( H=-8_բѤ؈OptfDJ;GwH?dQsħb>0He#D~Y?�wLDBM4mW30жj<yN&0*7P:H#8X-^ΘkA})R} N0"da/45G}iw~SJKג[Az1-a%&AWAd|l18^VOۍeΖݲFյO*<Yך j5U=w4tj7؋ #3 vU<- ds&2C-6w @HC$WNH ghK$ʽE;uuMW9ǽ[|#hdR \O03[qm)7 ZLBn�p gH'zß~ k.B (ȾPγq@z<_m=SEp5_ ҐTIʭw\u;"1e$+&5Tw8*| ^(Q?ccj)m:\j+c%TӗLG; 6]>~?G uEKkU;k^ٵ > >R=DeDlCH+9eX5F$t!^mA𬠋-8{=a"x5=z7pesS&b;O9taSB�N7M)eΆ}߀k-x>vnblp k#,h}KĕH3U}`MǪN yO Y.˼SEnCR*qw}-^X} ,:(Yſɡ\$ .zVu*1A}5Ñx&{))t0BBꌃ:@Sɭ͵M)8 SmW1^6kJ2pf>3a&~Vy =^+[V-ʻD4:I=ls]@K{99뾃 .[o{ h=+FNLRN!k<w}b1s Ɍ0 DzIUw$/pNqլ1A$9X{H%y`OU29N=xvoQ! endstream endobj 194 0 obj << /Length 2362 /Filter /FlateDecode >> stream xYKlcIC2vl82#rBJ]C ]]U]UUo/([/( ZAQ,>x2JU(QS#C5Hp:r3j똲g\ ܷz̻sFe{$9sHDK55H.?e,Vaiop' rg4>+|Dw%@s;ɼ{~nQ rFwk<cz &l20{ E^3#Kgmj+S/7[HZ*a3<Ǟp߮:(l752�~- Qqt#X\ey'$vtZʩp@2QuճeVQq!x[pغ IˣNNGp̂ GE PhϜ 2e<ɪfÍg^g-f�2aCیI5;!+nn0Twv\N'UПex߿4/_;?HwlRdceIU:+4ZEQ* #&x4,vد.5}.`Z(FV`klh3հ(90$#3D@Tܺ&8rG}?@IJ{|$v C lqF[5*<NowgD߻`A>U *z_&# ,~_xᶧjAoj (jIukS1D HRX1th)X`NW4P,T";usI' 2ƴhȆĐ>ē0E$+ڠpGK~;ڠBU@LJϰ{~t&qT?]SȘv݄x(rWcsƄȾRJܢ4WD!T8pSif QוЂT6W֜Q^uI['6qťa::I�&B2CUGza8!Y̤-obL7V* Gah^Bz\$o<AFNy-b•=+ C/"vƥŒ,'Z8`:<8OMZN9}9DEakZ bh;4_MB`FRy p|Px*F/1G.irB' fOoC1<)d$$hZq񡔃C!k䝉i�Pai ?jP@Sv F_ZvS8N <NR1$K=4WD=Q|G 3 B~RwG18<60Ŕp0'qowk{wr(U&$-U G8d2YDpz#}2\|>j6ޘ^ !i9+V|L z(VL a0 u1Q={l�HB\h􎋐Z�k2`3Nsw; ݎ T|@9vz;^zkB/G^#(`ln^V{t PRPcNs3q] ӜM`5Anb&ٳypKlp 97Xl ÕLYpEKdsn:,VkͫyUu kWT<ETRo6N~ĴgN_[gu?;~v2:{<N޹/"mt4,58]Gqex.ь}KQǑ)i^k;뻡V)+kq@у#[ju:J\+!Nw?Þ ^I_˗WH6NY*\a弇񲂐//']ofŢ/Rs/6 ĝA>L&KP_>غ57W]NInb‘/Br?NjU\rViq< '8G ] ѕ0K݄p\R煊?&) @ZW۰ {ʦDI͸5Yyf|K�%x:fT-L΂gr#/rv=-K]춖X l2W5ݠb_TNg<(Q'I(F1z28;+8\ x�B(r; po~e endstream endobj 200 0 obj << /Length 2364 /Filter /FlateDecode >> stream xY[~_aFƊ$ `A S,cKd\Iʖ7i/~߮|󾘕AlEqa<,rZ=Y,0W)O4WE4BYWGu-m~j>~hW-~Y4Y ̒YLjCi2.P|q\a'bFF"2aF 0gHgop%N-MdLSt~LK[bnn W-O䋣':zܒif+g~`=6=U՝iEJg/gAZDr{ҼTZ)cW=Di]*w Nc0Oŋdb!Á'[2(Ik&[e54#+R 4 D&nĪ8'Zg7lź=, Or&ҘX;T5f}HZ&Azv2}`ã~:vGDyR244w`ddrT(lΏmkf'F+zz/%/ǽ>;d _eXZf(LXT,c2Qcų _܎BJu.qݖMW6q4|<Ɂ'c*I'HZ AT ;A0 Kv7}`6AL%WCj>˛@A FuJ)fQ(�YIS"=$KGED+8ZXe2<ocG Ɯl+PZIظ'ˁV%ʶWg%-ӴhM٩N )0ai�$PD Y[eQe* ;5 M<LP AnEnj˫ q|z2ago^?v}lW&khMըb8W(?A�`LĄJqG ? cOʱ*V ~[d@(ZsQwsN+Tv& w[Cث0[ɻj-v^v\C qQa1RFB1V8:qRT\wc zai6gcš8f9%/"8s2zwMi_:anpg=H^UDΐ͔|(SE.s<Q̙3^*VRY1% ,N[\2c8-/O6meCOF٦XKٶm?炘JlD".^SвAo}TY6A`]s^[gID*J(q.L}fwF9hzC%V+z3,c!zx~9rGwoX[ؿ5pޕG2SUbMȒg]lAnDp�Utbi/4ҔmU֠U]`r2Y6]^ L 2cpO앆hOb”{85ړCH61 Gt`3\'�!]9)<Q\Dꄫ+f1 d)F<uP3SL(3ÂC7C4%;iZHVz  jϠ7Aٔx '3$ɯoT &Pr PkΫ|�*\`$ΠPFGUk)GΎlC4H)`ʫsg&{~Px0zwJ9}&cMqB)/یQ_i/Ups}^Xs#wп^mD&'&_k?~U 'N 7Z{$`$< N~L f@Ϟ~]sO)r獨p?ju'+ km$8:ܣs; &?ktcҁyUDsbqo.i:f,")]yy<IX9SY)K@'eɭ&RX"q56svVj(¾0tuT^˯Ry_WlQ QZ> ʭk'7iy@C x##/9l1tH5T!Yo[僋0eYuKÛ A6jrx{b9|ASx}I % ɾ#7 j w QY׽rVl>_,#zUy8q R wm^"g5F@N.tFe]�'(Diod endstream endobj 206 0 obj << /Length 2133 /Filter /FlateDecode >> stream xYݏ6_aIbVz@&hEqh]@{Z[kĖ]IN狢dywp8tJlfۅ6VYq)(Y~ebDGǥUۨr ???Ve"x2D8Hif�{`cCz75 -4nXĒEd"7Vn ]/maeAN8015Ǝ9q>Q23gD  By~glc;L ;b@!vpkd4ۃNzI' ?O*ץc AtU-+'{&힅XRTEa=?A58znx8/7Q*Q8֢SvP68Z`tZLߜ%l1l/6h T_%Ijt[I-!@~a.#nUC>Lp*e~6t+?ؒw49`ܢCGs=`d,ϤЈzx h( 1EpR]0Q0ПΑ5@ThK8agQ~8e>sߐ'g]-ShpwD> sxIZ< 5Gx#@ѱV;e4@.v7=.{7BWr#͖i j;ݲj(HOF*s>:pBmX/YHi(WhĨGX m!(:aIp%tlBsGtSEU ]ԮtΊ�ۗ0cy?v P{ZGQRP;iǾH`Ə<opk9ЫA ]n8tNPd7E6$a8@V0.36!+BDH� |Y;ѓvbNfWğ(dt&%I>L) -ߜf-�_4᪇뮞f )gOLao`A'5##@y]`' V ?G)_ > .e"ZEfR&)xS8v՞HNUɺCA0*j;sD_fRT# #1Jrl8R`h'q.b}~qYr P0G-oCRFy�d43N3\g2[b+&u7Xssz?鎽x'WU~3K \HU:7KO{Sm~o4 o9 {/>mJEn'cO;.+6PN;+B[ݹ85U\eI"e4= 芰1Utm!z68`G𦒴-hdAgYM_CM3x^$y_@ä/c�cp&=So1~W-w\:o!q f!`JxR/hpgG)J L@ҹ�`'r}x/hiǏ!5Df qC-"u,qe0Le~m_ᦆեgFe6Zkd|Iz`F\.l>מ(~d<q\ hlX ;< 67R{U}GZ/2UIk.}wUIa )VFio"- 'Öإjæ٥n{ƙwY?CնD<Fg)=rwp/CpOilgchJ =Ω$@HE8D(*l[Xb0 jwK kb2*H~qKthcowtC9f-@iבdqUC&Ga4캯@*L+x <Rb|*x:Ye眠tLZ^JѢ kٵ>gzJXf 9طAcxJjBs/grMt"S2@�tf endstream endobj 212 0 obj << /Length 1496 /Filter /FlateDecode >> stream xXKDPqV3'Ujrb@8ȶl"Kez5aSCdf5=_~S xioxD&cp/$ <雇޶W?V~=ϼ<xtdb&}r?U q7i8LXe_q;_Q/p6Lٮe|c bIp$8�Eq2mE[� ?GM99oJyVViLuܾPGZmJQh% ǁ-s`́{o7[ˈ2VMf]tdHzW1L]Y,.ߵod״nX݃$yƜ(GGy@<MujEǩOaE|:,cmo*<S_'* 9!'w0pO}Cw#s·h(%|.e; bK/ISr5yOAS "\+v@ANbu,~̳(9&pˆϸ`lKrϲ+Hfy+vąx0<5y7b3,ˆ_I6Gͥ,-J"Y_JF(|{)XhIC5NCBl*ng Е&Ԏ:bq8>C{BqᆕT4D.1P֮%͑Bڏ@eiL5@ob떥�H!\%(ڊ- ōKq׹ۢ;Μx n#yf +h{TJa�9 2f)3&s3dNhQu,wU+B=GpֱٺPmk8T0"U%ŅٰZ8@Y5knVjVY Ad\_i5w̵ =^UPg,&YܣDq%dgѕnjҿU$}T_Mk֣a8iw)J$؈+S9${R֡twKGKt/ҷ"<ňߦ ]g;CѵŬ CE5GM`�N-=ӏU]sNf.1ⷻz( } s=)_J#k.x%vB7DzOg2F//_/Dcq`c �GJ5 `AC#!|zCfu# cTz⫝. ciM⛎Y;Cv,1Y6=5;~^PW ZM|cEc`T: Vò;сl\f 0s䎒)B8i҄?{ ZZ/yCа#6r`O6PWmHؠ!H)'DEvԦ_`Q./W-+D~wV.Sx?Ob&Ib o endstream endobj 202 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./sequence.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 215 0 R /BBox [0 67.59843 478.5433 477.874] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 216 0 R >>/Font << /F1.0 217 0 R>> >> /Length 857 /Filter /FlateDecode >> stream xO\!st/=tƛuSSM56/Ęu| :e |Gxwx0<'GИzCLK%4opz\KuX$1N%X3R),1Y"Vk1%Yvҍ2n(;Gs瞉.3t$ 2xxࡈi .7v-侰/;l!G Gͳ'u.Pt1F4\dgGCS h2)NM\Y] {i@˼(Wb@M{N񬪡zhU=,Zkq z>TgB++ 7*ĦiI FlC}>4@IZ~~'`x-;|zN?y8 L 쭤ԶA:CfĵId**2iDZ2gCjVHC@+YL! -RWBj:pKDnC �D }ꨲ`;S䰡ƙ;i+bIr2 ll4A1JtdKzMφUA45WlMruϴ1ѧ(ն֓UeǶ)UUT::{m٫J6JΰW j5/a*ԙ[rj3S7r&7W?TP;%&un֕U'HKCnL?r#.b4iAIopcxfxInӓ!{W endstream endobj 222 0 obj << /Length 225 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 226 0 obj << /Length 227 0 R /Length1 12300 /Filter /FlateDecode >> stream xz{|EUut3~?3L$!!! !/A  HDB0(DdEuyc2,ம*.�/׻ \Wߩ!SUԷN:Ӌ.nAJԉ4nJS,$^amM ^ KE7}v[BH=oIz3B}kKD9qA+d$x<ֶE$xm̛?\5=>�ަ Niߢ>ؾy\0:|$E !́X(p̐oTri^s1~ZnC4cA{K pFPmz*JOnFx'zh;@�bS{;; dţBr5Qoqer#XWǰF l9D2?f"%ᥨm\Pu1bC\8X ů#'u)'B!@NBI\rv/Q7Om\O:"ِ;W]mͮ9b'䮂B+qѕLWZλxsCewlt ""0ދFiCQ =<2X9v:5KCթ_p  =,|*= ZA- J]cx*X$/C&{ 3XHG⟃b}=jī1%YB.X@MhAP?ƎRsvb0_fo][DQq?-h;[hj ?jw6w76hqSKR-wP<wxY uTx7-lm-,mҶ@i[ VsYlvbNm}@;sFéԅM2#RsQ*׉l6r!S͝AX[oL1 QJ$VZNӨInHih+zυ=؉(Ơwp<>^h:N2@z/>f*JAtAQo|O0N@wh[%Y]E$P*(y?>&ލ(q }̧VdF 3y?{fdGp/= }$Lx HEij#ڈ^>߃x H3ŢCU] VQ@(:ǨYĜh%I { Oǰ#8?7Hԑkf,3Y|q[%GȄnޝD=f.;b\݉&G|'9 G@"#'9&̟0p;KXslmw #SƢ zێQ;N+lG;@a-\\X|'kp!r@)ZLH't26&La>˜g3Yձֱm6wC{\7M::f>w^B^rH`u0:ot) }.m؁PhL(ՎR mx uZ2SюcДyPe'Ŗ!F!4ӂ/śqɷ۬hR!I^± ([ì[]Iyod4ݒSE='g x2x2$VKPIf[uGu~[1VBrw7+•]hefPBrZqhZOT i(c|M3U<zȃ uFfƜ0ȉS|,B͍44.4ՇI#K6yæ?7Sn) _eSKWe8KF5nt%xuTƹ )7&Rokn#& qu,!df5(@fNbyE"?AcSC<zB?�" r3F l! Z Q׌B z ݜ|#7h-O8bzxK=F W{]WanO}B:M7tA[V:5Wܒ<>vC&3FGt\AGp|u;> 3)̀42ܕr%wk.w1tgu-mɖPO6^ǻꡆ}5@,feGA2qupFĸ zx*_Rxs̹ sN%jK'TQE묭z'l]t%F3B}DGp8x"&)Aoj5rÛC@Ÿpq!\2S!<6K5¡~A mHD'BxďAG!\/mWշ!<_#<_nr4H;JDxOp͏AxB~IoCx|'Ex !\/7yH;QDxOpݏB_2SG8d [p�~r<aiQ{ s  DGTnrms_B uCzP^xvP̋!.ZϠU4 Er 4}gs;=3p K@7;zdpQFEI7o+�斜[ZCzh(f,v@ iF/x"ƒ/ f"9;m;X'|'=)Bg*4EOspeO   AA!\ A^Q¡Ir4M�]%w:FPm\hAȴÕ!?Jm!3\(wV9F{QioioΠKBM>_F90Ҧb�)R&!=iXy@V;dԨyqCmf0&dcB'}Sځv>p/s[/~ _ƕ_OcտCᔇGܓpp,+X~3dURکSEPiws!yԛO0׺t;&prϢd34d's8u.uk&LcYfYf¡dUoos%%%d:ZIVx U*o+꫽QiIW-֚0ڢ" AZ>_U"pYZZ- hKq~o2/ὐj z^%1xF'l^~ak_-|emsL+<G޳|ѫu]{qҪ19qrP:rTfgd..ΔlB̜W2+ 5[~ (͛xXdY+^H^U-^I(r%WM؈d;|~ bR�ו>s*f1peC�3?ʨ.ڸr%`XgM�'8/S4 :AxuEj_١~c[[z*ܡнǿVeT.x0?c >T3]=([GWMsv0/Gfs@JD&(1!oh%H0 CedQ,Wf_u*+%QЪRJ4E"j�\њtvtR b'i ^ e,.<6zӟ@eè,~lF'rcj.RMֱCG YJXiUInG:̔%U*vh8:<{ LoiF╛#M "؛ ]XJaFwsvR3Ŧ" Kpӱn6L&I^.kOrJ ]}ۑΆϴ74^vW۶;Yꐔa^-<7wDFc 6T-P>TQLb^L٣<d+UCQ+U%[UBtJS1p #"@4` xKu3Yg/r2Xωcf\> ի3v>S +ѻ["'A:S:|chT�ο2wj탿yWOCqṇvl,"$2xA*@x d>-9rX 38y!CRp7I2nwHTLV9̢P[^1D-_WQ&*})5 K-jh8'laT,3` 9UuI oh� Ǻ<e<3ܻ btS':QߏXjo\XH`琊 NQN%ss5K~ZC+u�À43 99I9^kK5Zi<cVbP?cjD-)jVN$~̦c*ʕ,Zܒd<n-@ &VT޻س9?<Mr?&m;5 gԯ}ȌXQtӷuEsmwX}v qVL-.!hPۂ7s fCx V # `C R'q:-L)VhnirM�P}9،@Bؑ EvOWl~Qzu.jԼ81(I `�]�p4$BY؛4j-]w+jX֜>I߾pΓ'c˗RKO{/v:jO]WlA=z}kf rgAN VOeX{:֊JP1@R`بY Idjzk@b^^cqF={5mU@ F[>[gTth^C`~cUXot!`zt=6;YV8ag.2 A9XjU1Yl!Q\GGJD݆MXeMn6F&G̲';+SuCpa#v/0RT2S)}RHVزL }P-k\y?}Fl;:+[ki#H !,&2^`y*'GB&f-`{WZR =m9oz4ooeGwߏ "&ا�z*#q5W9L`<X Ce^ߨ]]gNn`<NkS|N$x63|F&'i̒<t! qӕGؒRK�NM#[%Ѭ0\jCȅ 0w_,2U^\xǬ ٽI9kY4V|?l3&#;rEW.<=1XJ&]}"978LV�WfdpCR#c4>Ռ}zɼݳ+}(5 ja s`^TRAߌ|$.nH2;~cL{YwLoOƮaٓ8)5p?=I^ S0m6=W#BrCp`bRӪyNM8\|%'|y _Rb)a}TRrǰ(ތzvEn,# !@ef%OC [| ɃNz$!ă{& h)x0v{ePnT`9� j=m9gANj=xcɧpj2 iF-t-]Ms.Q)ٳ<!Ü9vLZ[OWWon'3jʣ^Ԯv?c}I8;Q{(k'ICxfpi`Y9 >KK DZDfX+X'uSB0 )} =vtx>]:1h'a?;:ɝWXoJ,.֬]~=iE[�n2رs]]ռ[kfF 8ҡxͤh14V,`gBIMoQW"tj%]C-PQ5Yk +(/1$"W<ԭ^bA>ck?cxxwi55;q-¸ʑRMVb8'I5^'#e%X-N²[Llf9??t~1Q� [(6ړ;ع=v^(?po?/o<2ds4q|?lӌ:7x2ؐl,aEh].S$NoPi "V<Z*sŜADzee挖L8OJ6#HFFbe?s|v"SA85,C΄aT5~=@<ӡyY1J\~)uj(|ɶ?~tHM *?uVdqf+`�ȈF7ii+�t-1<P z7e(O\^%<&= rOly| AΜ KO8.yvsVsy^xtCAUqv5+:܅o֯5#2�Mě�- NIt8$A!Sek|!vӜеտaxܤӫKhRzBỵΜ5Q0SbsŎ!uGRހ Bv BKGП DASђSnxJk` KŦ]?gWnfZ(䌄$,9jHbˬՊAՎA `) :`QWD psW jߘeq Z *̴]liţdX`N=]*- evHkTOvyX}O09MV_4 &hC1g�[T~ĘZ@-=Kj<8YX 4^._k*|Ʋ BwؑEۖLTܳwN=xlew2׏L-g,{a|蟨^)7N ^QfNY"#Q4VAeHb\ anq3GNM: ٠ 9UG/AATk?[WrNkD`Ŕ )6F+ urLK⼑üF2|4Vfd ( &|D*Q#Z {FޗJOÞ+Jgox{7a6-|8Hڴ'a9Hߤn3ca-$�@ x>$m_;5|"J=~IGZaQ`nΏޢhQQ_3ǫK0_ tR n|;qؼpʴ^"\}5LM.ã]f$jmv6?s?NMjbbڍvh-n'ډwqM\J*g6` yCPYxhd0w+~nXm&Pxj.?#1IkEl3" `mlӚLfc:�fp#bܰ gL%yv~хZ0xn.{ЙVsTE͞˱Y=%cJa\ѹ-^.]EKcRGQ:GUJ8xn20|ŔUFcj&WWhY4gFX A':gD-']:tS�ف2J�M h3@^z_n@@v 1 Gi syx5V_�~�|�~�|�_1W' ӑ_:|�|�~�c�ΣX endstream endobj 230 0 obj << /Length 1131 /Filter /FlateDecode >> stream xWKoFW=-Qr,uk( $9([@J3%)2=@q;fuywd^izMD0 tTxIkuWP:,utϽ?I/&~eÑ,o<@7Zdwn/=iA$(2:6o>%20 ni~Hȗ7++5~(WOӴ`eRdQU GhQ9;胨EsJD +:�_3ӥx(*F#zxz5srd;,GqjEu[$@8P6qVD8jQBX }81H9똳 q՝$9[&]@cZIzUGV?M#5U#=<S''f/Q,A(~rۑ\ [S6R0TMG&F}dIb%#*m;scj v#ux./$5}oMS2(/Wؑqy`[05bsG $DtUd]i=OԺ*JY\Zz*ivp%I}!?dA2U -棌WbXe /0iT˜^ 4a~=XG?f:ajo!{0g54GЅXvz7 %ZWb�o:F$= ;Zԕ=#pE<{U2DV".sss2߯YLsF[sCХ7!TXMxd`p"%{>hs@�خ`U*E9]Yt"{vz�5";G\g3Ƕ{5],HC'~^ W��ơ*-_c4EdO;t%zSՃ zʲaSl{tUO?o?q7F?4 ,Zq$#&͛WG endstream endobj 238 0 obj << /Length 2530 /Filter /FlateDecode >> stream xڭn}0ⲛkXY'0;4E[H@RO]}P"m/}TWU]w~d*Í&.}S$ytus+zV&JU4`{LSdWȢ84Q=fqV_ç򦊫\H:Y$Lv"<npp�e}$h~[j`hM໇|;;fj ;:\yq uWjYt+_N>JghxS93 \UaO#y=m["hy<a`}孞P፽=:JP2a ~):śՍ^X\iLG-1U]-#A O@<Z`=B4'^zxgO,cHϞ\R_8f{*SuGzO \MX&|O!g[q3RYÈ6< ڒsBV2333 Y=l�8,o^wh''Et+&RN)r=  P<VҜ4fRAX^%x*ē~0XfG+8  UD.U "8cȊ�B%qewQxب8up8o&ƹ#Q7=qZq^{9 e۳4yhw�%|W؝mf=5 ˃!*#Gm"d%[B **Tm. t!(i"We%Su N0(?0 O3A'ƚ ˴A;7 Y͈źb#0ҌM)GAC&@SvqUS. ijm-&C\6Ak4TNPk(SU)^ #" �Zwy•beƭhLӆdpDmN?""I#Zn./gSցY T^wI9F/MVΣ9#g)(ꁸn(O{(`Ed9wa>>\1u+k-y&eZiPd Bx8%|xx~R<s{ * @wکԧM|bɪR?]䥑Q5Y1;37 8nKl:ܫ04i9tRx=1Z*H2a}ZKVT]VWHkp4-պl_M(vV%7ť}UX;֫`9ӠR<vRj=)*'VkzSa].bRi#>&K\nעGz{ Jݸr:g/6 ÞHZ?<v eZB{Zkۧ- 6 'ejRi%d'ۑnNŪ1Ϡjl9vb_{kbҌZhbEpPּꋯy_lykcŀk\ntKĹ_g_m'6&x ~C0Q9 A8b /467}\yܣ t1 %<q1iyfup*$(`/{%Q3 3%86ZބOC)-̧^ ,,[y}٭N'/K|"j$"B4uzjBZ opf1[[TF @e}rl"\g5Zڡ`l*ilbk &z@JŦ18]I_AXmk*ZaH%.Z/EF"zI$ih]|b [WMز4*xz8% ڥ2 \=|yKP퓭 lu[H`4`3/6t1<+#o k ԴQXye> �ӳ ܕY>[;`tc})2Tg#>"Z4wC+ j C0ypTXy/+MPصZdHPȎТ,Qk֯=s%9_}PJv>"Z5 kA|].:y.\_o)!NY%? %dQ<f\0vWiRւ$uZ2 TSU\UGtމC%+EԍL1qܧe_G@P:+ZnV0LvV 13"zIBVdAS0~Z,7a9 7>$+ <? i1?x,krEF69,J Nc2~>ۓzisK|AÏd4*t qN!-9 £f[R/-KBi3yW-ZUx\ endstream endobj 243 0 obj << /Length 1225 /Filter /FlateDecode >> stream xXKoFWH&] 'v^ J{Hr$ؒ@qg^%%ʖ� ٙo;;ٛ(q2?u }? t 'gwSn%h^CWc Os~lk0 q豼.I̶YmĪDvE%S: O)?":2 mF5�TǃQ[Z;L)t<5.yN d{SQr@҃鬱Kz QO%"Qhua|ow'm X%2Uڪe8LYV@)vT\]w +rK* =L>tK*4ʽgkak"""&¡9M> f. *m:A+ÞN,+uPe!,k=F0цyCtu`-ݬ<DD%G 7  Uc!g UVe#/A WI&<GYxKJgN̍;R68#9t4Srvs>l.1+uSI6ŀ3_2"I>86B`[lH;򒒈$C(SyWnߑeX|jH�Ĕo2w3B*1�6Lo]=#ׁ;X2be.sЈ:Z,~DJR벮,pGÞ07 QDvi/7@BYMdBx^/2NFndKVLV 4Ұ1O6mp[�^L,:Q03v{ ,3f-ej|e;>zUI#T]kP;R_7`Qժe;C;)BT<fCQ;oSP*eqNܞF'Mt-v8kqrEh^^&mg:wQG֎[*1vM5"׭33>61V6ګ@'ypN')Xr-s x§ٿ߼6QP`jG)zY6X^ >b?%/ī=t'--v!Wm}\I PtKn}a_/A/䤖:2t*Zn !|OMb;ď endstream endobj 247 0 obj << /Length 1903 /Filter /FlateDecode >> stream xYK6W"EE i6=@4ٖFmkcٻ/E}Ap8 rbTet9R: H( .Gxq=y?4w 셡:7Oe9{cy8] 2l8'A460]4SfnəzwT^ /hjmI1((P(PF4%amǝEy-`l9҈^JaZ"{&y2Wy\zA3K:nfЩ(NjjfIPNUeV4q kv=H?SEE/ -5ZA%h"8Y[5Gr5;fK}IRڑYXQN {> RU^X=%iU&: U:~cO[iΨ4kį·^-w ]Q4 &qأ1/ٗx5+F:*Sx(kEg$v *GDW qd$$L!*!J!!'d\!!ѧW Q"ďב:1VMtAiPG6C'�jbV4uuH8jlj "pC )$ e4t)3c" VBA6~) L_3MՁ 5zb@@wl8nw}&@lghQc⤷L<IEL a_-&i�tP Δnct>?JR=cVQjAj? m1G:XDk,myTo;z-Lkу0RQ'4 7!hiڧ(wcI a&7Gr V(rf_wT(t)l+-܅?"�;\]NLḅߙA{CLjN:kfEED t߹DV mhpOtB"̃Xp{k5>밠pg1Gj`;NLH ;՚#7||s5ͯL38ǃSdܕi_ā~4P2Д^y+9Łߐ~d >vkI1GoH3&NɾYnfu]|P~mm'25MtûLbe@Հq^zΔT֣<IIJZ*Skp4+iGV# cx0͛);>\~}oI$|XkX r|(SA*L؅ħLO#:ĜU>AT`%P MٷIy@ G^AA-I\M&$$ NV˃upAwSbFÊ1pOf)T�a]%Dx+Baar=rlj M僚9#Wl=; !tTO.Hjx`Xۇ#Ɇ0 \֏$}.WgwJ:[[]>&b|+XYY/׽]r,uR-_5fEJZpʏ\L E&Ry[Q~UaR�ҩgNz³qBmxrf* 8m%poIv >p@K7m#ВkӇYFbcp/To`Q6k`a:R[L D`NS6qXU?TἼ(q68?6#} &wލ%w5[cX[0 ýGPs?(H?ͦp5߮~/,"7*"OFaQpT9>y5}#8̀ endstream endobj 257 0 obj << /Length 2405 /Filter /FlateDecode >> stream xɎ>_!D!-,FF xd@Ԅ%R |}mUEҴ99H,zUJW*TjbݭmסW7Q{ѿ# 6eJ]kE~ƫ ϒ0y@?$GH\fϳD_*h nOϑ/[඙b'w#j~$q⽬U7M#-P`@ �d$ֻF7^yyi ėm7H2�Ȉg;\^ \B0^"ݠqMKc 4(Ѱ,yD#:˽h08H�kע\mj4*$ xpR_ *Y8ZU0'v$*2mಂP7~Mg}(⊈G i=җjsOy/E[XoTp{ⲤpKψ9뺾W'D�g ҠloD~3W`뀠}+Gx520fnrw-Pq9%o̰6k>g<Bׄ�WsY^9鋲RV_]({=;[>*jqjAFRcUHwѕv RJ9tɴ$SnsvƇxQpIR|eBE'/=2phLF'4^ʳ8FdgYVV"\#ui^`mb,ԫ+gMEǒ Dv.M+!C`9ƨ7"`4 `6|dL'HVwY ʘkh(aBE74|B7$r/tE`B y8.́Vh9ub.#MXD`|N_ԋ>L@#i&Fk}%$Wը,D,0-埚N vpI*IyM>˟ʧ=D�L _XFΦ 4t=+wNJw]_FNҜ8䵃¨3]I;Bq챧 %{?IdufPYV 2K"ZTfxQZolfŽ B' 7O"|F�*�嬔GHr/Ql{9;'I g/zҸ V5DRA'LCg#EqJO)Bsc KG^C9xd[>Z(dt 5nMFZm])ưj{"kLi݉v4w|JWTq+a�"<G` c)7PX6^f�齊>%yg'B=>^nD }1X|Rd)ܖBCO )SKinD\88;j:2,z%r9xʐJR 69cϿ, JdmogiQyȎH(I4zy3噡8<xA NI >8ޖ|)VT +h`TxZZw&D`ZWQ|/flpط^Ƙy)nL[sM,^cJ*g^2ۂ˔Tmg; fE<,wϨUF/*,XnTi ? B' ro< u!M>+y52yc<ٹxy(MٰmkAKbM5q]e%(:p2N $)JI~/ae<Q&@fam/eǟf2TǭSw(~CKvgO)ZѝNK lr�bm"u/TX$-( %_w=!-Q }] 1 ~ώmp_?bnعgz\IdQNaIDzqm}_+>7l ẑ{b ~ (YꗏB e G(e{v*tb۝* *QR١j&Jָ |\CHŽZN/l֬VDjw;Xsјm4ƔFq` rҏSֆ"&tyljN\:4L.&-=!xϮF�|TbX?JsÑ:{! Gˉio.o=[/[x۞9:"wRO|M9588Ž<hRö}ģDCJ"r q:GSD÷ .?cM)CH$XI;\W/N~ηɵ%.<sXy�Ɏ endstream endobj 264 0 obj << /Length 732 /Filter /FlateDecode >> stream xuTMo@WaZ5[%&UR ;3@ DfgvvyO0aw2m;W9hCY!ya$˼R[ܼ~U[ )l̜_ ^Xi %K?_C*3<Ǘ4J&sY-iat|ۧ5W0%)j0. 1{C*}J_y9-{LT;oѦ8Tp ę'ux;L_oY ]sEl͇֢+#<}=kG@(F> #P:'ZuQ]qmXlE.P9`; !;0R;D>]Y-i/#Cl2O.jP21e$�<l0&y9j$.%ׅ4J49/oE7`-GQ(c])l΍SYhf&n0Ѣ+zK(I2`VEͱXf|=5;z=IR*V忑_`>7uOgbt< \?b]wwgSK<@~6d,D&r"Ĩ~ Gˤ3\�Ćzف�<!N]<Iވ|!v1OFϤ)Nڶᛲ1ݨ<2uO a=a-NLi. UE1~ C endstream endobj 250 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./stategraph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 267 0 R /BBox [92.9516 85.2463 442.131 432.857] /Resources << /ExtGState << >>/Font << /F1 268 0 R>> /ProcSet [ /PDF /Text ] >> /Length 23157 /Filter /FlateDecode >> stream x}ˎe˒|EaDxHĠ+1@xH.~0Sj�wZkßf? [[奄^[}[{қ?Ho?#鏌?_(w[^_]o?>k{?xϝ{+|Kzik7K}QZ?\lwyu%wK7{oC^~>>K:n&oI~}_w{Wz^8v~O}}}˯^:7/3_wNyeJ?#s[̳s;ןgg|~~yy:Oxӯq_rzM=쟿܇q_>ܠ,I7 +7[G>^q=aӻ}_r>` =VR}R8x3[q^2J_ɍ߶m؋2{h5֚og +ޭj}~4Z-{mOR~47j} ,۵c?l_m_yVZ޾ٗp]|ǽ{J]m#6]M{ͫKּ=/d]loV}y0}[_԰Y;C{ֵ%mym 2ZI=o/Pzwm[m|'ֱݼ6\nY+7o<wͶ٦Z-zm>KVx.sF6/~5:Z8fmX p3fƾaVoWt˶۶~[)>ؕO}a߯lʾCgk݁s~Nqc۸s LO@'0$ql?xO3Q<ĸƗ w?pw@o߇bvv! ~m?*ÎogR+l@_˝Zw+B/6og`)q^/a7AWk#i߷mBt/?peG ;+v ZӑSb,12Sey'b<"> KRj7?&? ]m9%uǃ VڷȔl6LoսuUlM> i~b g`ym&(mMm/o2G1%h!9,8gzXj5BS: 'DgĹ&n8b_;DmHuyM5$}Ey#U%^_3h߷TI ͱ\x#~dojt&♜^<t3o7<L*;]%;O̞&utm*X}Coŷ^m=%bK kk`v΋cۭ^j`c Ą%Ι{ItJ*%7ǖ`Xjpuhu  0-#tzxq6~-2[0= 7`4.Y}?=m^DtvF pc Jm*ܷRiǿm;H(+s|(7@^^S"^NDUn7(+<.,CqIcVnf۽(tْt͌֝x.8ѫ:NIc\5>Miћ"Vxi[Ѿ5UT ߯$V(FU2a_CwwAN&<gjR`Wđt N= 0^ ӌ ,D nu]mCtI/9E\*3,BmCx[-(>鞜}܎*oSQ<mUGrz2j;|,}rM~PYQ -jtO d4{ᚪ v.!x ,;ɔL,)-9f;@b{}C]27Q(?g߾ Qm7`%{۩(K tݝWTlL FW8+iҚb'8K/1t|":r }v]LֽMSa҉}+j3%2tط(2nyj."Ӿř]4f:]ʍ~̶9 @X{߰8g[+ 0+ScK /"<e '}"۷:-=mH akKa +6w ȟg:=}ܕ\ ` gK7lÉ UMUYz7zSo%ۇ1p{.r ;YϮ۷U|mosAmGi7ܷ\DpM}Cyy;mX Vp;O2*P>Y:v6ExMwߚSP<PYF)-34f/nkڸ[ Hn;[3{_j=mo2Z4^$@",X8%}Qܲ q!«J4�oѷemJ[j>mpa,k=tкwv uJ[!=$8"5\ɋb!x1~Mc5F 98ޓNنkE 2k6:DԨ3+ R6Y0IߞH8l"/?~¡cMQ*r^h1(Bd55(oZ7LOǣ3Y-ѣOU�-41޷Mܷ|}�V`_%z?^j (}.W)UN|z-nlh.O89GnU6wjc:6.׽# PջI%3F<�t^;ۃsT<rUכ☠뀎ʟ_ӀiIwڈ!O٤Z3 ㄵ-#\݋qIlRaFc ɇ[0DC!hKdl (jz<_2q1cu&"־s+ȜɊUsm#~iƓ^߆e婗ęlʄg1J8os` Ӳࡡ!Ibjf$ 8jgMd#EuX=J]ʧ W47LLVdV}mѽ ݠmPw3 v!'}sh gu$Rogtƹo=^1dcgwɤHxYzM+!'yO;@({=*rtWQWU*62^5s#y@s#ʼnwoh~q#NM#`xZl,SvϿmk�8þ%uL]]r74Ȭ5<X.C]!WsgBq5FXec%}G�|6¿h][yꝇk?D]UwNo6on]xQ/NٲDĩH7鸶V>c=Mr?8?urQG)|U(U|+NϿ"~OCʕt$iO_xJP J#ng,5ok4ygDՎ-NG/S,R[("+N 7O<%9g֕߰oV(x�B!5&$U*) o�lI4Y w%4,dzr.Q &7Ryfe@oKUV*R ȍGxL)I=&1/"o&l34o[웢`'z]@<m7ba7QRR&:K2bgTyn_w 9aƗꬸi!XPw\!(S vZ &�͖oE.Jж˪B p@FvnS {1XBjJ4Ɠ:v26V@UU[s�޷wSoҕ`ߚr2Ͼぐ!7]l)ilBaM˭fBzIh'[ AGX~8Xi~̕DDŷSʙc*n8F %l# m!DŽk'!f/f/bDmE�1Vק#@}N>4t'.�~ֿp}妃@0\^.x`�P{okvKH@1`0U%j5`�WLk^%81U#5`{>Fr2篕|JiώUTEqU@0u 7k{C V?TogxȼV29`t 80Ciґ߾Y쑈?av)k7Yv;]F6u0<:1NVM|Kcȧ ZhB5V/<o_;Rkw|[adxthx rȊGw۩( -?*O'"%E@{/vC %:Ua/fI2@t=*ζ;EcXI/̫o6E F�Lu1w Al^ůMU1[8\G~۷}Ʒ9Ymuv(@Oڹ6n }c}Qm,$UǖvA#oU%Ŏo#tYq o#E}qu\ !;w}Cg-9LXH.i9z\ne]) j@i_X6.\QͨxyS(T,!r;ӄuu1U@-o&홒B^fOu1y޴fbb imV3*3P^!ڗ..2z@[D� إVg~vm$99pIpLKENNd9ouo^Z}hOPYBلKݽEUh _o]10 ;Y˯[ǮSג"f2C<[25i}+ W`wwv=tϤB�Ur*Ѯ31 xW-BdM<oIvv:- >ȿ>mPHn@a%r DB*wy! )T eyb:4�`[N]in˟�OM7 lT!_9Pt nWD�HVj{Px^I[DaAc gosNPܩ,x]d.T_fK:uݚ2tPcHԷ}=5.-E ;@\z k 踺%sO +;t̥@meXKV('y�XLN]'<LG< t <si`)]}ğəSVo *H VQNPJrCeA�Q?Uo)&Q UvJ\�E^M͝i;SL +BUڵmT0^+ pZGϻnfLRą2;C ܛF-10uݒ p_,TRhgQFOc_ ’Q>=_y3s[o*F"/ =4}b<JJG]Rf*DÑ՚u(Tfr )Os] F>Kk~A@^O)S.PG}c-{h`/_�)х58G75pE}[jysL7Č@}#G~m}45oc&|4j|}:Z0,Z҆JsJ1,ך_8obͪ Z_()TsLBPD}x$7}þ5OMvRB64H|kv'PP'i` Vxt& JWQ Ou,笶b.mES5A\/ճ˂/5_;l:!N ^fIm:hM,tHR 39SC>B$ti4$f!<lS@"7]fw�xBm'uʳ|T@-vGy�B;M ufE&u>HM藩�7ɷ-Bp<{" Ntm=?4R#sfo+t¢" EiYac7n˼]bRϣ�+e응N S S|?kk3؎~Qt"!T CV (*k_Q4_{Qt#&cC܅(?�D_hSWZ~_Yv/ʥ]C-&0IVD ut2.�TK!2es*RnoqeG{,nщʕ6ҥud :&b_v#pByLN5<̞KDeKFbqd^sgK"3LN6UaRfļn)�7.H`KiڧtBF.pt 7*fxC׹UTہJu9Ue Q7,*,S/j3ɐG ’]iT%�,WM*%z4n3hy#Z /o:o/"oz7W oNӝoc :E(B("<f%ND&VYF_ߍ·oK; wpO~iN `u2u]G{U[XPH}Dc~A 1w=O}D(w]H�|2pA{I5TTfӫQI$3rr#%yVšmQÓh,]\Q Ԉ#$]u:Ҁ EyYmqx 87 [cۼ[i6?pD2"]kߖ<3~Qߒ:%m=%Ʃ>]}xhi&G:ʍRzXߦd~e~ @B.DZ! gꚂbZ<Ru>MYP_Rzr=)daJ< P9!.NjrYaO=U Is{ :{GWInWQ&6-HIBPyQoƎⶃС4$;WfkSZ''Po^a_=$GJK0(n8*l M53 q5Qm_ȞBfCxÄiO\ ]j%-淃;0i/W_VvJHBf*eD'Y �rZ﨤6^Ҿy#507L3Gk8M"LUZ]G[U <ȩNJۿ6TUK[#դ75y(&K8c7?’/M+g:Ukq_UG!OXȒZvt0j(XV rwmd&tQ,-#Uz%=m 4擛8/3YXSVN@e$K:n-N:Fෝ6^ר–(т[O6 $QrEЪ*L6g i,7۟,`1T'7z ˧dZ&B`D폽7YTYqR!qb ú }"nQ-ct.jp2@tkP'c}90i|s%f v@;UE@fŷqVqKP%8S?A<M̲||(rFq4\l o#-)!�\䤬 NB r ;U kZdSS_ A 3AIcf(�R6Ib [\8Q±LdzOK**K(ב0Ծ!}/` œٷo7,}kg]z{J'z7wG8qH,sR5*Ɵ0$TQGlnE&�]e+׮Ě/cUW O[LN/ΜG5Łq*uCTfҿy|t$j$Ƒ�hlq+`qԘ4|,[s!ǓP98X-9#;eHo^UNe*WL�o})BD=P.fH5_ͭ!4Fv‘⒤l !O"]L=e6 5jNK[ `'[2 noG{qIb;AjD6j gM\.WtoZqIh'XҺ"[eWs ŹBEg3wդ |}#zȱ0j b{C֨h'?TQR>D/'tvwMWw1C{:k{\A?:S݃F)XMQS2U]IA[ x7Gceż[hi#t Irqi~O7zI5] |=YU*rORf {]J%d%`7wbjVRɒ4y$hu} O '~yz( yuJ3_SRzPT/I.9}^6мaKO)pMͰ,~6L@5]yJܴr:/3;І]x6ix**iD>5tܢ�496J*fkD$z^U쏕rAjv? 4GWOZwYtjh^C7U]e6ѵ{nvNIPƾv W7;Im17? .:ƁfId9 By,^)xe6!|a׿sw%I,RuU{zd·L~j?ۋ3ĵJH!�-lso.j?qiTa>FsErYv6PQvҷ\2OyR׍̥ G}$+<jK[oQ3h>acgЍHӟ@XS'K\yp#줔MZ7%o~V kjz!xjjʻ"HY:%� so7Nj񜮝X\tVdKoAnh�m7sΊǔRȵ`-#<]I(ɬB7H%IogKȠT**!5<r:ڒA4/nܮF:YL\S'3]ltӭ{ߒ/\Krʌ̳o 7v][by [w<ں*y3K wd@r4^KNizޙ1GQg]it>ά3GOIQDK%6 sFf°ʜ6씩RwVQӒ�nzs,U PU+L,g8!|m͋"Kk왅 AyUjS AUCeɫb28& 1Q2y&0.UF;J](Ka1x. WXbpoa͢M s6'~rMMlgy>yJ-B8&8J~Rx.M SDGu_*_=|yfyIbåkLosާ2mfnRGu�U_PDI(bߐat3Z#e 5ܹwSuB)hfEvj@'}mJrQL= 7`ص%HߦiFxLqk'E&l 7=s<%:%-A5&:,aw ` &CMscƵoYq{FCځUF#LW�:U+;:ljӛr{Tug69]$,Ws<?eڒs%^ZBw^yEi;E?.-t%Mߒ&+L&4;wi7T|,6"k%uyN݅7{pq띘VMt$53)s ywK>dcF%G_to~z#_;bXl 5^C(0Vw`■29}[Ft/|75 ) N�6E0_;p!PoOwlsœif�*g.@V4zn^ſƼ+ $GhՇ?(KR޲SH?g0}Z:vCb޷ìa7b|L7,OJsu\q8,Ј}aVVv[n;RYQpJT-sJ_8A0U}{t+TT ٝ+5olݿ}72h03:Q~Ks}Sg`ry^:JNZqw5xNCcşWAyLFB4Jc G+խq(^U1 v&3I<K`._ŘNj_8*7@61*3*d ^=ջ>ӄ% o?$d~!I$ 8WSfľei 9N)p?k) }ssSk¬fI~E#*~˝}k*G+r`/IUeM\7NqFQ4)ҍֱ&.0ouQ>T)ms'vݧ, lw\$_dNԼ]0Vr>#.Y7-KΰUewfz+;Oo]mNj\U!); hc$-y Iza ==ehm}UVuatq?Fxr!=8V^. vPT>Ou$ h fS$ ZJwJZ4zUl12Ew{TC}\ ѫ,E!yB, 2E{<|8^剃Vn/*Y |Q/פFo;U".^QYWr?">[7>,SD(IEoK|{Aiw=.Zn1%9RO([Lj6Z騈OΜ /pZ Lv_̧dҁZD,y=LH$ʝN,wn5ɞ$*o9u�cY~'*D nA&I枥@�q9Bdn6_urwCNn"D:;&JuoqA'.bHrŷ(WLIRRb\V&-_ku齞r$  sQ�\'ϻ6X(#c#|96ξM\^XVi)<e^Ӛ)ZW^7\ⱹ_Ճ1#{܈S~%]l ydק]:v{e1Q2߷䘧3M'(A<b^ȨFb<<%mÿ`w ȧrMwzV7zs>5V?q)s\bJl.\=N%)xrRF"o58`~[bں.KF]y*qʸn$+Wl꺹,9a^`D̛$;uDȗ?koZ$KXtUM^Iηz9eaF?:7LMEWUI2�57g&I;S[!dɹ $YqW銚&1ns2Eξ@>4v}�SG`ɒTXx\VXʚ}滧m Ccoa/fr6Q.ם78�f.M,NoPߤW>P;|CB]DB4ZP2�cfyƋ2WI]/8r2[<te̋mǼbkFӨbܡR뜧3&MQU CMUPTM܎?FSɃt,xj}HXBdI\3p'U)"n;"RR$gE5k<NwSV3cv5R`Y0VK:eP(+ֽx^̜2@3LGο`#c:R ;ueQ͟D6#Yd†M)uhɍ@S^QZ'pķMZ(ݸ/.`tq іH#-trM|{Pd#O0_&+v*[)QTPt++%]}W> ]5MU[Xk/x8f9>O>2'ƷTv $}c΅ nyUMGa&k9W){÷0ɝ~wTm`cTl'K*i[ZEk' nS֪>qo#W ԽBUv.}X\;g^> [}oLl^ RJt#j) q&}:޹Ğ_p`h SOp&<^3/~sZR-E UK}3?%;7s3pe'}q*]YRr1KSokq3ħp{";,ֺ>%4L%̻ﻯdsf懜nf-Yl0r^nf.=}ZXx զW p 72B9gRv_T}i&L, NRtX/Ln R{.܅lJ'1O) YƗ)Ǻo& n*gDrs2 hL|Ȑ|Z7\A׷a4mWR#Mekg+I)g8]J>xcU:dBi2YiYxδB졨Q/)y<l2dMAHz1+Zoy}RX }'o.ܕ쬧ֻUD͡^.yy>inhMxTs)ڒStiՐ6M*8I>LvZ@AuRֹ4xN݆2Y@n>z!)8#{O Qx鸷-Ym_o3}*}<U< úS`,``B4Lu+t#{${m k&QLm˺ܮ^LrgtUrհVQꢹF=&ηmۦ(m$$*1J$ S2Y`T2)HphZ=8$ tW}iיᏕwzv)qږȼ3IIX\d{3n hԏD་,s$VmuHc`~ ]!2Ԟ;yp~/n�kkž 5 [կi]3EFiྡ.uZ7x(S^S 毭?7\�?(W} 'q@D\%*(G/t3*Tg)䆓S~ꌝ96/OIJNyA2F}o~:?su'"%>bޫfN AYw Y0Q}9GyAv_+6TSsYKMUVt,U,<`#ZDuҝ4e~ h9j慓EmIuj5 BnOuj5n~~Ѻ~'ӺDYgW;O[X,2oOc6I 4|@jwpczg\<ܐ!?J4?TFL"�i4*ط֎JɘoK™e^?"KEv3L#ӡ#w%ϥL�\K3%v&E]Du޷%jhvvtB:t/M0 ,W:(sv:;%X{4o<>dR"{ШS.}o~6t߼8)\9_߀I?vVp犔Z>LVoT!)�_#7[dm1<;U.J7VJa)R˽o+&}~ #O85wad^’ "P:~j^Lٱ}~U׉'_ ߇Q}{Z Ko\鮐jNeukx4WqPYu^u]f^_ӟzFrie|HkuNJlbYNяv_C35_(':a\<3/ d 6^w%[?m~olj^3vv8?d>]oo,?kkoo߾ݏ}orF}մ˧zO1ayOL>I"c&C_g7ZOJ*gTA{•vu<U-ZDm;ʙgzrv ,gm70N<N2%n9P":*.pf\z.E5̐֓T (qIav]TFpA)^ױtaBXJZO L3K@}ic ZdV;6Q$<Sؾ3bEܯvFQ80 lŅQM|z)Ă_e?)ԓ(?DOIUAhb'p %?G /U:A=~suAk-.65{+gN"{t/yߑK9=,R#1,+N\wAIoɣ.S'U}DEw EO*B'�FU"c r[Tu*f +3H^' qպ�G�1-I|*5*�/QTV6g]b%r"|{<s]"kf.IU(]LLGcx%cZ$\rI`:H3 qB m␢rT2i%|F)@ZפXOn֘ڰ(sq_8I,+؈؉+bh!pra9hRI\ \E]#`sp%)y~ۡ^;#Ѡ.h98YuGڸ(Q}^J1<|O3�5(VGdP],8Ds2SdeG=kvf"Q;-*1|'1}Zehq:4jEws(3T|_dͫ?ީL _4H 捸Z�^GTXGz}%J=ҳ5 uXKzB�88:'[<1eqQyj]<lho7>8ǴF;+ԯ vXztdچgkE�&[XidA#,%7V΁�y;,�sW\7.k,} 8cQQ:lI^)]=K3ο7nˏH<d=8hREyi}8yR\<nAAM0;mrm0!$ xE`K&.j9WJVJw+u"QXϬy*[ȵ&F{W!1k :Yp50X鹤3%(f?_|J4#<mn_X[樿<{x1X*q}wO<rC:#Lu & g?]PGT㔰\} j*uew<qCpL{ᤇ"xЪa-jav~27D+ɵ'E0K͙04Hz(=yvqQI!ϝ9Aj>Pի==TEG@]J8lC$q!GHW@tA4hgGb8!ݟg4I=#8F=0)({6b鯇 - q5aS%FOvG1>"Iq}.1'=cbN# B3oF@#RpAGP۷*wTN˃@>]O=C''Jϸ<,86l(ȑqyG!(%7s6m,>(wű VX(88Ԕ/?t)̰)H)8<հ>lkW5&=+ gpLT<�=zWZK |!N[:R?a[~�0<1@=`p;s >M_:X`5wam8F 8Ėy.pZqxD5CJxT##R$KR &Jc&a<޳s&cwT=!w,#<{OB\,15 *Q0u$V2Fgb#Q#ar JA3l#`VWM ]wJf>t95R'X UxW`VJa ZV ;ʑhOcn!@oj2Ӂ~8GA[qj&NMX29,dt=9I0i"g\Lji(=PrrE8%zUi;K~&+jE}kw8Oד¬ԪԮCS&Vti)gtPkloe:$5Aqy&+~=TMQqZ@5,jGOҎr$+h! ցB-+4@vqY9Zk#.^jҦ D~b md;84OF[ONc CR9(^JAzUOʾlbo.[serOw·"ݤBqZT+l%=; S*? ۡ `oBp$ ՘" y](D,\qvÞqT$86spK zePqqST8II,Q}x~Hql_0;iiTc0Y2<qE?})(X~ ,TAaKC2Uo@Y9Hh[\W4 zM4NH Qq{) +!M;g,iJcZϪ5N(?E0,V1!Db�1f{N6k0֝aJ8Sr6X|02øY CC$Nza=1P<5efq wp*M8 W5էb!e]1xսU Zׄp3tPφ4䒜L405vh> X4V`ar0XO`ҷiӈZXa=4 䠐w5:aY\tQ^^`W{Pڴqvsch=*p0�8Hl2n �L;nߍ"7)RCӪ\ЍP_MDۤU*kO4-|RDC5@R%N˪"X7lPt wDMu~k`x_#6H<oYX9Ԋqvظ~yz=._ R4qaTIPTf\,ruT2̸qQR+m;FT#I;NYш,2-rU$}|zIG4VBy0a|{O3)IWE==;HuT$v>Pi.͸(YkZ\seTfhNIqK+S]jMG@Cx(g(YJA%y "fM4Tj\8qHS<9W;#e,*=!cYnO*joST\=G jdј �LeQx- 3AMqʴ A$ [ba9k J``3Qd0l*仨Q&IUB$@Yk:~JU)�K 9;XX MI^\OViĕ&a8"xR3UvϝcxP:P88l4!=9O=w ~6,v�<O'RDM)H`JxMX5=;Nj2W kaFMQ9GPط) oZҥ^1"IɆEK藁!VUDt]"{fG5N!Ōg٤8bDuq�:`|bF$=ώ0΄AէP|*j*#P/I-l9Qx~θ\EMɸ\ʎBu?;5:t:JjT*vva}/Bȕ<,QV {Oj+ǿ~⣳20 ` CGXO(8J|_LSXaFVR#s6sA=1m@t5(e/~ZaT ݡ?GH4a윫kt\;Q.</%ҕYve}Qӓ9[e\qqPj /Hd\˿ ?\T8IS{n?G{K=]�WA=} Jq3Ȉ/9|~,.9XO'RĨ$h0:-OQ I*Ł9"5P J<~ V Y8k@jir4}G{S|1l]U[KW|3.^*\}7Pf|!Ų玽wW3<= t;KlHK3Ctɱg)ΙFDXԨ҉ o"v 89�̡҉n\aRkd &NDg/=L,,N\ l[rv'W+n,G⾇m U*C;hHN=5/N�@4+N3PM\Ku|FYW@V-MZ$KAy~N|=qV$@(&":/6%̚SrJN03 (qxMP(X %~j? 23P�v môWJ{ Nԗ'.?g3N S8IV$AM~# ;?Bq, 3 Gy8! K_ksAeH "Kd (.3JRz)ҸwbE=n.l ?KR:uq{#I (8ٚK`WjI#Ի +qB! .L09 n=͉.тvJbD|s ޳+vRHcJ,->}OD rP\Z 8up)b65ZUXl#annn{n:+WqbA|@ PnN{~#1j&}$Y=Hؐ09qegVs_@"oR!ӂ~z> K\g{n ƲMOzf1W*gڐ0 D08SG@h;OӐc[ PNKR7>EL#1,RM~(p-`Cėk8Q6,ϰ'8uɰɑ Ld++p;N%'JQ`ʉ8)ɰɽxߧyE6uqmF}SN?FeVWr2ȣ{&ZO ʸ( 0ja>9<.68^%x)Sɩզē{!X0xr=#[ c4*4%9.W}YJ`dv!\Wcy4X# %`Q-BՋl.f@I@N{n' Nʁ;r!Ҥ*y298z'Hq{)eENFZɧI;$'uw~D( W9u0fG*w@t n] K=ݚ4yq"bR|dyr%iBbœ4Ki1$FPaF.!q ^Rqvc꟰U8$AՋ8:WBS Y<G &j,q3٨f}AkAZwş`K a5@; !q7. E1e:U3L !4<Z#=g=iiV揌ހ[sF Ql"8$4V Tr-O7zٝK' ^aVG =Xv ukaG/o{`!9|Õ{6++ؗLT Y(Wc#q#]8^(ǒTsOg 9*Czc qɑΒh ;PI¨)'f<&]z<BH(-3P)ݐa_ Ò :J#;Tŀ3:=wUeV#>dq^?d 䚅uË�S ~FGV3.-/8(P¡!uܐО5Xx\˧Kqqj՗g?5lh,=h!X{L~z=O=h~`W7a( yIS<MQ.hq 2jqc,lAf/N>ٚFHo_GwJ!trا 莸~qCɩU>!#1W`yBSav$KإHYMAI4%N-ԔPRDMz\Nmk(fW$8O94Q˿8�)q=`8?KMrԦ@<>o Pn-lHu"?$=2>?؏f/. J?WrF:qh."Mcvl71}H;q!R994%~69pWh48 $ ]Gı@8#V`?u{r1;ƐTA{"wdKΧ|\gxFضa|. c&Chk<W\ 1qypKlqc1Wj0~u>)-g .CxB0Z}qM]p[zQ"!lvb?[>q 2pM~rLqy1pCgbc2SD ƪǍ &~%ba&L�Ռd>$x@"n<b\Ⱥ 8[l6#i9(cF#ay19Cƶ,>94l=k̏pAqiX}i;c_q%$ąv2@.,=jGP*$!<,08dU&'y풷!\GlXqS&G-`]X9r%4ì'%ՐmwmvA ߄Bb7Ω\<#OTЫCRIJcòդz>?x}Ʊaޣ@80bNz޸3V??vg\ST|R$θ.>@<= JGU~KsR`PX� 'D)aZ�&|@& a{@'Bl-xvLz0ɜ|s=n$R =2ƍ{=]>9G *Dr0P}ȰlWu:k1 ޣ-h@ HYcz6{G�br;x}ͧ* `°`p0/.J6d&=N_z\7wL!AU>x~']wh*z]#''By\C" Wap;P<Q [G%:Tvb (gF3 qޫE6>CCK)PO-qR3 :hI9;$k tI#хa373Ms],.q"pH3lDG]2~L_l98>p)m*�ӐCڬnDzv5/W!r38o "$)t!C&%v ?}/s`u\ d "!;NBv)l4W(&'D.OU�k8`2$?C\�& n rjtE5=SX XS Z@%Q"qEBn�tmɰ "0;,ر,fO%b�X_G4gg+ɣ$@a6NUY8^%R8C7ӟ?ET endstream endobj 252 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./piecewisestategraph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 269 0 R /BBox [47.51968 69.6063 467.8347 453.1102] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 270 0 R >>/Font << /F1.1 271 0 R>> >> /Length 29952 /Filter /FlateDecode >> stream x;,˒_HeϮGV9F `f`@Rah[U7 9銇r又o}||~<oߟ||>ǿǏ?׏_7G7>?>>n?翿o~#??׍a?ϏͿ#[>~|o(dv|/?pղu7e9YtLw׿+oaǶoHl4qk`}K>0 m)#!2Oxw/_~.&8²ɯ/Њ>u!(De"d>ʡCk!k;Cs3f"?'/Y+b9�O0 ,;]E(xFHWGIp Q*@WOw ?/3'_7u ?GqG52Og>ߕ^#ߏ_!_r|8dD@FAj)%2s?QX~\ G#?R¿ vc>ԷOVI9J~}˦&vr?\ŏ+-y�?_VX9 Lo =uhRESgYr�|FS$U'bǟOX~RAF�BCR?~Z;?j“ ?9qӝXe+DVk+36Q?ݨ7˃Ų�z(q s, `|3r?�T�-r@Ww;*VPdžX7JhU[ p1pK\(Y?uum2r]tT,ƪe=>9@颻:Sos>X*UQޑ#ݎn:xSeG&h?}aQ9w T,?'<ODY#v\ob>-Ua4ޢA5tYAiYGX'VS�?,v�ip=+F8_ j� 1d~LGSl폨CA)4/OAZ/_.,. ٿFnݨw$k>ʔ1l}+ӨJ?+ò{N1Eݐ&tϩ-ѿK lׇ?L<ZsF tulݏaX;8 <NX�9xvW5kHJWWpC4ho&# h|@81=lL r2xk:*g UWFOht!nOک0M]nu8/0Wx?'gO1pX׀Q|K&h6V0Xʳ-&r[\.bv"qB U"�V4lG|hHMF4n_?dhN <{V\R9v;a K""fsI!(7F_~~ݞv[i1{x A˟(ޣu:aD8O>󏺧EF�D\^>A7w2MePc?f:?3 궯b=4 _d"7{>?e|hߵ_}z*³uCxY?w~!QBtFl;/ �, Az ֆkŌ>E0rY)Jc�'`tU,JdSs@`bMK1%xJ 9j}T*;VDO;78i/�+*KFȐ'ԥIM,*Xǯ;>wHHiSxGBemJw6U΃?5Ɔ-OT?A1@0.jOtEA&O#WV5�FpSMDqhV�7pHn{B̸L1ZVZ*LWngueh<ˀ<r| D+|iX ٍBT%W5sF2̞By* 4x?#6ܺw6Vie\CC9LF5esRޡuq@WGe}r!ANCBz&< J~S�DI޹p9+8o1骢b: d|nWWbhB]OZuU!lz&Xj4EtjURuPL,-&E;E 1ܤVY*P"6տ1?8MS& U+ tYqEʲԻ&#X4UuER"C8um?ꃪLU'Vh5séΒnRXr])TPX @,Վ JK:I{ }Ld/@e&]kn4z6X@Sl7NU'K2]0S:}SƄh(L#X`_}g~ِBT+|o}6ق_KG Ja-]8!#R@%0L=nQ@EnI ۘg n)9u2jR½p iko\KJ0!3]JK� 1\+Z-N` ~%y<>H MCb{4SL7Eʫ(KGv{~3d$¦W3m L]T,�vi],ٖ=~hُOPǓ_qzA.ַi3y6{.P0=_D\Jc85�z_ݨ_p@|yJc/==٥/C^IQž/EB/KR臼Qd&.N� D]e_ & Mv{N@.D,9jH3E$2j٣a^@I#*:zq\h|ȿdIZmŠ@@5Bay u,Y{(&r^g;+}c?bޔDšuHl?T{ˣ&yo jtb%rZɼ#$4h띂2bI'$hP`ǍL<i$7uukƬ*%䚦*ɼ"nU5_m/ Cԡ*0alh:Qxswd>4.g+ (%A1|X m-1_,􁠒T;n";=VIU|zfӂMHٳև&uqv<H^MQ?-%hP{~L$[8OH:c~MlhP wX=\5e:Pg T*:0- X#<UvRhi@y4K|?,M)%[=4qd"rwqh Z|QTVc1ClUXJ,c_V~FHL)?urI4\\ 5@?|@;_WǁZHTYߐC%!Ttz]ϺR8'{,#&1qJsq35f U. r;–-j[HtzDM3FB Q ˜ q!uJ2vտd+_rISUe*]%G ZͲwCD=ju⩐(t}6[$ˠ!(._B+DIyK<ʉcæ>tL �m& ~Ų܏h"wrIfCmD]#1y< 'Wˌ۶©�T�r;fAqY3j~Eg0JPsj"EihAhSQEG@]5bwDu-P#>W :d剒BZ'd Qs]K& R~uaiMz`AiWKبPiυ%eO_DM)}ٴj/̪RM0T*rT�>6:j*YŇ)ҿty/XQ(C?]*VrHf J]c<6Rd]뒔XU1JI(M1`p$B9*[KDKda%ri 2kGaM- Ko RLURC R -ιޱF黱kP~8�>t+ ON$wmg USQW@0)~,f'ȉX`4K8>2,!Ľ&!a2Y2ѡn}$zV4fiT #BK!kJP=+`1;2Sm�r4i~)s£aA=,co6L"5Q}5!dfX8Ramp#S*+ßDn+c6�{)Q?59DE^~gu SP het|ȀLYQq;:Z&A�[7:UҐFI`nXJɌ 1uϢO:@=r(?oUR ۏeH>XW :<@T?`+@Q]涌qC5uAsVvOcnlY8LU:*I9򸲏t;et)P۫I{(!ȥwfvbKde!1F~Am9%Q kn6/A=$?]u2>I|c[WBź٢ٕ:}(Xþc;:jf@F-P/@5 ]xlOɈLT_){gО},Hs2mnj~t{TR �>GDیx";]w!fƄb' o.=L_W8'0QUp1K'gj>>yqI-ȵ5y*96*Y֕V$@R8QwklJRKen|oLp2!s|;FƠ$ ,]KEaZVw5:ZK+`S}G.p? D)V|4K^Ru`6hAvg^G-2XcRL*.7zuT`s6ŢL*;Ee"l(Q A۷uN",f3U׉6ptX!-9)acQ#czyB1dbOkbbchº)Len4+ d{ZYjLMzg3J& WqQI(QB k°sS'.bQ,܅%,J1i͜)f*g \ b%Xx\`YIG9$ZDʏ=ǵE,ԯ]"B-iO[ۧ9-/").x}ތj.* B/]YQb"=De:S;Z<zDT>bZøe;D (AB֜SWb]tW*:ֵa&N´U&B{l4@(5تD^68CG)l_N^,fXWXHܒN*BVk݊%,- "9Tg2 ^ԡ䘯] ܪQpo7RsX PjůjݲTo93wWtA]p9RlrE¯n,2*eU? o%Q]+6M-ק$U FNŋfc麡: +"mÌ cPP}ʠS2aĭ9ڈjqdv)J%ೲ3*S8a-c4ĹVNP[<<LŔNf3[61u]*Q+A+9R%(6gIQ& (IHiw))au I K2C_rO&#M%48ڤ$;o 1&&O#\Wb UM Up8�X*z>3Y>u&iXCrjV+ >Z31842xeObbeڟRԩ)s?vP[*yMPTA'%U65t)1]EQ4~FUQʐ>*PLiɇ+5.9ݧ<@%c3볐gBp%6|vtt"֨錻)մ⋺SJADxhmUP"(L:O\A!9+%b9pP\w(kREKecȶ3QuXT {hX!Wr;ch;PU{?E�#R8MM*BӪb(N&opC5: WWY* eer؆$K�1*U `l;ymZ@*5:)^r%,LĦ Xڕo8gcD uI/eP#Sǧ'Uh +eXȔId5oic{TdB\j;Kob"I-\и]#\PpOQ-HpKaIi(.0{J=;QNfmf#i Zg{=q�)BMBUͨĤfsNe8BV!Tlnvښ\j-eY6YPLe`9zT[nʉChcXXQdj!2b)Id1JjWfGFz Lb^eC.hJA3j>7l>eze!yUhΆrFa]pO֬8FAt�ϔRBV (o`L<4eq(=~ڂIqhKJ#i BR"4eFbRˆR"HmgOugTQ5s :ZJl<˕Usn=5^2JȔj:@&3()7Q|: aľ}'U-L/|vEnj 7bѦLla.In+y1:I g<?UxebΤ%Q jAyGKҳVq<jgl+3$z`k`^-4C˵ںк}}E�zp u)/߀^uQaȁԒfyП><V,츩>$pHjJ֩EX�x5=oqP`>ZZ{/l*M@H"u7?l?AK-Ț.JN@e ['D3gQ#j*4KDP:s145*FbWzJJ Q7G/]) \q*0s1TK0SRWJNi}:. Ac`*RLԅ0a*υrpPƽ*w \jC%HS>±sQ?}2Q�50l8;)QJr[?FUb2YmaJ:4m@�>eJ+\)dVJA(8u]Fs;KD (tڰoFH5 q-5DT B;U2oyZ>$/LiwʒhԺ& [;3]kSE*cdʯLqE3ʃ$ϲn(n~5%;ÖR5LJY,OV&hʒ01\UJ[&eؐZYBTۏR[/E}3kka0ҰuBdu!iTޙR(OX=+Xh$/\uUD;Yܱ'*N^@}FV@l6\ñ%&fN7nXBXcb钉\ 7َpZH*:~4nӜy x{&F.֮*Uo&c4ϫ/Y,R`, -PufM��U_K@5[Ta5_I]+b䎼O-%ve,Lw&"+X m1a2u,B-P C9rpzaSAr\TvVҊ hJ%D)fԺjђƶ?bbb#A/o>s,8J|NΫխ; Mr˪jKEXuF+I+-uQdS< o|V81u1ueTmBpEf^ҡW2e8GCKk6[+$z a*@-eRWJD!%f. ,Xj"T)tVuGBeTpndhEN`]rѝUu(x4\QIa6XK(*b9VHc]qTzzrbPi3 ‡ʄ~RD fuw!I@:ǍM1D3eOU]ΉM,E5]*Y*<OBLc#-##I5SS<�T&%Sp8"McRW7AozO~JU5>Q%J1ln*CĈrUr9S,M[<A{jV8q*C( c7:kxE#Oz"SQC0A`GO$ͩ,$R1BV”T|tV>R J 1<g |g8\R(?pRE{RHIh`€èؽ2 =Sw lVj! [X nj[n&HW/<CN=n-δÔW?F$Qn1&Wη UJ%]4;Lw1b1?lTJI-FK?˨Z?Uzg)8J>&? K òNSglk�n? Jja𗞿 J?8 ]1:#q'iɏs:j2`$7V�KKx0� +ո2TGI$lw|/oSKe> ]Jg9' $\*3P/JY=PeD 醴YNxtR lRI+i*e1zJ4v+{<@\'*gréZ S]=>o*. iUo ~rG8&b/Ea^UMR= èH>?]Jcd33(8\--0}~'[n/u�H5<M U4Ф@OM+)mҖ;1|:e$?D+ Lv�Q9)$R*&NWbv`]rb4T] �*=65b&u0+џ ߺpO=*[:UFQPBhdR݁s(<ѨS@Τ"T8\ ccveXr% ϬC<@02ID̾#UP޻<`JʨK)S!پ^4 M4*ſ8C>L-I~ܷ)1)t8 qhQXTZ"XU(QXX~Ht3UN VuJm~>NӢ ШD+L1lQ)":SR�؅<,T$ _Ʉ[1m50ύbzTk%ԌCC.ӧU}Zrve�mNKs@) $YYwHE } XS`h^$^6yRDLevqƩfS%-?*$$FdRKۏ=El)#Q9ڙî%ɻVXC¦Y)*y_ ,*D'H$&Ţ3ڝ�uU7'o?O@g J*RtQ Q(8PlF5do 0I3>6Z:zPSLq֗WU>Hz?Wn69(RN |X:r᜞DZVu(wRe;ʫZ?\Eriq)"eԠ`CH|)TA!BRSR�&"ОKʣB�#KĊYE;=׃ f.* eӢ(b *|"d1 &^*>\)`Ď gPt*K4kfTr'75M~M2EHsWzZy ?]WVYGH\Z>$έ|O먬 Ӹ^:˨x=mk휨gG;;Ҏ@6YH{sJJyH69`mZ\V4J2hiNB/j4>%8EYP'޳a*ZTO XjB}IIOy9HdAY,`.>!vσ󬖬"dPd0:%}H"`hJ*tO>eb ث Yj,u)]Rݏ' Gw񸰘D.)?]Jԅrf˨z*SO`iX°5i+0d$ͣŕ=A (ȫ O]Lk9@42%vkM?\$qyske`BPITwɸTJcʕх.4:1D^RaKEhALMFjj ǹ" �OzU \.եcWMYS�<J=:*u#cf#X4^4ɩ(iXCc>ٍ &L= PXODO ˶7GLp[hQ?c`|5߰@ĚܶkMi^R yH`\+n QWU#Z iǀdJیeA ʑmpe$B�u V5KV@TubϪTw<!R.WXM9&چHoY'ֽwQSOeHۍH`T �NT9M (*Z1ȯnk<([ILl׊ i6WKDP-N_.ދRD613h`MF@L 'Чmya$ARFV 1UB A!njJ�"QBoaO t`eА,=&?Ed@ "W|ODĺT3Lrp!y Iw]e_p$TLTvDlTxp?5jZ7T]`)|:٣F)gi2+@.<ҝG '(P(PT]*g/}h-yRy(cPARCIm`)50Z=7AӒR*D[qzS/@:c\[.fUz%:I'VIaZlV Z?GdZ^aS�KGSzͼ!\*Ժ{hrC؅xhD).?|H>. x#f;V0fT|T+ pj GX+ O3lF#&�*W*mBǞ<X-nEN,KtK |+adQu:S2eI1&T})!Okq(UT d )[HZ-KQ/fp`~qe>+hU/ u8]3s'bC5jͣmUS�(6 7͕$V�MnG {Hm5uPU˂$D� 00Q.Xƣ9u˨ZUmFA[<kP+8ԓ%MQy8LSr^ a :"B5|O1x�9%{}y LzRj¢@~8< fj# a֋:\=pTI kҡ؀ݥm+rqbRNeizSlLf*J*XX�kūVT׊4-)3*V֊Xa$#<ϲVNcV �TvL3Xh˘V RQ/J6GKc]njD3UdO>()6H0q$JdB/w1V@qvͨ#7跳T?JgPhcBbDů<j,XS+,ߥ-Wy. X>KB0?; H+1/ Ұ$>uO^ 7(Ou*Oe9m"OGaAWnaLUQ(\²D)GRN6\DkLj^nO!e^>LYUR3j|rANDegB"l۲T{*ᓘsLv qrH i W?HDŽXL&fX?Ѵ:X iΫ;vI$3'%/DzQI/4XR:ci/&AE"zWO4NJ3B'Ry"MD\+]A)a S}RT=&#%ʈPJk(~<Yqg "svO%͌\GDQ(>;*gm?~^ ]ɠf;d"t'*tL^iЈԗbp])j7bLLU-=E'K9XFa}?繁HȎ\GX-AYwPOz;u{xPo:zkzWPwhC*Y<6/A2&m6 `v"ZZJZU^ RϘ$۠b2O1ن⛈b{)8+c}>[Դ{6%ʼ[El֎r֕dŕsȴ߿fT1j:*FHa}/lw@k~:d (�x)HB܇P5 -хZ=-o 6J 3JZ _&c _"4ÅrtgCT, Q, L ,Mm"=F(Hјd'y*VlVĩ,?wQ?wt�<z'#&[$;3A1ґ`RbG4bR#׌mܐu:ӈЏ70] Z_V_ ¯(尫<( BqPTuLx9*H6 _w֡,;`ͱ@P>#Rg0kg)nQʁ7֨{/%YQ) PtsN*nY(2fkPu"vz> POCQv9hcT慽jp[_s,~6;ܗV %zg%׎ӼYQM9 R,5AڻҼť2W{H<A3l* yM4Ic ?w:{]SZ)�2H~@,hnj>USp,]$}g=}҅?�l܈)coK#),bS!ӋvZPhGe3%}Ja KBu}zЏhyUT.K!F׽€B1'*$J\ J]YNKLbb ~fzwY0IewLԅbeuX'uiGPPB*U'Vp~oAY*qlѠ:EuLP Pa6pRmٕ !-AXկ4 M*/ qeX\r}rI 40o`75(pL- BXEyvTj|%MD'_"j Ob&?u~lBᄟQ TEG Ul ƕoƯߠMFFlrc \ϴʙdK#;l1*/7H5hسTĨveP9P̝OGf<4\>AY]a +&S{#>?GeU}A�RI} Ď|1ʩHd _XTZ¢Ny nIɣ%l~bԄ%�6:}EDQ@^ٳ=O&ezCm W6N̿3jA~`5o sh N4| ~i=Q`JTGտRšͽGWD4DDKlj$#UԄ Ҩ.wRꤊ@$ eҧi]z(D- La8 8 b}�v]| ACo8*~YG~~(:^thlgW 5dh ՜/-B(R'gURѺGL҉Q C1aȸT'.*GCPl=DFQEXQG<DN*F�w8<!hIL.5L&<?`"kGUJԌ,UbX_F5=YvIcpQbu[u @| ؁Y{e(D�X[xꀛ\wU B r/oXǑGYl.N�@BA�#ELI:TY#G 6jjlˠ64|�hV1u=ՊUܜI)T5(jWUԢXŇ)+>7+TAzܙ^ cn+v�aPAiU3=)+aq` 4]!+p VDՎVY_ac jWbT1%h 9](`~}ՅnZOݾN)hۇu֤&33w (`[(AP-A -j1_ >QUׅ",=H3̵ nKA&`*˨Z&`<_*[=nj/dqTKͳuF6<�wH!TjNj4Q*SoGq-}%E<eRAisXl?iAJ0g%lƔ }a cgw*BSVc5(Lߡ]nV#ULM(QMo VQ SLc@_E 1sq6Z9 .gi)R,:҈Qr"//FJ0x[j~5/؊ρ⌔Lܳ.Brj4PmL)2̜�V[ŀ2S/1(&<)~Ǯ(wj4dIRJ9j{P^Z=G 2&r.} 0\],qT29WMcM$)4jJbXq|Ģ>#;Ѥ0a7Am/,U;T�F*VGj�A;䐈&,՗/qi!@2%>^U5 ؄Z�X>uz/*.J1,6čО>9J4\7&GqeHHqVMaH%!E�\E6C-�eofFC*Pj Dc AgİRZoȨCF,5WnsM wVӮg2B`)Ct憌B[z4֠i&� {bWOPlU}twBTuUo,NNe%zfRIvDDoσPCAn!tsET]ǵꦂZTϴb߃bji)ۂ3Xj8L /AT}p'a4S M*lJWO&e6{5�%%֝P j1A �0$ \-} BIjzL 9)L1 WjQ ?R#TN0;R&S(8zP<o0K,%COQu`h@JΙǖ4ֺ&}Fղ�󃜕[؎Jo;+%D~6&9dvBRr˘Vߐ?xUƠv{@82D>Òy̦g\E33>ǿ,ԅʑfǭC%'hFuJgQp3)+IZ  6/9 g~sGjۍY JŤ.f&h9}|8Frpw/LQF J@_d}D1/a~3mH-"R<\w(Fy T9|Q{1@A9/Z>^H}:?O]L?,pNUlE~`g:]N)qYctO(aFNjz*P|~晝o<KTHAqrB yROh%A?[ك YhJAQƬ)|_X2]qpt]JK4nslJuh~{lzT;$r`m Z?yxBh8)͔ي:]*HYĈ*翔*Y?VAwR G{ HNuTjS-*,pufşCu *Trn5;VeMxOy_RG*I+>ʜ  GKr,2O�,k]Îe1- 'Wi0+%RjJV 0!%CU7 NE:hUB}tXZ$!IeO|Ux i 1 Zg4rR5*T4kO~o}*R!Gۛztߖ'Ϻb?b-P.{ Fn D{eC_}&'k tn>KoE2?F>|{Vپ#}Dp۳LxL2v)(`y'_F ``{el^xM8l_7A1|JBgES? WoIτ65W7ڿe Pg?p6)m>Ewzx<Ԙ`s�ncRM7M_7>ITDϾ7=G:U_?_&juZ o7X>ąLzrQ.̾><]po݄8Pl,=7�6{*Ww9H1oU!>To['=hF X7fc $*6g2BMOz5wн7޶q :#'=ۇ?|KW3Kb~VG:lln_ov?1|E"@sկwғ޺Ɵ$1:gLx^sz፦7 0a/ M!^O4\9p%R=x$|h{78}!eN’DR1^:P>v?pu%8hBOne7)2aibMs_A|掠gfmr>WcMUGe T[q}{ohOgw"i!ڻ8Õ!sd9m݄g Ȣ}#5喆}i؃0tk>RtXytz +fcg|y$|o=#cwy1Ma :oίvll6>;64=H'߷>}H$ᶩf/msgA@C6O~Msaߥ<>{׋o8=}VJG3>?:}ni/ch;[q[^|}j/A'%_p 0Ͼ}rV9,Ӟڞi \!}^ĦRep^|#<_%D'A3>h,r_AC4^ZM~YU3땬^~# _ Unc9H/G q4!~aTIS#2ho2^3 G@eU*-g[?YOb p;_m?W ,ni{ r} -_Z`y΁"madpT Mv.!2v+?O@5:1?AoS}[%?o]栳Ͻ3яi^~eC? <\x3]'}.{y呂=:2O/!,|vv8{-Ylh{?<L=BIRBn6~/&dϫC[ ߛ}C&Mmu$,0]vijl{o$=G |.C{<e3ˠJ5ˏoۗ"ƙėJÞl0fo"us;uOY>ΰJWTe/y9W'1v{S"݄'3f$q. SGdzf;>:@fnS7X|-ݾm9sx΄7}:-R!iCkιco`ߕ8 њB sg~Ww)jshl1Ton�=9~G5Kׁy] wm _/m tg'uU}|,4\K kmջj[o?|ZԱ ^x#4M}x[zP\|b�ϱLuN;ڿw,Af;>K^uz [#kkY)r%ti/2%hQ7HT}3럣Ͼ"Mo2?Z> ΂wx~9K co8?/,cz.h9g,+ɏ^GA>Jx/qO7v/?DMk3OW;)\pz,UhwtiF7>ǡ{b7e<Wlo=P@sgU}۷5gS5{BퟠppSdr\wd&;nbzHLNfMM2::-PY廳lI;>- ߑoڠwLXO"q^NX]#zgO4D~#.@/!;g]]s{zz ~;+u|m1*}yC{ѠD~o*gQ=.]BxNn?bj1[w^9CS={g_R#RoЄHޏl7_zI4E.\?23}+\S:]"qm^fFK iQ㹙ݿ�)=_>_A'^Cyv楮nygb� ׻M6JGO]!0@~=\?I˻0Iŷߋ_ijdFk!_ʡC;_[N,~{6X75ih}Ν¸ O/ϙzޛ{ąw'шʫHWGNSć =FOK'@F۠k">sh?_$h;F*[~|ho{gkK=_IϾIu/YrKM^`A~z~{>v9&eKo(}h]1X>e8 v5CfmsM Gn?:Xj{M}=vߠ+?9c}h\*Hygozzl~*潍%:&^xIws5|/ 4{G˷֙`_<^ExJ%V"I?YF;:#To[>+M '[WB4Р!Ast$lYi|>I#~?Haohy|{ox,Sohϻ \?]opQf:O9X#^z vz"'n[܅J6{yܦxXc܂(;Twפa>HVhjyAKoŸY2z>X\ӯvU.Uގ6+$8{)bGGO[ѐMghފy&9sd乾ځ]p,=m5s,Ո쩯CARq͋"*MU:6%1k!Q>Gku^R݃븮WPK;f9 MRu d~7s<h<rGt]*f1. ?/w_|sl8 TGFugNc}Ҷ2Cw8-m{;<{݋o8I*7 X}ߘBw6鬾OKSZnnlz6un}w3cY^v#Ss8sonq6 _`#2[Ѱ.U<HpdMƀ}6o7?W{Jݗ_`~;M8m{0}lmZ%jmk7g3݌FyIm헿MI> o?&>6Ot |tF[YHv%KWin}-\{"\7xo;K6qӍz&?.V?ҕ;t>kثOoF(/MQߵzg8 dtnWQ|v"bo>i?n?4^ 63=FF9z>+XL|ebe#;a9}%ذ(%xz|Y>x_:oyU b9LjAzݓ؂Y߯|>۵Dz{fnk~Gi~÷^^nnmRdG7? vLs#M55^~eL[ІR]ڔh~[d'H_ E`/W?7~yїO Ӛm< ?f?mIy@#<F!ӈD~$* ZLHw\5o4_10{빭>wc~Gͺw2h|`ŽH6`o/޻2CuЌ4G_~W&k>T>R-b,XLw'^t~S͟<DŽ| ?c;h?/{}&,dz4.*^}G46-?Mg+}&U^z}OzoI51}㸷Yj8+󟁏$Q|A4ݩi=r6>~ +ev{ZbyolM}agK2iA,fmFd}ECWz u95#f=ʀ[.0v>:0ܾ^ߋo45ir(+J:g6T_~օ~yd} ?#_,3YA;kx)<QG~#$=w>&尭u]vklh)Ļs^rqpn7&>nygDZQAa51)? BzcZѢ2gC奟z]!W/H8s@ fs܍>h{FOĜϥwMo4b\;מnP΂2Pچ:l9ZŖ2n.o5}Խ3XGt~ 9T<k&߾Q~)?OSc?<x?'=mm_{;qO_^8#wχLwq_2~X f1pY~q|O{鍤/u@y2^30Eu9Ɠ9gN阋mi^n1~LtIBcГ87}269SZ 39foZ g֝1ھr0 F{Ջo$}/͑W.[d&='⼦e"['Qy)hKl{׋n4?^nCNk@3`'ɛwz񍐗e-ti.%Q)m/e 5gjHrE{ x*m A?<pZo�ЃF&™; 왥}y="N,^s3͟}Kң!w[ɐMw-}\Q}`w-hJ?`ξ' sg:]:X>O_qw3fg/⛝M0=xt?R4*4*5Ks]X[fXѱMe3|>(ߒ;y:^_z$͓AHm^!u'wC(>6߈uG݈uLYf:0\jΕƪ+{mqږ6M`?M<#utJҥ+D&�?l:+z62<w <oMNS;ݕ1Iz{{+/EKo=Mj"Ff1TvTW_\)o6VwȦvI}h>b|o{f-[߸&ʔg~hs'G;ܿ]^x,[O=Gb3P^x+w ҳExͫrzYj= _eǖa]#|9sIKOWY~{D)>}ʘ<<]KMqWw܅fސݚ< vUn/u{( PX{=~f:o d=~Ko}z#/E>GO- beO_MP9zrڶ%̜p$wG/mFj4~ßǹyy'|'tWp&:ޙC^]-W/l|Ho/f3g?| ^GnoswS[k 5zIԁ o4 5�ٰ?F3 cyPX⾹&{ix7ž}l@Ά'9[mX܈gzf9Go3!WIM/٧&@oy=(EA|Ow_| !phAX09zğߙ}9S>NEY&?<?΀>ppD }tq[vd[XD|Dz; <>距Oo7n voMfF{P͵}}|G?ohzǹ~&M/w~ 74 =\6? 7|E?uCEYӎiUx{#Re4^['f(o/Z>W~}\~,_RFoNg <7Ɉ^)0ȼz]Sǰ<sFaj{芰9 7\А0oUxPTkB￰}ENw8?-D`4.dwq~?KQďd񳝃tޙ򧅓x!={ oPߵRnya/}pF]SU?`1pmK^o֦i_PfZL? /[Cb^?>`OM3oDM~w[K}6oC{X|#O-}9,:_?)E!z dQٰ}#Q)6훪"j%J" $.Zӽ:u^i'm?M\= ?OpT~Y6I|1Km|',=n:V`{MӉJėR˻3쥽)dn\}o]f{Ɨz`V+אeӋo$;O#>h^ʩ_}j S^GϋU358}zad| mOfˬuMws _|67D7y ?7w"^lᵗ cwE{ƻ& WOǦ9h~#&?m}ݻ{tT#iƾ𷫓KOEq&roW~Q0twɛ-g;߻Cfe$yG|gF^F{VGzg{gC=˼[?\π*`عn,�Ru%^z#&= 9ǥ9.<zhߣ(҃i {ЗBϹ})vs}jpG}>}t!&;{w\~c$~^|GwYaӤh~s ]b_-/ICL0G{i2Q|f]87$tjo <T;L{ԋo>/wwn|^?L)gS{.,|Mx32?MxtinƧhi?34MОNߟp}FXC҃ivdtc&4~~+IOtw(|ڬuONvO{;\E d\d&4!ɸtwDd/ </,J͐?Ocg_n` *i~xZNߒv'f~/IzAߴE0 oX.@*+fcukԼ_D7ڿW`t;,umQ~Ht3޵(?@?32ھMOh_/l%Ud=0//2`6g?ioxgse}xBo[^gdh?[< '`[C^Xӕz8^x#ks�JR<<~ߧñE,gc=nzO7-cgoߛӇ4n*՗ yimd{t .Z</C{>_-?-d{gm&sk4ޅ_ym:=N]jJ\7D?!sn]⟇_~R!.ol4 o4xsG| !\ y}ŀ_wo(2]CoT}$) ?'n@r8/V*$~)ZA?o^7`s[?^_ +}iۼ2 _\,a5ھ eʡ1>7Ӄy?z@YP?*bgdsn#ᖗ lq/|ͥ|_jL>Cgs?<F}Iy^ 4?gy}äaC ®9l47\N/^*p*s>/47^|C}>24^6$j^EmZSnw:f;~j|hho=z 'B ? zvx ~3]wRhxF*,cN߅]>g O%2 y Vk{wDm=snqW_J5߉XM#± \.{.M}7;5㛔F 篂XQ e/=\N{+sf(n{ O^Hۥv:j=f:NvBw0G'ojEmЧnc퍳,hOR$ՙ*"lz# Gi,Ns cg[mm_ [~ӻC!lіմu>{%ۀn]�Atocu,MB,qlnH[:R/ZΏ޳/=ϮzG@H=6k i툒A F󧫔:894n/70{7B^?~߶ Ҧ%.E7?i yoz ?m>ORIf.wgg1 _� |;6ؙ]#'މ/1Yu9-j.2"ހs5|bWrgv˞:Җc9{{&;}'{oCm0|LEsF΋[1QfI?}5׋o4] ~)1v?!}!"|u ٹt¾=q prV|ߥ mQf}m럃g`^">RNgKe:ܿvG 3З~d2`4QKyqDwⳗj~Tmo?lRg;!h9^~g[A>qmq(?oˮDDŠi7q!(,zވ9~g"aa78^y>kjU&V\/Ľ5]g]OMؾ* Iߨow#Sgg k!{{Ӌox ODW?o&:?L|#k^Hl:n3m ʴӈm>L77T/c|#c{DzVf Maûc<({޽m%Ml‰qZ ўm3a~tRlmO}#ے6gCװ <~G{1Du!#,3w1n@\32~|m̹y?;?ybƥZ?/˅7iJ61#[c"Ml3=~G1_E|Ӈ1{zΏxRd`2Xa}ÂӐ8NJ})|Iu5}g{k:Fj>O@QQK胰O!^*p|w>r6]o.vi*]Hwx"ھ׾*Y&4z>W'㟹P&yo?<ϵ߃Mx՞ym;dz_]߼]. !pvClԠ.2uU7<~+xo:{ h|r;]d.g {[kl҆~Хg2=|z}EO{g;?΃^hkMM~G@ m{FOЧ\2^{vo! Wo_{^LW^c`:ݰYt\J? &ދoJbߔwPc-hь&-w%VVrr{ۋo}8!s,?o&mGet :KY /|7^~#,q If~6x_-8={qhɕy D?c o'=fe[ཾ~?^|@?_TվտQ|dk/#dqzR֫PO?~}g?wq CFGLت:yD3bu|.޴~ys ҧ+Qmb"lpd {m<wLO ϶{8mҫޥFsoaz/߼Eqk{ ` ?=?ۇubiQw 5ߦ>>yQ~PT[zz<H"?~'#W&/3$Y,Oj'z[^~}j9Y܁ a,u>q4Ag3zk|_92R/͗g~ݣOR.ҷ]\c}T+}"{?#L6 endstream endobj 276 0 obj << /Length 280 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 279 0 obj << /Length 282 0 R /Filter /FlateDecode >> stream x]n D|C)7TCN?�b! /7z3`X~;r -zcD5€#8S9ԑ _S\af]hJ )Aä6_§xEɾK!SrLJDHqHdY0-ylsҶ/*%ܦ-kU`p endstream endobj 281 0 obj << /Length 283 0 R /Length1 2908 /Filter /FlateDecode >> stream xVal[W>g;I4MR=!Y&Yڴ~ܤ 6/yNmq,T�)҄VԎ_$@\@i$? hRԡik̹9nR ~=ss9gom~ 2+kx#</\2|["5ߖ�TvV}; W%m2$׶.vxd?,pu͹BQuJ~|?VolhWpw^&JH8m!H(h!OO"/vN?v,/N[h`nIQ Qa<v5߼Tҷ6]}35oT]gHXra+;rC]}|sͥ3>CX&iRvI=qKue\:¸~:(?--.{1;Nq!C_os$'뽐, pk #))KOo'@C/yO'ϔxO W +(I>? /̄MW˞9ҩfӧ<u3_Ď.P{[8T,!-)|ȕ633"l (s0bC&E>if+5cG ~;͌\٤_Kys x!2QaXhX<s\8R,UjCv ۨYi:U tHl|>g[H4Z0Hykq5ŃZFgj`82yCjUɻK?x->̈XBk䁘ƌ ޿>i"jL{�)Rlq#_4*\1a }ۀ/.p(<y, 5ȨRo/#qwŸ#JYHTciʐj I1f1(;EJ"ʐ(=,W�Z$fU7G-ޓP\iͥ#bDcA7a~}҈j& x5e*׋aG,P .DƇާhPYc{6B-EFXrW}St49m0ڥ!!R34$MMDt(E8)D"G BCUJ#x`Q2<>$j,QvΈFC\<=Ht0oج ΐ9oZ{Y6d{njRt�3^SEO=g̙ܳ{nb|M̚ Q@G֤u{3d9;Z4kV|uk,oOS3ۑݐBr$N/d\+%`\Y& I/6*�-V\+ц^*$]ȑ.uJIΒO<,ɱG@pCA2B�.ݽ+?cf3a3�v*"%dLH؉:J"y)IE$5R@+ bA{6]cBshW,u婇ßUY5>TCA\5_<ã?/5ы#IN τS'l '}x k`06х6:8nx55 {D>Gt}#U=u3'OWzPR}pJtl~/Woz% ߸mzR|&?Js#t7;B/s%gc5]^\v^]Hb endstream endobj 286 0 obj << /Length 1306 /Filter /FlateDecode >> stream xڕV[sD~$].Τ4�/"ɗ%&Ϲh}\sU^S Biye3s8-)&uVg(}>"\:+Oi΢0J?̕>=~j?ITSq]"3|W,ͨŐDB+:7EQUDžh$\]B@GrS3_!%(1?tqbn${_%9LdܞlBQ;$btA_+!`-"@gdP:pº>@ $vaL١L@jqKfy:9ĶaKbjmT0׌k9c4d"iu RVxj}F\HJJw#gT 8,;j?>8[ֺ3D`"K[&HTmd Yih]lmdcV:W/ 1GLr>^ о)>r`xjGr |A0Y5EQu}+=8t|]pI0s@?h*m"i3]ogO{9ELb`yGF/P)RfkMleSBQ/vyhE=3Ҁ힣 WY똉G ǮT3i �eO١=Mƿdh*7BdnyjlmX 6G0lVc.L.LH#i!M D5Q"?^Sh"a'I$GN~?w'g7l(G{!+04݈Nh ^dn5io6"[9W;XV/^qCo7VdA`%O68)o\3GOv<܎IB<( ì-ï W@"7Yk/8Ł -w!=ASr߲.[R]F;Ꝕg{yb<ۑ{z}RE>yg?(ڊ7+Ɛ}9:{x*,10 H(&DiU a/SH.9`e(5dp]+*P볈Pz쿴^jγCĢJ+_&`p$I>9!ov.6JE 88z5[jzǤ{jXSsXf/*QE%s7^"J0!8^^+*M<3�- 3`h:Brdy endstream endobj 254 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./attractor1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 288 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 289 0 R/F3 290 0 R/F4 291 0 R>> /ExtGState << >>/ColorSpace << /sRGB 292 0 R >>>> /Length 946 /Filter /FlateDecode >> stream xMO@sB+VIp�DhKڳCwgⵂcPp,וRJ~ޑ7 jcuXdyXn~<MA9ns ֛d}6:\4%[_$\U s_ϕ`mhj%ѕ]8C-6u-б)F`{ :вpG'6uP}}tp{'dv:]CSW Wcrga ?>n׵0{pdzY`D>ݍM(ɕ۝ڭ;ANM:EȐڸ}Բvڼߪ{bfL ].?L iͲ Z4;CA س;<Yg󖓅wrnxii &֧ܳjOHӺ|!6iQBѪN Qf"jA~FcjgF5ڥnԴl1RCLͶ+/M ,3Hf|2Đ2dh,33R4 ʅ4TFL LLđ#!I\61̐##eQhdCdn޳j,RdbhgVX&9rYfK2rd*"gl.$ME䲉!G2h\rY."G&h,g eSlbȑ̑rlbeeC.Š=kOٞ V@6d$`m{_EPЌl,'d<p0#<?b׸Fs{Qz� æ ۋ) Q ݨ9aŃQG 6X(q)N-Ln3a,nR~8ցN endstream endobj 294 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J�"6DTpDQ2(C"QDqpId߼y͛~kg}ֺ�LX Xňg` �l�pBF|،l *?�Y"1�P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6�(.sSdl-c(2-y�H_/XZ.$&\SM07#1ؙYr�fYym";8980m-m(]v^DW~ �emi�]P`/�u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~�(* {d+} G͋љς}WL$cGD2QZ4 �E@@�A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t� CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFk�t,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\<N+UZp'pWpeF|~?!( HB*a-F8KKxA$NpXI<D<O%%QHf$6)$!m!'"" Fdr<YLBn&!'Q*X*(V+(t*\QxW4TT\XxDqH^HQZTtTҴ2UF9T9CyrG,ňCQ((g(cTOeSuFY8 C3Rioh)JJJq)2au;U-UOU&6+yJFީ3}Էw@iikj8tm9ք54#4WhМҪ:TCUMGCc ÓΨd1t5uu%3zzQzzz ,$S:! ,]b6u=2V307n5kB6q7Yf`rc2M3mz 67K112͇-NBLӓleZ-- -,YX[mhmonh}džbhShc󫭙-׶\\߹v}ngnǷcwӞjbȡa1ѱ cmfwB;y9v:Y|KKˣy獹r\]n DnRw]w{}GDŽgAg^^"lgJ)oϻ{ЇSsW7ٷwo)6Z܀怩@}AAA͂E=!pH` wЀŒÖ}  aQѿ`ɂ"""DDIz_xǔHcbW^ӈuc,ܹp<>8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞ<RTT ֥N M۟)=&=qTH 232̳˜\6% 5eCً4ԀD^2S&7:Hr0o`M'}^Z][[`tUЪzW.Z=óik(.,/|.f]OVњ~[E76lۈ(8iMKx%KK+JonW_}ڒe̡lVVܷ(W./scGɎ;PaWQKKZ\]eP}uJHWM{f׻yVUWZn`z}}96F7I~~遈}͎--epu`xlo$A{}g]m\9Օ%>xǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 302 0 obj << /Length 2541 /Filter /FlateDecode >> stream xڭYKsW|*"7nj+�%`Bק3C�\@fzzzzͻ4-Ee,YH0Of7*N)Y{K}4q俥9+<何1M*Ffo$m_3)BZ'(޿4^ >}a/Ҕ5S ħWWpW:L.zbQ/Á@gCk|"Rn/?/ty^or2wPnB gchc'dα/Vtth/|]7?ݘÙr3ޮKps",*{c-$S`T?xwW8!*-gk0a^{_<s%9.6q8:r**PJĥ!/2.~$W ` -9j{˿'q>s*{ʼn$8l8J$^Gu :RbL-(RD9JQ浇dӃ i<TU{pzYD zcuBMDEHzsEptN8gvx,230cّ͍=s9/#a�Wr. ޴݉#rC'M/, @'yHX_Nejk4?i<c>Q̑ުYWܹeVFbǶGc,8:8@%#4W:2Hlg ek?XTz4,V-emINAcF%e9PtAxM)C]F=qs-b(1 dvr vw&;> dnLoeN4nd%4 K wvqrBʁo.|;Jm�k'ᾕ>9B3ݝO29B4=i`;Ȯxhk:= #^MSKjNxì*W%`B4u&uNG^b֯= CPْnmdzk8 7]V(rإD}9@I((nAy+R)XNQZ<.1lbjˢi1|9Ip'p1&MJU>)nzWN&ֱ\T1#"&TMљ�X Vҿ$=+3%ZFn-'OP;.a|bpkkV"e-3sOjswĠJm3^Փ'DfVFؓ`w8\v;$XV{H" [ I}c"/;2kg7Q z}pj!MG",A[fcjQ ~25pȳnpI/%Rq﵍W'zA'Szr92RRHt-}P8W�ҽ3/TIܥ 'wRL{#Hs4<o(运iHPzتZ519ZsOcLYxB/=(O#Gr8WP]5r[1 \JF^R)6z!YMǶ$h2 swBL< vXΊU)zr/Ċ;y`,aj8Ns$gGS߻$΁s@x Ր_?r~BPv#y aaqiiaE7\DdR<Jb.P2;�ڽ v.吒N$[VmuÃ(pk0ЌX Q -'F3u{JDcݩt碫!"2!C42%+XZ+ v \SQ{H0uV-<*Og $E p sa>"*;6gUSNV4>3ls%V's.pP@4zD"il'Ŝ;ű$Q~e{͜|1aY9�g?Spu1Wt>hŰx4H+i,Jg�]Kqjը9WBbEMj.I)ihZd(Zr[oHrqy83^<L(b'XLʵP%8aB.�I6\8r !V0f '#V )`gR| >륰R 3%/ oV>|G6C'bB:("VNm8+}ql|s�n).o[$Iyy��2CfM iApT򎍑=:j/kQc zNG爘,&R찳wMYRo{lF8ƥ gWPz9ѝ>k5޹k}I꣭,j0/w9G32ȓd9"fo>ܿ/) endstream endobj 173 0 obj << /Type /ObjStm /N 100 /First 877 /Length 2463 /Filter /FlateDecode >> stream xZko_1#pޏ"X @naDlJTܡlKZ,;}^272iX< TL+t[˴ȬcN yĜ`$ޒŠ#u`rLjJ@Ԁ/P^&bcdJ`))@RGXPGLR3e ~UOiTA$*R3-h LKgi"xP=j.j1L0 8,͵#@ t,M: i VDH5KIDnh G[G,L1jvD(1xV3 Vэe]6#N⌐?V-IFAcH]p,fNF8%!A΀("s $5s 9O# sdVf0<M2w89P K:DB= Z0& % Z OA ZA+#^ce(烡A4  ,zppCڞ6^e-Xj<TlJ[/;LBm^fo U\EbؘKQ[iH?�+ZƸWK|²c쪼O ./)Tؠ(ǣ'EB<B^KE  ߤ]H`Y/pz|8|pEW3d2 'B=\ t@DpGI_EI#!>L'gه?*veGطW3Ж6%&i%2?`6ZC>S,K5oppm_˩[Gns="L Gq)IEJ(.LS8@/znɅ;O7_]"8Ѱ?11QDx'eIQ<esxiɇ| 5jx͍=ؤFó!l׈\R, n͊GDžG_M7PԔKs Jڣ[ :Q[@6Wta֞p@ 4F$HRW$cœڃnvbNöe;Ye;YN'Ų[J}r:/Dp?KTGM l'KǑQo6!9D[q3S@;[yK4Mc8/aYZ$ bYj9y5&l('*^7 Z X";=::g� m: FaFbrݧO)ߋ5YZ4-ңO堺%'tVSi/{/*R^q2(,{?NZgi~{SgWgޟ+Gn~? BKAc>9+46α'$8߾)TZu y2̯g5ًJIR_QU>,א:V=?ub"V3`һG]V.tI9,)w/lZ߻?sfxғ'}ݵ#Dct.X x2;!1=aCxÔHɿ`K%O/xIe'y�A"<Xp3͇#V⊊& ֥k݄NW\S(FGV2Rǁ`y9UIix$eDNj.;҆ʑUQ>olʹOK[+jo q¨?ezD7)GGvG絸;_K iˍ5HT%N^KN%O"ȬAʙ f4H )c!(tu(¨Qa} Rr+wP1c}ui-| 6(` 3H-{.d  (:cW7_jjdp" Ы.:YEC[o_ypG6FĈZ70"U'Dp#xd~ 0�`# M G;dhZP4J„Qd\hC!]ay <ݽ'8G8ERLSpJq 圎!n(+WS_CH^'zU}N5ګ,jnB:Fw[,.p2촮Yy~;j4 SZxyeqyuU@¤lT3]|R⪢l0f2ߋ,ϫ"|t5,~dU9(O'L6A-f,U6Y77u>&דq-6-k ˶{r铳vĠ 4UUvS-Vn[OF.<anܒa3 endstream endobj 309 0 obj << /Length 880 /Filter /FlateDecode >> stream xڥVKo0 W�"Jla;:,EdǍX?L$ �Ԙ NrɟHAVf,�ge24&I85zG',En �T,2XB,/5YM#-Mh.Q=7X oXn豮wV^ڑ6Wl7dvo؈즤Y"dF(v[l,+L?bN"�'|@IIR�*vSS YeQ9 iJ gd kQ؁d㜠8\zkӂ{2_8ǘ") D]&:O]kC:1RѬ/kzvG h2K䛳)XY- W[/Z(m|5N#KHGp@B"{N:Եvv @|q1pLb+g�c ;PZ46uGoNc=}Vw/@%w3m!gwz"eԾps?;z7XG+,x=Pe 8Nh3qT<~!N?uu]/_w'8s">#EJ,S8*Ǯ?LцHgqLRayE[ o7 _#c{y^V7H,M5 ڷ 69I!!v7z85)O18j,(55lږj +/Pqҧxo@Jig>לҢkF,U HYfmRlUO/|t endstream endobj 297 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./attractor2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 311 0 R /BBox [85.00398 79.6494 447.7769 441.0837] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 312 0 R >>/Font << /F1.1 313 0 R>> >> /Length 29769 /Filter /FlateDecode >> stream xˎ%˲S{d'j{\ y�>@DI*|}~k6 y035U!C.|߾ۗoo߾|/_~_߾O_}o~߾}o _gw?owǻ7w_w__-/|}x_~[~߿~aqoy[?a[}3׷_y ",׏#硫-_-K[W/l )}xBM%_>޾ﯷLjo__[esno}g&oahi5Yv7o߽y&}ymZƻYY /a(y,JsIQߖ@A)`=;~x ObL4R_o?)g4w||_'7͟ FQ\=M3tr ]Z5E7Y>[kʣB<2wc�_;~[VΗ5Xo7f`({>Z;0o[?~scߏ{ +٪(Q! 5|1޾˽!3/$Ò޾3B?NS-~fo֒#@xyxf6n޾F 9^]uF>8 /w;CY^a�{!u|:~.>`2&1|;~\ZNx*RƘ~N[ >#r}4~1AK{$?u4?`u7n~3Ə§~1`鏟a1oۇrf!ڛN.{ˇeBPS4ch1b4:,--y@_3r}C6x.`'}i1ߦAa9ƒQ.141?M8mAMnf o7m7)/th0|8b` ߻U) 5f ]FZ`~G8\ɴ{2Cfݓ\r7x_Ttu[Q*z紈�EI xN:0<,h!\T4R$:w}/ {^:W@3{O,,G'WmE&ֳ peIe y&KX͞n~y~^oKuUЛ/R2~~ò{EMקp?zΠ +<!]:u-Ciy~5ڣ/XC˺%Eؕq n8W׃^FM\ɬG8ɿ7F2CW)RwgI4Vƨ Urɭ>#%pyRwD(u VWP;~|*+4D #ŤB˻`}>I7/oTZfaB  0nR~4Jfm9wxi`&!&\(Z]H޾/s!#3Nj-HT۝ʓKXMMY2D'uGKǣip޸4jƬ.FY~M /s85_ ].,mPRZ)4|xd92*qZORRکU ބJ68G%$zU5FixԈz*c↧k$Zէ󖗴ֱ;A< ݎqff__uGKgȾ'4s` h.$?{T.SVF+)f�3(ErBoJ!/0,#"gL<_Rr =rq( �!Є6"_(|8=4JC *dP&न<a4ύ޺6P^nd7> vÊ~̫;(g`y[DboXd˥U%EGO߿-|w@e+\\.ػcYja6oj/p4&'AU|�$]z{Tꆀ!|]~˰_sRdEO7M%@o?eEk{AדvC^"&!L0m/tULw ;S.KL;JV]w417 cjO_HGr "b]%"n=V2*TWCjYӵ)xng8E270M7U y{fzYdqp7|'n2 7|4Z\ ! CS7YˬKWh58A2ݩb㎛BWe?σe?E~Pz<^}(Ӥgy1Ò {nZWഔS,kSW<s{ ݀1&ʰF#ev j̒"rsc~cJ8�'&u_}? vOje8&Sn5 !o}+xt7PGOtHݰ7,+ym+\ ]t#x@5%<3˚ ڒX7qzKjz>yHD u1$!:9v9o~+ժx�gS^yV_i3cQ7X͜ٿE4�ǥʄ:}Q"{>}t H˝7 vĚeȵ<YiDz+%+ş'[j(Z_`t@8~֭Y3 rEՋʄH6*+*H< )}[1Ey݃t.}p#wA$hX\=~eow,"ʪi3e'*Lx[%"̩g t,?Eo;pz�PhCh49Wi0z} 2˸Enwhݱʬ#*:^`GοD~ud(urw%.dKҥR)n~~_VYdYBZwam+׫˰ɯ /E{r /!LA2TQZ4eje@9Msg5@-byF^BaQ,D$){\B- %aB) [)y`@9{jC.Km6FmD3QJ̵&@O_#z&+tD|i>iRWqT) u4oUV1xvu`Z<Sqműm3~xD,hN!oxUfwiC2kBQV)8T4xfZoEb1U|J}N *|n o}hoSnUŚko" :oI$@<zݡ q|d*wҮǟ-GXSGo GIϰɱ;R \ =f}ԳS-[n3ٟyȆ6F㍁c0 hmvĪ7:/ u&k4 5\(`z&Jɨ;VܽrRJvD$X=~е!6]N%2gCir7\⣌)# h|ѶB58`$('cpP1%B6>ʤz!{ɋRV{gUwnyw"H4ĥCxkTp�KV)3 3gZtw{,7uPwgtKfn֏uf dBS,f務m ZYCYDDLaA P*1ş 1 9Ѷx!U|6}ݟ;j1.-gd5)nrw lb Q☏=;ޭJ}5-�M[?gtlm?p<@qʎ؟'(CLFyM.Is(>6xG�px3d PͶ֏uH_ħ;H4H7 ehVBxk?^M15V"{Ʀ*)# Lgc]vbEP߹ Sټ%Ń0{Ʒ*)řfuD]C}S~ /W0Ox[,/A.6G G sr|-K}o/dmSQ-K=P%`igo0Qa<, ̓񎸢T:o (V"9|"mcp!xu2] nfaK||gV1<,_�˟LiB�!D7W2sݔo 88􇺊S !DשެNapQm ϫKRHK22 [i%υ@@Y:,|%kW|]u2L7svܱpL>E3=+Tsi` Jڛy-twURpI$`lKKmV%Zn olur7&d36WKm錶ghG Nk0i\{\Ў4 &mq$]1;@6Ol6(&E3n |n ;yL\i5y-K珉D}{-{1ʍ5nAMGw2Lx=󠆝gk[SjU.QHm2S(nݰ&~&Yw,kY?`Y7j.%JYOr1VnIgZ#n'!gm4mݻ.Ljw̺/#] K)L^J$Ԟ\}lUQ2n;`2>t5Jn"˿nd[mxe޾bGK.U32dbll;<پ\Sk&Rlÿ-CDߪ˺v;W$ nS߶[ad^Lczd#7a1y9iUv Ҍl\ge@Ea9 s{싫- ]!/HB<r "^%=wy{ ? Um3װyd\eL ي덹fCvv\}SF\Y¡Ē1cmք>n# 7juP"R`ozmsƺ 87=WK&,(zp5c?9_7-ȥZNO 8ʞF[yyP7l 1g! ^>2kll^"%>.h4R = ydCT3b'Zҙ(8x&d_J2-)O<M`ܮ]dV(S<Ë}ژ ļ= ^< GfkCy$ .O%ك%�wܚB`qY>&yLgޟڛzؖ3 etEQZBmT~=q<m:1.O,HG!;H'yRᰓNw 9a4,ln x%ߋHk*H_SG=-w- Toa\ J"գ%!bVr g pHܹP ~xRJ<'' _#H{>F h RêМ["$Zluͥ M{b=ؙ~b: .yDTιuZQ~'`l/ UXb Naߺ`R&H8w(̾)B4`O?PNd"?B$Jc@V~qЉ6FioZԷ] hVx5~+2M Mt~'4PRF'qr(�5,\^<fiKV ШǭY --rHk,kd Na΂jN{$Cv/$}* ́]]߂_Iv=̕gM\p89["vuwY|=T%r[k-ON7pѮZ8&.Tg!-WU.<B"rulJ:hK g}FPd+ k(\fr 5DzFU`o :D v Xd3x`m6ge8C~Xt|"hTa=@)<X[~fw{9_lcuwS0 JKfRN#berr0."8Fl4KPV)̑F2k�eq-h yL&!gƢgH"RR@nKHJɅJ'jKT T,x1Oț^BziM,70XHUkM R֋ p@D.{?D;9 +3@_:q*u-Pr#Ǔ2΀Bfz?'>{8ҏd ?K<D<GrJ? ZE PΒ:J= 977_o$42ެo)uMɒbC滟4w`,aTUm59En 6�rKsy/}"@s=dQLRwa0O()e!kċ^qH?"$ǛVwN\c6*%䈑O> S; zTUSj5gVx@0>Yc !ˉ1Oe@~Jn>>H{ÅBCbG}&INeEmz6<Uoەct1|9!O$/]9ؐ0M-ɋt%%a rmL1̸QIO#DFک,n7h]cb9_' uɇc\@Ν{87Y M/n^(p ePI6aR&nwK8`/cח+glΔ8]r -c/H}X&9v s8Kލ]NؚY.؛\0ǥT)ǒ!(e^j\2 zªb jγťVn{O-N*[u jR6;Ց&O ׵36jMki`{ų\r_c[7܀)ѻI5&džNlHruT2# EdS( IⲨB Xo3LQALW4M_jgbBd6jȔlA^x 0͆0W-ԕ<O` mrY؉jkFFGqP[q5�nq "QtvzҴyvWy:89+gN٧ŒԢlp-:\9 $.A^i,c躴(cy'f +{ s.x;CncBE^D˵sEZnj|q uD9oH(sxx!ݘgX]_Fޖa^ێ f9pޖסmZ*)}["?p3g2" o=] (gʔdCr0>ʼn.7F vavΚ<89<W&[[ sHROxdQc#!/o$j USZjL;2 }d rJ L VVK}׆Tȡv*_۱m ǘ9ا ~e.yY/,"㶗3{xhSDzd|=~ʮ7 tV*#7k'Gy[$.ҥR9+L@l;0x]0Jޔza)+ y}yQ.�a( R60b8i譟9o&%d!ɔ:˭ߜ?$vج8KzM6Q∦:X ;A\@*ok~mbjg܄撍"mZ<MXVu0EN܎�`Ќ,*RɃO3B`1 (/1=~QQ k(+g\T:< %z<x6Y"H'\DoI<U-lIn?d`ueHOO~/x<LUfbQy'-% K0Xkf{QS~9 ˧7( łD^4>#BgZo朞a{ǢkU v�*J%ц ̳#yf\ޏAyG2m_᤾T` J %Ֆ )]p9+\.H ˥aϛBd?x_$EoXd6C/Mnj }4 \]3 ]6;.ĄrHW8ERp鿲/2ʣds RgbX]/!K2gcg2:3r03)9w'ϠH]7,If)̰́"\;3Ò,5%2'ngS(!3\V^P) ^n 7 q=tĦѿ{7‡"՛Pl߶s%Qmic<D^k5tgł?Qm>i '(ڂAq|hМwbf<2(r`RK+LQvuRK#YA4}(C:Z-4r#y/ 3630Ǔ0W֬qyjUPF_vYA,U̠_݀|'?Yr2c:Jj_{vC,FJ±j+%'[vP}޴ { gb/xvKVLoVwtH]T~fAe;dB[6&K֪vZ*+xJJ)U~Pߋ&oYO^UQU>QKp&QYS朎GMlVl2EK<LAbg<ąkD<LMft6Z]@Y{v&IFz) F ov4v!y<<c"y |f�D'77pBŤD7FZEL6]PΩM30,[&,r2P󇃌/-&P7~;di !pI~OnfnlA;8G=W+R~"RW;55f2N~D 5QE~c][@o&to%'Z_Kb+[ʤZmy~V-&isw-Cj,-n+]‰-DjDS&w,[e^f$%m[uQn`LV4@c@58H;qq_`PWvmbˀ"o~ @CyKhd|Fŝ\<gs!ntDEv?[uh2#ϛ*mbV8Ӽg|łC7s#HwJOeZ&LqN0ʼb9pPn{of*:U`0mhS(( iTDl6s<,<FD|yl '1GBۖ%<7rar}2 įF b|h-ɽ//w5"{OU;âK͞yռh;0o oz$p>xJ 6X[[9{0z/4lZh~]B9+[�m;؁4Vk0h6dK{ൗ@Xc~:+д4p`BD;uB:v٫-Lhjb1CWuFKPdEC=/-0zp<=^,:BaL9Աf8VXv1jt4\Jq3viRcYo@.(8$8,qh``Á9gmϧ%>Ƈח0;蟻F\cs~!n j t1ۋgz@<Ⱦ3/v8ɟCvDnٯХne"tYݯ7P vQ`5( !qmgR]l ģ1PWv0k(L DicBcO69($yHVEo9TMNAS㓚<n "/#e4yYK?=q]'|'kc 1tfB&+hP(~{" \eDiJ>!"AO2Z�äN2);cL=gp.1"Dd~ڧ %KN3~yαW$zx6̒<!u!gƱa1O_UWOY6S޶Pnros\\KnTJ}myY|4y:jmϭWOٯB'#^㔎+i+Bj e+58Jf5?s[ݿTu%L'ZN6nqi ^)~o.} pNA4u-9#5J,?HCKa vgNNBy2ױ` ./Ouec^#N6㐌U>;m&V:=gGm[\C[5%6ש7jdɯ\G˰1MF4 .9kss?m{yS%SK/y̫ =(o+.!/n+uwJ`N]jlәq-VmνEIMtn ^![w)SF?m@ɕ]Yɜ+pvzf9qMy=]a#&Xd5 J9AُG)N繫9- >*YǜsAC'b& 6̖:]H;OɐZګ};b4Q:mn0]g[[eQ[8!qj/#w"ZftO){ح#rMAk  2+:Uo|72MogvD~mj:46:[o~я&ڈzuCI>l6!#:'WsɂLPݺ@n >EZmeQZ%Yok`wva?pSTre_aa?]Jsϯ95߀fe镕J]%0GkChwDǿigۧ#.9ssq^~*~; s&ܖyۤ@6{^ n/ s14z'sSf}_׺EVx?,ޢ|n}J7ȉ<b牀Jc'V9"*-r<$^3wⲖ9j~q>`].OchC@\8NP%}* $wGOc:^y;L%UG)hBC;z~ Ǚ TxZd~ڸlE@m:tFCFMګyJTQ5=/v}!wI*@:sP\v5d+}!j7F2dFfwf3N`3mSW/;Z<! y{;O/MIv)..\8]W=Wp;x~35uւ0İf#$~xGCc}1YC*k%H4j]lWg`"An H];dOh7 "^)^ޘ@DoS]vUJ54ms@C 5<}ާ+ 6u~QrIs`v- ]JAo)[;裣IB*kQ?ޯ-#6T}˨ZWbzw譃*$_Hނ¿PVuܝJO^Jd+RHڊ]?౤ۮe<,9 C9t}/h- 40E!zs*y5Uz LT.'L% a0q."_U"=n&~ 䑱nN*QoxV�JJ,g0 N+%0Jm&:=aH,r6XwCH6W+Kc5g\Ut4 [VN|VW_7ߢn8r{yh4˺絝;z[Ƀ]?@-_n~g@8B+=Аu/C}&}N�F 7ē(RS[c}?*cB'LSc S=<>s{G̉KN+ak.pC 39L=|y ru'@L\f>xKOD `~^8٣ u6C8 \ |HO@H:1SRA6x?yˌ+W]$ҠP@yc b20/B^~H^Sd(g~#5M~z~͆)󌡠dxg:za+p6:5)LcN` !kpzEߩspd xcKtOuyԘu�6h!qg2FES7w<^ ,6u>ש^Nܙg^{7~6kP0?J5x4sxcW@?Y0bl/?]^3,Qm0Y r"˦TC@zqP2H&gK:ז�Y~n)?r-9IT0eAZWH΋&ywW.XgO;moA)&UU}%W1JvF t-/znS{Pͩ;4BKnx+[-uҏyn*]sy4<  'Ipb~ȩ{~|#愀z7^7|Qc]@Mj_ fmSp=糐4BGwx|Fe?Ԭ}v¶zz SӸZ (nQo\ {zMIE}F<x&)4<5~v΄ ]Otg6XXZȫwy/] ڱ(әv өwgpbT.Lg2T)lQn:<+%ٷ\}ξq8Ѳ�WXI^>` kb<VXV+4޲'P )6jn#*Nϡˡ &{)I|<kNpۜJbA×)w%~s%^I~;ې̞)_NWjWuⷼÌ;Öt{O V*a.n eA0Sj@4fȻ8Qe畷=~@=J Ax6"\YN/uUJ!q.(m4Jf'i#6+'_2\G==!4=ؔ6'ƒ)qregӏ{缹>QVYߔa~ڷHLMh{nd=:Wyع[ڡZ#vJR!gtysFYAK^d G-elxg!Ut34Gf yh8P*z*J[X}9Or#y94drRs+.}%So Ʃt6R�QA8&c!=O&(rsĜpuhsҶ87ۮr+)%1Wy%F!1;{~v]|ROkPc8CP8f_ns=AgJ\,:ir܉rI70ƔzZ_a�%"dB i@5Rb9@gS9x]U3GWVh`[[+a WS{Yb2g&R!RS_335Dfbn3�/?^-9TӺ)nST|A kUEmh"m?q#3a&m~gQb=C@kڊ 0"�yzRd4lVme 5𓧟U}R@2)䵜�` 9-{М2)sA\vT1.38Q\+}XoJ%Kr"Y/+Y3nj.\`C4穀|2#ā.>M_!#$=ɡ#(٪b&#@Y �Goq ށ+au *̜c*-9z-Lux5~?o;*J|5%>Tg`gL[( eM}?UHsjP!_n`. iŜ/ |"ĐϷޮQ 㲛@+S;6|5RLJ]v;a"pea+}0Gh;ÔCͽuQ$1= ? _.sTJc*LY eѥ*WBd3~v N|yU*Z\q4N1l�@ yzͭ<%q ZJk^V /.F:BzMX Rꡒώ]@<!sj?UuB<j$ZJgi<,s ؆r.&:sRE4Mc[!gXZ</p)ÚvYa//qF@ͳo)ļn3Y@ώjluO2K} ?A_Lh%"]@&A83*yz+mhe1{)m'vBS&{/yމx޽.!r$zfFөzTRTҎUtx<%e/*Q.7DzTy1P,tխ-^^z۪F4lƃduv_>Knyw4 ,5|sߚ*,tPiރz " {9e;Nk ^ޚ' A-(bϻZNIaEc|tIp)бg.xwb@Oݝ&8սf07Ӟia[-OҰy`$^hE W E1hb R7#?KzCHΟ0XbX0]w;`~ir?3ww4?iR&2g$u+K7?}Ϳ5.:�QJwV:\F~̬!hK ݷ�f- ܒT[B5cgV| 2eOi,JC ?SBb\PN=,y@&;QhXBrAMk+�ݫ<bEOU ` (%I4ZOn=.Ww*(s~xHγZ~x}͞= o]gsZM~yu[7jEgONPȽRی@m�5]xkCo?􆌧1j Y#Ŋ05Nq ,W&8MiB*0Oh3NO/9#sw^g!+1GO�\a,YFPdC@=0>]i]F"MViz_WFBm?RtRz;۷^t]HSsZN7*_d�nju&2 U~iB ~<J}ʊq#LK">pYxn;G@8'޻IUac4O\\^_sbS?Ir8FrEy_r :<3"R3]%)T0@CDr]D0l|wصq`2L;-gwbjѥG8 ׵ WԵy˾穱R@ƿ./MYS`"R, 3?"kl~~p^ۚeݾq;[$n5q?/(oo '6CI\vF'9Ɨ2Ӽ$h2%# ĒGWa+Pg`J%j8ԿI `+븦8 U@d1Y&#t,csW`HinrKR$U7wTo^:cE,So+~ 쭀͊P aůU${c%O?|ZwOǹ~O,aQFX@<XGD+Y'ζ} e:9eb:.<Z ykim#ӭˡ Z<te:UZaR.%%Dy!ag] ;-/ܨG#w3Ij;Wt Y67~KtԾ Wl67C!ӀPo.  y!M!Ӕ,]ن;ฺȗ�얖(<S/Cx8 uҚb{l~OvVy?"C]h-aG ҒP_4)e%9RM ]! =~x% ;Haiu2PE8[tڶF-v ,|TvgYvlF|;9sy rB,D�b-_|y::b540#Bȇ{F2r{ [x{ e $.bh!'2Yrg'pB_5|f>Xf@hs(8)J~u(aD;V&\("yajOi& V "+Or_J+ WiqV?-%+RK1yϟ_,!+say8, sG6~df><ϔ3P)mX͛Rt@haywa2㔗ROjKe_"Cl呶OG*Fvpy?|sbN|L|?s MP]D겊 4z$6L"oV|(&Fn㰔g_dLyn$m .rLLw Yk#X܅ڏ*{>nk4ǹL$d=?l<_wklBG ]'hl>& ok2,*tȡZ!G^|@,+P]ǜ~5%=VKmݮ~woS6qٴߝ ٟ9�osYc]+QmRk!G0'TwD8udE9ӣY7u6Pɮs߰fkn,6�*w$LpQt n [�5Y\/J>Z +/>W~x0?P._6Ǭ~WuVwb9z^[`_W? Y~0 s%ӉT[U9GU‰2ySD+ =ݎ㖒*2t+ٻSDkEb2kD9jv"Ǥ-%?~{38t¶WrӚ͸x~TVSʂɻp(lȁ!W<fp`mv R<L2 @%ξd;)Y�MA30gXMID$h!Ԧ ] ;| J\ {r܆ۂR!ce vPȨWy]qo odD|c%RzZLWcY\%%D@cySHYWJ^}Fj cy=-I(K^qZ,g >ͪ8}p3+I(9Kf z(3QbeJ8|wdžҗiEg`e.[&9O10$Drm=4L>AgA֏Ƨ.xύʓzRm*g;JTA Y[&K1M\l5X{<_b=YOݙۮ2wKz(̀HdȴpQdwDhN>{<v8=jjEٝ{}ȷ9c䭮7z;%Qp$ s.K+%�ܦXo馎eNS/{uU`*h؟�?>啂xWT _f=sUL}fx h/R8:-hԬK!" Z!R) jP?m܉k b݊1,hxc7~ aPjX3~`V&1V-?_[L&^l},Wߵ$ًP N55v%ceA#r?Mr=x\s`۳�}M\z^u`jzdK-t�/)2]=ǫ:]/h|5v5S2uBRvtfS?D-]=g/]EX UfՀLAepj('k/E ~\s$ !pik z wZW q.V 暌. hůi-VIXBqg,]^=C3w3 c^Q{B J Z">`fߝD ãW.g Wu=Wnf`azG͍,աp:ܷn4<LFYpy~{(B'Kr<x3ia)ub2fXX"i&]D eKFﬨ#EI1X0wA/z[b g97ÕD&W�u&y^juiz/$K2̯ï"Hzn{3`2~[:>m+I(Nnoێ[&yL:q&մKLe('fZ/cι�WswwH]kiqݲ{iLf6(V�,ou8־USJƴ(s7‹uKWebWP"#JSxYdjKzTRs&h2 uhx(%|Cw>9C"QZD (Z49`A WΚ/1zb%ӡUM&kC$'!%W!rfGB>mj%hMl ;U;dft~? ^}OCh򟊎a ;(>;_@YEN`V`RF.?cyJF>#&jɛ/UeeI~^&8yuƬܹvKXfe9>M>#SO]x@_Jܷ@r63JL7Ը4Oa'D+uPpT6rFuw?Y&HHT!Fg{=͑yGVtD.MGIv)EFݕkB̈wfa R/ۍDeq)_S{ލ'A/c7\ ☠0+;|/yiɾd_uVPnAUdc9 =Rd`crWF]f Ő@&仟χ0;Rr-`6ЌjjktyU%wVbA YfX-Mdެ*q̜NZ4X@ b'ef(Z+J'e_}p|O<2ż-�+>ddB^,Y`BH^ ׫{ad<+*HL(kL.2o\�-e 4Ȏ*pjk3uW,)a& u4=bcyX\%Qn[.6t0]3ټc 1.FggxFCej&>PR$|gM/Y5LWx}E#*NȻ}&jxy3ty4x\,ɐC+>pl(܁Z )|{]y>cѓG[3ۮ{J\>oYT0ˢs?Lp.@0t"eԟ/ JiB=i &~LMخr.S{kn�sٸQt1s(B%o?ԉ[҄$wPUoCX8vl¡L|5/]ty`c2;U[$숋7v=K*bF(==gz)NѓpDcAt49ɺ7ԝ!iNfةXS4cF OgĺhM^@]eɭg]~#q rhyt|m*5Ӗع"%\ˍ㙩4If #o_>R L#AKD Jv.(gpk? c*"AuJNUygr͗!'9oŅ?_{9bRjKbu>;WcKJnW7KJ>0T NOW QYC>'{b.l'vl}aJCBo?09g, Zt~C~t6_" _*̉^YL s!/m5-[):!n(kfjS*BVlJ}˖,Ċ:b4niC-h nV=N^iU# KG\JHcvbmLm%ͽ+"Ȕ吴Cn.{?Ϭ_l2D.C$abIY|A B*.Gg1xS 3AXȹFix݂4ͯ�+=W<Masg|Tzq4{ImWU1 C,lA w[A75O'S>2.Ry[TD޾UT/EfX24X.%E;VJf@%:ZͪY_o݊):q O/GA>o<J~a'S h2Z*3‹R𒔥+Ț̠. Wf6 ITOzq|Mf }+*`kG>]\HBT3PpWFezy዆,v/7öR ]uIC͊;+Q-SQ')vٛ&B:,!by'}W{<gkY=<x6C a6<?3hF BT-]ވ5ͨ͘-~ T!?,< �>eZjAseLXmG4ΛLc'FB=1ȴ]gXKn5_]J]_A\)Z[qƛ۝lA|umq&_ ,.yLmG=kpe 4mkvꨔ=> }2 @qزLL| qדNm,5?5>i=v aj[w:_jcei2Slm=]&!_&62&CH3Z:9+`<V L2akQ-~92P Ōt?GADbS.8(VЦ;ʾ/n䆨XG[|v J;2𤡟]o49gע|G(jl7 YYx 5:<Z ZLy!扤zt{ZX5^<4v<-^rLrJZ(<Wϣ2u#^o/zU^ѲzaW\^[=-g/yq}}Gt@KVHa>Z4uvA]b7_Sܡ[hݍ> >" $+@["{'=80l6HFT D/E!(_NE緞_*(?[|�>-Gc='*p}l[nƍȋtDɑ!۵�ud)⁁gEX9҆d})*;xȢdnWdԬXy\Z= 4Zr]|oF2y^ow,#da-CV<Ociywg񦰈p\d8!><Kd5̕@Ĭ:{gFf(ncg=v&oCF[pP)m y"Œn(8\P)|C' 9qZoe/3yo4Jbܢt?@#LeVE(3T%OPkjj;^d/4-~dmߗxIhi=~T_ />So?f^t` II#CjhpSVgGV=#W­pe^ <i9Ї,(量f o78C-VY]oKۜ2/(KlG?$ˣ7 J<& '/G0z_yX_ٞ~UĵR:Y-uM#3)j\Wp:r"AEy>vOs֥%;PQv$#-~9Y37DT2n"ZAo:iYɗ۪.5'NO6<o?ߛ0kZz쒗/?Yaor~Qn&?BFT#y\0x{gc`3**7=vBK,ztphyr@<Hࠓ Rk)*ya$fZK1b+\ `KMhV q;:(C舫1pPU \~Pr5jׯa]c2&Y'ۍf?`]1Pk:δJ>"Պ~`B??�:nVLI}tp>$p# r 7~ގob<Q{uoZ/pⶑ1RQ ;\ 5} LuQ"ǫT`-=sP4Y /4%n6@SbPR F7uTh D ]M61"5政YR6yH2 qeQ#"_DR>:8'sܹR%2 \A]?fy�Xǭ3>bc URؒAHlEVPQ Oy:(Ym4 .ZK@O*F"<~[Sf\&D8sJJ5F.5bϐtysG;SS? o8ӡZ|Eֶ pyOnC}W3.4SZh#OWS8/ ѰGѢB嚧Vj`%U^FdPkoУU k4�ǶMݙ40֒K"pP&k[U)t΃C^RPw8qczYX:qKX0/s9EP[zܖ#0œ 1Ås2[כX'7<Y0{ _[ z2xh{d>c.w.O9FE)x=̪9z@7xdpm~" [ʙ |9|I '=̞ϙ=]w;w".-WNʛ`<)Nؿ&EkU6p^N3OxX*;ߐOM~"Ϝ6c< TYyɿq{mc߬_]{}ۤԴv^>&QsY9C&{.>w/ߏR3ˡkIe:a= +zUjy?{@%|7\r`N2zs:VP^|髹AX"y{kf@OYD(3]vx˖W2pXJ]r:j(gdu:0^j!_#  e y`oN'Rɡa, �;S~谼�X3|'a&yj96a #.]3ʖ啍n`hfYdW}$lJ [Oh<6r=إlȗ}Oj !yL-(J=3Ouy{$Le)E*_hB9f3uh~ǘ٘Sxc/c иǽ:Oq&ُnʰS!e4] =}jgppFLA?mF2JHJ߰ S5myk^ .p_\؅΍T7&dp@-sKٛ|և{iH"tWv3�Mt"B3WUm,Thgx<de'{۸-WZ؄ buGnkd2{T#o7ی %+ Zӽ$t ,, "+Jr>C6قCvT(?@S!+:-]f.p7ظk8/_^o88K0]Gk;bYqi5(La b)8D`r0 FF ,= p Wӓ9M5(O[bށxG?=LCd}Yo,Y7>Ag`% [{{s!u!x7_i9vĿ<, ĕCIh7Z2TD]{աwd8 ]"'z(o]*= |vrS!V_lKʃFPclbC9>?I?OH_5=^o7aP9 ȯ"_vYBIiƎ.㉌42ZΡ2]n4 lv[Qof>;1թ8ѱ'.U^̿jh9C >r̮s?+unT"*יisS@ɓ:7-a3l{%~sRϸ_4]̙A!2ۗ+,WW pձm3a|nNש>\$ɗyrؐ'XRVSNWn<;|Ua<c#lDETB@V$!xw^/T͗놛2k ʫ4_RC\Xf*em ?IGsfx/t .ᳪDy.z,лށ<&+_"ޟJeŊ^Q({ $ 1]É0s>n1Hqn$"Iޓ#gvowq9x`9R;9YΕaw^im%^D.9 �89 ],\!Y=S^R~Ѭ ǘWq@X<t$:q=O3rşu  Bj<fjm:,nNٚv*.o)ˆ7ܓ<y8yxa5Oy7 WjtQy?yd/m<H`^+v¶MJF-Հw]<v6f^shG/Q%Y^^JmҮrT\-9M.'qҲdh0Azry~-V?[1 \W^;8d2?>Է SvZX瀷}:`i\?Owy x_`19[4Qig0 Ql@>jAL$7<.3y$DRa,�'v�uyWۗd5;{`WŚƓ<[A`խ7W d8丨?\"?I%6<8,ucK^{KF^0#7\#7z7my!YP<o29Cǀy+mj!5h͔ nZ=kuf׋u\/~l>R^&թ#H>{uxѣjve/'.kY,=5:oM=xryiIJ(~=jDᖿgJ3<_\<3ܧxmۊ įQ }.j ɗD֪ @t?rG~1S^-tEg %@W={:@L X1 E“`H$^C�T ycetW&lxc9zXݾ0&XsY7{Gm/x$aV%prLV;֭9D@ 2n/C$i}?_n'*%6:]UOu{jX53vj4fm!DI࣯9? ͈n%?"~@/._r߬?Zc}؞IUwLcI @ɏ'@ܤiy7gpnZ$f9yb8 |9p͞Q>{TAd;o܏ϋ/y/7ڞioM6Mdc,OPHFV^Ԫёڅ˩v%7^!<m@׶$5M{;;a3n/.g4aPF,^ .V%hn}Lojёq;?^~6@߹9g䜂u)7AF:#z"'u}>rN 59ŕ"/T$cK $5$<"2r jQ;B9 W.e#XVF[t\`%7o4D yT¶$ýd~4$ JOa}P3x2L]esA:` Z|oSẻ^ ^ ԛ4IJJ#=m{%}j;wu8 w,$/Im?gwNkÁup@=_}i 5Q;!slGO8Kl/u+&tbE'-^ Fn.oM%__0m84؏#?ۗ}__sy0j1@y$&C`&Hҿ{O2{Rݏؿ7@!Cb6wo.'jVTTvV1 Y[ep=7zʊHp?,KqG"!3h M,sD`◤r(o),:~2{CgF:SX }?),d.HsXkNb{9vi G$gE1 R}kQѬ\BK(Z*ó$-:S46*f`w#(,lI),N]s?wGH -\ CM1E}F+@j-'ƑjHVVڰG );B]d?v}!yins֟Q BZ֏ 0H: H~MIh4j�ɦg? VlS:V IL#&@H>-3UibS#U髋 V-W>H?_,((@tm3)ZQfϥoF[GH.͂R RT8^˗e{s1 6sؗHa)Jay͊f~rڦ9%\6.}Zy&;}z݁9OX*@.ze+A|];ǏΖ#+ݩ1>, =&{x̿#"W|{aޣVC2B >cŨ<Sg�\*Ц?,8\5DYny-locl(@%�H5 ޹˜_tK1ZI1qviXKj&.J+D korT� Q\Gcpv)(p/(: endstream endobj 318 0 obj << /Length 322 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 321 0 obj << /Length 324 0 R /Filter /FlateDecode >> stream x]n D|C)7TCN?�b! /7z3`X~;r -zcD5€#8S9ԑ _S\af]hJ )Aä6_§xEɾK!SrLJDHqHdY0-ylsҶ/*%ܦ-kU`p endstream endobj 323 0 obj << /Length 325 0 R /Length1 2908 /Filter /FlateDecode >> stream xVal[W>g;I'MkzϻuIֆ6l?/-xة=B "MhNH-B $~�Jo?(!JR6I5|ι~6`5pY[4Cõڥuז'�Tvŗ\ۿ W% e\I+o]qm"Iߋm_}?ljn1V6KxkkGjo6j#J8]!HqFzAon,OYWpy*uIw)t<v5^\j[Em3jբVM.ZUلQKEm\e ;jaTQK|OK=tdROj}IPϤQ&5:!Lj}Kbn{=x[3ܷF[ׯC Yx1(v."HY*W~G?Z8;:܂mg^a>C�3Kn)[ <}|Si3L<iϞ=}3'O<1p{L zuw}^գBd· \fsscf6>uc.:iPCit"1XL7oY)]Gʰc"#,tYHŰݕdRX ]ݤvGX#gQTC!-#] YLἃAYIu+85{N�V =EVlӤlQe)} c,eQF2; DLgwE!vQ#]NbL=1aڎ+d:~hKy{sdIx<F5Yh_AŨJ: +e!R(C%,҃"Ű4o((CX­6HĬ,g| ɡڞMKGĬb-nTƴLC^IjʰYk\+t>t+FʗgV)/<mG̢ 7-)$Ep5EG! ]B;r$9GI\(LRMhp_B$<8Ojn Rjl<%Qv1OsN0H@AÂn3:CƂ%#j7ct}JXkk\JL:M=uc=subg^<:=37%KL麽^7 ^3 S|r,5yzEl,&bI4^6 [n�VCD"FEq/ yqa IrdgKl%wRw*p/Kp1P�"CC2A�.ؼ##+Fׯ~׫yq*"eK؋J"y{)S|O("{ yd>/ަ ]q|kS;Eyi)wg;>:y"TMkGpuT'Rk[:� ~-?x;alV?V/]x~_VKdc}@WUc>?,=1ıIeh_U+4w˕*}&ZJ 卍 y*j|&?J}#; X~ftٮ*K+K endstream endobj 330 0 obj << /Length 1079 /Filter /FlateDecode >> stream xڅV[o6~УTHQ"]`: Ŋl)Ere{Y΍8vYh)]U>3J2Zѷx֙ L}dMjF:w=X5Pv"zdLM|@ zk!z'[:ނ?,JVˢx7IjJ1E|<?Z= A1Mb|{BI(&=UR8ADhQ,``/X_a}d K^9YG<΢$a~�`^&/Tt5[Q:yGz@$}?x1ZZϊ?=Kŋ|!(ȿmZ5g^:J2=& Y1!1PNtmav瞂:RWrP58ofe?<{H)!@]Z`=I pptD0-ϒ}d`L`οgE#:/_1/Wcm@`_D ~ƀzbXJTS)5LwXRP;9 !-<*V7+qOcGjPB~7׮�ɺw4:zb^)UWˆBS-4ba.D@:@Èc_ZtQW�|,%І0]{eݏac]fnUíCRqu/];:ub'14"xvM .>Ldt+(Nee}\\ ٖHA,E\ ӣ>/7opSH0R{L('/^HjyNfqh'-{p@ Sۄ %zn$]Vԟk ;΂YUJqJEqNR6b3!vlé>zHI3F!їoC9.dWU]x�ze ~Dܡ:KV\ l8@OYS!B)v[Ԅ-ύ_!snJ>d36"~TYg--`Pc endstream endobj 327 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./pbntransitions.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 333 0 R /BBox [85 73.62205 466.4961 454.4488] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 334 0 R >>/Font << /F2.1 335 0 R/F1.0 336 0 R>> >> /Length 2392 /Filter /FlateDecode >> stream xˎGE1;{xkk^  C2`i1?Y-).VD0KQ__e=ecQǼ:|Yy_J-wjyޕ,Z> <+}Fc֐itU͕m>c"~: !?e浣kl?b}!x[.ס\hKnuƄnrqkT!e(:7] j"Tyt!e0Eh]?7-L$|amޗCn4~E%Ls|H'xB&e^C4r KX_2Nȡm1@R6$/۹j 1sqYrH_s �6r01#Ǯ.pC9k[\~S kE6vGTدn*ӯl iQbۼU\Qn.{[#YB,֐Fi= r9NDzKɧVnd[+W/sAxqdɺJu^N2M?+HHhS&H`yTjRC '2%)*ySWx`X # Q <\A;\Kqu+HƳ<4/<kWѿN@2>DRdASqxK舻ה&oňF\hDGõ@7"(P90O)("aFU2, PDrύE "R^!In)G#p%˄OBj(-@dW%Ȃ`�qYYTS]𗬈`i�iPV>-[ueY�"%%H$;ZZidL<IѤa?|ҍ(P(JK۸tУ_| q9L T 7``V)oH: V4GYNԕ8v _y5}ðgDkLK(hT&k rè*0tYN&x>b1cyAhTnG$pAo} nbG gpWV]ZfXtra{ 7Ն'LzۙVXORvf!d9!q` SyőkxAR42pQ;2s#[31cL =$A>c`͂C"scXs,UPF5S{$rkC19=@ MFĢ zA(a3 hP dWuV&=QL1 0Vfx}RW|رϱ1�JdžqL3A�TPEg{WCa1"d[<L! q;:sLƖnyf0A_fP&41)GT2oH;� m'jU+,IW6{aƠTj0-J9�Z&=鏀*=dT+N;A@6xܲv,vnaȱʶ8k -P'`4'&2)_:!8'h%ϹtHs8lׅO9H|œ(A &rs瘫%.ыBPmL cFH3 ^e3r T)c?ɓ1yK;UQ6O9j#|) ݈jB'mԥȤp4L c? l!bUG(~1G# ]5 UIYV K@;4u(t\LIe.=0v�#ΜVOᧅ #4!:;@\`]QҦi}rָ=HPy)]Ө@ d w`{_KOָTz^^2P�z֜%\97j* 1sw~ To[,184ۦ+Ct#B6_[(  ;4o o0?pQ}$+?lHb-;_ty7_-?3b^"w!FC"j!m/3b]q 8k 9yǜomF:MJ}.#F:ӈ^ o#RgCϤlF_~qpB[e0~]˲\>}q<4]]% d(H[֬?3W׾ɺ KpnٝarK-#ưꃈDxD/[bD endstream endobj 341 0 obj << /Length 347 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 344 0 obj << /Length 349 0 R /Filter /FlateDecode >> stream x]n D|C)7TCN?�b! /7z3`X~;r -zcD5€#8S9ԑ _S\af]hJ )Aä6_§xEɾK!SrLJDHqHdY0-ylsҶ/*%ܦ-kU`p endstream endobj 348 0 obj << /Length 351 0 R /Length1 2908 /Filter /FlateDecode >> stream xVol[W?g;I'MkzϻuHIֆ6_m?/;=w<X+ U7(҄VtBj4$C\!$Bվ4оBд57v9ss}^_Z:`d0V*#x疮-Mpzyų1�]~en�Rv<>!yDg$#'x~u \]6W앢.VW_XoZ'go֥޼HcF!<mW]DqmluY�vQ_&X }J!"l;-]WT5G[KiՊUaliV$lv4|vH{ze-KعԐvvfK-EXLи3׺Bځqͧk~u\CׂǥF/p7gx`j7n@ Yx 0 򩢟T^W~?ɻ:Pn?]N3j0L& 7ػ-[p[Tٹ/s3OT2qƈ>5}{b #< U"K1 :(pě{ Jẘgk_AE^ъĐ> #1d:b&^ZHη\)WW\�RJXMRH mI,ĠNj;i|U8x]E4O%r9jZf*] Z\Mr^۵l`00Ǿhq٦I5٬^]|KS<R&fD,sr_46y/b mp[eh@܈!.7 X$od-a1&y.]ϡUdfy])E}$Fu(W׹<PX\* ik,ER-a),Yx@IEeU^ Ef9gS<=I,>j\:"fM4Fku&'/&`MRS̚,sv|.V8</Ϭb^t{ j;r{(z7h@"@OKL#UMLa7viFm:d M&IS3nwJa/-N =?yтАnS{[ `sO)Z4A3"DN�(O]9+<3dY9n39^n7O>O|MKI:ak̙ܳn`\M̚ ^@G֠u{di!=]7aԪftuj,gMS3ݐ|b$F/Dlk ~mުKS$ب�4uGRGzt!GvNQR;x+&x;K<.𸇫^Q~btпp~O]5ߏΠN*}ةh1.a'j(uR܏ rOB=Y8b䓃 o{.1\:F"<u?:{7"sԀ׍gp}!'zTO'l }x k` 6х;!ltGp<ن'jGj[DvkSo;ǎL+}jR.lv\!oWv\iuoĶriR.|H}pGci}%>~U a>}+r\h0;/)[7 endstream endobj 350 0 obj << /Length 352 0 R /Length1 6312 /Filter /FlateDecode >> stream x8 tUNRIwI:Ou!N'$I'i$ &gqCCPi>TV`wXwQ!8[?ٳgw}ݪ\~[Dz`@liY ʣEn_i�U-K(�;շXՆΎ0Wv"!b=+WqQ[&Yޖ.KV/]1!O.USS4 ԰@Ae*�+9r1DQN[7EAߕ"H^H}88l4( \1F&D*OfXœ(TZe1l65k*`{J$^\ۍ= OQʽuPb^쯧,B pЇ>!)*p3b AL:GU"T0Zs P0jD# ,Ҹ/FxcYpԓY )o#F3^S6f^3̿F@oUZ"F74~JL,d3!5dewdY|^:d?::u#u:::RǷ)|r  k-ݻ.)pU;"!^*fM/ Uddh=dc�r88?8lI%0EHoZ$TiIфBpkdy㷿#T$'6$g@¶B%}M(EGCBBp0@~ᲣQP!b~@�}/q ?9 ^Q'E GF ʀ܇d+<qH.f7 {go{F~a3Y EHa j mH~Le<Aac0'l֭h8LJ´wn_(|ez3\jT I" s7s2srKR9&VDk4FQi0o5@謘 *:UrR:|;Cr h(V6JdkB2B_^Ƨ}ܟ{RSR z륒y曚Gg=B>q Ө-nX/lhO=]dtH ؂F{dzh)dz0eKa1jA1 dQp(b:# f{ؠ /`Þ;q{؁ JEHĩ판E"<\XE =f7ٍ {0{g? ڳ ;<VꓶwfeYb2}m2lv Vyx2'2{= ;<M;cݳi2Ϗlmfk֟UVLI[Imyd[M-yy+~YymVXJl=b52C@1_ૡ4|gʕ+] )0�~2�A $w@|/a&Gz\C0ʡL .pjC,8@ KK4hF->C_@lDS?# l<2t7TG�|DB7,N^ y)xlvj @֐'TPgGq8|Muf(%7BV <OoXFa#70V8ć CQ>&B=܄#z#p cfR2,%yV3q*`a@OC,G_1ZbUt=Q5 # z,3a%A،_apDGч l6 1Uڡ:Vw  'ΞyÆ+_e2ڨ0Ў^ǣacw N Iyjr#%'ȷRf6>0=AO1&&b Ev)yl;}V ۂCáC z# ΅&\[v%Cr.?{`A8'зOV#$E*Mj34@I &d-y9H},+,RrH4 XZh]n,M�LSô`)}c*jjT'TU.:gW~.n w~j~ku \H=;(Ƴ"`r'0 2mtYHKMI6% qz]L4pjV1ROReZgȓqk Z~@If$XF2Z#I%oI<c5K︭�qn3^4g)mJǾłc,#wy|<;1zyvLFX-tY#nd>]jq'[,<DY[%VK1qٶ56<{ljo {-75KLW>ن>WJG<)Q[MKP$`e'c- V/mFtNvB=<fu%9ØCc$Df yک H^U^ Zk_qѳŅȶdnSXr1&ceMXjE>W?LP6Er^ _pv?>�چaB~{p.ܼ(/�Yr:tq4"v$Xc7נ5򺙇CCs'.ʦ@dt y8y]65[$ћ|NA=C^=Br^/o sdIt{1$bØ]^/J'<E8e9}A#ϠQwhH9j %D)A @S%@7XVKLZtFSNLˋs #B%G.%.E."<}.#\)?0&X(~~3XaՋ YW:q3$9#c~Ey0QJqON.6@=؇ȠԲjS@2jj@Fј;kָkknq6"E? \n_"as:"!Scs"#D&&EG,~5>*g8U%ťE)$zQ]4ʠᘮcY~1eeys ރ@ [335ilf9bܰYp04chojq2FemL-%SgSe%�pcc]$m0zl|6e aaFx3xCbBQrԒ>)S++-_ҹu[7`MȆGo#/۹ ;#oJ}{^'3=0..]'&6h@[5gәrgxGk5ij.ʈL8EEICdX3d!L/.R*cg]B.8'7$$[J*H8ӚJlE4.?ΘeAX/<sV*%M]z#0U]` q-/zIWN\dP1jC|͠0G1)"DF0 c>AXA$72`Ib5A*f6781tW4фY9ǩ}lylӽ{cucڧt*k#"hpiU:l@^^K纺4D:&U%M)%2iwm-Mov'ƒ-~c'kQxC_3l7=$jpHʹz֬h^H}FdhLNu1Eыb:o9%Z#.Ęd1떤KvfWPn`'-`h `tWU.d|4x8F ':Xҕ} -<utg྅M%B{}37'x*՚6w_[2w3),k{d-s˳˺~-QmQU fMɤDcǻD֐n$t11+bMSB1ͦݕLMI]bESK6]gOkn8?OɞrULGM. ΀n 3(\v@w K"ID doIfJ1[K%բRsب-R`Z) Dpu6 n&ƶ,N(.X-rT֊Hኗ_=zWB24ylMVe94.xVW{n?n8 aW2ZM$K>JHѲSrn; NhH˓c+:`>_k+vx`0*kjq6utki/*;W endstream endobj 355 0 obj << /Length 2053 /Filter /FlateDecode >> stream xYYoF~ϯD=xmQmP4.h[.RI.%G@Jٙٙoo^GŸHm:ylGY-FW_џ'3[hrbrr/_v&"Znf?=2-vȫv5`M]-Xn- >r"Նjy'^~ţ3cEu592Hs|dɜA%6dsߠicrYb].Ukx>IH�J?1 5εdB ^D73 {6t<eKሜ/c%I@ݿ,<k[^W":P y__d}&MLJMc>]EK՝OygP3||dEBƺ%H ӑޛ|#3lHsq]ok-b*#S< #1o7qJfgbaOk?[<ȵq࿉}LPoƵ?5E3x %crY   QƈBỲB OTH}:J(2/T( v$ tyeTډG\>C (] eT]v[̉RqZ= 埨yBV,stJ@l^&CFZ5*M #7Lc5 ۮ֟""z"~ W'5h=N0D;(,C<f ꒦�tĿYb&!imČ-{F5.dH{&l IBՎ=UϹQw�+ҕzV7n\xWbmoinN '6wmAR P!yC"㫺*rN�"P80HoIJ3Zz='s <D%Z߳%[ Zj.;`<gR@LL^`GRby4D%s|='ζz@Yb%p#R9+m[NpA蓹%BqC|S̡ {i}0T V))!IUMpDm6j ;8miu'΃,y6ŰBM3dOEUJֻv츦Up mr`y4Aݑ6y'S0+<P@aBs0}L1eRpi96%xgSRyʩRmPTC þFNUtsf]dVvUu4BY(YiHV1@=YeK., gV8mM {fFːvatrVsWI;OF,Jb7pCn'"�ҹFq]l<v`g􃚆4C MLbZ\\D  DX%ܯJF`9 RwZ,KaO&d�bu`YɑL@^^ JLՃ [TeGT8r&Pzg|MZG)w@du=zb[ۜˋD9飁E u$opp5+޺eT]W{F˅|xDzzq92z*_Ax&-xZYFU[kfRW:E?VYt2o6pe_\]5Ƈ+RIRݫ,U ! InW3JPoLYI kQu490ha]N9ǷiNQ2iFVeitwBu7g#�6pyՐ4.+|zj/Rdy+k!\*7.t[7 ]z. ^H+v A?x @u�n贖q5W4'H[ի] endstream endobj 360 0 obj << /Length 2106 /Filter /FlateDecode >> stream xˎD_qJ$kYb0؃8h;c{8;vuuuۻWjtv&^偙eA zv:/&Y,at;Ww�j){9 n͎G/@ܪ_|y3z EEB' h[&yE'(;=S?)wZq̖aZ' qL:'+q"Ō@Wg-N,-H$UVOVxv+6Q- b%r<n$@u BI5¦vmRH a2LUc婺NmZ9O;R"C΃o!<ƣH74{`!=Y,`+KoW, . WU!x6{ (~?(s75<_x-$ )9y\eۣ <V`§.y{HIeׁߨ'5M/A&Pg3A|X$)$D.uU= !0 I7_4`K<V[9`\$Tb`9˜�@)" 3T G(q}A'վ>V:Y:,KGuǨxX`R2J:z(YNԢ,Z% yyDbᡫY=-?z 82r\rFG`ؙȓ(5ug :'5~p#8)JYS'abQ x9W CoB7^liګO~ ^'ZŒ4LιY.zƶ* pT/x9鬦5d g \ 5)8ʼ*DyhA*%KQIG_XA.2 @V)B("y.yRAFxZ,-݋0x3, \Wb"LeM9ll(VSՖs} }@ FR v|C`ZD*N `]Eƞ)&K ,6PBI'Ԙb7RyǨ&HYd}\r6^1Y<v<n+Vd!HpIɕg+u&eөg$c sVjʫ.gފC9Sm^}Ńs Šn,r"aN/qMINk\ɝ+Ztyv6V8RHmvQo[iZIZM k͓<GdGZ BZe-(_$T5%hoF@D$/7RY IsY pvC9zq錖[N 65A�*Cuc`> L[%xzXTWC몣Cʶfp ugw"k Ҳ;<A!&FQ DRmZ 4RN MYMsmV@Ƥ\3K&ET/)Ow{W۷I5X*}?ak$}0JGH:9<p>!|3S Hfvm^^DPg^[p͔ʟ膎悓D`M "]kK:UnT"M RziTBa,BK+&̨1ǻ=gOY,-\c_ol7~S#Z.lݓ^}a|(>+hϕ{O_FHυ4\OÔ<'g9tUD`KWH'\,Ɂ!#V^�u{;9⩱7fn N.Uc?Yc^z9ߐRG"9?"3!\>t>_2k|,R*deDˉG  7Φj*߽":V狲)LUųe8b&Wݽ7 endstream endobj 365 0 obj << /Length 1201 /Filter /FlateDecode >> stream xMo0_ Nt]iHLF9.mvTۄqg9c'Ouk}t$d` H4(qD`:~v Kmt2 K XdsNaK!PP9v@? ;{D &o_&pq RX_(f.-Iv˄s/n2tkDddgHzAfp�zoBU)#HVULvʷl爽tÐ~|�N7"M#+<SX5 pRj_Jt:\tS]9qu@S RSGHY[*/@-]T'^7R`OsmP8%%)L)QAᣯ`m B2$Dp .|n!i+E"G<gK~zA3eP؂u `gRo3DSRJ�,^sD -2$v\ʖ.sKU lvSv}ZS Gv2;:;pj`s^�jQOa+}yi*vL"p~.:{h_C"c[pvn7O2(+/t_OG|JR%Q|$ /:wJjjI*4bSh<XK* |ő&@e vj,tg 1˧l<eagNSd]2?7t0{&re5#7B޸6Y#z:74֒%(Ԕhk$אfLQ?A@J!,ZlgOv=Пw[d x* XbO9QԩA:v8%m"Er. #d3N wb҉yc.T:֖-iH?@=�Z`[Begu [5 Qt&[U^ay#v7]ߚd2=x5_h�:Nj=&KmrkQ1>l*qGG/f*v8FM'ޭÞa@Näֶڕ=^R4zJEbcnIG1= j!?ӽ ' endstream endobj 373 0 obj << /Length 3161 /Filter /FlateDecode >> stream xɎ>_0`BZ48 a7D*I~>o*Jf C7Z^}+{z4{0&\eYy0qQPDyh Y KGX7"1y/vL,&hj=2iSsB 4ΦAW ?B.<uA@^?~} Wy#2B<25Q#k#2΃f q�//\޵o`Huw!̀!<Pdz"J#,7{ XOypS w^pBSA<E a lAN| wG'F L0tI_�O"n"ZvYBW=SSGY$,5!#( g<aHXeE(-n>!)SW<,S&ࢄ$zlQށyD 5ɱ�, |&]A'fbAH{}STN%E\…> +8=ߣ>C_b<y0~U@"8\jߔ|X$Ոn#"hm;"EdlD.k`ɆYɎ& `.d,뽳,3:];rhn` y3Œ2Qz" W̒MEh�h`=Y_×.IeؒM˳j'-!6ZFSQ㌽<U6Hg޾ D"7ླྀAk� a5ƔNbǬ}A2X\4òyXLU&QvCM(Ub2953"SX!ôn.VZ 8t >kEyb/Z_TaxKvLT,\t0~C>7G릵1{;>4UMU#f;B")_j qxnPjv( M   G4NJ8 N!־oNQ>J(C޹\驸5H\n1JHnA2ޑXFX&ױ,ʚᑃG*XY#I#TR6Pcnt<sN b;fOVlf:ݱg92ZACw70_4k 'q-8H6xFKwV<Ɋq5bp̕wY|cR��qh' FH]꘴yrCE\3p3;&)Sn '&%&LR *檊Nh0A?\Dсq #+4{Ai5.&R3e"PMpi{4L UԊ1-xғKҨoosU4�)4S[<D�Io9ԬYNѫf$.L$)NbMm7<If)Ϯ)A))I{%UTbS]Z9EWj-(y"Q [k1bstRR8GƢh)?H&LS^γE7뾷*WN,փ5%? >בuAeIEINnZֽ�Κ | c>MUmIPA(|e'm;Aut6g/d9E_X6@lK1X!:o@y[ʭXhd?l-E�۵ltvk 1\7&t*fX){4Ank5X!NR"| fPFA)8x`rN9Δq?҇�U2 ܫq[-<f9"yz&Ete82[œ.)�x wPKq<V2+ǩ/TW52hUʪI'$r?u=|A}1U-K nE*N#JPeE2sfĵmmt7f(}wcוn3ka}+{p'9̌ T6i))p}|>J?w i=#vRNz'q`NXϤ*_܄,L?P=QirM`0JXKa[,;[Ҁ1/c´#.ZQ/x1gW6-"̯^nA'-V^bת5`/{b�7VTэVhO4!RS|Ն봕OlIX\<Xup<HVp~JM!>xI#}:C,0 OH.ߖ wu)m@pڃcm} ޕ|V0lkY&~ö I@8Pѥ1uƮ0AE5W$mi!܊@;:;l˖Zs7#$:QE[12cKr2]w#y5s]74xF])R: gzl5Q&~XCRn$vC6w,®%-0l4S3BƐ D[N~rL%�%CL૙l/&+Ӹ~,Li[7}U#& c%T{ma7w ֣L÷p=Dݑ S٫MwrmTR;K'y 8TPV3w[Z" om~"a\|!2cMqБ-`#lެO?I̊rd1mHJx{\GmNBMij`+լPV3غS(;N?({ '+_SυhhaqsŃTv%گ=|<oގm'wDQt{2Wna3֏^ ez|mrXm$tϝmsmTP FZM,q?3=HLQRz{5W9©g;bOUGµz:ma词rwՕ]=wONMiB6AνӛX endstream endobj 382 0 obj << /Length 1748 /Filter /FlateDecode >> stream xڕXY6~_aIF׊HZ EEC,bIegsJ#(r8㛃kfIR?MYg~YY{D9Q8CZ2O&^>ӥ\8L\޽|f'6-73c#? , ?r={=̍g{9o5_Qe(5M3Ed8Ӯ.t :v7⺭ӱhjh<ǷHQAN䦓-qa0=a3ga1[ vTlqpWt]Ը8Y ,+ 0~Ɵ8L@" Y .x Z?L3~#p�>صx-m%ay5ĐI5'ȕiA^-PUÑ$!1mj$iUO@6EҒgȏmbod2Y`n·H[!>(Ѯy//:"uG|{U)'DHq\(.rlD1oJ!GmӍ-TR)J9Tj0GIORf( Z(9JW##-ҍQiTu̒*=+u =g % v-C@NZqdOdjR~݈Mچ1h({pL6tKdS ξTiA">~zm j㬗F $"V !G.~Ȩ1OL ΔhKF'$q'2NNtEǣ+xL %"~\Pј* LD| ,2袵T$<RHD T|8pD3M5.f2o&Px^cqX8JA5LlzTTK8A`fCRD2VHE$u$5y`q4�g؀@Wo3NJU*k2i-#{胺%%H"rIF %ϐ1T|=e/KăþZb yd%B=)sPV_i!@t ~/b[+'&8~"lhߵSS +z)SjOj}{`@CE`idx`s?例|G!2{tt"T*ugѡQ(|pz#(/4|C^yX YV !}d} H)AJ5ܭ8к mm#7Zo+#$XqS9d$rT3 @#+iZ�Sd ^�g JT>ڋALǍW�t4ܕpRw>NCu:4ѦQn V7rs&)xT$Ng^C`h_ӄ{n?E*Qk-UoLn/Xa\V| XpZ$|ZQ>KƄ˞#-M=Ш@Vi}b\/l+卽={Q6 E cV}<gֲe>:dWos(Pnm8 [t[(q[sX-)^˻GS>PjtoAcG!rZ*}wc\i0])Ͷn0m+8J E ϛQH_ФL@$Oq. , endstream endobj 368 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./robustness.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 384 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 385 0 R>> /ExtGState << >>>> /Length 2793 >> stream q Q q BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 130.55 18.72 Tm [(% of or) -15 (iginal attr) 10 (actors f) 30 (ound in per) -40 (turbed netw) 10 (or) -15 (ks)] TJ ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 12.96 230.86 Tm (Frequency) Tj ET Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 59.04 87.20 m 59.04 417.97 l S 59.04 87.20 m 51.84 87.20 l S 59.04 153.35 m 51.84 153.35 l S 59.04 219.51 m 51.84 219.51 l S 59.04 285.66 m 51.84 285.66 l S 59.04 351.82 m 51.84 351.82 l S 59.04 417.97 m 51.84 417.97 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 83.86 Tm (0) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 150.02 Tm (5) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 212.84 Tm (10) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 278.99 Tm (15) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 345.14 Tm (20) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 411.30 Tm (25) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 74.40 87.20 38.40 251.38 re S 112.80 87.20 38.40 238.15 re S 151.20 87.20 38.40 291.08 re S 189.60 87.20 38.40 344.00 re S 228.00 87.20 38.40 132.31 re S 266.40 87.20 38.40 52.92 re S 304.80 87.20 38.40 13.23 re S Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 74.40 73.44 m 458.40 73.44 l S 74.40 73.44 m 74.40 66.24 l S 112.80 73.44 m 112.80 66.24 l S 151.20 73.44 m 151.20 66.24 l S 189.60 73.44 m 189.60 66.24 l S 228.00 73.44 m 228.00 66.24 l S 266.40 73.44 m 266.40 66.24 l S 304.80 73.44 m 304.80 66.24 l S 343.20 73.44 m 343.20 66.24 l S 381.60 73.44 m 381.60 66.24 l S 420.00 73.44 m 420.00 66.24 l S 458.40 73.44 m 458.40 66.24 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 71.06 47.52 Tm (0) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 106.13 47.52 Tm (10) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 144.53 47.52 Tm (20) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 182.93 47.52 Tm (30) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 221.33 47.52 Tm (40) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 259.73 47.52 Tm (50) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 298.13 47.52 Tm (60) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 336.53 47.52 Tm (70) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 374.93 47.52 Tm (80) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 413.33 47.52 Tm (90) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 448.39 47.52 Tm (100) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 1.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 272.16 73.44 m 272.16 444.96 l S BT 1.000 0.000 0.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 239.19 350.25 Tm (> 97%) Tj ET BT /F2 1 Tf 9.00 0.00 -0.00 9.00 195.53 339.45 Tm [(of r) 10 (andom results)] TJ ET 0.000 0.000 1.000 RG 266.50 73.44 m 266.50 444.96 l S BT 0.000 0.000 1.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 207.27 377.45 Tm (95% quantile) Tj ET Q endstream endobj 391 0 obj << /Length 740 /Filter /FlateDecode >> stream x}TMo0 W(jYqRlm;8NߏhDO|L&/tA&h՟ΌI+XLy8o:T;hƌݺ *]IIR]I\uPШ=}H #k U} ɪ{؃|DhQ8L'5GD4tގ${s8w+b'0NaR0!8?,)N4DI,�;nw�D2Ԫ#FA|8R|N'ˡACwgz(K6ɌW8NܓE)jTT`R�L,SwR&[{)' rXcFNË :lˆ Q:LLjːޭbq_;4P ,EAX1=Rr_r+8W F2[_\[ M;'1ztIY| ib@YyvߥXϙ叄 QhJU҅i</_ؑ[űsT/j' mz.Fh``S;~ MEoĩ[*5˶9{!$J^iTU·)Ap#L{ѾX<~yȪ8{ :&@yTHD2Z~~Yٽ`Y4gh\EDIfuQI4R[ endstream endobj 370 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./indegree.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 393 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 394 0 R>> /ExtGState << >>>> /Length 2625 >> stream q Q q BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 187.04 18.72 Tm [(Gini inde) 30 (x of state in-degrees)] TJ ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 12.96 230.86 Tm (Frequency) Tj ET Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 59.04 87.20 m 59.04 440.02 l S 59.04 87.20 m 51.84 87.20 l S 59.04 175.41 m 51.84 175.41 l S 59.04 263.61 m 51.84 263.61 l S 59.04 351.82 m 51.84 351.82 l S 59.04 440.02 m 51.84 440.02 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 83.86 Tm (0) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 168.73 Tm (10) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 256.94 Tm (20) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 345.14 Tm (30) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 433.35 Tm (40) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 304.80 87.20 19.20 8.82 re S 324.00 87.20 19.20 52.92 re S 343.20 87.20 19.20 141.13 re S 362.40 87.20 19.20 344.00 re S 381.60 87.20 19.20 238.15 re S 400.80 87.20 19.20 97.03 re S Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 74.40 73.44 m 458.40 73.44 l S 74.40 73.44 m 74.40 66.24 l S 112.80 73.44 m 112.80 66.24 l S 151.20 73.44 m 151.20 66.24 l S 189.60 73.44 m 189.60 66.24 l S 228.00 73.44 m 228.00 66.24 l S 266.40 73.44 m 266.40 66.24 l S 304.80 73.44 m 304.80 66.24 l S 343.20 73.44 m 343.20 66.24 l S 381.60 73.44 m 381.60 66.24 l S 420.00 73.44 m 420.00 66.24 l S 458.40 73.44 m 458.40 66.24 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 66.06 47.52 Tm (0.0) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 104.46 47.52 Tm (0.1) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 142.86 47.52 Tm (0.2) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 181.26 47.52 Tm (0.3) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 219.66 47.52 Tm (0.4) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 258.06 47.52 Tm (0.5) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 296.46 47.52 Tm (0.6) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 334.86 47.52 Tm (0.7) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 373.26 47.52 Tm (0.8) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 411.66 47.52 Tm (0.9) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 450.06 47.52 Tm (1.0) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 1.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 443.57 73.44 m 443.57 444.96 l S BT 1.000 0.000 0.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 405.60 350.25 Tm (> 100%) Tj ET BT /F2 1 Tf 9.00 0.00 -0.00 9.00 366.93 339.45 Tm [(of r) 10 (andom results)] TJ ET 0.000 0.000 1.000 RG 408.80 73.44 m 408.80 444.96 l S BT 0.000 0.000 1.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 349.57 377.45 Tm (95% quantile) Tj ET Q endstream endobj 400 0 obj << /Length 1165 /Filter /FlateDecode >> stream xڝW[o6~>ȘD6` Pl큖ĈeܴwnGu M/w>*P&rc4+"GGQT:#oK$%rrpqU8G:SOf$&Q'AM ̗XkX|W㩎PůTp-Iv[B T;%:Xv["e͊YcZ%̓<(}Su6kRɇe%7 }U3@ZJE,0dա,[ (]F1nt#SKnj>X#g,9ZiFm0= 돨C߫iňL,c'ѭDž9jXm`+Podߢ*Cfd Ӷ>Gl)u|&Ą-eK]sޑDo: m4Zi7"0?>SH^ҘowZ1Qd' $;`pىD^H rɦ7*4vYk,zʳ+՟|@|OŲ|/ddEC)k݈_`a7wºZ'PcBSY~0M(k/p>΋=/%'&TVdmn/ξY`1QÚt98eiGxNЬU`:`/T ><>b޵'urk/|ח0 @2 R%*M'Cᾮd�>"nі;TY,a GŪinӛ:ao0˃6Rh`-թKỹؗeMkE7.0Y7cP}jz 2KJI!?hREvSU)< |mDn% rn (B]"ԪYjqZsxuVN'ă41(.rHf`{~.K+A9%n+cr ]M,P=R_~v(wkgL xޚ #|P TŲ³C/Io):jx6tgN�~ ^xCc"OgQQqf>g endstream endobj 379 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./indegree_kl.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 402 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 403 0 R>> /ExtGState << >>>> /Length 2489 >> stream q Q q BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 198.50 18.72 Tm [(K) 30 (ullback-Leib) 20 (ler distance)] TJ ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 12.96 230.86 Tm (Frequency) Tj ET Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 88.11 73.44 m 430.97 73.44 l S 88.11 73.44 m 88.11 66.24 l S 156.69 73.44 m 156.69 66.24 l S 225.26 73.44 m 225.26 66.24 l S 293.83 73.44 m 293.83 66.24 l S 362.40 73.44 m 362.40 66.24 l S 430.97 73.44 m 430.97 66.24 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 79.77 47.52 Tm (0.2) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 148.35 47.52 Tm (0.3) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 216.92 47.52 Tm (0.4) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 285.49 47.52 Tm (0.5) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 354.06 47.52 Tm (0.6) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 422.63 47.52 Tm (0.7) Tj ET 59.04 87.20 m 59.04 431.20 l S 59.04 87.20 m 51.84 87.20 l S 59.04 144.53 m 51.84 144.53 l S 59.04 201.87 m 51.84 201.87 l S 59.04 259.20 m 51.84 259.20 l S 59.04 316.53 m 51.84 316.53 l S 59.04 373.87 m 51.84 373.87 l S 59.04 431.20 m 51.84 431.20 l S BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 83.86 Tm (0) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 141.20 Tm (2) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 198.53 Tm (4) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 255.86 Tm (6) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 313.20 Tm (8) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 367.19 Tm (10) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 424.53 Tm (12) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 74.40 87.20 13.71 28.67 re S 88.11 87.20 13.71 57.33 re S 101.83 87.20 13.71 143.33 re S 115.54 87.20 13.71 57.33 re S 129.26 87.20 13.71 229.33 re S 142.97 87.20 13.71 143.33 re S 156.69 87.20 13.71 315.33 re S 170.40 87.20 13.71 344.00 re S 184.11 87.20 13.71 258.00 re S 197.83 87.20 13.71 143.33 re S 211.54 87.20 13.71 172.00 re S 225.26 87.20 13.71 143.33 re S 238.97 87.20 13.71 114.67 re S 252.69 87.20 13.71 114.67 re S 266.40 87.20 13.71 86.00 re S 280.11 87.20 13.71 57.33 re S 293.83 87.20 13.71 114.67 re S 307.54 87.20 13.71 28.67 re S 321.26 87.20 13.71 57.33 re S 334.97 87.20 13.71 28.67 re S 348.69 87.20 13.71 28.67 re S 362.40 87.20 13.71 28.67 re S 376.11 87.20 13.71 28.67 re S 389.83 87.20 13.71 28.67 re S 403.54 87.20 13.71 28.67 re S 417.26 87.20 13.71 57.33 re S 430.97 87.20 13.71 0.00 re S 444.69 87.20 13.71 28.67 re S Q endstream endobj 407 0 obj << /Length 1305 /Filter /FlateDecode >> stream xڅVYo6~$"JU)[B޺EȴbT2]Ɏ: G3󛹽_UAEZ@:4("Vio?ZnLpsec([##5aݼu{R*^Ge:#~^W:_zVDV> 1.FՐb?Iu]i`Tns2|t=3LJ3x<$M-Q Bs zE;"L`:Gg< v a@۸ h!;Y+bDmlG3.DW ƨM@J2 t]Mgg:kXґgRwnHdF .u{o܉ۓjkHoU~`9KiLJ 6-G{mF_;S; z,!%p{I9dxh(9u;x톣N|ND¿%];*%W,d{-HMI+fL*39;YE*Ik]Tl-'yxÇgAA&#{\x j<Cj lAO|QWd[)./_Lᄵpd<00 EKRۻ<?h79#\ lzO|HY-qTq#r BĽDĻl2.-\DqΦNWktS  Oh_':c1D?ٝlv7�fYfH'#E뀍=Z|fz6uS5v6 ~|h]^.EȍFM0w"[}%T|!r/X .@Pqe!i_Q>w"ŵ.)AY#yu4( V_,PzMMCQ=(,me<ۘ)T0X//_q+kaҿ ͈¶O?$qEJk~bN㇙0Ïne VE,!3vOUj;e.@tӠ'Zd/ G(Jg""~(8up\Af[r4O,K<y4mI#w5͔f0�>_y !xgy G!Nj$>U{tE),�bz'#Nn^/Ijp;>a &y=b`) 9a^Q F ɶ{Ǘ{ {dVYkpT`ƹ'OD@$S~ kU5 endstream endobj 397 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./basinsize.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 411 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 412 0 R>> /ExtGState << >>>> /Length 2189 >> stream q Q q BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 173.62 18.72 Tm [(A) 40 (v) 25 (er) 10 (age siz) 15 (e of basins of attr) 10 (action)] TJ ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 12.96 230.86 Tm (Frequency) Tj ET Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 127.33 73.44 m 448.76 73.44 l S 127.33 73.44 m 127.33 66.24 l S 207.69 73.44 m 207.69 66.24 l S 288.04 73.44 m 288.04 66.24 l S 368.40 73.44 m 368.40 66.24 l S 448.76 73.44 m 448.76 66.24 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 117.32 47.52 Tm (200) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 197.68 47.52 Tm (400) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 278.03 47.52 Tm (600) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 358.39 47.52 Tm (800) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 435.41 47.52 Tm (1000) Tj ET 59.04 87.20 m 59.04 395.44 l S 59.04 87.20 m 51.84 87.20 l S 59.04 148.85 m 51.84 148.85 l S 59.04 210.50 m 51.84 210.50 l S 59.04 272.15 m 51.84 272.15 l S 59.04 333.79 m 51.84 333.79 l S 59.04 395.44 m 51.84 395.44 l S BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 83.86 Tm (0) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 142.18 Tm (50) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 200.49 Tm (100) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 262.14 Tm (150) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 323.79 Tm (200) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 385.44 Tm (250) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 46.97 87.20 40.18 8.63 re S 87.15 87.20 40.18 181.25 re S 127.33 87.20 40.18 344.00 re S 167.51 87.20 40.18 286.05 re S 207.69 87.20 40.18 0.00 re S 247.86 87.20 40.18 277.42 re S 288.04 87.20 40.18 0.00 re S 328.22 87.20 40.18 0.00 re S 368.40 87.20 40.18 0.00 re S 408.58 87.20 40.18 0.00 re S 448.76 87.20 40.18 135.63 re S 1.000 0.000 0.000 RG 252.69 73.44 m 252.69 444.96 l S BT 1.000 0.000 0.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 219.72 350.25 Tm (> 66%) Tj ET BT /F2 1 Tf 9.00 0.00 -0.00 9.00 176.05 339.45 Tm [(of r) 10 (andom results)] TJ ET 0.000 0.000 1.000 RG 458.40 73.44 m 458.40 444.96 l S BT 0.000 0.000 1.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 399.17 377.45 Tm (95% quantile) Tj ET Q endstream endobj 418 0 obj << /Length 3001 /Filter /FlateDecode >> stream xڽYo]G;^F[򁺵$VЇ$(JbD..)=r-Ksw_󋓳7.hKrSyl&Y*mbK3 ۩ַә43ITo*n'3l)-|,غMS.n{Y]W|_nPi½t9,)!ek݊exB.PEjR=3:S:vЈɧ=IM  ?DiBe͸Uu.(Re�jʄAhk1@kpg oք#y!|-yY3;M95VV"14S2WF S8<ORmk%+/f\qC4x d>p e#g;^`pt4PyMfS`kw.L$s6z3GHmPx� ("ԞW+;_0^M5Y8r++aqYI Ke&Y?,Y);/ ?w=#@Yf"I.�P!?q/8YmۭF6E-,tD2{!c7DY$ۚ9>Y#C;3 p6K#( �L f 2M"ڲdӅ0u0-6~ɜ hv;$,\K?±늨{A({BYJ]@W"ٵ|{;$Z<Ԇ:qmJ@dR<?g6Jy[ђ$7BZ90Tƚc 5r[=+4Ft3  P'HՃyς!QQ%JCdB23kreYWUHi!7 xڞ*=U2il dyGtZ_o|M"4ʞڙzq'^H DHnhRQ],E oqv\9:f-4n] vG{?k^wsHΒP{Ę?6&ȕ¸G(*4`bͷ:VEj#۰R~ hـCyڗh#+FˎX T K W!K7i]7uQY\<ϺPI΅~e+̲3u.dxcè06P6dӐfQE{&%*s17"A76*cJQO^\k{گxV^Ʃ *Iy;ʵ16(漌QL}҉ UYMgwh[~^h|5/WTh_Q5úr[ v Ɯm)|pKלYqٚ*F.l Z&8\9;4K9'XYH Wc+`h9XnK?} A$, u6'V3r)U`[4HdN{ʁn9|x۬jOPp#޿QXjuS&ߪ- *zno9O0+cX˒+lİ>Dq"(7(Y)՚鏷Jx%ߓwpgO4#-Lzվ/;SQAx$AB P0Hc8GLV*a�AJ8l%IT +9IC@GK/9$,Ίr8ZArSFa<-\l$bsM"?j vt.Z5S.A:n#a&$8aݒ#^+.95ﭱCHM?IP@QGH1bShz3M҈ >xc)a+RZgB|6tlM=߲۠�ҋOcqzIoD-1m"s qIf=Q@ڭ�06R!rc,{SiJ8h%SnMtK]J8",`YRU:"tR' W0umeyXI^$BzK:#'/N8AOOƹ2LL6z2_[<Y$pU"hz9h5ɏ'Ej4 Y~ qjr .}m8_nGntxP7 $ۿR%vMȋ~l4#0`:�3>GP L5.xPRȹZr;ȫCZ^o҂ UE=Vkm+gFoNz ETZ4H)?v1dvzAp:Sq i}mK?zIlK+1+ SR+2x%˯O }q q㏩$ԙ]ǓR(Te>Q+^ #4+fgpe:<- ?ʜ 'Lf۫K7x\58MO_BD?@ m[yT%F%Iz<w}2tX)P}X'^ fң)} 3l_$9~Tm`ti�Q8{qouDy%ڃO;\HS]#fB\yyծin  dfØg@n!܌g]2<TmFЗƚ}/im+{Rd ^. 1Ew37OJ!`jY }\A2DBG݁F7<J # @gnswD|ޢܑ2KT_xO|mJ_T@nxkL&ȪG5X\+u~FB;tH; ,-jpY%Q endstream endobj 304 0 obj << /Type /ObjStm /N 100 /First 881 /Length 2412 /Filter /FlateDecode >> stream xZOIm(u#40AJ 0I6vczuQf2n36ff ^U cR L9|bdFJf#B0g(3 9-t,4LJZ/-�M�x�F"%4JP`;he ؘp4�c5F@:<Ho `1<)�ϔ8KI%UG| VAYLӈfBX� A`@f+DLa �Y�9r b&AdHf` rz%<PP@ q+CcF&4�W{IC 28(l 32N@�93Q`*l1$X Yt8؈@vVwt�`\:P6*I2'dX$%!`-` gl4}%%"`_$o^ORVӈfIpb9 d pYP"#6-8-$g11 DgwqSlo85lr٤K'WʋUv|x,I9ÍJH%בhp\X =˲32:쐽zq~.E2K`\u`\zn*�QaNҕr\’RiÝPRQTM_VŵPG6K8+ #JlN!$S}G&A$a8/V#Bh4l-Gc Oˎp;O-%8쐽,˯ hKm+;*MЗ!Yգɸ(Л[,IF?ɓclԔvJ˔l ;)q:i`\hl Lhzッ.Mcd7gIIHnjػ̛`*ò.͔;uaz>uspEwaU%)q~s]5;47fM^30D$7aPXRW9G%RQfƯB?; ,i$H7ʪw >B{0{53SAKuI\L~j7y*=h\@M9xGm/ @uwdYgUA3BGmGxǙ//y#+oy)ȑW9޼9!ׇQD!~+bTxMCc]4^,nÂ[[w nirwHd-4z4%ΫAY< aj0^CPf\yY3psR(0pǟ魘y7ǧ)Z}vDuRU7X!SY777;2j{Y+ڟJuxJGpAr?S(iחyU)9%P?VN CnQa*u%k[zľ5EdBNjվ-=C!얳(k Yx+ ^2"DF}V~YE!=hbqY4tonOR}:ֵ̱-3T^- M n(dZq̸MWOk:@>c  Ew1*⢁{A$o#OV\Y5#()5iZ2 4/g^>ͫ: Qڃ-CB,bg֑PQhՎߨ5ؑ/_۲|;ҥF[ϊpoXWꪄHΟ٠Nj]ɨ)UCYwfzbҔYQ_~͚-A^Gr\KjЬ[ሺ3t˫loדa/O|dhX~Ɋox3|$fBG0"VyG]e,&Oomx,*Hܠhi!=|ȘS^h f tiU`r90-*w|}/ɀ ajkԦ#2VΈ"=¦*Ħ%Ϧ7һ "A^GE 7X8sn2z֮a4]D/ _IP<~gtF10Ʉ #Òݿ|݃g̥\uI{p3{3YUտKߙhˌܡW^XId{l/eueG0LU|Ky5ܧY*oFuޯ&yjnψIeizi` ye Q ߚ{_ٷ endstream endobj 428 0 obj << /Length 1989 /Filter /FlateDecode >> stream xڭXYoF~PPEHswyR@h4QEjDQ);*;RDAQs~3.6Kb_ ҁ7 J"/t>LwC夛 ~WfF9= VL7�+ oy/2iSL~�%3)f6ybovHOs< :fk<db"UհvҼ9_a0l<+Kk~mOv<հ I'8Ňx;YW9~W z~: gH=7AL<C}3 u:~eo`V`x[?T'h{;9>D8 }SzFKO}I_<}Grgʙg[Š,<vϫ}9YY%Yhq/}|#7s~rfc ~O~ܷ-ru7$^ 0W#/ se]=t|ʂ?y+xjJymF'2#'b%O4#R.r).+q94ъ Oϐ Wj%&TKBaKc ZP*c5#bu~D8$qF&� M@y'oH ˰D=}ȲEORI^{#O𸱖3?(Wx~y� 6Vlm 4ݿ 3\9D0,wh 6.yΝt .n{>\Lm([}T+a9xfŮA%%{V6"ŏlʚ\#^FN$ EDŇahCgk/ǘ*p޹ ; Kb;IiJ*h9x.kcX zX7]`�`w!Y,q~Tlsp<B.P/:-萾DNu 3ΐv1gZwC2|]!{I{xmF@ 9lFMOBmEwMpDZjN \ o 0 d\n(#=6KHzh00K4qh'd0 (0%FCoi|1e2n<sYiFr/cStrܽEPn_a)w<~joL%fs ’ཤiQ"֘ Y t>ac q8q"sp1MYfrOsu_"o45^,_+ +y[G76 Lʞ\A--CBЋRcTHJڋto%�t\Ղ|0D"e1xv/bHST ja0< RAF"̺*rٶKJb>c=R.9!NuifӃT1%E';+[N�ގ뎉8>3Gyf#,MpTZqRe@]~.`w6mV WPҠؑZĸS[C$@$fW6}E7sd%VcWvh@+<gE+\NpP 6ÛȴXc3l!* EΛpL8J(t!l(i2f50 n#8.!3CwD\Q y:uw<oϏ ӵ2F/–?P& W`]x:zK!-)?4QHWo )/~?ص ϲ/K%N<kݮw6RHs �f9I�d ;Z 4m]nAG}Y .垥 m)Ur^v#guk M]e# n씤OC7Ԇ/g:Mca/2/BU~%_9; hE/h[ْ P$;o{-O۟'*v"/`$/_ endstream endobj 424 0 obj << /Type /XObject /Subtype /Image /Width 1053 /Height 678 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 430 0 R /Length 35184 /Filter /FlateDecode >> stream x|eWλW_Yޝ DQ,=QAJ'B(B$!^H*C�:y`fg' g3;<e87|aÆm������_>77ou萏?ի})�����%J/_7e˖�����F$"55U YS������PND%4(,,\lF~~~nnnzzzld-{>Zuyyy(+e`ֻGΜ5E<Oyɂ|6w3ݵ |/w}d�����PшJhZ^o|*7h1MէW~H6I� f{_Eosk=N- ;jT7dl*s~o_>WOI]і&�>󦅆NWqO{EiQ^63%!�Vy 55ub߾=?G3_ym'7o>aΡewCM@y}7g?Ǭԡ//ĞulBw& `{GL4  =V iw��Ӯepw^}njF~͟o<co=K; q9{~Z]n8jnX:WAA_mo0?y3|dr[)vUmih�pmiE#"s.=YxvgG ~E}?oUd`ËvºϿ ~dfK/sdVjd`G̞QE}zsb^=a}dI3Z~4NݩUe`9��vIt?o:w)kg}]i~>ONOϛ Ϩfصtߏ2$>iw.-N1K}\˩UU:- _p8:L]|.:?=lfxX̛<kɖ.,ZMM14�д"A-یʏ?xJgZ>v6xM(+e`i8啛CC vb[:J|<❣jJ$$G=Ibu`Ҏvȩ,Ɖe`��vIi}cVZ.g(Bnem?["NY XjJxeYU]Q)͘Z<JsU%٫.Ѷ$UkE֮(WZ>p*]H!2Dz.U䡯JK%p1G5Zh޹~-NckM+2<0+ y-;o伱pӵC~PLo?ߎzĔZg⌯LmLm QV& Qޘ[fa]C>? X/5Roz1K ��$VtZ̚!ZtPWw WA'WUuk39j8 HЭ۽W>7W;suMU+ T|=4>#u1|7.^Oe}4긿ع玘Zیpi0-Ű^KU]X7x3 = BWΧSk~нku8Rp|SZ&ZG=G4RKRzoo3hΕs17ZUcvK%Z^?`ᣧ3-%".<wIk_g-Ji'u" �2?>j9|Ϊ8VzD^;1ل7>t|zBV d`PEL> \ո Y}ൟ[IU\賘zN�KB*n]IԔLY;guG. �ӛ!iiCT&ӓP#w<$,)33 UkԞoo  lö>,<$"73K YqM{%$37mvXXę!I:C""" 1u׾RɘԔ٣>n#2-S{Iv4zCO)]emG$e&n:*_ -̜=Ki]{$5?6<":EwlG+M0GǔniFpvuSOL {NC^r8j7 ?o `SdOGDDIL5|4/ \ls۳!$-|(/� V${`ny _sϾp6olǟW;ٳo9>t.ԹsmKkusOew$3ݽwu;&?fmh>va[iƎai �`y/EoRedж1euϨEDSR#kђ%RcFt. VGF+,[TO:QF&cs"BgѱNzC&$b^Ĝ;SR}ff^^nz:KSs sDq)̀Ռf"4/=95s˗dyrO .d.c_8kA֢ŮP'QD4&A² rDtqۡODWn$.+_?v\ʸyiS @)y.E\z U';~~1+,[󍜁\'ŰiQ13ɱی@# ??w+.8wYs'07g)NNNK*im�p͠iEw/&휽rztlnõj'7t=_1eg·>sĖΝ]-\W|pGtN:6UȖvwt[3e_`_o -44�.s{Tw=gʕ)S\_7?.:1qcnb2 }.t¬aC'})/8mxgԽ1UOJ@B <u!%aǯTv8c%gNZxJ7mœJJI;ifT BǠeAs3<K {Nz⇂/*^p.Hlo#PrQΡniK;u}y۴CsOiq GGZf.sIJIrK:s{&tq%oގ 89| 瓠/ptw7$NhyXm%� Z~_x٤SW7c8Lu;rvگ`{.+,ԹK%vuu˹skGOW#Lw5{gݴ]JmJMۻ]GG �KL v,%gϐ'&ZIzŮcUIr:O&Wq<:;M^b/jr 8 ߏ_XbҬ$WԬ+% t9)<䌠d\٪2h0S=¢+7[L0F-WsT+- 5r;7&ŝ yl揗hڏ=WӤgADQxUjqn<;p|u'ğ?Y=f8_I*@gGùbB\dy6�fд"/h_8tĴΘXkLgx!;Z3==aAsS{R+O_bgw}X0tԄNSOm:k{<y`Bq`_'nr# �`ݫ;*7 UGw͌нfw=QM]ן?A yqO˥L* 溭#g l@%9rk^!r# ѥoHyshpv 1{Iqf}V!Tb&mժGl<Op=nIw!!A.FM=#WZ8qT#U8S{⦸~@8qxƥ Ӹ(|^*wC}Lԟ 9um~Mjjs]gzqƺzQ4CF .UK>\dZsEiz}i,..јim�p͠iEΝ=yv~kB"!љ o;N"< "xzrZ8wp 8]=}4m `i=f4 Y.~g`A~N^{'8Mi #y�YjzL7ZMLJثn\]OrNd> IIu3vT/ 0*stiUɰ%w?w:d$çL[$<R֯7<UU(Mae]CkQTZZx`L<vBǛ~`Ĺ;GJwq~ 4OˋA;Hf2EKveV>'*ɱRE7/57ezPǥY3Xy&C ?fkZYNO\h9IO֫F{`)))9Ӧ-yăQQ杊0ja_M@Y`VH[RZԖ8ɦ2wJdlZe=ƭ3cYi-"?Ln;�q9K5 'ڤKrJC&,),K,( [\H<ca" [Xt)'u^Hj}$Eʠpmչ.-HǦ,](74Ƃ1.\E'Rxc^})I1󖒷t钴8<.:u|WK/Z\$i)5.hiQ^{̅K MaQ~|uljnJigdp3JMΖjE]PXdIQ^Wƻ_>:z^")3?-w:i?OkJn‚¥stEr S<}b7S�p-ilD\3jt!xPl٤X87+ub l*Ӽ6w?o؎oݼVC;!+w�9sXc$tƴp Mĸߵ1194Z>+xмd_iiiSZ6slG0W)e X{yT{|\7$SbѬg'4hɹ+ݱt)Є�BӊY9sddd,+Ek|sw�KEL&GV` G<jfRPQr3b >jp6?yQ^a8:)37#�V̴$""B-M��qI)QCd\RDyu[BJzVvvNnNւS �pŠiE�����WhZ.�����WhZ����� ����� �����@+������P7% 99szrk ���huzˡoT5j$ܗ u] Ĵnݺrʆ_N>]qS2/X^/ǬU뮻]Y.m鹟aÆ]|����ʥժU+<ϒ%KiӦM4"hiZOX\\܈#|I@NNQQQ~_F"]|:r)9s樏֭ BUgyFB]Dh���\ZQBYzZhQvm_p{k׮ښo1==ҞKF||T?_l"h?^nna ���BFm۶u9sgϞwy_oKnJ*5JZ†~뭷tM<HvND$f!~>Κ5Ke(ӌ<$)&>$[2sy$UV;vZ٬Y35Xzc=/H PJ[n/((|g{%ɖH-"U5p˖-.?^wu}TEdSӗђ)-[8q���.Vxz" ࡇJKKcbb|DժUky?nAʕ+e,#=g+6mT^'x"33SyKJ)䨏 4Fefcǎ/ ТE 9w_bbBƴcƌ{:tHVp *LΝ_}UU2�2dŋ%#^JLy饗T$[2" TYlҟVZׯ͕sw%:O^D|IO?ZhZ>eSL~|���ZaS+~yRRR,B7tu6lA^ɓ'?uE v]wiu}u;?ܦMY8zdP̌YmGQQ ˗/Q/[%cW)˲fI/9sD- n߾ iI ȭY7AY:.J}Oi!׬YӰR_EduDo!SiE3D} zw��"hO?<ЊիW|:h_`>8ΣDڰa"ccV'C٨(`32x$WX!+322Ddl6h#^!33o߾jfdjeyYdf,KN9ZjZZZEh<ФIv/"`JvEݶ_, ��� /<umvÏ˗K,M+֮]blذa˖- "2ر$??~U^}ڴi-q?8pĮΝ;۲eKz˖-�2vw/VX:?kIE[?~[,]+,*VHi���\Z!nA/Lc!߮yDO}Y'(0`#<K_nݺ޿Kfʕr6UN<$﷿ e͑#Gd,.7n_y>@-/X@~,RwHuM/ܳgϛoy/"`~ JhoOC���B޽:}cǎ8p@s= l y V\955uůڍ7hlEhh 2d(/,,W.!c{_Yvu]$˒T*]vZjښMJfggˈ]R%[Ԧ۰aCTT?VHMٶH&I߲eD{9֭[Zl).88X6m޼Si"ߵ¢ZzLITOI���":uM7Jf/(bpUR%xGGG{ ~gn/zǶmd|f܊/9rZa(y;H?K,n ;4h #R?aaa&?UZ"5 TYl2<--C%՛ii]+<UBCk}gԩs-7$:u���*Z+C*7ok׮cǎ]R8@Zfwܩ̔ql5/))c2~Ϟ=H-ReICV\\| KPD.~%Cί ����Vor�6���Xp!En��������� �����:"�����+4�����+ �����@+�����2ԊC������ R1ChWG� �����@+������0hŘCϖ^_p\kZkFqGU/mP OZqرSDZERZ3.}W0 Qy_VC\WD U/pjŁT=t萶0|t_հR-KZp\W}Y]=_2ԩJީ<~̸ <.Kc.UQmDo)iv*"yhٿCM@+<iw!;ϳV{`my֭Zp3[zUf\ݻww F)" J+]c׮]jdȗ:YG 㥋_ynfZd8WVYk=""^[ 2]-jf.I#5ٚOm۶M DeY5iEkTv.N]&(M1B˻,f>ٷ3{aW2+�Z5Ci{{=(ԵS\vbc5㞞=f,,rasGB Ri C}r0~#e]U[oS5j׮AIw_^z_wK}f.qqƙ+vgQZfڴ3~҇ӧ/[褻Vl5^k&5Z;FB^΢H(lji(<:^]nBv/tCwe} p_04jZI+T 5`@kY-<o?Ў&Qki\ZxOuȂ.X$FŸyΔ򞕵dƽjE˸㒾W:lB9$ 5@2K&v(B^<EA- }<w}?\^=YNJJwgGQF ]5dڥ",,lԨQcǎu8p2 /j~zBӊFڏS jڴT[Y2n܂} 0S)j WŝPӸ=[)ӞV{9ϔnuGR˸)"ݯ.צVꡝVf0[~QξE<]jE�@+ܵP<zЯT!OJkEBq2=$$3#cTYX\T\vfK=%F"?$/52$<+k}~ja[f5.K+,RB+씡엡/Goӹي>P&w*ҋVx]y8 qڥbĉ2l<x]֋\iZ!6VVM|) bw="ߺaö}]+,ZwZ'q{/VXTө *S+Pk ">vSK芵[O-;C;u՗<e_{"</ٷ3{qz04jZI+ۧhv$յ4_J"UN!1׬>pp|)1Ѳe{PoCqQP_ߥ؏K>&*C!_i'SU�_rPs=5[ѰaC*ͥ<ckhX:[2<v \7jWNQ.0]VvbѢ2UPpViVVhc92PQuBM2m/J5W\U©H 뽎OCBbQ6B< plE50e}پMx* i#_]Іji8ki\ڲ]TB9Ŝ9+)23w_ԛvXd͑ksN1neKh_ְNJ'/|K^m/|�jdȗ{H(=ʣY;B+5[z6[!%;Vܳu[nӵkW&c3nxŰ{]6,.M%|f1(⎧f'TSz:_>< mjqyZJRmU뽎KҵV*~(k?6 {9)})VQ`ӺZ^"/YY7=sy0[04jZI+8X,hC5o{\꣼g+)~r ,4P[;{\vfK=e\bٞI$ o'15>ƥ:yA7ڵlZP= j NvB=نz@*{\jtťw<~_g+(P|c>\PJ(oq>+k<B/jaN-( Nr ^N|y V'W_qWT=.4}0B|zF>bZU 0-^y,M*S{rr fQ}|¢` h'6ޣQ+D] LҖg+9EFS'%mI_ qZS7o)/ysYsPkX'bƥ^W֑#GB֘jlUfa,Ӯ&*̫lzJv*Ppej}\;+6bcQ>[qlE4({_zm<5FK_A+Ű_y|3^H/1j(NUxZ.ku9[azA+Πvaz0<e߸L5vV(( 1.VF}5Q߽& USxc1[aQ5,2[a3GMdY mҋ[u V‹pj7VS~B+ I+=.83"hɒ#眢t"#c8ŤI 8,a?2<gTCɸ{\ǸN^z0PZ,Y ~*J@u>eԞMie^Do_ݿbc~xܳ.=?[qlETT/F)Yy!KVfa:[a] Znnٲ,Yׯ?vںl2?h>j| zpoǞGk'W\vqJ}._0DGQb4}_XY%c&(/]+/MU˻,Va(ìeo3i_ci0“VHUE7z(�O/)_1eTB<BE 6P=mS\vfK=e|ƽSL ;7ߴ~?͸{\'}K w+V[;{dpH|쩓F ھvP?uѴ;Կv@M:Uy4w?[Ѿao;KP۴n5"|6clڥL[i,(>|xpppݺuJ3g_|! r^z322LkV#yj@cSTJLBV %ǞGozpˢ0oqQz˻F<jB޵VVڬ<^ܤ_Ⱦ~ʣ*myn\ٷ3{?XW �`ZaOZaZ+ N8lŵ_8'FFFq͡~7ĥu\z,B9|ԴBaU_BjP24bZ\W<;sg+nQlE>}|l5 ?zcf}lܴvf+ZGFGuСGڵO>3gn̙3&333]aURklK;#g+|ԊrUYTh\Pk1.—Fa S*I-զVhO_vLL}OxQ1�Y0\G2uZMP% u-0ȑ#^GoK;{\vO|~*{d?gB5w\̸T߫L˜>oS5 q0Td>Z},Cli%r CzRyي5N}N;jAzfyÃa eي>}ZϔN+VטB5jkl)YKBY|څ~v@LCiN!Q׍~kʣКSB?e1V_]4v)BkO[҂VVb0VV~yQ1�q8r0Li7hhnſQ4.;Q2ׅjXa*W+".ݑGmklWZ6 u^j6$Yg+OqyWy4Sh~bppӆ I5z\# `֐!IBh`l{m՘.VX.=mՔK+ܿ5aX|NzZ͠i;-c գyx/m)okZa5MЊ2כ/MPvڎ6+7 2iJ++ lԂC� 0#۞0hǶRe|aÆs޽[J+ ]2^{icq.PW(}N^.*# dAWAV4\VQ)֞ep/5~S5;_*}}Zebcb!&LX4&;2rU"Sbʬ<Z~ ʰEyÃv>[avyZl5f<PSѣixH¢hy/w0 Fa$j2*~VVOiP(P|eAXXlg߀wG=Jlf߾V볲Vx c؊V�ZQVV^ku\BZ!a'}oH2lQ/n\͌WD\ԽC`w$}<e GSG%(C*+ lb袘+O[:$Qb=+rԩK 4VxQy,oї͌.m[avK+ M`ՄF~ # Y2Ĵr<o4US)xUQ_ H}QM|64 O*S:V(~3V;@Zq% ZP(V: V+ $Lưf�BZJI)Ȃ/]-׸Pf\6gKc֟eOxEeS+`x�I/uR3mȸ*YXwGS<Y3WLߨV 8!tرjbIbؘsc/ 7]2B;G5je~*6lؠj˃ 6z,3_'T?7/۷_y{өVڀ_fEVBˬ:RG�z6 OSZ,LBFFL0='&(;Zs12;YiHbM+Fm�hzz7[~4".W:mS\6(?7ˇ+Q*S3^qIk1]Z~*= mfpZa,,л#0pS,-HO!NQ6III:aq)VSƬHۡf+UyHʵ/fMk}(),j?0kGo۷7]*Sh_jklSCZͱųl٩պ4V7_e^F^CI+TMZ?'0)ElPd\6a3='P Z)a+ZhVhѣGMAj<$FNc=GKR Yߴڗ>SC;ԊrQV?)̺WEzWyC$Nt9:5OIbvwY\NQ)rS$'m'bfܢv1 ;NaQ uf-6]>jr 5zT j|YX?l [QRojj>6 }1^FaڳZZaV(&2B˅;{Vh50 )Vb�\Zqa;vy|PRIZ`}f+<eg41z5])iq~ƈ2oKɫ_6`xF[)ڡ!_I1dA}WP*/ehsdQU/ާsh}ޛeG\\*]ƭkfcǎ}0}7u i~0fp;~/Z!n2\Тj]:w~T(LBhGS.( }_n_Thr m8dNϬS4#[ˬ�hEk/hbek d//mZ#C;q&oQ+dpۿ>B(mV#nfL[<r ;dMHpfN)*%e.,<»ŭ;wEB/ڻ) "Z+3xlM]ZqZN+0Fy‹>AQW€Ρ\/S+L۔A+LB+�Њ(uq$ u-hq,S^<N> YAP$CԘSʵ~򖡊E;fXy4ОVN!sgYRnj۩],:+vy1־iכVlVX\K[cxKPٯv"SQ/F~}ŐiV+lš4,68^B lia}YiYִ"a͊p-kʼn s6Y_ .N\vfKʌNЅ*~OH'cό\ʣFwC0VyZ%Ԯ~ل gĺՄ|j{jQmT`մM+oE՟O\Y/* c}iyrTy8BzB}'x3lY1� ;vLɓ'y5NX֜:uʰUPׂ5ʌK߫t*._֯1a$ 5@rϗ^*2~ikI O뒷NbVPQFq7}_}?ve^jZaX|TAqٜ-2nݑ߱ޕsgj]"O/pjUҫ*ϵvjh|tqYe 50 ����������� �����@+�����Z ����������� �����������дC�����J5EӠp����쏩ܵbܸqNk�ZAC����?Vlbh���\ˌ1bC6l?f̘ЉM4iᑑ6bʕ @+�����*wظqcAA 222rrr JYdɲe˖/_jժuرcŊ6B fV�Z���pG9rDEׯ׮]+ 6mڶm۞={d}ءcΝ͓dZh���UEN8qرGO۷o߼y-[)TrišCv_H||D, ݟoQM&muZV�Z���pɓǏ?zhžVl)Eb޽.V.{/$11̙3,cxݒ3gk#C[8|J}r#<ЩסV����\L8~8 6lذzUVڵk7n(fqriENNNIIa2I&I�S8vB+^hQcqm _Ҧ����iX8xD~~~AAʕ+E.֭[b͚5bVdee;v}m۶ub PVqҵr|Ͼ]e=~L/ AS6o},t_&,\ئO皻ˆ{<$zfͻ:/޼ _ohZV����'NPnnn^^͛E"v޽w^YO?mܸQB>nԊ'N9~0ՊSώM^X]RAZ ZcMRƆ%g܆Ԛ3gΆ'z>zȮmXY0ϸ!r"%g >!Vh���0i$qqÆ y M+<xС]v]lł N<yIjSgO$O,V u_,2bGg$힗oj%$Ez]Gڜe^RD<r68p,HD+ ���@^zuLȑ#%%%7nO>$LB^+ QZz9vjaǴRZ/՚Ivޮc hZ��� ,]T۷o7hѣG,VZeS+Ϝ9sI):Tr?vg?2u^+,ˉW?iſms\ve5B+Vh���tfaŊejǷmfS+RSSϞ={IJ\ ~^!kWoWmyT ]wN=sˡ WXPV-ҵ&ic hZ��� ,YdʕejzۦV;xQ6I�w0}Ժ\?F%v]fY?60=  @+���ZfJ+֮]k%%%6"99:R�b+�����Ub׮]hZh���Պ3f?~#J(+e@+�����@+, @+����  ���ЊK�h����Zh ���h�Z���V�����h�Z���V����h�Z�7J;®}X����x sL�ZV��\dV*�h�Z�pI_e@+� ��d��@+�� VV��h��h��p��@+������@+�ZV�ZV���V��� ����`Nv� ��֊%r^}K ����"B恗KV��h�N|)$1h�ZV��\qZa_R̓V��h��ZV��h��ZV��h��ZV�h�Z�VTV$l�Zh ��JӜRi�`4h ��I+o7V�4��'5T@+� ��@+| y YF����S9k=_B^Krxm٠�!��ClBXFl[֗&4��;pښPEV�!��i;uV_S\kPh)@+ ��/Z!Nqm_<@+�@+�� iEkhZhZ�VθhZV�ZV��kEkhZhZ�V8hZV�ZV��hZV�h��ZVV���h_8u]ݾh/xjh6pG+ @+� ��=fB>:W&\+.@+ @+ �R+ާ <s_B,@+��@+�� I)}rnUtsN.@+ @+� ��F5$)ܪmKiŌ6@+ @+ �T+?mշK'\ٽ@+��@+�� ;4 iuk7@+ @+ �+T+Nq:Yksׯ9caeX󱮱˲ @+ FSV��Sx1m){;z ,D+ h�էVh)@+ ��@+ ���vᓗ݋g+ h�V�ZV��V�ZV��hhZhZ�V�Zh�Z�V�Zh�Z�V/ҫW~qmڴ/"##'LzbOMM[nʕ4iGeA+  � 5ׯ?!c}ԨQo-"1~@+ h�6me__\\?B[s9052e ZV�@+�� xWe ?A9Mcƌ1hݻt(,/V)Y~=ZV�@+��ؿ<[Ϝ9s!f͚jժ+חw 7pu׵nݺiӦ+;u^H\u̜֕9ʂVhh�j@x-;v}'OJM=~wĨ%''[e\***B+ h�ԪU"ɓՀ_};zu_SjdSFdYHh'N5h@OhZh �Jъu֩1-rYrԨQ5kּnI&:u07|Kyԩ|rV>}Zm{D۶me7zV���pyjř3g?a̦M"RD@>vUkMhXh^8t_?Qs �"�̵B0aDGGk+eV6kL>&;y KCFV>M|xeA+  � 0^=-~rƍzؿw!|+V,]>1lzGd}hƎk_Xn|Ÿ{-Zh�Z�V\>Zxf̘w{wrrrT*UhFdYr˚nMBKx'ni/=k|7Zje/ @+�Њ2kJ앉j��WV(SSS3226o@ę3gd$r̽$+֬Yc  �2S �j @+��ҵ"44 Ԣ�V�ZhWJL3�V�ZV�V�Zh�ZV��ZV�ZV�A+L|-ZHyLHHx7|sh�V�Zpk0}tՠ׿;v¯yyz2q뭷JV��Zh�VhW_,H뮻ڵkIy:u/^o$ 6 �� @+�h?Xٳ{n;A|IT+6mڤ%;o%d= �@+��J 9 7pu׵nݺiӦ+Su7tl}뭷y;C}78 eSΝ_WJttػwoQy=4DVTIBΟ?_Ç�ؤW׻%w f߾}hZV�\d{1YswĨ�jk:umݶnݺ'O>cǎ{N:9KoyR;*}QOz#j֬)_F9��K'D+\pU#fVh׊jժ˲A`ĉjo]|AM+{:t;70*]"�P,ZV�\+N>?T+uH]++VXCwe^�|l` �rЊ�ɓ>j4{nݺucNN �@+��׊͛ǿ\reBڻ8ȑ#%m˄ C�V�ZheA=ZGyDԯ__;^zT4ғ'O_>&u  >RfM/._|ҤITԫW?O4�V�ZhSNUWZr׫zի[nմjժ/=suuٳ)!!/z_~p&Wp 7VZk׮?ѴiS� @+��̵;7AI[O>-MԩS5'ݻS �@+��2ԊXoZXHj �@+��r 3f̝w) [n9r؋Z�hV�\&ZAN8OÆ ̙s, �@+��r @+� @+ @+ � @+��@+��@+������ � �E+  �� @+� @+� @+��@+��@+�����@+` �@+���@+� @+� @+��@+��@+����� `4h �� �@+�hV�V�V�ZV�ZV�Zh�ZA�V�ZV�hW=�� � � @+� @+� @+��@+��� �@+�Zh�h�hV�V�V�ZV�ZVVh�ZU� @+��@+��@+������ � �E+ ��hV�V�V�ZV�ZV�Zh�Zh�ZVhZVp� @+� @+� @+��@+��@+�����@+` �@+ �@+������ � � @+� @+� @+ @+ � @+��@+��@+������ � �E+  �� @+� @+� @+��@+��@+�����@+` �@+��� � � @+� @+� @+��@+��@+ @+MZV�V�ZV�h�hV�V�V�ZV�ZV�Zh h �� �@+�hV�V�V�ZV�ZV�Zh�Zh�Vh�ZU� @+��@+��@+������ � �@+�@+ ��V�ZV�ZV�Zh�Zh�Zh�h�hZhZV�\��� � � @+� @+� @+��@+��FIޥj+l(VLee:@+ � !K+zx¥-eB+ �@+�{MPV\/9h�h�<[q͟e@+� � @+��@+��@+������ � �hZVh�ZV��Zh�h�hV�V�V�ZV�Z@+ �@+ �@+������ � � @+� @+�phZVVh�V�ZV�ZV�Zh�Zh�Zh�h� 8 @+ @+ � @+��@+��@+������ � �hZVhhZ�hg����� � � @+� @+� @+  ��Vh�Zh�Zh�h�hV�V�ZV�!�Vp �@+ �� � � @+� @+� @+��@+("� 2ZV�hZAQ�VZ<"@+� � @+VYfŊEEEYYY陙,~w#G�hZ�h`˗/_pa贸:i?/m?q;v=z�@+ �@+��OZ?,XSOw54ѭ?);w:t�@+ �@+��w/^׼sjqrt/r Zp7·4ѸU'dee�hZ�h`RϚ_yDm#6w#־<esvwIw_8iZU ��� p'33.#nw ^1ޝeO_e|W  ,@+� � @+zO0̓Sv<=nKÈ}U2`qIƢ�hZ�hNJJʋN6gmvM,~pĆgmy?rO=sJ-(HUfB+� � @+T+j6,zȴCKjoO/Y;O~ɇgΜV�h�VV|o9GZ;7f;r^y%A+� � @+V<nkO9(8`ۆn|t̶&8HԣsuQh�ZV��ZhXiŰ5#vي;oz*x[{=>tbf+� � @+B+:hΚSvpVGn{uޏcd�@+���lhEwB^34iWq2ioG%my#oG+� � @+J+bK+y#4iQ'jE7F�hZ�h`v&= ^هH9!h#oD+� � @+V<nG_|MU]?0mӏX(#G�hZ�h`ŬshZq`Bqᛞ ތ-w^pw?5 B+� � @+V|/tc3v~^uRq呛̽ms~%ǡ�hZ�h`#Vg۔lz!lvL:'e%CtZV�V�ZcstVǂ68e[9{d yi1qZV�V�ZZzbα9Ńҋm H?<d꒠UGZMB+� � @+Vz?t\Iy;sgW[[ۻ~hO:NQ9pp,uЪUKZbǻ(޹$xF . $@d'p$ $ ߛr$=ɳkٗ+"6>Ⓤ?)+@V @V +8lV]F YpKbZϜؿ [wM)y2xbN|XvE7d Y deGվٱwSmbc_Ȉ K^ +d +6+0ro47 ߣ o_ދ}3WVtIP +d +4LNe`j߭,{%\rpYBV�Ya~1rWl7'G פ.t^ʧ2O-2LV@VXV8!-ψ=>~?y1%>+~W\;HV@Vpجh{Ⱦsl3+4ؒ_OwNc+]�Y!+�YYq?1{f=2luo=O,9QV@VpجQ/O\3x+yچGվE[  6{} c-?_N|,xlɲd�d͛7ۣc'?* /༟L Ȕ=͙;w�Y!+�Yw4zmSY ?,;[Rr]=ꭉk֬ +d +lɒ%,z썄_k삄ߥ&<{u+k/^^TϏbd�dedddffΝ;׏IdX¿K)9 ^p߂3ثf̘e˖2YBV�Y!bիVZx跦14ԟ;'oM^p͛+++񸬀(**?~޽װ.+d +˲BVdggdee-[,̙̑3o޼_RRRQQgY "GydذacƌYtp/ Ybڵ̦֭MbΝ;+++e? -_ΪUBV�½,+dE}Vlذ!֭[KJJi׮]K.]lyEEE x1d +˲BV BYQTTKYYY,ŲBV�½,+d/> JV�Y�Y�Y@V@V@V +@V +SV Y!+dBV @VeddYYY�Y�Y!+dY!+d +˲BV   d d ddd0Y!+d@p/ Y!+@V YY�Y�Y@V@V@V +@V'p/ Y!+@V  +   d d ddeY!+d Y dddYYY�Y�NY^BV8 ]vo۶͠ d ,+ y+Y@V/zv Y@V�e#+  d @V dd +eY!+d BV + +�Y!+  d @V +˲BV  + d @V dd +dY&½,+d�YY@V�d@V +@V�BV + +�Ya)+dESݔڕld +d"+ZyY{Z Yf-AûBd @V d +�Y!+BV�dBV Y +eY!+d @V d +8-\prnBV Y!+.L·X Y!+dY!+h&Y1rȖ<E„SV Y!+dBVЬ[͖Y!+d d-+d3+ڵkb۶mBV@VٲBVgʼnC +8Qb̘1/:|իsβ„SVrii <Evd�YIo=J}UUUvNhQϞ=wZnn%\"+L8eI{/0~d'pV_>zkNj;!/MOO߱cǷmYa)+dd'XV0?ܵ5+Kw9\VD.2Ya)+dd-=+/g֭O9{[nֹjjj׽bO^{_9vܹΝ;å[j.}KKKoSL8'<{W\(G<^"+dBV .pOOO4iRt̙3K۷oNuY?;N8{SoȊpg+n-BV +d�Y_(+ڴiN9|XѥF. ;vNr-7_ڳ~ Y!+@Vg޽{K<HA8 [^Y!+d dQɊ<jY@V YYqYq]w?я + Y!+@VpeżyG/8: / 't֫K^ nxد ɑ#GFFJۄ?IҶm۰~UWZj߶0gqF3Oe 81jWNԥ| +8 7ߌ""rw<ӭZ>)--gϞѱqK:twwrC=T_ַ7q?saNnoLѣwGΩS Y!+N{^ Y'+@A#B}>`{EMMMX -+d_D~;Y!+@V +hVOr7-+d|ɿòBVϊ#GN>"&Mg1~_pe Y!+fGk׮>өS Y!+BV +d… 'X-:G dВ|NYUU w N8G hqYIA)d"8N;Ȋ/a8<>i�Y Y!+MVIJ +@V Y-+Z\Y  +dfaiAﳐ +@V Y1+\ٮhY߽95l+ l")p_}_o/m*+@VCVlEӖnr|n�Y Y?+ފƧw<6Be BV@sˊ1Pd +dĬ>vZsxBV�dOd +dЬivd +dhd +d Y_1wa=5ιYKW YBV Nج/nJmS/m'ɷY!+@V Y ~s"W@/kd�YBV 88Z~ȇ?7גd Y!+笨{c!"[笸9 YBV NdW;Ք7<Da=6YY8&+d BVA W'V{9V3d@V BV[VeR^V6ŊWp Dۼ|SU[zkX7IVDV +d5%55&%oք)seLd�,&+d-(+EVM!+ Mҿ}e@V Y +|J?k dS|fxo@�Y",+& Y-SV�sVQ. Y  ?/7Z.+jKpQxd Yd_pXd YdQ̊6y++@V d�YԬ_7xoE 5d@V G^| 4ٱcGϞ=oGݻwF1r/'''_yw^ΝWZ%+̦dˊ/.%%u8:'//?qxHLL<=KBl Ya hjV<;6GdW~~iq8cajݾ}'.YsѼl Ya hRV ؿ!+80ؿ 2(** ][6ر,[,tMWnc=&+̦Ȋ&ef4?<}՟iӦW_ݥK5̐)A֭O9{[nֹjjjK#3}tYa60@V YAK`h*{W6eUU\!TWWԩStE]OOO4iRt3gldC*..;m6Le@�Y!+d-E}\~oo;۪UMmڴ |a=̖+5jT#}w9xdjjjzqWVڵkݻG/TSnnn47駟Fg<m۶~ᱢG }_U:o>0؆Yw `˖-;󳲲Z +d ??TV N;3NGs9?p8կ~8\V4”+LKK˓~?4[ bĉBVp1baywFLYhQtNuuu ˊFvi(̱CS 4h6s4|�Y47~yEG>JV Nr~-k;L3ׯ_@Vs9K/4++kŊv[> /0ߥKuv:th# </'?i#TV?w~ Lo߾a5s>zٷ6װxcǎ pUW%&&;;v<Sm ÙÇoժU8笳 3/޸q!wi(zu&+̦4s999ё+r^zp|NU ,S{ YA RRRRSS } s*7:`=Be 8ysKg+VxBVI6Be 8a_UpI4 ,e,}͊5q Y!+8I]/s{FV Y-7+"+d Y +d�#TVG͞˛d@V �YF�Y +�Y@V�d�d@V �YF�Y +�Yh;v뮻{ѽ{{oĈ#Grn@QQQ^:w쾐 +d hRRR]'s~Wbb {mn:|K.!+@V viP5nܸb38KȊ;vd�Y-5\S_±쀋 r@VQ| ^.LV dDq?۷,ZiӦW_ݥK5޺uSN9{֭۩unᆚFd�Y' Dǩ+ͪ.a:DN.袰矟>iҤfΜ^BV +Q_~y#a;/:yj*z]S6mE7|sXF^BV +o|љn۶m:~z׮]x׿_СCWZu@Vݻ7pG=^BV +o߾3<3:T7<Eg'~կ~MɊFd�Y'#FD'֟qљwyg82!:hѢh(ɊFd�Y'O?[n޵љׯosN8y饗feeXn pх^ҥhG{ :z3[yBV Y-رcC\uUNǎO=믿>--- ==?A._<9|VZs:묰eϞ= .7nůuM}L:="+@V BbԂ_o߾p( /tGd�Y + +�d +@V� @V�@V Y + +�d +@V� @V�@V Y + +�d +@V� @V�@V Y + +�d +@V� @V�0i +̦@V +�d +@V� @V�0idsd� +@V � +�d +@V��d�d�Y +�Y@V�dI +@V� +@V � +�d +@V��d�d�Y + +�d +@V��d�d�Y + +�d +@V� @V�@V +�dd�d �Y � Y!+�dd�d �Y � Y!+�dd�d �Y � Y!+�dd�d �Y �&-NԬ(.. +�dG1+v-+@V� 0Biɒ%M̊ Y@Vz˗7;w +�doxVd�#`+Vܬɑ +�d{7֬YxVgee �Ѓ5j֬Y999̊p2D�Y +=P .ϯϊ۷o۶m!(bتUd �YF!H;vعs%K>yyyYu֬YaÆLY@VzaÆ _׮]ruի9)o^YY)+@V� 0B)11q׮]{ PVVe˖ܜyyy)w"(�F*Nh͛7o۶-d�# PYY "LBPoܸ1$F8cϞ=d7:X,涄"CΝ; 6mT\\\ZZCV�8YaXҔw޺b7tSFFFX Y.SGV�8JUCbi˶xӳ"zT~?ʊ ݲd�@bҥ;v YѡCI& ��Mϊᄏ>+n 6 ��MϊzSNY0@V��hzV񊊊6m*(( ��_4+lذaÖ-[m&+@V�� ��d��Y� +d �5jԠA bذaG7nܻ{}&L<y̙!+@V��̳ +��d ��Y�@VM!+d� +eee7n\~}aaa, +��|AN:vxWw!|}饗d �gE<{n((( +��wԩSV��BYQUUUYY9x=zؼysqqqTV��ܬ"|͋/TV��BYF!1ݻw ��ˊ]vUWWъyyy֭۰a͛KJJ***Bq֐ +��ѻ'(..A']6*-[ر#{d�@#sP %%%yyyV\~͛7l �C1bĊ+RRRM6}Yf͟?…/^dҥKåW!+@V��lO>d޽}>4СC 6|𤤤QF=wޙ={dEJ{饗^|^x!| } eƍ8qbrr:SoҤIǏʱcǾr[nsM-c„ a1f̘0S0?I3iV\ٔ͢dW>rٜJV +Ɋ^zedd [n <MVf̘1k֬s,p8d_uOk˵w~YX~v;x? 6حNXÙd;c>8"pOᮄ-(¼"030߈s۶ma*s]MuvY5Z !/<LjjjyyyUUݻ;`:uG}V¥OKK[Xgb<~q ̗?=ϴ 7lvksg׮70y].\&{i꺾׽nG8滼45ﴼs_Kejo)+TEaa1eʔPa&${쩮 ~o:S3LxBGVQϊg}6 eeea_bŤIf͚5w0?㌌e˖W-Va\3l2gӫs2g[,JJ+h &-:l![]oVQE}fU4`v9ECn6ޥne9[n2p[߾a3g ?Z081L#7͛ĉCYD۹ V^ۄ]qqqrrr~dV(** ܲeK2 q{ff5krrr֮]L w.%/~T80uԢsbf^{+s__<$-6x~XYgĞM0Lrs3_{)%oN,{wynFϬ%u˳puC2gq'rB fa^fafafiiiыE啕Uuv%FsΤ_ Y/'&&Nڽ.)·裏/+gE֭?;v3�?p0??Æ 6m LK.mۤxz,z!3bOLijYE.zaNѳ)Egz͈JiR)ŏMqJؓƞ(Xtw g QYf=;ccS JJvBߍ ?QܹByƍ#4|#E{,X`+Vغukx:!:vکSs"|I_ڵkWn 3gBSbUV͞={zV 2d…&b0C򧤤,Y$0N`x۶m۷o?@ Fq8"#n+3ϚImdP><t__[qp?΀g[?/G?ֻݷ{<8Mb~kL+׾~ss% 300Cb]6 d֬Y˖-͍xh 6ݻg9 [/ر~'|2l]䄕+WiORRqvv:YYY .4EKJJ C8zEP4=wܯ\NƒK^GCGl|D+l3oŽc k åm^+ph~ _xɫ3Fnpwѫ/J,|񊤂$6+SSS΅'NyE]9Faf, $<X-_<'''T@43n dȖ֯_/n_2333///\gXYhш#d-?? EȊJFΝ;#@%{& g+~=1O/om;&m<]'5ԒN*:%|K~f5K:*x8l|;7[.ǔ\ֶvۺN(c|˻[}tA cZ΅(zu]9F۷YG{Yfo^bŊ{gteC!+6cO?U6̐-a>rHYG=+ץKnܸ10,X⢰8j(%jj9o@3zwOg0w*MGfԲ?.{hV}e^v]Oun|,,/3vc˭ʻN.+{F#)?7{O ?;ZhRQ]]}}oGߛYYYyyyaZ&'HNN[lE׮]SSS7qk$\FFƨQdHJJZbE4$ +2֬Yַo^VVVUUF}xO& 0ƇẋGg? kQ*Wʻ, /??%cf<\nK;3?έ|"XΎ?4O/^5➩Em^<xĸ˝ -ξ#4|#L#LӣWbѻ;:!߳^ԯGB8lݺ3;8u._\VȊ0233@ 00rrr-[qưMyyݻkjjO -WiiiNdqN{/?򑅕Wrf|HV<qux>q<̩^ +8LFc+[\kIe+//?kye On+030saZcǎ}8\N0ω^gjժѣG 8Yodgg#:G"[XrϞ= �Zp4i&:,^+dKZ]IERnŐ+xvY%GH_<(SK-軪X׮<v_G}|Slݺ5DVhي0s+Wnذ!E}F(}G&0y7e7n\a֏0CчAr>QY_/ ([ ?Cʇy5Y7%f΃z}=o5G5NʾK:vvpv!ٿ}ߌ8D+7'fߖu% |t?;Z*7VEg&CPdeei8"M;wnܸwߕpԳbΜ9 X^@V/V�Z0/^<a„!C j 6p^\0LcŊl̦ٴiSfEWp£ph<+��h؜< 8��MS���G>+t��g���G>+|��pBJ ��@V������������d�� +���Y�������d�� +���d�� +���Y�� ���Y�� ��@V�����@V���������������d�� +���d�� +���Y�� ���Y�� ��@V�����@V���������������d�� +���Y!+���Y�� ��@V���BV���}V���Y��I������8Hu endstream endobj 430 0 obj << /Type /XObject /Subtype /Image /Width 1053 /Height 678 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 2604 /Filter /FlateDecode >> stream xJ�QD$9̦s ""*ú򊼇N:| U^x;^~Ww: �uQU]/�\uc k }0%�DǃF�'i#�Q3c <6 ?5>7'�Do�DSosF�\״h݌h}@0k . sF�F�O F�%#�(}#�Qj &h6P7hԲhyPqh�p8V@�q�@�q�@�q�@�q�@�q�@�q��q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q��q�@�q�@�q�@�@�q�@�q�@�q�A�q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@@�q�@�q�@�q�@�q�@�q�@�q��q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q��q�@�q�@�q�@�@�q�@�q�@�q�A�q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@@�q�@�q�@�q�@�q�@�q�@�q��q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q��q�@�q�@�q�@�@�q�@�q�@�q�A�q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@�q�@@�q�@�q�@�q�@�q�@�q�@�q��q�@�q�@�q�@�@�q�@�q�@�q�@�q�@�q�@�q��q�@�q�@�q�@�@�q�@�q�@�q�A�q�@�q�@�q�@�@�q�@�q�Qqh�qH-h.@8$kF�Zj W�DrpxlZ_:;;=9n6vw67Vr"JgFƲ|X_X\*�7ޟB~f:79ɤR[�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5 endstream endobj 437 0 obj << /Length 1111 /Filter /FlateDecode >> stream xڝVn6}WQ"Wz5[i5>hmKe7wn8"pD37.ۻm,7^EmB2Yܤ<sΥjKaxġM.P.3Tsx-aۻPL/wF%]е{LzU*ܐd&F^GghW1mˌ+WXG!u�AZژ\ei@_ '<X- EL�5pF"PBxmOͳtI8zht3ς/"A'Pm{B~@'Ń(&&{#5mAqJT*a--]G;elF#)XÐS[GdXuUC"10IN: DBv ՞uI$t&@IDtx̅ɻ.ۻꅽ nx & ]H�,pZ "+љi:58V*f9~'^, #<)"Ⱥݴ%Y+9tˉ&I"ũY4-]0%0c9|異ĎJ >:*ECVޛ3ϔ`;äWJVwȪfͼYU#E;�w(E S*9R'`xVJJiӜ!ĄR%J1Yg̔ͭqc2%}I~^qk&^"^;! طaLfx@֏\ya;@P"$^/<Nr<t,oX ʝւ+aDY]_XV_HߊubFS&`1рCy_FWCx*4G0B[qD81V+"06Co{8Ͻ[w/(ˆ?* F]QC(}AQA#.bsu]Fhn+js\^T+[q|8 endstream endobj 432 0 obj << /Type /XObject /Subtype /Image /Width 1049 /Height 675 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 439 0 R /Length 64735 /Filter /FlateDecode >> stream xxUۆO?aHWP&M4A(M5T!@@z@�  $'F:5C Cd$乯\3sʜswfv| >6mz||)�������PdW|tEnذ-۵k�������Pā'Oݹsg6�������$"$d[&�������IVVV)))+ mƦISݲ =%dʛz{m-x~=*75zЯ&jkݸ̈́OrRys������@QfH۹Sԟ36epo賩uK)l?wojطsȬu nݐVKn>'#k+: 8ٮԏM/)l��@=!!Eg)bC<}L,mBTX,z�ljh9sWˡ^Nߜ]2#G.3W>(%3|뿒ر.{neuz(l>a~>mjϹ̥16=\Z5ޣ6��٩eɰ_wЌ?7zfbIV~mWu۞Kƕ:'msK+v_$QLh&Fz-,6a͈HGٙɆ1c#M^Fk4}&a�ц?;r͞7 uw]^Lv`-MlR܄W55;nmuqs^(%wKu[̮mS!R6+n�]65(%K��l4;bD_hֹ5)6J ?vĈ:6ǺUIBM'=EmB籏=|oYѴ[;beV)~˂,pMBS5lX6yHmgoF3t5F�`�W֬{_O[i;@I zJ+%J@d7;0S3wî&|{?~Ļ=mF+%J@d7hdv⾙gkHl%J@��@-3k w(yiA)hmI1Q]{ssYޜ2JM*mLr@$JMݑ{Xؑ ifnEɴTF~ьKN5 ;=j;L]L}15h8G)o42\�(#`CNջQb K5TfneU?%y:Ƽ}˾Ὅu҆vFFzJ+%J7m|Ȥ3k>w;La|z]{nC��@-6S6J4꬛l~&% 0{#v΢VBݦM`ϚjNbMFl,ַ_6(XfxF394.'jk4׆N]i FZk1¹WZnh9JA56Q$:}۔u ߶ۧle v*(''4a3n ai4?;D&DjO++GkjQ+J^[5j^xDq9^۷oYl6j!6?y"6L-7mjC5c �c�ںj46ie{m6Fk?L[듃5>dg ~~a{[? MM^ºKn}aݧo;pב!u_yvwнv1��4u,pu]eիFgST8Τ0]̓uamN}͑n7#LG'ڹF$$/Cg^4>jd;\Ze:y$NjFk'Hׯ5fRb|]]D{9֣r:yzzG w73Y16$%k?4HI7͠?MYjK:n Я1+""f W1\e`o6n[BIJ9궈pe`0@'4w]|4V_9cR\Av11!S#b O\nQlZN6l$R^m#-y_x|?ɦsk8E>11+(a�ָ剏j[vFCgomVN~<i+ͳ>{MGjSkw=8Rov/QxOJ@d7g akzr̖3[Όw99zձߖ]9��b:Mk7!'>i+2u5~| IEt)9i99ia+<&:듵5|̴Դ6O{ׄu~>>(l*f[MN!)s\TdTlJtWBjjJlaMɴv:mY2;FF'ڝ-yדu Kݑ+a3Vj]eO̤ωpmB]t]3+}{j05kCto4IQө qٍ]@B.2QYH"=9ۓ#OVw/ ZF/&!4ꩻ"'ʷ=ODyI$+(5u'c�mu1`jvLb;,[8k!l.�ͷOpf]CuqbD߉{jSqnn<d|`ߕGF9Ġ ӣ.F^ <ikcV9.x_�@-AӚjۻwozFʟwuosEa[.wۻNA=z,]6a,IU]Ã:MogWdbyغO.>x}Sz|3bgҷnm8(NnSY~^]It8I,z隨DgIfؠXC`xx3%&$]{n? HF۟hHAv!)맑LoۦY'k! "h'SuHuFj(kNh� B 3ARô֓,ЮvnبݸI]X;wߒuPv󸕓,E{J&k/M^=?U{rne/{d ]sg&]{i^%s鏀OOZsxP|B�@-u-E&m(S PiMH%BC)Ĝ.t]r3qޕKY-5vٳ{w`]@, .Hn:74|8 {a޳gGb.Etb=;c UA0w@|#RTܨe#gEŅ+Uw4WChB% `M4MMdT~ n"-q|YGl[Gٌ[c=|׷F3!4"'[Z-x}?N}CEgGp}h敾="Xc xS/Tb}p!hyw6�@ �q۶ߴ c6 PKN՘_P2cB2u>8YG3S{y&N>撯(a֛-u/IgIJgQ[F2vC?J ��jTSgâ ^?惩^tЎwvUwKo/pzھ.c|b 6z7}2%K=-ruZ4ZwIBOKBh[6,_= 4m'!AuW+_v-2l>[aQӜ}%u^eg?t;l _6@W*..zz&IZ۷,'{Xz%^#7LиCy^[#.l+-z7>QQuo0O_wZ,:P\s7Pk:/wrյ}=GL~|叝ꑺWP^ ɂ]j4Vmh�  aSqdIDX6<BubeƄ)7R2C{:~)y4%ўv)u@asHi[9 =k:zG_C�[g&]G%`VҫfSXr`Y7>%#$l,m'/}ݔ/(4ݴ:19>jӜ˕/o覗SPQj,٢/aA]ҽ:'&thj/yݔ'/|a+_SQL]fO~ bRW;i:da\j.#5>r -x--Wx?~@ 6"giavծ٤.6u(?K[ OOZP PBlvUwN䭏 c w7l\b0��eFEE%{xdL9序ۮwq͜9^LaNkvcSvsēó 'j51<wN >d|pSWŌ;j�� GprNvfZlX HܑO9qُSq3(uJVVzj~)9:irMٔW&1;tSvȌFeؑ1 xNn{LZ S6FQ;vKIGudedSYdNLؾ#+M6YIXցԨ)Q-Ft62 K'' &)3+;'';5rM)$JFN Ͷ@ĄHʴ?5*%=-++3kGG7LKMklX�| '2223))~Ubk3&%K,).sRKhR))BV, ׶Qv YA+7��3 "Uԁ~Vьtt _{ϑ-5CH9ʹ2Ou&g XhBE54fׯOۭ P{Hʵ;e_[GF!�(;l5=effC TwJ A��o.<]V-[b,4϶ĔB/8jalC2C�(Sx)J��T )#) laQII)ɉQAe�'�������w�������`<Z������������������������������ uڵO�6668����÷~K/œwygEQ++:uVz{{<(i:<=ѱcGYDw{wm׮֭[xe˖?y*����PhҤIrrrz77bP TBX+VSd$+{o*#*a~޽M{zСEDD8::~uA%����PjTАHUBM,T !Ço׮9x{7yd/Rlll?.EM %0 A%|.]+WDP ����Jz̘1@ÇӧO^[oQ˔)SըQ^`˗/RJŊ?cǚ\ʈl=ݺu+Iݻ7-GDDPI Jh"˶OhԨњ5k!Cs(}5lʕ+T ֭[rmڴi:k,^/*6ނM RxIO81hРjժQ;888X8p瞛3g֖6l"R CO>SyFy=Lt����(N0tMzbbb+U`fZ:[ݻwٳgkݻBeJ;v{~iBB%3 ;v절799=ӧ ڶm >f͚=.Ǯ^]u_|7nJGGrʑ;4'NYRkggAb,MǎUytJŦJYITBT / ĨQ:w|ᔔ:v.egM$̜"5o|�R]Fh~b7n$kp����(.?DEE)+V؉ҥK߾}]xg.l<??W_4iO;]X0K]jR~ѣG;wB+N2jnb!(%faݻ)3` (^ڶm-DP˾7򢬩ƍc<x@ \Y%E|B ,<bGhBR M$JfrH TBaF'|rm?y���S͛-͛ *o> 7n^Ew;~*#GP. UB,ھ=C+H(7o^>}, sag@|}}^ziӆ_{5 /⫯'PJ(JƒNLjԩQF111Ek<xBkKH6/pR} ߷6wW^y"����2d N(``f>}ݔKtttY}9r*NA݄ x#F{n RSS6maٖ!߿Z-ZD ֠{ĉݻwgܹP07ٳ'9U R)Xڵo*Y/_w -l"dW NDd^V ����*+W] TtSSZ5`l"%iܸ1ń«TV|…_|A<=/(իW-2{H/??__ /PMknݺE񧍍 ߜ 8-wdB`JUBTjժ|.mӧWT -l"dW N=z����O]%SVReyyy׮]~͎i o&}SNtttFF7|K/+\B o;;;W7xVVm/,(7 {9ZPˣcҚ&M5+aRRET*z5554s̚5k9r*a&ZT /' Əߺuk4ɓ'cbbFIё^:~6B2B'V0vjf�����,w޵~+VHsr&r\\VS5ij ]?|ʕ~i:ubBM*+ΡﰧT+W\D-B@(_3T ~ EFejӇPU(oРsss*a&U R)$~ɛ;,ȔiZzA*35AJꄢڲeW\矧"ݿ����J?~CӧO|ܹsyyy P+{Y>!!bKzUdI_xi5B^P.\[[D Ɋr˿E������C㧟~B;�5�����PI%oߎ�K,1g�������������������[�������0����������������������Y`ҥ�������J(;G�:*�E>&(��������������LR3:OYxi]5O=(Q33J�E eF_Uh֊|{E e"t2Uڻ0j31(J`hQ_:�eJ%]F7CTRh%[,_lysJe|{lmmڄH륱iCkkk=X&.0Ի"ƂzZpsGeYcP<%S% Uɉ\ت_J�ӧO9sp�U4h _>y$-/5gBKei= أ+WfHk.ܹs,(Ջb٘ ilCQTRJ5=fee _}F5w\V%-YYF.zm6GGG^OeزgNGZfg9>HFmP`r +C5}՜ dOb JO,[}V_l5Ⱦ1�(*A&||� &Nj`yB0\4`^4`6e R,(ՋM² ڃ6fw]u*U^mڴYv/_55kرcΝSqsPYq5|aڵ&L]wv_L%||{xHKO[? 77oޙ/U d"4*j(/L"К>"W60xOFj9g%do+9i \}.N*TB8hh\#\�|4 7p0^FY_6/g콆K͜Pgcbbѣ 7͋[x/[Q,(Ջ&iXx1K>`Bol٨64޽;-GDD/+ؠAf͚G\UH ]#\]]׬Y#}\h z4W~ƭZ1wŋ}~uz$1i9s6.\EɘJ5I"4**->iiZpSd)AAYe+nA!rU~`B003p>BHdB��*QVVDVB}d) C$U",ڵqwV�@h k,/5gB 2xWo ~poVy)TBL+TBMA}yJ*UyYCڤzk֨ٱÿg%L<<UV\w1pqqPaɒ%d GZOBQM(c*<wZ 22zZ3k[oGѻU߾c $U QcJk)6V8UBȞ`^lh\Š.+P S1T٬MS a?TW͹PBPV_lMW=Bv@T ¡w%| ! C6uEϔy=Gۿ! ERPF;w^dy<_i5=4T &F}^̼h߿T DbLjPC%g q>?IQmb<<^ug%|%aÆM5?+Yy4QG'zWaM.{%HoHK'`fAJ5&TKt@iFKv,T^m,SzRB6XpP*=wTB#i9+P}.5sW_afVozK`B�L ѷ%46ŗ#G$$=|H+ ~U*ACvm)g9ʅQ$Yy|>?~—e@Xf''`A^PlN4uCo"͋w(2ҝ+є _Ũ^be5zɲCFV\tCU+nwYP߻>Q#D?UY/RC̙GxVBtY8;+a uT^ERlWzt>*9# #FZOXpPS.*j= ;Q*F{e*aBS00 3$:+4Upׯ]v]-4$CHbOQxV<b׮<&J#K͙PCޠGNj >/Zcf^lb> _nrl, U?(-(#x0My%<ȾJa~+W԰ACvσs&tQ#3`bE<;#MPٻ,*G DS ePY/~@Gr£f#WBt}8KQba4/伸2'=Z|PHOvQ~v U]4\दڱeM[}53J(L*TB8h\HgQ {al^|+#8rJg~Q^j>0Tҟ9q{ra3/6򉝽\RFV%UfĴ#>"�,g4Tl~(Yx#ڃ6d!4D) ;WD~ĸqcGJTYf:w<j!~$iΣHi~BJ`,HW{UByԨ<+!{qH%Ŏ Ḑ=XyKl^{] j Q1KlP i U < g%!G!9g%TV? @\% J03Wl„@R NNA%DdH%ބ+$K[zzfzqq#ܶe(^¼9*c|[$"j*.͋֘؅.�<1'-a1ٷfYc/ OlC~=DJ?n9Z^O ?+cΨaZ$Y<*;AػY vAMȞP]"`]9ÇWwvůkb_rl6"!e-{bO5L!D g`p+r0ΥlWv8*\}F Dg'lq4UpPecܧP%T|]uŸ~$(Sr~>Ӷ]h(/5gB UѿG>+ jlťy6//>"f6Z ҹH [%< -G|[5m(< u|o)3oa}AxĸoרF[Q5N&֑D2GeQs1wVBejTJ,_ѱK.z~7Z̘1m*ۻ a\.�BCb% VZ̙GhBRDg3(Dz6(E#O_pe1—XY0``ӣ߶Q�଄JǐJ>JRV Gd_J(~,- Ebp}UV\hBTy=*!D5 ?_F; IçBPJdJd-y/g%JTܠafM={їը<j>柕䲽KtVbdbŊ?~ڴicǎGeeeCJ.zW ǭl|5*ŏ^ 3U¨#"K**2M%"zX\ *U]<;vd=PPY}C1�(S*!zFb'5U) 6u-~Yf1T s5Ql緝nQ(Lq[<o-*,j* %< )UayG|BPtVB*!*E:{+1NՅi'L8yͮ|VBeQy1(Y ޥ^Gz<x@HӨ5`v?p7 [XeQtP/e6!T Dž,�[SDy_v]᮸GP<(D3H%˴A!<,l!yP%dJ!fgM%Ԍ^0&64 L#hoݺ޺&t �ʠJ*@z1P"El^& ڲy9*[L1<=e+'<ȨE^3"i~ZJ{% "^rzUl=U^ #R+!iq.- 53f؈f]zYz:o{%Q#ۻ,{VBwYk(~*%PvH% %6gs<~J{v-ԋ?˴A!U ѹ]ٳ *QB`}]fB:dfff*!ذҎث�p C/m׆hVy9r$((HYм|q�s?o>ޕ xQ'vWwZ`v@ ԶTmŽ6$*"!&H[E+շ#,y,\!b7tvN 8$UD_:;}S6[o0vopmyT^ ]柕PٻLS '*G:>nUY/CTV% ̟yp0TT()§k{3^RMcA!$,`fWS, Jc lfl|W ۵"^/kiJzgf B0F*T@%dUB:sVBMyzQK#-4!/û5ƤE MBP@X0(A]h%ڃ66\ M<|Zډ.ilXjN;IꝻiSNX؉ &tߕPqlg%L] (pAqW aCGQ իP 15jQ)TzQ'7ѧGgT*R9ui1qLLP f]&Tk0g"{TB4iTB(U Qѫ*;�eM%htF -sV󿡼Cy<*-,|aO)k)rO*+^yT 5($z*bEZ)a.*=ՆƞPhC:116z퉍9z _f ;z"0@Jߢv3~Dw[qEQy vweSQGaN5 B#B%{@Qxy@cyϳSQg%D*+vW"3p04XvP:ulBV%i(—< Il ԨklPf$[}533S s:\%C1�JL;+!ݛpWK?+a(/_6U_5IE^4*k. JCʊ64܄By1g#2tKA3t]>"0`?yD\vVR_b&*?]mPP]&|ƍ'ۻdeG[24:* <&ܛ*Y>Ew 4^6YA!!o6, d0V%2yy8J(_$2W sz*T CiDB%�TB|ƾs玬J{V yi ]9G0B1 @?F]FFMŋ"BU( U QE6&3܆M(ivkgC|DX1_]q֬[uG$']"8&,;¶V\w 5лD}I`]f1Fe^!w(<UB9;c;" ꨲa6c YJ(W *< U ʂ_$ kHכICV%SoC v �ʔJܼyͺyyyw 0퍲`r^=03"ܭJ*q+Rx/|Ueŋ"/ξ[>kz]1DA^> 74`N дůk =y=9"Wv)93va,:t[*ܻMYAQ#T.5Ue�X*G) NPY/ *AP ˨"ٙQiZGU?( 5fQ YOT?<FDwIӘs;[~B )ze@pPHC1�JΫ&փrVy"ǣ"rbg/?P^*A ,]Y$Vy(.bWl =Yp>yw Z䘐t)|<xۄkGֻL,G0J%ϲGSBM(=yLWB4 xZB=Ҙʻ1V%L8v S`3UBUBvLTBc(�*Uw `{Pl/9 1CQSqEpVy-0ل( C%_FcېwrTٶfvn>k;w2m<fV\Mb6AIyi˄�. ƴ*\/`}׋QyL'wT5%P"˦(PG!9*G4Kp"033P8\%҈^U1�(k*qIhS \ Lh8o< mCZ$f AK@m(=RlEGQ2ѫ Gsz6p࿔-:"ʣlTCzyDsC5,1ڲQG[ Q�I̹w\+L-kׅv �ʸJ�5ܿ_ `RYqo4S,\# i( I륵淡 :*t{݉GiYeW:j%0TOS} N%!P W-GIE3ⲟYWyJqKk¨A^Ġ(*Qr_:�eJ%J%j΄JtVڻ0j31(z QtgfD�*�������P �������T�������������������������������������?������)������0@Aa8q�����TL%֮] @]]A%0�����TQVC3?tT����e+V,Ydҥ˖-믿V^mÆ ))) *wr@%�T����TBpL=999;wܽ{wnnCΜ9g k.!66V&�*����|;wܺu"RÇ8ppرSN]x^UVTr3Ξ=B;�*����PXn){n߾}˗/>}'N # ` U7nPڭ!P11ݭw@%�T����U"??ݻw!t =͛7 UJ?|BߌyH{m4\02 ۽w=}ﵫ7O[u*�����ũw#ȑ#ͥǃ=zlڵkDrr۷E!VTTz=nnn@V%=TT3*it6T@%�����M%#333KBq!'*'ҥKN:y (A*uBΎ7rhʥrTz)o<~|^l??LIOۏ:xcG+[ӥ!! 9]'3<͒M_o ?wgϑHwJ@%�����RRRRSS?Np_|ѣ$CA%ݻwInp]J <ZX޳@=mQ+ğOd.=qmzȦslÇu/s}|);(1 yPW z{QP⨌f;*J�����nnn8r?oܸqܹ*Ͽc�zȪDG ܎s˷W%&.?f%|HҥGn o~NFf3y!&ʶ$;=vk^Z ,;J@%�����gRRҾ}:$nݺ}ѣGU".. @/QY^$TT4,4:㟹N[u({1KDU0%fkB:tP T����ڱcP%N>-R;wM*DllÇ^D7no=,cܻUogP%ڏ̺xc7nsjLwi62v1p*J�����hgSJܽ{ԩS *ѣ(A*A/SO΁*AC?{t 6ʹKwbP\}ϵ+*A KOV;p 9+J#R P �����wBURQQQ r(T%d:Ze]'|7y{be#~*!:T*���LFFS*۷T"22R9#i}jJ�����X C"8wT*�����͛7ըDzzz@@-[֭[jժzhJz@%�T�����*a~�P �����T@%�����ţ�@%������@%�����P ������P ������P ������P ������P ����jS]KK8�@%�J��@BMiJ��@%��TbYRr>*��*�T��M%JM]ʪ�T��� Fu�J������T���@%�@%�@%���*��*�T��{C%�J�����ި�P ����@u�J�����T�T���@%�@%�J��@ɈsMQ.ݼ ��*�T��JJPЮf[`P ��@%��Dn%|*�T���<*!۟*EJ����*��P �P ����J����*��P �P ����J&z J������0څ;i�T����*q~�@%���*0Z%o~t���*��P *Av;{�T���@%tH._udhw\ֺ([0l�@%���@% B?2 $? ���*���*^%g%-[g%XS@%�@%���@%ԫ=jJSG5H"P ����&yD:T���樄2YP �h"��Jl)Ӂ4T*�TM��P T"2YP �h"��JeT���P T*�T��P J�����D)Ry=G]EWP ���*��P #=|4f?zhO=ite)<]�@%���*a>p>|{flGO޿p;k}h!|q=}G1G+�@%��쨄P bf,͐YurF7[/ks)3DV+�@%���*!+,U~~L͐h[=ь{4M#Y~4t`]S#(~B$P ����INW^=s̱cǎ=J!Çw{iܹ gijp]S#(f:tXu~4HhP0P/P ���PUBx28{,<<Uh[HwGx-Q"AA~-<CQM@%�J��@W ?ʝ.^slJCQDO&Pc._, �P ��(k*!<1+f}ͪ{'fd"ؒWƣhD  �P ��(*!if#V9} *�ܽ{WM@%�J��@iU }6zWB<Q4TB^@&]P ���PTyE27 WnQJ�C޽"J����2Q<CQ 6;vQJ�C� @5NP ���PTBtJ"//֭[\z5++ G"lܸqPR &4XhQ>1��*��X%$]FvZZ^PJi݁R%P* o׮]SNPg /_"{b*�T��ʈJS QNI\t)55"*Ѳe-[lڴsٶm۪UQ 8QQQ֭k۶-9˕UBeGpj*�;1A1��*��eA%E«) .$%%YD%z GթS'sTB8ѣRJgΜQP  ,Ą'P ���PU_t˗/߿0_%\_,ZqqF7nOFx +++KTYfըQ[`!m2a// \ӪU5kY3vwygϞשyrrrvj׮mggۿUVmܸ5 ۷/m޼ysỞJ|mZ3EM||<Khܸq]��*��eG%7J|}}zjժpP&E =7oP;|rR�RԩӶm[r999lmm4hGA ~غukÇwZ裏ZlI[?bŊ}ݘ1cmV^S??x) YfT\&bErʕ+SxiJd+^*_zTB}!9=s'CK@%�J��@iU 컛rrr(h43f%6M%]GEELasVVkˠ\~駦MR@EyQ]veq8-WZ"gG z5(*;ŋiѣT رcI1 9EL/L^2tKXX *ѦMJ ^  SI)(j3k8%�@%��k׮uЁ<Ҁ�QzN%+~K)_~Jƍ'܄T6f͚T-ZJOZ(6T/?vN:y洠~T"))i޼yoJ|CTߐJf 'ORnJ����{)]쒧kāuFn"QKd-]v5ʕ+ӆQ<w\bbb,wnH% "9mMS J_~ŋfH%2E /tԮ^**�T��ʔJ{):b*ѴiPm5Ql]".\OlڵV}ڵ+*XB YJomԨ˥RJǏ|PsJXYY}l977$45kVj.\ ڛP%Tf  Ǐ?{,�T���M`*ѤIm۶ڐ}_$͂T?gQ=REz//_ԩSTΝ;gyyy<~###i'$+V`/͘17׮]mJ߹P%ܨx2˗wrrҮ(5ktj1cTXqݺuҽJeLAQC3*�T��ʲJܸqg/rpp0v% ;IU /P29`UVc[QTL@4⋯\\rÆ u{<eʔʕ+No:JܹP%ݭm۶*U=z4=_yٳg J_PB{E'UV+Tz52:F} 9vW }P ���PTB4]S,lY=*!ݧH%X2vV@QWMh?cQ ;'=T]Ɨ)P40|o=}WGJ\xQP ���PU"`J^oP [ 駟 Vf5(!C%�J���TB.\ٳ'G}dH%O^M/zUP 8fl=ߑJ@%�J���(*AqEGTZt/W \ Y@v+!$TEtT@%�(*lB%G7��"%@ PԙiJ��P <P ��I%p�**-T���P TVX,��J@%�T�T��J@%�T�T��(9* J�=TgB%6nw}Yi>:iw֭ݻ�R$%�%_%͛7]}뭷=5UB5TB�T���P T4NY_uhD;cǎDC}ݺucEZlT���P TgT%h�^rh?^MƍSF*}1Ly(iӠ��J@%�<+*A*Ws=gee믿WOW bŊ~۳gmnݮ]FC/M8F}޽OΚ5륗^իWoݺ5 yB֨QRn۶MX˗�Jf qm=*2d==E\8;;[VիWX%K?(.*��*a) 6lHk}� 22ھ}{zk:t(??vt„ OZLlCD B%kѢ ya��RSR .(.&P JJ4i҄PN4X*;wfOGzZZ5ZJ5M%Əf�QKYvQ#>H�g%eχJ@%�<-%BY2e K@|~w٣P2~iƒP T6667S%hȷnСCirrÇ��J@%�J6l=iN:&q+WRh׬Y��*̩SΞ=+ 6nH3z脅WS4&mHx֬YJ@%�(!*O?iM^h9//%*QF Sgggz]O h+hтvannn{?#2C%��P FPPMK/TJ;wi/ZjFػE^ME a%|*VذaCʪ9mHojo˓-~|P �JJlڴYcРANNNw4%''Ϙ1ɓ'JǗ_~{=s&Mb:,,7`waϟ?jժյkWvKkʕ+G3˜ɓ'K_J��՟ڵkxTuiiiM4)_]JJP SRR.]JY %d*mժUQ۷WPzguP �JJ'4iA-LӜ`lP ��TBJNN΋/>Jt҅-GFFRIJJP Naaa %d*1bN:Y ׯ__jբ;԰?c\\Tҡ΁ҨQ#vV"B%��P /_Xa(NNNn׮]ڵKT%K|ǯz Y7nL,{`*Al󀀀}{͛77&Ljذʕ+RR *YjԨAPR 0JH*t}7ޤ*ShÓ'OիWHdӦMT *ЮU\Y_osɨ t4 E /_駟Shg3U1ydvTgZ%Lf4yR[re#P ��TBİa(B葂%JP٨Q#GGGE) W%3|M (d4?~\дcǎ,ͨQh<׫WJJ̞=~nooORD7o<9 V?uRʪm |||U^%lllJH*q}߬Y\6;v~K!ۥ/6m+c\Y_~7#F*ASsʋK/_4::UP;[D%*!5:g�ϊJsںk}+sP ��TBE˗S0ޢ_~e3JUZuĉ,+/ dnݢڵkSޭ[7Z޳g :˗/Q+++Q/űaaaH5jԠNZ iJJPR=z 0P.[m۶I 4h\Ce[Vhsf1t|w¼Iw1R*ׯ_ll,TgN%�T�DQuMMT?rE;::%ѵkWv2BJ*Q\M!YZ(z…?loPL8|pQ]͛Nm MɗOiZh*a6m U *a~g7UsoCϯr͛77tP%\ UޡJbMJ2(K-{&{J���P �OW%W>tP0x׮]( C8Zn͖)t<yҥKGiii-[ܲel/pVyРA׷QP )2fܹ~Vlƪ{ݻ/_TKY%\㫼C*T l)nrJ~=T�J��x*At֭m۶a[*T`kk_zdɒƍ!!!sƍT[JR _*S /p?^ZTB6_/Tc̙^zP%\D㫼C2[NLLTP<j^B;[D%GIo J���P �Ŭ;vrVVE<TGPDJ@fZZ{);;R -zbŊ|l*A!\坜(1c$iT.S7|ӓbk׮-2J%de*ꫯ^p6tss;y$I&o^P%\A%̙S^=`~~~~JSN}W0fD޽#""f7T�J��(:}))<<x0 ;`  *TRoܸQXիwޝ=Ƞ@tU\2g=z4 i&pj7eڤjժ^2A%d󍌎!?m۶V*av)nٲ%󅪄B+UÇ?3:p| *A0jԨzUb ClԋJ���P �E}өS(|Q[Q@E]QٲJMKɡ@UF|Y8<IJc/ WaP]1-T�J��({%z(!@%�J��P T@%�J��P T@%�J��P T*@P ��T@%P �P ��T@%P ��*�TUڵks᚝;wfggcf \sbSK.)J!&C%�@%�T�9P~ Λ7oѢEi|srrܜR٥<yٳŠoܸy ,UiCڜTϷZdcnj:P �P ���*a2Qiy׮]W\)Npqq;99QHmQ )ViKReYRtzUVQ+7Et3˪J8% aij@*h撓i唻V&" 2"(!nȖ(*l!  $[.{xw{.?0|ѣ*[РOE``\P%UĽUrV-wTbΝbdff*ԏݾ}maVVo]%>!6<\ <8b@`R_5ꭷJJJJB T BmA%Ц˱cǴDiiiHHƍJKKC<޶m(?uꔔ+ަ[POB={v߾}6l ɓh\yUUU^^^hD]Orssƌ8$-[x/ǭ[K*!*`8Fr׎]#MY޽{7oެ06a WC8H0Q8W+,c77mTXX( 1?88:e|G%%%T B*AUުAEtD**| :ZBD@B5]ȑ#Nll,6⽯E5&aN?a 贲q70b?<Cڵ mH "#)!;h j'\@իWc<@;1/c>06R~q 4 k([!v;.ͱϕoaX$''@puu943f T B*AU^9Gׯ_/3ƀ,www#DPD>27n܈ti�ꨟ ۷oG}T@lΟ?/ NGBBB"##nv!ɛoU(.U\ʗ.] NbP:DgggKq*m( 6`E\]qlV%T K$o\e7|3O *AP%J44]'!r%B;W ʊ/# HH_P 1SRTI%%%H qLCsJH## ,..Q%M#MWFDMP#GѩJ_ @?°4Nذ@A%6mڔ8 X86s%]!/ '^Fw2eJ\\UJB*bbb:zGJD֒Vݻw֭bȑ#1|IXHhu*!Ɖl!2-U }Ď_Z8|qAmad[AߔC+GUB>D!V.*1zhhQɠJB T Bwix]ԑo4**J,$44ܹsx{!WWW͋U~ἡ% Q%(W?FY%T*]ۿ*9SOumVB_(N;j+G4rIIJ&E̘WM*JQ%J!T{O&?)[*uyRQr&#V["+&eǎ&a qqff&v6!!ASCnnnҝQFUUU#Gl۶MkePcǎ}g]ZPH?$88Xrm* ϕ/CYYt|+P;!V8{%xJG cPqJZJj(Ĕ)SUJBs*Q\\ၰaŨ(h߿_<:*W[^  MOa@E:MJJ:x 1+'Ua!!!)DYuDV|QɓgFGhh:hlܸQiB@J׸Unn.᧎X8T[l)~?ccc] -^  cwmz΅*AUP%J5TUU!25{kMꐯ܋'UNG)ըmousv犎FvUnY83n+M &\7V!T B *T(sUB`{ S%J!T UP%J!*AT !T !*AT !T B *AJ!T B *AJ!T B *qDiiiYY. ;*AUP%JsرcMMMU7;kl*AUP%J[@(>}zUUw!+}'T"66vӦMe T B *AP%J>}]vN}VܹsGu[@ T B*AUުDeeڵkW_++nݺjT muP=`�޽{GDDZXX 4hɒ%ã_~:u1bDffjNNNR54{QO>Yx={yQ|IIɌ3,--Q@JP%JP%!T |ڵC2GX;::?)))<<<&&F]%Ao߾ Ο?_PPP\\<iҤ^x!55ouځ !_ccc#V3f֬YJ`sAa>}lmmw܉h.\+ Lfdd6T !T !*kSݙ'N6mJhr_~Y#m'8i2_tY9_BE}< ;hgggoo6U*AU*AJh'| x[XXpncc3=z 2DE%޺1={V.`ܸq#GE%WshFDD[[['%%Q%T BT BUY*++---},#S!i;99E !!A%k#՟=ѬJ!77IkLbkkR8yyy&LwssJP%P%D?~С M-ZH'ujkkQ>i$y 6L1TWW8::Jv{cۋcǎ)(ĪUtJP%P% {AXDʕ+-,,ū'Ƀ:+VرcLL 7Ynn. CBBLLL***t̙3훖/8qBZfSO=I0`Jhc%%%e˖ >JP%P%:u244޽+"}C/_ |ԵA8;wa4C)̟?_1 O:ԴK.Vϟga_UBx `P%T BT BUBQ52~*l<˜J`+//Gyƀގ@M.h&&7MJP%P%i9T UUB T UJBJP%UJBJP%UJBJP%UJBJP%T !T !*Ҳ27\U!444((*AJP%U*A <*cccӱcۛ(W�-ҳgv3f UP%J!TEӧO;JnڴI<??? ADEEϟGXېT !T !*ӧO:&Vs5JB\\s B!Q%T BT BUB#k׮U_~uQ%ALLLzkaaaff6hР%KQQQoڷN}'/޳g3<#~o̘1!!! TRIIɌ3,--Q- *AJBJB |gFX;::?)))<<<&&F]%qrrj߾ œ&MzRSSVw@Gsvv666 HӧΝ;&+W~aa!,C__ T… _yȌ 5#T UUBڵk{)gtgffX.N8qڴi**MLL^~en';:tHbx[[[kjjtR~=<==EeHvvvpUMJP%P%}MO'Ʊ666@,2dJh#ʽoJ:;;csT� PVVBa_TalllmmDJP%JP%!T |Lq (WD+Tooo߻woOOO4H}X > &뻹Q%T BT BUBGƏ?tІ-Z^G~:(4iJy "(((@Irr2T 8A,䘚 PmCZjU.]3T !T !*Bvv={8333*qsXXԠ k3:+VرcLL 7Ynn. CBBLLL***tW 9}}�$:~~~T:t0gΜKYZZJ'Yiʐ𶤤lٲÇ T UUBN:vwZ˗/766633CFtW ϝ;װ sssCVϟJ%K}ի!z'D]]@"͛WTTw Tʐ- FJP%JP%!T eJKK*++Wkd*T\[˜J`+//GyWUU%mh&'NΌjv!aӫ T UUBxp LKK۶mJVl5T UUBxD 6lٲedJP%P%UUAJP%JP%!T BJP%J!T UP%J!T UP%J!TV%[UhhhPP2UP%J!T6Z;\pУGk[[YY١C_~Y\ޗ~:m4777JB T BJ%u_wd۷o*e؊Ayy9UP%J!T]%^z5`eMx{{S%UJBx UO>Yx|'xS}ݻwիJ;wsY[[^())1cenDaTTot'`VVV={Ęnj"펃Va+WWW>?}tT JP%ohT /FboJlUֺ/i[z-5+I/~ˏG67vp/=5\kQW/gX%-{>yvㅢUNYȟ{ؑê޽zR_=™%-_Cm6TJ\^?sd9% }7zcqvZcU?|lk ^1Unnn#Tb֬YƍCɡJP%*AJBػQ%{}1s@JK喾~w}޵~~_?7Ckiz~K1z ~kǷv ^ wz.aE,[<jRk=utsV嗺^=;9OKkU寡9EmX}7_qwv;ek/W_Ƽ!W'A/ԩS?P%P%8ET Boo%lX'^j.;m¿ϟk?&a])ɨ?_%^#=/_]JD3`hsI *:;;{z3_Kˍ:D ۵kgcc3=z 2Dݻ T JP%TaVB.]c!??;11QZZٳgS#55پ$ƍꫯK}||yyy&LP`{限"##Q|_7P $Irrr6lquvv}U*AT !*j,--%w o%jkk;w ***̙Jr~􅴯RmժU QXWW'8pX9ej^oddh"UMIj*AJU*AJZ%i훘$6aSSS311AΚ5Jo*++/]f͚G}bmHHHII jٲeÇG ~@@�ʕ+-\FT:M.]j7teG%¨ ?UUUB%YTT$o9RK7w[Q)'T B*AU*Q%{ꅠniiW_}wU)LKK)E%3bw^i! E%KPcǎW?>',ա̛7~`/_Piq5D3f`"Mo]IP%J!TU%n ݍn#999{ 9ª*eBO^rb$8 ]/P%8ET BU'<<3--m۶m6/<o{IiOJP%JP%!T bbbmll lʊƻR%T BT BU$T UU*AUP%UJBJP%UJBJP%UJBJP%T JP%U*AJBJp*yT yj'//Ty?I*AUP%J[; xpJB T BT JB T BT JB T BT U*ECJBT U*AU*AJU*AUP%JP%*AUP%JP%*AUP%JP%T gP%@ P%T UUBЅ^{]fff n#;`lT B *AP%ڬJڞ8qͽ'i&ݻoN T B*AUͪرc#GڵkpO{ܹF۽R%T BT !T[V $(?ŋٳgi ׯ{xxׯSN#F̔---,XkT~ʪ[n*HZXX 4hɒ%RFJJJf̘QJJP%P%T BWJ:uR>}ܹ(qrrBGvBZccb!> TtA OJJ 7776&M /4|F.\+ eddP%UJB*1p@ooQFo~޼yRԷBo̖.]*kDz$y?/"X(8qi4ߠv cZT UU*AU*ѹsgd3gTٳg۵k.7nȑ+M[،nGC ѸJ(4alllmmD T B*AU.t<'L2Vce777$|  [999E !!*˛0a>:J!T B *TQ*ڵ{ァɓ tnѢEm̛7oذaXjU.]ZsU*A *AJB*fΜٷoߴ4hGvN8!UY=z+W۰ڪ*O퇄TTTW6)))-[l}ȑ"i[JP%P%U]S dSv%44T^yذaGԩSϟ1Uˍ` }| :Tֈ!,cpQ8c h2U*E7P@oO *A P%n(+&/"qo]p j\TƄ~TU0???++رc)))XSw*AT !*q{Qᾁ*AD^^^FFF/,՝y<bIKKCSh*AT !*q?*AGMNN~zցzכ+=l_=jÇJP%_%22Rz\jsu:n\3L�NJOOP=\-<"Ko׽Œi:v옸3�UP%T Bnn zz|cD{z}?pk悰ovNoMoz>|Y9!;# *AJB|ElDz.1߬=T";=^U6UI55+;%%7}C T U򰨄MÊ|ix-ᣥ?׹Gז.O:W\}ÆQ%& uۙH>XnUh7ߪc5nj\4hJP%H%eee*6C{ٵοJ=ztۡ^>^ k*틟_^xW5. (طoUP%T BUtر}999ߵvM 8088=.UBM%6 76^ 8;5OּfϞ=T BJP%!T ӧWUUayǎEEEbݻo~7U"66vӦM;�nkk{ __{N__?77Mĭͤ^g63`E E/l)3//JIƕ5S6S%U*A P%9}tvN:uR;wQ�رc#GD%nR%nE%_ ^pC|ٺ#t̶,=WD_JP%D#k׮U_',^X/pǷ~+͞=I,c؃ B<SW7x[nGZd�КG~:u4bĈLq?~'lV%0`q/ggyGc_J1rKK \zUYW}J?w~ɟ'6A7VV̘1=WJ,ܘP&x̻YWv\gȨ*AJB|r5,য়~?;xE>^}UاzjŊژ1cf͚%b4!N7œ&MzRSS}P۾+c+ԗZF8p ڄ .(իbޙv=lsk !To~i*C:t U{=?>1 lnn# O>}ttt߿Rj#W^yȐ.fJvxu5~+Qa+})}T~+AU*AJh \__gϞ򘪢X~~?3)B1Z9txr援իW̖.]*ѯTK.,!oݺUJ@7E͛S߶zƾPYRFXڎf} N'N6m4<++/J#Ѷh]óD;;;{{{LݢJ v_.q~Y}KG\|c?_YreArxoJP%ObAJH)))+[ըϞ=+o 7nȑ[VkTΝ;3g *ҵBTBޗ Ğv9j4ѣǐ!C9D#fhF"""1IIIT;*Q֨1fS:2o_ I%RmJU*AJRYYiiiQ3!!AE8iՔ)Slmm[ NrTTBc_/FpssC}P`Zh];99ED6&LNwN%# ~=鿏/껩t̶W$JP%Ə?tV:4A,;vLJ<99|$J̛7oذaQZյk{NƾSUbɃ jh:7}9 I]%&122ZhZjvDtٵGe+b+U4fG]^x 'oJU*AJ4\Ʊ(+VĚ5kz) ,""bU… ʕ+;) NgΜٷoߴ4D}luĉ;²0 q[XXXHӕ&;wVUUIRW ĄͰ0FIII ~-[6|pQ>rHqᆶeDKU_Qe*UXy=P:iř_^^|dSB T UBh$11SNݻwGwVN%Ο?b_3ghVbɒ%;v\zř<$:t(t* WO: nPK,6lѣ1i۷8qhV5?t5n˗crT1e <^# g̘ҶLh#ꂽc%mHp:\ӧŠ\'ǯͪqɬysJP%o~WeiqV,UPi 555}JU<Nޗ\%D>^|Y^_<k.\Bꍠm*I%|<R1hEEC(~q˫ӯ˩̮~/*AT !*AT&MPS ut~u[*/N{&0lӱ g-}7.j񪞹*AT !R ;ww4\]\js3~7.4qs1c*Йie~+%V G_,GV35[ P%U*A <d*_^T*):^VT\п*sceojV/N T UB/M*`DZٖYAE˞Y5[ kTF T UpDRRÊ|)Ɵ\kKR+}CJ<tZ E-yn_U= JP%C%Hk:e3+Ip=ZwsѰw_\zSFgnWN P%T BUP%j*1̖2J<[48?<t+Y5xP%U*A P%U*qJX!̦IJq},U㩚*AJB( B~^AƟ;}4~*t^OFhJGz-s=\فvY_wSKF>Zؕ%Ǫ_JU*AypTV'8yFzhClşqq |qeEzMT BJP%!T BJܤ{mWO(w<TûY.<P,g'kVeT*AT !*ATTb[YWBOn<o)a{yEJkҫz߾}T BJP%!T BJF#kc|WBӡM ɻV}TQ:*AJB*AX#зqGo]Aov|^tթ5c_韘L T UB T įx?_F1_ɻ ʷ޺3R*AT !*AJP%S`|MowN՛WzN_mf/o+-;VQQA T UB T ૯MNN"To0MޢTe)o:pᲲ2C T UB T _u^^^FFF/ <6Octgԛ.A;ZJ\%ˏ;䄟XJP%!T ]ptto;ݵ2W^-(((++GРfUBTkJrMP3ggee!#%&&`ŋuJ:/_233T BC:tx嗕c-ZkYXX}$;;]v؝Pkm`_Çy YZp2_ToonwUTTTUU]|S%U:\UĖ-[oJ9se@<3999?*AE%.\_ŋH?UI%233NWWWB*AyU $=wS%,X`jj*nT !Pro  JP%!J;w>--瞳B~i{' TTbΜ9]v&W 4ѯ_N:1Bҍfvpp֭`__oll<|m,WWxi1`� Xo`�1|*ĬY),,T_tdT BGc޽rB>ҔDAA򰾾V`ǎhy۶m**F/7qqqcOJJ 777QP]TaE'scۧ~zذa[n;t V#v:;;cJIbŊ/*AUP%J*.z܎e'UVUuuu Mgyzz*ҨX5j?^UU%RҥKEzx… T`+$yQ>qiӦt.UW̌ .^>QǴ&M믫4C *n9a0_UJBU"55I9&FO.JzViSB###gϞBxxTyܸqrhlllF7!Ct9#g A/|14]+ҹsgiꜝΝ۸J[#FBttc=&(EP%U}gnB*m* N؝\,ILbkk>V999E@ۇjQG^?PcPW 777cc_ݻ'zE%8_RR2i$B *AP%Sܹߏ7077nE ` [U *]xꩧJ 8::Jv{)e##E)/㏣ eO*1ɓ BrrrC Ke 2?/!T B *q_ľ}LLL䅳fͲ@X6mZ߾}&L`jj*]JJ8Ňz̙h$-- 'Nh+WbaaaP*=$ڇ vyQ|ruh^?s}zk!c̘ht B9r~@@�&M|75{3%Kww#GhmP%J!T6ᆱRPtQ^YZ~*�oSt"B xT]ޝ>}Z� xGǎU֛ǀj'NDG_hg8cǎWFQGGUʃF䟶3f@P9m˄*AUP%JAt']k*A6ClSvͶiAޓ6KJJ4/=N0GeS֊ʾJ( QoP%J!TU%dv-hӮ<y9T B*AU*A]%EU*AUP%JP% }+AP%UU*AJP%U*A P%T UU*AUP%UJB*QWW$jhhhPPv`T !T B *q;CX:tX{ FbaaQYY)dggKOӝלJ#v2ƌCJP%U*A <*|׿577ǯXm29sJ:u*==}ƍ+***S%T BJP%!J,XԴBڶFFFwM%nT *A`"T UpB1lB[Ǐ{'<==UQQQoFnݬ |ŋ5n>S++={3&$$DVAWWWm*1gΜ]ڊ(W ѯ_N:1B v޽W^Wׯ9|ª۟զf͚?9_|K.XZZbz?uMB *AP%ھJ#*׮]ʈXb/ #[\"lKѱIII111UFcm6prrBvȄbc=uXտOx~D``AĢe+^7^O? ٹs%K:tn!T B *U"%%iR.] \54 x֭*u0*4r!MjkkMMM.]*mأG !'N8m4m*QF=UUUJ q 1@1>ctݰ^भ_m*;\^a{xE&MzuMB *AP%ھJ#ݻWA%JsE#ʛ ɫ5ȮY(,,*M|Ȑ! *FFFI%Ξ=pqFLV۷OssG}B J[#FBDTYǮ|U}\\\:wn!T B *Uѱ*3!!A@0C5rHUNNN7@ * N\,ILbkk+Rbb~G'UP뗔L|uEKe*3fllq7 UJBh*Ǝc!)H%  E%�b9''TDz응ѢE*W SO=eee%TNd`` w]{b---#З_i#ooUvF<yAtMB *AP% 644ϕ@_'O.:ZZ+WDkV%PCsAvvv* ڪ*4O]Ϝ9o߾iii 8qBԜ6mV%&&".N0 #Wj'[<jkB7]d ʭ_, 3�8zhC/irȑ#EFնLP%U |4A_Jӧ_xG}cǎ?<o^mllW?8]Ga:TƿT+**B ˗/Gfffh 47ߔT|ԩ0t*-U~~~^P-Wj/иB*h4)*1lذѣGwԩ}Aݜ1c i[&T B䎪!~?EhYYY٢Mjkk2BW;qtN ޭ�1 P%% 0iLҦG]BB%STHX%W !SHȟn!T r?xT6KxxgZZڶmlll5fO֦'O>}imT !T BD[&&&1lذe˖UVV1ݚJ aB%N8!W ///>ɚ*AUBJP%pn[_TP%JBT U*AJB *A*AJB P%T JB P%T;KϞ=*AJB P%ž={֮]!/D(ܶm[[;&b7n߾OZ yzz8qLR i/**ِ/JB P%D%n*/LJJ*qܹ'Ob,c6???77W,#:;;KSy{GUBa0~L5Ƽyf[C!T BU*qUbƍKR!R. Jn߾ݱc<޽U>xD]; ܹS,#boP%JBTJ%<4.GzEETHKKC9 DPѢ~RR RSS;E_9|B**++ȏ;8,wgggVt֧&K*!Z@ܲe5QnݺE,-- v P5m*Q\\#JqPrSNacP>FCMOOJP%JBTۢH)CbbbttC㌌ $xL///PT@ETF0CG6S ]4�4Ȯ@C~vssC*oo\) iӦ[Q={l~~|_P-#BdVTP5*cw^̞hMfi>$_+0*CE *A *AU*AhJ ';;;#,YQJRzwww?1$]2ryQ Qˢݻ߯ޯ, .tQ ‹ByB#RۛFx~JۻZ^]$\~=}cׯ;9d|uZ6lذk.x \uHIáό&uP@␝>}*A *AJP%nJ}WWrNt*8H~$$P)FFFb1`Q?((h{!y[fUJ4m!<R |Deqv/*5y?~+]TMIIASr6i? UByULJB P%E%$J"\IݻWҗ{]]">>%^\x<m.UB|3J4‚ s=1u|_Zϣ傂 CM,ϝ;HJB P%wT%ɽ*Mpvv_^%*q l+. wuu.vHHԈB*Gf~o#N*[PबҮiS&(+** W*cP@U!*A*!q')UBD͛7"]ZĆRRL\혲܄4ۅ|H阇Ba YA%n՟|1uH&}Ѩuoy:խ'tNjlH|gn?]r'g/;EzbվQ1_l\\RZ{4G%G^ĩT@>*AUBJ�Oc*P~y \t=z~q{%;EE@]G+6m[mcD>m*qqqWEJ\t/_bZ/kНSs?s\XZ (Z{_sz\|!1?\rvL?%V?kUk˺'r^ZiҫAt !T BU*qGUBwԟ�FJ -iU^zGa+++Ewk_L(W^?5-?Nk]|AW.UԲS%P%!T iNܞ]9nKKKsrrootS%P%JP%Q $Hq7#G׀*A *AJP%T{U*AUBJU*AUBJP%T !T BU*AJP%P%E߷`T àEEEذ ֱrNN9eUA oTukekqt7 UTT4- ߂JȐPz uG*AUۮ0U*`~o-U"???77W,;wɓ<==###1r,KJG~Tb֭¤]%4R 007¥JB JL~*AhJرjr}vrX uYYYIZ5`7O޼y3 kh5ꭷނQ%JBJP%ڸJ넄 6:uJqqqX8y򤧧;>A>,uqq9vzHIIzy={l``�/:E۲eˉ'ĶdjjQパcﲳUF.mp]틭R ZiiiHHvVof׮]8P ̌(:EEEmݺUء5듓m1]ϋ=@'*۷{xx;DY]Zݴiv%bs!C ]L51mLMKW}#rUBGP%JBJP%ڂJ 0RPDG,X`2PM嘘lxcQMjy۶mC$`�*dcDtgVCӕ,..֭C5̕G.v2Ҏ_Z#UCH!GGNJ Eπ�QrС{B%LQ:ݻw#uddd~~>]LT a$OT422?  XFBƑ߰HxWG9:4K G^3f F."=UJ39>_}տ`̙R̸'^zT ăˮ1;>>^km'8 Ѧ e@lo)H*ooja]LyX\\Ƒ5K5D@<SYƮ]9f͚*/QVJY`DZ; T,`+G9&A)ow܉=mehY2VR 4\ri*C曉T B*D.]zgbzʕ+5'˴iydT ăp7.]B/((E�cP v,KRSS=<<DSY 7_{r*\lk%Nhha r_SCꚙY^^C(VB U@FE5dWN<!:,l`hXCZuJh;"\%L"E *AR *K/Ѯ/\Pړ'O"Puڕ*AxUBZ i "y޺J�D///Ǒ5#LII)x"ϝ;<rqV$FI%+݋E*!abb"fo%6V4!:,+MnE%Gѣ>*AUP%tJ#\~ȠAЋ6 <*AxT K SVE%BBB9Vܹs'Z%%% *eIeL?TTT999YR `TTTT"//[耤 lJHc*@v֭['NjJȏȽR?lB *AWG~7o޼3fI&@DCCC}W<cpUUUXcҥKQ2eʔ5о}{TŇH+TዻT ĭko޼i e9vssCRiS)ۘۛ/\_E%Ν<uꔶ,.F/b~[0ƮAq'F0{ uW.6^ӁYmJs6l ҩ ]%M.-KblGٺukK6TӫP%UB<3x?ɓQQQb->Ç>O'xo/^,vo,YtV*o%|MH@JB%ތȴcA[$ɳgj; A<<<l{COnٲE\ Wݻwo߾:;;M 54:#}ӁM ߬,F0%g5k{ɑZnJ�L Jh*mBtiY<㸴T%e}ET BH%{9En2%kQ o_~e[sss'TW%ڷvvvT ĝP e'#eo UBxNfA˺9іo1QNϵ?EG:ʃT ѱe1S~D\#vJB T uX+ǝJ,_\T']QkJT ALOO/-- ВDU~*AUP%Z}G T DAC"BBB9yJZ%222OJP%U*AxO>mϞ=*AP!T pDJJ %ɓ'cVVr?uuu_688XW6 k G511A333U*D}]ƒj*A *Aؾ}5k~ߋ{4?~|ʕhH*1pݺu~l2cСC;wb`Gƍ;wGywQ2\\-?)OnT UQ%΅*A *Alh)g w_ǂtuAyy9>eɰT D[U_GJB T ]TB㣱TW%BCC;rXU*AU<**CLLL}T@%^{vM?FQ[;ؐ#T JP%H[PV`ر~wUPgee,:N}*i&Q%P%sE߷?*Qcc`n ?P%JODG'N422Bs5jJP%JB-wV%Dfn /Ф?*t}}}gg(zUn\]]5:fff OuJP%JB{𲻗GwDP O@ؿpssuXxҤI/BjjjAABSAR tt!T BC6Ʒ1P%n0dS333___Q8qiӦB N ?_o#6A *AJP%J/,,l׮&zPQ :rPF<h#6A *AJP%JTVVvaݺuHVNNN7HHHPQ :rPFHh 6A *AJP%J888WTTS##Eo%?I[y 6L,+T#JsJB P%wZ%JKK,X`hh(֮\",,*33SE%ꄄ@I]%RW_/^W*hQូyl忢o<JB *AJܡ]{TZ|rccc333xJhOC͟?_UNM/wzo~im>|*AUU*q{UB0�$+lE5ESPVZSbJjU!T U^J4uMmˮu*AUU*A JR%JBT _TM=*AUBJP%}m#P%!T UG*ѦJB P%T BJB P%T BJB P%T FANA_kT /UqzJ'['T &(B!T }oz}⼼ӧO㧨_p:WN~kAy97l#P%JBT ~+AZI}]WZU!T U_/4DJ0AJP%A_UTB\+W]kA`"T !BJP%ȃuqUIR )Hr뭽U P%@U*A H7n+~DԺzjLP*?BT y�ДįU~s%P%JP%!^u<չP%JBږJ\*A JU!*Q%*AJUDb|Ȼ5SJ$''tՃANNNVVV{;!T BH[T #Jq;w*W۸qczzzKW={xzz&XvtӡODDF1Ȍ y! muR]FJB2yΙѼd֩ɲNLm&hfl1k"if)r JxCTPDk\vP7Gl0||yOY^l {Z]]ZcJ 6A*kooԵ*QZZs*DDD\J\ߺ\%#t!T BH/SmQ A.YZVP @$Uݻw_J888@mW[WתD#0*+;w.*AUқTB$jS?6PZߪ*??? $&&yzz;vLnU&IrrrlقXQ*33 Zq&puuWHwJLB[aV_QDTU2 111Ȗ>>>Bs޽HՎɓ#6=%UBe*MHMMasQ*a2*!Xreee%U!YcN%Jl۶ YYY55Ɉ...a *$mpp0O,"4d`nӡJ Tb* #WTT mݺx]qqqvKTVA]p+"STTHeb/// g6␔tȑh9Fe*MgqT`X%:l[L%3|}}P%JBzJ6Ž#j+kn@~x7!!A)N2�EG:]lS(͗*!"o߾Pu! n޼E 0!VڎJeeDb%6<?-h]'DJ՛Pi[L%s̑*U!7S: TJRDvv!&aRqqqUJ*<wСJT ۷nr],++C<Hȟ +c|`wTTªsssZ V*UBeMT h~~~([A2*accC *Ae*c[F%"""6!EGpEEqUⱨir*b T H7o;)ĪSSSK~F|k šVv۱cF2(n'1K @OJJªUJ՛C#qbetG\%jJx饗 EP%!=N%Gn ;3K[nOauuuii\UeJᖖ{{=\]Utww8988th@ff&~vUZZ{EGYlfP%0� ?((;zvQQuF"UJUGİ8T\\,|HH [ua$Ƕ@Qn]?̜"T B nmJ :::bYP// d*-[p2II~~>V!_WTUU'>"1E]%o|Kmט"A2XVEcC߳grKMUƔJY -qrssyUy۵JU+))EBU-#'<:?IʩbuAqESllB *AY*An-6>)~ ,:uJyɍ$%6Hjq69E<S�*͉2s/ϟb+mq@T,5aJTI4&`�ބE!*+a(32 ȩQ3xgj H.x!T BU*qsULL)Xe0埬N/q>2h jN\+*+UiR} |9_,"_qR:J;@ *AJP%nJJ(g}JGr ~"SU!_=[[ɓ'… }]StJP%8 PZZ޹xI"R)P)aMzGP%JBs̱PꫯT =R1 H/0^B*a |N *ADGG+UT U6G7[D<ql*R�Ln*AUr/<{OŧJP%9r&*۫&_RxJP%!=k xw; _ cLV[|U/@J^x<; TPim#1>1#T B릤Dxڿ1ׯ%co`9*AP //;\WWrԩplj /wZ8U!0SSY %pVóJ߿|嗻wF괔ܺj{+++ݺlV'@iX˲#qT`|zT Bnۚ7| FވWUbgn=رcVk$R_,KKKsrr2o7,ɋLqM*q*|k?�U!ļ_AK~x꧃n[O%#۷Aݻw_Se2[la- 1ױ]]ryyya-VVVs΅1Q%JBC%zć*qELMKK@xswwwssKOO0Xv8ONN3�?.*b*=`LBBBLL 8Qdffz{{;99!6K3`9ǎCEGG#A3GDDʿ+UœB="1 {#Z""wZg*v޽ƏE QQQ yrq<HPY)&%&&b<==QyJ5RSSll{`ʕT BUD[_E@ںu+Rqp388FeQ5DkGGGkٶmr~QQp]$,d<LE᫗׎;|͛7ܥn;B5PPP`lW\\ܮ]"##QVrTp:llX8iT#GbKnn.CHYg ±IƙN S 0c ___M.T B_ӏmW.=T믿VY}Ky̦$//T~Z 8D`fg91[L<P S'2!Yۅ gfaAAAFD@ٰQeFGj"UBe8d(RI%ܕݪ9s]L *A!TJ۷nSPKy[e6uP^/|r<)s" **%;88 {K0s (XVVyF,##Cl,`wTT.CqH`չZE\%TBeB[%ܕ7@%lllbbbP%!*sT+ڼysff&BBcjjj`22rfJ"19hkZ\7sh!c|kk#Ύ;45YPaS/.)) nk?"TBeb***[%ܕݪ/z!T BJ`@FGpB0vpp]L̓|(Uf3_%ZZZSRRWWװ.Q 4ɜp.ڵ_݋HTgh$ K]TTAŖJP_);`3_Qyq 4u9T?,++3U!P%[%(S^cDVgggD,Q e65O~~_e6UBC//*edxd]4ED[U}k3Kբ-@ЀJ;3cS8TZe}-lٲE>UWWWRRkksvewMllP%!*qUBg{{m۶2"#"p"??Y+yP᯿ef&@; XxRW8xT 3nkpy,A>!:)//WT(_ T "PITԩS D$S*aήr?өP%!*qUPËm:L7s)---oлn]=My%[JB 6n͚53gΜ?{۷wd@ծ_3FP%IHHyFYY٣>jaaky~buƍJBJU^Ayyw܁ tT"''"CJBJB 1}td>}H TBբZ~!K &MDJBJB hΘ1cGP駟={6X;%K,Z?ڙ5kKRT !T !T Bz;B%yٚGe@KK ZLz'P??srrKQ%P%P%sϩ̶sNsÇo~#Yz1iΜ9oXZ@@z)UU!R(<=='Nvp˗c΋/ /DkkXxKתULJP%JP%JҫϜ;1_W\wƯRQ RTިń#P%پ}#&F[ 5_1CKKP)E*A!T Bn[37w\q5EJ U6 _Ǐh͛>Lz0~mYR 4sZZZ!T JP%ٳϾ}^~xW322 999cO8~~~o0殻œk֬3<SJ&䯿.#*AU*AT Bz:.!!!99J$&?|״+EP%*A !T !T BJBP%!*A *AUBT BP%!P%JP%U*A!T^ RrݵliiAAD4,^U!P%\]]# 1cl𪪪_|;뮻 0{Zƍ۱cu ҷo_ L2Š=3o޼}5jUhh(�U P%!vVɓ'+GL@6lj[^^fرcƌNlfgg{zz>"G,:tO>hfªU J?裣G6V&Mˋ`(^m۶JT BBQ*1rHDb'9#{JX{A#1p;CylaxҥtAڿ?Jt8W씙3g0�C{ʯm8wd!T BJ8pSPPpw;R%^{x`„ իWGӦM5jdHkkg}C={ƌbP(;hР˗K!�kAAl lBd)UT%�b',&Ujii9~xQsS-C:U ʕ++++P%!*TJqXnݢE>C9y ϟc7S7mڄ�^d͚5֘ZRR Awqq6l#ɇ 2$<<ܠX8Vw^񎎎wqGKK_;vvT%!&w�p(Mƪg͚Ϧ 1S%� m(jJB MT}y䑘JHPdh{/W[RA}+VSG)e`---噑3gΛ7`QXTbb@GhqwwG_,YD4u3(+ zꩧ?HV2ul|̙3'))*AUB7W%'N 6 k4Pt{{{bÇK@q9WrP qV&NR;nPU$=c$,M$6{A\xlFPi1clܸqԨQ 0~[Uȵ *AUB7W%3֮]R%P  i;;;'&& a822X%& h>}lٲ`͑8I 64(9<hJbnݪJJPMN JB čQ~1"%%EHbdKK9*Rdܸqvvvb`B% Xlzm̙#(.7tPYC�9l0Bu9eȐ!:Ne,Y2uT121S%pdS*AUB7F%5N>R%XfL$uP)VX1mڴÇ縊;ssskX`4Ō3&MU"??4qD^ 4iNNkCY 2{ uFUUU%''/]WAPTf#MllP%JBU⦫HIISP+|rXƝw޹~z[[[cqʽ` %K"OP"hƏ߷o#F 5m8qij>"wu*3 wXjݘmϞ=m%v3)dN2e2Q˫P%JBU[UL뛛0UΖWHHqW}xYYYӧO>|EBCC̩U^^<qZIIј:JB DOP"$$933sΝ'N0a׫joEU!P%z& ,DL:?V^DU!P%P%JBJBJB !T !T BJ JB U'҂x|6J0AUBn[]suuU,,,Hѣ3fh3z_^RUUemmݿ!CSL!m"ߚקOQFYYYWR%JBU↩ɓ#zJh4vmۆꅅeeeo߾ݻwwJ'OB;VZsTbҤIhx8]Tdd$ڰwu4l�U!P%zJ9I;v,F4@%At7K.<xNM7}t̙3 #Doeeջ:*<wd!T BJ8pSPPpw;R%^{x`„ իWGӦM5jdHkkg}C={ƌbPZUBTF9sύ1+B~hQ[ lTM''{ -͕}ݍ7Əx \hQ???@%�0^:t%|rTBrJ4U!P%zJ _)֭CO___D,TDkTC?>Rq0uӦM`E֬Y%%%...b҆ 䐐!C_J(رc'ME-[_~`?<5VTT`Ev2U6yA+ŖKI)rYGyd{[_3AU@ S{55kֳ>^\\zJ�-*,"=U!P%nJW\ƃT *H-#ދinn<x+ԑ#Gs@KKKyfd̙5*1zh4PyڵbB;5lBBB@洶"cC=*5mڴ ( eft?Hg'zJ̙D *A!THJ' 5Dzz="(Ç;VANS*!J`ĉ_j㑇JaV!U&L`5 9p@8uR+?0xԡCP% oʎ3Vg*acc#*AUB7W%�ڵk'U`1c8;;'&& a822X%0iƍ~U%Yccc#ٰaCUY[,kR PTTO>7J֭*;N*X[yxxtz!U!P%nJoĈ)))J(..F#[ZZQ "ƍ* 0`e̩sk6l$F߾}q}曲 "NKKT%֭C3bY=c@2Dө%KL:U 3UGJB čQ qӃ>(ؗ*LէO???Ī5k jz{{J|߿{キbŊiӦ >\Aܑ\__|RwkχaM8QW"''GxcfffB+l1?ᇱ:SOD```ee%Z?~̯fD;WUU%''/]W XݠAĭ1*45P�!T BJt�)))bXyawymmmB6*J*҂1HK,)//GT4'|R_<[U58qgB.l3<-&!}<x06_'TJ=&@@&M_=ka̘1gF$SMO2e2[ vMEP%!*ѭ*a&bKdggKk$X8{65bs$dKZ|L:h+ȩuHtC *A!T]EHHsffΝ;'N8aW!*AUBJ/X�1uԏ?JB U!T B!T BT BB *A *A!T !T BBJڵkl!T B!Jw*Gb|E]aѿ3fto/򍯏|]>}FeeeJJB ĵFɓ'+G@h4yl۶ _ ^{MDFFLI&Lpwwv7$�U!P%zJ91I;v,F4@%zA\xLӧ˯8fΜ9`�Z׷;wnrr2U!P%zJ8S)((yaaa<0aի?裌iӦ5YN2U>{衇F=cƌ@1 [jggI(p*adbbs=7b*Br#GÇ_t)B\c=fA,|O<񄇇ʆ*Rw}wƍǏ0vСC---1f*ax6TBrJ!T BJ@ǿR֭[hѢ?PAEB΄t2#`7S7mڄx�^d͚5ZRRl"&mذONN 2dHxx5رc'M˖-ׯ;xdd?j*9ۣ>M޻w/rr$uias***dGyd(%VJ{T:*RR fzgӋ;U �LmMml&c"S%JBUDPPP߾}u: #+UB FGG|{"za6 @HssWX!9Rhii)ό̜9s޼y櫄JqTrh4 Ppڵb|�Ő=32"3�#, OAAYꡇB4q[TTTZ.p<#  fn̙3'))*AUB7W%'N 6 k4Pt{{{$I$Çw}}}U ) g%JJJ0iĉ/櫄Jqe%Z-fKMM_WZ5a„esԩSp^y?O*`N[R Siz]ȷ~[e+l7F%lllp$P%JBU檄@(]v-b!J@,X0fggDsTTd3 GFFR&mܸϠ*RTn UFV$X+RկT Y.ToݺUe+ TUTT BB1*ԯ_#F(U)Qlii1G%T7N  <X6p˖-3^dٳǏƾ}nذAN|KVR%d5"NKKSĒ%KNjJ` 2Dөlr*uJ4]T BB1*!qze3R%Xf$FoooR_{XbڴiÇ2wd777+ԩJ7_%GXŋǎ prr;l:TT>~áCz)J4HcgUUUrrҥK![\lݤ666 @ *A!T %%%''G +X|9,;\~-¤|H%*҂1K,)//G$'|R_<J|0U|:uK/twq3]L}<x0q׮]rƂ`f[]J'wH)S x5k̘1gFt+ hj *wMEP%!*aJ%"""nf"N777a.)-`cdNV3 @"['h__"%J֧Krݱ]:U!P%`J @%oJt!!!Ι;w8q ̿^[1u֠ë3AA7W%ЕI%`T Br ŒPWTT([_`$bԩqmmm+Y^:T F%\B T !^*' &nG,ҩJ;vLlP%U*A!H%J" t˅ K@'2'NPQz!T B**T*j+++6&$%%'@%cӥJCzFQW ^JUBzJ?^t ct:䜼< C5rssM<``w\:)RRRB T !"hii{B%qJLL G DԄNn$TBS@WP%vޝQ\\XFJUBzJ�$WK%*++{2339s۷xzz899mٲс[8qx ǡ=~tt4t ttϨd~!_*%z䔔tzR%U*A!N%H5'qbԩSEEEyyyHA|Mjjjbbb\\\LLLTTTDDѣG !7r8qG@G@w@$ME@%|2:T XCrr2ɓ(.U^SSsYHS%U*A!=_%~'ksJJJ ;@K-l8qa]�]C+6⟫J7Jt&XNFFFvv6)--մS\\e644`T BJBH/R yxDEE\qz"33+---[8q8q <yBMXWI*7J�___tf{邂`oxH T !:88;&6qԩb!Ǐ?vRV!8qx ]�nag~9UJ P:$Bj> U*A!H%:<1!lFNyy9ɓ'5 UAA Bn!pHፃ\ ]�]7!5)9STz=l 9ӎX&(E T !h3:1a`ą v*+++**Ξ=[VVvDvNrK gǡ?�:<nURŢ)TNIHJ5  Cǒ*pG T !tJLs @7}2N\"$߄L شm)Q_Mp ",1.]BC"q [#m8q.Nn2ev֡T%ePzF#.*A UnyYghśk,~fg*X_i1c7Y?חϭ7u8q Nn4\&pf櫏J?~P LJP%!A}#~qbs߈ޱ^i?d$2"~zGy<ǹ8 qLDl8Nn΂A# TB\beeG 7eS%U*A!&ťݗ/_nhhBP<~tFtt  _=X%rss_~eċ/vE!T B*a`---" @3 ܢȃ<{qNafxb666ΝJB [C(ݣB!B Ga,xJݻZussJB [&BΏ6c^vkc}xq6 *A!MHN!�^ve1Ov}eP%JB-J 6Ġ;\SWJB j!3}P%!BP%!BP%!Bz,^^^p __8p $$СCGLJJ:~8UP%B! *A!B *A!B *A!B *A!r^ohh*++Ϟ=[UUP%!BU"$$_z֭[P%!BUB/]TĬY***P%!BUʕ+Zy!T B!NU*akkWWWc*UP%B!O?$TBk9sdee *A BT% ˫tJP%!B*qҥR CYYٙ3gΝ;_xJUB!DBxDuu5$ԩSO6q:^ϳ*A B1H0/ 5ɓ'KKKϞ=&xVP%B!۷'$$DDDDFFǧefffee;v,77Sr(UP%B!www;;7;88}|||}}ۗH T S*u-[8::_ ;99xzz>|8::H;ᄐOXXXhh(~ٳڢΨ9ϝH-Bصk;b<O;QPP`lB;v]_JJ_`… @lll|||BB<қA_OW˾_O_kƛ{_zs{ |꿯v[A/4c̀f~yՑo_`#ݳpvVpWҫA@@_F@@ATl4I_1زe U.QM6%''_|ʕ+zѣ111Դv!ZЗCCCz9,"kdSDٖ22IJ|{ĖGq:qSm>rf3Αg>s3ۋl=ZQYS[˲V`[C 齈Pt@G [Z~P i?`<'''!]Ї/{~~~XXX|||JJ yvv0kA/Fv#Wwےt-k?C F# ^<ڧkNZx[3Ir7Bwit;WR{ٵ5^R߸8lw+! bd $ TÇ&_84oy(h!]uTBՊϟ@/>};-ؖ* Z$Knkns˔mi^:4 \'m9ut7V;&\t(E6t'7FuYO`lw+!$ d $ qA5&5^Εv�%ĕ_reD_nFxDCCVJ KT"99̙3#ѩaiiiǏɓ'ϝ;w}OTUUKzkE}uL:6E>;:$j ڍqW',zuxGtuk"tvQ 1("rs9kc/|z>z"lw.!Jd $ Gzzzddd~~ `vځh,\Z:u\t ͛7 G3NWTTI KT+33im ǎCFDGOj555 A/Ư;,Y/p*~ ~O{(ϭn'ώ|':ه=v/.gt*ﷵS].þ8Qgv\1ʭQ}'u%. -<䯻E.\Bz#HHЊӧO##啖/8wƍ_̙3I]]3`u9(((@J%*㓝}sh4Tt4xxkŋ%mOvJJʿ[XqSxM^oU{VZzyO+ATa*L}ǼFyV/+mz֧j_դWg"l|§90ϔc}p;e&%!r2:2r>Rl Y8q_$+P Ξ={r^{ 7|}v!]ǏG*//S@%ѻ ! tg%yO}oV/8t?~qgC ~ŷ..<|q~\|5+/Nb?~]j<k_?_|#ۋ̽56k,<tqAn  p,b-vqA#] c@(jkk:=ğ4O?şA\9�*q?/**< UAٱcU.Q [ZZZYYއ!᧟z&!k'T-Y۰"^Al;4 I\ÚKV'6|߰,Ȇ/?tiK6y=a 6,:CwyG.al' Gw6-p8RXX%7"BEKKx=ŋ=ğ45MYYb ‰"::_7… MX,T BD%!a�fQ\\چftGm {moq_xto>hZABӿoѻ;f?ԯMׯLcꛑEwK+V4h"6-Mڴ6o3S>y`l;^+@@@@2A@WY㫸[\lR-ߔ a1JA.\P3 ,ĉT BJ%Л ѹJJJ*++1˗\O? `{Aw_Njp8woկj$Ԧ/ ^Ϸ/ .W~~\&[/ܴ$ԦUM뷜wwҚ>jZL9O"O)O<-n%"IN*S‘s5TEEET BD%vyI;z^t MMM?!7҂氰n_=IKPufe=m9_UmSA}~1, mosrO4:5vwYWQuzV\p[JHB@@(((8w$B< :v}⦌~!dT BD%gaeCυAѯ!&Z y!VUUEEEyZeԛrzksoN俾.^xw(y_Sg_lw^D 99G/c+=P@[m%%!n@Dh4D}|E1I/rT BD% a E 4`TF:BHoݹ<++СC^^^EQs_\@4/҈B F,633W! *A!BTB%jrlB!3B!rMB!`1!B!\;|v!B!:JB!BB!!B!*A!BJB!BlB!BUB!B B!P%!B!T B!BUB!BB!!B!*A!BJB!BB!B B!P%!B!T B!BUB!B B!!B!*A!BJB!BB!!B!P%!B!T B!BUB!B B!P%!B!*A!BJB!BB!!B!*A!B!T B!BUB!B B!P%!B!T B!B1ř3gB!k!B!|T B!BȵzD B!ӧG^ B!B9(=JB!B#JKKy!B!<JB!BLS\\ܡG`*A!Bw0B!Bشi󓒒L ~C endstream endobj 439 0 obj << /Type /XObject /Subtype /Image /Width 1049 /Height 675 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 1556 /Filter /FlateDecode >> stream x}�9Ӱ#I$RwHbȞs?ڵ]`y} �A�g�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5�ܛDc{㗑p2z9I.[f,MoKO~ݬW|6 \P,+Zl/#}o}u;qn5ZR. \��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>gd endstream endobj 433 0 obj << /Type /XObject /Subtype /Image /Width 702 /Height 603 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 440 0 R /Length 17866 /Filter /FlateDecode >> stream x@gqrɽK5ɥ7\]X&$KLh.DcGcE(MY4  ذ%eY%|?7GfyY͸bqqq999G���<x0>>~Fed=33s޽5��@CDDDFFN��*HT S<L��59&W&)))>>>""uڛl%& ժ=!!!66600pUP eTfwwxm|0yM?äg��w59$VAf[yƍy_us1y؈_v߬qdTj.zTTWZeaVP eTj<MMF7xVW>|돃cwP6U쀁sh=LMMmt`�4U ;z?/Yw9'ѝweTjtR+++//xMܞݭ{y{I~MRAU 77ՏgV:xpӯm۶2Iu޼×FޱF–B`TitMMG:oB}yGzo~")Grr[wnmjZ-m/βћͿ~G]?إ|/A}IUż:zN.;8]1GY/7MRAUիmIHHKHHR(TtwwV#hVm͇z},8g9e[3$ZhKI..+c8&fjHicƓnasWÎ9222u gj*cz')l{vZ?Է$g46'ؓpK]Zѿr>vό[ޕ;0z&y9}aȷ*w*l=nͳɆڦm}hQCy(I*HJwl)QATy(I*HJwd1qorh`P_N$}'yI*HhyAvlٝ*͔ӶԸجJP9"41شQۢkرؔd% qIZ띶{OD62MG¡Hބ>p嵙oOzJJjZ=%ݕ'gٓ6Hz>בoU! >z'h}FچMFZAoJNtwkkk///M5&&FJCV*HJweuGvczZOfY?f{&%}=:7KHyA3 XXVu>6۪/SָIzf#5h$[n6jMm,Yد\܌1Z[v4٠nCVFf\}]ֻUұ`40Qیdy}kR?-Y2Rc~=*G {?Ay,P:ٳY) {ʳ5X<I~e&ko=e0뗌, +]yۑK3T=$T<zG22mCЬ&kv\1LCc\mטVM"+S bby?96kTsQ.|/@}هWf뿫}}m[k[~Qq'mfimmdZIBP3FQ9Ȋ Vw$=lU9CWtgW:΋{17nk`YDimgȨr0E...Aa5h$ФQivj]7u6r2yKިze ZF[utme~Ҹ?52j1qUX]+#vʞv&?X~2َݨ|?vqX45aS#Mb*k \:eb.8V ׻GG/l3]uS W귓VZD3' _3H#%>{ld!v_HӬ\+d?eFM\\Vޡ\[4*VNy6rXovUB,7tyDoU! ?>^+vN۷v(~U۶s~6~Vԟy|PIjYerp>o]xSN6wԊ _�av g&)ޤ|&q GO7+ezZ+0.*O t[e5Vf낲v&j]e~j<b]VN&fLۭx}~HfUh'<.-=5>240gJk+v,VI޲-zfFE'Lki4@O^Ғ5 q{-gF IHRIR#7)STؔ�[Nܨ<À]Y)ĝI e-'y)/rwwKֿtTן2R4G@7O7{z,Pm¥4e_|bb\dhDǻvWU.?b ןb9RRŠM$^&G*)ai6UU>_~Q9w;{IP﷿M%38H;vvO%˔evo1Ϗuր�.%0餧WyئTj>f$䌱:<T_LBCͽ g9L:<~u^O(׈̝N[+ <1Ncs{ߠ 2Ma#AA>3e@ |ckB탕ʔWYoeVgƳ|tahgL@Z;{6J,~熔^?NAzTϖYʭ+mll<cvgFu)ڮX.)d̖Tʨi`r۱al9>ύ#ȈH:h#Ą9-h5ѧVSϭ QkGɆ1M4,kAZκPU&ڭqUEi|S_U_(Cg)ӵimonݦݰQhv,Qq?_ݝ%Frr[+tt- RAUˆYǣ}~Q@sz, M ?8~kݖ�ebvFmWuyvVS{ۓv]%W5lDҨke6쮮n3t8kw v̔K}RGYKZWc>[^{e:{J/n?N8./;S -/U|푯r/l>2Neio^>Q㮫x#\8?H* ({׮e]W*;'FY*9KK̶͒&;Y{]kAyu@GUrWʝoQ~jrBT#FiY(iY,۵VK;>zPVҾSXXXjj2]-)TIyLPXm} Q0+hnɥ)g,Ϭ=iky!'j1b<syeyU^_?;zS&^ވwSd☲MYwQ 6vu7V*SlfZѷk9lX8Bs wJ+s~ۉm-))n?~HBu#6i,,mOVX7-SVO,v p4Vʹtvuu`aqDzG urVrf--;HwZ9٪VT<Ǽ>\Bcha/r^1Bq`Vu㥔;{)gMYЮ|^E&*oK0Uʭ Aڠ`xSnjV~A<B$ZUϾ=qs cN,I<R~G6jMw5رgGb=;DŽxy%w[yb>1Cne2vS=ehluѻuwXėLǴ2j9cNy;>[6}fQ&71 r}?cҤs8RU?Xx*4v}qQ@L3zVi̺)O4Pmsx>Pv'mZWg(w$߹CF?ljPgw4jU֚nu#pi$Ϙ8ޭ= 3{hhhciY7+~W|Ϻڥd&TjwYx#+R(B5KnNnևqɘ{wsѦ]Cyv)!q)ʧwSc¼ ~P R꫼uEq~5h7~gNMVވwhJzzj|nWXAngptbD9vRuҒ57H 1ﰝ%}NHOM֍cgR:<SwH\ I;#%G,!:D-ҨY e\Qe FjRY!E7yáIv*'y_;>ȑI xj\h}VcZoU$9?t>-9ĻAw\viV(>=5!ėT n:Oymʒe{mس~cCOFu];vuYR(tw=<)~ޓWY7f+RX7nJэkxگf1]>>UnCθhlRګ#Q}UwCfu}>Ţf_J:_Aմf_vTm+222%%%CGVrdzBU\u<<<ϞC)T޽gp\6/ޕWE]0oa jT}o2w�72jrp��59���59���� 9����� 9����� 9���������������������Ǐ-^Mw|ƺMK-6j,-[)KS\o%͛l4f̘1|WWB^�8L6Iu"c/;s\�㿩~[%t҅ 9e @r�/S{%_8viWE--oNo+ދu6n\.]tQμhp7j{Nd q/j/%Tp)YRʖWb{bv80k,9ktp_/ZlN(w>М .F^-Qyʖz˽.8Nuj:Ν+--=qĜ9sH}gzEls>_8p! ݢJnac]wNf면^vݻkT lY!᧟~K 9�ENN{bJes#w}[4e!u*еװYKnv/u姀ҚiѢ{֯_o!;;{Ϟ=w:N***Zh5^�oɡM)g3m}^ zK[~=dGeQ doٚ0i$uC~᫯7nܝj,gHlUXXrJ@r�grhSӫlL=kvnK9s2m</_עt%ynCt~n}|'|[nZqy=T7vP˥uo?KxݤBۮ_d2Q-n,i޼ĉC+R⣏>zg>Pu޽{իpUu|ʔ)/B&MRRR6lРAzYnݺI#5SSGyDJ6lXi7t 00cǎ.}7'N_~= 9�39|o=N)W2S<5RYN>Vzӭ'e^nIoDY^nՖ R*Ac:y>X=u>hۢZf<_sKO -uK[=vJK6m:fY{o޼9$$$77GjN011=rHUu}iӦ%&$jժ~|MttA:۷۷ovvEK? ) VZGlrܹ\yyy7 l?r$![[[@r�gr֖c]݊x{ߩA[N?V/+Ko Y}Gy^;rs?m/A3޶R=Ke%֌L诽\?]tٷoŋ_~7PcǾ{2-[ȊFX[[GFF>R矏1Bݱ::ЦMKbC#EH�J$->36d9'nѼ rz@}8e<nePO ]AÏS_iҾ̀Yʾ+Nߍq\iILfͺu)syL͛7_W_U ?Sּ΄ ڵkoݺUرCҢEVe\ȑ#UթЁ:<Ccƌ;VFćÇ{xxlmmwp*Z”s#/G_40+v6}'ɊIA_K>pa'z}W;~9u?yYvgK(RY6r%}rjFKd:vuuիWK*Pe6mZL8}꺃$YIJJl߾B75J]~$T<3/EOaa  g.,e/a޽MUFbrvFKf% //Lʻ"+,P&ҿ7ȓa'+ﴜlw/6n{}硦7|zRz'ޠE7>Q'#\P'jyKMFRAjjݻ{Y^=m۶ӧOyI&IrP%9Rخ]4Y?|pnnHl>TZGq#@ƒ aѢECPCDpȑ9ktQ7ɔ-L2*}ܲ@]l4!Q~[ru-Oߊ LeveZ7ehV gxVxɇy>4=R*gh_J>:{s^xRԛ-;~1L37<6yz/4WJu/w;DG{YDي uv O?t=P&3fԼɓ;t蠶,ɡ>{xg}W*ț[ ^ywwTԗǎUoyP?8!g.&e[&{$ȷs~~~AAQڵkfÃΚ'^^]KnvCvnٴbu%OWUumō{ʤoU-/ơŧoϡC^Vr?RQ0;;[m: t*Qߵ$<Y㥋I!|eA. }:awn*~Xiߴ_k{Hkݖu(:h NG[ɒg]رЇy%&{U_ |i]:s7A{5^d[}rHHH)@'ڃ\jֽD}Z{FW;/*_iJ,ZVý/Y¥:Ioe?ħbKKK9ktQ-8_߀-l'!66Z,18իW\|9""B]�~IIIFxuZnūW7.z˽/䠭$6<xRΔ/$pϜ9s #EΎ#9Srxт@r�Ç'''y#爻 �0pO$\^�H�����H�����H$��H$��H;9������������ɡz` O/N:XY%غأQ~QXdD2. �7dn GND-M80$#EF!cɸdt2F�Ԋ{$'{~i>n5hcLˀedW%!M~n/ˀжY5밌N(#t�y!`іc$z4٤RC[gxό/ʥŽ⥾y]$|2+qWQFm� 96o8f. =2tۮ1V1Ϝp+˄3瓎\L)襴ӏ^L;,+R.[\L̿u\@5Emg*K(#�p;rO$GN:Zr7qYqʕWsw.C*KX뎄\+ 9T?kYS}#cx9�@r-;P.׆8F:q/\p̥N>{{;vQϽR۞sJ2KNܑHTI�WTTT\\'nkG-::9gρnq{Nis/ΕVGGǩSN0Vv)5ǧT l^%NY眳ιd(_}g=do%YJ`[3Jmw9#e2R/o�WM!!!9j"##ovmΘ1.sN֭u�Kr$N:}\'//cǎo|ЬY={[hW^yGjʻ[<kVj.ʹ ؠ.SymP6٦If(J9!☓7+c$9�_;94o|ܸq9ov…w*9H~~e\]]ٵkWFFmvv BS N8QXW):tk&A-:~xӦMt֗3qDu Us 埸X|vc,RZJ68ݡ׈}.}=pcM)Rg}ʙ5IgƝ6-rk^I$� 9=$ԥ/r̘1~a0K*8rѣG VgϞzh&&&ڈ"dj:#l+)伨S cN/=8̒3Wi ]OEqrFɡ>EMrNK 9�@Lݻ>sСCj}ꫧzJ.ugΜ٬Y3\*/Y|~⋏=TS -,,>gyO> _lذA]_ntqX_y֭[7~c7LMMyz5lnW:ڗaÆlrc!AAܼ\ <2/B9R֤IQFܙrʿRXi;2[(7\ߧxO ߒ~%}K SVXT]gW om83��u39tԩC :۷vڥ߿K.2 ߘ$...忈^?ޫW=zirj!:rxg <Ç֭[׮]\˸ "T@5C@o69!ɹ6SJ_kkkyKx`HCm۶\۹r#K~-wRA,[dT�_YJ$EM7Jr�:ҤUIaffYqrrR˷lrcrعsԩ˗/49%&N]_z/\M7*kEyrU߬0&%*d>\PyŋUsKr:tW_8p;O <5"cό :3:XYƄ\[,NIA{gv v�&ooo޽{Շw J? r->y49xPȆ ^zjQUrjUam謜|9rzR"?|nϟ裏Juscǎor"*mGu8V:)BYF- :~6_M;=9tJDİgFTǭG 9�@L OOOLO055U?Q~~7&lo0%%塇Rw\v-'ESL>9TڍjCUCaҖ%6=zT uQ׬YY-3̚5KЬYcǪ.222*m)o~ff̅1Lc/ΉWK|IYnŸ/]4h}A"Ĉ_:mh�`r(..nҤI^AodROf^7n8}teκqn׮;!Z``$޽{W?Mݻwdj[nO<Q}r2zh)19T3ڗ\Q?^nKp+2S$K˜8qBs=SoKj*/g„ j傂 vԩ T~U]}/KmaEɗ-RȲDԫ'ݏS‚4J�.$yʴiFK SLЏ>h˖-իoNR2i$.~Wn#M^~e]v}_xKK˧~ZM%_|Q~?Mv#..AmU b[n7f8%{% gΜ5gdff>}Zwoȯ~_]]KY~ޥ][2b֟YğYW&KkjR"K?zX��%9 VgϞ;wjkNNN}5_[\WӟvC U|)rpCkܾ%ϟtRٟoeW8}ZZC-Z<׾ZK!MRM*۫]݋ZK(#V�M%6{7l„ 6myzʜp%g?Cbn_;%ZϓZ/}J}ZsZ*Cb[ֱ@vՁn_12Vs7~4iҽ Nj}3 \7)9<]�Im%moڰ+ڈ+p%nѭJ5󿻕\]~]N(#r[Vx$`\s}߰AvqG/ڲvG/pt,<ϡ2.QF*�y!|/" Ƹ2BN_m틌B"#qdp��m#'"h><e_{l1ĥޚWQXdD2.�@r r=t7pKⱵ1r^EF$�䀻rO(ھ(d,d� 9����� 9�� 9�� 9����������H��H��xrh4$��jcrI'9D��Cb H��H��H��H�����H��@r��@r��@r��@r���$��@r���$��$��$��$��0hH�� 8��!s 9��@r 9��@r 9��@r 9����� 9����������������H��H��H��H��F!9��PLs���|ρ���Ɂ���Ɂ���Ɂ���H�����H$��H$��H$��H$��@r���$��@r 9��@r 9��@r 9��@r 9���CN��@mL2s��=��$��$��$�� 9����� 9�� 9�� 9�� 9��������Ɂ���Ɂ���Ɂ���Ɂ��� 99h4��19$=��`H��H��H��H�����H��@r��@r��@r��@r���$��@r���$��$��$��$��0hH�� 8��!s 9��@r 9��@r 9��@r 9����� 9����������������H��H��H��H��F!9��PLs���|ρ���Ɂ���Ɂ���Ɂ���H�����H$��H$��H$��H$��@r���$��@r 9��@r 9��@r 9��@r 9���CN��@mL2s��=��$��$��$�� 9����� 9�� 9�� 9�� 9��������Ɂ���Ɂ���Ɂ���Ɂ��� 99h4��19$=��`H��H��H��H�����H��@r��@r��@r��@r���$��@r���$��$��$��$��0hH�� 8��!s 9��@r 9��@r 9��@r 9����� 9����������������H��H��H��H��F!9��PLs���|ρ���Ɂ���Ɂ���Ɂ���H�����H$��H$��H$��H$��@r���$��@r 9��@r 9��@r 9��@r 9���CN��@mL2s��=��$��$��$�� 9����� 9�� 9�� 9�� 9��������Ɂ���Ɂ���Ɂ���Ɂ��� 99h4��19$=��`H��H��H��H�����H��@r��@r��@r��@r���$��@r���$��$��$��$��0hH�� 8��!s 9��@r 9��@r 9��@r 9����� 9����������������H��H��H��H��F!9��PLs���|ρ���Ɂ���Ɂ���Ɂ���H�����H$��H$��H$��H$��@r���$��@r 9��@r 9��@r 9��@r 9���CN��@mL2s��=��$��$��$�� 9����� 9�� 9�� 9�� 9��������Ɂ���Ɂ���Ɂ���Ɂ��� 99h4��19$=��`H��H��H��H�����H��@r��@r��@r��@r���$��@r���$��$��$��$��0hH�� 8��!s 9��@r 9��@r 9��@r 9����� 9����������������H��H��H��H��F!9��PLs���|ρ���Ɂ���Ɂ���Ɂ���H�����H$��H$��H$��H$��@r���$��@r 9��@r 9��@r 9��@r 9���CN��@mL2s��=��$��$��$�� 9����� 9�� 9�� 9�� 9��������Ɂ���Ɂ���Ɂ���Ɂ��� 99h4��19$=��`H��H��H��H�����H��@r��@r��@r��@r���$��@r���$��$��$��$��0hH�� 8��!s 9��@r 9��@r 9��@r 9����� 9����������������H��H��H��H��F!9��PLs���|ρ���Ɂ���Ɂ���Ɂ���H�����H$��H$��H$��H$��@r���$��@r 9��@r 9��@r��2�� 9��Xr8|0�ErrrH��.2}$~C^^^VVVnn#G ��)[&neAHw�ZB&noy����� 9����� 9����� 9�����������������������H�����H�����H���$��@r���$��@r���$�""",--Ǐ?hРXN^ :tɓW^-֝QLJ_ $�%%%QQQ&M={vhhhqqŋK.I"##&N(+s4ޡ 9�:qĖ-[СCր#sGnn1cuhߥCAr�"n3f8vovʕWW.H?*8//oԩyB8u|wP�JJJ]7!!ٳ.]:i5J'e .LNN666!ܑhņ_Ók��5wȑYfyxx8p :':k׮k }&&&Q;P֓?;wN.0̙#G4M6qD;;3gΔoھ}{RRRCٚR/uss355>| kxro;$�!y ZlYjjJKK}| L>]le9f+Ǐ۷oΝW͛s4=zSNoLsmҤI߯nmٲy;Dw2Mw_jժqƽ|rˡ 9�@ 'r{, WR~̙ב3?29ʔ!˯vW_N)))'kJ}9F7lذ^{-??_-_5kֵkWuk-暛ˊ<ѿꏒРAtCϧNɽw(H�PCf`(^=|{?ر1[ѡgϞ>|>[~}[;?)Sz{O0cF6]Ps\zcһ#at>66vɒ%2r4=ޗC 2DdYoڴ -:&ruu u{o[li.?޳[^r{^{Ɏjw|IYja֮.]HD;v܃CAr�k4KKKwZy6M;WO?7n<(W/8w܈}( V_>uTY'xB G"##6) ݼ3t쒓!W2r4+ij֭aaaRhcc#͚5?~| dI<|un-?O>i߾}Nv:wjj޼y]!Y_~x 9�@M۬{EEE)_+&&&+ٳG$ń u�wc\/6m?aY_hL(Eչ6+زe F2xBiXlKrQtvv.E2|u6*Z~rSRRڶmr{{{y("Y裏:us$BVN\\\hh]vCAr�N/5??_{iXj3fx';w\uS۶meky_jX>p@ؔzkݺu7>oydĉ!r) v[;Hfj*¬,)tss͙͛3Gy8X_[OT9]-$ }}}'رC=4~xy۔;~(H�PBf4dSo˛~[!7uE]WW^9r2;wnԨUP~Ay7˅ի'2>zR/rzjLp4n|( /_/]TrBNNKr077IJ>qS+/՞~iȩʔܤ$9㞞j$(yZ^Se˖Ν;e �о},,,-WA'VgP^)AAA.\B#o2?ʴ"՗Ϝ9w}ѣzKWO~PpѨԦMdCID2-;WV>7˫a8| >… CgFd?Rشi޽{KW5УGOjˁD޲eKWj"v-DCAr�9k֭2;ʛ6]N8B߯_?|嗍5z嗕/OU˗HY~ukyhpѨSO=U~ >r5]ގL ,PeCצM@ j6l((aI=_}UFFF)'xZnKpW(٫ ~H4hsCAr�+>>^]?/^L:믇VWpբ\䉤L2{Ξ=[P avvҥKi8|ejN8~\PKP�СC2e;\[[;v433y+W5y"WaҥKe2 wh=u|wP�N8pB/JM+om6""̙#52˖-GnϘuywP�?~<>>~ƍKNNBފwÜ&cҽWM0A-WOr]8u|wP�ঔ|vڑ#Gʛ-[_{FtA{{{tU:,ݖבQLJ�nAQQLaaa?ԩS ҿ tI:&ݓNJW÷u4ޡ 9�\odee tI:&ݓNJWo3hCAr�۟5 NBE:cѨÿ{���H�����H�����H��q���$��@r���$��@r���$��@r��� 9����� 9����� 9���������������������H�����H��0��������} g endstream endobj 440 0 obj << /Type /XObject /Subtype /Image /Width 702 /Height 603 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 2011 /Filter /FlateDecode >> stream xJn󎢓$B]Sc:ͽ9AEDTuu՝Tv#%><};S%sG3ӧ3߬@Lf^^QQۀ6 jd*m@T%Ҋ jeDVQU6 jfm@T ѴQ5[6 VbJl@T[mUctm@TDl@T ?Q KzsU>Q Kzwl@T;%n#H~6 ]^P/zA^ ^P/ԋzA^ zQ/ E^P/zA E^P/zAW E^P/zA ^P/zA^ zQ/ԋzA^P/zQ/ E^P/U/zQ/ E^P/zA E^P/zA^ ^P/ԋzA^ zQ/ԋzՋzA^ zQ/ԋzA^P/zQ/ E^P/zA ^P/zA^ ^^P/zA^ ^P/ԋzA^ zQ/ E^P/zA E^P/zAW E^P/zA ^P/zA^ zQ/ԋzA^P/zQ/ E^P/U/zQ/ E^P/zA E^P/zA^ ^P/ԋzA^ zQ/ԋzՋzA^ zQ/ԋzA^P/zQ/ E^P/zA ^P/zA^ ^^P/zA^ ^P/ԋzA^ zQ/ E^P/zA E^P/zAW E^P/zA ^P/zA^ zQ/ԋzA^P/zQ/ E^P/U/zQ/ E^P/zA E^P/zA^ ^P/ԋzA^ zQ/ԋzՋzA^ zQ/ԋzA^P/zQ/ E^P/zA ^P/zA^ ^^P/zA^ ^P/ԋzA^ zQ/ E^P/za#H~;6 ޡ j^֛ۀ jзQ{hoz<L_N'ۛ`o RyyR]$M۝nvIQW+b0fvieRج7޵tn`{V5›9������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������r#�允}#�zhoz<L7N&w7(j^7I;ݬSxo=nwi4z\.- O���������������������������������������������������������������������������������������������������������������������������������WR endstream endobj 444 0 obj << /Length 1349 /Filter /FlateDecode >> stream xڅVYD~ϯɑ=nmEJ "by$Ρ$v9ն3qFwWWu]GL̖6r 8Sl9u6l(I\8갬y]`6ia}F&+X7oGy_HO4e)gU-KZº9ꚺ%BV~Vy ߳8VEIiT8f1`[VHJh4ԸKCS9*8y,4isԵ&Jl8ӻi>x7~i ' W34U1 г= I{Hе)_A.UBLk-=AuµATC+7q6Aq` k-`3q8K:6Yl=afy $J$v*qY$Gg th;=q2!DtҞ N L,z+^/$AŊ ]MN>]?UxŊfh яt=(T̩^#Z+BR_c�':VRfX%pe �ٝ6h/(*=JK Hlb=a>Vuz^|SjڠQf?-oɵ6QܥIb m%(9Omj/ 6*OuM{Xo&p+cB:U`)Hs_x$a23^$Pc `ߋZed5n :5KҠı1L!)b0{1`@ظ񤥲_k&p!=g#ZYWmJc*ɋ:|Ylb&b>gXʽBb-r}w2Ҿ1] y:pVEUqIbH-oeX[4h<-)5Fh3M;9~t郤~�r T_<81h4f.5Ж;V]78)/Y\ɏr*XK {Y=򃍙8o{*;Ai!U*X.`k}ָ$rüvZ(#H[}nf!ib=10fbA焠[vvdT$I̼Tt% |yD󶯙n)>]ؠEߌa? 8:E7J~+H&EcI)VrYp$ݢA<Ʌ-9҄h85B;vd2$ \aT?ga endstream endobj 434 0 obj << /Type /XObject /Subtype /Image /Width 700 /Height 603 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 446 0 R /Length 17904 /Filter /FlateDecode >> stream x\qrޛ\[cc75EM$7ͨ؍ ^( HU`E삠blVZ6b}|g̞93;a!FF���;wnxxxjjI���=)))͓ ݻo"��%$$''Kf JJJ��(D 2 ��P, qqq1 rupX=tYv3ɴu;y)H*HV 677_hbѢER eT(fuwl'i?i1%Cw��d"Șge6Ǹ{6Æ KMk T+tuCBBlmmΝrJMlnd!/PIV̻hhD}Э SZш:wJpG 6~tDɄڬZ0cƌ# I̠*B@@&5joQh.W~;5H*HBWޱcǒ%K,,,\\\"T?xpJ"AIVԻ_ow>~C. Uf ZC*(W6Mo_7]6}ەec- l7ݗJzn;巹z3}[;D'm&زSKan{=^~٨^~9 /n{{ؼ[7z̦m1{;neTjzm۶y{{DF"##" ]ɮŰ6j[.]F{8>eV_;vDI-efbZ]f:G70QlKƀYZMn`l[Ͱ(n!=='3]=z@dc[G-/O9C~5~՗jޫTGݸ~^}"/PIV666 %$(^P /PIVdt?ahp?-Nm~=uAIzƖ qqIN(nT:i K>rȾ| 23Z-9z49&=g7S:5aCGlZ*1|]]xOA[;}>7퍩|n'**2vA9_5O9߃`ӱsHk_~z:5SzjMaWJ-t͛7(W={H>Вy\lT+tͺ}݈cdoO_f$sR㣿I`o>6S4o+7ˁmۼ8Jr]Q6l_ͰZf}hf;[&-o7Q[-ݹIg>4ڵ-mh9ϯ0^㫔jdÕ}l|w@ٮy0C"}[٣wmy5}ޡݹW=dgkY`s^z>Ckw^O;vA>r}~1{] wM̶f5f5G}&|OWqٌQ߾(9r`m?4ОА჊EݰɑH]m՟vPnNSԵT+tuKKKMW҂JR3Ȍ47w>>Rտ^a&I?pGL"eВ#ozﴤC\zA@o!!k/܍mw^5CgDYO#:˜<\ } ؈I z5^_)I|5d[Wnվn[hf=mƏs#f6JYZ02lYDCaK=CC'iƱQ4mOljmj65vcަ%g˼Z͓9zvҮ4o(9)4s02kYeݗZ[ Ӿ@MҢծ]hid ]`nk7WՓ[j:IoNtv=,5nO߷?`oLQ\Y`ao)72 _-7y;ŜQ:ۦKfOHiP^ݩ?UU=t@?;wWtQ+m ]Z QQQowʌ|%IJz ^:<WcNM;5i.O>={-r. lミcr|{O(e5:|n{G˭s`hܖF-  ۍyHbf۪lpOr|*AF%'ǫT{bR_ -=m'0<!1."mBe Vq͍zz'ņDD'OQK٨==KQEWF3:i\K٫MÕF\Q3XOO MA ;ٗ/|](]jmOu>Iqё]WhM-im﹥lh {`|grױǢ6-\+j--<)N96Zz{l#wK\G{x9SA>>EH�3ՋjYfquM޿֭[_(K1T+t ǻZ:&344s=;6c1SGs5r7>hЖqݞfTof:U62M<1q|voͼfY:Mռp%/Zkݦiolo˴NFiڎcxO7L^-5 Xl|_^m4׻gvm4ㄩ+,--;sWy+͖ϦִQ޾VkvS߳g럂{W[4Rc^KQUmr`!m^-哭<rױA';Yzni9Ca0[sO̓OW/kI=`zdu6[[oP/X2M=/,tu;;;d-TKaddTj!ݘ2vneS]^"S`\&S fR/@'`O|9cb o;JrnDSQ4 6kMNʼ2~ipy1E;mі/WS/nqҢ-uoۦi 5oDiE-Gy߉Z3JN (0_W)_F̼[{K R:ZӦykML;Nlާ٤h|Sp#W%Ѭ':y_RYfŽ63{O[>mKN\1L6e­r =iP!}f U`&'lSj&jMKO:pT+tu;…j~cP� z/+c^YseeE28֦TsGf1{԰Ill|'LN�[֮qp}N.s4CvUN.ww'c&Xhj(ɄyǍ4?ب]XA30Ab5?/7vRmGlv 7ld IZ5Ilb #ok_6iW|_eϠ#ƿUV}+V%5mv"iŢњo , n3uEֻ럂{~ 5OYga+GfբeRb<ܶjf>/2@+}^xo(ZTިٷ/kUh2)fb(_"(vml & [ceeee.Epss 5v܅+5$-x}|nj홫61bVVꮮNNN{IHH=g /PIVԻ>ծEXf{.,B <NnP?*nO]#7)ǖKm~#.HzM 2fov;oQf̺ɋVD3F0j>en;n[geSFjƛZozII@u k1xa*${r!_8[igCnWG)囦H+:~.u{<02bJ:$q)z=m_gŚ]+zXlml5Q=۵I1J{~ x.{~l| ]yF :SZywdL߾=dFfw={^utJi*T+juOOO`%3AAAR(B1w90i4S$㵁#f8wQ̻ M |?'".1jO?J^j΂'FkNmQDxqOWhf]t]=L"\`ohTvQr OVHQEi^Adx@Kݏ0OeۣN=~R'ₕ=â"4=%=꧔ZLnn4\zCֲ_!yrVڳ@W^q#c\sT`o7FfqLp/<qH{772=Fq 1GXl;XQq1{"3*1T|\QIfp*\Bc_xuoYLR[JbVT #]dMKfʢ]]szo+=Gt RX|qquwIw`68k_l*h9]ôus+rCBnYEv)g]hэv֬~fmp-IKnfWmWs+|M"aWv)&iɌ<˫P-gggoooݟ˓y)G�J~Ӓm>;\dNW'>P( ;eoo%$<غ�ocg�w'>P( ���G{���G2E��Cf���d��@f���d��@f���d��@f���d���2�� 3���2�� 3���2�� 3�(ٳ͛2eq3|fM-4ScTozJKZ4Լ٦6jum>9s 3�O00,Yɓ999鱗<xջm:{Lɸ|;ͨ &- 3�OZ,^r`#[G.zK_%ӡtgnƟv]O&�x233MLLRRRr(}&=uSb2S˧D3nFe܌<ySuF!i}\pr8u2;wn̙YYYpC;=thAnᗒ}4@=~j)GS 3�Yzz^*}+XcHcXx?]K)IHHMadauZgg|JrC9]߱7{IHQ+9j�xRSS,Xp…+W\.Yfcǎ.=z,Z֍ASrk6mx3KCn:Tz(gwfeٞ,[qdg+V={V/_|5Oտ(7si7d*GͿ2A)Um0d^Ңc [hu@vlc.Ot0jmGf�  'NpBQ߬kڴѣK.Ɋ))={Z믿޻wc.i>|k׮UT㏧NڤIexbNJJJ>}|?R-ߖ/22"bk{m*XRf_ MW|GA*'Ͷ(k_,+Vޤ:ST)f*U߬~I.F:k7qR<$UfO)q~IJx5� ՙY6~IiJkV 6IZ*ʢH7Hf�  VVViii'O<UiԸq_UP|gm۶ jӦMǎ~i֭#ÓtRR%] vڽ۶nMOO ʷ| ý/4+0Ϳޠieo˸^аK?<ӦǺ=Cc)kqZA7*KU^ow[xUŷjأצ"oԩt襯|_J9gݴ?",4ՠYҀ!Yoza^彆SH^x^q[N?0Bf�  ;vpĉ !_f*J>zKKKKy.3[lQ-,, fe]33S0`o7(ڠY7jV~3l~Nuڌ^Qw7?n^Nï+zǃ</|g3g_?:Q務?lvM3zGBV]>n�{a뷛}kKR2P<5S_K}.v[O}If�  ǏM O:I&#F/ٵk| R{nM6IfP[n=qDݺ~~~g 46Z|j5|; _XoP nԮUiiwtP{22Oٗ7o(SU~R֧]XT| @fsz啩-=CHrF?ǟ8 (ǬS A g9%aȑ(2**ĉࠔ/YrʼdI&LttTE <-n2٣ -yaOL/n,qi+J& nx}lQrΒdW/?-wמzm5V/λڍۋ_~{kmOs8T9u˝QE%,sf8x𠋋K@@@XXXP^y{{]|FFt=M6̠_"55jԣGoFr֗_~KBx^ye6mL<Yo۶mÆ e>22RvXo4Oo13oТ}%7JT UE~iLt0NNʖpy+uv\SieOP׌B(1hܨ[|+i FݞyTnjSBsF]nwѨp9j(dȖ[ogf땼d#Gʫ :uJ333?,LVZIall䄊+͛7BYQ>={ǯYV&aʔ)JKf*UW~̙| rXW4Ӫ$Je48_:}܋W[L7\_ uwubRʖ̠쀳=;u*Zme;Z^7k:/5bWzWcnțL<҄?0ΜۓBsz^62ƩIl% T|P^۷/>>ٳ_u0ǎ;~xQK{4--uaaL'KVDem8̯I.)dMµYl:Y-p!CjիsoB9h8uQ>ɐ- 2? w.|ٳG2ݟ,AhΜ9ǏׯK/]b;N' ]=Cm+ jt1#UW_-GS 2| 83Cddd:ܱcVZ)C3550y䨨C||W3[qMLꧼDj˚iEγ0-kq<[q2?z , }ݻwhY۷oZ]ަмTQQTϴŵ \ y믿Z*%%Eɠ)Sԗȿ!2sWrWw֤c#%Nj@f�S߿_~}Qq#H/NZ |p???>r\1 @f�JIrP~ M �����������������d�� 3���2�� 3���2�� 3TB30��P 2 7nT�AR 2J:$,D'N�'!8 DfuVÛ ,lOlm֬Y2/Ёl yO_h2v)SpC /PfJ*}G*㒓s|Rt6msx˗/\bŊGOBݕW^޽{rrrɷ�\kժ%3ݺuڵk۴isUS|pM|R{ҥ}cQFk(䓢!;;[ynݺV :Dᡟ+aVVw}7hРo_.@aaa[K5jm6S|pE|RdfO͛7oذ:|\ԩ\Tƍ~~~Fz7e{תU+KKKy9u^JF]piG>)˗/uMy)7Vޅf8 4;s挔 0$Կ;gϞETrJ!C\UNBOH>|mOftM:zhժUU*)> DftnOJpp崟mf&%ԮԑkO{8~\yYhȐ<PJΞذ'4Tjʖ8qdե\WV-:*Jf ]혞I>)/ճ$+烜EfP>'O{;O>P2˩(盿_Q'\䜔3gT+xBN|4L:uܼ#te"3# 46lٳg$##gƌ/RG8*VsJa&M$?K~׆hGC,.3.vx'E_~955dܸqŜfr'(g|.ZQ'`I(W¯ߞ?RR 1]Y/zBN|4)<==azO2OJTT oŋ%BȵZ)s>11ѐ k׮Jfعse5<xP)Af ]vx*'%_I6mV\Y~}(4|.;&%% 0$T2RW\YBO-[|GJ}e|BOHmI&_ԟe"3藼 ѽ477o߾<s.\}lH9ɻtlڴ\:$rèTTOJ9WިQ#CN3]p>'EH'J8zh9+xRIMJJ7n\͚5'A3|N:{,? w r׭[WQ.F}̐ 6l̠l֬;;_e˖7VJ-[&9sTP~&Μ9#҅ rM:7ސf͒KJ x@;w^z&&&TrՒsN:RA}BOHf6UVqdi [ϟ \v-==]ՕȊZ|R Vi&vCN3'a*33Sj*䠔ÓLd?'J>)tI(X t#Jx'D'N@> o޼A7'!]K 8 k��RT*��( 2 ��𷙁3�E9~k!�F~~~| +ZjիUּy+VV< .\O:wܠA:Eoڴ{YB t2�2C ˖-k׮ݭ[t;v쐙{vԩ3p@+}N<YfypU.3 ޵kז[6r%3(V\3Ϥsdp<1c <:ŬKff͚/׿sN.]vOO?SjJahh̤m۶RJ=?C k֬^zRR~eGJ3<<<8x9"|;Xu%3TVW^rx=ϝ;'/4h PNNN˪U)5KfK9r*3[lQ~2Zj]t<sY<\111r-#MXu333MMM%O4~F5kلd 6 1ݻWn @d|uݢ2C@@4#11#KNQ9._\pan cȺrKܕKWZLf/b<ʏ0rjժ5vآ2oͅݝ;wT߿E1d'ɓt5 Ee/ݾ}Zjbbb}Yo(AfK/mڴ)_frT\/:b9k&RrJݏÊST̙3:WPĤЪUիWgggK(}$3HXmذ{7nܐ ']@ ^>S8)yI;v1#"Wvڵnw]v?CQu*6mZӦM5j$gopp0y{{͚5+mVbEIr}rrvTz D xZ3PJU`�<x@YYY.}ʣ���  �� d�� 13'9 '+!Si _I!30T':g> 3۷͛wU2 2| ^ڞ38{EKn{.xEdꗘ;fxg&|ƍJ&M_ LdR:[Ծ&6tLfF-9s#tuRN[~޽{7oT3O$3.qLLdb2CԾ+cVf~?Z}^֕'lx왬?f}~irfSGN\rmυC L d<̠k?,V{37*CY/ڠV IfzNۻ7ڵwC/}1*3S9 1]f_d[y| AYyt|jF2_OH-_QV< o W ̀2]u&)wF,ʽIUG4Sdq 23*3S9 ;T <I-=|O3&j>Mg2| LdM_%wO`fq?elz3"3S9 Pb2LҮKd] 1#^rd&2jfпj 2ݾs`ueR~Df 2ÊS3rxQJL|d&2Vf]tfP؋WoK`2fR"b&2C!$.m|n󗼿0i+;7;e (+Au *G{Ed޾sO2Cagn84B/qf"3NXuRm Oz$}׮ܕuxr9 Ldʕ+WPA^VXZj gx̙A5g75mtw (d\I|3S9 O O(Nq  L93CGwl򨁉Df@ LLd2S) �]K&2C ��4 3���2�� 3���2��2CA*��@Y 2�� d�� d�� d�� d��@f���d��@f���d2��d2��d2��d2�� 3���2�� 3���2��2��2CI2J"3��P3 <g���9��2��2��2���������������������� ����� ��@f��@f��P̠R �� 8��@i{@f��@f��@f��@f���d��@f���d��@f 3��@f 3��@f 3��@f 3���2�� 3���2�� 3�� 3�� 3$3T*2��e13 s��Pڞ3�� 3�� 3�� 3���������� �� �� �� ����� ����� d�� d�� % *��@Y 2�� d�� d�� d�� d��@f���d��@f���d2��d2��d2��d2�� 3���2�� 3���2��2��2CI2J"3��P3 <g���9��2��2��2���������������������� ����� ��@f��@f��P̠R �� 8��@i{@f��@f��@f��@f���d��@f���d��@f 3��@f 3��@f 3��@f 3���2�� 3���2�� 3�� 3�� 3$3T*2��e13 s��Pڞ3�� 3�� 3�� 3���������� �� �� �� ����� ����� d�� d�� % *��@Y 2�� d�� d�� d�� d��@f���d��@f���d2��d2��d2��d2�� 3���2�� 3���2��2��2CI2J"3��P3 <g���9��2��2��2���������������������� ����� ��@f��@f��P̠R �� 8��@i{@f��@f��@f��@f���d��@f���d��@f 3��@f 3��@f 3��@f 3���2�� 3���2�� 3�� 3�� 3$3T*2��e13 s��Pڞ3�� 3�� 3�� 3���������� �� �� �� ����� ����� d�� d�� % *��@Y 2�� d�� d�� d�� d��@f���d��@f���d2��d2��d2��d2�� 3���2�� 3���2��2��2CI2J"3��P3 <g���9��2��2��2���������������������� ����� ��@f��@f��P̠R �� 8��@i{@f��@f��@f��@f���d��@f���d��@f 3��@f 3��@f 3��@f 3���2�� 3���2�� 3�� 3�� 3$3T*2��e13 s��Pڞ3�� 3�� 3�� 3���������� �� �� �� ����� ����� d�� d�� % *��@Y 2�� d�� d�� d�� d��@f���d��@f���d2��d2��d2��d2�� 3���2�� 3���2��2��2CI2J"3��P3 <g���9��2��2��2���������������������� ����� ��@f��@f��P̠R �� 8��@i{@f��@f��@f��@f���d��@f���d��@f 3��@f 3��@f 3��@f 3���2�� 3���2�� 3�� 3�� 3$3T*2��e13 s��Pڞ3�� 3�� 3�� 3���������� �� �� �� ����� ����� d�� d�� % *��@Y 2�� d�� d�� d�� d��@f���d��@f���d2��d2��d2��d2�� 3���2�� 3���2��2��2CI2J"3��P3 <g���9��2��2��2���������������������� �� ��(D�@Rj3��( �����tf8~8�EǜRSS ��-2| 83CzzzrrrZZɓ'3��@'C 2| 83>t>��PF-% �� 3���2�� 3���2�� 3���2�� 3���2����������������������� ����� ����� �����@f���d�xΟ?jժ1c 0_~飕Σ+W^۷߀~V^-(H2�SYYY!!!Ǐ>}ff727oޔ7Nf7? 3�?r…-[cݻ.iɨ6rHkkki|r+ �`8_2eӧoݺuΝwR֒vʝozzĉ 7? 3�zy՛7o]~].[MHY+'''+bLLCyJd{)} 2�ɓӦMsvvN=z9Z7'>iiik׮h׮Iu/׮]CΚ5Kv F>2\M4iܸqW\-ڹsgtt,-ӻ/;8cƌCΛ7oǎgϞ5#+ �`,]4...%%rnɓ'V% +t-ial>sÇW^[G% }Nرcݺue={vF6mzeiΝϙ3ߗ7*/tW.iʕGnذd�0nr;M!J+WGn\֓YZ5e*)m۶׿}k2IxڵRDz# 2F'NPϝ;פIݻ+K5k6Lf^{{}]i~/]dG叨+ �`Λ7/$$DҎ?.#EFF\rO9}ӧuӖV2yzyvGs:thժUk֬iemU|?0qsر9b麗g%چ:-;%<y4X- [xz/>s 4HdtԞ=2߸qcٵ=UTqpp(j;?x%Kliro߾RJ>&U %wM %ڵQw� !eV[]U7wȻ.?=z(wк֭[曳g 駟dX _>qD;܊+Jdȑ#/RppsZЎXB;^*IIIrw)DzC&GmݺU0 @ ---eI&cƌ] Іl4ᄇ.\gknV۶m;uꤔhbΜ9111ʓ !)O>G]hQÆ uW�oeeeJ.rՕ+re> FEE˟(d;v2/7}r5aI&Ɍ\+T~z_` %狓;v(C+ زeF>wgyfҥ2/AZ:*-ČBnllT۶mRncc#/,O?cǎ$<Rٝp}=Ү 3�!Ä\W=q\u"S+hSLTPY.gViFjk� ,߿`L ֭[W}u .(l޽{e$)ɠ`鐕+W&''K7mt֬Y/rPP[.&QRuqqj2+䥻:txƌ#o,U]Af��C dtaNy,,_J2+3r~뭷,ONի,U̧X.͸yʕe'ߗJRSn0V^-SAzKxoF|ɒ%RSSe^2HFZnnLT{WdG.Fwp޽[)$/t5%H\tR''򈺂��8|EBBBb~o_-ë*AW,W]aBneБ2cSNm>=bĈ=;;[yiEoʦeGdwsojƍKB2 */571{⋺u릧R3}ˑȸpq={9wIpR-o$͛7dlSe^# 2�BF[&XW}bNǍ>ӧg|tR^իk~S*?˖-S~G|ewQy̽QKK*UԬYN:*T;hvdp7o2/Ct]VmT%JLRo׮]ܽ{JXX-[&''+*W,%k:!--/(Rv_v� !cVDD\咮 7nʣ{k߾3Ǐ+|QnN y#و4U ًN>]a iCm7o޼ݗ^V,3gȖ*L(XY��kc6o,\fM.;t`jjjx;w;4R+tqɒ% #%o.<xt?ܮ 3�.\8|)L%Kr 2\߉'f͚%KJeƣ+?Į 3�Μ91wѣGH!{B&ͻ{nBBرcx((��ʒ"..nڵÇ-[9b-c#MJIIFJSli|9r+ �O?^}ĉ ۷/4I&͓FJS%_r+ �ι^^^4F$ I#%_r+ �PBڔP#+KsoD]Af���d��@f���d��@f���d��@f���d���2�� 3���2�� 3���2�� 3���2����������������������� ����� ����� ��\e�����^ endstream endobj 446 0 obj << /Type /XObject /Subtype /Image /Width 700 /Height 603 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 1994 /Filter /FlateDecode >> stream xNYardT^FԆ4ڴ5!�I{P{&l\u\|={?poHrr6aϟ=}/ ?%v 41jb0AM^fL@PYԬ *gʛM@P& eTU4AJ& bM@P jU3AM@P T2AM@P[&@0RԶ .[] .h~;].hvAh ].hvA] ].hvA] v.hvA].v.h E].vAh E].hvAh ].hvA] ].hvA] v.hvA].v.h E].vAh E].hvAh ].hvAhh E].vAh E].hvAh ].hvA] ].hvA] v.hvA].v.h E].vAh E].hvAh ].hvA] ].hvA] v.hvA].v.h E].vAh E].5v.hvA].v.h E].vAh E].hvAh ].hvA] ].hvA] v.hvA].v.h E].vAh E].hvAh ].hvA] ].hvA] v.hvA].v.hvMvA] ].hvA] v.hvA].v.h E].vAh E].hvAh ].hvA] ].hvA] v.hvA].v.h E].vAh E].hvAh ].hvA] ].hvA] ]].hvAh ].hvA] ].hvA] v.]].&@0R&@0RԖ mju;{G'gM?{a0ozˋӓÃݝn&;/,+rihn^llkiT+JYw<lflr\Y[Oҍhxl6nZfXX^}5 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mg:F�d�ܵ56pW{_\zW7` Uwyq~vzr|tx^fsRR*WIꛍfV zYiRK+B>7<������������������������������������������������������������������������������������������������������������������������������m|\+ endstream endobj 451 0 obj << /Length 1199 /Filter /FlateDecode >> stream xڭWkkV_})̊.Zbƶ8nl˓d#%rA>M&&Hԛ^{*N<,JCtO³gO#&5,BV>!a/^䍕 cXǥD@q(+0e~!!3Lw?s y޼`B}Bpgl @4,ߦ@y@Nc<ƀ~&h�>9.E~%h5:,bM9<c9wd[Z8pY~/Ϣc] |6s6ɝhe)߂<A <ٖdbۻIyFq߱`2M%$R̄* #+Prˊ/ZIL[n/ :TbVl bfBBw]aX.l[?Fޫd/R -֩" Ů3*gVv8|@w}pDSK#D:^0lѲsBf"i}F7yP}B̾nG q\Uhކ7.&1p{яv,&g,1h)IB{�/_}ar"%蒡D�\l~ {Vç`2P$i&y {%+U6?[6as| 'KK^cWLDv0  449)dZsiUe-w=o1:0D; Ȕv &׈6WFotPr߲@a5R5&8I!`{q=Aj G ;w%r^`&[=dN[[~r<IhB&_&mGVu hV`vYj :biӑ"OyСIFE╛?d)Yҕ&L3 >r<ܨP~*;.L>S&:T4Ρ؁P=>\Ϡ "nZ6<쪺qVǓ52:V8twmA5 r~ĸڷ_f&,"~GVmyyEk/diR@@o<3yM*Y1ĔmT:J$#/*I(N), ,~YSy endstream endobj 448 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./wiring_biotap.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 454 0 R /BBox [85.67331 80.98804 447.1076 435.0598] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 455 0 R >>/Font << /F1.0 456 0 R>> >> /Length 2021 /Filter /FlateDecode >> stream xmn^7 )l6\1ڢ>iZPv#%R9ާ/iyioK{Mm/yׇ[ּo*WLoヨtwmkuowԚ<TZkIa͵ͰM-6ri}eev{ȧlyۍOY+Ύ\:ZG<X_m~1uX;n=|mG`̴g=n|![#$Dg޴L]o?1n'W\ CQ_9?siu#]nhY*m*Rٛ٨e_nloͧÃx:#ވjKW56^A3&g~1 wuZV}7J"rM gOr )eKE<to___鯯l;rzn _ûDFM \UMXJUft:ˬ}j"pTޥJjߕG0V0i!V:ιjJQ$%ut'Vz}s0 y;))+ V:E|hTZǁRm&G,#^ny' m Tڍ;:SרT*J徆BN l)m°Ro)m|RD,G_z޻J^~>NbVAX7avx,]�"uN5#kռ$)q3 rl3`7[= )5*<vU}y3 n\]!joZtQOjJ-؋ʲDm?ǷozA;(*shL/B @7qUт JwA`Od'?ptJ'N*UsD0t\?d@&[9E4  d7b%$>@ɉB?a7 \00y4爱@ENA4 '~JrhgJӏ7JW !C*DT3T�R$`a,5:U�Y3!X*OTa%uaЅeM{O89~'~ZrH.o EļX.VaFT>>h7֧=iʍCEȴʞLJ7T)d�|ga| q4 дUjYd-olluϕsL_NVqnM8= ðc5( U`_tRU,E]e\8c\U^a+U+K!284Hy3a HaPY 1;R0[cP'r2aww):nw%~1ŕy9X+c¥kr òG4&e`"s/sV}e) qjQfqa? i~X{w>ږ<O ? ֠ Jde9M7DfT5B $Ѫdc x*BhB##oR` <D%;MG@L�Hk;פm76M+M윧 >E5͞c|BP~'sZnK be7B oa#i vϐl2<+Ex3!>IcP1MEأa")ЄM|iU= I?{ y\.ut6#xFm V$&,/~FE1{B򩝈ؖNf &??,X0)pGW�z)B"y5a%Dљ6j!%-MkrZђ]z@my\TTaR#reUѯi}wB-0ojO3 _>ߩY?_H)VMJC[5c?p+F&ܐ5J|]S�i5v? endstream endobj 461 0 obj << /Length 464 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 465 0 obj << /Length 466 0 R /Length1 7816 /Filter /FlateDecode >> stream xY x[Օ>>==Ij˶,$ي$Kl9vd9Llgq'vlC%@ %$%l)Iط,UX 00RZB )xhI:-4=ooF{ܳ{{Z@ ob~H􍮷gy@VreyuzE.o�tpid <BZ5,o84tpߴ>7yk{%b׭ːF/d`ڞtȟ�Tf j9�%Pc}24E EOByo2~ {ܬSGK{!" cSg5R=)'蔯u]'i|KvuIC@ۥ\/@rvl?5-SCT6I2sT]T|UnXDY `%(F0Jdar ,@NuąkD.$qA-\PlT1A“#2,گڞ&dز,y�!7JՂ֮yϮyˮѮʮy\HʉCܡiuh" Ռ`,<SIi,\Q-ʰ8A)EiڦyMs{6em 46JeX&v(o(;"hkJ|-EMthQ[S> ^m/`#W@LHHDЋM4܍dd8±%qΜ\nkRtSm&nF &)rF ’Ԋs':=hCG3!%l_Nd(9UR N " mo~f;-<y\"ۓ~ñ^!"w 97 n wvtJV/ ضa3S %alqև;_c[|ʶ0xmA֘Ұ"hmMb[}ëY1ɄV>av^Y. a͇Ó謰9K"lK.VpK q͕pŜQ+ BP( VaLe|`E"L*qu\Cb((VdI FM ږwd='_qrG#ʼndX'ړՋw$ⱃH;EK$Lɹ])r">B`oR'PzѠ=yxQ;"vhb;l[,YL$qJfAz\2{U4ƽ [[%lhg=ax3R%IH;JJ K hҀYk2JIJϪeՋ$Yz7 l`w]wx'y*SrJ}|]žd<=+Vw y?KnceRowe|lv;w e²8w #ol_#7|G_7}m}"}mH}.;~-v=P11A@C|&cz6�P~&>(x v<O6{P Ha.,#%̇Z""nxklamk=9< )8p1Cr=ܑ98ٓ#8aj)mI\ $G 2 U\`Q 7 w �!΃f Kb#ʔUp.z݄y>?yfe273a ?=p8xq$y Te4hCh\#^W0{-#\L61"8v~jRxcZCOíC3Lÿ"J&d [Ȏf<y6 ZĿ\XV؆ a-՟`pDO ч}])j^lW03<!Nٻl{m̅[3dGOƙ4hЏXx bw ނwa ҤYCf2r/9BRJԆ}ztC(=Ƙb`3;]C~vmMӣ+Og3eBo8sG:q/$XB~LЫi8}�'1 J ""$Jf#xY@:q~#]&ɕd'=8}+u&3L,娉Cڎ<LtހGS 0 L Ӌ)b1o2g&3.BvT?dY=bMZ>^n 3-@1}w%<~ELl${}G Ո L z.Js ߘkuJ䬌k?ηؓϙy_$(jM.E7,[BR8kI(D~{'_Y 7=9)IRYe+U1{ɖUcXO *@4rĆܻh-I3'x,q{ 1Ñ_~vR目.m۽ dOu~�+{R]I7=b_% /e)~הInkI =!"#r#.IzM+IAD'$߳lͯ[݃â `N$ttM E4]9ˁ 4D:a2K?QVC"5]y}BľVt3i:יb60f"|K`R3Hn=o;E=gߔNKn)t$.lt;=ʎqB)!R+> by eb8 ư62^? f84ooA[yZ-U82DQ10pw bH @"Qv %- D)4ţkaWrS̒b CPGWFW"V8iOn4M\>f>mؘ.ޑ<46fDO@@4C%E6u`]$" x@1*pYf?B ^לDkDk࠸7̇@Y} P%"h5~8B|~o h%^hH0 G*EFx q}t%t2ix=:g=sy%_S+ȸVTaY)Z ):Z|'SQhNE'1 C)>v4O1oqc_>`r(ahԸH=ƈV*w2[ɽo k'Vۃ`Ш*S Nm*,4S&EBjMQir)8AGb'Лy&ϐS>_EF `,(wT7jCwʹjw$.:Tf^"j6*;oZ",eUx xo,scZ2ӺFuņ0"T!9*3c*2rTkl>�jx)|.ƙƋONBɌx6Np(Đ[[+/_XP*+ܜFU J:1DW3OG}Qjq蜜+m JP⨌2zwo[*?!3<|Brk.Q{ү//O&D(%nE8ʹ \^kVsҕS0 ^c*yjz+85CJT𳐠^~M fx[߯"PI7I`wݍ~KjE̦+BݑpeTvQ@@ 8H7ZƤS?^Y^m+{;.JKvy% YPsݎˇ.Y?Ck{zk<~u9$bD"!CB`9AIRa).YJAaqp\pB2t'拘⒒Ruy(䖗*^uB>.5s<çloӗxe4 uG\"VI"2L擓 fIqTV1xLWr3rk@W1y3jB<kyG z*v99.7o/5 0ݚ>ؼ cd@yH7?E`f;酷nBN>ՙx'9gxX?=_8)9-7zay`.L(NK(a\#cdyF*F1n~P0'6њ'"inB6b>u ?dni{<3#?U/:, =>ZqNTV^9Aqz܍ƍgu% =#sߐPAW(U&FJ# ds#ZȩISlJTDty[m%ѐ[{r5ٍc vpJۋ8f\-3`f1 -`*!E&Vx`2L{�imf:2p;Jps]EKx' c<p1Vj7Q={zO=k9u~U%փ/W@dQEWkb>d/Us!Qdg;hYas+mᠣikYvZivY]U]Wp[d y Ku\aWUqUwJf(<[Zdq#Ո^T?{.(am<9i5LL2>-ӗe&e.-Axe3 6Ti$$R W JZu,e{r9j~glEu:YΈOwR^]iS)o>^Q:t`@VUsG ^SA$ez6spDHDǎ;܏/=^zTrmnSoXoʛ&jɂ [/6Z,+l̃(KT!=ыVW!QVkĭ\t: kKh%TM2cX\Jn'-mNnWv|~v8{Dj΂-{S: p-ݱkaw8'/w{egW.]1gza}RʩGV\e6SʯmїOjg+xqRfΒ''PI)rs]r丄8ih1 c~N~Q,4Na6dn<*mQxA7crz+Tr<X3USi.ZQ8IJJS~D2wΙ:44t 匜UkϹ]9-[I ۹vRnmm)m+TuVY}vhwYۋEbJ /a9~Z ~^/7=bLĥiq s O-10Q +M \IJwQ-i:|b@YǻH85Z'eAibMnOt)iXPSUobil͛,C>g k^uL 0cJRgai~;:,Ϊ1~Ȗ FZ߆Mw~:Ts6XX4<Ի�wj endstream endobj 473 0 obj << /Length 1668 /Filter /FlateDecode >> stream xXKoFW9QEHs|m$m*zHsXSԣEG6\JtCAk^;_..dTP$I4-&*<&Y**&OS_wFS_+Aw&V83Zk=l QA bop{f |REhe80�bzǨa-Pxf }#|->}hW4livw,lF{je%.l;ԫ_wcM漆ynP)8I쎕'CnZt zǞ0p#ԥkC'0 אּ/H_{>[}{KاssLDՕECpi1-1+°C?O\8WX{?!TALQG^M< ߂&[h\C?[*VD#*9$sE1l *{ߥ|8\!J;I؀ȷHI, PNJڳ4K�l %2+qK;7!@0A-8-M|!`x&bPU= fK[B�L <Dgha~X*T�3 & kc#l~FOJV 7]v4!"?RZ/H^Eld7;S<&(a~%i{s|"ijۃXǒQZ�T`7<:]mmd(.[},\@R#հ_6jQ"FAKN?twME$+"(ɱirrwlG`=r%R"#7W;Zl"swA@y/lG>kmVH1-Ĩ̹({DC/#Ne�j <#N[8b?q, F=-8חi/QI+ 6EMgr`{<KP!RdV[ľ؏gH l%hh{oxA޺<dDjRlsIF C Nb*7֓ *WW&@̲2MK#8kv_$yE׬OZX.:r@ҟŚ[GE+g}we 0sa)c77EՍ3]�y9<U\ugy8wBewgNPa*m#{ Gc% zwA,Q.}7]g|y/̙=vtd�&z BrU#S$C,Bh.E^ZuW<]Z1d(cmc9/1<"|x[[jܶ@jypc3 ۈN[wW(򘽣YIaaD@$yp:4~8L){L2+U09ř=} 9MhzuLTqvBҡx'2.wɕP\D}Z.U'11g+9Lnݦ]B8QfA7(̃XIY_|tQ8]Zʢ0'Z7&_ϊl 5(t: \CyMH÷F|*<~.0> o X 8aA" B�$mTg6 k endstream endobj 470 0 obj << /Type /XObject /Subtype /Image /Width 961 /Height 708 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 42695 /Filter /FlateDecode >> stream xuWU;U<%t@K)@=M# z4r-BJs Q[}�j-*"A@\3 p Qzn^s9u͵[~^=ט9֘c\wB!:{=߹}ßЇoA!Bga/r~ʁ_z/h4Fhq[}?7P{>z˓+}C~~}Fh4Fuw|?oQFh4&|{B_oh4Fhr{Ws{s@~h4Fh4^wGi:6͕1Fh4&W_h4Fh4Sh4Fhr{" g;Fh47].cw˶aÖ_wcO<~l9lwAk[ni4Ff~7^|/Y l|m6-kګ˟Ënah4Fi<cm6-7~Wm6-.}_{ͧmƷrU'я^ o}[O)ڷFh4Z?'?ﳷyMm6-7�w~}_~a{q;z'|]q]qœ6-.s>w|m^{%\r{kxqC]~齎zЎ<౯o흏as~ʇ ~'wv߄6T\|߿3rGp}<"h`JW_v8]w'GFF4FM̷_*ۆm[/zO/W.^?zi{a;|ҧ=cq^2lsزgOَnя~CuC!/zѓ۠G9?ٷ3mÞ{=OyΟڕ;.j"ژG^AJg~/:Əp3/.>Bc.|*u4FjϷyMm6-kv1@�|uE^yоx ٺyS|`;[9lwiO Yg҇<6YzֵCo:{D[xEg>ܜuֳk.y|ox3Ws٭])n\w1U;9s˻\)g+nſr޿r3;=qw>9ϻtѣh4F' ˶okزfA}qv~w}e^pߗSӉ^ᇏ=l/8z=lsز=S~{mz`'.-<߸P{\3_|ݯmm9ß򑎶ɇ?>>|O<w{?1x/#<9=n80Q=|+~dg|'\v~[;gs;Oa>R^lG4Fuknrv]|mz/c .<?x^r9~}jxgxcp[NuоKkkogg88= .2_ܥopoo?|w .}򧽭x_8>vswaEO?:½wKk~=`񑟼? gqrow+[;GGe99M9=ݣ;O6Kh4Zwn}oDTa˚] ʡ.~'vG[ޑ2lsز=ӧ'Ø%gz7;ws._/٧{~Ү궯l1v6G]u{v|zsG!iP:/lp_}ٹWN<{<L:C:zdxNvp{ ʟuN}FhN@W9nX_}_9l.燜m7}_|o{#{#=l_?<jͭw>0||+#]_)Bo>l wc c{› 3?Q{ƣ>7=kg|%O:o'ϾwIkכ=:?B|1>;<8Osz<J"]P lsHN;=s=|o4Fu~oȼٯ᯾/+vw>./QWÿ?_]_<h6-{/'NOg; ȏ1k=xqԆ7wy%?'' O' ߼/}y̫^_K|}W;2/]x~~'|pGoڋdzV=qJ'ljؗmw<?:r߹hG;l~ܲwn wm_wKsFh^/毾O:@k6-7�5/qxЮm9?{;ora{aÖ};E[|#>Bkv^_o;]C[O.΋.>~qܮm8>gלgv;`s{{KϩՓx+vxv~1/vC:\.yzws?i/{y?t~uGg ?ٽh4[x፟O{=yb8lsr] 7w N{.d vrx;6-.;?6g;B|{eC/o;ڋ{+n.z?C|k'͏xҋ~6{0xmu$FF/]|6-7�ٛ?PыaÖ}3s_r4GTFqڿLks/?/_;kKmmFhKwGR l~]oYzezӳ~^g=?=O<hm}1lsزMg.'m6v`GiL}h4FoOW\O~˶aÖۃ_wm6-.ݣn<E}vFh4Jkqӓ_~-ۆm[nW\{>~l9lwX迸4Fh4Mn?S/_~+4Fh4Mnѯh4Fh4=1Nh4FhkncHyT!‰h4FVE}Fh4mmX}|Fh4F[gx8Hh4F <w}{_ߏڟ><>?M>͉%noxv7w$[n4v< yW=O[=ksŞg+˃M[ nh4E;m_Ψ̃/w\*R睷< ){�F7^~9o,l{Zﲗ.'ݝu^㜠4jlF>9o+sxӘ=ӿw~h4bñ>Q{O>oTmOyW;K^Z,Ծ/[^;y uݦMWgĜ@/|3p%{ս FQ{ӡ=?K/<yz>b_ggS'Mݡm}hz8Ov?}ӱ4OČ7rRDU;QGy?:xHT'9? gN/-v3l+~^W;;{`㎢]=/u ?h✶Hsr+vlQگLh_w?n9jo^MOW^j.zћ/̕G:z͏_oawSmg|qda)}Q9g>sv|KBN/I\+/=x}OKl$^#nat;Grc)~! [8 }^y=9Gn{;Íz]|N}8?U2ۍ&^Fv7&wi4V <w|֨g̃z7_u{3^qsy<v0joS׮{8ӿJG x#.ED{.\1GڝB'{@Aq?o_9_+W\/)pxJuK_{uM<c錶9Qwq;}iMܨ E_It F*ckw|S|k|y޽λ+^i>|W\d.joSף޷\[s7u|ցؿ'5zU=jݝ|>'81Μr~w=qы7_p8y/qҝ+-F{m8m%s͡k{AOjۯ0qwz$zFhOۣ'=u; Csxq`O4>w綟5X?K_y O?wx}upݍlqGn8{TpgEwܿ{I;ޝR(K>߳9=_MK̹^_Fz^w6rDGwK(?Gw`+tÝ*s{vF3}o7oFhño_krs/|_xރWǟbc.~No?sŏ/U֎h_/Ak^}+lþϟж{wyzU8<|^8w] ss<ȓ]+QqθG8A>w8.="rی^~ݛ-wm.QO7lt:҅ny3Io?β1 FjcogxWr{?+g [.2z{h̾׵h4ڢ }˭w'{;|2KA[b[Zh4mQ-y>wwۍ<|eN[lѥ--huh46p,B}KOh4F}+h4Fhkn^hB!֭X!B[ 4B!B 4B!BS!;>B#B!!B F!B�r2B!B!B!P@hB!*B#B!tЧ B#B!By6!B>ɻ}M_6!B#}5B!B!PQ~M_m 4B!BqvB!Bd!Bdc_m 4B!BqYnB!:D3ׇvIB!=ic6!B#փ6!B8 B F!B�rB_@hB!*,'"u 4B!B1WnB!xAhB!=nB!x '@h4kulB! YNE?BY!G=NE~ FENB!{|m 4ꄇxE#0}w?unQ@,!&vɻ7ch -cE":BsI&B({ BYsp00 49f!7wڌz<$9x ikyd;t@=NE曻 FYvd>v;y-+NC(8y?p7w >M͸SBB (-p8y~sШxp"tyܫhRgLBEz"vz@]g!4[wD';P B]g@hTj\и\Hʵr ziMZNg*!'">BN_ 4 B=8#eC=NEBB`PĥZw<#D!P%]o6-8ddA'aD=NE|ۻ F t*] 4B+ch=8�>~ 'ШWDh!3BRACBm 4RsZ>!T0 ɻ}翽@h?48,k)B2(Z"'"M_s(PGh\nA:F]m 4jжP2.hP`|Ơ!T8 BBX U!Ei>qA#r.Bݭw6)ǔ~F6tUƦ!Tub7wƗѡE&n\10*8BG=NEOzA 4Jn?PdacMJCB#BsI;зݵ@hEGhPB;]E9MC"B]mw6MBљ ?#Rn 1QZ3F%Bq.BKw ' FU):Ah$L.ÚBc[N>zqm 4?#J@ץ2|2|5G3ПO鴁Ш7.Ќ5\P~AB#xzШEEh\,'GtBMg9y?sݻ FRt=fAGJVAhlBmzAh\3BB 4[y/߽@hԌZfA`TC' 4$ 4E4B(:EQqN !z]hB2<Jf;~FcaSM%B(IfX(ZИ5#wv Qd4 BHE'cB#4-B ?~] F FXf 4.hPWKUI~FhZ]O߱m;@hlҏS@貁G!4f Izw;n<m 4s~F%J (ډи8F h\R l2)Z@h\ Or3.hPG!nA 1BFFH9h*F``TmC)v4B 4B9- 43 "UĤ3 !Bz~ޥh%*Õں;f,B 4BE3BHFh}hG3pA#B#OΊ "dgMhGK&>!B#h 9Hэhg򁴍)-rմμ3B 4B#/E*ҰtTm]I@h@hJQBuM6B׳99mM BHi7 5 <!B'gn 4h8NĠ&PtmAh4wƩJ&dG: BFKB CC/1"GC(!4NbT]q3K @hB#VN rD7[Q6GrJPQRT]`fj>r.=~FFyBi|\.e B\2Eklxq*!(+hD?#tcF Z ~.S" @hK\:D?q])~ o:5"XQe@Fk�ȄU{BŁV> y}"tF4 w=ᥪhb,LC5�w [ FF DS%>yE'`o!a%Q=FF и,>yBSt %?߭%DF\ z6^{FXd{5k&!-}@W٫%ΤmrŁp!÷'W,'DPtwB_N8kR!`X99.KVt51$!:}95@hFȇFr"hُaQ)ޱuns.B 4Z\?X Zxm4cZج1B׾(Y#@h?;Ǡ frB+S ꓢ}b9Ss4}rRhB#Z׊xrX+iL@!%!-x3b Ge m3Y#3o@ 9)zEUvF}FS.8X-Li�sWAhBg"t`jl^9"s,J=w.goٕFd>J(ۺxn3yAFKK!Ќ6H TER.7C-}@hZ~I^:vB#ߟ�BhвjК.iAѶ1;b<B Qryv30BRIEh#8YDhaXol`<B 3-FbzIAf!ђ0R>B=eivnDi=,~B3�܌ã+AhR!-lRm4s_:]Sk}xfR B#BF]RD. 04wDp H+zj 4Zs-٥y!lWFsN_{b 655 ' #Nn$B[]J-7f;*f%Jڽ/Z1\f$B V:ZɪJ $;eQM^v2cv!MsAG .QT BsWBhQ:콹B@h4S~'وJ ~:Syyoٹ@}sgZꇢ>iӮ `QW8~O/Q3ݑ+bw8sЂ-4g [K5e`M4(x;0Q9b-46,Nچ.B}\3r3.d.9�ǔ%LKqr4sB&{ *DC%J9PbЛ3͒B'|Fkc-|ڈ&&G Z_! NDM+Ba@SygtdawUi6-B.e] 1OVK[cthgX!Irf> _ |4fAAY_d~חٗ¶PoEul wVrͨ@nm,wb0P٠2giJ nxQTb,|"5j{@X47''Fk+/rB7"SMs@hf͔B0e"=]YݚhNNj'o>]aTޤ&tS[$y+Xi}&B 4j㙉z:[}^X?sڐ @R= Y Z` țلWM=!BLI4h )[ -hbdA,KW'n] tml*& F#sWvk3ギJ/'QVW*ű *Ħ-?@h(zZ6<N@hZϙF^SZ~F%͖MtGe0~%Kч@BR]m(ǝ3Vi⟭:Fh,]#b-K?9BY-9B 4]o,p\_m%B}ZA9g&om% L4S gBS AC5)zt KO&ĮЌ)5pD~UU" 3Mb@}C 4=G MH,B \m$4{/='QU5"blؤv^w BԻ@7jlN GȽК硂S(?mH4Ռ QtBCՋ]0^vD脭9_@Iqn7pیPXh+:!t0Ce}3cZ,2`)U]iUB% 49:=vPrxe!Q2B'DsDh2Ma&o@>+MhBO5s׳AZX](P=7gkIL(l#όeh8e> "trR.h+f-UIɷhNSmkzv K]@3!:Ø=%{E|#Bp( T> :ֻ4(j - .B++ 9zMEьee |",'L`|~HtNBa8*XewN'OSYAD޺.c rz`F3Ʋq B+mQ82b߲33f QS 5:-k еmred 򍞙be!!Q$n؞\g #4Bˣ e=B'`@sygAڗHY~BYHrG @(sLʺV RpE//RSе0Z hdk +W brt\J^ gc$!f9a .b4MKAhѡSF )0TY,B8Fy@h|S|va: 4Ȋ 7ڷ`D刊|ydʌpN֗գL`Y"rL]иb8&S_S7~:e|]dF ̥EM@hMĈ2|e,"4wBUZi�WOQ"t?Gv9mLFEheB~_8jDi#4fХh5#TVbsOπgcYof,C+Dh.B &fC.]6Tn"ɚ,9¶9y\жIVJpYDƙ:lhMrAT]vi$lVaD<c<(r9+$HDP&'b5Gh_qǖod}tJ=2 ~F tέf6" B'eQIne t=RڗsU,W* xw  .~թ1#GL5-B0r!:!Bc-g|nfM4r_l<yf0-p,&'<uQZ`v)V>>k,$D tKPeI3k'jRQv4BA|qJިbD!&kG0P@0#CBˈed~sGǺJfB+Y.;]o9] @~R3hU[YQ Fh m]Ldz4,iW8Σ btBJYRkRkr$:vȕdK˞<0rN&%&M4ǟz y6;>ܵ~2xpVIk8Bcy=o{p9XQ3Ln .hHpKfˈ6̇پo)AF G<n�H 4_,,R2YF%FڊQΜLԦmF >4(Zv\QQIVq :*ќA/t܉z˃@heP3L\uF9首\Rݠ @n)k;D9k9!.hTsTi9a#:𧹠 4!!Қ%N`.pm1IWCr&籭-`4:͢>ZL+#Nk�w|)ڷP樮2\vt{<emH~eCI杹Gh5n(p_+D_+Bn ގ4hiRCR0CdǵG+?Hp~yeE t%ΩA]9_ڮsQ-'"m!uG|R \6u%/rz); ^BQ6-ظ+g(fs .ͫI(!;�)|ē/TA tAFSn/=vMQa{%'K@hɩG5D 0ٞ Ȓ@h:ܕ3~;*s#"8,zóq-c ^Q <s0#@"n^E9.$!ph\pc 5L,Q>[ЋD豋`^;\!@NM?GKh)):bP@Y9-齼DP('sGh#Xdˁ.(kdʬ`\}l<~1FA}ʨzFRC.u5xR@MV襙<d=-ܠ /+D&8,i>2ShihzrH˜7E=IFk 2Hmz/ݸ|>|:D/#M{#s tc<JǂQ+Zt~h+=1E 8w$>vFLsYP 4s y(p G|- ?g7tTTܞ/D:sqhU-h,n.0A@R졼ao Vsڟr~FiyFKo(Tm-SwŽ+)zМTWVW1JjPހܘEx2-\zo+@hCr|#D;?7MB1T; ud�AI訙[B}~\rr:(/s2:$ͧ*% VZ t "@_ -0XL`?QЏ [(4�iڂ5(ږ u}2Mz$k[B3'Gh!xr?q)VAhzeq.ʤ9~$J N+ޠsrۂЫBh[(\t$ 4ԑ`@`g{}3&5z.Z 4m+doV>1j+`ׇlB}{}@hTՖ mצ"&7z׶SrBu F(BW~88NlwoM ƨ ,6YC,c_y  E (c`⣍nu?÷\e80*~y>^un3(W3-! ʔC9託X% f{ UB%=@:D6Ƈ46Eh)3`@货`IRM[ ?%Qtu9@ E秆:I@h=;֛q}}R(ڎ l"3j� O}=XiMG2 4C*۝NOk绐yO=SNX/Bc:E26#eha'mzz̍ 53-[ gWF&Q3kxǚ5`L=j9$ColBPο"qOԖ%w&G}7!p U d:W8?BW!&TNtPEC2?bv #Z_YX|EPvN 䘊~ `}S*DsQ AhwfD>!L7삞d fBmfYN8 6^K||Ԉ B th1sDX_}вSZ5UXoi<?Emw.ZHZ"Z 8B;*lsA˃{UV.m 5++9B *n?O&}EyWJ$:kH}Ln[@hԦ_ţ"vI-,ilqeP$V(+0_BzsfUn\YN%<_0BO ߐs@詬Dz s^gbt3C`?BGԦBB9?jXh>EMz<C "9׀Nh';g,vA Lю T2J-NLS!(�y9P ѭk*{Or\U׳P93J08Y t]4n995iMK='ThoVatA7u2?lu06Slɓ_-B 6_!:y׷,B?h'ӻA"�~F3Bhz]4Chg_Yp:g0=E](:HlV"սQlgX ! BBJwt-]F# B[ݓ zZ/Z!V.r  `VVi'*yҤ1BR&б_IqxXp1z Z]?eIk%B+]9E82 4MЯ"\<BW$B�&)% ҺB  XY@#T\]eD'T}OWr=7gFWP˃4 ڧxkM|._ߚ}R'!5Vsq. >bǣM} c0SV"#:X% AAYm12ϵ:�|IggmANq ftFP1 _\$'#tcurIOp9N^x¶nYꁢ@PkChM=>-~mõ_7VvG3 a&.ӕC$#(6.B61u^I;Se0T'>^E/QZW%Dhz&,IКZVzm5,|³̲NQL\d B~`5#~>Ƴ9 _V(pS@ "BU<GiNZWJdKWHjFpL! 4tPA?%XBGY{3օ[Fcs4Sy` ޏBqҚoyy&of䥑Z.XshwPGl/5j)"}Pfk)B̵h9?#{?78d.Nc깽 B+W"E9 /& {җ%P %0 B t3s9㱣"t:)AM3"t6)XmC#&^a)Zv G Gux)TB@RδvLZR"twc6&S Z45ɫk5A!t3),991h!$̥&VD!z4dG kh!jz8C0FJ~Ԋ;J~Q %B |Q[*mN„:Lێ}lJxek Q#s@9 tp:Jj!NCUZzmJl>O|I}htCACKC"3cS<!BAB=KϾ\[Lr6yX,-]QM*o<GgBmUQip}(sLtMl 1EZidkpD17j9Y z۞\}q7glBi$EkE" M #Z_J[TN]v;TIQ>I9My` Fh_82<tG+ >ڴYゝv()$Mg_bP\0#]-?oap<F t{THKMX+(81F.t3\=x؂.h)ʜ/h=#\g1WjpxDhѫ4=E1FiOc�倍ຘLd5IA'gTG)V|4 ;(}T(x#EH_#Ew$_h4Ӭmp ~VnU"< 03c t08x݌ulC6~'O4ތL0,'D T?6: eU! >Z*Fz/gT jvz  ~o^%[,܌}WloSK_p;Afa)M,?x }&čg䐗'hłiC÷r*LiBChBTtJ_Du(8,Vm+5#Q d'ڍyBac&#mtӓxn%{<= {7sÌ2-W;4Kay9?Y`bMJRX"OL@=sVlBI9=ߠUg`*CF cBdZvhMb>XQWPg�S(Ak:j#=_w5ef' ]E[({y&hq*J!dSZ‚ 67r9 9jf3ƚ!BX]4U"t&ܚPfGuW,mՅZ|zoQ~FSP9:g䨀^*xu圾yA#Ȧק~kр7!AhIKؗfI'|h19 hj, EϨ~K;oYSzo3enD=>^Dc#}!ƚ!}{/K8\0LPvgL/@+LZLBi!&>` ހ|Oi"6 ^N"7�\JǣJ|jx5nT/~\r6k zT0߈Y̤pKFhKrTA#Zii7b~ઍ;1mrZ'`1:؆"} V:3$PK9watIW</(бPC擭󿱕 KnՈK`+_iQ:uB:Xpj9φ.#B@D97򭷐ei |v)(> pέi?ܴ gԭU.d 4)jjqVQ{gT$b(ZCsJWwjjF +YZh &#te" !4Q^OR;^,P3qOVo4 ֡ 䀓|ĭSJ=#tp)Gp%W,CB[u^Z@5Vo4SP/[W.nGa{Tu+F3elwtnp0ߗ]ʃ-o@ tfz6n`LҬe*8,jUǑJ]U|7{BQXЋG٨&\௫ Q},\dW鍢"̫LϿ5x<Zdms.iC%KGh%zɹ6E ܡKA$B B;ʁSV!Ш%_e` `: 8%C,BJXEl iÓ&&T*LƭFaplb|0lG S]t)*hx56Ą V]:fqDU塖L5B7lYHnV3S50op`QXS, S{(U[!EdVڇz#x/tT&/I,@m,~[=yaOP3LD1iUë 4jINto<V\$ChP4H :{I4$wEohMʸ4~#vuyE~KkrD sy)Dw zOͼтB(-MzV:3jOE<s6N|EhٗuSRm aZsKLq'B")!:gYh3WUBJ'Bkn1!`XԆ稻i3i/0(s@ =X.ܠs.4T i30Z%-,9S*,!j@ȑÓ+T @$uBᙌt #rCni\?:#P#zm=ϔVP\y\Шd f7}EO]ͦf_4F-КHuX ۀg2`Dt~ldmwM0\(& O6Ɍjtm^9=-8i*n, 3Ȏh'B ȃo>y4/f7!of)ɈIFPg!|lbI?Q=#Gs_ѹ>aB0n>& EEL7*? rFϚ"X$Bwy* +WPmCP.4gX?4#~.h+e|$FL(j\S'~ґ6:-tN#@�]:Dh WN R*\xw>+X?3?-@h*xv2v-aDFY/>O#>j(ZϺ¹XBdlXuaI,gՋX-f(p +dI0I`a-!;z{X)b%QPQpD//u9;OʄJ$ V"8*<؄ܶ>GtYvF1WН_(-dp'>֬9xL~Pt5 ܋ t"*5+*! UE 4 4;15B)Uc|[#8Bj͂PWfg :/gxs:6"/ x)#zFJggipM Kdmy盦׼ 4꟟evb}0zCIBG~-uPKgN[S&9"ˑȨ t{)p9"ȡhxb/54>jax*(Oe3Fݞ&%jftݮ1G.N4 <in.9Dvώ ߓB()Ǎ(>.B tc;S.P?sU!DO1#Ch]tϧ*HCc'њ&53zBe9=1x `g∮P׆(r"IQjݐkMH% sY<go{TH#t#<3Zc^z8>L.naHwZJ:,3 l; /AJgB!f0S�PUp»鮍eSiEG!^7$y ] 0$/&qՎW=3G4kύ$=q!X;8Q.VGvB/_a6Xi?+2kQXfRz5 .-T"x$՚ly F?Lk(|L[/vЬp5A+㨰fcsG-$ `Pȕ狣njkp#BaN쌀>M%V³Li5r z&~B 8۪:'? >+2粠uKNQc&>rNAЕvZ~3;vC_n:9ᆐԮ{粠9sn~9a ~NbO2Dn H!:kv71 Qu)粠Y#t;BPx3MI݌Jz{|ƷEȭd:Z`2h<!s%`>R5@h1.x.YquWSϕAwj*T9EǏ,5I< ` .?GЕלߠ�BYגĂr09Wj de; l-;gt(t򭩇Ah:w)QY6Vro8 H@hm -,9HVC 4B@贽+ gkB;؄: Y*-:<!t�P)arŧ["$Pj>l\vPCc3G-INMζ4#;ϕ׌uj9.hsoy Vf1CX*wrB3Hc84&9φ&/3)C#BOefm|,׶@ tPĈu}Y%X*\:KaybXO0%_4*-$>J[q9r BO54Vbnf}v[N| "Гܧu3\ND@_bRgkRFDFBXxOs5OdZbk0c/*φ"B t3 >kVqJc>$A}aDxS`ri'OMWk+StjcZZQ=! -؊d>Cr} >**Wz$d\B@nAc¨Kԭ!=U˻#Joǂ>iV8*B tAarG 'b崥A=~XkB"@ ;>s*B'8d0V){mr#oBR zsXs�k_~ ޅU'/@Sd$OUD7!Bo鄢SRr2x6oI&b~{lc c6_NR@AKmӔIɇlgnj|5#~3Os ;ApV(} OU6I܄" 4]%W|WzғSҋ4+l!!rg%B;ǠAh(zr6b JÅYԨE獎 b.`=™tj(rFϾ <A腍=#9 YE3S:D%DLyMa;,^SoV ^v^Baz 'jPW5Η�kC`͈ 'G=/oត˲  4]jXli{7R1N[-5̍ 3(,,2=ky PpZ<ۣAh(:s<k5{,w(ѫBh. ay?@i޾kuOG׃Ћ ;w[\QggƜ/qږ…K( ";_yO+u6pA;4!=a^B/{ZV]"wR ݕ;"(tzδc\ssg6,X"za\l%,ND PjBayUpl*,ʲwμ%?)e@hv] v!Ql)9y)4Xں<R/\X,&,}0R�DN^ڔ"sFFF ^ _D2aQݷ|O̿nTEAk0͸FL+ޯb*Q\ڜOv:6bsY*EA>*Fq^SOѲ|Bm?h-osCHϴ T?cA. tߴR2>,J%/¬T\Y 9ue#+BS9f(\֐m+|~Y3AIFIcBϬO>K;T(pQ U^Bk+Bz:|yx$i;=^�B{Qiw;(tIÒϾP 7b]lьNGv, �O iRκ?>O3I l!XNG4QӾpwa} x׹Xl'(Ǘʷ\[ń 0qħ1�c=GUlXG(g|3D EƁ ;Qyg Oa =uI*u.J EZ0<`/"EZ?r>?3v8' t=xg' t%N&`䃉C| nByQ\0vBAy}s?Z(A(om=ArJ ұT hz�SpcʫXN 9[W~!c"CtEO_ox֬'ċSQjB [ruAipG(KwhNPB5qXFW7 M)hX|o+ -cmr(j'1/6*n-0]khȾAJΰ_(P>w>_9LVFϵ%Wtay;Cd8K,:F*XI\0ץN DVšgJfs6gLr~js~O+wGQ �m|E(�F\H([WǯBk&C,6{BPt>..@�A83 ]vGlc%3لqXOJD Q9Q t\p BG=:G na$jՏqs=gо;A|JbS u,'DVW$fc~'8>k#`=p2k [!B˷\<L}XM,t< sO|tuvLz3 \I8tL-akPr  Y�_ `2(-I;jSs0S>5t5ӒɸX❐X:,~7dw:qB9 6OӸG'#Ss7o-бy.LjL莀͆qE?еtp8'rX͉kB&'>.bⷩ<HgUUj s(NU癶LczT+;5Qy3sq-.~XW2?۵V癶 t3B3]pLO4 k#tr ('Kd`(7:שPIG^Qdz}^ 4]׭eWm9W j,An0# 胗xo_ȸ,c港|pTpPP*HO_<#!=�3mÂO45ji:&D贬\(hMK&)HuyE1"Q@.IBb(wJPMm3+8ߥNg t֌UC83�TS"$;7J.܌mf<yr�>MNTrBjsbH25Mynj;P`%JUV�ŏ Qbfľi}96ssY~}T}Z=?C|JAh-[WP,r%lZZ)BqFm@L>+r{snzrGMh&UG(cAk} V mlx}Sޓj?,{ԓUqMxTZV?^ Mٖq755{_r9R 7z7| ;q5̨Ԏ2+5DWd]evV=(x*'o7m6AJ3($}XAO&\2zP:36\>M+[/لnpA',-̄\YUj /xx Bﴱ;jl>Df93nGɍZotԄL>)9ar{Z _x4P 4=21mcKoty ZFzZGBnŗP HQ>7% _%r-~-`UN B##u4OB89"-l'f$sl&\cA&FTv_ؒf-+jE[U3 4u{=B')Ӆ=HN~sa|wxז8EYKv*R wq>E ]{mAɕv֖w[е; cN|)||@T3Pda<f F4U|DYiFnuPi8H֦M< B/f4Oa)7IG9 V}^}' 1 IfZ3EϓBP˫|&4ƙ.hG)'TsH 's7 Eֳx˱xDzOSl75, *}}22o`O UG+2rHɹ˚gXYaNc>y!"v:sR@L�sy|k=҈Qǚ~/,|h_Ϡsrr2ag"t ODѸZ`^ٲd.,o U=-8 ώu=#U}ƚ}ɨK$v9BPEj3L[{蜚U`NU&_MړdYJ QжUhҕ]#'Ѓ Zoʂ4(DŽ+.fQ/ L7*C ͆Hȅvԙ9?j7d\B0;7kA6-yh@t6-#)ZYxot'$Hg:ĵUh\ uI4b;\E t1B, 0G=5yk[cϴ -ULNj c=ӴXTQ#tY<l@3svf"GMP4:gW FlwI^BTk ~N޸IFѐ`r[라\SxE*rʴ)Hl 4wz'YJ͈5|ж3GgCS<V Ω؄>}+{g7:ehs}a*4-WBoɊP4rA5S9^x#e*0s0af#?50pmOWB7+n#vIZSy< ĺ7bH@$ 4ܛ TVҲL=#\~&T)WH%Ycp:iؒJJZ5#^D(^9B/r#(럝MΑQB|CgK儾{P: }]׉=C 4nۙ">4wJ>lߐل,;˸BfE^1 vR4 g88?'\VXRdJzA5 :~2y؎Ep:*x䇒Ah37,S/0bGkf[ Tj\_iF3n)/c=UHیctl>c9&@fonuEb6Wط%&)2Z^Q2G3F`1m׌X< /+L홢AhLaoIJhĬ3Ehۇj!'cay A薖DtT*JϘ'8"MvxXB'iU_f1i+#s =Z7&s8nyy⎗-,'t³>fZ/FO\QEmYX‚˦hzfй ZcEem빂pb%{pDyH&0U1K | ѡR3f־ecl֟4WR9#Ct0rmAM(e@bB${3mlָiJѵ9jfُ&1 E9q}ֳ:ۊ咗j29Vvd@6�c(&舞/B!miIc# lJ2: dAG~EE( 0ƒ`nq=GBW s'> DPyre 2^Uu̒Z|4l}vӁ9ό-9h:hoLeBYxM K<I楅Q4 B\k Ku VwdhC/p9>E< ` -3(YWSRldvr5pafzr, _6g.vۙݹ 쿖J~ l}S%Ș\?^ ϱCj=I1$c3B9<Plyivge!M>S$:):ah1q@heFY~\NK' l6Q4>NHQ΍4 MV"%M84wV]q>"!4' B'{@usc/w 9QKxs- )trI}E"t0ɖ.?\HPB9d8M\l'.p:ҍ"5_'qBP+$ėBx/e/f-j29|)şQJhv?KTy;)!U b>Re4' B/''/(h;xa.h,/5#u/WNXޘ$d)(YΘW %k+aًr2XiTЛ՗Ah{L#/rI6>ndMROOK>넩/_k8f,snlȱ1.fI3=6v #FPk(:'׫",z<ς ڊQݚ࢒6 Ҹ5t.KPGuk+4)rLo=cE&rףS S4?fH SL6`d-j5#$�ɤW;0;gM͂9j%2Ks[?0j}mױ+V7pA5 7ᡞqc*4T+M(>$wЀSglBHg`9kXBM2#.ؗ4:}""ZLjjB`ِ`g'~o 䰡Yy> X;^Auge B;sd[רmRۚ%Zu./KhPtWF[F3}Wz**O /AgQdfZNY 4a`儋284۟rVDvtG<b,g`DрK*gi{l67bP|cy)5uoΜ$/iY+YpK'd}AwQ=Lr]eˠkJ*i@ͤ6ˡ\VpGm&dbf! ޙ{r*$ʿJ- @hz=DŽ3gkrVGѓX >U~EFD?G^,&p{EyA.-iۂlr&ZK(GɿiO{>#zWf HC#M%!E^omHdVq?ꑫF sfl&F̳wŦ.ꄨ>^d?e1fI&/p+ۄYy;,7fT؈]0/t X.% Z|H9dO L}*?Df*)eM̒R =Ah4/nL*{* L>#SOOi Ra%*+P5qLgs'rdيmXhMz|wAɩgdLrhK-QQ `BeOҠڊhd=9Vz3 %:0*՚OŲӤhvuA@heB%ycMr\|R{P ELlF(W$F%u]4y#O�EQ?C{ɯ+)ɹCQ_jtqMi4]~Z4#\Z.6;`J+2BE(2w/J EGrqf?G;0jp45U ͤhe/[~TtSH;E㠖&GV|L{ UNy薖Dr(XNX|4G c}e $c&5S!7Mm:]DIcHͤGe߅ @NʕY7v* 2Tٍ.px`|՞փʧ91&Ѭ+{ lb(:'JsJE:7@h5zB1ӓ ڷG . k˿ 5ϜJR- ֿQyi3=EdU{vn(M ?[ t2B 47'9+SsFSH>F8 qVYG_'sR)&tr:LҤNPRB#y`$*X:3k.'r^F٥PjPi>YTBR H[]w H:„CAh4;zBOe^/:vu',4 (E!K mtE{Ǽ)<SƝE+)B):kM ǬږN.ޡҨYS䐚5wzN%;gYgFYAmϟR"hTDcQ?'`RTcB|\X/+ 5J7 Rs7_'m+hE$KحW?Q=4!LֻndֿB06tYPT;<BЕ,;yB^h\Ō-Og~.ҋ fBh F lrf)j'*kB8>~+?Jq�A!;-zYmBx<֟y &N.y wlpٍ+ZY6m!3ay<qV^ SgK7txpe#B 2 3z['?۩-)[ɗ!mqKۋiW֠M(Em6b 9W<U-yf9*+h mbK>)Fod4Ӛ:tnL)U] S PT3OHu @hML09FZ޳d̩儙࣯RI3+908j{S,] j0WVsBc5{g-dU"i'(<8ʭ!<r`蕘ez &t^NDYlh =IKU5n_T@uY Q s4ދÓ@HjB _c8[ <=Oܑv<?m:W&Mnr,tm+E<#d^oH>Bˬebz40#L/gRX~nYˠZu>PlKfXA 1$AGz\{X} |}›wANX^UQ! QC@B_7T%:z,ר &߳Ezԧ9*rΌp֕)ZX4UyM9 48L^X mu6у~-jB;ВZ䌲(ݤe{~e̊81 ǎkL}ުCXJ/wNg; r (W_$(#ϩ^ ze\\YOE 4 |CʽG!tT)*0ӺKi;;+5@-$) L,y (4'Ah@:" tfEhAK5V]aBW*Tm}fWN(ЀtK~ '=%xahUVxӟ×PN( lK}2-4 Bh Ha;" saE|qwhV7!q] ߭)]^srqw˘d!KF]tT$ F-V#G{UD8'ą2 ['>&w: :W=u LyMB B(VcϚ'nS<aji6F2 h.&GC41<Yж#Zp8Z[aO_@ى -\;q'ʕ}ƿrD &I]I(Zug -/㢅 gِfNsw:̳1vu42X- +mlBH縠}%< qAM}Qh&ZmƩ`AF=3 nt]wk^qnsZZr:}n9@hg/bg�g[0 m  McwScܭ:; A*&i}dM`L)Brh؍9ŊTݙ2m4 vMzz&ڨmu=.hOw.5:H ծ'3 fjxɨ!-iоKqeڭ\;XpS,^NpPu0P iM.hWPѬ-W @(<`!s]3xY=5pF  B\'<4, Œl?[p4İ>mrTgG.+h7lcLf'BWr4 BmJIf7]jXc6G~ZHYh~Fsά]6C')=MYЋ7F35oj=BǺ3 e`< g4_%ܳƚP:mYe罥d9!r.2rG׆Un4v/dv ,64VWވ53GY*lRtŸJS@s0A�c=BL'5GZ.3N-3V;/qYk%50aE,lmyua}-3y*Wpx!f)(\ӅUu(~ο|7rbvL/"G'媦 'sB=`D4 J696}lQ]xhLjߞɥxsYM 4ۄase?vϦihv2n p֤RތX8z*ktu# QhcY %=Ch 3pwaŨ8;@ +j)BQͬOkU0i{Y�Ec|@hz*XvO23!!lWن\жZFeAfR<9QGʾR ijz;<Ahͫyd`$d.-,GXIx|?RXs3:Wj;g &E�&&{̜[9w tYpUFŃ{nTRpļdk)'4Ė&5E:s/ 5mZ E2'^-B[ke~VWRD&rPo$#IR $;sd 4GYںh$ްnZYҌ ? )[cPR,ܡ)X# 4=9Groj)Z㐟0A-Rp=Nj&Gn002(J| z( vnTQV.-*TAheVZeU]jHN2 Ex`B4ɖS!+|iqL ogw\OvDcv@hT}D3sSCJ^M?XGׁKGO'gMvM"v)AzWfE Ϛœz@yBcqqJs, q 48sf)9y w(Yoe| xA. :_aHZB;=iRݱe mHHV\BhrB=;/ȷx%fYFùAd@AhM<Ohk.&p Xv% gHq RϞ 0Ahn"Mk<+启pڄstКJtJ]M^H'd* dq~ _(]0y$$jsh E#z>!~]Eh!1EZEhcX [gզQ>+-O}[|.cv2p[%z`^BkSt.h$JjO_Hc~zBm49dgƠd sSCAnz.u"tGJתC#%~#Wf$Kz@[``ٱd' o7>~X,u׮E to6<u<cYBo-^>ABLQqc];QGlkB9K7WMFLzVwl'&e!Xָ2^]s >y1Z\#/S j\JQ P# a͠* {9o |6z { fbL"z9Nб!je{~Q865֐Y9%dA+B|B[E;g.'ݓbRhXNP4 B`Ryi U i.m#j:C Q&4fࣖ`R9>I  })Ywhֶπ .h=Bۘ2yEh4+ksYE*](^R$"t`ggUp'&v{?A<V8IryS`ԜwS$R,{z%<!ER0>_mՑճFh_b<4W \P"BX.'#tU$5`18aj#PӁΈ!"?gu=[kǯ"tB~H[B+& (Y^'B/\K3Q�ͩf]w|OdG՛B6G'`opZ@h?;" EAyN07 BOkÃWdigE%iYXTSJ QF>X9+0~5|cf ~e9e,&y=xu&ʇ)3B`Xmj4U{BН0ĪTVz/H)]Zk㌯? ¤<_ B|ƿET ?{F^SKKJ:\.lg6 R:h6(Z.Ah뜾ޥDh}/,C=%k3TpBInYe�vz9 WnڜJI.D$k qbl@`�<F_K 63 B}<z<x)W eO7:5pr1Pg!oեy fB 9}FW$KcdLs tl=Oo0"tN`~j 2P|"(ܳBM(AGq ZeƯX8 6B Bгg+:NWоN+3^et2:*rN b (9<;+YYE~ gо,�VZf.hn^ ?fٷ@g qef>/rYNJv_BB16p*Y]hu1YM(9U$N2OB=anɲz\8ee!tQ!rg4;f ?9yDhy?ֻwTX~Bi42٢ah /]@07_КښATL:˚*Mxqۂ tov[h|ZЕ.BQe:vӬ'RG0 U ` E9VX17waAz@aH@އ (^(E4M�Ό]3q3<Zޝx_Vf񟜉75k_oLG×}d5qfdi{{ϥ}kމ͞6Rq[BSf R ]{B_fV%0WW,t5 &A.:*XDƿS/OޮBPXtXحi<_ӧC)trDxKQM\E[_0E7;ұv>H|lf6#.W,(":%LSBs =H AzfTv}eR%2Tf:TeTr(D:?iSk\q w=qx] f]o ;N{פn*t4ܚaZFtl`&LAKol 3+O8 Of_ PӟwUyࣼ,8/H{0(B'Uy0sw7#Km~ޟ?еOh`}_Pˎ6>.:][,1i%V8ΫlsܷqBPhS@K]ߛ!RҥsA]kzFgEZ_6qGSA=  ^RVyލSNEճzx-tnϸ]?dS"ۊӮ3(4G:hY?*S})Yw)tRY"KVD6<fB'_&4;dFABޟkGW2:W׉l} /9n?09Q+MP[3;_z@o/j,׋. _ưBo¤AB\j707[\O_N:bnV?Hւ^-faf:ǃ:8WKVh7@16'{ }Ula@YkkfJvhhknvW9o ie7coJ] ]šO)]%2jݗzhPhtAEBoJ;vGj]qÔV֌:ß1/Io*pֺɜ8SSؙ)4(4z(2 g؋,@:ٕIC D ヮ7wt3v܀;>BF3LW).9Ph]d,jZ] ҉[zeRjq4l`Sr SJq\Y鮫yMS(&QLETK@ѵwsש�V[ejcjSb1ЙSBcD^okҟ/"Rrww3TKodPht L)4O_y OR|vs9TㄽUzfB-oQ譧\|@y^- 3XLINv'ׂZRlrgGzk(tp1.}r<F>gQQ8amqurG6|(43:ě=PiϻX{S8N=Ɉ{@dKk5\jKnPh\cJq+m)L3weʴ,ajm7l6(,ͫO\{S+:Hx4NL߾^۬CAHL![ҡǺfǟ?1cLkڕXtdAym_`c-,:fu?L_j`Ї- [b[n~[AB8mD1E>͠qݱkӲ9yKq愶g{BerˀB ]< }>IKOcFKiA` ;&7Ht:9ds |W*t礼 JךiƉ%Qԋd:Ī]sZ,q+:�sx]+~&$n,jN_VZ@t֙6?ݟצdL^q *Y[s�ysxo![z (Հיw џrCòI9Y鳓ps#&.âAUlSN+y;"ѷ:^-(\[agIK9 yFru9=BgE DBA^=P~qNIn5')tP6AJӢy t3+I *8,6ҡA8n&x,c!Ѷ 5鑟$T-9Hr{ŭ..3ss~^_ksr[Bcٙ<X*i7F)KqdaB\h 9ǟџ (tIW"}{GvUY8arLΑM|u\Ak/Hu'rڻ|{"_oGLĞ5E zw?'v)Wy iߓc6M!~mܻ?όvOf<kѻ`H郄+׻x<sScOSM L5ZYXɓ�Ggޕ;"T3FU^n>|-!z4y?27b~El� 9]q^kVϥu/r9b=NfH8ϟ)߿QJvOxe PhyhOv͞ k&<|E%\2{f}䵍OYۨ?3oRv$(4:] ]3)V\S|Fawfxyʵ'jn$zF.=_|]J@Ϸ(tuF3n"> dw$E7'o,؅x WG:J D/ ݧ@@ިs&=WBбBIF]837&fRn2'h_oxaӲ(A)4,zBg%,)< emN& (Lm,{B醻BShP&rt)w|:NE=_17J%o]?V|\lW,1~puk Ph|惘q?g+tWLJ@3מ^^(cOKirZ8)7_P*5d� K5\n-{VxߑT`=g/ܥ>v_ l3eU݉MK3UFH]k>Y ]:+TtI'r$$ Gn!nK UB p.tj?i[[~EShPh^_}?aδVI*t,s[i=w$BO٧gJ/a(`? 嫋(tm z$-!v^%�75)h E7/읹;Y4Y$#�Ph; C ?RwD3ܠBya~_,͜bt=wg^. 3(4K+]*')tB ]Z9#Aia(V9U3{jw(4qs{W.p"GFn]NRaو̈E[ow$ħ\P<ň, A }7 S踗,.fUNO`⻴q\F+6ݒ@\Z!LטwpBBYBL'GzA*t-SK.Zs$z|+4~|~2@/Y ]‡SB[۽:o,m7U&8>x, ?$r>rǗtHoF,<5@|8&i<Nw#] &)4FExҵZzwBp~ݼ1OصǠp,3ߨZi`wQYPzBh <K;˟3 �^qߖh]*ej+XkeJ9.Y%lbŪ|ěE+BB)Р soK oML.OoR#?c^ϵ ͢?BBSh>ϥ~D.8zG'kկ0P.O*jW|dە\Ϡ5s34-TLdfAa*/IzEY*S9.3КBVLrEP셚WPbsqD+.W*t%.u9\Ϡoc௙ꩉ'A/D&f_g }B@W BЙc/uJn6rހBg&Y+AX>spBJ7fjBҿР�>е$]~Buqǯ7U"( ͢ALYts8sR;w'R*ڥ!yx2Ě|Sw;Q6�ys-cAPL]>JѾfm'Bu+VPd^ǩkeoE &F)O<M.<2Ph`)iyn<ٶWQu:rB[aGBϚocW9iZkY:9X5Z`29ixqrˏZiN72MtQQhPhB $$Y, -,.MϘoz3(4LD`l'r naL/²|"LGn؉SGV:(q(45qWKǔU-ѯr8ܪAnmc[נ|6еɿBLa8tnг|7)tf <ȟ_9^q{6%|ͭ+O)t߯PhPh`HjT[)~(tm;c dv: ͢3EN^MaϠSV[fK\<$[.NĽvUz]?qM*jy.R˯tŽKK%zXk-熎'Z?>$BЏ2iS�No4WZ0yXˤ'ŵIzqM)(4@{u4ͥyb S ՙ ]:B�֟<+,@qFJBO\3 },osZl; PhEp5.]m =Mq}B{l>v5ĿO)DE A7<&IXSZl<|9~Br âf4Oe9JDmR uz@!)4@.*7goWY{e%6I#y5RhBoZ WP8aԾ9m%f?gʵ>E"W#Iә]f�(t�{[ g:8Qa|pH= 1|M7S,)/yN64_V{8̈́<F4 Ph`Y71; kыcU{3ܮн�Phv^gmll"�q77)tb&f/<0P `X3>*) r`>cH Eo-%KxB:ɸ4pp{ԂB@~ןk>3 D86ښ'-BC] +ѿyyqbf�е\'r9zf:0lL `̟K Vݱva�䪚L=K+tI1:� |jyMVb ]DT~B7 u� K|BJkBL撮A(Y۽ -܇+ߋjBbDqsB6�(4fӓ|E^}u]9%r�@fĊ\]:9 \n *�pDc{J([b P(4F'@]Bj[^*J%ş� `<zJ8mɟUR8BW޳E%?-�&_=[s2HT6OrWEB;_m*:*BJv\֭AS}Q"3(4)o3J|{X+ㄠ�(44ϼZY }D<w+B5kt2qVAxBdPh�I~b\ B,kAvf3(4VL4B̢B zN.O 6K?(4g Ph�+OLE"(4� .ת?I*ㄠ�(4t~>g Ph�HWh�(4h(4 Ph�-xBz `M~YBB�X_pB(45Ef[' B`&g.@B;KΥ Ph�<O<h(4�PhXu Ph�ƟY4(4�PhPh Phg)4!-Cd+sZ(4�\п 8`Bq ,U@`BRe B@.j,�@-j_)ㄠ�(4�ju9{xZ(4�\x< �W*my�3W ̢ �3nPh��ZEB@^-z{Ph�H{� �-c��(4�43n��1>��(4���@��� M��� ���Ph���B�����������������(4���@��� ���Ph���BSh���B�������������(4���(4���@��� ���Ph���B���B�������������(4���zϟaaІaaA 0 0 Baa6 0 0 maaQaaa���:= endstream endobj 481 0 obj << /Length 2747 /Filter /FlateDecode >> stream xڭYKsFWV 7IX+g` h (:_~�$!'=H0=oztxK&ʦz=Y\NiITr՗Sjkxl,iǞ6- 5i,ә-]:ikxQ5OO[xƑLrT<iRji/CԷS]$ߧ:OZ\޷;v+{T8{=_floFBvO5KN2ǫ{T%N {+,5˙Ri??\:pO3ct 9s: Ϭ{^uTfiYZԮw8َq"KtW o]nbM]/JNiay#Lf1��$2P{^)8Dmؿ>%Vkn'/R~Bɒ ۳LH ;CCrmo}&9zwZ7IpOv $ҌOǐp>6<P#nyV8zo0v_UhV ?߷ 9Ns9+rI|}kq)#w~#D*#ve곀jߣJ+tY\㮿Vx?",yXt+@ךz<cGD@`[˶N&ok\OD!!zXIe '8sFmFxיT=JCG\, Y}HVܼ@?eN"Y&p<D—7bs$UЪ66}$A}d0u\'}Pk3@>$gtUmZ>u<A+3ŀӉh/qjMu|δN e6'FG+F].2�{,G?H# gp@i א6/f`k|k8׌?nkD' _k~?VS׊a3%n^Wy*Hĝjи2ZK4uIay>.<b,m8*Z2>/˴0G 0ikȒŶud}"Dnmnv`s,6s66k'H8 @Lu1+ij&Y HQ@9o|Gę_Wyn86PU?|&F~6^bCԗ1+H:S8 CHe@$W!rNtk'jA%ϙɦ)f5E!/̖XcL7�c>�-9sR2H-d3Դ@n^ 4fTh7i  71,C };#0{(,tr%? ^dr^"#!SBพӜ#tXGb"9ff fM�jHLT ìM3hNS餎$ƃ pɇN6 p "PEо`浀k;1q* /n%z}73Q]ȼ zV R( 0KVI~XQJ´FmzMi3[c:MkQabgSJIX9yī.a1#Tu;jAm͗2<ǎ2u,ki;'3!(6`laۈR#k{.X㈳A%I,iC0H1Ed g{;İX"lPnwLXm7 P%f_2S,$<$ Ce? S`J,K-LE y 5#ntq[ e(Ȩ{H1=E|%Q,-l2Nk�gE\Ogr&Gwi]{PyT2'ELJw0&V9XH E1= X`r.A"Nzi!ήA@*fނ0ZEC8A`W|2#Zɗd+ oIzxo -`&gOl"+h_1;s_]_UrD`QmX򌇻0 }�KJ#/=sDis<jV:Oi X]ޯ8ޛů(+N Y!9+d4Yis-X "^]_ ?Q9%*Uh6Tlh.`L: g\J^&KR1zAq/|Xp6;^KK˖V \% ,01QA T'-A.-ˑGOxU/.vy%pF (\ KrE֠1m[A+'–!)l#@su#�EJ</8AhM7kƠ\%� ^@|zFz.p w݃nXn/eNa= ǥ1+3nX_|pImc qZ0 vz$EIWa.ޮV$_1}ax%܀BU 3Ul/luB7oÿ ~R'en?IE2'�!"gcl$߽*W:=5He?4)ɋœ/ endstream endobj 486 0 obj << /Length 1269 /Filter /FlateDecode >> stream xڵW[OF~WTzfl'v[AKT$& 8.= ۹~2noAGyfVEMubjYM Zԧ@+aCб* BUNN`JF3yաП\n9C*sK5"7VC!]? tXPRV=pbבPtsQVu)sdpeAM_YN3 j2``Cƪ[3%2 xǙګS\ g^ ,$M`ϱNPbqiGUMs+G;^ܢ�@!0\y:9<Czl^||XER xKR^KYIKЃBD! _3H($PޡPa ]$5F<o2בnGylAJI5*4K�'IMFU�^az'Lyä Q @XuiL7?iel`a=|ִWkDF\y&AE+DVBAQS>@ǾH4 @4jֱBk?.5&0]a&rL8، *hdmޅ Yc3eOw5] {Y<꥔2Q<'T�Űd$ u^xR,0kor)} D%01j%yx,@Eich;IbFToCa! dVaS/'<bƄPnAM%Q_dY>zw|@M.4Bq*42Wk5 cSh?N w97%GˍxBxNVv]qv[(cNd{BVBQqܐHt_Edg\Ҥcq_J€<ǜFP}ۧy&  rWfz'QwF~|SM[TI~ ]cv߽.õYA74] >ښ<d=}[KhUĩkUGj{Nuoוq,WDkS1_ gIµ>Nzݷ%R9sߋY4K3/ z'Iyg;kô }oZwSEv<ذ6GʭֿX[ endstream endobj 504 0 obj << /Length1 1952 /Length2 14521 /Length3 0 /Length 15721 /Filter /FlateDecode >> stream xڍT] ppwwwww�=C {}~?{1{VͪUsUdD*tB@q{;:&zFn&#L_;,:ގ_ 'ˇM(gov0�ع8̌\%;qD,Mr�i{;3,9}PP8h ,M�rF.@ۏMl�*&@IAkNodLodOE pt�(Nn@SFÒT-,P7sq7r> 6&@;W;St,@h.DwHdig9PwpٙA4q7r312 Y@\H `/}&N.Ζ6hd#5ٙ\aO hq 5 jv@)ѿ8&l@�###;'��zX0qO' �@_K3?Xog#7 o"X&& hniO3?N�Əc0DŽxC rJr4I),lcc11Y?FURvf� qk2(Z* o1@�?hy 7d[͟~F61>c7?6R5Yha{r1!;sYhhbb!o>X-x�cL?^*X=Rc軑'G?cIM6#!`fGG� B �߈ 08 ߈#?#`0_ �}d5t` +o=f/QG6?6TlvzNG?9|lf.Xg/L*?c\,\QG@ǿG>?̡G.)>4]^7 xu۟'Ƞ^vt}BJUt':ڇ+Fy+BSx[RϋA~;_B 0xt>>ୠdEh V'je^Ū +4]"rÇF@q{7?N(H{[{9qkRٹ[ ub[(MwטMy#+!I 2~XN!t|h=&N6&�r hP2 j2\<KW|$MPS^snjx,n)[;>\?G( Y YT3 ys*bʣα%:_}npypb*N=+6%_~NiEA6؝qa~cIn bF<d\@uSӘQz2<%›@:&tzzTӛt7 <?nQq-Mֱg1j_;_dMnaIZ"GNZ.keh5Uʭz*BϹQuf8%xރߒ -(y${/&]TŃ5K/<@}ZV`jqMMf ){ǫ$%se`D\KDˣuԨwz1<n"l<:xB'lKYrIE~⊼\LӴQw6n8qqa'PAfS\1ܚ mm*p>}*q�ٙ0!>4,Ş-ڨw6Man&PՔ뇰VI4rPN܄Q"iy=S'ݣO0gF(Y/V($D$vNۤ>ﳪgRf+4K ߟX%Rњ+V}Oݯ{k+KͬxLHliO+oQ7ұghU=WSUa)Es!`1su\^bX)EʎC&E2=FPa^e[f- EWT!kPQd47YXo #`֔Iq5.wOX; u~'ZhwIoh&d=H~D+n?|3fw PQB2aȕ)"ɣ29QZQ\7!t}RJ7Qw u㟮L4ж^YѤ$uuv%`컷 t\>Z&^ 5JXu xBc\$Yj|5 J6 ߊ$~GX.IʮF]3~M灼0֚2oͣ6qk�װٺ�mzsWO˾ ;<|Mt3d)xll;Dnڄ`.ؚތfN$=-E[HN6-vCЁOT(Nm;sq 5`_Ea!ĢEڷY!}?>i;bhD"/:v}"$M$m7?,d WF _q}y*K:c%k*{=?^qM0e>х<c 'V "XqA ʭ{x} 9оl<xRFWޛt-B]|AWº>r 9 ,{?R^ Gɭ̫=m  _4dXox9;Ťesztk ֪1 $.-zwG ̃EB~NFxxg!=5F*񹕟_ʢ<CE9yVGr+ `\}Eud^fM#^j,C[Qڮg E r lQmIk>2R.j1b|nk4>$^YMBi>Yg2+TAW2bg�R )%|.wo6Q�=jNuЋK >[-%7X-[Aps1gL&b\ymgcLR%CVF4հE9|:u\O<5_ri{|.;98n-""�\"<Z ԣ\a ZYjx9GhjZB;{m�mߵ:iNNokh6[tl}UuSHCby{8yzOE5�ۣ֟ uEƭN,)]8 qޑPX&e*lrl8] &$/3h TQ]+1�1G唐NVٱYf<.ݒ=3U٨DtN+6펠AXy{xmKQ."sv0Om8)NVl\8[NkѴR]G\V!"0YG:k =@Ca{zHz}0z‡̀ @9w^ٺd01</>=喤>jTˎAg�NR2ה�5p��L 0ZVa= ù"8[cz6'Ц4\~IQJ2}"YEPbÌ f5"veJuTT@~ܰCIzL-8, k1�h<˅(TѿFm FVd=u ,= 3Cdny(<[,wYWj'‰0wi S>g`UT� | 27J/})>[2!Sg'.j- 蝁qTQr٠ 7ʂ$7-t5 k]Yxaas_}�IeIb̓3Mp5 W}% n7VO%Ǩ2mSWe)},hq( Z/Ktg˔p ׉F%s!|x8~9କ yI~ QRɣ  2af:y*YaWb)< (qm':eȋ{q[TAGu _-q^6G&G0?4+MN< a n$8_?T,Uh CSA8k'!-]B>o,$fmգtR!ڈRFiq,Ǯ,9}~tсl!3ǁ<:cׄ4<͝ugh)񹨟U'sBu r>2Tetn,>_w, o/ӕŌVDڻq%Awo^6?_2hӻ=js% &`T^[ؼ(u!⏄0}y{GHc+yV/vz#5DmdO_y6Ѻ[ZH irşRJ@@S$1ЭhA?OT~cD:čP4k}Ƃ>hQ fpb0Tdb@Wmq@Р6PcVay2Q [YL[̒ ϲFUf |L* 5^P <x9)Ay3HLn>B�T4UAj h}[EZk &I_d wОAWQv*+|+F#}{X9r.[ n^^2>k)7+JE<oaξԚK2_J3M29y{wz3XZsÃRA8.Izmeew=#5bB�~RAMP L.,ru֘*1lm@v'!@2P…֞pr<!BX쪜nf*bl &y@QqBϟ@'-'(0[4slA%^Z3?-N="<nE`1 Z.J2NLDm_Uu2ELFtJ4|rpW<-Y®79vGf]05A#8Py#iBL2^b<XcX(dhd1={1#ij˩/O>Nwӎ.-^\o2 6jaT 'OoKm,^&յQ/](?]ӣ S68u{aVqꔀF <<iП;^Θ<LzB05)XpΞTlZ;csR1_βl Slj׮QtqnO`_jIQ5h^Mw*zfLSqLtK2z)@XF|wׁ%7uh2LϞ )e+'*�x^KtW 7/0#UC$`Rpq=wk( pe&;ܣ4*P#Mg=>F 7 ͼ N -z<w7di1T$Hd0uVbܘ `C6m%DZ8TR:r2g{&R(5z&4a KNSڦ#8uB_s}M)az8v uֽX?D6|7vĭ}-hHPqx[_ZXa^ U~?3 @^s4# .eHƒԚ 8z0냐Ot ;I`DW2 3h҃^:-36˚}M:w7md$6opnF&( Stpe~wץHO W岲Hrin�mTU}B'1pD#]hf'&i业gPj $gWFY+Zx"k\tbYgU"[@H_]iShżo+˰^9h{&'r{OH$]IΔri53w˝褡7ixkp/ey|ŗ)?O"<rDbxuc^<`ڪ'74:Eӥ)F/k6G`w_NO|[!zռG$/$jD%kHIY]d;kA`;奰Dse2QhD<amR9(l͒ǘ˹C,BQ]l{ׁ`L<�aSs_mh,=f{Іnlݟ=*뷺}e 2o/YEe=& +)uv`%wpO81͜H,[i/(C]H:,r7P. hz'=7#`艊ֹ2}*_(Qz xXH-#d]�K2.phZ @%su,LP;!@HqY־628T+"sFpaAu]^uX3d<Ш]ӯ{աMTUޔ7$ffXB% AX/I}(d>3C~5 o|Fm~X"z{esvР"eҜ7_uLQc0a@5G#[ARQVBQŋF`%rsz"ḿ/7c}36T&O|X2|te,S>SNpETo G Bj{zϯ*qq|;H@gV˛vOmji4 [uPv1Z( n֯=lBiZPuAi6AԖ,g|mR2,ɺnk>\")i7p̍h~S7OA/1\0#gh.-a'*j`k az~;(%"R[G[Ys1DT/Z= <n)Mu??~JD)qq© R Bw-[vk )H{;!&y.xX`Y$Gm^fj~ug+9a)L>Ma6r,_1T,/݌ɱ?{4 u+J {9DϦqH̵JWOqGHϾaS8i42&{L?+Av\Lr{iCɂC2DR ԇpp҈Lje8?d$嵏6Է|؍ٸјuM:+^ 7o$0 k:O<yFGC,ŮU/ (d{ʥ&iqgbB<{Ssﳇ dG= E= B\ y$y*'%8#Yg(AMW¤aؠ-^ͱ!mb<qrL#%owBToJw�pyΥ3}?söenz!*qZcZ8uvϕ9,E9 Y[!bc17S8;T^Audi,v))Ldj7:)p.(7W|ݯ,1O主M.taO&ɃiA&;.G&J> qkd``+~GX=#װ0L Gl~'As5\‡a\ 0!*}/�.GoIٱX4ugsrƷFlڽHـ^Ҿ !i2_jg _XUw n4޼!ՈBac V_:_bqJ\xFZW ޜPKv}< *6e `y|A#◕+񬲲vDtBA3B<(F9[pnFe7,*/Hc>t <MukO~Y ܛLtötNlnfnTDϮGvdl?OID3Zك:͓˱"D؆_�Pգo\-v@ɯs Xi&OpΓ= SoReg]NEAsm6#>Blw`SBŦ$ !pߋ*vCi4}.sJEJuA@0yu5vۘ`o6DsȐ7*L3 2#\-+۪+Y)liAH:?׺MKs xAE w'4Dt۫x8P0[?[d~9ȖUPY$ye!ے&s| RAhH@jy�+*j$4?8gI Q~&2a.A*r#+[Q:jsA'7JIe 1ˀ(B%X|'i劺&Tb㣆Ď@騂Y偬ypwx3w2.}8l8<(ܴ}!iH1 QW^ِ}G%1@JCS8sl$i m~i(.}x�-xlja7/l VlEэ Ϩ?^-;FM@8?<4(+Go}'*ei~wM( R?]Z9)Lu\ڇ0{9@S![vhz�e(맖[A-0c.|B)WYʃt b34^C¿b_;e,�9A)G=?TU7|-=5U2qKneu`w4M-k(*aQ?JGz׏$(<|p@=av܃r]Ha["VG$`�0dHF==~1%Oٺ % ĝj 輔{Jk u/$BHB04\5%jS '(;4A2|X�E~J Ki(lJ*9#+3I&${{PmVۧ$ yB6l+_- ?f>iC1SRDM7@g k|=eyR||Uzt:gN/)8@dtʏ l}#x^. 0w< )_2V~˜ىEXUk<ɴY"؉NY d˴fO$&|x 屜MT<ixwԱ A@A L,1YA^ϣ`r$8Ӳ窰bDP odH{, h4[~H[I 8tż\"P؇A}V�qLS4s!3Жq?5 X$$HHcw>4f&?U&lY{W,kaKm=D@?yaƩ4eeМ0I fKP :!j'vx*O`g8ӟ,ekFLġ rmZ@N7mz߻FFJMEm�hR\mTkV>*P5ihU ä�?8u3S@y@('@\&p_=_۪lqnDq&T -vTդ}vQ?iG仩 tӆ"K*+�gae5F;c%XN|q=m[fD<jf8D sixk}$^ Y@ҮXhu@ ӌҁo@fZj>o$BMƏ8 6ζHÑ\"`ם̱30+0f |:i*̽xg)yږ6ف(r kMH'E-W{BpD?w A)I=(0n 7@fT0K3#\v�a$ZX<ܣK:%g)[ AI6|eEG+ɗFi9qq"CyR'sfPW#CsMfkݗ;ZtvI$2" yD]3{M_7XCϫBI6ܒu=ČL͢'j(V,E@-$Rfᖓjg{ > <k}<>Fa{MIEdC)};x?g]P*|^x:C_xEJ$K|c+V]01 (| 9-T</͔#QJ;z/ mvN_om~bgFyHٵ -m,ڙBUBqϯ�SB/sn\2f[*x~]];TUYMOh #jQ޳ʩnƣ93_T- LvSQ9ԅnhVCxiX&x'nJOS0}sE KtL΋a4Tap:Z@_I_.9=c#v b12z8n M"FWߏ:NӡgK24m P}oؚWoIdr!ƾq%C;ҪL0?d*򲿀'IPM36A Ihm}YvT0Fb><N]^-l&kxieuŸ(R$ ERy6`&~ _xْiM"qE8i&'{lz�bnWnQg�ׅIN$<ic?qkUK:3DTR u)z ;cc;Rv{]I`4pn ~))Ȣ+wfBdy9G(:-g7բz)!/JPTNqqҹ1Z5 F{LPfbՙΘǣ�O-<~(Be$˘ɱyb:]FV[8  O0s/Cſm`% )~+Pm73_T<>4$䥒 &DE2AAqȜz#_JH]?SjU*#q%ΩJEe$tkz V>h#Dx@9NP e!3'[`(dpӎA֛c>L){©"o{yjߟcA{'}JqPAc69BNnB"\\ KXQucrRi̊׾gUI_ס:=�P:Cpb'YٶTnB{az ?2A�T;ìRAkQ<E5VT=ƌ֤F<&,~.fKsK6Q܂ zߧJ*tLXPt ̨i!ɷeeI7pVIh,x}X6*kKXfAgҐmaՙKe}|ȯغk:#co%(, DN#xПԆ.=L {sU|u*ExjT s~7^{ڧ,?)ˎFNG�Qc\z[a�<rY(12EsG^IEd>^=XU[۠okGw%Bh**6t݃ZPy-bȂ: ek撂_rrlzC>1%EZv.ONI؆Rb&1qꋻs>ؚ RJE@W=2iƫ ->ExFj@05=ٔwq-m=oH\m'8jvmK2E$,ߣ2Ɗg^/~2<Bd!e0X! Xx0[n,Iش186s2'Ϫe=WN3ߟ=P^GE-ίwu%f4V]PY"-cOs4{#7 QH'&GM{2qca\ S=yGZwLU>GsU' P8I@r3Uɀrokӡ{[\0)aw3"ʤL_6Hrg,ۛS&KxҭGˏ%ɦj:.֧d L} TB5j{w\OSvP9iU< (i|l Uێ ωA,a+#s@pR>-1`?QPx&\hn DwW֋s'դCmc'5D]@F"A\E,2Og޴~kfz|7 -6[Yci.\l hU@:.%3kfrI7Q <2%#{<xI 5au9h| N xs˨&!}K}&4&($iJZ-kqS:N@.[ '&n28fphcYpi]-"NXݱV-mfPwq<Nw 6w'oI{YI2$ot襁 iBA4ErNwqg&G#h.ic/~67S,b{<fb=_ m=~f,&T9-t2lmkt][^Pz <)(4D,t>fes8T 8}kQU>8LLP$ Ri3'TI U ?"2帿< ̄AXRQ4simXPIq{6]+Eulm~- џh]s#xS1kSq x"|�CK.#N X:s'�F ?Nzwѫ/e?`}twP3=%6b`lX27?& R1̆s7&;40R[|Nτŗg2p1J{"EQ2_Qqx 7%_<nǎ/ Rg>5 %31G"_)`֧pJ曥8L@GsC/dcVZI7*t])x'([zAx L,P]_xX h}[/&s=f-JKџY@E~)|/Y*U絡g_ٞ~b{Qs6z ݽzN΄֙?Ψ(1XaEs+2o\oCINgCȏٟAЫ _d2vw>iyB<$/fмME,Ȟ IylB23&5 PU0<og7D@G/+Q|$DLk;…R{SQA|$iyڹcGF!] bQTgBnkoh.(1D|4z|ƿ!,capR#B @ʈOb{챯j}rJZV 0 !V94O[R0QG~#@_"$jșq8X fpj6ۑ/v\k%7j/;͝4HlvwX4k$i):YID*kOنUz+3)ǣg" &-1p T"ޜUI؆K6~+Q f\in`+:?^)W=xZ`/rJG ٯw.nJF{e n OxgUQQ9<f{8~0|K­" TRE$PmhvqD5G_%,˘: F)ڈo-f.3crAR@-6 ,s'̒ZRԄge�R?Hض1j_}>Y<&^+)_qhAMuݻl]]zþR1XM͟BYغ@~[P;t% *n}\R N,B<*!f8 $ yEmv{˰$-O `so*~/ k21,8vЯnnwQsoc3_HZV+GHF²jqPd9ZcQ솼/a԰1Dm렻(L6 HfauktgWer6a-<- D5J& ɳ:Mube)>xg4 QqP>W}m!*iK/GG |;e VGg-\}.5i{,vJg3d9Lh<ܴhD>A'r|kJi"tRO71h$r G:P9!3, j17@#'E$Atc}g(}u[^p:1 cG.mf7*(̭|w]ger2f-q& yz kp ` P0T{Dyp=FMͦ>F6+/U9D{-`GH%£9w6q<X: ] !Rۨ83L_D@pcεhp%nKKqwFNJ $/ھ+%NV1˪$CEmo,[0ͣ[P_)^lF7w|_}7*߱'UuReFyaB-<g _�+YN2#T = \2+I5n`R¬T cde|Z@g"2V.$^rqPRtEW4/2QiuoVछpp0Mk,~MDZ79o+d/]8I= 㩠<t:kKQ$Nv2 _{c ٨Zڒxui*ޑ>ƟmO 3MДe@iKKOq7)'˷7լf(4TQÕ LgR SŒ$kJ.U _,+Wu~dyw\Q璇&62})F�|kbQM] K#*o[߽~~̖}~J|G 2W>n͡jSа(xoڿmQhE ~seIE64^}n=j%P͢R^aTA NBTum]efAv= Z"z}<p8dJ̲FN)4X[!~ߐS�:.2 endstream endobj 506 0 obj << /Length1 2053 /Length2 14049 /Length3 0 /Length 15289 /Filter /FlateDecode >> stream xڍP\ $8o݂;'hiwn=9ܓޫckεɉ @z@q=37@DV 3 \_9<*d PM&kf( HٛY̜LL�&&l&�Yh O.r112{G�>5owD_ kg x˨kP�'7##-ƈhbg Pm(t-Pc'(G2sԵ&@K7{K -;@IR o �4o db>J`hbȋ09t- 25:蚘].@\3@?lmLllMW6Y,,v'jb3?kf rt/2440=PR7o�ZNƌ%PvdK d0|t71:�v6@w?&v�=%obۘ84Ə'ͷ 3�Y;6UEiRXpggг3Y�L�oo?1(iip[KɠgmA6@�Τy v7E[zu-L̝xg{ݐm5UgAW'i!BFV h`bo!)77*lMp�LLGsfoY{,�]]gxcag2-02X\�o N(?m~#N�o`q%(ҿ[-o(/`TX�[߈ /zSF? 3|KiLo~fb|_cg+㷛ś*?/?1?3ߐ.Foo?o[Vz>a~+jo<~w- ޼Ucፋ>?| 7a׷y{}mo 83ks&QKw]i|G]ns+7؅-Fu#DzXY;Jqr~ao<H>ۋd#xy =NսE#s;w9TByϐg~ 'A;wBF%w?csU` uY-Qf!Q@�y62I*/=Z#B* !\=+5[%q"omo"ɀ[ƒJm29^sm?`Τ ٝ(&uGP s,dryLQDz F-eit:!Ap_KX¥k\+=W�$b6&9IW+C{5+ 6\jwy-~+Ż 1oc`P O6괄~ &eQʮЈ=MC)UqeS6])pLN}G80(6v,8]xH**zƜV̪02q.ŀ1_6C#;xLRg DΧ3=q˗4^ݴ8{6Qc6s Yojr "yTSvw3[XQC \kv(!;*9lεmvpX*l DVQL -f5u*̄ho 蘁I_0B3LZq)e37 l3QIL}" ET>h 3Ӵ.ϨYL6_Kb1 8%Ug_v2^S5jSzS,A~ރ>,<,bwNo3q @-Aŵxz-v CQ Q.y'tV"=3%&|zT\4 ճ8՞LfuC<ABrUTt/L]Ԥ=rPHz cQKFݱl1VUT<,iFmI:ު4.C.|N3C7-w:`evHU[bY/6 y3析%\nNO\G?L;yVFh>\ȓ,Ov2+?s7JF=6~g+B'6W8,w--^MDK݁ci!PpcOɣLx�\m̓ ;^"Cۏv|&&%"da,̦2_tdM`<|㖂:~$ PTz2;G^T>c/T}ΑrT\{sk_؊щ#TJ݆գ|[),yќaf+~-=? m\LSMzzGuMI0ZAs(7#u=,1sX.VUW@[0#ں-$N0b"pgk )8O#hww6K (lsV_y�5"x3E[.c=?=j Y)bޓL?CjeX(2=]- [caS4liӰNχcHaWɾ#8n(Y|HOBVM?՘GZQh *jG# ̹R78/4 w;)^ڎ(!(g1 >,H�[9f?F/a =|›F#:թz7ptB[+spOAV�[ vO86.e&. ˏQ| F $HfrN 5j:d=h!f~wQz�~d"[IfQOKfvIP:xs^FeOsY{U݋�/E42m~͉NWQ gt4^πՏ\Lj.�||֬8i8wI-�:VϪU4Qiנ.e:Jb(_rggo5J\?̦^Kk=cg#^t:^C%S)O ò1TGN]>_ qZvjh =J>KR/7pK)Vq&~@dAhW[R+hv2D _]PПs>&ǖY6gA^-�PԨD�_[m<3B/C̱(7>L#qMR??Wwbd=hp)ԗ W.q} P ŤiB69;12a@hg m i޸|kN.YUdLa=?’},ǚKw8Sk^z֨w(Z )PDD- YcpS٣L^ʊ ⇈ʜ̤OiZZosW,JT ɻUyL'Lv}*ٳ\w8r n?c7 t D)m r&eL@eR?eTYAr5r< 8iFB <i`Yך,t_c_! #GNO9m<g6#gg)0~O+xw2_J_rC˸CQ"Cy5*"l?ғ{ڸ&Bմc q<R[uրCJons+,4sx띆@B]uDFCvR ڬᚡ_V|Dh0BZO #X-W8\oKw/_l!_dmpkfeIi ?ЦEA ul;q_p⵿_}&@zAn`Yh^!|RVMGos{ֆzT W8o ]Xh!ppݶ$ :K*16*nQuY_|q(=@% eYYOq]&%:ǽ)gW�rۡuoiM%xK]\IW̝mt8*,^[ݏmMSR-Y+mGy#:7<WGX0Jdnw :3{3go0D5BƘwIlaq~gdyApgJ=LUM?)=:_@i8^.n1Hƚ!HY4^( <\R5MzTnܰ�fe--XgcvmJzRv>] xͯFKqVg#lY Qco6<w&BxmA q$}{"KGyYjd'H꾉;ܨ {“;Ak̠rx䡉 `DGkT9#7" SOgÐEIr.ĘRn=)\"2&!2B[ԫTO}MdnǦ 6i: $UvBmfBJ/SðB #~ V7 w;cγl\G7MY8ܤ(\"Ggy9]6ok5n@p.(gGTdt5<,r^l070뱰mS}@\1yj?jբK|ʡ͸j0:x64|8bW>D*a6 xg)jWko`Sd!.rJR2Z=}SB L>0R XT\[yk[Z$pmԭ_!|tP Ø`W89?Fa~4ޒg#(hXl[}m tܭ޹8srA,m�O۸)pmaIn*k)f(hP(APUZ}Ǯ{9삜4i`n<͞\a^l9/)=y![W^2Fmr}Mb(,. D+riuD4\9-|{I?9ZnHl%.2y'O#>n>LI '& 0uWW5"')tj y4{FmKd\f ɥdI&& J7s:iͅ3'=0 ]w3S0m"&C<T (WV ǐ)z0!a5H WU)O=eP訴b<U4튶*68CϺbbWHjCszq/4%y1H֙Q;Bǡݺ|݊B(k7w](üMG5?Q !RqJgRgJadgZ?mZ4:nWJ#S)jK"Q ofg8`'-ew" "g59~`!mvhX˚gP7cfs!&gq=sPTGץT9_>q_u['OS$ nb"O!;`5wsL^[4.z?+|+mN Ȩ#1UBa<#rAmqcFmRk}${g\Xˋa+"-0pZ/b`'@5f sυ/0&?hqH\֙gu_[rXka>tPrg. *%3<fR M̜�. �ij3x<mOGKAK;%E P:5y0G�n)0WX4]2`|7L~j�%,t7u}@BoX,E#%�MYJIF C f=i JVA^6)* 1R&9k;D)+^X klwɡ%Y%Ǥc񇥳Msɑ_{ddE˭:3n#{8ҧZw`2xr\|cYT5Cӯ6\E [9S+N[κr?NX>kh*m)kwr-ךaMD#*{ }&z--ٮ)' |*rB5(mKN,B5QZ7!5 *gfXb /lyU={6X((Ql$HcBRWhx0qD< ҳ+ <9zNW-GX~]jq]C}x b-vgX"!Zw wm5J2 ?}Y}afk9n]Wn5DD5Lm@i8bͰ'`A(K>Jx EaOG3N0lEθv|D8*Nn7WKUȢh_wL^S�c.Iʨ[B&⥤,oP'G+S2M$*PؓpxsB= $O$E=Q5z)w (f⫺*JHOٗLxÀoKi= $?{}=9pWN'eW`@Ű8LqjpUyJ~~lbU5 A_ۂɞzo~{Tjd�R?LXhU%NA*dWJoL($,6>߼U8 5p!l$& 6әe-QPAnK0W# sJFdH� ot:J4Ǡ&Cl;BlRem[D]UNtu>v׭k=W Oud_ey@&GO|18\ #ˆCC@NHUa \p�xNNC9ݠ< -W`̣/&!>3v[@>Y[+ؤF%?V*4W 4{2rRI~El>3 ~{zǪx6MR=,>| !"**)6?ܠ(J߶oviײ[F 9,8M=yEaDfu0Mrf8N; f;CNoS{E B#9"#}TxA W SF&a잶l񓋋݌>Wcىw{zERﻛ=OUWbg</~=));v }`r%G%̖O=[2tjWC1yf˧1|6JMR+=1X N}>n#k6ZZMg<.bIISkW>Yx j2H@ÀϤG<a~aֈ܂R MP߭Opsg ;U&! j2|a�Q m4޻+B CÈ%Hskoz#m1FMXd7hJC;r:6 g>&x.VNmu 7paPک i%8td,Jfݻtr/W,0+qo̫w[V-JUf`UOBPG||w=> (Mp,P|'GcIXh2k^tP/`6bьH//ǃsEB}E|( BLk.5t80(VN{/M\z85 Cq_2/~upI89ŪH@ hV= sޓ,K3u.~V�d oeLBL< Wab8#:�PAG( OG):Ls\cn4'ZW O2}Бᔅ%hRw{F{ >ZMaZ{96K{\"wf#WESNaK}sƢjsZ0U+.TH�6Iڏ# M ?kRwd^{EŐm> xf KNq1 X& H:W )+{PKs2t;w-iId#%5N+Z#b]AJk&6|[}wi:#KT,Jހ5u{`pϲsuzÉی{f^iG^ؤ9y^ߵ#C#Oac7f阗\ݔl]4.ٜmizvz$%mTQS*ۂ%XBY v@؜DӼ :HeB~&'q/-p>R٫ n {6v\/78r f z)J~KeA!X<l2~;r޸+OŮ�7i8{9@#^ ["(۲rȾ3l 7:^~~0g>LE c@G5=&핞Ŋ<bpV\Ȁ3(yiA"Rpiכ` _<)NM ћό%PBA9Xi{r[&6vH?5}fM4C I0S d&xBKb>-ɇWHi{*߉ɜC_y0*l �6V~?ױխy8AK% \ <!gF裓A HOyy=r5d׻3>F$+BԽU}XxS#I"Xn(n.5bqk9!=3t3Nscu :Oe>4 wƝk[MA Q~(LD<N[> oUO]8P@*TgLm^dg:^-0F;u2^u]q-x*檞\4t#r;Ъ2H'rh,}/2?6wG , \^J 9X=SKNC&S@6h9k s.goڥGQ6q]&Cܬ.:*km|Bౣ3Mn_ݳH=9k:8xNtM%{!=1*/YKE1,%xDL'OL# JL5ÏVa?;֨ưl,͹4#BKͩF3Ћ ĺKSʻwDq(Be (ɑL9�zAbiUqMX WFHI,XW2t,k -"31U=v*jAqDj1pp ]rR9ny3GNP)73С|VZ̯sB�N R|+ռQ)֢XT_9;u]߻ ! Bq<"h˦or;.:G^T-3�{,.x~.\QWoƪX u$WqZC;=^TI u] *J[+gc<ι+oJt^Z{ `$<2"T�`# =5Nq$ 3v%9#<ԏu_܈Q@GADP%hq+ ̞1S9F-cٮ] IA'#O 9]:6vtMe/BJUi"@קf51wI,/A{_ K7vm,R47:<h Z7Z'� d6Ke!h$Wf"N &wTs2ԽilnYG1yF/~rm*E3Gdvvv#آa`2~82idaU}[;ўI񑵷Pw$*$,3 5%<%+-Rsߧ`J㓻&ѼtNHEwAoxh&So޾AoJgr\Xx\~KbSڦ{Rx`;h:`azq8Mq<BO*w򔩆&X*^FcIyIun 3L<('žINj g驄S7J_�WE6'$P %\G"m4~Uzk Ug,Y,X,q v^^?߆&NU8E#H(c@Ȕ{}g˿fDRw%L9Rޅ"' Vh  }y⅖wZma#MIUͫOMñK{'Er_jgoܹ@KQfR. Ք3k/Y!ySڇ< \!mZ.M$*'9Jr k£X ⅟HXdmHW)HYtuX酥CXN~EPdL`yrgElM4VXH`Z8Ydw_*V*pR1՚oOx#khg1J|/1,?=| b;2nw+V {2n L5Lqs}GLӡYS$D7=S#颱d `*sg㽻P*́d#P~"}kBlϗ7}hnʯpg/O%kc =3_8X`r]O:_'tz'`7u @d(z@a &۹+~Y'O7-U;$jc<_W77|�J!Cl<(sdz~Tk3h(4CV4\}a7ecS]>9E@$Τ[0dZͻ$m>m߹SK@x˲�:I fmFߟ&2W^_Quh(~||a/sƴFް0[G"$'vq={p`#^i%`fjY^ ՗et\R2Ԙ9fV%ݱV>$$'߬ Ђ5須b) :?,#-RyAyѵlAhF}ܦs+)7Oz1b^)qs)cUoUr rrtVA36'UTVEGvI/]I&ϓcBNd�Vքq[l9v |O{nbXiE Ȅs89Βm󪧰~4lk*qbh.,:<˂UzJgx;sr0P<yE[1ah[#~s2͍9bwbݜBu�Z55z˚<$JQZR j d4-F躌vq<\%7T|ldpՄfA1'SE`z?پbm Lp[mщξM-8k),-u6Fe?=M*6=Dž }L@}:čګҹg"-Ѥr2A6jc*x\caiK&\āC"jj$OGCǾyۜ#KG(ޔ5hH1Z$QiREOcɴ&9-ZY v R7s}GDR=aJߤYD3HMrxZn1zOsBz*wݡJtE4+GjVSKj6q|k7z8Ze6\t\.?%DNLyW.ϛܿʹ>$?=& |Bړپ-V\%auC.>J _(9n1| lyuneymrgKC^Uߩ-ߜfJ}?.2@3pl~e,QLs?2~@c"^R}h5, ϡijw:~|v[jD9/5>ymde*b8-P4K*nZi k?7ViN;Vۅ.T!`}fҌ όlUQiD}?` ϭEP%ו9Nz7ꆦ{h9=)85<YG,}"?ԗ%&bXљ$6&˥6y+7jRXLf)^[j;+B;k(KJZ`p16x0`iN`%c?xrs<rGЗvz.a?Q `{pS5Ցbt&<~ܞN@IiѢj|q=vp!xG/f<o!ZJhUaLƒ4.a4\; t0JfW&AO d,.Fh<iɰdF+\!MDd5TRύUQɥ; fZO_nE*+!Ɏ؞*'is Zb$Kہ5 l;$ RQ7޴MOBV3Ͳe5oQS׮+8(U5!nj?�𒽪vv]WH;H}9 ^We6'?NeefTpTU3U ]ew ?a]sO^Yf4b֩3IVcHE*]N)G T-E/C-!c9j%ar3\:UK}6Hq~A{#0$;vKƆs(@ 7�U-X3ļTRi#f0Nذ+jOqmh* sO _@sc8. (?u[fv[j++2my]ڤ;^Gsƃ R6rE\t-|O@W#IPYAIXX頁nބS$w-xFwUjHO;|]"H s?5}w7\9P-qe ݳX9u uY {k;ţF#~HuSeA+*dyWcQQyv%aDJvڜ"*hm~Q'l>CњҒ\w͊-2^ZwϿ㵢,\&Mo82HO&` ,=.-3R۰/\1TNj>thgzQ,DrW Y_}ᔨ^ph< yxo{tB(!�$72qeCȪo(C/pgl&Jݟx a<X5$Y@3H-Hχa ۀz΃#?" )=zOĸ t"2ԣNnI`=#`Bԓ˧d/Ig& $ , g3aTZm+cXÍґJ Ɩi2FMiTIE$fx}Iub͇G\^ iCdpVTHr/: (rh,{|QȳoA3<[ҡؘjI:욦\咾 Fdki 8@g2>yn|RonYp\7;<`9f:љMhu H(Ԕv+wP~! V|05jo]Ố$Sn8aYO+82E_]F^'e X6>d̝lFƲP?}Zin^~fj+2GS!rBԸI304xPfE1*gp0dYDj$4RF28� ?/pa؈Bb{M HA9ɂyKX]-*r\ 3嫖AN)*S0ŸJ+\PD QjTڪJ+=tv~Xz@4$No926Qh업7@gs9SYHTJ^ <09K}!!?(\�6 %dFa֌~VǺ3O앴N5*VC. {;;F>hN-L.43ҞJR{FL\mc&:w*ӚY#=n]V)S{|s.*t|!?5{�wf.HzF>6m/7G#o8w$ZSig4@؋xT?φ Gъr T)LsJEC{b (FoG x'&)+ݍC'<fh֋{`#-kt/ qF9{W R-lό.jl3cr/;I oE렙8FZLt ~; ["˳dR®3TP%RN"�h$0|2uy&m.I,Ka8WKK=A< ң@%LBOsg|�rGkp:]jl_N,1چ(;,Hxm]~/JA1`%lq /h}܉` endstream endobj 508 0 obj << /Length1 1614 /Length2 9107 /Length3 0 /Length 10169 /Filter /FlateDecode >> stream xڍT}7 " Ȕf;FmIHww7HtItJHHH7/9sFRUE f!Y@@~�9X@vZZM(Vpe!2I0P fg�q�@ ~ mC$P3+@fq]P K} ��1[j (` AWzAK$ u`!,NP%@�A8B�K(m!ƊC д:Ѐ#^`59ܻ3 �r�8Oc? 5�b'_޿Apl`;jH+"�oCڀM 8: -�WW}(�]#0m3B8' E@Lp`Nvn#s2ٴ r܋pY@�. //�b8ZNe@<7#Dx[AM�b~3@xO?�'{l\1cl o*?Jqq3�]RU0+9 ;*w%Qa�w e=!�o�޿?Hz? ?z-/{BC/~ETF+A̠lW+/=Y@@?Pi3L4LO>  sxp??U`ED1rj});Sd =% tf?8`c!]�5{�a߃ؤD\ؔxBGcAlV<�6 OT{eq_>~_coo qLL|*}Ş; b'벳 BvIDk*ItZ(۟/NUQUpPIoZPDNޝ>q;x5%K'^ E2[̢Kʎ':Biy&TE >Ց&\Ǥ3F%('Rlv*#X'l ~@$襐|X=QณLf"DtǬx!Rrp%}l+qy(%!|X<l6@G8A# *۾;|D;9n_zfhے5_Q^I12l{dwؤ͟M&Z6i 6xrp9BKj~<;us>jn/ # u]wOͺ}6Mpu]9u/s^1T책y|rm]" ?n64x5 P9`7 DZCj2@^QT@{ł' UxpC<pFv׭)apn}X)vME˓9p<ob^& >`}sa(UJوf@B;wۻa+]2Եڴe썴Jol.aSrqYI.8 ՛RB|Is}|ݸ2=CϾ>*RI%gl:D[mɷ�դNsNWM;J0hY#{|T3�CxORFpDu&Pz,0n8 K>,?uj*Tɫ fg>)٪K}*CM6d`O6+ܵ5m@r" |48#%Mڗ^f9ygW/M"'\> -#rų<U_rwp.D #΢kilNimi VY:}2ןYߓ_$jF><!' .=fen' űV>4վ˳%aOfת53{a{N+8/R 8lA m$.WuȍYlW<^HeKVXr^t q8gDVq*oV|h[Eh5- Oe}-hK<s~Yp ?|$ Q;6DCF.Ԉ`A9(*?wՋQB^<B}ItkX&lT(IK\jL$! pWW~Ҵ{dF@wrdhFWAH?3//"vCS(xNhr2WfMVaxZ/I N3cMg#kQ_WjB|VG$Gvv9PcùV ࡵxt`͞SwYntgG/O<֤YhR^qTS7A ToYuY)r~H:^cL1 P+Ħ!\ OWn9(*p!٢֧ɾ" C&65=$3WYA]-(|w\8 f.+:yu4 %E=7E&?9uH&+*_v*F6מgDi%l.5e)zn]R:!Zw~b0?!wC*@as ʥtq2ߴ@5l|=r]ci򛽴Pl̹3)]p*<*ee٪i/Lcʮ*\`#V{ 9_ \j잉4kozגd}n 'q0O"J2c\7'BU""gm ƾVŀP;8 J5Ӝ&lC\D?IτԜUnyHM1gk(D=S(P:7+O=|hNG6faK}u[1Fqhj;zIIl7F{O1sW}ft6|`E`MMt-{*>F6fRkEn%+c$$拜GQ`l }\. bxe{N66WJ- tѬVrQpw;ZM8pE>̵7*um՜lЯla|y Ch=R)J9eDU5ۯ(<�A n$Ʀs$y#%End҈!Mф@ _esPbE4E(9"\K9rD j.I=`Y9;:+1UHJ# Z'>\įG J1o/*G'9L.Ny<O:>sOn X*:a!njO[9jTxQj h+zcMx+3:vBRSXkܳ Sw>FVuG*Y$ORfRi:2 ||呌%w=nVcf+~6\g(o"ni/LՊoF mѬ>yvo9u \/Zy]z iV~8HY}/p$W}nPH$7n 6@XL{u3on4�_4REҲa( Ks90JK $~/FC,֞?vKe:[No3XCyMƣE>;wczCr&dϪlUXsiC>W~`[;m`ej U0m XBj0a(?}#=b0W:fҀ0{9<QZjMb)fzSđ5fPX&clȷ>~SYq8.|%ֻ̕two "vjYph!?skT? #e9A)dq\ڪ(_Db X3PkKkrƶ3-QuX-_c*8st-5BP~Jيqՙ  mHE5IJ]FTgS @6gU&Φ{|=luRX~( :;xDt8ԉ84&J>Vj/N Y416yp ~~Ǔ2ꉓ# Ww-!u'V(a"b7X  { Ȳ}i4%&ZEQ;;~ ʙfA§zLboݖ0Fca)CO|#VtV?wiwNceQtz0.Z5Iqj^G)3n YHdGUXܙr}(fdӄ*SĆ8#c^x9 q!>zvHiR?sG\Z"l{tyWQrEAkya`"GQueű&?,r8.M;݊N)^ hszfG(gO,c6[,w-;YJ F"�ѭx {rW) dxyI] 8ߢMݸk^FERxC{D.-m[7/Hƌ_ɦ(IѸFHEmNJڂZ ‹$G T2KW_$d_a$q=˃LV9^ :RۊMߑ*|4#~@L]t%Vm/3l>q0 b_X&VB<s%dXh9jHjcp%I<Ma3XES` ?6,)ņ* ;6T($e绞VVF #q&L SowO,O*ƺDNh@@=*.=:eؿwEִu1/Jhz\٩/-}Dʔ7&CHd+@k.bV$Z36(e!5V,v մƳD>Ѫ<~{t^K[iAkKO5-7Teb&M=9Wk6%6dÏIU eNڅ )_vcgqW2E52/qe Пc{0ǎ9jH 2x5D|_ܒ!l@I)tKɦD^:CȘ# d׺4{S".5ji !t]y x4p:J 듵AUW`{3bJUII@f K#qHx !ʼ.Y|.1u1,Bۊ0#ZUgWyED|Kb4DQHδ<76 Ż;1/?_XX48zD6\D|fCmF GqqNHyjeIA*^>欿q%:\ˆWYy]{^8 :_ {﹚&M 0@QjO.ї(&ǯX||pbxB2đTAKAT'mrZƄ-T! ST*v"@\ψP30uc啈 ղHzJ6DwrSEtjMtŒ=W^BBԻ犗<yd޴gV,l a1 |)|I8bKKLlz;uF!wdsfӱ Q~yvJIh,,*B0c+˧7oʬ@}U]4fwA{zV`˷Y cG(<\A<\8YyqbO1vɪLWnYfI Iرk@?S=AzRG�͒fKonb ^pgSR`բ(FL84(�Ua 7= e~ެ[KXZ" k&W^x= *8{t^['ChH勛epc^S�N`ԖQ-,yCc?{ٹ-6X޵Mz3SE34mϢ7R,KXdP]Zoۀj6|v ج$>jWsH_ǥZC5Y`KeKrWrm4aC.)3{1d;mStCR,v-`(!(~ )J17=.E(͈/&<?8ḥM\&'Uj}Zݸ)ϢVYXxY)cn/>QO2u4xɼY %[ۙ'sv1  s][:HrUz~}\@&[jKC~X?n\O Q՗_au$?s_eHu2dӼ_pF�?vs XlJ؁y]K؇!ܹ '_L_k+Ǟ)?)ie-f_*=aLFqf@-Im%<_U%LɏupE[.cG+ Jjܭq?u1fm*)j&3- )K7_T f7>D$m@ WGO)O^ԙy,? .g$u/(v3T;$Og/x: QUAyyJۑrpa}ltyfC P3By뤬)Z*/ƶnb%NW.p,jwiIP*<MNS -M,zU6Y$OVk�Ҋr65MeЖ]K*񹐦'q+mYEvnH4nt|̼͘.&_řAvmӧX{ˣci{S|*x͍�R >caKkz]$tΊb~W&sY6$[]ވ@}458?C9)8QaD:*")[l>ώN,-4grnPijG% )PM .6jjL4&US+ SĒ*~h䡻j =9@Eʇ9$mZ$W\ }$ <whVYx ޢ0,0༢UTFw-'~x0qCUB7>N}{I rцߊrwMT w$RRyQwȃ)S̛m&7V3~K6B%PD|+"OhuƔߥ6"#Y~'qȜߏZeɿ.^zVA,ZPyCkQÚ#f`|KX9pZCt/F#Rl`KRS`ԯrg"p/'8mFO9?gFnLEsGE*󡚽l\`em؊>QX9QI%9|q6=uT5.4!@Rn߆xEY(asZ){0t1_Lʼn،L ##ON_U޸AP^wzG6ĨSjӭl"2=WcHӹ-Qݍ*HoLwI7э?6Vg|鵮(t'8Ql֤] g]-^Xp"=\>`<@HT~C2ڏ1/׷噺Am -\a^mު&`XKܒPpm¹O;0,GȈ Bϵ`;/KL ˈqTW}Xb!u ;`p}yFd{V/ w =vw|RI`wƆ<sjw�r@,w�YpI!|3w|}bLƭl|cH,o|ji]l+m^ۙ͝[Ҫ5$) 6]fE35wB]f8`AeCQմ͋4v_4+☍NTI_7O*ĺTyba^퐆'ݭ.ך_q:f!۞mUlowJ/*M跍U0 <R =?dt2�R;e�񩲸Jkso ,[dp2| H$bܢg ?R;4!KT~KreKc.aR=4?=Rdy <ɤ%Y}r%7~4->O6fg#͆?\ю1Qu3`&,n7!IG8-sξi͏G&YTOz*0CK,ӎH ~@olb.NGIN6SKyVKlA`סX<hgejM V<7ѶԞƁ &>E~yBu26u K^mN  Uwo0wi}EhyO f徠5 -͡/@}wpJhz܂-Z<Bb/:rZ8i*^[(Z"`znIAm&Y>7M/rgFA0xQhY"ۑw䃦#83b>dK6<oU*Zx"r葌֟E#b$uWd@[,Tf>Lg-OLU7Ml|xp7/*ngmH59rW'o9F $r]b俒1XRi&b4:B.F %N3'tjT}aJw0u xؼҹrnӳIaMCӐz귁Z/v;R)snЯak[mW Im"`.A<KY(Դ  d긨8(U^b+(KV? fF5iʹHC-B w|'}YL6l+7Us4 k^5~B JSOD<wx:"efX+<)hZ=B+~jHSD@d/9מ}[qK+._s'+Ls!n)AXl{rEByg#Z'A끇D ׼v_]SZuM.(VP%d?d8Y-Z8Wձhh}K `Gu#R㐾(:Ɖrt1;v 7Y m2WMu,& gmCG_OV<\Wk9ǥvm=ʰQұb?$X?(quv6f 5yVggw8<o< ,TsAEifZ&>Q26>s- {}xfN9j0KU?9A@?3u&ۑ/('!N)M-Jg8WO~|t1%>NSVZ,JV"%4ѥ*7~_LJ'7B]]׍OfV9%gt{}fѮ�0 /6|;G$k4vpۡl`O-fZIH 32p)9B447qEHR5&)(\% .ɢuuvl3Vr=}l/hV#߮ endstream endobj 510 0 obj << /Length1 1407 /Length2 6046 /Length3 0 /Length 7000 /Filter /FlateDecode >> stream xڍtTk.ݩH 20 14ҝ" *  9kz^&=Cy0!xy�Emmua�(  Aΐ,&w(&! ʧB03_/"/*@�% haE;+ݎ/.. qځ`�mₚhrZK9"||޼ ^ 7p@< ^0`/ oGx!�jy*<a`;�5`u$kIu7�~^W#(w1 Ba�{3ŋAp@0DUAA'T yعC]P_~Aݲ2 wqΧuءݗf`po_=g yBԕJA9@�a�q@|~7ur](@=G�@E�C�[FOwbF-�� E/0OȫqA/( *$EWl�~ _`K2Ё C}K0uQ;;A.Pg߿PTDd Gߩ?Rֆ.UGP9(/ z@} `=(j3у{@}qPU@PsB}U<Py$_6%CfR�%@e QC|~ #P%�@=ܝךQ;;jo:m<#I= {>D>)Ct+?^M1͙|2ůb䣎7z_sFmFۤsT ӤM$Jݻc>˂ YH:gSYj,GNdٶhC;5[Wе8 R. RVzȻcixl?@+K) V,\zeU+XHG:Y1qul/RMy0"7\-r2tχ,lilJH|S㩾/a IC&K8aa M!7.䉸/ ϞdE`LDBwWL9J>N):ٍ (}^܃SV>͝E*`TR1@w `Nq9{qBZlTJG,l fxSo L!fPz$ؘ#O OyY +:k ԙb~o*4`th^!iy~zFPs'yf7^Iʧd-K, V27V'#5'oלG ̩T^P> z: 2v)~oG70AiZԕzvKTɉ6}z\8|n4B@^!;!nT3Lu_}⤖ѹ9 5/uUq?8 w)kqjg/ʓ ךl-v%%MJaņ]=|gDy?s3=b`(PgLox#4q{{+GZ4Akv|c%[TȵQXjQOR~ 3-!ɂc}10#'1#'VIn S+bh:dWMG02SrW֒ƴӑ$/թR,ub6-\~=egoDZemÜ/b4ژNo m^lZ)_ ܢ f9iZlI8IqGaᬧF0C *Sz_-K. 4lxW~FHɦF"'>Z 9$n"al]Lx?*~d?Q&FT=iMa֎;^`nˮn YEdnɻH`pWR.o8<q|C {f2$^V~KfYe f}<KSTizN`PZl(eЕ[{%8B1wcDT>k>QfJˢ[[K4a,?;s 9EYG]ŝ=h-С.\ds*ފqoԔ bD+ Wv0oEZ7Pt # IM"ќMLr)xfhgk@,_AM~ z䤼mʅ7] ' ςM/t8hvϧX_͈zdKn,RZ_90aѨ6H-} Mqlx i}\bϡ?xEX{+ݿJAFK_9^>}& x�:a]vnnOrY2~h.geS⋇S s]UNTkoqm]_Xdj"!h+O@*߼&iK_,M~7!.1ty ÙKutHhGxV(æ;S)tø'I=Z)r 0dNxi`\Dkסy ir Zmfs| [<bwl' ?KoLw3)Yv\fԛiLԀd4�@I8^{|yCpVUĞKY܋dؙȭRa%ZiF!lX0 q}-7~LR6Ifi̘JRz\uX)zyzgs;vo>LT d^vm�N>ʬ*7xPn]s%6j2[5R@C/ژ&x) ev4OϹ�#IWZJ "l"2;հD!A3ӕWg"_vhŒ6-Ieh65зB7g#Zܚś-ߚhw] #;djZUҮSΎpgG\R;j61 ڽY)? 6&2[5kJO0#ɕ" 88g^zsA~io1`CJ4> >7ɘ' X{R3cBGlS|$ے7 -چ9yq3}w3L 0c#=&m Sci|hU-k܌i Jʎ h> c#Z #0R8v"0G -S{$ZMs{lގs͒0Pf q3 k-c}1K]=7c,&e$D )WY{+<$7Q%~yVC3.Jl?4~lUNzmIfשz!]}U.χ16 TG¬]^1%PKfyg5 "jMU`-r۴7T`V!9m?)ݥ9plUkR^ O�fEgq޺"96s]; *ad%&dFGc{%ae(|m1o,[ߘ ҳ)~P2# ך`0aUٗڝhE4A*Wf}0{g8Ń<I5~P# ֻF!%s"jDA7]/BSMPm6˫w&๷֔Dw! ""S ??Y "'iu%Gy9[rD0wX-=48DZp|Sطת]?ŽæH z֚xfܖWc,vx2lqG!s3(Rq}:^ WsCPF46ۨzR}ͫ{3k33ӷ@܍r?wxNT4w_L ^pƚ!o&c-$GFlL:-:yS쎜'c^F>Ma/;~ݣLTH0CJx o_<=J;$pց&|7R)CaQM~<ش!F 9j ڍ㠆j|7��Z'6^L'#+2`/ m74ƖXU_Q`'F,ʒ^w; ZIoGyG$]iC?iWuݍX^NFs.țNhP)>An}wK VREM>awc(G8fUNdO)e>aU A Ͽ$ `(Ԗ3LAV}d ׬-*y:G,`8*kӰT},-KڬNI}WLVn{[:1sljEu{X ek8Oӟ0HI~Wbpі*ctc /zqP;;P.)8Fzb~D?׶]Sk&(S#s$f!!K<ҙY"l#?ķA oUhv'Nk+,\M~L({:O^4ۧdLUkɑXP?uE%Oi'顚vꍔ�GKEdN)cD˱W<Bfˇ ٨ßE8ҙzYxgw?PUY%\t'@!ۜ@s"X4 "@,)\ˠMrrM1_.E l\Ww1Ff~΍])hcW枴0 8=n_܏zTzXo8n mȞ`_,y$DJ|ގ݉pQyOgЄXC' d #baR_kj^,dz}R%fo)m9{"4!B#&\5pC)W+�q^ܡ5hG5VuuxݻܮI>Ք<vs#nSb^ؚăIՎɪ喙/-',P16}hb'd0K˨Zz_,UA8c͋|_̤.O/FBƑ6wT&{`:05ŀ'ǯ=T \756 vtFӬ%ig)~gn+S~/坃][r2Tl Gcx. C|#W(kTZЃͅjB[avL;Ƃ xP_G/L#){Y,cg(DxbN%\v=ӵ�^jn7:A@zܛۻ"J2}ltG)=%M<-Cg9"$~Hw.R5R5-R-WDg{}\c L�q铙8-.6HŽ v$Y+ƔJ^E sn�I.stf Yl%&g@rAJ6$[>.ǯlYVz]2\uL<I+S_ se2Na2IJlWpw!TRZrQJ'90 h[5aT23K Mm7.rlCKop*MeM)emѽڳ}0dÞIoh" \.5%{SuHG~c”p*+ BLppL0봝EF=OB '  2f۵x]hy3D`> vOEwy. 7I FlIɥ=`|0Zq^C*O@dE>ܾBt*z6$ZrP94=Mwω%8|D JRpt1b+;)`&yh#OJѫ|вO iL$o3̎TdζȚ>,8?DM#,O@cI3E͖HkmZ^ŒKg FUm?Hxt2KKXb`6ۯX'.x܈<!~7mG?ptūA|(|DS:vUjfY׫ O `PPty1܎QMyq^d/Li)+=nbۘ;1|.w9fޫ &[ˎpC'!ih귥f+ClyOhNySRhED綁 ftcf?Gzf ywK cO{!d0[6cGзUPbSY5NAQ+�wKnƴ EG)<$%\99iKeے;>vk+3,̓N,oT+&+J㾞~ vs;Uh|q656 gL+̑ z?Éd6` j\ޭ>$HMbӫ\S«>Ur?OoCLAcq~}_A& ^;vh2M꺂i@o/r^?3V5'|ZFG9 .K.|o#vJ ;')վ[,挫PU*%\p?k BT2[}ب|Zܲt?ȖUUa*߯׷@~&{yD+%[ .�;-tޖ endstream endobj 512 0 obj << /Length1 1452 /Length2 6815 /Length3 0 /Length 7798 /Filter /FlateDecode >> stream xڍtTk/)H 1t ҝ 0 1HH!HHI "!%)|u޿g唱[A0'G ,'_j\ /97ɃH?u8 �@ !Q�/ߎp7Q<jPaw\ jg@`fDD8~d!nPk0 FCN�]5W q{Eˋ wd�xA�;bvAƅ Cu/T8A!0wd@*4] ?j8� �O%~.`f:A�j\o� vr#` s0@QF�F uW-+lWP75}L%Ba6@xpàe\*tv@GXO�q@q6~\.�[$?s{B�76[�6Pk bwzLxx~s2Cs|4 MV 8yx�  <;V 7*l� _`keX.Gr`<<{~x+ݐo3oa;C|r@R\ u8r9`j[`zsC-(тC8(!#'vG p56 nn`\$!�\[o`p23G� Kp;/Q$7&=ܐ]ÿ ][8ԅPyqncrc#,$fe.).4d]ϳWNi|8iZޝN'%hA5L},Z֏E].s]|qJhF绚L5Rj5Dՠކ)9sΚs܋1)^? .tGxo2! s=wY=!Ub5bM*7v|/[v))F%R{ړeSڻar{qU|ُ yk0i:>o,]p5h+�jӾ+ѽvIj. RvِI5G^;~,JNʍXrF䩫Ϸ߳xI-"L{6,fRAb'ڬ]Kĕ xo"[8&KcN7VjV]*}z G~D6+`OyHGz$8j?d5X#C'1j}Z�i ac<"gߺht D?푈D&J$w+ZSB1}OfS^K oaWTh\oqX<aۡwR?"~jeK~DzP(6V %'5E/5b`ȧ0B.^Dpދ;SV/c\z1.fi[7log�J5}uD=Q.uJ";BX;s8 MEU:g d!}T/{v}KUʫңxǮ~/c#`ćVޙ_|{Þ1zQ#$ τX 0ِ:8a�n&j90LWQGꐚ;ݾtګ1=-V5E,TS;mO4-!9RlC3<$PTu 7{6*ʕ$~}kYS{[XZ9z;.5N|/<A7eE0Fp^ݛӹ<6"LsΧJf76L5^O-Ӛ4??$}B}-Èt? 8Lp&a뫢쫈>5HnV-vHCCZ^-Τw�Ƽn;.m̛f/.mg<&#!E#q%%1h2imbڿXx22ác Gڗ_wъ@{ X@C$TRŗ7?5bۿ!9_i>QQJ r9 UbJ:}g]):~& gHŚ\ty16'J\+!_25zZ<zU{rX;TZg^\ŷ^vn gQRX3)7\C6 X)"s&%C(3 zFǮ-R 2 Tu5cnZi}ޗj6 h)gFr܌Dq&DT2>w }nuߐR>[Y9?[qT]cǏ=WN9FZa|sڑVfRAPkg]M*dZ}@Bç-'zchz. Gt]RxU ͪ%RFCUu=Ag4!.iMh)6.WkpСZ-3#uNP6XKb4 a$4}"s'6d,鶴._E@X#n?U>Y>a/wv- AI'CjMz$c# E'(WzlcLL1F,ojJcɂiz%i5t+D[ 1{EDᗉ{Qo̲?:os?Z~nvd2׵hAK$[+FHU֑U8ǁ[ ^r͘qS#6�f3aD'U":52f<]=?ikmؔ! 2'.:Sn F{&}k2Der\y{]Th!iǒ z@׫͘R챲'hx9s:oU$Cdz'l2F_z,E-s=Dd/ n%VKO>+ynMtoUZK_cA]bzYk}IT/9'7t1(R8#y&9^S[Q|}SςNC�GXv# # l_YuN%O Iⲿ+TyhD>쬏*fRqbD$d"D W~shk�tV^ yVkVv@: lY_)+y'7/|IJw8lP34)V%;gߓ"*wm?3S!|3Qᓛm)*Cүx5kLuAzTc*o/8 o&du8}ˤɞN ĝGϓV;e2js|cEn [CsTW ˺Y'|,%=۾:2^U`apk$~qpCԕ/t53?hH'TvE7Z!+b%`2WT W: M3K|U͑#簈;Q<+[NuQMMIۭQZ68h*qDM+f-=CS6;r9YqO$0 DB祈C&S_5>4B]K>kQdL)|Ck>uJx?@@>hY^?~z[5�pU D ْzkqEEUZԣ)] 4MCrN`(#3OAjcރO<Y=q�рXM -=?1AҀ=KNwï SoG;f&lke[fmBYXQ_~ZMJ'k5 |X-%Ţ?Rgq"?:{O}UVN|Y~[E32`1ۯ=긱zoZ�! 4"Wg2!`W[㵌"\Q&PoAx|>W&K0aa]0S{'ŕ }Zug (gD |T4Ɗ7=f.QxCKx+R>zԯmWEsH<v-4UAm&냃Έο雄P*�_nŨ\Ui,f-$a`u1t_ZtE?1e\%|$<>AƞvGt,b4)q1Y׳H źy1D [~ǞexKD,$fzpˇC*c?O.59١LN8P*\iͣ:ϗ&>49Ѭ,ޮ<?փn':oIE!AIF. `P>a"81!`m1wka0c/rm1`^C+j7&Ut'ۥ5ŔۆzoclgADUsb]ns(tBnι%`e뢵V5AcMD&P7$eymρk{V\n7urT}t_H5V퀗_R12Fa׀{i�xG\<ŚnTjrY gAse T{ר\|d7o v?$̤|%|2rey_~4 ?Xxs<΄^%̭ØIGrYykxWZ/!^.a~?w-'HkUc>IR/ɗ�J/5ؼVxͦ87m]qݽGأ>3/#pDkrA->Z{.sT ˥ivUA=h[GZ՞Q-A.OE {xi%@g] sH=89cr0IA g** d.>QJi=ʦ!~g{ hmMU]t>b'CZPz>\a W'Cj±ߔ]3Wȴy_\ۧ(#"W`UKͅ<EDɏE;�, 9}m2v>b`hR\nD-)<Ҍ8i 7j9ZkG S3*/$J'V)uf(1wmp}cxG˂;axWj#u?@L:P=>3Io%Ȣ{oc=B d spmlD$mB ?|oO vn8[a'WLX.$_)Ԗt=!,A]mkxh!{<}E` `=z5}#Ke^# aO d\,pp \cU{eA4h5b'}rhIPR0m֡KRELHC-pp!Cy�nƲ'VUp/+“><SHE1q%_f鷬YEbb$gDIn˴B6_+gb]%ZKjɄ.u{[S >( llZƼ8ekYiUg>kvz&ɏAC)*@m\۔Jf6I8?OnĮL:+H/WBKIC_1u>)h"/2F;S룯#{Fsu^c憻^}ׇefϥ}:uE"НJ:% w{ MIt sRp80"׶HI&S롷#- {܇IT;-]cq>=WF, { Tϰ/QH[by<8Ѽ4 B?*/_c=#.ד!/lx8+-鋈wk]ivrjqK&=p"f!M Tw0 z7UX3x Sh u/1il"[@]Q:qX6ȣ>v8"Z7ՆnbO}ԛ)zOJÃ=uwm2s}ug#]!}*j =F^HP�QF᛭o%JSD{ڗ]1`a+a Jow٩ ɠۺ]"iORT".$g%ž]Skc}12\y?_$wMt<nx`(GivnOH6K骚(ܣ&]e6y0E7kF5Q;z3-}ֶ,)lA.􁡝|Jjjk{܄[qEqp>Tʀq2&0Q͝>{z.! N<Uaq 3= OcxkZPufaN! gVOc~{ tP拃6#aHۤмmi[^:+^C6אp1ڳfPcFlV2ۙ:qI_#l;mgz+0c8^X%^C(ӦEH?i1%Ow+qk!ٶ(a2>&)3/:I'{0}_ cH.Z[e )D0k6n_pީ lš Y))-3]P&;AҜ\=>,} Eai!bec^vݞ.تDžn=޼pO8f{>$E n匹AY^g0('^eL?r7H$B> ΑT?9h7'gxwޅkWP-3F<0囬1,7hp?ki`f;$&S ߒ 45v8(.3RXa@Ļ{0U-׳ >h|fM@Bu@nIN= ߛWO‡&{T8?Ezb>]݋j0p<'N(~+CGq%*^L69:LV'ޒ"=LVL1@}Dxcs¸ŒzB -J8ej-6RR՜Uvkgr5 K9iEoG WNGl2 >]{EU32Jq�6уX[,k=z ju w4GqkG޽:Lĵ^5Qp4<ŝe~νkřTC^]m;V6 3 WK߭J}<P&ws 58>4JѦ~-{uϷ.ffScw*_c%[iOj>o՘eȜ[enN!>xp�9&- endstream endobj 514 0 obj << /Length1 2809 /Length2 24169 /Length3 0 /Length 25745 /Filter /FlateDecode >> stream xڌPI .ݝzpw\4K{23J9k[{uCI(b`twedeb)�XXؙXX))խ\m)5.V|9]A6qcWP=@`cca/ nneP`:]),,]A'ƔW:@lejlP0vځV459Z]SFՑÃ΅Baj P�݁f wO Prۮ`a  V@{P�Z&#Pr,w��XX-OBV%:9{Y[�̭l�%Iy&WOW@c[P (/�I1s1urtuar"2)K؛9]]r;x̭7aȬao'dY�],,,ܼ��ij#/'o3?GG9 9;_ 02u�-_@1h<, X~>H^f^/u0r�8Y�E 2eU6e��pG4ZWPt�iy ')W?&KH/7_? )pP-GYhff2Ơ!boa\$<fVk�*okeTvp}�A|gjP\@{ :O]Rc;;{8>jK�f&{WP �ԞrqE~F\�fW `{E<�fW `q�%_+Y_;Yq�e_+qE . E(x@\_+qQ}E .jEh"W@\޽"/+XAƦ k�3vi5 T1q660sW;l%�_Wkum Ҳ+36+gS7;s[zg11u)_¿A7M$l @-Y.W5DHfe~8.2yBP7&BN6j�? +;\,-Dlj4?[mZjzwx%JvԌT)`qc~Ak9AO\٬^74G[?<^%b 43ϲ{?+h9A=�+H1 aqz1? juYj Cyz8�mف=^@\_Ɂ*y^?׼3hk\zA- h ??`b5Fq{$V-ϼsdꌠUnԥM k'7a-*| U'[Ʊ EjՅw||5m R8 +ayJy-V٩Cx,X<Ek9KHK~2u}3=B"Ow^裳s?\҉GKy><A#"3SR?,PHĐĈʴǖ^mi}xu+'BMЏЙL 0 h\tF:pg ` I0W~-wC7-<X$,u#҉R\G :2 <ơ>A,,:<=Ä'91~gkSh/\/&R ,%2>Kt}]V .c>[f/"O;(䐑ٞ g:ѬhW!:d٫ 1۸)/5wм?YWءIJ$vs΄X]ԝԮ1EKHgѣC8%uBܾ@xa^M0�Jw4`1;Cjwyk`=?G6ILlRVs69>ASn|\}KlѴ!R@%}z48 %JSpHPPJ"_H2e)@E @h[NmpUqpG쟞R*#𶬪)gHg'pf}F,|OKe.t-lS`sklʹ*2D.i#4jqdYj&ޯb`e`T=>0q\_5{;g /#K#KZxIr&zSV:" L7d~zhݷ;kX<[ YI3N9F0΁MT`&|:v' Y΍ug 10huҮ_'&npgM)VNZZv88Iu oeZjNkwL#YV/dY*c}Vqfz�NCB&eԖcZ=b.c.#*OLH!GMeR3KFCEc"Κn'pd(n�Onx"ɤ;VvB[/[§).ϭtEH}H/FKVz咰MiqݮYdVR nƌ^Q?hOi1SkJ/]P.b$q"7YIpŪ5(V1)KBv=@�eo巉!,u6}U@ᓐ\QIzVdع3A/۠΅�$RI=څU)dMu] A-6GKŇ-%t�r+U}Q' с]pJ܂J%J4hχozsWͯ{2m)%r5EhDwʰO81IJDWo3m|~t"А̽I K QsH@Uǡ2:0y~/렀`13Lߎ䵥PŠ5VX09L$݋Ӧ)TӲ.]KX{8t۲rnY* Ԝh(߮&mԒCiJ*:vva{d�dYr&^<DT;p4+j$uk{xw`Mnq!QF>@ۙ8Cas.v|Uec o<,Ú~rVbhXǀ>ep*{sm#HUJLJYkV m<<3G=B-]&\{S5ߡcKckQՕ`2zil:eӽ1 +NͰ?wIxb`sbn2oP>O?!0,]Q#RABF*Qd΂`ޖ <L.VRB@nPy@)FD+?mvﴷgGƷ:X�xXdw zHNg{1]x6o,Ue":1rͱx$ћ\K N_>os;xxkoH,sJT,%bf.5H߮ 6bL-1]џlΓ=\ 1wh^dIs BCb;K]X<G{jz]/Md{;_t!e}t3W,˾I[R׵LlF1l*R<g?`*6Pa.J2m칢1xB%*][@QnfFFKg@T,Q~ZP/%Jdr{Z{v v[eY#h0pjJb#{>Ť£A끤Fa` "P*6R[o)6SˡGJ&/dJEGz$ʢT%$wHҕ-YcG(n  >Q*qVҫ~9u.LԾ8v}#D,S~א;|: FZ/"<"3Jѩ[BKc9jo_zjѸAOɐ4)_ws~W$򑓬_]<3I7Y?>6ׇ]4.oy Gw8_]jHbMxl'r⒌ya Imw3tLaxXR11HSX&: G;,8k&.ifz7գSTߠЛPl1}xzSGJ܃I zW}p&> qpv=8o>e1 c <$yh6ħ{[љD8LwRɤ ՇRUc ;eO�,߃7ZuR3dW;wzd0w)M9xٸe[E.]!O",hJ=T]u6xF\HT)x0켪h"܇oJ"{UE TEmzjg}T(Z9Y<xZROuAZ|.ߊQɡ8a`֌ʻf ]aW6LڄsX)WGKݰHJ"ЌH)BІ+ YF5%ra+g\ކ%&x=o*Ov~hȼ/`Gh|ͷ %Z�ӳ6XE;h ֢DL@:uY*@ܖ[k^�~*Sl@qoV15N|eb{ld[z X6"70—gqn8B:rMy-Z[_nU `Gv= vd6iDu2j0�4Ka]eڌAj^Ɯ�emq~b^hB} m0Pa΀ |xA̞!qi<M,g ϥn1Ԫ^~jr݅58Z-ItƁFMS0a5i趄(=F`dަ2KJR/MIz,S|3 1癏~)?6ɤJS*w\&Lx{ol6@ 8T~!1o :z>~C=k9<2Ej1K@O!jOD?j΅+q3>W0b~yoaA N"|hv^zшʨZ6IG>Iy0ioG ,l 2O7+yܼ(/R/Lz9I3:5*;\shw/r:B{i JDN0؂n{kR|Y:zs`Hޛk?D(7V;\jÔMfd%ڜ^ 4 ~iRe:L~rcBQoz$NCԾۯ7hr4JsW?Z ŕ9j y-zx ~Jp_~0;eD%}§ Fs?n9a <[dNEJEVѬ*z.'N~k;_F/Q-\$!21`n XnN%˕JlP ݀$pIyiF/.4$hՎo=+`vQo~I0�nv' UqD5W`9k◑Y.z Rnhώan.#cb\ yt?5C¿#{j5@mbO\m+S}=RiđQ~j0䩜 (%dېKP~Ǐt X3O*KMC:VB5ڼ'.-,Fb$s&> `{Zn*xkyzǦQ"y$/}A׸<kF?maB8m'i,Jn}lO }W.Elxe]%fL@n=ǘ/z'qT:tN9CF'ƍܹM\ K}jDDs^dO|'[s+,m .jhqS_8FOvƨon{KiJ0b`UH=07:@ ݀[FTWx #?g) Z hYm) ׎5e}S[ZޡM9G  !>A'$)CGMLƫ4"K>?L%BC"=P!IMq=Qg{7Ő_ Y/R6ƿarA䬹؍_ &HqU`yЁ;.ɏʠHUBaUEQKBzjjSHXxNgWڻe/kZ30͒⍖Lsjġ~O :MXbWշѪz3z sF8]YBQ4fPdH>.> i.⥓aÞ#Â=eX?rے0/V^-N+΃QA[ufio̚z +�BaFcpw&YxN6@74/W~N #/lڮ[4vL -^nY\lR-6q%n=/k։t]ΉgaYn9_pбd͕ t:ݥw|PA B7k_[D8y?wՂGefZ-oj,|�DyTbED%n`*:Wh{ ~qN1#0bgsy@~Ȑ cě]*TV)]z9,q67.݅SM|5Ur]B!~VǍl t0s6J HKuᣚ >fE!D`VV$Ή#>?/*nc~W;*G*9<i)q1W ΦW!T-5S. τ2C7iu!6amFEM&YI$cʈ?A)l2skfW؆bFBk}~׹$`$ _'(6<ɐmM #J >;;A\I!Tn*`4URF#2՘SK7^_ĖZsQտ+ 䅚8 i}ת@ j o[Cm˳dC=nF.Zu<s<l6%G>m8K-mf sx@Mo#$es>]7G̀<9ۢC95nZrÞyDL9V[eΎ5cͷHۨb17k`hCDnKs{}ٞz%" e6ۣ{+wf>-9hPsőV\t3b4_yXQ*tkqWU4�f7 kZ9�jm73"5y@Ѥcn&3Fk:!D}胓=4%S$L25|6(oϦ7_Sh~IPb[Bw6-u ~t"n7by /FõEX4S #6+Fل ?E?,E1~C70GH𪲀B ҧ}&R{Y`\NF6<|^bg1Ie2,nm8.qFC+1O 2~qxl₈$xe#CwِUxɕY^w`Bɸ{eчFԫW!aZ#1:="m T/d@?Elp_P2I]}BM]7|fM K?]=.$fZWbIޏ~kċW~ < ,?7"^[ iUVf-|:wx9TсC ˜zTlyh~fiT3ۥ-bޤۄrhrJڽHn!V+LE*]nQMN?2Hǃm$ 9Fp,M~>Wd7>!r9?B̞tbM9>HI}2=^8D9N`?=1 NQ&�c+vSµ / ݣ+L7qp_ߩP>~@vL 9xgȾ 7k@Z?+癸hu"=JP=uKX٦ELBsCDa䧱QGghS7\x$YQǜS4瘜@m_[=sJ`V~%RMBV0E;aK<7qں@0iw%|ʎ 5YHC B]9>8؆\xcPJo(&v`Y N6l8 xF^yU>#l .z 5{�7&*zX^CY!<ac살FAy:bٙ:ՏW|It)`l#Ol`p6?^&eb ̞SaQMV3XbŒ&Ю$ׄ#[g=۷8Ż1@Ǿzl(HQ [^* I^Qa+ SjĘmFuCLd"8$B3; Mk>Ll eI0MIKnjMvsT灝cު z1A~@b0ݷ|^jyڢzu/5_Eec񠐵՜X>*qeO$-$hs`AbkC|{Iq=ЭG![>9p{fbbj _!\*/U'دwϺ vpU0CpE+\܉yCgoضf46b'Ey{{ڨE_ Ù�֑) OSFum'-R>K鿈bZw %BǞ.v=K~Ņǖ T|eiĈЌ[#B0./K_c6y�{hau`i/f0R7Le@;F6]g5ƩuGH`<ԳMEo4.ŁZSf>cY ΆG.R ĭ<Hy 5aSU-3O8SU{ pBD6I!x%YN?{7Ý|+N<^nVpTO3hi)8%wU%^dC!>gdbY*z.6 nzEpa̡Ag u8h{`\Uq+qmJȺPKrxۣ`:KI0&;]X2!44aۂf%H|n A9^C }-TQ>8/5j۸;rc9AAn־vRWLq*"a<hϏW='؀PSҾz2iɏd^2օNKlEKF]@P &2B@lVCQT84| tn|L$sEPl:ԫH`V͊s}qT;[#�.Sۯް:R\D UzHi~~x]}㻜7}Ve THBPmn/O1ioZ9H4vdoRT( ʴƸ9ɼ e /k/js"EpBOX6[u'~;V1+8T;)YU+&ΖK<vc Q^� &ʊtrPn"NfO_v./s3P%ʲߞ鹠Mc', hK8k^ڝ : cOOsMx7'aoL/Nm lHhjEAՀ /J`VϦRaIn.Q7:v9OȽo:ɛ͇TX{] \ /û#n$P@UuO4>;nOC˳ml#Np;pxt`=+&Hn_9&dB䋓Id@7avnBa|6mZbsEɨ߁Nx&H| 88 M+ܚ .;83F J''L{иemS$dŧ'ˏ3K*:r'G5"WL]r67CIRx<H=QF3o/FZ&qnB41n�ǡ'aIFhp~h׭|yYA}s/K8tᑹm8i>P  zY :#:yV(L ]4I[H3 LBQot aϰ?tϮ"} AO ޅbm<ib^)"j1~|pAR}oѼݢ%jc3eUuyВ OWa:}1{n퐓%tMp#!W/'%AHwń_^?AuL#n]pyR^8~;7K(ɻE32sOAN$*B㥔BS I|\^kY6$fQӱ&`q7_S4'c禮>j$ڟk,b?Vj-sj)ثe’bI^gA?0Gg`3}*L6MohDGֶwd8Sپ,Q\"ӶѼ][}o0z-/I^GP׽>f2k}SG7Og]8~"01f%}v\d#tc<˷EKV;e9EkFl dѢ[Sq!Y`[t0"Fވ$yYOr/T`xo9F3%C_S#eiR4b+_Y.=Ռr9}.\&d7?UYBjRaP莸lq˰ZC eI_W܊ 0!ZR1W-y}.򔛂vIȝpȮ]3ÃD1\gv pe2h.Jn4C /h;›m�kIcꑄaJ$CK e "{Z悏%d<IBFJ$1&'`m9A%"TY7bI7F;*eu/[uE|#?TsOȜT l;m?K ɼLBR@M R)A e^")K4{.zEP2MNy+w&rkyrĺL嬡%|KGy ["W4}A,6B9EH�kJ#œd7Q 8Ҫ(ФV̪Ը[i~ "Kwjrϼ+*nIf A1w|tZU<v1JIHF9qUSn;J"i>{GfwhiFG9V >aHR%C5LLI8HCvgv?wCEd]/y3JgqɈ7р4b{K:T1�wA U,^U !R@8Y-C@=MͿR/###i/Ċ"c*MIkE-hd6Ův2wFVj {x;%yI0w<~P&zJnMM+*,Z"Kp,:r=da|CXd~fENܶ]|c[>zk|.ed\̆ż+n^YmX>sGYtǞ_NhA;sU"~7ţhT3魲fMx^jl%zQo!'LuЮˍt &v 1}WUYF\3nϡ!b2NpښZ%}>7OZ>E57^vB@ܙK~ Pm^qua к4sJ:GŸ)V 6߉`y'[ۙLBZor'/EeGũÒEz'{&!Y'](w,1VV.@뙤KKG@ pF4ۭK[UQzZ'ŵL{_lK !GKbqVFW/y\sߺ_neiŰ6(֮͌4OcO9&>Y7ݪ;q3vaGJ?pU1jLt1%Q-m3 #�E-.WMY2Ø1G{,O $ѱ(9Z+dz_⍈$0RO@q|*Xq4CUH)j㧣=Ȯc@\=:(W}> n>E!`0 6:Bۺk>WkɿQ́Y"E*@νla&azPD8D[CW؎ddY9 (_iA׭7{86l;!qeMן|S1 嵬](�Pa͝&[VjIV8Pl%Hcde+wS|ӱ4ڮM!8,GRd(^ y'4BԘMKY9,\YL}Ρ-oԊwK!ZEIGÙ`j@Ā.]cB1iBxt#I)�s0pJ;c. 7fRD]MDƣE7FsCiaiWnЈ"` j.D NYW걞N,Ha߀޲}9OV/㳊^[4BK*?<Z|zTA&>-X<&0U<09)ƼaDjWg:e7kygB}ħ8t~78 ʜ#H'1AO:kjִ�koJ{ 3>߀oKΦ4. 4qWyFc̆qj²Sl 3N<;AI+38ʻ^EZ|C/dRY+`jeQRFr ZGoў ZVtph/eQF$x⋘9HβdG&jjѵ9(h߲� `n) nZv藼(obyf#rq ~)+qa-'x }L\=#O',LىYi!@@򗗃Su.n2BUㇱ 9DߞUX|yRaU*H׵7L 5Il\=y~[uy%/p@ fQTw%/r$C�]1ɒ{gif3]2e|h6{z(Q:iQJh'ger .xz>,լL=iigycXK!_\X\2F6Yd408ZlmCuҋ-3*x&j_jmI߾'aH.”VٖAQPs7t,E`’sY{ߢ8 |.R`2B\}8WGUT_}ae ~QeUXs.<,Wxd9f˹Cj%%Y%Ы >(S0陎s&P}4~o#Sr2hvN&'=ɥV6yТ-K%xP|&z'D{PM0m}`|c9zm shj*3noe ,~^ijO_0cT=\#�\b% 80 gtVBn|اKι^rxCPA8J^*vk<mU;:tPI=g'[;4Wσ98]c)w4:Ì$T;&b58>ʱuWu~.b檨3 uš++҅ȳB" ni,6>suǛ;YrK(>hgcm,>|:9ccOzhVҲ¡MV@D [L}?UOc=\H+to _BpnXT_e;xw<PSvqDsW]o0]$ת9yRn+uûo#0Q06bܵ\] A?`i_^9 kJFuYn\u]MWnbYW ^_}&o~{!�vhzXkxFnVi}*0-,s[h"JRr{qY"tpXU񬡲"X5lw1֪$ݛhtsP\bpSI$[x?g.gMGmj\[B�4g>r#jI$I:<`E2TջW Nm{3lZY18fBN]B+'t O#,+1<"E,$1 r >#~,qں,?-vЛfӞ_N-J11hD+N:H6{aZ/*Q\.Or#Y>2nkȋ쫫 1qUVc0&UE2Qx ynMӉt*3;cebƓ nc#W b:jq9tXmW(?4ڔȇ-q6[𹺁lffa_刓<.),bK;QL$fUOő|9$a�ғs֑݊R THa(l:ۇmS3vȬӑpEb;j, Ƣ{˳E]ؠ%~b4yf�t^Z8uV*:uf7X|{k7/? 54_�ȣFT0}3.XT$2U3euR64L索%i)gGV8Lx'ewrC]I~.LS.EVÑ>曥"nFSQw洌OM|.(q TV^<͑N&&QDZ÷̐H4ߒe}$bgKMHxN?@6 C{+7Ic 6NIs{6K a5xQ=iv$6l;̩K%}i8)BWB+a-\{n;aPl_vgt"G 1~ gbiDݝXw@t'/:϶[(:7R_}Rv\r;uRnmAM YE6 ?oAxL0X?K0 nO{2A Z)8y|[DZptzc!}Xuf8H ߙ2jp%Л[`(?*:%/J_*#f-mn)@t,| QF[=t@iB\^+ÔyJJw5*Q͞Q*2+ T_R>B6)F*͒:}B%D"{(h6S @Y�a.mĉ^ C)dѺG"$&,~!':ۻ(0T| --Ec\F6.K:Ӹ_#6JJאjVsv$83ՠ")t@ [x2sv1c '4,0b+y$G/d mhF>E~0i)[Sda:Xé4U{A� C+N[Zg-\]jgD=4&#xjNP: Kbn<I:ٿ 7lT3%6E>eTa ׇE&'w?b=^`K|ػZ+k^/$Ѵ)tX`!;ȉf)^jg9*u2\~>@ #+~E'״wre³Kw[nC,KBGS/V!vXrM5rEfO|&vOt~"ӵa7wtF9`zf8Hg/q:s_"eG+]M'aT<C &Ԇ-&nNG</i Vhp0+X8WGq Hְ{VdꋸJdr7\4* \Q=ُ/kCk-:34GYu9O:Tp۴~l>ȶ_�C%K#ʾPoQt]rx"-Y n(ۊf57\!c#ReJ8oD9�ƛ~?8@:Ys ms¯3u"79ckx]\]q59UT]P٥$321;:g9 x Wj8Wf^U(巏q#9-�I,9,/B > ~0~{+E l{3$OC 2,k=ZvpwY($&}6iX?u}LN1fnj- e@cUf6q R �әs-2<Tf[&H=voәi"IUWCjTrL_JswhGccbD9f⪺_kUd}L } ]Wf)td_Rj@? -s섡P̠CTߙsćElhg3<J ~PujVyyE n>6uBT&)V #\=R�ҫ!-S(Rή.&> #/50+vբ 9RQwu~hleH5\�ZmOLOșVA 0eQSA!aO} ^k)i{ol,{Եl^-rи^;qh9$ y, H>⫣Apǒ: IF 9^L>$S?Ye{/ ="69chٜeOiW IHۧRAߔqKq&g _7$ZEi�/~^.Xg1mc'w#7-T# $$xf+}:U*ڐabzLrf-xs Kv>BUΦݭespa_xͬM?lLdB"]y܊Pں ޘat۪M>V(1Ø6S9Y@єcO΢%$qLTkr'1r<"5Wr!0v\`ϊ^~v;5DG^O~I)#p!ݪwLџNҽcSV$XkV@,LݏSNJ `i##ّ b Sȃ`p;{a [fEZLk@;tσ4iStx2h%dm.R%paoN,%<k<n,StVvx3؇Qb醨?(mŦfϪ}S#,TYըWr2S)׸z*r%guz? ۇXOohYG|3G5*+$rmy7tXAN:/=O?+f<09bՈnúňFcRLU&W5�q[ۼNdNz*]~ ߂>V`b*f5Ah|J4}np{uq@[qzQ =}ܡBOmo]_s F iX}z =cB=Ө qKLUJbMXX_j:.,`* 3 72IQ5S6\ܼ,!(p8}{z3J:e ,I˟&~JjP[Op$Ymr]n}>Z1]X&nh te<(ѭ DG= g wr@ϦT,`|ɗqNLhi rX@ UWnWyQ?_gGİӥsXt{XSfn]kP}/BcLM؞vJ,}IfYӭ+X#Sq،W#bf:3(w WUyRd'BWqKVekg|5 ytL o0hcLn. QgŌ>a1Kvq2 TAu2lL f|6<+w n^NnRVvZC C6Em6WGFkilku{="6WS~vO#r¢]bK뛳TQ CCƷ7񻊞 :OP,�&jG{]ј( B9[PgUja%�F\ (9Wr#}=JJS\ڕ d>ngI(q7Li٫N4K5^u{U4OV=.P&G/ơsODQO�3둤(M50jv/R\bEmZ*,.|! GO(K~10]0±责=vjХ ajz]雼3F+i ƻz`gMu;/nƷ̍kI =`m|| U7ǻFtw\S$S _.G1]eQ ֽYL쪻Qz'}q;մX4:?΀{{”ee=xƞq]rD*asWQ_F'lrMWՊNj_>(3Ps"ʆY†[uES>ESoz|R$1",fi%/t rIϜɴaBk+Unp8wk֑kcSd~ $+?l-Ss$vpS-@ >ev :g95뉜 t9,QW3AՋn'} HCoTcV_WI}!JtG P\T6C:ҾW=-0S:3ׄqЖ"FM`ALuQ1sAJ=?W3F\# 3<53BȀ<E>հnG>Z!O{RawqhG&98[ۏ`+' 5^$W?4Ͷ'+�D-KZc"g/We�h2HM8:?cYL@Ovl[g ?AY*;=[,x|S +@1Lf9,Ia;- ɘޠȲnDYHFUJu Rd,8EtM[w'Ӡ~ / .~|) o 5c%z-�3?<~dKR)62iE9# oP[B{}o^s\ @܍ S<jG ?@t2W#1~ļGU7 N)A[k=6VTi2>:y \m}O[AdI zL񮅱^y mMmFx>; ׿;9/kwůRR@X,Uh)VeޘUMbz~}{ux2b@9X?%.];])fw!7\TiYtGMkDєD>k]B7�dޙD§ig1"gC. +h~N m}eu1oT4bQM8Xxp*rgv*Ɓr% ZQ^-9摍xޭeq=H?h+K1K ftR,A^D *QfՀFw H%{b-37dR"w_'"yP,8 <Xɠ@qH37,X!\T?Z0o*Rs*؉80p|$_-8* r!8uw9"1n1sWúxYQ%/kspx벅)eR�2Wm N|/%wr#d]-V%ZDIAVZڸF,SHwnC3WIp >]JC6 X[bc?#<}PM/J?`(^ԁ~Ur 5ei<~YY즰ISxؤ*2]Hx%wLy=-c`p>MxL'-Tޤ5'mE')BbbqPW>ЗU{Hۛ;QhҐWpdp@*WJc(}D^1#Km`^6h2kݢ"F)Z�V9P��Z0%8ReoPtLR?QI3UcR3H+V Ke?7Ĉyo_P[vf:cuY|&J)WJņF_#"Lh;0=3D+@S Q G5Ewn:dǹ }Qp.dϬxS}@.-@KR!Lʆ�z-m .*U1i=٧:cL0}P)1T8qeSBu~=3o ?~TLqm<=l-S':DmMI\ lSm>ڪ$D�a>k!B^5l.Td*5#c}5&ҲhF%]tՍc$7CFqq3 }2%L !1IEm н h`v$`QiQD+FJB_RqCp)Th/h{N-$e02Kw>AQ 7y#Edtu,Vg'`eT�b02ȤY e !`_ -DuH'7Jm֛ �O!㡳uÚM=B\@C>{3e㮓dbxC)?5H� �#{R}| MyY*Z%e`iky@!N0K'o9ʯY bD[6(":?c'LƴlS*uh ]5kǩ>\$.CFTwE:7JGŶԠPdkJZcR`^}RxhJB$TV=qn dݑD"2 $В hFŐW9 F/!WU >0$ QO%k$pt wtSs#4:ܙhQE Pj:ʗ52݀eQg u$}FntM{,#!. w_͘V7-s #"KKh-ћf eT pjc~mb& |XA#(4cUZ+CWVF? [mI6 y y1 pt,et xy THDϭŸ-WrX\|Ļ{D!8^otTAf<|yf5*W&H=;+׭-2cbҐ\< \\ ~mّ{_%ZXAVO0 @![أ^̧bW7ct|&*!}LM%*x0\<!eL&ο?}l.;G5M+p*6[+@¦@/*ԭ،EXc1#2{|T!)JJ6a3:q?!ocKW3,W"MZ!\w/n),ugΚ|h-)і ?dAgt bxVćyV([{$tj3H7qC-me-#E$�;vmWm/qf^iw)c_Ԝ]UwnOp_ϊU&$lT#?+oԼg$�$h{peTM3YۀB^JHa?{5Ȉ=sYXiJJ~Qx@K"3҂σ[n9;{I2GCyh`gK#^ 'r:e6~bmf ȸ+l l m1",TP:>aMXNrhNw HS >u*Eh{!8.75,I8 *%UG<_)Y5Mrء~c`V/0@ƩWuPg᛬n'}+n) Cxd(n%=S+`ahcЉpMn՚OpjzE<u}*Q:83a#5:qw⦦P$y,c8+8,rpB9 Ә( GI;: =&MK f)avϤZy.~5i85TdOI H-<׭AVULBv 1 iK0]> #$oM?a}Ц( _RH.bĦ2FEo/IIsTQvK%!;F*6뗁h[PG~._+)9?y*!չeBTSYyqHI϶'~W^FrpJ7W6oN\cdd7Á@Yq^{r &suw7=3'vf P(a7<6anwBIP{瀲-۶Kd`^#!][�~ZM874(}=GH8m[`. ykKq͗dxT ʫGnãָdРUk5Bo)*DiI6WhDX%eN< 2LiQ;D{\(-5W Ir+ehdD,V<6f; mNڗU4M`_"'Hw $ iïO'j_HB'ݠ7xJDK% bՑfg!BŖ|z(~{B\ic)zylllǞ\侴9~IsN߳OpŚq%ZbD ϵat]|eF ;3qۗ% R$'#%{ (w!IZ\u}3^ kʁ|QM5*S1(HO8�Q:oK!vb͕aIe�mCEwm.qz[hHxVfaJbd5HݏfO L1\uWmJ87@dp1Az,0[$Q8<la4NT3n}Pͼځ߾|mǐ[֓F-|;̰*zӢB'0ȍP�3Sm8V:C$`Hy96hl{'S~TYYZzv+Q N0rFU2Q|!̺hG]pgE%p865_ME5< +CX֍LVn`sNʰ?@XKĒ+9u6#cuBtd'd]hf$VF)<I;9?Unf{FQ w,8{WZ*{W/?\N[Nѿ!\fs.oC� ZN|9;R&jt?x4Gn4JYK!t7ft.=S<BbF@~TZ4ݙ0t V-fAOG_pΤ2:Nx9dҸHfM9jULS/w8(dx.A2:�z\JL*1{ WY*leo='QtKUEЙV#Uх@HZM-Mdٝ�]$1/L,pd@ s㚥3Ym{_} שip;K*^Lf0d vuƗ55?v7ņe鎓Īd]cnХMȻ(7g1H&^ `BMdSvlɕV |'ʧ r鍓ū\7W]62jĝAm;}u`*&"3[UFV n6' ҳv^A}OqEm76j�F$ڶBM^JAVUHPS,nljfV݊6f<$3&F_caXp)9\n~mr.2]zg|9sNRpc͉X7Mlc!P0t|HP1^NT9SZ"Կ]"0\:مwFzqMODsntRǖ�>-(!?cE21; endstream endobj 516 0 obj << /Length1 1806 /Length2 10607 /Length3 0 /Length 11751 /Filter /FlateDecode >> stream xڍPz6Nw4,H#t4J , tw(tItΰ>7 .X u@�ȏ¢;a'00)�� �~ P?D'8@�Ԝ`Wy'g/�vK�ȓ?r``GDDK@{ vI[8YÃxm:`W0l]0@2-O5%ꊰpZa�Dps3''z_ֿA,-AP/` q�4=O� o" arA@�Jr�sA<%v"J O["dNP5je+7g^}( !Gf@ ��{Zv C[`(#p|\A`� b Xm P#`?1b0'=>�_r:xCcFOuoӧN�nA�7@LT "OH@rPjDS_[p�;b�6%Pho/߄PAMv#B q�y`+jU uAmn#U ҂-m\Lk9B~5�n> t{G'Y#C*B-~0�p! fxyNp �Q {B�^ߢ?Wo$U!AH @ 1�HPAa`WADtAAD6AQ�? ᠈nKO|KZd/"ؿ "U‡ n �1L^ӿ ?G I[`GDl/0 ęq 鸪"5ɲ"gvC:+hv!v"</$[߻W :8߾>+ܓæ֓khڊܭƒ&JOzѯY?P06U- l;F?e`KE4%ȓpb$gA- g@*Rk31%98ӝ5YH5d>vM ++˘8;%/*6DbD EOV 'Mz!\ޛzLv:Cp[ >p:zVMCK[Z;m<w=?NyODnp:Yf: voZ9R!eil کi{EQ}6ۅX+ :uYZCL6p92w<p"~l=UWfb`^7=R&L{hi7PF)!C2;燓yB4fb }d8}pB|"e3OVݺtPHwR=R vwC#; TxT^Z|Gu j,N>#9)7a6BQR>"\҈)D?.GQCxN漛&tC҃/5LC)Qr.0d-O$3_Z%Tkt]*ltiVӷbn vwtUv/cl=cKIq9vGAesL^>]V ds"|`I y^o:n4G(S\ԑlbkTE0Al Y(L O-\?ƬLM %׍}o.3Lj;{!ij yݥY'[8vh䧳=f3).|Aܛ̔-&s+iͰr?}1Ξx;-ގG |ޟ(м[P{]/KZyI?6F{Y~d/tJsr˖R!`G[ i|[ jfi(qꃜ'H *J.mNҾjOF1s6; <dz"I7McI2EX+)d"fJ$*,q4z9Obi{f&NG>XV 8L% Of`ϭ4~͉g0^u?Xwe0j!p<j-Ϧ#!b�lW<:SsM yEW0R?G#S8;Kj@iԿAdw,xi"H?i;x� &lٜ+&6<ߺɼ!V VO 2kk̛̉dm<v[[ƙfdw03ovm_?,cֶ߿mP%Yh'i/ڎY-LdH7Y0Ug^]r2�cfS|(bpt*iEa92XC #k%:i<�# ^}.-HV9 5(ݙ ]DUFˢ''QV_xIkn=i3oXt΢&rfˠ~㸐5yG/e's&c7ɑȇ[bpB\nQ!ǖK>RN:\HuƜR. q1 ^sVda7<siKďA ١\|U�2p1VJiR/WjC+aSzxMUtq+VScpGsX,C7/ڠ1`옇gZ/CIvw8k+MʐgH74;"^_.Ni\<6vƹ0z[8Mq"+R: !~M$eDzcX%OjK-upt@5gm$ɏ΄c5P3oq)wXˉE7rk"zF(*t I=}<AֵLJAA^*l>lvkڎ gwHL{q`:[&ĭ4$?x1Y1v"'gGd4rbvʥЭP"Gh\scp<VfO',hDU*Uh6c Q;3e<ih B`QٸpѴ{vQv)Oh?i;.Iy+؜nMPq5/=l8hfZ%'GwJg/˽OmcywFVK!ﮜb#o,Bø pDǍE6ÓJ !+qNMElxZ}=%nvWST#{tD\#-Zo5> -ۦsׁuUBFrl|jxդɓR2αk ?8>{fWh5#mflFxh<)Gd> I\v2*ޢ(h=H備T~@z@FeWyW<dzF~-0tL[|7$MȞr}kJ茒_ n=u~Wu?;}:8KPz2~|OkH}Cn<9;ns�Ȑ'<1~*x{fWB+3eceV}3Q8j*< _2+v|.TDuXwj#&1XYPY.2ECB&>v%/y|Ո3)[ W>䓏0 z**4YQ\/q1UW`ȷ>յ? ^!ccXI@({\lӔeПNKe(C(f8g&V z?g&W <ۊb(mO1f2>606fܑ .Z`ZZO^P1@ GC z5iȕIQI0aG lO_; 9QU]QO9dܤD=Г0GQ"L�87Ho8ǀf c~jq#oj K@MoB9^ 4xm3mgsŭ}'ADfJ~ ehb[1_P;;JJRr50D>;C(b08(*4.2bwD3s`&B x.MkIKi.T-F\v`#*7Wv8aQ9GTbĐ=.[(c3u%Zɵ~'~ %-WV!Q>\3شua#;9"gfg.GBvl&WQN԰8=~̴BJK/nДs2RֽA] pl"zjUt'Pۺ-;ꖁj0Qwݗ?6IDL<<@@\.>ی9u67 :m+f~7aVϟ{}`L+qNu�}v= d5dӢ./]/~DXhI=GD~n /dzZ3[Ù\FZ U_ ^寗Tﲋi WxU)qm$v>o谓bu=T~ }̛3 ,9ŋX+蛁c'%\t q*hm!OVx`B2bJkgi*C0+V.lRÜ|&_~LNJnp{9Y훩7ҰaQm͹R"srjL25KGhԝۣsS[\i _A{<H ֡T{t:Q0!>U7ⲇ" ➉9J&{3.r^zjVVemTDw=[fV'^!9WF"g IlF\Ȋ ]kvԡ+fd}¿OKY)glMwsWNKsoKE> 9ƙ BDi?/+to~d%͡c`+3o,gA* ǖwIf"꺛SBG/ȣ ~W^ ~b|sin[g5C^/ )OԐr9YWz#Yh6rG13^u~9q-x^LRx~A|AX"8]kTncSڔ%N׺A`!gG"=<$jnv /53\y[WOiMwL-vǣB9?]7Vm�[;.f_~pdX8=ul3)}RgqQ07 9dw5مjxw0I5γ̹>tM%AO#iN9a.8 s_H4/Ԩ}mk?xO}'unͣiVJ%o|rl^\LjN؝:0m z$5΄pD;Y:)1SmWGWoFrggV : r;P]/u0rR'3?<J*U7͝ӽW_GnK'Bi'33cS1Ovb f7Z<ةsW]FiE&Y&9FVqzk嚒o+ݔa)ժamǢUqXQ2(_-%Fٺ#v!1ELĊYcRfgZX/u}w(mtN*S�2uy>KϨu#Ž]щadx>gh^\q T11O%Τ|-jxf תc;so@A,{~LMV`*q)k+;$6pZVEfO& ܧ71&rJV֡|">"gHg#v#ϥlǴ$xhrCeXC#Hn6-%yt/ѳmi7<Bn'0Â۽eKȗѳc>>01bhH>Ǯ6#~p<XT[zcƶb&,SU쳳\{p)?G۹hm `Հkd˚5(sa<485<- z*T> 99< H!Jܴ'Jcr9�hmQTkpܑלoN&B*C>}ffm=FIUJ `F -yIrcط 7 ,#ɽz:cWTj4۔*o(=` 뢚[$aWi+ f7=K 4 7Z'3lׅ^<Y�{$ΟLIY&8%KDpgBu>jfWaJ\D%ix\a=&u'yFjoFf&UèQAlȘrۇ5$;ݨ#nj}(7k�7Z؎  "{,x(v,eݷp!/Jy2V7IɯRv9"0)-L+n0e0)j$4BU:@eE9MTۜ7W&j]:!^'V զ9|BN8]{yЧZf* "N6T&zZCsU <_Yse=v9qWY'cW)3l.v(krD}A"SէObC&_Ee<:"sVܺ} 7aV{7iEWt`L}pI8 v<kHmx+~ kFؐjL- |'f"ln^Z3&>b4E')nqf k=dˆ9˦Kg! į+v}HQ1]I`K00ڿvߞ&s3U!Tl?%t栍R f$J ×mZGfǛ\݇肉b$yGGL?K{b`Z5Ap  3qARa +7X#`gI;w:cd{%E9{T5&� LJqebcV 1lΆgN}MON#sEjH-V '7[UfѮe臤HvAf[ !EꏙF57(2ȱU~I5B Y_qJ쌣}6^G tQ#&%=fW3KVĹM=]q�ќcN;xXuZuTARc=bo>԰}M/ N&1&_&fk-;dbؕڹsnX V9goP$ߍl_9D]ƛh:6<z0: ³-UgEfFX6�ܰ"[׎M2W:n#ͨ5-yi,+s(Fxr.ᜑ.6$YPk?)'vQPr̆j3gRqs~B>36B}וG)bޒu>Y*xGw`b>0"O;>dt*bg t܊¼|9>2dlwijo[:\lN7KRuMk.\ֆY'/9QҾ|xNMW@ X4=_ ~q?Hf '1:̏%@pKҌOp;<a}#$wB~<gÜ`_X`k#'q['xxN$匒w2O9PP玺J9 }Bc*rP45Ho۟7F,TX\$,85QeDfX]nvXTd|joGPm_>j-t?$1^B62pګ_Aeϔws_ :,u͘b5G \q ?E.[t\Ŧ̐ &R쒨}jAxiO ۆx|T>TUfS=_ȨڞG<.Û*s=Z:TI̧ۚ op%>yZMմS:M)T\\R?bٓAiG[9{]UN2 7Q|wb[l<گneIvvL m(Cގ|:&h _2.!-wMv4a{hʴWև\< Y+E\@K K 5hs'}O6-+Q=ũVMޣJ ?khZ!;慓%]I4v=ϵZ ~ T@Gjkn$X5XJ/υ*DOqAtaImiܗVxU\QHR)Y-ē^c m/Qt\c[5f8 q7"'Q+D:e3? yhP ciV;*e;^duj鍷&"!$VS&"B΋0i"4?H40oJ' [q<zSE%~/jW3$id)]*#+c9?w-/^G̉/6#,PpR-$ǀҢos ;za bE"~Ͱ}<$Wb~ܠE!HLBdq 4װջw&f4w 5 Tt @`͛]_Ak=a_, f]V~.YZ@M~%EdPesö$Ui$AExG>?⦺Qyށ4h=xDM5G%@̾8yl/I/h0XK ![ :E$i%iW^{7=mb׭e'՝n-TUdH7L/юnEU=1o~gՇU8]F '34"pD tX uG:4:R""uNڧ �4:!:(BK;hl\G#&^yO1%tJϓ1h"kB7qRP%_L%xZ4f I~u@FY�U�1\_.G}_`vTvh vj1(Z⭐SaaK_s.SK\:DW!Z:LIZU01|rغ&g`M6'<HIMY'yqԖ#O~]kJ |g6Xmg"bX_% r6gzl8~f3]%P KzLq]\ne|BC!5nr;XS@`B[e"a5 Ldc>RmBYZ u1& Z@YYX|LL<v[�3bOW{+H?} I:Eob}*UOUHɠ{]@XaU.\Ġ,,,==y%= <zb;d9+Ty:3Mx cē:nnVB^'V9okVKH{uytuߪ+FT kr?g(d(Y7oUoZb{f\6˄iӡVBK禦D938<DpCE'97 #МY^'ӏQ1r_ʄ:/k(:.ݡ\Q|$ڝs;$-F>w^}ZYe%s<de=|99r#T'p+di7K&v-�ƄDmZ [̓ל<allāx vAw%oz=NS@&$b׃J7W:DPB|:s".vڛ _dUՄ3V,#NH+POk6 ']]O؛.AX,6^?)览ͨPrqyD;ԔxVmwY98-x!g{vVTIj9{hk, Jj3:#Jkw}>E{Qjy7,{/qJP\j;%(GܽxU37^. r:!lN\aM<coF輾U#Űȁ]~Wd,o4XBWie~ ]lZ]l%0u\Bn6~k1I6ݘkD:Ugx[ڎi$W$+xzN@2G|)iy_pT..7jJQX}>vZ&xڙ,Hs?#ye`v+DbkfqJcNRR* gWGj04WE?`cr($qlBcjt}l;e(I ܬ3`5M k ^[1"W$=Xw3y f֎-xtCʤrUG␢(J!H~42aMYF"exNGVx_ .(7ړ.zRȸU7;fV/YmZ o˔bfk/ȏP)Vlou(Gn]LR ߔՔՏcp,V!7Ӗ:u[+qՈ!BR4{;Em5ZBwUg+yGCOl0\= _>dDQ%C,H#s `*]ƛSĝl}1-sE|N$G~t~. ”Xr2Hdʳ|*kD\#MV熃r=+nM{w'G&b B+J?E3U\A4r" eq+%;#. m_$N#j(ƯQoQocԲis[qM[P쬲Mb!7RUX$/%^vuZS}!T6廝fhRWӱZ{Z7 "'S]L ;9فxXҼȶH=j?d= nÎ/}}zpBDʩI~jט./& endstream endobj 518 0 obj << /Length1 1576 /Length2 8336 /Length3 0 /Length 9363 /Filter /FlateDecode >> stream xڍT- H] 1CwwJR"Hw4HwIHwI\[5kͼsssޡ~$j5IA!.L,|�qE5Vn� ;3 *5Z B 2uyI<)B!�9W;�+;W ԉ a�(23*8 le_�:sz�+//7t= ln (XV47C vqqݙM흙NVB�w5@ rrY�~(ڃ`ƌJ а;aWZ:�O;9 �9*�@?`�+3U ljnw0x!V�K,0X 4s>固L͞~ % 0}"'=gs'33E2O]XCAg_�;̟ dm!Pw E ;d% y2c�8YXXy9 G�跓`D =z;�.N _;PYY`s Ad~:|'@I{�_ ey|Rrb`OL fbg0q�x98�V_[UL埂K( O۟sb]A $ep?}?wU)7$jgMqڃ< xRT(Bfڠ?&Ydv_tBn#Y P[!N᩼R:5�&V=͛}tV]qsůc:9z<ɋ4 �!P=_% ׉rqbL7�7�MA�߈I@п ;�h/ �* >-cde�!Ol�ÿӆ]Jiu[O= @ 9 Ԝ?Ħ*B؝ikDpzK;{ީ}Kw_;7$.Dk›ު63NPjF'ZCB¤!sh E:ѕC%ڽ[ڣP̖v9<]SfA`uY4! )2α$N#\kTX|oU77^K%lDTDzp8C4b;f ?Ec50eGɽ3 @ؿ\�n_""{I GokJ{t6٫@b3?һs=z 7^6 @bi[nz)OK/(ޗC}cG۱UdOSO..ʤ;l,o*mKB&ȧ-D8A13R?G eQnΎ{I&ļҨYKu͐!GO.zG\ ]О޽ܹdXhY%u>()3sˮE7^v/K|z[Ь2Tc[kn >aԨ&7C6YfаD$Ŧ%U/{` !iWy{P:tdAt@?Z5˒NcQ$rI0DHpV-z<$R}sE, s릟ؠ0-F#T뾕ٚe@g-VZUiΣ ~Q^ Kᖦ z&xGI_ D` 3 }Ei@6J56{B8F5d|<K&^pƆnz!iayL1-5iN /iÞ<=^C9_NKvR^Ʋs"?WK˥Z d+F{oǣG_&(3*LP<qÍ(Y,x1[~ ~hd''Ÿ* KhǛ'ٔzXx]!OQlwmj9P㸾%W/WHsD|YAC&$lU$OD|\dB^Nvhdfr[;(J"cJ?aU2˰K) iVN\XU}n<0--zy]{FroF˫SH s:֞i6) m]|itd5a gu|h6_:,+%-Nk[8 0MŔ,cz`$ ) =,~F9 Sc�Aڥ b "?(ZV"=6x1|i{=5ŔV2]Ns\R]V{yOzahJ-XUpu"6uy/>Q˩  =*mNd/֢yF:D/[BĀxݯu+MFWӚ/;ymdm'?ᗃ̚.jkG~yCp1Ĉ31FvK89+eJ#FO\ efʑX%B&Œi[3 Pi> ڣۻ!{7+@e$e)wBx{{Sf;|ysKK!`8iO`-E絕Lv9W+S;Z<U-B/?/hǪnb=*V@5Jmୄmp}鬡{g-Ofjh)Pt".Z!2ӵQgDP z6eR}9Lfe .PȫΌ{>,"c$x s|yar#vifF(5@BbkAI"zy<+A%>vS z@: 'kɉOV_jӇU{is Q@yD{݂a= TBC# B<�0'@>mF(pQ(ՠxA.9e)(CRt4rJ~c%Xjc֤6<j\L1kHO]v3x&bpZ>spPsB=r$W)>յt*Vzk-󶐃N0i4:7%.Fk4i $cCۿV̥Й~%%J-hD]Sm*@wdAc;ݙ;F4.`wre w&hiv/?rs) jS25 |P`_8 ެ $PRuu<BMKvHQ~m-x#UMm*SQwvV*>$՟xb1<oB=[4E)`yȷR/ܔG[ɂ=>0zDWˆ6AiƔB)𼋼kyUSp2F/uG4:WLr?ck `q3UtRǂHלy�[ᾉRY0�D GDn4Uq o<:aMYʛ~ذZ ;OFj1M%F񆏡G9hm}PgR*jnNr]ӥpj|bƂQ,( .>YXFy]>Eư8?UN!b >]D>jg]زFYMyD8l3d>P<GYU:ћa).ͳ_b-Us{%D֋=3OW,0}ڋj SXWƗ3mlp37/ a{^4gTO +h׵X$RI@qCOq-ģyMԱթe'Z"i *]v5Yj^Ix+01\ͰND؊A0E$ 1rb[Y#WH߇NjbkJ<xS\_PX:e@6_'?. sX AUN;̷@27TzP~߱D$*Wd�`i`C3b߻Rp;߹w彆O饗:C >Sd> ˣ"uwaU/>$'×!!uO' Nm WoVll '?.RZYƢڂɖ}/Y._);UqQOZgM1G!SSkϼkd|4(s)ce3;tQl"}"fp H O4}RυJ%W!P<.kҲx>lJ t"ژcxhԡ5_u> /a?xİN~.}Oqsyk\[Ie8ĦȯVk?0-c~錳ylkVAt ªa g#XΕ># 6*=$ULX۹iAp4.0(x *840uU$-ݍoĭhǢ~2HFE7[{r|j |=XUlbV)\b&r0B-;"d=:(E-<ʞ,#t*SA8MRQ CWzʺGz;A?4um-4[ȳP ͸U9mb'J\`-vs^wۢoE/.wToԽT=ɒEQxkv0{׹~ֱhOkj_pl4E}_HB"ospCX{.pdsMr)r72o _q:k3Ҵ!)'V&6Ň#֛ ʪ.Djh) 5$W]IU8 Ԓ))D#?S>>ܥMQy> Ll!zLAV؛G/w'c&$aLOd>/㏍]JTe"E/{^0@FN^uM0ޓses%LAďW;z_T ^#dbU%F͂JKʂ'} RaqB%�X8+Ƞ8JG;OX1>B%8[dHAoi+joF\fͩt6}'Gp@R̈"QgFsz͈Y=/z#WΉr^ nyH8[:o*pSDI'+B ;)x(F 1PyiYS̟_8,{f2(^>-LޫN1^(c3CCWuzk'NS˖n;!#_7P҄*"~M!u@\ɯzߔ-Fs﷋@h"zx-E|Cj.FN*jQLw}ސ~6o�Ar[#ᘴx[4/g5Vf>Yt KuQJz@ 0ɭOK-b̘N@%#Bi'a:,}U@/5jӟlS& avo&*.'<bga]Yӷn>>U7"EWz)4 ql|1a! {uީѢ-Nn[t$ '954txS[I"o9"N?Nͳ$_`:,w|ő'HBnsx<?lU4))7:#h:£ [㩂1|{I尉f|9ŝe8n8/Oh(Q֛)J_k2΋ wH\�lV<*DRF:8~vkmrw\h؜6c_'zN B\L<l۔UcYd2DE{8u9\GS$튔"s z^*xEaY[u5�N3.ţw!vkIL+{YX# 05W2"r_Ż/s{xs#9z!;N67\>(`$-0#=\aPF1mͳPy oWf ̏NߥA;%24RsQhM*aS-^ꅡ3G9_VϔO@!,\4Kک-jR0}K+ NQ?"(e�3NuG3ZcT7d*ͼ9Ҿf{LTS.OV{bd<cKS j##NׇʴW h<W8g{I$PGVr*�S.HW_JGh2�hCB8ꚲ0}}VVJ6h,|&Kh$I#:hEQ cyB-OA%>pf.E!MwDI0ʃȗt8QRVܛ 0D% Bcr#Qj"ۮLɰ\]ҎXZݏ- Τ͗Y-3CyLzw=~>[XHCDl4(t[$TMwGsRdI26_G+-S]/2UzDlsRu;4 2TNP[+'p<J{Ͷ1p,=YQ<NYx7= oK+LV՝ W -!>EruY,yYedz7,I u\Xt&iC] EmA+mUokaPDKwqn<tU?<f2D!CQ y{'KoRw4fu|W<<0frSxm6`#DPDoNyd} opb?1nK )zrz՚/SL؇m8J$"PrڥHP{3dcbOoXp_ g}{s6͎'0 O65ȣF٘тdC#u>.E8Cuy\H[6W:spUxL5b s<S݀V}q'jlf2teϧL+b"cN}ze:رu+\@b^z_zҡ{'Vݷ 8aJЯ"E>>|,O={* \C5}d:V5nJIwk\7U4]ۛP(ָÏ{V1wKXp;~ƾ 5czh/!t,l!Ȧ+%GTwW(yRQHz@?ph:)wcp8U c-XS(|!!9XPkUBgQ!jSiwBvV/4Do+ɅK<+ 'Hh ds 8'%&BKNNvz;*(PQli93>¿J=yaCͬ%]0$-7M'~]in5&A[p~׏n�âFn-נ96],QAqC5k_7WCߺ6ӳpN=k]] xIt5}CE#S!vÄ]jYdF.^K:vyQږw Sҧ y.IH |6nup=V3WM؀M #(=[+Ա{f(pqPV@URNrϊT+V6k'f2t9<xVۺ2&p`:� taKRb*RI҂Z!cѴ+lj煒^5W5̸?ʞ7OmuՅ4-cH;5ȳU|gѥs[ NMő҅-$E.\kLd3_rP EH SB ɬB=&/mɚF1Wv( tZaK S\M+Q*>=|c$moP01 OobC(S3E>MU]+\\8+[VPZAJQǹmt! ϪƠu]nyq=_3 !=8&]8PS=W+d lEq-�1vajĘW;4!+<om8h/CHb5n\[S*Qx^c-. 8q6RkaBlޛo?l?Ltp󓏶Sz\ܾ*fh/cZs&w̑yv&Yt_RGhGiڂ<noָŤս/>Az:堋Wzr$3سZ{q1>04@e"Gf=b58 `V17-Hn'F pYHdc`U*wȚf<tKGKˇ^$Y!W/Sh9o݆U&fTmOb`&hgxG"wQA4vc4Z"&='<OOJYcA(kz{va/33lLOo?QdgȮ[C~:eQ,LJd.*_i=xL56<橷9SŐI$ X l1ʬfWpeX~)<'Bnڒx{r{ޏ#Y⼇}�{a=Üg9ԍ}52y!M 1\+{x\Yi@w Q7:Z}8&&qS/ԘCo:csY7/ͱq/`5>F܀Y$m$)6= ci xcܕ4Z)%^8gs Af  2Xڤ:si!CƒM`2$OӅőD&Wa:Gd*w)Y^?3Qşn"+t@H/vşʟny0l/ihmOaWՔtkRv�Zh=Bm:,4֛MKW*JDU: ڃ\EU8.6 y%yf#tL!Ooݰ4N¤ecK~x c\o KzE endstream endobj 520 0 obj << /Length1 1379 /Length2 5950 /Length3 0 /Length 6890 /Filter /FlateDecode >> stream xڍVT쿦[ZRp薐0`l4H*!HHt#%)HwJӯ{=ce㑳Y`P?/PXSW� 3+!A%;@@T& Pp E$E%@�(W ]�4yj0(Nw@ppE\ B8]Pm@�= W )Uˋ煹?xA�]0  xrK w0^ w0�ep؀pT@j�\?5y5�~^;dcsqA} P{ REx# @3y kT�Jr:� ߟ6WqW%+Bm\\P `ԭcm`g�yU@ك�a (*&�6|;QsP;0�` A�(?Qf{!�S x�+slaPgO[1oa�?~ G@*P Z۪ y6?Uv0Pw ?9\81̀@S7?ϣ? ϟ~=(EhPgkm!.UEPʐ;}l A8Af* apȯg?|(88jR]`Rj9a�C<j' G�>^( J�`)$C=V*ll0lC0; skºa7$M Yv?KEq*;wonxSNOxݱfTyr5= xe7 0X<Ĉs(.kzJ^LmlV,16 .`}gfÀ7򷣷bLV^]N. ;hК0`oQO/x7J{;uwKuD%cld@;}/ĪzJKwf͖/)UN`6;9*3)&ބӬOmq=q|ǹx#7yU"89O_^7 BwM<x{~f veݳ6E7+8kՈ I)HB=X<ήbF/OS9Ji74gMğVk1~ADDQ]Ua7:Q1(¤ڏwc ._4$s(c婏ȇK�ގEc |ʺW 5!CH;3~{owȄ�9Y6hڡ3V,Wك?mwh{ba~,n+B]mS:צdŚ Bъźc=.}2` "H1ʢH.6CN|�4ͪyNQNiܠqÕ1dzˀRpweb|]'[fYTl{-j&%=na,wL2G;e7?TXa-NcY 7hX| J'ڙAN'~Z{ͫ>� ߥ3tJm LJžy9n*W49_U[X R$Y[=_kuPѴv>}CZatMB1pb¾}f*hcXP(S.vV;B_Ėtplt.lHvM///>X;Z6|sg"A73Ρ:}m@MFK9RCZB,kv2.Y1,1oYJ_?qׁ@X3> ⫄W@Bhe?X>Ulaz 4uQ^[L%w& fҐ?bt'x&f{>3å;W_nn' PNZ&OsD :]MRۼON/d۫*b_?Cy"z!=ω}>?\jږRLL>˗i$ubn[wP 'z]/J ue˚#{j #O$ngQrO0pGમp"]'=cCym_KN+47qխu.[q޷DzY{4,oX^X8 LÌID3I=-ybF/ќ^tG:8n}.*PSsj8';%;#/̛( ]Ro+-o0 ;?nTSY8g%L||.$ۊkc}h*0 sqqz_ ޻$Lk@ʍkmcK"CUׯ^g+Uk VH橩 W>x[oƮX "։^%$zhnE<"@,´qki𘦚_wkR䳝gbIF&s7x:xEQ'Ja~ _{<Y„nY/ycźvY&R'˲gd0?_5 G21#\.Ԙj"NDh3ou<xHLji@. ֺK1r0:e 8{k-tЭ dhL&U6bNLD;0ƥZS' ]s{註<|rKƱT %Wש~ ;i'%|F7,bjYd,uKݺĦf.`U r|<ػE+ZeĒ|sKh$,^w.)Jwz)u]q əPaqjWZWA@UJ|6S~L_G#_S&<kV�֤2y| PO)Џȣ.r{ݜ3 )VdTw''TI qBЧC]C8=M?2219%%Oo%rxblMeK?}xL^wa P!JRq.mid2mb_hR/1F}d|By׻7AZa{W-h*=&gZYN3Jo,Rs|REEҸh&d91Ȋ@&mgSEZ<iR[p"'T'CJ C)4,,nё,A._pH?G^!m<Ώ/R(z9MzbT{_@2F~>~2 הj%\ ]y힬n?h.pkFO9kTekmdGi=m"͎c&+-}!A[R⁲D aE[v3 9-y{kmtBQ7<D~s^Ǥ(\1sF1wDҤv<[}ڜ")RU2MlT)rVi9^3*Wa)<&0<}tqgǞ� ƜWy+r۩l*"M!FUe?'cw.T(|hz)^ݎBp X/B8 u'c1˯-VB)+NmeQ ܺ0Z;1{%|$.Y,*`TuYTypw綬i?bY"^ay52ׂAY^7L:o Ͻ{ jez1Sb�t;_; '@#,lWΨYefS,U֩&rd 4κjD6<R`wue~&^8ɑlڰ[Gcp!M pqtsD< 5Ǧt=7w`y |,Gq} mZc40qd/B+W?` .&Rv2!)Wd37>XJ.QܧDžMcn6陽1kpwcL]s`JED楕Q{U1'˔=]з ;kOm0E�IgpMݚ$KJ|`9ЭVD,<$0yf&fͶ&}5K9`f)aeVMp~U\<䩑ڛ [ 0E\il;} q]ڛ|Pm$K3=7ڠ"m&;)ECv�遊^*5ǰuF(|7d$lpqFP8ʲ}ۋtbnO.eڠ2hܞ�:l$ОfM}'M0sQfRl"[:ng62  z _lO[v<Ijt֒ZwlZV)":6{mq>4\6sTy(QܥSl݁;PL[ne+y}_of"wvK}bH=k?! 8yҿHEQ#Hp-תܪXl~FiU5qxn-ګuT}ԅ)`ZynZI+3MZWn}ko[ "&g[[\WTH[-˫?d ]k`vċֹw rvfN(M#L*.Z))F bwiL <2A~!.ve6CG4NbfRx).?>}NyӻX JǢb?n?sU:ZpE+^ð|KݧPx>7x/hUC̐Ȇ&]hLg] Kc:^GKÞ<zi}C @ >idí?ex@rHFWych}r.o֫+k5ѝ 鐽c Dx<سSC[WFCPس#_RWnTT&f[i>k'pbP?ǩ ʛ٨W^erZ lEm*M] s^sPxR0kjs4c.NIs:w‡GNTV/ËpFɄ%FO7 ]D`uf( Cev Bn%PV3QVYn X;c(ڗ;]lRhPp!F¢& F:2UzKJ*SPBK{ iZwl9U?i$,Ŀ0:s6PǕ޿oS<[9=rVM+a@p󷜡9Ҏدhr҄Yf;*0x'{ɀu~_/g>C|S6}rr:!*2uZ-Cf7sJ]ľJU32l)ޮnkG;|!1vx*[㧉')K xN6zz0Thذ ^Զs<Z:MRPS+S<smɝI4ZNЕЕ@&q"e{"<OsGramJ;Y#h􎪶46˶TR6|¨UWQ\2g,΁,MB5o>V飬 }l ~R:2oD;4U d zK#C\FyꌖͪS"нN09끱V3xϲ)K"8|m$S?<1f{%L⋘qڤQ僷 B;Z`괶 /8A !uvh&'A]WS^? ,e?v5<mqAh#tva!M2&OLƞ݁ ƴܖ5C~<"F$ˬP|\M=upP,<2?ë~t(o%Լ2yȤiaA8X<cSiI0/ 76` :Jhv,9?k֡;kٛrGʞNpMn|ғ*>=֧+NDz;kJcxb3N{f!Wq.X j,!g+ڢTW=uA| &LԟKpI䜕;7E߿$88+㢫R~>.du3bd6$6]3N4IС@ݪ$RI<7G]QfrZ@_ô}f0,ؘk3E8NaNjq$TT^>f?n= I'- J7VcWZ*O=U1vj0h# .+@iéW,𦹀)&)LXR~uy8^|;< WͣgL<!ŞeA ;_’W\)%;vvW8'SS]"gjTAVITLֱsvg!ކZJ~g B[*j*m}yB.OFf;[ HnY77�Du endstream endobj 522 0 obj << /Length1 1393 /Length2 6165 /Length3 0 /Length 7106 /Filter /FlateDecode >> stream xڍVTG@btLBmtw*!5ƀ`%(%R"HJ+4HHIH* ͝~u{v>gWLEp 4 + UMd`,7C`hw/%8שAx7}4 H�!r90(ՠ>GP{U _#P�&ʈ*# C.p$" 4EpRrb=@ ___1(K qV".@w 4"῁f.?Ԧh'/F91@|mYWANgD`( Fz@Q3 ja"@(# @Pơ@ ec Ot^0 %p+ Qh$z~a[ qvB~Ap�F!<jzUtp,P ȂpO @{�A'8X7< �x5?y x'd#,- uۤDeR` ".oa5" OFm(ON.W0@y  C{k;, owV_a",7B Xb}#Vm,(g/᥁;!0? ( Bw JmW%Q0㯝B1?�?x$Ak H CxxA@'4kR@/oIR?]yc0M|ɿ�ho=P]_1"(4yS (, +Mq6H#OOMWCo(Wvqs)y޹FTE?Qáo_eWWҺEݎW4ʟl+E&DG30B=x( |$QZ; }a&fEOaNe=U`.ڻ0ZbF3x|\?"k΋?7[(P"QSWDB=VN=!۸qR7<-eTҙCux_O<VcK-6Ҡ֯ r!p" d\EetC(ODtl˪pڄXX? qrs)!t5]o$$u&j7 v' xP80f$:}[GjL#xSz*T~ŔjX .gtsv7m.p cIA#OC(l3O$z ]wv?۷fTDm6ߥpU1pz6Znk;APjǷ%U#cĄD1A $zV_BaѭXǥ\Ez~ `&>m υFڼIw6ގNg2XH\wQ@"G›vicÛϸhr.vqz/Ì^k!1_g5^u@>*9[`S {f7m@wZXٟ}Y`~w Fz$Nj?]k]:l=gU>5w ra/u>ʕohsM?R-Zm?eUI{TK[6Óv~I<b,I {;ҘO2^LSS{={TIV)SL槾 ۟y9!OHvI0'l v|Vڥ0u]>^m gC**"G< B8W?r- 2x/ x,{AmԪbR{*b˂O)dflۙ1/*$q܉YG&ajf(&굷1Omi/dA,&Oi*Å|l'5RPdZutJ!,_Jsq!&I9E!IR,Ԛ6~=Ro!<{'9<[S ]tv6Y\Y]Դ�'nbV Qr끔Ce4ܒ41ց=zpBę'*˜QtVă6@Fժr`7JGސi Agg =.(yz"7T'fUwEMJT<"U<^~n*F::^XJ7AƂ�gZq4S$kbc{酾\'*-^QjQΩefUs4CpQb&~HIUF_zw m)QKꢵ:A [%pNX5OqՏ%gGo(.ΡvijMZJwRtOXG/QD{uvkXRٜ>(wkdeC1@n0m7AmoIG-7;/~vξVYDQR:^H vuJJSrH1g;P%Aee[v%Z7{eK#?$a֚f0%)핻ršr{o4y hC#!VOliX%̓l䴰|EN-'9t0OcAmGOl=wXdb^ioŒ[W:MU7 3p?_03Qt'GgmCg-6gLn{5r1p,+'vZJN05$cޙfܳ:sǪ8q1i[jd$G?OV4W^q\RrZiPa!:ٝ'W6V/2U;:|J;4ER}-foe>ͦ=o\!qHC&QnetP\ߖ6(\atD<0s(ij"<?' ;WJ:Or\aT|S,u\N[n T`y- zHjv3[Y\UHq;mI]ٮW$䧧z 0f&}hA2|v/zNJ8:uQ7 ޸h'a#NlC(.\lі_`Om2pJr8sBTj!}6G : )9$_+p}cTcV4sƤ$\rϑpG<D2(0> L2tB20~P@p3>!+0YĂ(O+@E4^%_"=\ B#%+w91#qOfSmp>R+ un/5.� SNK#1g/*/}\x`y6*5nL}/iQޕWӭh}#أU᡺ .v?M:YjhǙ99(>"q;{;Ռ&޻Om7mdy#^D�0Ԛ37JUfM ~/~IYIknMs wg a! <{}&K&">dҨ;u6XI1ʳ+tdvg225қ(Wn*wΑ)x }5v' -$(7h:6کT$_漡kH Cn]M{MV,$BJZWh94xpwckW_AVn%-nZ70]!,Xn;e_2P6ݏ8w8k?:|\J^stmVoWQ׳Rݸzv >U>@.t+IArq%(ZejyZ X^h}:Ϗ5Uc`] ڏL.UQBhR(ZrZ1>/Mb8soBːE}iEڄK~ k[rRd9Rah%ps]1Qf41bhw`ʞ /2v}LM}*b'«'ob(Э/tHŒOFZ,XZelo#7OZL  SNDϜPy8\X ⢎XE ftLvTVN4"~ƚ`8`ijze.4&^AbIn^Z|^BOz߾(r&@\u[mr&߆dhRa=*Nab3[y̧h̙[]Lq杌1&=dU?*`2Rbboj ]/vKMWI#&E *PMq'hBy(4sH Q{>7DKccz%KW=C"E} hHyJ)ܓ'Q>#%>`"-<F]s*0y ?ZKXBXj=|~?H4˄"'o&Q}cw2@1K_.w zu,rECZ*fn J9s'̵iNmm,H ǥnro FN6Yܜ|-Qp|׼l+A]gwX׬\ $R֔VQ_m2^+$:+LTnԦUضmBH۩Qi=!8@}l-VZ.'x:"owpzEd_jv1?޷}euHyQpJքMrv`"Τ 8X+L=IEU]j&r?饂YcP# {8(Ҡ,%o_+I_H2<^!gۢ1Oy0*(/1#7%S A)~LF.qӿǹ|6: ҐLJXߎ~~]1r.~ˍ6V dw8pL =G[hJ,Q.=q(~Zf|v-\f'r'=J^u$>Y[/xQz@4r[hL%doXD&'"Z3rPbንAqWy穌?6ѨVfi�W?)Y1K|TwlfC֘E8QBe]rUx$Q *@{{ՙ+5MǼuꇡ:kL䷦Gͫ]K ;Z?ĬN#%<MyKI1N")WRj�\$J6UlF.Oa|[,D'[nt3e1Ė 17>P &jZ5aZsuwC5[u6W7ӿ;9)@TiJܝRj$w@B O88 ϑK|I|Xb긻 :sZE%+e%"kY%#D2ͫ$)qH`<Eكl&ib17UdBG1c:=3<>{'̌cu>ˠ{p=Pɺi\nSbL{u'eA6*+wrxTvaISdT%jK:Pf짧kk4#dn3HcORE mHEZNyL34v2E=º~Μf %V &\w3It`_$'K tN_VP,J8+;lJzhVhy+'2lp'q\@KwZ5$,06M b|Ytg%/%*�:'ox?ki X>RC&%Ad@`^%]Jj <3*mInb\B]&~9Ywe b{cwRB.9/n0>x~k4Qo7pmjw}Kĸrw_Tܨs,X *07bv11Vɴ%pN)` ңYM"4ϋr6ZRAn9 }*~38n߇ix12 'AQ~{{öY)wePPF(%'g\1.{Gpz v/L[hm^Z; 4xWZpn.q_v O WEU..%E#FYN<"UZLG}~a" \ykiou QY ٌKDmAa^O7r )?k"Ùq+B\F>P&4Tu-3<Rwu*.S2!Ǭ֛Z!K $HJ_٨w'0?20_#Kyo?^"$F(o&SX|*4R$vx?&qǨ;壐$l2c${ݡ^E:PpOqBH Z ::֏x뼦 ˲\adőHidOkaF* Ϻ "<vLjS Y;ӽ)�2FVc$9t+9V:P!x$Zިd) /d_;%єHN0ڏں3ex m)l?R`"|/Vȇ ,uL13*6=Bc"WkoV V^, �?QepӤ,z%A"{rY9חUj2 endstream endobj 524 0 obj << /Length1 2615 /Length2 16903 /Length3 0 /Length 18408 /Filter /FlateDecode >> stream xڌuT;)N!{qww A;kBV )ݵhqn㮬䙙wU5,A@iM� `cdac@ִ;�kPn '?l$\f`L 1U9��vv^66� A�I3[K @tC�9{Zۀ!L 2} t0s(mF 3tB6`�+' Z i ݀@K_i&ǂB дuG{ r 4*@1`<�v_l>lfart6suX:�*Ҋ,`/0/C37伙9�bj�3HfWZRt+Ryo[ltl,JݙU('+pA t�,lX"vdK  B~P|<�;O"vv`uB"Z!Sj0` !;Ͽ sf rrmwY5TM_8 `xy�7f rNV �?Y@L<3tz2( c C6n6 ] ߘ?6vCD YkgW+6,5dYxۺIz-Um6apul�mʿ:ZC.7HV! RN ˿6`j5nn/;de-^O9 @2X\Qj-7U/?*X%~#>�o`X#v�o ` | O7)F>§/F�V§qX5#o |"~7#ͿRvhC?+@s+? qC"�9@.$kX-b[\DԿ;d=2=fo;o'A@L@=K@]J.HlmNX@d@H2v@HNRR?2\8!LNvD�YAc<PCrt<\ok!W3d>@1C^IX]~ ); 4w"L~{ =(*jg! rqm\tC 5gq BNJ@z!@Ha}~ t' -]!Ԃܓ�^@ 9`]]Xm'g/͋;J L2})1W5_Z갍H,t;bx^O{~Dlplhcz!eHtlDIq>Hx˞QHbkDp T"݇: |d *8yG+x tv8:wL 9^)@hǽMNLE1y{LE-(&PR �{R%NF9ZU=Eg퐭<ldO|ryKLҝ}Ğ겝1܁+/G)13n} .tLx␴#͓dlYq6u�2)]udBwU6U03( 9cWؘ{ %ib敺EP0+`mHgwnwD$;cR@RqNJ6*dL1y=™O.r L\^M3iYhn2:v8*T(wSpK4 ,W0uC?𙎍.bg,xP&,AIWÞU c4#N{jTx~BPD@Ke㻪� ķhQ�pk+qy7(:SeINs*$Ak g[ruC(1U:'൯U1Ai_YgY 4X,g;;30؞xIˇ飮#w}q9)]{,n.w>T!r W5?B jޫI(q`"d(SuW6D׊`,FDJĂat]g<McUÌ/\^1qo!?z�X[IV^Qp5xzCli{<>,bI-ku:<F�%L-T7EY_lo#{DLAҖtOpH|KaQSqj,%gv'%/-$٢eHQqn¬ІV#6Ӗ+?_D\dgb8 '#W5s>  �ƍZ %F-brgN͑qp">w]EYU*+9Vc徥8kO}XU1#T mNʁ[i539*Q- oWݍp2:WƟJo) _bI:W;/unl,exfdS1,r# O:bc } ~Bw?N[[+aCYY5xUk2ŧϛ+6\u_\ю>]c(7 dx"$}~hBxů$[D;谏 F./>ړ՛Z67˞S?Ndo吥ݙ>Xivd uwHҏ!.ƍر͋FM$JPxUþ4)YN#g "4 cyKTxQiX@cZ&iZY$E~a)$VxӤ3VÍq3TYUIIEX7G$nKAUvM6<Bo6\FL Da8b 2"itqZ\A}$'V=`Y\+ 'E:_F2pBf9DY"nڱpn '"p}dm#f!K]s�I~g֝l'فR6o\e.~q]ݳM\p48?_:<Z9 4,Q?Wj?hBWo$/p/=SESuؘc!cdwD35ny3A?mד'z5kx>-̦mlQNRhuޓ^rF F X>J*憎8\Qˊl`3!&,*4S z"}AP8gDyt'52h>M( hE_t[h6_~(E.-G\s4 YC5b1zK]wWƠ|ŭ/t\V8\hWg';z^e !w3;'R"uMVRkߜ_i^*|J91 ~2NS,`q[L#{7CWXI?XDdPdqN?Qd -s '`2"Р O.BaB sI_ڐ`)Qtfd1aS'FuTBBCCS|zh}FŦ2+>�f<Omf%.bCzjf?WgK>M8]o!bSert6n=_LS'qjK`?&XRnV<E=-ԯ\, ~TOd,kS89]iwg9(ۇɲ&\uL6^Rfx/6&.][SVmz%(CZ]a^q"xSݜÈE3bJ`\cԼCh51/'/gL:^1E崰Iy8WtO~ʕX*mRib4OUP YH쯉NM]X *8_qhX-?ߔߴĠ} 5 WXe|'P'}xL oV5N0<a8b25;M$ڕT3Mx.'<G,eEda:Uc4p;Sz L\d[,idQ-0ֵex7Y dE4|:g=OP_U]vuzFd�: {qdd�4낍0H+R\~x1¾ɋO]C3= P-u*xjdfodz}קZI ̥X"8D5+#ꇿs]zs]O zJ=:I1A�ꈮ5AM۠ݒAI3mM~4AMK *JB ̀mw߮= ΣZޖ[=f\r˗,- 掏Nz ·7-c}lJ[XOCD,|-[cC`sqEͭn|pᨠR.kdl$N\NXs(R'WkX A2W9ߠyuۭ p)#wQEeW -\u@g3~Έ& PbO/S8"7Jw4 ]OСo} 0,;[?}8/X?Utݱ(]/}|Ɍ3G�-` N.d nJ,=o5W5r4pv:S"_k;A:?lMƕm@Q-r9eSA%Mvq|5/gZG,Oi#N2''[Giy2ɺA(.r/Jj9]U9!fg:= {b(#s#/\eݞAkC&}vn;\4srΑIPAT`sT:9Ԑs1}l �JWoEt+:N:;O$bܯ(Pˤ>[XYK%|w_ POxE} &~ OLSjs+אA2REyQ\9 nmVqxF`1d=!k//V.*{ظR yT^u&/ Kv`֯8Oa$VPusp([K.'mwuSR<�l m~ G20%(}FIΰ2ۡ\1myf ,9?6"3"E 7?um\(kԥw@X`VgI$+xL6\=>v7X0(l7@ٍ;wM/؂:n(A6<_z zD5\#J_H .ry$xO_ ܦ³L.mhJ:~ez;"B"!ۘ_`J$4cWk@9go6L?~(> ?fj1S)+u\=/;X`VV?xFLHYn&!))M06w$Xen3A_[*\c.(PFx){<v o&S3_o=M pfKec6brßdR38˿mXS$*J :3kkXKsTğf,͞b`H}fn56[(͋>&SUK'wrK<<ysQ!SO[h܃:#bidyedejY e `#gtx#J.K-Ƶ` B9 }EfEOfʅ<+:_ZM�֔543 ⃃BN,h'N.wC]6B _LLy@/0;j͗Hd ۥ3X =y3ˀ䂥knjƓYPPWw_i9hI{$dvj}VrG@X gHnT0=ٌ6z<s;Y pL2d<MzrnqYHZ l&I>E}g^0<Ȍㇺgu_|k]l m{ OъZN' KtlI;7_Cua<iVcjw_hLD-OF 5Le N][N\Fc6h5 y,U!VżׅC 6m9ķ#m0)Cቻ.aZ-W{MFj? QíL8*jG8NZPH&]ՈbnΑLdiHD)uVc }$ 6@A^_m=RBdzUw8x_+m[~so9J:zyaV͋I>(5&] -ZGKQ;,8@wK-oTeaKpkXl݈z$OT8o'YXe%§a+_E;NlO+iҊ0t̖j7L93[,%•9j&_7~ZzL|gƳLpc T 4zgrlX-w) >0MwQA?(K^[e.br!0ZDxaTe@{WW"+(|0gj\浾0sLb(nh*/&`a$wʹ~I/(/V=::TfjݟF6We:N]pJpnE+Mԍu ~Vk.ê^sl6#!klaZF_f*g⭐ft1~`iEVo ^P5`ySwJEݜ#RtF*Y٦ ƨIěemaIח%B)qZV&:Y50҈+ef`9.<tϐQm+n73OjohF`$Ɵ"!_jkĺbKwjLQ H }d3eu<sFY*=#nP ƙ$K*K0tMNuk|¤f': fe;i_X@)n[=X dW=g82||Np$g.0s)%sXZ],c3\c'Ҳn4$I"V}1:xଢ଼% JÐfB c>X SҙT TujX9N~KMl}VFPԝqB CD6ZPpa7זXg^T܅%nI\YqHx;�36eg:%[9XqIW )*u+0UZqu=?{sE-` xw}WHRy,3HPTg_+5u{ '˓DD;բI 16+_n+ª l-}iļO`LR^++_fVXJhmwh. MVkQCxu*mBa`JB+IBk !!I#O,< & !TY$m[NG .WHdI0Ve _}xlc*U_.$PwBqbDHo74WJFRG/;7SC0Фb}lfW5kns(>PMmΙ;t#F&.&Z|4q,dbm嶉?VIA9·rSM4ɳߌ\ΊUR;k/@:M~<KI9`Y nhHb_cO�;?$XLSK S V'ɪ =Jbe,*3 `b�7Y"r,aXAt?|E`8TW+Rx(ܼX y>;E ,}wiyYJWob[:. ? 9!?#SF-5UnùUԳ=N=N> \1 =w_c̣VY̼咨)_$5ec@>_lU~ =o|krf aT1^>SԜօtG=Oi�W <w%t+Mwтwcn&2)} Qْ:s}nVʣ j bt[uTVϙY1[Pw+ݟ9l(LR*wLjP xʥ||F0PZG`{,22["xL;�ZtDc t �Z~B2?7FuL}OOGd6;BIAc }¨D!/6gk.+@|$,-VRl y+HEꡗ]͝Ъ$Vіwo x'sp%*ny#USF 2 . 6@p)|%yr& ثu#ZTi)} ;kAqU2r —)7B#\u1NߊX=%NY! DHNBjP&)o/Dˊ%6/f OhLꠐ9lW'�EwOUlYyiAa KƔHNF<&q5,6'܇8@8P7d45L!NYbbf|R-ɥE&< 5LAU?Dd{'0 *nfݨ^D^Sy|!е'hhľXhD4qpy还0zU,�C$hL rUYxO滹//LltΉq5UFL?^.wn4w&cH^lUO MȀ 6߭%(7a]"Y eW,NdFI8Q0w$OuҴr'"Le gƕݏ}e N?QeX/*2V(P S'%6X[߆ MtLWW(-_I#0%:ܮB)Z78//iוwi%֕]Ne@f_8CRAl$sayZ$JoΘ|5$W//G[ h?Ĉ҄xv$^.>,i>[gs/CE^V';n}Pztf;l& %`M7ק Xw$@k:kV,5?Zbmj4#/ZpdK"֟[]Z ߔ /YD(45XĦBk/ #K!9&#,{xz duxh:2l<8Ipj°AY IgaՒ2] bVl ,OuosF~H�<ےIgh@`+K=3)8\:6ƃm`ˉM-H *qa|;^/yV)$OHFi8ʽ s-Zٴ`)U$Qudy"*I�FvY¨,U 2zlNM3;tUv6L?A!΋ѬΓD͟۰b-x3? +<ٰXg'8n-4qg^W{+?M{7%M~)j3n}50v26Wy_%zF9ɤL>T3�[I{ഔ긋GAG'tÞ5>./tpCUH4(vB3@ـ[G 7~a1�St^D0g&N_Dl+~ NBtb+1>$O"-^g/JnUq_{XKImաߊbmC*AǙGUxYzu~ă4֙6CKTɃ`)[ԫ-)QX^P)#6ԎRɫ<0اP_,fzNC^?Fz чGMPJkB.W-q}'9[m#tWkC -i[ L4څ7BA!鞏co F [|Wrn $ 98daVꁰcȸ~:YMIW,h$CKNyXmZKTJ F:J*4m๪ %P/]P;9xs" z.R /is.k,G6f4N45Ї.fDz  !h! R1]j�hIGwgcLqK6=~�+а)2 e棻Net=ZY"/J|&.23]H*<iP$%"+TrbmHFT]~~Tm@d^Vˮ<AcriJYc]!n8δByÇ*XP]g[70&V_kZ }^&xܔxmRǧ�2oAw(det^Dxc7JpExuI5h<="r(2C%l{^1 @X-V1~9CHRR2 % M6cŰ58D~n? -$}4Z7~}.<7#ԗuD:Iͮ+]5ߩrdXLQ]~hgպ*PNIC5l=ZsƤ5 T۷f<5;yפ˭`)D %K,~ϯ4soGic;lM~:˾#K0쭷ZicW2K?=XZ5/nDM\Ap?ėuuyu2Q#2G[}βE*+W}Vw6e" =ZRLGVǰ|Z6cI 7kHlb dWL.C`3 _5VV9) 8X0^bĶr*%B0_ ~k` ԢVK}MYS}#1Io>K Kxm1zUح:O:mU`j ]p+>ky$rNZfWا,? t^뤇Qy<֫a0$ĺME]3L~wbf0_*:<ȐL3ɨ,s8;,aG rgr4j٩)A],X<z+ {A/?Z#:穢0cɠ-ϦЪH:x S"h[L\CLD.51=ԶF+/n:c-\&:&v vy:ؠHd:q#k8 -#Z?<ɨ9a :.) WXv8®=1tVKTAhُ4h]q}Z`ijܧWb:#rNcK XԲ/y< ~ޏ=*UЎZ_60D#AYڟFR=YM>XK_0X*ÝUͭAݬxf~*fe R?i;o2`O7,G1ڛ*MA99t=@S͑sCۯoJ~: 2bOo03QE;O(q=PPy\b~-347;>w ὚Ԟ4JQ`ҳ~WtMcXz|;,nKuO6OWP<{9Ri :4([f@w: GssP1>F<];<3|6yDZ6F$UƵEb-v!K\]Y ~M -V9=9EXbo-34Wu8QzOtzŸnM^$?�3ҖgyX L%p qA#2ӟY O^z-e mqP! sWq@$2IIR֪<nKG | qu'>.[c TJ?3I--LqC-<^Ylˠi 7暅"Ã5lC41ncr?T0q&P;z(UW%R/h?TjmpXvxz~<~s)ߠBJ`sdnCp*䥐Pꊅ4lT/tg?k84~:zxzf/ʮ�]Haå&~F]u]k8$m+ndxxNj {FrgaQYj|O̮ܗա6hoyCYnn~Z)(Hʉ4YӬmFgOab_FE7?Xf9{wbYNZ:B{Ygn<z!5鸜|G{_\])֧H^g|ăεl ҳe3S8+Um64g|ؐJ) Xl<s}DxЦmVvJ{s?VMW`eكs7Үd[UE-я''  QRg :;QI:Ori++c{̀au4pOdݮy-ԏ0hF.W dL)d6!K}[,={ |(qh^i =YNz_-8K(/?#wsټ&>/n"\ێc8~Oqw!B9V_ )1`Ik d@MƵ=m!GsԩTpE +"PxJy gŸFjhk7D=}_O+Հ.#Ż 2lVm;И~wuwݛF V$f `c|ݺ gdJ{}yxY=T)~^;kR`o9{\W%AI=9eO ^fQ&(g7+)r�zgǯĿ~CIF|"Yh&<|`{cJ-% \h6=VZ_FJ+44~rٶf3]Ź4p[ߞEt*; $t= P~C2DG8k4͚6v7 @sܖ ^.r;ԏP:4߹gg3EN)*摪vJEEn:@2P4BtjVVYT3XNj ,5 `vp ʙ'P4Zm" =B6'@3;{EJF2Wc=f ǨB:))? xvՓ<+LY2d:?hK;M{E|υBY}*c %lUIsqv‡ ! {U*bF2ꡜ%%_ZW+&IH] SN5 #Uo[~M[Ofw+NœfaB;XT> *ǓUv>! {>>?uzR(gc:sJPk uɥ %67#4J*UWB>%47E2L#}e-D#3:_zV0 YR>-HvJ&�E\;aA1*\XD5SݛѮ,(fc1\ a[)Q~m0CE+Էh*Z;Jc1Xfm3{~: AcFҟqi;.Sam ).:\ښwM6^<P: ~E ŦQYUat2 ~ÅLH.T8!J4.)�}g"YGZreis7G |QgXUsj$`_]_0e3zc<<M}%|djF(>LXG6"Zk6k#_ Iqh.Hj@^zk"M2j9PwUIX5J*UˆACYgTtWE>y+'SvNO+azĎ8BØE'9n~,hiNbJ4+to%ّhUQj7DꑇZ{݂TE1_bh]*V٥w&/n'(^swMvI0Tt7*}ЃWȒnX{׷lpw&ND7`-~t*]bH$fRiʽDZ1G�Qdr <mRob@4O"Ww{Zb:χ\z([+;3Eb!LL3/-Й~�oB5[G:ݚ"Q6Rp;!^B+Xc$fS<d78l ~ +#eݒџބHss3IU*-I{&٦w 4! "r׿+v�F?JG7~]~JdG7#bL"[0a G8>B^]fdt[SzD.LikrY,$': *=%jgրG[Aynd]%:%~X2<ϣk rJjy:m*ħVKtPj͚;(A`pe%G_ CW>1q%@sBM.gx̝>)7_>{:'@] m61eErjU~-hMfeSUU4ozzwlּٙ!Ӣ7YFn7d5f ,-Lـ|Ns nkT$ի+a6> >.I}~Sv}X<zk~?nT~ s 7,o;EΫDQwG+<uLL uA~Y8!h8Y#BkUüw;2OT6^,T xK HWaMquME߽ g%6iB,K.bL[~Nʜ^I8FqDR܋'7MD4bҊf', yWc3SWNjNGl}sMUϼ 2MZfB|c9^*Lc9߭8vDvklyL&ZiϟterHh83+&;DK3mX9m.y;yOZt_ELNՉ'*1/g acmQw) / /oY|ճJB͸.1:!֭zO7- zAHWC{/kx ˽A䂊)ˋnfo>߹>8-BMc)lAUv/l>Ɇ{ׯLOXzfnjj`yRvA^ 6-E~nthMYP KR}nffZ5 gJ{Ly1#St 3tal`E=ŞY^4)Tf; wvv7^pL~f4yqu{Qs2yB^?)źN3j9/BW|͆˜w3g?~}8낯g9Ǭxei<tHt~r0*Y ]ߛ<2`catʗ ~"+F*K*e~e.z36 Nab,ŘϨKEUTqOR_MܲLM#vjv\MTGS{1c߼X(N|L8oz27u۷xad&>Qt( a#PƫNv urJHORÛ-{*y) ٵcnދg6Ea&XixCjfB0Wˑ^1[ Uo<"zLLpfsz1e%vAVP`'({J\ۚ2x` i틟rc4"ϫΦ*B١ vOL(n~r'O^TKE⎝:h]�=spX#DP|*vGt1=E(+I &a kˮɰ DiǎK\/-D[;Euˬ1C9DredEZ.Ih7y[x<ÏD~(O'I*sy8j% qlcRA <?:ʺJyDn�g9pIԶ2}QMMT7ޮX%h(i4Yaob&P~c, F !ݲ�z^46׷nm6/7MB.Y]@QڛxLPWk6d[7X`w@mjxa`ޏښc"-l-Lbq4?M1$B>)C+/.o&is`)3{p ψ-\B/S#AoۦGo<+˦I#u"ߡ|#V,y"H &I9G%́zi u+薍 z�>x䝮6[ J͔TѺGgɕEJ?Z'g FyfuI4kZh V N+�ύQ牷~/'{@e+xJ85zN(kӟLwL)Ct'X0)%nCHg2*p,3a1 VPLnYDXͭRm�r4DA!mAR k-o3Xvgid߱<̉eVn\.2GgLu.u"wj1[7-s-?OϘ?%v[2J$N,GvV/"UpM9ȟ݄Ń3'go/NTh[�%ngK \;yvŘkn_'s\\Lg'2,�> ].q{x2]ʐyz^brZ߆at>DLÞR3p4cR^9P8/y1I>cB�}qG]ѸE꩙j6S?pgbtN)Cԕ~5Xw3aKP=8oPѰS_,䳼)fl\헢a1d9SZ.ж8 U'1Σ<&7S\zfd%2 Y ɼVBܭp!orl{8h�s,E}#hglQXA ɝչ wk Յ`w?)Hzt;GIŴw&)7o\}fg_PuK''UzE= jQF%00Q )\a-rs,u^ *r Gebi h*c+{Up66vA~ftwo#G# @sW < \+l KhM d|-e{-FK㈬w\ZWNR A ;sp?{}ޛ{W endstream endobj 526 0 obj << /Length1 1451 /Length2 6355 /Length3 0 /Length 7334 /Filter /FlateDecode >> stream xڍxT> )%= Ct]00 )%%! !%%R҂J|Z߷f3Eϐ_aQCQB@i��„FP 򷝐⁄"PPh j#0@H\ZHBR�-�xC7_ ]G� $%%; Ap6qEW`�C A#}'MZP[�@x8q(' ~Q\! ȿ7@`P0Dx!�tu@  gs�BBJ'W"(w0 FP# �tմP>(>�n !x ١[ 4?` )~qͪp{e+BOWpWP/np'DCm"ń�w�$! p@ӀB B$ @yxB F P8ῳ�,h ^zB+MLtyPSI KBBB� 1@?kf۪?2j�Hwo"^gl@ŀ`y~+*H APZϞ(lh#o)䯁ֆC=]۫gD9�P/;AQ`akp uG삾[#킠'uU`<<@hWb�!C|~K (�G!�4@ƒ v 0q@11um==<ЎߢA7�@ LZEzoQܕD(1s'-SJw3#&gy\<zP[W:/~dsȈ^'?Lg$ĶL1|"-sU'rBj (9#cIG)ua>5ga[E ?"aia<~Kw2>khi]n_qfOxu-CZ܇JbgiŮX? ےD<uCn>iGu/3l}$ۜW^cq6yX#fw.hO#J͵0?4=<q6.;IH*M&9酒m4�;=>o/f)wCݑG/TS!f{I5ޓ𨊣4]6 y Ayzmd,'XLDH 猴02u̥(OP|)g|J|lhld0-q<5;-lKu8DM{JS!GJA6e;uxoXeN Zy1aϐfb3mGbXeSXR?Ue?Hߣ{ġ;幌FvΡ w%R'R"RDQ&A*$&CgNM0yԅ{lOc<p;:aXhc|8>*U'񓠙;_EDWݗ{[V*-Q+' 3#fzGZW6-[iB4>S]ힴm⋳:̌٪%Y- Ә?9R3aj7ԏ1 ^2}-䍄+_XJfawsa `(/AU*\#6CK5+tY4nǾ~s7kԴLVO{(Rsֿ}l:O$}Pꦊek2,L'[(L^y2uK+;V~oJ˦482PN/Wq"%V%pCg�RԸгƬ^Ȧ(TsLd 72Өw+E=!2j^^p 6aܲ<Sn^zXDʝz_ /y%5:j˟ɯ̆Kx. !($YEmK:F�|K"ZtӟI? *la?rš\B5o'k6/_*X$StaoiF]\W*>Oi>`!wDz#D[k͓c+rIXZkd Gx[ĵ5kl` j՗UCKOk hBE,q%YB/b:~uVBx;r +AQ@Atާ P[W`И|pqaӌNy(ơ;{Q�enU:tc@X<t[~U�Kt"Oэ)5J4Xc軝M?o?o+S\oտ5$BKOݨ&C28Hq=ʝ>2Zʱ{,�Y*fٮK.6fE=`Gb{Ϊ.z&w}� ]i\X\jH9]4#(0brԋ߷j~<=i;6Mm+ϹEHa={e˯Pc{Ey;^7qV2,,"_3¦ 3{{ch@mR`}Kbފׇqkyv2 վkxF,5 1n\V:E@J/;zSU_-`%k V1R`]C#vtl>$*'g(TH&67`kdJ̃*D)߲Ǵfڀ=iu~z,ZUn1~_5Yh>QXJ;߬S*0 Ai2>ыix'8tbx|t.-_�e9 e2_4TC܉;ْ *q5ʎ i4qJ^:<Dtt85NۦQr`/qkR_fN) C*c|Fi¹@ǹUwNvW֡Hy?q~y¼c¿/$xA/ˣ*v/>k">JBKϑe"c9=ϐjıdBR[.5IlLԳ:"-ǧn./\)a1b+v}Ķr Atno♆ɘbfa X S/~f(4*8(9/tq^ ,ħh*d\ev~*7a U˼Y]aJB�{^teʽ"0{Cjx*˾-gzzNۏ%෋ȧxjͤun gK.k1:`QH%sexڀ{j5yvC41M8,NF?p߮1jO%J\[!ywxc-,9FY+q䏀{L&cvB/dobѿgtzpR_K76Sxyj8W +J|!J>Li̘g T+l rW[c0X!DNt]$z!n_F"jCnlvDJvLNIR':>Tn?Ʃ!9/V8U/L)k{#g_jaR7˓x1LE_^9}OPu7kؗ/~ގܣ2i魗'ƺq4]A>nËw Zn.8ީ6 N [ց3pG�7nod+l?bpsBkF 93wiC c0j)eg]hfp^xRv:J1Q: ŽQ0Wd.V4AMotqY 3e<I` ҵew2M޹]MT7/x麏e"bӉYgN΃UL9̾7V w'"fr Teu.갃3ؙsɱ.Hl?u)@\`|Dw'x\Xu'R?WM*y@E.FeD=sasqaݫ>;4!kS6MW8>),Í_<EsV4jɭƓ F)j63]= x7~2gpC\-# {/rP_݂ĺ ˗ r ;^Ze_AOVҮϔ+@:l)UVx<=T]9DM~pd,%ݧй\]{07H]: ;v:C]NqLAZ!J|5r:($#*V7nj3\lB9ō[ É8jΕW6Et0,FzI Ϫ fԩ}3cml2HP+Z 2.xRopk'l_~"c;CYq_]UsuF;Ƶ6fklZ>ljeUMݎ|'3Z(dB"q h9?ilٍ V?2[r "?{rV*4ju6Ѐ�4CУ`5aB ȳ ݆cݮ ES\ercҦ2^̉O2qdp• K(V5dY�_#Ό6^%N\߾Jkx󕭉YS|lM܁W+q6]]ztz>?ȠV!Bby>tp2$ړu^Gônoʏ & p1Oy?jOiY+'eB"w|V*XF/uȏ Mֆyȋ_WUd7Ff-M3ʏU|fK&6–P8mAƼd^.qA 3 4l}@u j̪Os$(WG4>_sn US̓ d&=zH;xKzP'$b"KI31o|B!6ר*0 :ce TnS%"7%$#WRJjmˎK +O4(V:5kѓ;hmIwRq u$ʮş*u%B\Lw`pXBKJ}߸՜΢y9G"B)Guk$,͞JWUHg?>Vҿ8ֵ`$dymsTt^O1#pϮn;Y,Yz$w{H֎Ys:(<[*d["GH}' F?M..=!s&ۛ@~)*}MzHpہݩ[LdNXV1%vG]W;m6'/FyQ uQ uص4BwQ%^a3Z'{MԨb7c.¦RrdM"Ȧʛ犈�҆ϧ_g -b1Ps#$\VS'? 8E }ioD8nÕoyɐN ûkχd6>zl>*.tV6½{l&U1,"ì֛ݯu\2nC9ȃὐ_l ᗺ%g7i(k^)c z>sī8dOIe“fjLoO%OԚsp8oȍF4byd`Pcdy�ŵ: `ư>0s[ 9ByH{'Q{ZP2gMxaǻV7jVSx]2Y&.H.Go+nݠ{BjwIEtsjoy4j^1 \Xws2w<y "T2#aooD?QT(jCGR͖羛RQ�U(p$(G?L/^}=53P�ܢO`CMO 뙗wg_&&3(n y߇8~exՖ:W˱;:iy:vx7ͣEB7sLXP4s/;c› ֻd ޅZd1'>e]KO[vQNj aw�t~x^dk(4PĄo]SCLeiܔ!&'ޥv零>ӽ6$ʣU�| N4\8??N+'q'nVŻ]>E1ƊZL`HL*)Рóʨ0)x3$/k4EuuTxGűwˉOeYeMYWL[ޝSyLpK&<w4zl].N>9_źzJO(j}]g 0Ck}'cǟ=Oܫ\(]޵fE4dԲp> Ko)Y&p]"!*i\kTl2V{cfB%=zqr4:WX11/T=zzlr,JX$WbsL ̝2?QapId" .vQh՞S&zk'x! ̵_1_uMf(c2{],jerBVKNfWMg#EZs;oY*z4ף%,f}{ePVO?%Iy nEeo}\(|OO6PxD'ttN Rv,vma5݁-qDP1Kنlb%N}]dO7H-6\\A%T9w=V RgiD<r}hJր?yeMwY|yYD<}iYL GRJ<j$ɗCi# #+:B~L=e.$L&@qSp2Y~9]թvbbZX4ܽgPS$ t Qiu#= endstream endobj 528 0 obj << /Length1 2163 /Length2 16660 /Length3 0 /Length 17955 /Filter /FlateDecode >> stream xڌP\ 4. NN!B4+9v1}9TdLb掦@iG3+?@BISʎ@Ei G@ tqvt .4*9:��l�6n~6~VV�;++ ]&�%fJ ?�Z3:��1{@dhfbp4'lbb)LYԁ@w9/�e{࿩1#P4]p�y�;k3뻋9!Pq:X_W kML,v@"30q0M�bj�wjbrev#_aޏY\�rE>Ik{>A0wsbrvvI]Gf XYYyy@g�̊^Nl989:,i�->&@� O"66` v@] ~ᅨ'X}be yMyMSR\`bbsx_7O?XDsp'kC ʎ \fK+ߊGobomoyv8_SZ hnfr s|s&6NfVɭ]= 3j׽tgf~o}7_+ 0qq1Bxwa{Us#`avp�9,]j,7E/ѿ7EHA�?"_`8,{L?=Sz_ `Q,{>?={?=\Ll_ 9*K2/zfhޫH89IWYSyX!h|n'{x?{vd,Ҝ~o:{u.兩9\@{=.l`^?Ӂgywwy=qޞ9z g\\?;_~ 7!,; TWz0퍳s"_F]JI>\qF/u~8f/zka5MYm0az<vUtcѡo`ns֨>q-:C|7q(#HX~WfuKSŒ1 ˁ&V.^%63.Gz):;X!okz+I:HA77$`j[ )65먆@ne&d_ f&OSmCɢ樥d|o.RL!ixEx驓j UCS_ 5]3gRG1U5|ئG]ۈwԃ,MZ{PeP.H)|'NGeSFXZiX1U?f9γ]DD#tG~2ArW$w2xTTc_lN.ԛ4C]qEyi! 7x ~:~KjyJU5j9 o"9Ќ1TgODwنHFGuIo eR͵u 9EJ BN%"`kp`?9KFƍ0s[IvrtTQ) Z0b\  ː 5~ʞ%W %X~Q 0K\C~pKW� UrpNם^'5XuɡJUK τGw` V){_Cs 5Ʀ Y$x+ aNѪIF ngSGU9?Q)mLHXEy $.o+[EQ/Km29^,; |fխ*PkC78֎NE@I5˜~wg(sbHϕ~ϙ ^h**\yi1c۬iͫis@RWGn ?>ERm$:LcqlPOYTJ R ۏ8Io L/Ck@Mi!P'ZmʈP~K!:m|(J L՜!A)JXf6p)w_~)U#Քg x5>ʇœ[ŹzE1_8!F- ,M`Aʛ_ț(%/(JZ30>fT|2<Y. Sr깹D4\(nC ~ 8^z2@B݊\sCr _t4 ,2/69fEy}a6Ą:6khlq"HH:eCɜSbwHxeS/ۻ#iLiKHIʣk)XdV~,?P;[ñ@ʈͫj� QK iuKG,M(pb*v!쥀<G-#i9H`O˧C]~%6>%-0KvL㾋=�%^Z2j% +/@0m0e\[ zwMlk[.v`դFÊc 1,%p! +zI.2mdM^�9+p̃Z:K Go9?K]^^X-yHa-fwxR%זXZAtʩ6ͣAb߽v&?Ť+#,i"u|b|3sSð$]!΀)@%lex <$+Jv`XW?IԩMxlaڟa9ÍH1I"~Uh}TvYg:0x1_RZ5x2yV98Z7ë*vŃ>uY*܍SM!}S1Q�5]˶H}^z/d[`-HYliYxXum'rfX;\E+3j(?Onͧ#BjSbJ-t{D[7ݧ:w~<J5B;թ)?8u لM֣~$,t]B"R�bA3ZJ&,).&("Mh8ÕW9,zRFϥ'r>Ǖng=Vo 5|Q8-nT_;_tH5,i4[w3Uv{%7sb2h|f\B;#I@'ȉj^d@2xz2s�2 S=;ĨD@STĦ<{Ѵ3 0'ucR(eF4}БK<Nu1=@H=v4R'> 7jk }Pf7ܸ^GŪ@y6wb۫*Ũ? cw0HA ]nŻҮV>XMq 5i>n<ͤ]L%n g%a,9]r9;hŔ!^&Hẅ́$?bdԶZux?h[Hh;*5=}sU,Uׇ&#Į)k pK#l,id ߈q8|G~îCjpmSȨ730F xm)*zf8imי|PRWhx9Qpr.j(4i,Wѣ<'j+�y8#z8URYOV1K)х)Ivz:zZP\Z149"#KTG>"OCz̜$H-b$TSv|Zj #v0bm]knz[Q;Ye-r EsGK$h!C!G twC =(HBCwdG,4쯂 *6<ʚ0r'g@ [Ǝs%D8-af2~Mݐ ,zLq3ׁj)^D>Qxw&iqO!Xmr"CT z;M@pm*%9^<mIV}Wi"#vFu[�&vFC!(dnDyR괌֩O^&ozċ"8ne?*-W0/*}Je`ddư HtJRFNgm[W!;w\p!mFT>E5Dr7(:mZbgڹ k`3_(% <d,}Q 6Ѣ3 oJWܿ`Z+0dKzg^Aq2tG 98=j/5Reh1j x"8,l)ę8A~181}53zً0!$cByy~w#7탄{V[nȤ[Ey g}e$K9!T՘ -oU/m)=* i*mw(t|D L]ZX]--NOF ZKJ1R.WhļY'.,H\%m.(j;\V~"> zP?Zg&XepamuУ8R}eV0e+EV �YJdTQetwƒ*{N%;gh`D>ϕ'59 ;8K<NCXf=4Pf "gad\a,&GhyAcg͆lZWMV=͚̂oԱ#JBv!ME|0CW'"R˥8i,`2{ٞ�1ÓFNP zTVIjLx챺A$ Clų{mFuL$}.g!]F;¸%7:=r8h3<Zme7F]g4ƗR?dsd'ߠm_=ͧ.W x0`2~ޔ=˟Ҥ4וR E",)W]`тĎC5VSBnT{dD2!~*/\ةW|B9[)qu` &s-TN= V5axDty?/Ry0kwFQ[0 ,d^ Qd@Qӑ̽aΘG;&ҭ="='!yI\!IFO!5 T$`v%&f)k]}ە7^tI0ӕ}hŦ=s�֎RXaqM[şKxRTok7`eq!uʖW9b)Pw*qd!xeug`ay~Wf/S,v֨30"u<r=92qyȺcV h|#ތQZh:LX_<wdP[z|nq Fw+uv ,bTۮQo7ɀ_$.|l9iv']\9\jjféOX{6؋)*n]4AM)\yTK#TdhW!G8%}s�39pgl8:JЦp3fFT$ZPNGmۚXIH^ۦWvp<TSG}xÐqChvjV}SxJ~Ygi>AR3vsŁ<S#iV} X�aYD% =�1c1;g>z;G>*Y]fmL, X]6ЗwȞC신 R[<(GL}"{Ή@BFTI[C1}@naa_p3,Z-޷x_>@ԒtӎOWaW4'jI*;"Ȁ+c/ID#n9rPlPeR:qJlfjXDH+:9)e3 q0Gi$|4XM!@NzPDA4nm*ﯴd]7pD0RŞK6T~u)|aL]͢g mb |Q!2i@#UiŏSPv] ?:MůlCm2A=+ӻ\ p l{�0̑tYﲲ$<5kNH}2^uD>wRW{;'Y;YF-nĸ, #;A)Yox鉯%¾oDiCҮ2w˳>ޓY8Ns\SfN1mѷu6H7ƦNoP6Q::q_PLC-P>iZ`~}",}*Rs4 1-l@ZH" qM4&˱L o3AԖ|Oh>Mqw18(&-MXњ:M8t;7%,PW, oGN:MBg-?g)|\~t( He pNsK%EwHY>'yA2o-mA`\3#JM) $ѧ0D>夙*t\-Fr}`V`vfu<J !d<>*3(jZW0 :WYa6.,R{aokЛvuB5*_sj7m L.tz6i';1U$@TV+֭),䧸del1x`O͢*j %10i&j L MTVR g7:v.@=`%7~3�ĥͤ~)X$h6<>!fԶѮ/zk9݊ 7h`_06Z?RX*Pbq]y2Bs:>fGRٟ 8|͸g-2}myڢP"8V+2]QbnTf8uf*U (KSd;/Rjܝ ~E[Pe{,OY>WU7 ӄo!X&ZQk`#jMOu-u6}Y DeS\@jX_m[Q|w:p_:=_ߑ obwS>qHVnDW'XSp{[:&Pq΅TJ߿9%,*[O>t(HCea#}o޼7KE9vt"PhIˤQ#e1bFjw1,X* =$EPҰ/[#V\WmG Jn<UaOx4R@3"1(j7H(^|,9Pۼ&p9b4U bs*(jk2e yguOxS/t?ޛU�vnyn;~Į{箅BPr59_$/XIh9O;X~kGĉkdz՟$_+7h;r|8`c@z^k٪LҀ.tqj;ڮمl*pH,l 0Ȕ/6x0wЙYQ:Jd{(gS%Pc|6(Rx:!n%e12Hi}'uژ_F#<?{ JVT=' bE.Q5B!mt+(᭯ꇆ{�]>vu_K`Hzs_oRxn]&N``-ߚni'믹W dwoDQ$W{r-3Yd7kX#ٚ4[ޠʠyj� Kgۮ0j0RLDL H钡|ͩv/4RH[Wnsܤ/%Btu~r -[K(ixӒ+nI5"op ]RMҘYM˴6޸VR gofM!Nܯa:*Af56_ַWAT7:Opۑ4/ (kmI71Da8v2E[5љyJ)<:2|7:FƠ"eTRb?}M8*,NV3FfsC4C]Bl4- dunWi(}X1)dmc>9qĝaHwN<JCւ,a&hX\Ed=`4ͤO#W Zd,v\ ]߳2LO9p9C-y.!(?g9,Z8g<W-.VJ*qQ&6v ' \?eѭW5E,;~G &HwOhƺL;WHK6fϹK bЀhɦDre!_Tn2gqbZ{,ňr@c,IEtjʓl9pl;KnÛ?1 \9cicf3?t33gW@=EMBy>? 0B5ʌ0Pc>,!CeJp`7uDqP܁DA2c,4uWy%߮4KF.yG4<`DaCP%{fkRąnvڀ)qO!q̘D+Ǟ'99Rh9(5�hNX -ot*0xT"R2w AsNt"vR&Cr|qS:#ilcB9omr9J +E⨵%8(LJ9IUOy8|_P'i=ūY8/K3RN98YG))�-(%<L |]B #ITYVo5;i+\%+9U,[T}VuٷE M+ ?TmIJs:k !44�զ5- /93on[GģX JH c'6(BH [Q҉œ7CrFSINGަ+;6YH'_\>z\7_zֽ,hwm6ٙ[ƷkH[+&evHM sҨk k.pqBC-.7Ly\pEⴚM'[jT:eZ39MkXBۣEI-*_pDP[XJ_} 4[%-t5A }pS9^4]ZSS $kA=˰2)(D2DYWywVǘ0(؄g m GG>p^<:LGtK( r'ľ,̨1V4(F߻f oBLZ,֠86-Zxdžf\@95zw@i8sٝN)-<| G$Fm7I< {_cs6䣃6V$leyKPFrKQZ(F>iv{a&zpgGSfuI3ulB>Zgu<r`q<3'o,P@ x6J̊b_8ͥMg=ņ("x^)io`,-LV*=kFdN:So_c0/XMw"a4w'\}{9N.  )*%{(aKE&q6w[A k Vf!IL߆^{ZX ~ʴeX j{.ş9Y+<>dLvߩJYd\NnP=valN`SzfwL8D'5N_Px"|@B`SSϴq 爛tj,ELNu,4}u?KEEcMu3+KNAuT?$naԼu'j4nD؀? w42bdi>Qi&@i0؁pk["+AZ #FGs{<4_$7}* bTfj|sd9)sBc8M]7^6sB;'T.](08+.۩Rm7 Xx*X�3kQ6]-ȱ#ՕXW> BC['zZYG8o?]]ӯS.|`qn<b1t:i2ۘƽJ$*WrvYE{ k-_lY ?*ihIyQ.IW ~ iZ^#U'KN-󷰋YNI7 ,87'pkW5A06ދUO!D>!G˂;YN3s(6%O6_2xu ӷ 0P߭wƻ+G Lgi/KT5'L6kLUYsG~5t .H�J]wfTw\x%b׸u/ 僻Fi`\N +b2В̔&e{}݊ŁeK5^g:>L <J,�S$uKk88rP4TO)!( y/Е�caLoz1G`uh(kD c?l%D(+ȥ_gP)MjG&͠pnʰWC�6`>ܿ"tx >NJ[;3ˆ~*<!=yzov<Z u G>g Ťzp$8BKYfټ0%DL#F);P0%E*�+;C!WCK XqSm`9Ⱦ{>O,52!?VG{IwCi#Qeh4RZv}'2Ngl+gq:/Ţ~}=IRo*m]񛏩Y9WSƃANݚDX *>#=խOhPu9'ե6HxHJ$Ó#60#`ײ׾F0U;|Ԉ~`9tѭ3~8)a |TEn udzR o= ɺ,[+)5=ߓMv3x):y'XGNŊ?JDnNRv #|coNRg4]C#VFjy5xqB4"u̓f 'GS$Es?@7⻡>* DS_KO/?+0 \3 8# 8-u{ tR~&N osz(B?Ν!"ɓLoy}CGCmxT H[͏q?>k.#4d�e|Bt/'16ȗj2+9-y jeb 2x06ᬠ.Ua V%w |"} Ίdxaz1U.*KPb~IhMVe  RqK?A-/EU8)Ҙk}px$|b3ewjeH3]v-cyDSWF` xHK(a(;FSWY$yB+/uUņ5ݿ PB0 R.~)& o #Y+S| ~A݇ˠc}4N*h Ľ=ȓvbîvAM0/.PKW>nv7J8߮ 'ujѱ7!xd^cjh#ܧ2vV,|Ê=x6�­{~yl6%YdS8z6Q[ckc~rĸc [UŏyNU={?po]ypi+hp]ٟ 4a>0!& I>?ceӪG]|ueUQSZUH =$�O4APS`qjD5'cӺgRLy_ ik41P tWRD {0C=&n<EZb!}Y:V�Q1#] +РJ34-RB&UkL4qj줒x|sNݎ|GISb}٣<lo2%ֵ'e:܀ogHnnnq=C +Ns7 QOd$^0\p7r<s7 o iP٭r]5ahg0J4 2<Aలw2=a^5GϧUMZYYv^W4m`HGx݂Tcvh- 4EyWOoC85Mg;/Z>;Wz4Q"Za r$k/"<ƀbub)UKEHC1uwHI;Yf.^ !D0T&2zR,%lkN-d)6z>>a SFBoX+KWj3?Affr5S lPϒݜL7rqb؅<1 , ٖSewL tn%~ \nN':PVDՖ~(;FB |o7H:sOl(s &@f>]~hl�>HYv8;}7(ҙKH:tXN)SsCΌ>dG&cKlynr:Ɵ ?P  9寧$fERoF'8З I!RLI.ɩv jEs[~pZ@p^X o `@-RU Zv6 ,FiSZ Z$xb8Yؔxcf m?q4$^`Aa`"0Ⴞ۹aYV6,H jWNg%嫨_oA 9敂ĸ#*]bgz/ͬ[\|c^ξǔBCUEc+:7eQ2.l!I<^P'3CP}iOQ L6W[몦H~ċjUZ'#gƨpJ=.d#ay@c4k=!p%eg>ֻ>'0e x:Pp[:QYza A}} .'x2$_HTn!s @feK;$hL?rk{""숼K\e#6~3kFnNsYؘRar:TݽBM~*$it&LAYؑEVRrϹWCz@  %y?0R~̨NJe2L0'sŪ]"{YVC^RDi i6޸�'R q4,:_ϑTsi5ѹIt\>/ZD$3v4~YGV'+@㹲W>;`~دSgWgd))&hxX*=ycˁ ZG22Xn֐zgD# >aEDاy֤Zy{}v,Y(l`x9CLyWȹ@xMg",A3L]*4Y]ʛ_s&t¥G7c}1f]qA;t7yok70kz4:u>BASdh$94QGyc-u)Ic(H.=  1Gr*:lYܔ84/O2d{LwkH=m_r%;c`i 4Io;E)b}t,e gz2cNW.MRfjdI@.Al Dm: 6# 6d&ח 4`at0.U*+vU\lVl0/vvZxJ3aZKsG@"k)�@׆ |~ڑ2$Ai K ۻ,|@le-5f7g4i|-zSuXً.[l7BhSN&{qWd]i# -YT>M�ѐ`Dtt@SC{/qW'_MXJPiעsn,^# 6E V<q\E}- ҵܙ@R.ʚ8p5KD..aٙ.6E7ӞG'~<alHUE);|țɢ&w8b%uuMOz8Obw)Nݭ`)?*CpB+k32֫ChefXPh!A9byܹǯz(?$od_u_/5W)(^*67Po-ӧS�dy0#Q>|/sԫyj,8^7pGzV=#bg5s0N:ޤS}C-7u.!@wH}75亞Ə4/?gEH!e9T x]/(1 ~lYS f$[Jz [Z69iZxr0@\Ν0o̾)ͦe:ZZy^G CCc^;.\*<au?&G?|*^4i@FrGӤP̘+KEFg)ǓZb^@t M_*s1۶v$w[^[tT(Cе5#P�OvP۽: %,2udݏ!fhwZ&SސKqLt۽l]\MJz'j6yyv a(=R*=x|zհ07`t)'" ag%NʽX#^CטR*"^ڳLk>@: ,DGfj$kKRևN嚈C*\tR΋ jvbښh>~;4c9RNpthl K"6w(]Z&ln:=߾bf:;8iAzNb_za;)18pqxd.A?NztX%L6jEvͺǢ@2UlC4y%/yI{Hǎ`RpX+5%tI%0SUVtqFYn ;LJܰFM76a ʵHJYν&,;>,Qp?c8C=o эEJ<VA[HX,a5d+U_5Px L*X >@P_U6-@;Srѩ:`m$DYRY'ii&%W([aRg,u%V>9yQʕ4*3jӢO 9}Q s�:/mM\<iÆEHfiNޱ@+H!_J ,e$8 kW &2?DO,Wn{i#Z7:%VZhnۿcjDChO_9MC W *x;qX?1/|"S*Ml"@a*{3A /%AC%lTM, w_y7#:XQZn8[92@n=׎z$VmL] >Yz\ hSo( . \'7~tȰMFٛl_� ~ibpwް zoF*Ni_d\tS  VltC.W|dO^Vq=RT1WoO�YI~wвp+V#,( <_;!k~كRX.g( ^rԅj8x>Y'T Q?"C(J\x@JL2K D8ٴT׎:#1SnM9NB{;Zͣ194ǟQڵALi(`NYS[hVT?l).^č"U6שD*[y?2l]0GʆKĿn#&(Lx?+KYUMq!@~C&KeP9F1iJu1c%r2~Ź5SM{HQwS]UPؔ9;۩SD\mz QB\λoש,\zCZva>; T0 �5pwbkн&9}!અ6/rEjƗіČ%.N+Q;>=,ߧ+? [QDHJQɤ^uK_mWN Oi]^5e>R}} 6c(((nԳ{q3UPMZ%1{<8]ʒ3ڬ'kbۙX eC@ӫ~_xޭR2hgġ%E^㽛zSI {媥?a̝oEbc AW; c&3VUI@,9UnaLs%:LC<,{_M }:`0۽P$I-@N8yFU!<i$iӃ<)ʊQwIt ޣTDsljթ\)͠X}:3Ry^5EՂOu8MIU8pR&fkD{y&!`$“AE2hIc>pH[կ8 pϠ*:#o2Qj<uY+sri(:&>gؔmW"(D=^GC|Jv9.HTa;*z[RGIa=,Nz?*XZZ*x 2[%72jH^u8&\ke† dsx臺{͉`R+ EJez endstream endobj 530 0 obj << /Length1 2716 /Length2 19340 /Length3 0 /Length 20892 /Filter /FlateDecode >> stream xڌP \3CpwnAܝ,8ޜs=꽢 fuպ@A ljo sa`adʫ0Y((T-]l#P-xudbF. Cy{; `ef/@ :#P;x:Y[x@mB`8@dibd7r�ڂMl�*&@qAŁݝ֙\nbP:܀R(Ija�X�AG\LN�;@EZ� NF&&Fvv�3K @QBÅ`dg=輑1Ѝ�F řr*-,&{2\k;{w;"3K;S0uu`RttJc!]�l�#�abo%_bP�3P@_K3  S`ji0[!Aw�0ƏϿ@fjog3HJJ{7; oK,vf��pg.Y2(؃=&_,W#&//#p[O?ivum=h??,4tZi#Іۙ[HKg K6X-o� ,GZ9kН j* hQc99y"0拕QSߣ `bw;!RN�_ N�o`LbI_ `X�L+I7b0IF v.#obWqؕ~#oSL]7F vĮ/El h'IE, bc#?L6@3?7zc?<lPLE`Lm@3_ ;_[i5|LgUϘASH9;_/@gcdP~{YY/럴 $ _//OP:hHfou$8AkA##�s54#$d;hO?Nuq8^p?;?>;(;@ZڛTE9\_<hjlAR] P@[.lnԟ!H6F8;Sbc0@pq�ȇq2zǾzA@P ~ tOs :z; 2z�MVMBC:k)5hW:]aijGP7ĩֈ_O[a?4WoGX.<n$'`P:yuQlstFV*xth,_[xP)|!F-Z7d"8{ƅe~=wX&,[{Ӣf*s.96!,Qe-fFAbns^9i6N< LU hNq%$ ?D8љʻ*xzBiɞOx#bml;bpZey[M9{xtUpEF-LNGA(h`ׅi7]P[gt:~?-Ni4],aBleU Iȕ[4Z.[H&$nZ-4.q>)~kPbFfNW|r$p n%U R3RCimvPQa~`"86de^4b=Rw k, lc5}e z&>+}yC,+ՙ O\ի%KО^ԠӉ?ˤDoo[#!hU}5[b4x["nڴ;?yro}U9!p贏Q`,)Tq{ͧwTe3=X, mVv6^Rc#}7QK嫭�Eavcj7b([4vX*r$#͸h1:0ͺ>A-;e /q";*�ey\;cؙM/]uΐܵ:S2rY;t\fFR־D7f ZܦG~5EJA`:TdIP }74(戴sPi{ BGԾ<,ɛ:V\Boػ#h4L`3xj3uq,I.As-BHYpK+ 0d'g_;bgDCв?3~eխZ7:e!8¸~y%E6Rp!aogź۹dy.[q^xVdzߑ̖6NO_J(_>X^+QSy.֏#WR9PfRq]6NO=HT,ǴşcC.΅A<]}J CWHo18DZUd+0B<9%!8ǐM_!W v2^AY9\HJ㕇V|NpXpcD(Z2Ƞd;\ El-�(zlCJT qL׫U2 Y}C"Fy*gBDY*y$*\,m%z^#H6IVed!NmAE}l; lFG~- RUj5ê y:2s$&:Tz Fy5I- ߎ ˠ` -aީJWI}|o.@LПgyp *%rB懪bi==[Yt @aHyFB#;(zf9)S!5Ȁ+sÀ(b?6ogd�mN #}=#@1{p^AA{@uenI> x ܏v3} e8ބ%@:[oY~P.i:  Tne-W\犰U:M5eV%ѪMظR07њ(%מTݷcC]XE_^C_igҥNٟ$UW!{a24=TCat&p_AD #.F0DkX ~mx$v e GѥY'Éah 7VF`ggszS$|$I7/#).mO`+S1۟cQ'">}sNCsd=rj_SΗ]Eiֻ}xy҂dk<;Ϛ=c$SP1nJJOr`눈OFw t{E"rֲMް<fp?m}*(;pGh,"v#h8R;39o�j 2>qXmlƻ4W:5v.(OIپ_[[HH}=U^c}I>&ڿD Z7�=RHFazB/~d-tZl.hã*q"S#Hׇ=0eқ7ՓPz0K.L!"O^"(|7 ͤ;(pƣ<{"SDK2: $Y1Z`TMԐUp5cJdCffѤP_% ]çzr'a`P-h)'DP͂SI޷1G4]dd"$j} boyJ^ml�ӻM嫺~<oݼ%lo/SdfL;*fLf=@I=zhU+2xGmҐI#ى{"S#?}6%sm^ICځ1aت ֜c!AkMGv!#h}H6Txe'B}c[4bg CBC8\ ㄌ-=M6 )z N`cqcZ XTNTLopU,BGbNFC|TFכV̴27ΑJ4cEݽ"`H(tp.?_O4s崯n kjV"!: HVq ~""a/o\INx xBF.v1u.W2in(y _F.VG;{QuOi7 !Bsn^?W%JE`sj`}ŘY 6,e�Dƣ!{yd^`}V>qS-q+[oDP>E'0⦓_QyU֕ ]Vݩx[kt@2E(Ǵmr+-LƳWS29lA A L㒉]f&-3N5mb.R9jdUNM"  `9^6Nwۢ& 6]̿'G-@bIIz6Pj͜fӇd0u@2 ~Fٚ]z YyhT.ۣm=5n*7V2 [A`ί,ߓ" AR \N>O_DTzƔw$VxH)ې>S]!=uem>k۲8\pEx+_Hے׆gځPX֗0\1-[)_c\qFU&mV 4Hy0Ǥ؅3M';Hea25z)Z}4BNfG§L8jD_lTu~OFDK*a(xy׊GAZ:m#bqA71V/}7ϑjx aT|BY{aYcT7FC�C{')�9ҏISVX, |Tw3ЍŎ(/n{9${CܨqFSt6DnNapqf0)A[L Cj?0?V`9 jI= Fw?](+M*Y[~xPO,C>5pRHPʰWeVE$YS{W/͜vK1IiۓX̾Q SriWyjoҡ[ fI[k@Lń_͹b]3WŒmT@:xUɀ^OJb_m]x nqd})}0Pz‰yp ,M�'jS狭j6[1 a`[ܾR؀%%Fx {b$x6/KxYʲ)-Xc 2LNWH-"n~~H-W fWT PVW4cO3rчg g v8)fDyl}o$(xïe~5F]a.7Wt  m}ֳVx"$rLA.Ե-_Gl?vTC>\w~<] K0cdLW$=8 04\„PvWK2&>ͽ#:D`9!><6x/-{ 4c7Lcn4EA>\ea*/9>|Ҝ?b 4!tM#dn}Yq? ӸɜjnƲdsVFgPt7!;}NpÅk,W$y„JaK<p _Jum- N~'I6!o+yR~L$aMJ׎," XgQƍwwDMn-!* ;s!v.>hFe[I?Jx34V*ߩ8HD/.]ۭl},Θ.;>z:I=hHw: F^O�ˌ+ԩj<.Lb烷E|Nc#uwΜR>{C.<4/$`,dY2<?(ӥc!C�Ӄ柷MhEJ6$4L}\Ӎ [2M 9716ϙA:Xt:AWgn=!΍"bhd�Sr8{j Y2Oͤ3 'ZgĹyC4* LdzOZ2"5D% WHFi*/3eqSe3fB/^%.+w9 ]VP=</K/Y.Dli7YTQXSJ"AK'9Fu'ѨoZgwuSC닋2RcmKG<m1LhuQЊK1VL-F3tM. U9[q+BB/h"aApyog{J_;b"\um:PRr8fѥ^ٟ5+>|t;{=tq*ed&τ7@, 4r|3F N܂=f;bB ZBmѡHŜ�SEmASK=m0*!uS \Wz3ifi Ll[O- gιG[cDZe&POLD.ׇO^oE| )?elZD@I&[:!dz>EXR'#0֒e<5ȋ7HA~,5ט(mVt4z^2k;߬IOJͱ;3txlJvk,K*r'L.-[(9 H{r\4U -a7ͤ=ofTW]cA\5wVxiI1Z=0?8~|).nS?ݹm7W?U޻G<qs�b{vSdÚi:<[oj޴ 6yfo7gk}?-y9$&Qiz^ce4M1` H>+)S?A(BS;#i]X֦ZW)�S`tp@n]yc:݆ΥҮ¶JGj 9U{CSݎυS=W20 ۥyfO&Ǫz|廍qE7L@w{bT7((�K'Sus>$JjbavkK [(ت-H_q}[l g",hgQaoGзgsqRz-Rtx@P-w6)S{xsǶ3Lcݛ`Yg̨Pg iw%Pl^IJZ8~yn)I@kYT%>)$ %f䌾X~4QEB<G9&޴N<KhcL敺cI*5Fղ3tgw%I<0O y:OoV!e}~`I*+ѭSD{U0Gl)܇owˎ\%) ڄR6z^?̇mwZdPET8K~90 4ܨ(Nf^DG"iAXx}<L-{!ՅnbJ|zPI~j,"%3uds善>I@!'shW5~;hV;d(MvoFM9Pȴݼ[6&6C 9EȤ~LynJE1Ɂ߷{]lB~NVb4p-b~k^Ș|dKd$ǤZIqdH -<E g"1sٿ ‹Rcbz!N O~XLTW<izqx~zoo%h&an»һ[f-vQm':\3GϹ{qp۠9/4aS :Wnj,~&'Zg>SfYz0_ jz~55Z|䩝0^qa[c}} NCij<@c(}Zy6BzBO޻J^frx0zMFc zꜬЊ!"qU[;5K;um1ʙaC5* d.?jr`5% ʸ' %.-$j{KQSjI{ĕ|:ӽ21#'GXDB& 3nRë*WIv&MV+G#hr7!f`ȏQ՛oo҈!{”n2ߞ&EWs_ ݅<DNkKUكh_uĖM?-:.U\8s4?'֟F1=lʒ;*УcӴd˄s,1r8Rj5uGXNA`T-Mh@\uZn/T68Oa-^ۿ2"*ʙy+QR@5:(1FWe_)$ VH |댋AGOU )#TME("gIHݍN dVڣU?@1=Df=3]X$)4g K/;=`J'e->~K@5/i#JxN?rOUG574J)V#I_M<2Ү<vpa&"1„~a=6$,=~4kIQQ[߁#Xrt@:o$1]@^mhPi]4dVL;]V=;\$>\e:YaB<]Sy}$OlI88 6%SݟW%_T砛VYJs@-}N>^ar�11'AKݤzOe>,/H~Ґ6 )ƌyfag1 pO:(-p๳-d�Do^;aܬ|v|z|[1[ifKvDY<5WƍOlpJŠVA N4 T-Qbn1*(q/s׉1M.  Ôf4|6ԙE#0-Gچ= =`w!X~P4~oYv/r!hIt2@& ͇79uu}tsê|1n${7osVD[ckYVxŐp ;(JrL;hs:4kO} h`M">>JcSƤEʮeߎHK>n�mOhh]U/ݽX^vϼW^: kD9 uFfsjpY_\ưsyl_};-\Qu,ų jbdRRӀG@+<C/%V%W7خAe}+ `/ǢqK%\y"PX<cy'j')B< q�RGѼcR>J@q(Aϩ5WnZzjqx f~#-$J<;Ete~H@e˥H%V,}9l#1$]݊_ Gv!5r-ȽVaynADomSaz轇R9M )r5p3ߤf7/,GQ w*Ik\ HL.J^2G?h3:B*VyTCCqh<bF}{ڕE_!E3k#}Hum.lg%I 7 AjMhُQJJ)%xj=T_׸(/~FDcڊsu0$'hJf%z Mީe8p5._)I{9;<F3x`^0uFj{�WY 5N0׫0Pi{KO {JzBcu\S|~!8~!6$%0#)]Z+* } &wX8g2XDd<i;%-z{S~[5~hBi=5_G3][m[.E`[^h\|7y؛`OSE`Kx_67UJk } $57N\~" qE}dvGo㗱~0tPч>eVSΊ/ejlRc.;Aő {Я-ڳ ¹5 $x!nLQg ]Bʹ8 c̝K|ۊI-J/X..z$sz|%D^OF ƓTh ı/OLVCr&~UiR T8#,B畏뚨8vy/d}8'}M4#I)*ι#zK tzu^?1U9[NDRFk)JkB/ +RG/obWa*-a} ƙn~Z$ДCzJig�ʠ9~[]T5"M@W|ׯTtA_Z5$~igv5M<B6|`v�n^&s!9Ŀ`:~[Iy;<J k?${]!)ىR0Wlfއ#S;h"awខI SkRgBcT& yc8;wqxC1RmRև5gls>yy )I7J,Gr=RtD L!(�3ƦLJZnc$ל@;J ոP2~c1QY!>0`YBVg(cIs ;l%|z+,=m&k_ 1^}~v|'y*&Xu$>m^c`Bǩi` 0+jTЌ<҄fr .ӪJ+B?G)i{p[LC99 n[_G\d## bEȂr7(mG KɾL7gs:9%~Dm>Sxi]Y]1dn$i'4xy|mm 2{B?> HE߂>#x>p~ {H4L/hիXxk !70.p_EȔ#h3T/a8]E0 EO$n#�CV}Hd(CnyRvN4" (eʉ7+NgűIqA/vS"u_$<=b+~#9cU!3VW6լuF*wr/xEȷC'|7` ۥn>!mCm[vF{R~3ha\'o50k`g�tN݄.;Nk{wOy:NJkKm Fg:0FV b!b#ct [dڂ+r%BQcD0 GIM(ѵL!ʫl vֻ~Q|xS9Aps7SƟ-[:6Er 5OWk1E\B7S( Z>x\1<߽H) _&J>dqZi0|j@{GZ ]\~?=~zl$Mj@{Ъ\<WK.LLK`XbAq]{.dG^3x;pI3QL"^[Hkxlג=x> L"J_oWb *!Nl= 7� @ƩMo)Nl',9>%Aخ+D:0vXZ㘉n6Ӄ d{wىz,MٗJi3|hFӴ>L?ͥXT|8Sg@EUV&!21h$A`M;ufWl]Heo{/G4ܘڊ- 66y#%dYo 7 �Vs04pLoSٰPEaQ|%6تg%Qޛe XOIieUz@O ݊"Ues$JwxiE L4ZϷE%Q)ΡRy]n#hZ;6d3@g#rI{e2 0plrJ ;mU]Qb5[b ZjwWB뼁(I2Ji , ͊YLح`{[Enekޗso/zߤl6\z?RZvFߓy9V͸Ie7XJrc/e{ǫgw9 zbD4`_*M~0W#-,j0�o#ZYkXxT-!gQȄ-u2-oG?:t ^(1Ftޣښd4DDq½q\6l0@][W37R`UBF5m/eJX["-~D2=k`z;OQN-JԄ_ӄ{.tVnԋ7$ ff-<U+6~q7S,x/BEngI&$#|]Uܖċ-lHbZp9?ab5aѪG|Qi5̬xuzKƙ:j>peU`w#T]&_L_PP,Ǵ>޶`s0|Xo21D5~E܉wh?[7ms#T'vX]G wGC8Xg[$Dbã w>Քܠ+|;ΐ>gJP`4cYC]}fёL'dw*^)JnjcNVmDpDan {yW}jVMm&Vܔ1b1C<8F ӵ0ʾaFAZɆLhfp>}=6:!P (ח"9> VAsRHUZ-"9ws>:9/Y{ŷy1EȾAuV+3>b  H0j敥 FݢL| 2$ J\e~S~3|NoAyQ<d 08^0؈%C,ؤ ߣUۤ'k+0䊖Hb"$VCOzӖԭW{EG>l܊ͼEJڠ#*v:huW`W*KY’~RQp= I4d:q ?)3�ٳ2YY`q?z?xD[7%| k;㋪՜J{̙"U FO3ӬȊ:Vg˻|}<+W9Jި4|tC,tn(Q`3?S]Di{vݤ*#̕oպ�;LtB[`ߕo;XW\-.Q[) 5J 珊Gv*9nVF8,k婒ոQM;.%=bIlSy>yD1 }%KיpXJ0! f2_.XI zթ*m_ƚq}1hU[=fX_ \Eښ'φk=I;<`V۪k ^ZEp.%u+(^8( Q1X!UWl9e&s~SMxY=9mI ~-jn.]TW0Xl _U0K6$DK%)ScKEmwdQ,SVƝ97-$>h5s b"jA7cu; Fܗw4ȐbyeDVdz &**!eJnT%gЇοĪ!3D7ƯBsF{%[Clz\yy V;O,aԻtPJy$:tP(<T"%Ne;O"mc-f̐wEZ_K-Z- MOKm9jeCw vH纝0QKE[;bL? ~ ga(=_b F̲}i#޴UKIMl&e EvGoCk㬁]F%(K |>tԑFt;f*m\CREas~.9$! bjDPqMgRb0M)U:ićj775"nh[{BB'LdWk} \ڣvT]uV<wtE]D+Jw؟3 "Qљ ( Õ_m4؋bjotwEVw6vXeMFYJ6ԛ˝!})B oR]nMd=FMmp+w ??*r3sXIӘMv؏CӖ<;y]%.m1聢dwUoEčII[H BXr~uRri;2*E:AJ43&%啽,a$(r 5U"_{[vNRW=AT3cMc;p33D1d,̤OM!̹ %`?cwktޔm؀~ )(#'G|tr] jge9kHEdd*&{=װ NGfhR=h?iN`ʑ…k&L{ƘvD98 ?~gmꀍ!|AyL?w$vF\MF"H;'"Hl3_W `)CNsRiUSr=p*y+N,]=iҢkO,u7R}zf5ז5Ĥt[dxJRڿ'&(ލᶳEv)GQ;E$K|#'ZF pQ) ,E)R?{.͈KiA"%U=V ˝EVZ4]w^+Nuz? Ry]٠)D[ͻr a+_si{ǰly&G exg탿 W9=iăVuiXߢ<G4:'qKB_-=ݫeolBQ՝arإw]Oy1"<$VЛWrVsnZ47ePBF%֊$!c?KuVş':QV%æ0I-;WD<s�K f 3PTcxJ؀[tԥ8f̺:茋G輒*j\8/3-U,F:. 6r9!0 #G._Q'?'񇍺f5U{p�#JRQ6gc,Kߏ'/ɲBrdS:&zkF6Չ`m,bG.'|(1Q' ZZÓ_5ޞc\Ep*ni=w.Ow2Ix ]yhrA>k SerݪHEf(Lܽ9{ /!%xbMXip0R9`mz 0t뫽Aly_T'PhuBCkw6#v6_+skC쾻nI+XsC&x*p4*1f7M@ۍgeKݍa؈L2ɱv7;_$*9*7ҺNh%# +ƺsG#h }3'H+$%I[sTg*JkjmZ.X@bLZ`KD Y!x3|GV=#[<I4)<%'Jӷ$߆5,*S=Y]ByFGX"GT.\\AoWf廵_=FI]Ux> oB9%@Vefp{_{a>Ry ه'V'b%�sɡuՁ,dͪH&hD`I2%1OxO"A#O7K<:5" ΍N2\ÒC3/ >Y C+)V\J]F.cϢ}Ͷ?[_/]ca-Έb/5u70l~~ *|⇁U_ȸ 3N֥D,7 %hQj*jr~[y~&qܮR5!嵁|/odǀ+E0-Ln'Vұ{Dka"רE9KB-*!i騡t xm&{ \ly~;scx- �amylrGkUx'=BUf1C1,%6a�T#zfK`�?c/|VRY$8F5%عrQs.c?*LɸRwFv΄k3M*a5>tbTF &V?|&b9“= YbCo ٖiE7!`>fx,*@@/hz'v[dF`PaI9+bozR H�E:Ȁ)XtA knU\Dj ֙sל$Γċ9/'p<2Fs9;L_`|8j?#3VhJW8.ʭhy^4H6h8l;&N=B8=WuIeR@['XrRdء>6?TVq2d#F-;ȗxFH\:C_Iʓחґ\ii弢E?j7=ǠX~> gT3ݙ ;?`P3+e:WS7J=(RM18ߡ=rɶ)$4y6Lռb!+!tf-W_$b-`p�eyl`T")I.<$׽,ڥ; Jjfi:j4ApADc"7ē[+[@&Up4[7vf* }P^m6:6\{a ʴE-Ö6cj(DzIE9Lp@ sAD̈́˼z! ̶`Wwq7('k�{ʞY h wu7_͕-1u TK؄c8pAEk3ҿ VaZg�L(,$^hbjfF;Z ñez#t&E*P*.߶İaݍ[ d*]}0[IXUao;`%*TlD^,C]}aq5uo%me̟؎T`:BWD⏋S#[0@LȻ߉ӆ..Fv<^Gw"f,Y uҿ~;50k�jZ 5=ӽqqǭê涴 q%w3.n#YSsb�DK@>[)jPԯg7*!RV:+Flu8C3K*3|<˰zՇ5 xL%�~zͥ76ߠVBXh=\M$?7'I֛rźdžmd_re= qb'`E=va[X~UEH[.9٤ k D_;%SQqh9Ep|Sk -%ֶ }a|K3_<ҲH{n*,T'LnC3k fy1m^qnZݷ)w=I}|w^'v, Ҿ$&nS�^N"qD"6A4iRQ41d8i97fNEdcݝ&=d|bC:@"tx"9PKr6O�y1(g{zƎ`եL3ciȐJ49%UpK҉}F;_(1<T<kÚY;ĕPRXB@3\V9m Y ~}kC\* Uڦa+7X"*ZASlԶvzhnfd{zݰ^,-حYH6sFbAz2m`]F?j� 2 t8ی=dVY:Zj105( cNrJM7|63>cTTVf,$&s5dۗ^oZy$3ˆa !PI,{mzEj R' ~e>Z]>r jxI5h){(A[Q(&+Ax}0(ȕ}rRw ~D04_x9 e -r'P[k :IOt! P˜L6]Gd9 " ;>u]]~%2Eد'!L Cx7۔޲Vrz+zzNaif*Tv-W;3Wa/7}R ]\>\76Ȍ B|nCYx=IT 7J)'{l0- %aFyIB'(jƻd%mb Sz$G5GE9o7hlϳmuI͉ľX\XU8Ywxe b� #YoVu#s1W +ECJ,;\l{=m-<MHl+fg ~ 37K5lǍwYA ݯiZŻ9/CK<^]qe=9GV-XѣuaW> W\=OK@Pdi5!uӱv^!5 1s7Ll ͛7q+t0ghxVE{goX[&b嗿eeH*i'1(^~|G+XڦxCp:ys뱛[c6ʻ AԘBVG4rmuhjM)Cyl԰<r8/Y bvTN_rg6"ǖ9C $L`u\$y 63ra *}LONVz`N~D|!5kW ͼs"[X c@llɩ|)"G  d$C9񔌱`EsWZ 0&^#+5eXOQdb"B AꆦXା`eySYk6Ep7RYjv. Aͧs Ol+^}2DK6|E (gȽ-9[ag& AFTC9B*$Ir 3P7$,$x>_*6!ZץISaDr>}&6h#x(--J)E׫蠒qiˇPErߢZaӦC,%Vf\wo.O0DȆw2ɨ;}GAp B7Nco[ eď Ph;ΖѠV*W ;%'RҬ`#EX h Ҭ f]SL֙ endstream endobj 532 0 obj << /Length1 1464 /Length2 1785 /Length3 0 /Length 2711 /Filter /FlateDecode >> stream xڍT 8T{W}B_Ƭ1*{v1u93s2gf WSh*}n=-"YZ.".%mRhFD==<gwN p`/4xxL`04E!r <'·q^8 7$' d39`�:p� e$[/L#"3 (|;tuAեxG !':! ,O+˥:]TҠx E3@ x",�Z H'FdPp ‡Q@0 ?Ja8 0iT XBTA4y TBFC"b ntzp#R&C$Ztm}PrI;7|ܓ郗bJ4e"@!PHP$A{bOˁpa�$mKº S&8R  )E%@+`Uׁo- _baT'ܰM?$h!?&`h `$ \wP_^AʟXHq`8P}[3!:o Rbh$24v!fP?|m)'UH$8?P<"IDjVȉƈ@ Z`X(⿏!bC<PA"2_$ !rXk Kd{ w1bq7EF\.mG rrC$/Ha;*ttɉ@S!W ZΚ!-&!C:ID%_LBt+$י W8: ٺ '|RswS/>>6RhtwFG>MbXs5}<cX95ͧϏƶQԏq& Rʢ~e*fv8jB]~\rI?'ݣuF[fx?=vpF;I}Y5,oCZ,;;]33^t4>3FJ:+񐣅["t: /y~ќǎڮ»fEћӌoy}7Qs8d/־94zl>ȲinΫرU4S| ͋k[{o-/;%{/T{wr= aՆrrGuy:oduxߺ]dM TP_O1 T^|-sMɫW F~GMsqSKOnElKN6͈5O o._?ESF}"L@ҌSLw?ˎ<iUſ%D->d7K;<ZN&^էqM9Ŏk3=laV; 79\sL>skfOJ{ ?h_yoPYũA4>,QAPe/s}O˜>}' Ěf洜tKJu )mhj</#tﲴᾴۖu\S|t0yI^S[rЫ4ܭ+m~mpҦG^<x)vbh;;J2;VoJOȢzR'ջMzc#ZK~yL6cۼq2F5>9$(Gextva, GyۢH?vTX(g+l-hN|[MB|eG&3^0g׽ dS[km2`wteEE)d/\S:WHt̬VfXͬH=)^']UUmsPZ:ݿ6ĭE8'zl')_7^<*(͞ÑEiUsz7N?6/zl=bV&^^qj=>3%pUͿtu[]Y#DU[9w1kϪx1ƱFkzTe&UFeٿ6E$2oQCE.ĨX/g8~]uwUzqʰ2CUk)N[P{І%Y冪b{ ]gZF^``nbX4뾺Ү9hJ~IDq'2R87.a?^b[8Zgq\CN(QdY?oȻ7| MaK>y_%r_֙w=~'|6G-&n<vbGaeշs/m(=$ikWQ k]+mgl>y9ոj; _V:7i=fغ f1##*ql[bL޵:H wlkˏ?.tTVA\&Ts?f+{)f5lYN}2mKK C^q2֏?6svGн2u(ri6/UeL[:i喀%DF tj+wls/~F;-Vz';9O@5[+[б[^: endstream endobj 534 0 obj << /Length1 2058 /Length2 7279 /Length3 0 /Length 8506 /Filter /FlateDecode >> stream xڍT6Nt*NhiAe#6`ct !!])"4Hw ;ygl>}~niY#J8�|@� Lf�uEpB(Mi"�57G�H�� Wq hp(fk´/ �ݽ+3 uAp&eut O I;YݝCJs�a(; uEC?`_v]  ` 0d�Ls@ +�@|Q @N`' n 9BZJ|(� vD"0`4 P{��cC q9|H?`NYn}D?SB!cup;`[ a̯AU l(0.�ĎGy=OgO' l"/$ \ݠ>^;@ 5 XAmap?1f/|W�#/kO564O^  �"w|[7jaSOn��st@# %CoB0_gLS*7@Jn??7 O�Fn(Rh"0PCEքZܜ׫cCnaH%Z˿CH؏' m.(fQAX:a�IĈK@X¬5㧮|p  \~\0_� ]�o$ +A�~?Ha|:_̢tF`'g~<O~`VH�S Ǎ c!GIkaqr[A�~?FÜ# E &/ip140q`b<1s8qcr1O# kKbt bD9= F81bG#rch1A"f&?bbA]!nQ?M|@P"l_tZ.λ2( D9"zA=ɯSrmc_?Qn \:,潓"imx)ζn꭭&pk[ڽ:#QN: eIғ=;Hp##IpRK+FZTYewP/ 5Sȃ [Hb$uV?Jݔ~.¨n9 e[nW?xa|:^X`HբazM=Bwٵղ )9 6܆]c+fN ˶[Wʈ\S[y pENKiusWvVƩL׼V 86MfVvu*Č;IbGwz4:Z 94.=ˎ� 4SG_-F7^&vHA oʯ(A$Q"FN;L!ȏ')9YN|4;8,|efkPՍ{B޸؃$x+"%^i,NQ{!{Fp:0\Bl JΘP}uZO26G{4ȼPyg‰:\g&P\:i';ߖ2)SOs4}ͶeB&vP2$_nYxJ?w(~wmc40dZ(J> Xj<>fר:QIY=uRܴZiLąX1̥d MW62ay`{"fb: Ff[^{?;н (I$p_JcpyDvş n{tCXR(s"2L颉pUc4 $c_f&a>yb|\ h>DqچzC5Znm9\hPEkF8Z`U~YYz(u>=sOkio{ݲNd $I,`,g*@竀Hʚ_X][/{ekӬd1b8s,›^ݙ1Ow(qf9%BacHpO{Ņ@mh-9RrϛYe76M9NRFzK@j_ YvdJ}n:Q(KMiPq!ByY>?`zaB%׉?hMS}6=q)DqXc`z{1xȇ=WǏ6W{Gb49Ģs|bzɀ^kQ%+K+<3we4h~RHIP.~G$T{�|i+ME᜼oOS^yi aVs4K+_T1O7_҈wU:cn6ƛOb>-R(dݪ<8jq&f_K=J$hZTKζ bg[l+OL?LOIykU"gnA9}0RUhP[ ѢYre0~L;*_m|YVSa[VY'l% uF,?w4P |{Q!k(t4|8jϺ$&sǟ$|Ӌ*e8j2nSoP"}y<ci,hSgy Z8#1Y|Wd)8(C]Yda4o$^'xM}SEuEYnqs[Nf{;CUyu\ C1^̲l>umET-kQWt GVӟhc(f|9?BV4ꆓNxb=(,|0Gx7A$kOՓ>ZuI\eM!%W!}jEI*n%c>tƣ(naF JEaxM$wg0Lb&ҁ04/DT@: Q2=sע-\d c ''ԥ|9.(B#evA'9}9Rݧ4hDm$jڥY-Wc \8nJ%Q~ ]£jg= ;@xOwZ8%ʈy2+}Tle Oe: bǀS:I7j[EYMx86#7 ˷QNVP 4` M=O{Hq)̏_\Ĵ^[7?XK0zV+s}l?Kc|P˫̥Fr"󅗆 ٫&L='d.nr2#럈I\7 wFxBYD 7g}G, L5p:J9_ŗ< 0Ψ~6MzbA7vךBJ�j[eCs_jj_U<xaĜ|=H96w7v6rML_Ggo&ؗNժ״bъzWq ݭ_ zser]$V.垛wRnn޺ŗcQ;ċ#|j9G{Y`jZq@^:'<41j'-K?T8沚Tצ�KݬϚo_b.^x'飜;Z JJ^ƥ:5m,#TIfK{P_<=/B{|~)}Ae+ʆD=V62!o\UVqW7"'7Z?*(ΣB?T =$zo-Ͳ)6E֞6򍠠r%5zkP Caj x]mqs9?4챲mWvsVP:{/KMQQp QR[/\NLe VE$h�'$.| rBI L8__iѬa4jݬ>4r]6eYMwh;@s@Eմixoj`,E3uζ][dR^eRBm| ]F*e1,d5g.ot0yÜRտ9T f'/-7"gsHukY7y;bB+ӳtzeMtA!y|52Ͼ"ER}a4e>Χ9eY|}6%r zl_rūս5 UG2p[cSͥ<oNBU͑ 3)cS!FvWws[v+"އe,ŕK$&"70zI5g:j-ۍa|<ȵ wjWZF~P3PuTo6sv:j{]áR-X d ,VUx/I Sfx_ob>!ڡ[e_,QN9~;.PQǩ(1e2Oz>{zˆ=10ncE^MLQnꪞgѧw^mFg[S͐[hʣV#vb�iYpBXDͽg36 =͠GS8- =BtE谀2wݷ,c[Ooqѯ9y ϶Xyǥ׿gq@+&NAkKV޻éJS=$h �r쐏<cZώuTKL$OkGj,znȺT[ɍI7ڴPMV /%k&T l' ؚ0 Lj(ERPXZ' Hs[F~vv>Z e# Nr ?z]Hu}{&6jSR|$-k_9H줝59]˛b~$`U"K-ÛfDNX]`1]|[sm :yנx ?hR%V뤺7 `,37$I>ϸ+MenjN[T+k0�O<s,2sTۤ!AomשD6Ε!:1B1R!–\VHuԳOk4N&M^tLܾ%٩귪y.p7OlKKڍ[>;m%|0vjU2}k鞡fHp{q[m[)k+_]\F PO#%{4x|ZZ<0%Kܰ{ziM@XhGћkB*m?Kl+Н, EnzkB$uJꙗb@'[J]`+]oyu*鞱a. NP Dq̱*׮[9Upy[ňkdb$BRV$Ӛ uh;ŨTnF)OЭ;&{rdsn{yӀAmg{vv_b:.^YΩæXzd ynd*rCVzXYVB6LA~ܫT;I + G3ͱDe*x<oN1ihҷt'{C@;;!RyfBjO67Fc2.Icy}ICsUtPyAE$#% CQһz:V 9$hby|B,Hٙ8wm--#P?[4,|Y(B+U-Fwhˍs7nbz[MWP \"ý2RHҩ9ZY:|Rhyy?$>FK_s S䆎Jۅ6ِ#7޵Ĥ[>B 6ȏgH%~>}x0,Pk.vl"3èQUZ !~|RK#JY\ؐh>ChZaG3Q$*�*U<P[S^:ld}iKq2 T{ɾcE*]8x+ Aє:Dk_^+ڴ9|ZV)HKsgY>X˼rӐ "끨[ y\fOrtf!i5b+4Ec(゜g%A:˫e2d69=vUukVϟӤw}؇kpc8f3cpMW ^8i~r-cZ$΍۴)Y'zY}clެo#- P-ٶ|-syI/<CE'j]Chdo<k, ּ`s̱< UmY9Ԉk19 T/!]р7HgwW5z%Z̙lIqGVݟ)Tj><gn{i)x-C;2�L&!Aq\ժ&Ίcwq>�;L?|jL" </mKp{r80ƫ}Ws*T5.*ogh̽'I{DG;%9,>S?'^y>9st[ߘч+uؙvFӍٸj %kΝv9z2RbNQr Zrо AUd%ʶYRH>^‰rz(C|9*@3.ș#7&UAG"8*F3+rOɴ| \S ]&hJyx9"w<HSl'aoQS'uA#Q-nKʦ pڿUO N]^e{T^:#T=szxZz^B B,Gu RWRHT QNsyRq>Pv9j0U:nr6 *f<{k)DWͣO\^=٦gwa=Q2IΟG>vZ5Z+ݧg *ӖR ~\PtT Ξ]{CB_V:=7FB7P8+n*"eo;Bg.y$+>ľcsKSPgM~11N97#էX͙ӌo5WO5:~E[5R-0RuWGRf1rnbk#[X*PRmQ\zjru�L1en2Ȅwd꣧y?J)29W&*:3%Lc21@u|}DRqh)S;N/7�C1+v 9Jk=MTL4';a۹H\x^&Oz`!;vf `ʟ@8YuDʹ6/o`|T.:5QX2j\rDX!CyԑH{z=1jP0b1/QɁL` <>LtfO9vv #7 IYdJ绌æSh&UuD .Ūh mXȞjcqok~LVC%%7{&,nB cAtI j2,BF&J&bYݷp*]rZ̓^a츠Uy%>mP0>>k^TC2lb:ěN% *|w_0Pu] ߇u)٦wB$cιvX)tN"Nn(20iRz8+߱<awgl*_+oF22S٤>GJR6E?JWd 4^_Zڍ�)TM@CAWhC$ OY4�%sRHJK Unﳂ'pdiɡ~6ҊWcʦ;A8W,E>ca`Vh{"7B({?{&gyST_df숥 PniӦ#uqC_2W3 jFrɟ}-4n\E]:iԖf곷Zj�nJn3;vU yezݜ^qOw#�4E endstream endobj 421 0 obj << /Type /ObjStm /N 100 /First 905 /Length 4454 /Filter /FlateDecode >> stream x[rɲ}WہAcbG`3f ؀2d5ȒGʬԒ%[>RuUvUʬUYUաP*[|¨oSX ko վѡ"زJ*X z*tը88Y(0I*PQRz [ET BKoDŠkTBk+`Z<*TAWh;߲h@'0F&\a4TX@f-5.Q/4B%0QF"lÝ:ـe`d"ԀUѓP"AO FJ&c% a hH]r* 4$ 4N(e0Cw ^-l"fayP\,@c(y<Q:TT6Tta�Ȗs:T&K?MC�d�j#:NQw~܀pN!A2;Z(p&t’�#�kapN#Fi<,MXhʥ[{BY6 +;6T*@k?i7A ^!Noⴅ.uEPGgij4 ;Ո=7T[Ke*c:l!@,|8\3~ >1ː2]+7cq2lG4d{!vųn:zSb<T f-q<9nKK ՐU7/vq yJv$?[K)&h.F=edPgţNw\A}֞\\J^κl~dAYzZ)6s,ZSvA8~OGkyh<^=+>s|ДgjOz–K([p#o ۅHo0g84epGLC a{Wlp#{n�f"`ms` C%q4ApZ]k}UK7W*1 �:2rՎ&gWMiK\7k6\wpa٩nK?䶆’^  BIqjC @Y{\q/4`Obww=9DiX¹' |@tvuҽFOW~vϳjvY+_r"_ue{ %^ -k38/ qRQ|ؾvFz2~zqQPRo'.ew}##|[K%FnM)/>�uWI`۾^\znh/Fl GR' Ɏ>j5vyڿ1zG7| q] dgb](ߛ~680~?/M-:蜉s6>�oSe<PZ[aU*LYNn[@+Nk)W  ^ j+^ a|5:wpu߾M:UzCïbd%u* ɳ xdEXxLk򹵤Cjdg^}*G]q>2)/~ycmHv@lJSwmcɅFpi2zNJoݭkFzIpNLJhQrf]/2,>Ib$&Y L6̸,h[zi3a称F68* A!m:%m ΦU҃̈́--v#avja7XG|;0BU S ֫Ӄ+y 7k0A- xEJ܆Mu p\tR_'l鋟)034gykI()crE ELخqýJjm٫x'(uYKD=xЎ |Sy~#6{ Afݦ&e=fs5erK;fc "8Tk9M^ Sc$5_ϠgȒ\D4[6Qiڔ[gUy==TGNO1ӻ'',rBJ鏪Ui hVmK$.1_c9-:0ԧ.9bs%S\^.} a<A=!(rfIZ`akIg.}gSIDp�K+j$Y=K1RV!<LjU4uEZ܍~4+343phG+І4�pBWЯn$Dk)H <ZMd>I^^ jgq k5ix,Е ; S#/pHR2=E6D 천?pPAWx@c]O:UcXǪzp$B;CMpRc5(|4邮bKussI<ͼ֔j|} V)ohG%uY-k[bĐCa'/2'.^2Jd\k@h+ܢt0v@Fo6 s9 hc&7MTy:m%`c:\f<%D$޸^;38kD bxUף'Y~{wXf- HQ_ʹT8Uߑ[83-q"Ig ˉu\o\璲 8ǹ:FRu%m~.GE"sk6hGSʚ}:6mn.z,s)׶!aV]MzĆflQ$RI֐-l'6$Ppڌ0tUb `YҪY9SpYK!r\ͥs_<M49Ouܒdsugk/2B%bH@4TS{4D w3P2S3iNͤ O'Lwcsv:6I ׺QӉY?mNy|Myvc& q}ޗ\)gmDrxe!!kʐ lw*Ψ3+X]#eNQ6gȒLk7[ A[Q|l#[I׬@瑦L}ong-!hN,ceϤm{z7';5{6_x<Al`)8]x#6PԹ% Ps Kc\x*vĮ8mq&:\TsoP\Kqꋮ"zJEۯ@ P^ ~߲W}ڐC1c1V*/}`yg::C[&= t2ݯ�x%#z #\34g@V|to�x:wgn [/zF5j )1Àhoޣ{Go^\jkMdmk/6{M =ZS t{ E+(:i=y?BKm{Gx3W=#\G_φΗj4X3 +,T^-:agrW}Czn5FhU=_vwһSfh4m{K5KO/>YB&F=Rs%c?p,[?s!}$`LwK"B^"6츹>]࿌:Z_V˝}g 5WRHրLg `9S6hVD풉n MȻ%z?L[_}AqIKp0f;?<~9~ur5#�|{Z/mLik_)Srv~άET]HR.,S�>$fuz+N^ ot2UOΪ{ѿWuML+x?؝vw?|mW7IjpA܊^_d}fK>P1NYr|oKCC>< 7{4wE"㽗Tb38s/&pɤ}F9%hr-hKYڷۘ̓{'98= ?8gT@y ly|MkdE{[D )؏8oMY ~yr598Y+5R5޵m]_rѶ2%DWUϖ/?Z>,O/?Y>-Or~J0^-Ϭ/dl endstream endobj 562 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.12)/Keywords() /CreationDate (D:20130319151219+01'00') /ModDate (D:20130319151219+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) kpathsea version 6.0.1) >> endobj 536 0 obj << /Type /ObjStm /N 63 /First 536 /Length 2133 /Filter /FlateDecode >> stream xڝYko:_.59!)(ФE<zEP5y v3$Pl!59s8|պT48~ m"E־*'UXNX1^?ҶҖVS4,[=7rAI94j=!@ l+@ag'p앫,{ZNC~<~SSExTCfg~p| 礐g =0�sà©9322 w+C2uE7nH 6I 2բQeur1Vl Q]Yr+dCC7yz2=}[Mn2QO͢߻I~..f˻\^>{X,.LMlv^T6͛?K<u.C_~˟' nݘ5>|}K׫:ٗ{Ncp8VS3pyu"oA nĶawtrcFE8z9ݷ_ߊ#+N>~?*;YYoQv'}_ b?E’G|f'xɷó� U ݧ]L{wL?5- q?._.>>ciit|Rx &cۛfܬ$1zc@ rFO^񙰑H)'èGb< 00x-AD.atGQ_Dvώ;$hʠ|v+ҭE(*E~l9o+mҘ O茽8M:?*lu\~[;Yxk,#aR.0 C~}yE%S G^aڤ0,M)Nn33f(w>`Bܦ F> r`/7 arMA{GU F^Hf-3\#0if8i+ za(}+҃^lԹPZZk>J.u֪% 6 ::\ޚˬH!7W.~;Y6..ff~6 /O+u9o|gWP^:.3hZe9oz0-W z6?~4뱵RC9ߟ(3Λ]4Y zg F&2sϚ+Q\Us<^]+b?-oŵygrqf1b9)F՛L/3˜G9t]ۨLcɆR-v`ҥ30H qIz L\ ILW-= n1r5"J*xZdѹ%r蔾UEd(Ub=j﵆:7y@'[LRy:聁2/U<u`LwdA\ `yiGj"1Aq` Tzj,ädPr^/r;O^e^(Q d-Al5Dl>&7ܝiS$&brAZ,y>$[.+{ȎNes*sʄ$͢Xn<EnQW,U.}4buwÐ顉UrH` U1?lQ# *]5첺=q.<}MLcjF(S]3e;[7wr`:>ӏV~$]&c7]FD=}[LOfP)z>PZDaI%!Ox]w} ?2x~w5<C51ûvevxМӣǛ_^7oth [Z[&[Z[6\hynЪUJB'�q�鈤JG,-`:iO Z u#XqAp!B/$qAp!B "..D\\(qQp1bR6HqQp1bEň#. w.}{6VϴE endstream endobj 563 0 obj << /Type /XRef /Index [0 564] /Size 564 /W [1 3 1] /Root 561 0 R /Info 562 0 R /ID [<D9034E07AC636E5A770F2803A4A1B8B2> <D9034E07AC636E5A770F2803A4A1B8B2>] /Length 1408 /Filter /FlateDecode >> stream x%KLW7 7AAPD "w&"E]ta45561m&ij΢MZE^.j2MmA[{iMjy}wf9fs?.(Bd �}huD!�j m&J2|Z idm"*ЪIs@.zy`5n `yQAێVIZ:֓R 2:rmM/LzPZ nInDD+% nBB48Z5-YP M�;A ZnA9$!Nw2p@GtK.{Km)Auq!0�sCK/Aoor#`LcjWhdsN t`\wC <&5e)vkzq̂9p̃`ܑ)5_,Ht~\#1IsgT!xe,siH.6f#|{|sO_`7� q/6Ҍ%޽+{lך{iXc3k29UX K9?{NZs~DW`e}+wi8o7wA z 1~\_+TծUVݠ-Һ>[~f(1!Ex5汷R~,�y㐹/k:>pg? ?f ]ٍǔ"�SfKT\~?<ϛy fAa��SETȰ뢢"P ޙi8Q*r-x -У4߂(RW.[,4* OF%\lje@ͷV�mTiPc |2kT 6Y5i5|ڨh3h໏U8L"jz ;Dx-j7TDm;kn T`?豰+U. Rz�th{kjZX~#`ºTT:!0 f/j4}&$8Ny&s6WBjbl/jR'YwVZ>Sj>g,sRS.]R[.W[:X/J˱-s9γ'f/c^0Ɠ1"9q%.}+J�N,qY+cX UKŕ\f=ׇ~356Pguc<nGV&$M1Ή{@blXAp2֝,? [JE#8hԒ]U,9hܒ_*䝕TS[*ZR4eM['XꃷZ^9K*:a9E~F? ` (Šl4m@th@v'h@+bh{~v3en:K__ endstream endobj startxref 627690 %%EOF ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/BoolNet_package_vignette.bib�������������������������������������������������������0000654�0001762�0000144�00000010565�12122071020�020731� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@article{laehdesmaeki03, Address = {Hingham, MA, USA}, Author = {H. L\"{a}hdesm\"{a}ki and I. Shmulevich and O. Yli-Harja}, Journal = {Machine Learning}, Number = {1-2}, Pages = {147--167}, Publisher = {Kluwer Academic Publishers}, Title = {{On Learning Gene Regulatory Networks Under the Boolean Network Model}}, Volume = {52}, Year = {2003}} @article{akutsu00, Author = {Akutsu, T. and Miyano, S. and Kuhara, S.}, Journal = {Bioinformatics}, Number = {8}, Pages = {727--734}, Title = {{I}nferring qualitative relations in genetic networks and metabolic pathways}, Volume = {16}, Year = {2000}} @article{li04, Author = {F. Li and T. Long and Q. Ouyang and C. Tang}, Journal = {PNAS}, Pages = {4781-4786}, Title = {{The yeast cell-cycle network is robustly designed}}, Volume = 101, Year = 2004} @article{xiao07, Author = {Y. Xiao and E. R. Dougherty}, Journal = {Bioinformatics}, Number = {10}, Pages = {1265--1273}, Title = {{The impact of function perturbations in Boolean networks}}, Volume = {23}, Year = {2007}} @article{faure06, Author = {A. Faur{\'e} and A. Naldi and C. Chaouiya and D. Thieffry}, Journal = {Bioinformatics}, Number = {14}, Pages = {e124--e131}, Title = {{Dynamical analysis of a generic Boolean model for the control of the mammalian cell cycle}}, Volume = {22}, Year = {2006}} @book{kauffman93, Author = {S. A. Kauffman}, Publisher = {Oxford University Press}, Title = {{The Origins of Order: Self-Organization and Selection in Evolution}}, Year = {1993}} @article{kauffman69, Author = {S. A. Kauffman}, Journal = {Journal of Theoretical Biology}, Number = 3, Pages = {437--467}, Title = {{Metabolic Stability and Epigensis in Randomly Constructed Genetic Nets}}, Volume = 22, Year = 1969} @article{aldana03, Author = {M. Aldana}, Journal = {Physica D}, Number = {1}, Pages = {45--66}, Title = {{Boolean dynamics of networks with scale-free topology}}, Volume = {185}, Year = {2003}} @article{liang98, Author = {S. Liang and S. Fuhrman and R. Somogyi}, Journal = {Pacific Symposium on Biocomputing}, Pages = {18--29}, Title = {{REVEAL, a general reverse engineering algorithm for inference of genetic network architectures}}, Volume = 3, Year = {1998}} @inproceedings{aldana03_2, Author = {M. Aldana and S. Coppersmith and L. P. Kadanoff}, Booktitle = {{Perspectives and Problems in Nonlinear Science}}, Editor = {E. Kaplan and J. E. Marsden and K. R. Sreenivasan}, Publisher = {Springer}, Title = {{Boolean dynamics with random coupling}}, Year = 2003} @article{spellman98, Author = {P. T. Spellman and G. Sherlock and M. Q. Zhang and V. R. Iyer and K. Anders and M. B. Eisen and P. O. Brown and D. Botstein and B. Futcher}, Title = {{Comprehensive Identification of Cell Cycle-regulated Genes of the Yeast Saccharomyces cerevisiae by Microarray Hybridization}}, Journal = {Molecular Biology of the Cell}, Volume = 9, Number = 12, Pages = {3273--3297}, Year = 1998 } @article{kim07, Author = {S. Kim and J. Kim and K.-H. Cho}, Title = {{Inferring gene regulatory networks from temporal expression profiles under time-delay and noise}}, Journal = {Computational Biology and Chemistry}, Volume = 31, Pages = {239--245}, Year = 2007 } @article{shmulevich02, Author = {I. Shmulevich and E. R. Dougherty and S. Kim and W. Zhang}, Title = {{Probabilistic Boolean networks: a rule-based uncertainty model for gene-regulatory networks}}, Journal = {Bioinformatics}, Volume = 18, Number = 2, Pages = {261--274}, Year = 2002 } @article{longabaugh05, Author = {W. J. R. Longabaugh and E. H. Davidson and H. Bolouri}, Title = {{Computational representation of developmental genetic regulatory networks}}, Journal = {Developmental Biology}, Volume = 283, Number = 1, Pages = {1--16}, Year = 2005 } @article{batagelij98, Author = {V. Batagelij and A. Mrvar}, Journal = {Connections}, Number = 2, Pages = {47--57}, Title = {{Pajek -- Program for Large Network Analysis}}, Volume = 21, Year = 1998 } @book{cover91, Author = {T. M. Cover and J. A. Thomas}, Title = {Information Theory}, Publisher = {Wiley}, Address = {New York}, Year = {1991} } @article{kauffman04, Author = {S. Kauffman and C. Peterson and B. Samuelsson and C. Troein}, Title = {Genetic networks with canalyzing {B}oolean rules are always stable}, Journal = {PNAS}, Volume = {101}, Number = {49}, Pages = {17102–-17107}, Year = {2004} } } �������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/biotap_sim_properties.png����������������������������������������������������������0000654�0001762�0000144�00000257012�12122071021�020442� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������X��iCCPICC Profile��xWPT]9n&&A@2& I$@PD0"`�EDQ3(Qy曙q]Z_{Puίjo�#Lf, �qI,w;K �@%84i[{�Z0Q5W2eRЯega n�@�-䷿�hI$�d�B�J�Pe1ܭ��DJ$ %�p� RY�� BDh�=%42 @ �@'�@XXbh�KPr�P&+ @) �d}|h -3@N�QhJ3�͸�m��@(�l<�`e?t^ ņ&R~�@a�P50` @(B:l]Ppʠj,C4 h.x�} ^ ~ "B" Z!b ;!H#HRE3H҂!HA"dr:jEPt2ѭh.=Vu6ڃ>Eя,Ɛ0:Fc8c|1&&9ĜǴbb`b>aX,V5b`l6[==c_82N3p$\)w ׉f< /-||?A #!$F D"QA$zci5#8q!šđQQqB&\ItR ,#uɎP6r)I$P(Y)ŋOM\ P>s9Ɯ x<Γ78_p~p)pYrpm*6fqqqwsOPՄCMR<$E[0\*6aU^q5iex ]ii'iwh JqMDLrjz f(-++!T--YOP8Px9>9q+bfxQ5Qhh1Q1+Xb7ދs_#Д!Q/R#&#+Y/koHRRRnHMIK[J3˥{dd<d\y#K5=,%SNV!+wInLWR%_-?QUW8pOaAQY_q-oJJJZ%ݕw*(RPqW٥rM勪jmY5%@RnuhO5 ZZZZ/[(y˭k{CwNOS/Fް~AAOC-8sdʍ^ 3Kp8[_c&wM)b4骙Y-Uss,󶵰bm;8 ;<K~++cVoíXOh$ٴ,ۮiceaw}ELm_wρØf'pw*vzLwrnt^ttU5ҵum۫׷c]yhy{t3h /O[a/U4{4U'2)_C]d:C6`6xl0`p0}A`~덪37I%  J F  lGmj}53&,&M6uƊ&>K{;~$843ӎY\쵹EfE$$i$&M&[%W&/\MKe>ڢ%VihZPm2 I?q=S43=s(4D;;(c'sr2sv8cyg] w}ݒ'=}S~c@AzX}aڞm{X$XYn+;DdbiXiUr8t0p#!G5>z,1cwk(o-<yB2rʿIE kbjO9qZtE-6vLg8qd]^.<7tQbyO͍MM]}Y+W]彚ߌ4om2;ͮ7мqo溝߆mj[lOi19vg㝡wwytsۡ}]=6=wX=xhע壎V;8<y82g>>{be﯒_- q ~ssZ#f#wGFcLC{|RnSNS?}){/_ZZ}3b3f f9:0:gAt/_}?,mY&.]QZ:ĎY/ e,_Y/ e,, f���Ј��|}�dm= �(�@ȃ9hw?b3*&04L*fy[ Nb,\Er֦yxI|X -(#/$%Z(vI|PH7ӑPQRWiT]VدJ[J'TZo@ԐaǸdT|x+SZۗuz۝N:wq[.ap JsM 7A`zVYSD\䶨=e1bmtRXդ䥔-Vb6t LzXvr.6cq̮ݓyo ^tJ">ZvB fEeeGSRj|k e=WU.e_>{l`5a7oFފӶ=#s˝컅]Gu3W1jL *e׬!77=b02=zv,f\k|i#& >><Ӯ?}izΟ >˶l6� .e0oHp>!3FuAL9  rĐD+ۉ#K]ᛡ}&0/EM%H^q͓R(UPnVUT8DQ/_ᲱŚx ҖVE6 vt'ugckWg7A$m^y>EWm xyckPG𑈇MQb6m򎵍3JPbl$I)z[ ioHWPȔΒ.Cͥ dZ=7_S}߭%٥%>~1k}N0++/W-VהU8{.7b /E_>rbӺZ M[n_mdyRh7N׃؇[{s=.$k i3/Y&mpHh wm'm>Nt6YЗ/_ۿcO9˿K~+l6� J` !B !DqFJ 411X~l#.!b9$o,G5}̃gO=/Z~#r]Ll _n YC9.qB�% e # Mm-.)vúqz4͆yF~J&]kik+-V<V֍6ٶ~ط(頳ːIF8DO/!i>~B?6޸!07x:;&,+|Ca$_䷨51[79Jݏ?bmna$%&&'IMݾ%rkښmbL,Lj_9 ;vص'\Sx}"}KE,?4zDh|ٕcʵNTW^&h <]R{,M]7Z6|ht jRpk]7n6nagHw\^Gr ||kᬱIBs6}:��^H �C@@ 0dqHЀTK!B#8@ 6tل9Jbǰ8Q ^ X*ўXD|!Q1K2'^ȩn(%rS3Kw UG 5+[hGC? %""7D=EK$KIޡIIݗNQ=&-+ߧP$4|FeڲOSZcotu_3h4<cTa|dߚݦ9fYykYYYӴgKsrE-{}.Og/AIB?  �\�;D1 ;IrӺi0v1^,a-3bs1VlbԊ-i oeR[sxrw,ڕǗ_Uh(t~z4lxB|Ł*jmg\`ߤsY y[wicOW~nTgB#կ fgig,\UX̹|fEaj;;�;8a)Fjs üƊb7`˱#8Y\$ow0I!f9x88ȓlHIF"8Řrӑ+)STjO( uNiG  6 eˊ?HT|E/nU W'إO9PEEگv]FZJ2 m3N1admm\mQdYiuźfoɁxԩ\z ,O7Oo_醂+,Ɇ{DhmJ(e^|)7(%$tKm)W2ͶA鲫xw_>EGJJ=wZى|{+x*Oz`N֦>?QPu*whknu;5*ݓ/@Wb3eߨ oP|8eų sE5+6�QDv!oQ=4b0s8 .o?A&30s3Ŝrӌ3kMTyGૡЦK> V 3/!YEϕ^/c&*'!ϧ@VP"*Tbjj^y-Z:ºvz5OpF&kjLY|bM񷭴ZgP8Ra:3 g7';C ¨ዑKI_`jnhԒڴU#BZƅ,9;]λfy\$/Z @G<ft|Ohy奓յNלQ<P}^bcjSe+ۮ8^N{j[AN;'ctó+0zZ i E}fDb4zy}GO'?_ۉy?g4fΞ\ټۅǿ~_Y_]_*\Y[XiEzweJ {`zvu-flo��d;YY[M/�Pc]�@��>[;�2cݜ~AD==!.|ﳈ3��f㏞e��@x?y*c� �ib%{,�Җa�T�d"-glXE#my1�JoJpt] GpHC<XU " X= !b!X@) ,)#B!  b,č9?担`iiNi.czXK) kt�V԰XCk-L� "qct+)"HVc?3;L� t7��x*��w/o-)|K�Us++:2*ndƆŇҵ54� e\}a���bKGD������ pHYs�� �� ����tIME3��� �IDATxwx?ۓlz'PņHx\ z-H^ '(\\b ł 6DDJ@H&ͬ&= ;99J]{ 6tG#@ @ zUϞz=?9묞SI$<$@  $j5:NV:nݺ5553@ @ B$vhTڋ.P^@ @h$I"!2vՊP/kkH>_J\j*VJ 阵%X>?M!EGaD}Ҫbޢ_u m ]ӺsQ`RC;@ @ Q}7r ꨩW늕IhC|,TT9Jqqf3]nN zL7c2bI&m{T*GRyR coW:X2IO.98Qvbjs9@?SDgtL=)7O[dّNrGI1"~@кjrٷUG鞒FCHj88.յ[ dr @</W. $^p1FR*>_J(^�J s_G\2jf/O(,(ae A<@ Z)//b0sF\ڿ#'/ܞN̸GY1%EG;�kk`н9OEGgFXVSfw?y~Ư!j>~z3w<m-e[ͦn"6@\M3՘�Ɲr.Ox$2JJ(X.*53iSj"}h$^f"\N+֐ԥ Q~YSRhi]4De Q YFg?JbF-uV51K*y{JbbH1NCte?RkJ]J\4] ޹]Ȏj'@ Z *L߿Fy6,^o~恋ۢrדp); @ѷ Xm?)6$BN|a3wYNQ[r6MA71�8j>O> HE+9jv#ߦȝԼ~穻}J$<nSq|Vfe]Hcoٺ_ s\{B,:@zDp[ ~hS]C8*iTT$gcT1z$;{'C' P P DШWv5HLA`aT1$jII 3FQ ctm.SnϿªZ9W1u+PH "#3wp z@r,uD#8<&ONa@Ra3Seh4*2 K8~/7*9^Vݬ^Ϙ̜zl@P{Ԭ^3ْ ΔgMYGg1m?첏*3 *lq*OlA%īԨ$Pqhހo˾!k<Q)ƠAs; hu8e"I=CduK%5#ANAqP*ơ֨:❓CةhK Z�JN(@#I{N]X8esDMo, {q5DRV\:jEuPGQq1Qng+CoS|{-Op#(yӕ;3� a&~n?1)v?~ q^w;%߹xh ;&oܙ;#yvOGn9fc 1pѳ <m?r.iKߟBh^-ՙJ).6Xnw#H$#IMg˔|ڛ {Ιl?-a=лl]Hʸ!yû\CG+M/=MƜ1(㛌|8p+(6 ༆?I5 #鷟w݇X|Mnq~^{6^y fx'ᖹث\Vfe?r,$ZO1rmEt FqaK?Ior始!SCd?^B$=4`;WAq`F\6  qYRS%ƠvSТEGNOK pZC5m&^AQSj/OHz$ $a3QVMQI @Ъe(/=&ovB쨤z:*IB/W͒wQ;MYF24 <nIe@3ѩ.ѣj&qϼC3aL2wT7lqħ3X7;gaD; xmJ>udGJH7 )xx&'1k""o<7%9 ncp_i9mU}&qZ _՘\/2;~.7`щYq ?ډO1l+>Z΄N'ɒ [.~UG_ ЗڟsIn~:jjdE,Іha G.q`$rv̙?_ƈnqO, ^^ůMDMF4}'<zQ*?la$_NNϪmg,BPʙ@Nl~[&=D֛K8kԻ|ӭ<~Y;.=hiv`xʿ<Zr/]Rӈ1(Ytt V: H @ h "Ch -FCL [WZ0R 5D-Z7*MB,8Tm�o[vPiT4VxL!ctqQj4:4:@aa*9itDI v@ h58ޥ˘t Izv yLb{S3X3q7+;ź5hg7??46JH~>Z a·?>@Ōm<~ʫr9k0 :9\\G9h\ -?9Yѭrj38[riX5׿7].{f4Kͮ.wJ)|&,>Lyl�'JQ9EOo;񁗘Ñ?F3sUė3դyDk0'^LlX53uZvzG$jl6,D 9?¿bXy8oc>xfn7jLppdhy1Ѧj:'>SMq8p8L, }uÁ& p1IU3rfv ''VUp@wӃXLT>' ZґLK-h "e.@ Av>Ð q b*J3He!PMF ;C24VhP`PY mjZb:b5zdnEoR;r6mDO@ hUHԚY6:˱= /[O],9$ mȥ 3@ vgݤ7<ғAz~,/~@sBHY6Cnra!26]sa[ :Kq;F~TD$$]_9q1p<蚢Tf8LTUgȴRjv-p;]e)ԕY 󂙾n5s38j8VZm[QQ TזcS#IFr|kRGs @m-VC:P!!!c2eQUbfEj,:νFw9' az%YqIphvd8Q%T@mFrQ=QX�1F�L%.rgQWS&ufew+9}tjJ΂VTb2x+>KΨL*Ak =ıc$Cr"$%ArdX * (./C 쁆6dܼDt:gE; *Lj3{NO_bbzb5Di5hq^| �4Qs}XWߗA$f`/%V:Pg)o^"Pdʮ[zs_ϫeu�`O{AIzRx8S$ a!{0/x%%?o]7޿/Nq(@EnqdsKm'N8g;E[e4)~n Sd@^ihK}HUi-҉VK9!HIѾ/2^Y> b6Kx_{ [p ؽlS8xcN*XgrCw[2e(Ԁ V^˂×0~p 6I^?塞Cl^@ 8"C±75d@R"'8{ �рFQ9pbj~ǭd;g:32Ǐ[q萻_@JIbDcPѩ%J1D)Lj" @*Jr舝;Y;0 {>ϼ>9w"">m =<K X~۲N82RpInL Wl:pcY<|�55*&k6:ݝTz�39Fӂ/\bz9,/M竝0qI_:W6}[BAH1< H]4`Cju ,a{qMx^o4eٗ�sx{\wagjͿmv`Gd]F8ڥ;[ߖ˝KWH7-VNldOhȷ_ODuq<yLC =EG&N 1o4bkh@審˗f:q$;t^oMttt}(痷`g9Z!@ N$$]z Gwle ht Z ;%55hC,Q6cCKрm Ta Q뤀ǔee ggzc-pd�]Sq5gV]'z2ABBk^ݯ8sD3[m: #9جI2t+wμO,.%TwY6Bs?W]>7=+hX-| DÌeydJQ'^g0 k;=w�eɘ8ᦉg#|=OYRi {Xz1Xx.騡d�}ȳ'@|'ë3xmYͷ3Q&??c'2"GkQ;8/|7}{Fykf], '*!cttp8m<uR.^ONJNr3,}]EBes8MKK`2.}V>aw83EVD1ᳵf\nj{?ptߢմ97 n~f9WwolY9hjA|ns&L`ۗݧ:ײ*H@ hz-9$OHN'RVUEɁXRNUUj:1u0}DZx3㈎ՁJEB0'^B]!b~DzR )c@1RZZjz& %AK%]6FdRYRDeDLZ616:PG%d8EǨcۑeHs?'j3bĨaeVԕ{L&|z_p5ZKVc]0ħʂVk &FCiLĒTۥ&M[豗ǑMuPטs^\}dFQvU>:icNiXW֖Rp6m08X1,9R-9DYK)(2LҌ*,VpX 6P.'kN4$&뙁<x7PSIQ]&W\x@Aۄ4j-C0T&3UXZ1d {9Uu>->UծM"ΠA w<icjDɂ֠X _=?ͻɻq*W-ऋ ofjIORt4]c!&6T*,3( gEyMk$J1QT a퀊JjU;\L6c.N YG] 8#,)S*CӢB.!p5v2`s쳇KYte:TtZdY^բV.yɡ-{+^ذt)^ d?y٫ҠӪA_cD,N 1j~cI<)6^C\?B~duvdx.,@{ljF%AӡOǒ2`M7|Qw.7M*H@ h=Ofk׮ T IjNGBBtla6ε@ ksTXONTt9riۑ2PVXB]ڄ_!*l$vŃa(;Dt K,fAW^ҫY]o̎-3T9@ zhcIrPVf:IꩈILƨQRfB(ⓓ0FPUHu5TgǠ@ xYjxn@ @dT#G"@ @ &@ @ P @ AD"@ @  D@ @ DW^y%KN6m7o hJ@ @#d᪫BRy3cǎ媫r޸q#^_P0;5vZ{\֮]KFFi ڷo ]z=ɸ)ZMNN78e_|hZ@ S m8s9(?4ÇSWW*.*}-6l`L4)v;^z5FFiU=Ui2\~=6 /ɓ'n:rrr�SOJKK9p�*Gfܹ2@ O޽}7n\@v_{Fqty瑓êU<Dj{=6l|{\eأGO8gIΝTnfF#<ѣ>ie @ Zgƃ$IL:mҦM̙sR.X$z!8Ypak?>k׮e۶mуɓ'GJŘ1cXz5,rm _=6mD=\̙SO=b>뭷khӦ z^p۹=_8묳(//G$|ItBBB^x!۷o;`ƌѣ6mj2 ']G(xs!n&hӦG`0O]]˖- Z >'+?{ߦW^1qDW@ @ :t3fo믳`~iyf(Jaaju5kK.eڴilذ]vqQ2b?|:w?τ "jرc)((૯r-s*˷|ڵk]۾O[.[>łA駟rWsc2�ӧ˖->r�� �IDATҥKiӦ III̚5~;-[жm[?|8 ~E0BP駟7|5u҅l~嗠 i, ǿ&Çϸqx饗\‹@ @C#FFuۼyk1c#F][[+Fgu믿^4#F7neYm6(?dggO>k0a|E׮]{GeYF7ʗd,˲,kN1b<tPYe~dq_r%AޓeYd /^UFիe*Fyɮv'O8ѵlРAmp8d@^fM{@޻wP#kƍG]W߿uJ'נRd^Oj:<+ϝuYbq->|<rHY @ +ďK.u>BoX,^{5[~-q܍aG@AAӧ>* =cƌ^gm0T"\_^tET*nJNN,s&|w-z}~Amm-�III >˗3a{=W_}Z Q{.?)#r￟n_~sr%s-Fs䅏>cY~~>>`iFLLw>}7o$=@ @p`493>�_mp(/!!Y.JR6j�RRRZU!;3g駟6*/cbb0`�[l!33+s=ywZdYf|7L0뮻%KxlCl2Ə^w s>&&5T h^s5tܙzK/ٳg3uR -IZ @ )!24Ν;)--k9i{gʎ;4hqͩJj։rssի˖-cÆ _I2d+V %%)S`00`�+V/o1޽+W3p@6l̝;>;v�ЩS'j5_}]vk/aÆy4 ?o2 D(gϞ|<#|[B*g2e$Ryj۶mtY @ $-җ`0pb R[[KeeeЙďl6T* ⥗^⣏>b۶m\}TWW{|}sN?l>;v,+W 8T"T_<~CL4h/ . 11PT2m4� ]t:Ǝ… 9ٳ'9s7zj , O>$_߿?| ;o&'N<)eP#kfٲe:tI{"0(e[PPĉyygh4-g2ey믿v Z~=[n;@ I& 42Z^^l0d(GGGcƌiO>qM|ؾ}{SSSzKΖz){Y&(((U*|wm0_J$Æ s-oe@^`AM6l'M$ 9**J:u|]wn۶MEyB=zV嘘999Y~=ٻwܣGu& &~l27c6&~jrbb|9ȟyZ;t _uU?킕2%6sy&~ ;<yr||hK3@ @Α#G9oBKqz{1jQke(TVVb0\+,,$++˵>cذa;vjJKK ĉ2 :B{FFF/g_e>;v,ռ;8qj@ %Z\d|qW˅3 "@ @ h@TUUp=gN)z2@ @ =@ @ Dp@ @ H}Dž@ @ 4Uii.!@ Ɉ@ @ "@ @ D"/@ @ =Z{N8A b_ |)Dn> ?= &~|嗹[_ @  '@ @  wUV `̘1 =s{—arg*{~gQ("[/Gq<"=z2~>}zԻbY E[oV{R ,[U㍯d/|=POnIعs(/֗>yž?on8U8}z*ջ@ XVv;�,R\W:Js;_ߒ$Z{/#gnoRe>|wTO\\\ݠUUUV^3g$??<fΜ)b#MO"ȗz~ly%c_ y5ދ3f`̙"73̧k׮,V֖$ %Y'ZVIn*fpZ{uM2=6͵N/k֬ClHNNfM)S "`=z4啟j0(L*c[nL&/X;~8خ/G½O,Y$Ijsss#v{ݱY޸;<GTK.i<r~vv6MAAڵÌ=xk{nkbvv6Gi5ʾk֬ir7t{?:4lw}�jjjXv-#F­w#!2f@ Dϝڀ*nFFF +** ^фlOv;w0{ u-T[#˖GV]3UV/{nlω'㩧jШ衇B:NHyyRTTDFFN6dkC۶m9z!Naзo_z"Ec}}/P`${m07>QXnFu=Xtx&Z~Ν{P]mȑС;Z.1y$\?@||k?-kp ڵ˯sarrr7Z^ 7߶Dn+۶mˉ',o2֬YXHj#B)//_$))hꈔE F꙳‚@Y AUwKIIq%%K0a׺;3q/^쑤JJJ&UW0{`7ʾ锕ǟ=rT�8ʾ}tEmMFF:W?lI{T*U*qƱrJ\C%o{' ??RSS=SNum3uTh4M}uSNG%%%ŵo-߮];L*2330L|ל{l6&{&Ry11ܾ >YhiiiDEEa6h4l6zKhK#r/ri* h~uȰ`?4i֯\/@7HC'#Ƚa\摓ky'8ovq^DGG{k-QRG C=먓JKKIIICx())A׻|ْ! .VZŸqUF $>iVV555wyy9-r-5jTmhOr(2z(up,6;&w .@,YޕppGܹ3f}L$IWJ#55>v2HLs⨨0aYn}Ce5<U~�EYYeee޽{Yo2Q<ؖ6xU"Y^=ұd"3 &oC"˲YYm1̤na9} *Vߞ C\^]mSZ"t:=*eOll"[e9L ?-jNfvޝݻwIbb)Q| nj[l7g{wy#F{cdď"4 dSspb<99U+X;cc}:j(֭[Gyy9OFFUUU… jp[hp.0 @ hE"{W@" ~.w9=v.TUVnݺؾ]9!ǛP=>-T~~-c׮]ο_.Q<H۞gY,Zu޽Q{n>〽k}_1@hPz7o~KNNv l';M&999dPe;OlCj{uuup``2 $aZB2<›ӗpݳ}vaq70xhmji @Gyk׋Aٮ]v=P6w=ʽ.0xl=<\!D"!!\1B}$}:j(l-[xXn!b>mlgs8f@ D\s H9{d|ǘvn]q8X^^!۞H299P`صk'K_9ɖ-O%K�j |MK(𷯻._kPJaI56***>Ϟ=iӦ5X\RHJJp ߯}T蘖F?q[laȐ!TTT499s̺~ __j >ٱ9Q!X]_s1BOM޽:ǻ|(d|F5#>|5J>L~~>ӦM h_p{N}3g]RRr1LCyy͙#З1�WC8a;|.tcHK/SQ^^κu|hOXP|ır@,3ISs *@x+�Njɡ;r8Ym(<V|%yMk|o_9P`P$&&RYY1u87xoJbq5m4=xH}-0<w??{34zKǾe DLfLU<c :Ե9)ɐTkj45}ٳwͺ3z$IIίL>I/'s0"HhP"!C}4Q {n2w!ҟ {n"X Xt !LJJ<hQ,y?//1G6FsrrCx,o{Bͳ 3fp͢nwΎ=m8"!!r[e`my>6C}8Dҧ4x`6o 8'T4zyĻ?*XBdh�[2ik]NN555tؑ2fQxY?p/,aTW 3eNITTxW6ү_{M6c{ctuj˗7^,\B˗/gE{]ukӧM-YfWRZ=)q*++=%b_R! TtP!08{2da2HKKd6yPUU<3fݟ>}zc1f9l]hP˽}r2}kYnn.ZjׄfG,D:O>D cfΜ-x!_C7e[e>@+µ2`ҝ***\h$!!u {壏>y-[0x`BsӨ j*7 ,pȐ! |[6%z\+&Xqp~ '{=vC`8=Fll|;]1(l?|U`w<K_L:/~Yu JEYY+VqB/D'??Cd~wʃwƖbK{>ʺxv5w{dpDFfMIId6>5z!7ki 445̚5+Y7FMa@4J`SwV^ ֭[Yh{s8pl�9묳�Չ l6Dti|AnhupGbb1s (5=r/ވjJnڕ|mBl +--I&5hrׇ]7u2TO7o̞={<yf ‚ �<Մ*ޜw%~}MoybY E%IN޽6% _xwg/97 Ud`8rQ~tg7e۶٬[зv_!"`퍱h6{;i$,XC,٦\nT?~8eeet=h?SL!??Y]Ǫ 8d)/E,E`tv)6gggg{ t\'C iL&Ӹ;[\]#G™uWOHe6Zpxn}Gc.Ng֭�lܸ[2yd9iӦM9͛]"î]8x 7|sğ pr_4[my晀|||B_[U< 'PB_}w{ΝZT?ލ<aEKs.X]R^^NQQlڴ!CȠիWs7*1tа9OCeС̟?_еkW)Ϝw=Pr@ Ѩ)^Ix;v_s(Ⱦp m<cL4?@rrk|u|Y=1 \w$o_ܬj?{g9ό*Cmmrwf?fΜIUU& ٌlv ʃҐ5|!T{Bۮ`9bߣBl=fqq,\y$''aaJRrH$&k/['CT[tD;bZINN>O>O?uQTTDEEZ횜7e <?µgܹwnp3c *++ doMsxϯ`2\< n}#-?~% 1cx 0gFw h 'Oftڕ={4Z[<4Vphx׸* ·>9{XmtrS7~=x7ŗJ6wD~}=&כҗ= a2i;n1F%0W9`*OeXQIeWc] yJy ОHž@Pp8sD۬,~G߶1dl67)ǚzVHh OYh+A]�=zk / /0}?lt/OmƂ[Iƍ4Bk|h798q[ڞ3fzZxM 4l6#I__657'P9z| ی3UVQTTR;b |ݮz>O<6'wQދ!P קֻ?w1W9?<mGDbY D#_ _D01#=y pyr|.(Kg{ IpoGҗ'_ <瓜LffC ޽\ƽ(PT ""QǼy| "bok2<bOE`7oǶYYY˭Χ[`1uc <Z⍁�� �IDATIJNAnd2L:_{ 9b]{/֓!X8E_o3c$p+LK`?ޱ7SE:r_ ;k=ӧO'??yyܸ8sH.4B ,#BH)EEE@u‰U_p oi"Ӭ,WOwk׮M~D�+Wdܸq�r{w>Ő+V0n8dY沂sZ] @p $pz3xbhâvK,wرO?ݻӧ۶mc�Sob P w\1nh4r9wW WV$T*>]6m껏͗'uʃǐ!C\*8>w77qS+[#R7F`hl+")1RR{=.rg¢O{ٵ=PCn֬Yz̺Çx5G9s28`#6ls[={p}C zS2}{{nS$QEΝZ&??e Mi@#4%F+7x~N\_j(--eƍv T*>(߫Wv5/F熍7 81*ngڵa )P> L"S_֬YCaa!5557rE( He~;t>)BC0m/@ M$ 8OqC>} %i_Z,W:6my_<3fSjN=߃ Ac 3g|#;k,,KDk֬Y̚5 Z" Iw&ᄈZVq7r =ښjxp(/iZ0 <>"Mi(噓y{j[.qa|h/{" F}`0ԓ!SiaONHXpo} 6..xCOOJ)ևS^"(._9J2i6 MRzǏ{ESQE`h9V+Khh3jjj�\;w>O9Wank!6BdBU=q {;* no'+{ u-T_7jZ,F#dǎl~ bccX,~u6֗-mO8\}^!:?"5{7|:NyT_4WL&uBum- ))ج&czdHH#19^dV+i)XyF7vS$b̞=iӦ^!//}puU/rssٻw/z`0PTUUax>q'OXڵg}7}Il6SN.A sKPYi87"25&]0͛*3EeSٳ?4Oh4z\$U?]w>ҹt!{m 4DJ IMMn<G }Ehh "0 65"4"JԻŋ;v,CCŲk,$"C(.=BIkiؘjS63?{dOkWw)ܔX,4GCc˦1GmM-i)Xm5bՒT/4b2\ߓY뭤&c8 %H7"p8<{ )P}oUyPGhPT`חƍQTcә6m>lEPPz.hBCPE%*nSdCiT( 1x !_~h stn=}ff&Rz#Xo*e2g@ttt)FGGڡآ y:RDS Bm/@ a?jD'Csbb!۶m{|y VcOs2[Ae/4Y"˖'TY[Z`YiûW[@]Z^JHhh7Lj<z0XVRS9Tp8=\8TpgvjZKJJ*6:AO}*Re)#4DZ`p>tuV�OX߿ ˨(|I�^|_ Ph*"CsRA#EK{w„ ~'7tW8# b"4bro*‚?!E_E`oo CN ]1ꫯe,[Ǐ+>}mbY "CG'C0?{L`!7ef)՗׬ٻVPDQDE\Rsiei@&evݾ^YY뾢i"jin0 tN3, x`8s|>s|>ꊌ3޷G^Vez'ob޽߹sl([eGȕl̿Xp! f6 ٳ+<oK3Z^F^/&UQٶL(DQXX^z(|X EN:vrŞ={JUuˬˊ>'% uԁ\.Bmi|NLYٳgCP //, ği XY?ֈŧ~*?R gzL?%Biumޕ-J*wH= 喆U嵡,uֵ: ;1_Qƺ-ZP{СC{n>sxzzJK4 ֯_/l~,'L&+wxY["b2g̗k<̗ʦǞl97{W(8:= 2JGEEY}ɞ@1LLjwT5"k?YC~}\*FF#5f& >ى6m۠H H 0DDDXuw{i!779�СCw8`tVXmڴP#J-.[bKfEݽ !Y.Q}/YVi frkCygϖ9tn뇄<l= zJ{~o?6lRS0it)뻊& \.‡WZ tuK=җ[Xh1˪NOɻQ֤G 0[ϤFիU[?=5B&aܹ� ͸`yP2{سBlH1䏽뾓""" 4t6Q 0 ZVjϧHRUuwt^Z9:te9�?'==J,}N* ^ï6*N&(**pvv.|WL.!YyizϢ1]RxmR.뇄X ֖hz:u؜&{}md2z �w6 8t{8ZW;\./zS_kַtm&"a:sZ}QnuN)kfv[L{QQQL^VDGGZ֦M鎀-bmzlɛ Ϛ=g޼y"fwTWՈ"AV[EyYrz2 :2-Ws"6ʺjjb@Ֆ [Ν[Z^&J԰xCm6Xt[k}Kl 8*mu�v%Ά(=lʣ;|=dAeYY襲6M3݇?e(iuKOI.K1ݶ2y-/},+J~uD%Ngڳ䝫G]V餿K>K tpqq5[?'*LFCe>'K 0h0]nsR^ >ey&6֫ꇪݡm:FZGܧ>:NZ\ayզ<՚o͗c{^o+U*O+ 6֯鬮DT˃ ݮ\VLK˭ه>-=KҗE{eOeUأ͛'j(+5:R>'%k?'5:bjC7MSM,`8pd,}^*6d0jժju-=%YƼ,99úϼ /9uᵡ&&iMKD/ٽ{¡qqq)""""""""`A"""""""Rs2U{2]0@DDDDDDDv!p """""""zhʎ;"**9ADDDDDDDE)xwDyUDDDDDTd Cll,s1|r㵀*P: &R3iDDDDDDT-^Zr2 rNNNpvvL&�d2GP ~~~ѣr )))+7ݻwg)=ԩ'xYYYχ PTP��B\\BJWWWdgg C^^ڴiS{'NѣGh """"""z FxyyQF0jh4h40 RBR Z 777 Pd˒d2 $DDD4j0(d2..h!ɠT*R JUj?rKY#Ѻuk$%%rD/<n. xQ6ف � @#NؓA 2O��[Ƒ#G&z0D硸z�� xe2U)d2)~H4{]R&WT�5B0۫8|5�Fl �H1 bW wT"((b"tFDL +2}=q;nKB'A`@jj* gggFzzh(7 P*KҩS'l @Vŋ6%_ O�ޏ -MviS며{2Ah'แfn;ऒƦwp? Q1C >1oKo96ƩKyz0ӣ.|}"""""""i^ d2<==yLP999Ɂ0 œ =J8;;^^^W4Idy ^] w2x𪫲'B5\~�1*9FIAl�j_g3qFpSW2Lx1~z9'x 2�-Y3N#F=9;YEֶN"""""""ir9Ο?R ///TR�PThР<==]*P M` ��EƇ;q %׽]]ejѸ GU F:F|&^75UᗳٱvDƀ�ȼÚi(q*tnQjqHUquBHC' 27'AQ@&pkD '~+CN!pvK=((4 +W#gr��Z(H 1rVgZ!F,Q*d&{d2"55<F`)P#,Kd %jpS@&Zcr6Y2oy,%M:|<?Xh * r)GN[ [EDDDDDDT])2dDPü=oqDz_0m_Ph9X;.]?V˘^գU3W=vE:#! kDžk+_c}w-!@<qKCz,""""""nݺV�J 2*!Ş yz xDVgZ� @uIS1QC 't [fE-}+-ӱ eO(kعg6ݴx,""""""FKeBD?ZC[KJlu?O_rQo4 lJl=QucoK_ά$"""""""kY :ۓnݺضm4 <x�V BZ;\\\ШQ#2Q-Wn[n"""""""K](+2j d """""""`A""""""" .d """""""P2 Qp8P{}9 DDDD8X|(KT| "b?!}(�$.d>Q`?QkoA""A""""""" .d """""""`A""""""" .d """""""`B, """~A!&,%C껻Pajjcq.qO#G'*=2 22�QkdW' ,D"zd """"ѱF`NHDDDDDDDv  DDDDDDDd 2py@T0@DDDDD3Q2󁨶`cڀA"""""r~>| z1@DDDDDUbb)L, """""{Ҥ9 ə̯ |A"""""灃-) [ ,Ma~=@tKU/ 2Cm  ̗y ti<+=* 2m 4 /WYQ`ݼŅb+ .ADDDDDv� D DDDDD0Jy#D3, """""GY۟<&@DDDDD�Q  DDDDDDDd|wnf�bVmC̪mhYW׵:$`~ZGD Q $2uk6{o\Pl4��F�.uAp`qajwM&U41@DDDDT#BGtG?GtSȾ_rxT03y\{dRׅt`:'Men}B!b* �a# F� -Fclltjo+<]Ae%* Q .- � k WH�rJ? l�;)<w@CE1@DDDDT A"i Z Bjj{ Sx=PQ%2oq- ՉQ AGRl` DDDDD,`X_CӡYfenc�TO_pBU%p80 \,SGx'xk� k׮!?? 6,!UhǞy: H@ZVh߬/r22y=5k"Uؓ(07?' 7F@_d+�C՞Q�m'*HMMryU՛!M""""j`|TNgODd8_h,` 2Uc  h<"" `0 48KUGшv0Fz"L`(%a4!-d """"F@F 0! =Dr\ %!1Ph4J?IY֬Y+W2#ʈAk1@DDDDTMl;ѣlUm䥗^ѣkdy۷w*]\\Aa0P%EpADDDDD( 6ʹ#aɒ%੧rhZvիWo8$ﳲ5k_G}4mT`0ATż 2= %<<<йsjG? �� �IDAT|HG||<.]d|ɼ?~<{9|=z4Yڨ1.!ɤ@\ 8pQ5 :|}vv6/_N^/TE�";;}1Fš5ke|Mlڴ ;wFÆ 1ydIF| Df0o<c{x~ztQY!./ށЫW/4o˖-^w4m#Gĕ+Wl>vbb"뇠 |_|6mڄ'N ,, ?��۶m?f͚{X|CZ NUVUxLլ ã. #,-HHH@~{n(JGPH{jHKK~Z-�*fΜÇK˗/c̘1׮]î]xbL2>,VXիWK̚5 [lA\\.\ bǎ7o?%K`:tfݻ|z-<xw0f ΝÊ+l:}0e<󈎎ƌ3p5�@dd$z쉠 ,Z&L��ܸqþ}0l0;{ .\Pq:mT3 %e]k%aի7n4 }2 *ʬHJJB``Ν;1`��رcw^DGGcݺu5kvZ-W&^zؽ{7j5^xbϞ=8q"Z-/^3go߾�~z 6L:F͛ѠA-**–-[P,[ m۶ŬY��{C�5DBBBBB0|8p�111/ЫW/iɓ'KNYf!11C y2iܸ1<8O y$i\.#," Q54L6 j]v-L&R,w?ӧ㥿 ~/^nݺ_~xa\J0°l2F\z/_.5@XXX�С|||���JﻸHH=vϞ=�PTpww*sa$$$�BԅL㨴Q2ʪA""""j\_߿��4iD5P 0Vә5&T*n q;�V ^oEEE~ ЪU+"6j5Z-d2쩧Bvu֭uԱA@tt4? &`ԨQXr]|=ܸqeg+Yڨ"aZ7l`Ν;'-򲺛N prrP<T@ARAP`0H]U*x;Ӯegʔ)hժ^{5ӧZn]*EEERZ;-Z@&!((NNNȑ#4OulLfֳܹsXnك>}@-͋/3:NU59#Q-UP1PrqBF8A Fܾ}iiiy&n߾-5Lׯ_`ٲe??Tcǎ!!!r WԩSvZ[':v׮]q)ܽ{�L/"-- 3g�ٴ_q7n:u*,XyaÆVQid Q-h$lRf�NV+zƅ8A $T'~ D@@�TL4 _}|}}�qqqsC|죟Ǝg}Vz�|Bll,EUIÆ C)SYfx1m4nJ'N{' u-[ĤIW^�㨴Qͼ~5D*.\(DEEaƍe=/_ѣGWDDT%V�Qq@DU:U4{tz$ (=zNCӡE>�`ʕxͶrT*z"g =ј^z ظq#222">z=nݺ??r't{Ν;W�999PiiihԨnz�ܸ~=Q֭[CVCR Jr r\d_]צR{=\?P?(w]``(k*4h�www<JR*h֬Yul___O iQG5Db """"~Ǝ#F��nZ B 'A0Ja [Ѷm[o^zh4B&I%!L/O<fϞ N'us3r*Jz2JJ%mc:oD `oi?%r�cLAD 2ȑ#̬u]~}у駟Fpp0J$P*e6ƽ:XOYAZmպD U233q-f5QuuLGKD/Ȯj5ׯ؟gff47c~>|c۷og """"t """"""" d """"!Ξ=L @or@0Omڴ`b͚5زe e͛7Ǜo֭[W;w.^N:aܹh߾= ؈GAd "?~<J%^x�/vggG$c害a3F͛HLLӧѤI.Q98'9Lxxcǎ<1cƘ(�˖-Ö-[pqDFF�~z*@DBnn. <==-___!C͛;<V\@�իѰaCzddd,`1et:h4Xf �`ذaXnJ%֮]'�Æ \.DZcǐH|wɓ'Cۘ1cbccqF�͛1b|8<�`ƍ8y$Km,m;w6 M4Ajj*z]\^UVPˇ �m> \L 6f?zzoСCY9\, DD6ҥKqil߾7n1bl޼?cbŊ駟$uعs'fΜ bvA@ztRlذ3gĖ-[p=-*HMME1`R=zXDD�VZnH'\+8`>7ΔJ( f1@Dd+'''�@Ϟ=ѭ[7Ii֭W\5kpBT*}js޼yhԨ6o,T1x`Wѷo_DEE1Cȱ.W='�Ap|&L@/*M-=J~u\eN F u6m �ă'ObӦMػw/5jT:>|8 DTTDXI�2WDXy9W^ѩʃ b`0jqY.AD5أ@Pصׂ Ѯ];�@bb"._ """"*{2Qs]�@HHT*'Hh4xg0f;w)))w̙SN�t ( 4j5kPTT &Ժ<)yţ;G?իqe3O?t?yؓtn10 *,,�z�N3}-:w<x�N�0m4�� %%طo]ff �̙3Xzu <s8|0N~#G+WWWxxx`豲cDDD}YP}߾}ؽ{#Mѣ gggx{{so~ܒnk^T#e0УGxyyaҤI!uT#��}x dDEEٳXbΞ= �ғ#fϞ-|r\~l9r$iӦ!&&�0}t`Ϟ=hڴ).\(~fYͱuV\t �K/(~D'|g}T}]رs gc�'ND˖-q5ddd`ɒ%SNKk׮]3gBP7ӧk|<yڵ K.uh~"66zBnje _54M? "7nƍW{mڴĉ͖,P/vڅ/~2dn߾ϣe˖d)i4iF \2?fQpܿo֭ �xeZԩpe˖6l;:2+,, m۶ň#>xqٍ{KII \\\ju ׯǁ}2@DOؾ}�sUrJ'QMR={k׮MLLČ3p kҰE ,~w}&5{I&�~GL>_5BCC?6ZR<͛7װm۶aڵHJJBF/#66VZCaa!w9sW^)S*ܮ"F3gķ~ ш^{ nÖ/i&:o߾X`Uuu̜9?J%f̘QP3uh4 CVWXޖgͱ&Mƍ>ڵ+ϟXLhĒ%Kj*sȑ#^~ǜ;w.vڅɓ'ߟA"ݴZ-nݺe} p\v'""#ooo ={6nݺU… 2e ^}Uddd`ƌxgѬY3�9stRL>{ŋOԩS6m$lق߿_ 2^K,*k֬�t@lذƎ+ͥtM_0}tEUd֬Yزe p=kh׮ V\=C ?!M,XgE`dffFFFF_~%-Z$oUQy[s[5JMM fۥ ''G̙3}̙H\vM kErr2^}U1Ǐ+ DTԯ_LHH@hh#11=\zNx XDDT}Wǜ9s~lذ;v4['33  NqĠ9bbb[o�> -Bl2 {Add$0m4wSn:Ұh"#11t{zSNŬY!CH5 6olۚʣjxb̜9Sھf_ަFx^۶mñcǬ: �(x^zY]^�pi#00-Z(7m~~~ BaMy[s[-DzFhZ,\}o � k> M6E~d ڣGvÙDDD&0c /xDDDH!!!��Jwww�^| Ñ�ݻ7d2:MBL:< t:v܉ɩt޺u  ԩSiÇ۷oIV2mW{i˗/KOyۥYY*/1` .࣏>i5]Q[[l95Jիh4<x^c=z:t7|cְD�͖J]]]aÆ:t(a0pIرxtRA@tt4? &`ԨQXrev ?�xꩧЮ];i8t۷Cכ }Y">СC_^Q*Y%o}2 QQg�ܹ3.^h6-Z\.ѣG9r 0`� o&j5"""vZ9sƪ! e9w֭[={O>tN'''deeaȑv/ k'*}}ؾ};cѢE? \nGXrяV]'''ڵ &LH6m0ydiFM"JX~tĉHHHO>i>0~xlذGA~~>>dffW_߿?RRRoIc뇯={Dz*unnndx"0sL�s8b;ZԩSvZ['R6֤k׮8u4QV^ׯh4BѠuVl)o{?kcǎ?-[0uT_ǎ;`0ӧO;|S^=L6 }Y 00@DDDDTeggcF@@�zQFYu^SN0`�6m bŊ 7z!͔߷o_HYfx1m4nJ'N{g};S| ???<äoذaС+nbjժUhӦ 7n#G`v/o{?k /mڴ̙34^|E;uE߾}qQoYF8 42^Wd .qF KD51z 㵀mժUA\\!DXI1@Ta5gՑdĬچݣS&W��^/MjqRӍ7p]ۻ)((@VVZ ggg�wG:b;Szn݂_m09J>E6(BܹsՓֱFaa!rssۚgͱ222*Bdff-ߪsNij* NNNP(P*P(d_]צR(puukڴ)6mquuz)TY(vJ%5kVeey6%Y?k0wvvF&M|G.ADDDDDDDv  DDDDDDDd 2]0@DDDDDDDvKrrr aԩS0 ܹcu8l:u Cvвejs:999,L[Fdee v{\iyud """"ŋ8t222`0T* �tGdX~=.^�PTWuJ%V\޽{k׮P*GS+''۷oסR`0ТE 6 ...6qNN㑚 R NLƍ#::~j5ZhPV DDDDDTt:l߾AAA7nr9Ν;''jV??? 4n©S???TKnݺ9,}n݂VEXXX 0믿^uxzz"##6l7|XT*877+V;^y@ƍrJeuM8q;wĔ)Sj|t/Y& DDDDDԽ{PXXnݺAVCRCviUCnп�7ҥKuGIOOR6�HJJhرc2mРƎɓVqbb" ƍ'vJ%1`2>} ''o߮u֯_ &5<ؓ[.r9\ƍ[\ƍ8p�rrrеkWDDDH $:u <@Æ 1p@4j�i&k׮�*>|8|}}�B0oyիxn��pΜ97o �?~gϞ`AYu^999HHH˗!ѻwoiN>CAcƨQ~z4iBhh(KWѯ_?4mTڧmHH<\aaaa^I9~0t xyyJ 8y$:w ggg<=='N <<<ԩmcnnnfeU:XQxxxx'Yb ͛iYqq$''#;;߿?ZjASNAtzX+33sŮ]0yd׸ {2R...h߾=y݊�� �IDATV[zî]жm[bCpbܸqUuԩK?z,991OP-_l`hٲ%݋"�@HH6m ooo 2l+)) ѣѤI2vAP`Ȑ!ٳ'� 77/_ѳgO[_W\O?ݻUVطo6l�ARLzެ!nq.o9990 J_*Ue5u}mn?K?SNSO=�~g;wO?4#G*99*+0@DDDDD5ðaЧOoX|9޽[j=]tAϞ=!˥�`@RR:tݻQF1b = �h޼9nܸN�|2BBB �@AA5kVn:p1|wHLLDΝFonХKx{{#<<ׯ_P|G�ܽ{...D&M ԩSzg 1cƠ}*D=Znnݺh4CEpp0,+�ܞnnna^^SUu*==k׮ŧ~,DEEY|:hK~Y(YGA`` @ԯ_GEXXкukT`M0aO5DDDDD\޽-[`ժUxȊ=�@.CV`0�(̺d24m��d2\v u�cݺu0x",>Z177.]zbq5IɊX:/1[lAff& �QFҐkK԰aCi[qF?P<'By=\]]�ejK=.<h:gJ???dddARWڒ_-^-ZZW<3g YYYf{k bϜ=M4 Ro�Pi�JRjT*4mW^˗&Mh4"-- .\(4(ƍCdddun݊;v@Tuv˓VZa„ pssۣXQ~ك8qbVVVgeeaÆfXF'x <S8{,Ξ=[:4O(^pp0t.]`РAӧCi0eذaXr% ,hԨݻgScV&͛foܸa6!aͥ Cpp0 qܽ{AAAJsff&~wDFF"""!=lヱcǢgϞ8z(Axƿ5J%ZjRi.**BJJT*4okv%((m۶ݻ_:hm~d2i8P(pҥRyyyAP@ѠUVO``C�iK.Ŕ)Sz0@DDDDDݻw"5ҐZUQcǎHII]8r ХK Czz:Ҥ.8y$K=ƴl˓'�'9LKKÃlwrr2rrr z=4h`qn{=<֭[@~~>6l�///}Z}}6[v<+U/???ܺu 8<vmuڵ+^/Bddd == 8s RRRj:R^=L6 }Yod """"4 vڅm۶<@g">>~-J%J% fD___.5= �F¡5ʺu놽{b߾}޽;°~ԯ_hٲ%dt CjߧN®]/// 8.^2n=/c˖-O<ԩS'NZz_ 6/;wbprrhw0p@l߾OFlԯ… Xt)ׯѣG/틢"lܸQ <>>>ӧF#o\AвeK9udĈ23&-\Pƍ+-cj=ztZ@j* .."rU *H2bVmC\ӈѩJ+Ah`h^&ztj8{,"##nݺ$h~ =iZ( gC^^^n<5Ļ׎h^RiqKA�F@)V4Gvv64 ?. Q FHHU5lxzzx:hMϯtYzш\ԩSrꈭv܉6m@VCRI\r( rdR=.~WHە|m/B^WWW DDDDD\ݺu>< JUzUdcq=ι#U"l&5q9r͓ejtVU~=LC_TUYGj"Q-gyAvlj.d """""""`A""""""" 7n۷!MۭY+W1%"b۱c"""о}{Nz}a5&DX 2R8q"Zlk׮!##K,A:uIzvڅK֘QiJfQtܿo֭ �xYzq%5"DT{2RP*سgOF| Df0o<h}шE!44hݺ5lق/6m‰'N'|lj'֙4if͚eMXX~Gi{g~ׯGǎdܯ_ &͚5Ê+X Þ DDDDD7^x̞=nK =5klق8ܻwڵkaÆϊ֟3g>#̙3v5jPOy&,X�//JwΜ9Xt)O޽{cx'q)��RSSKM7o_/ӧ[no͹/X�矑VBb_}1g߿6l@ǎ�Z/̙3ѷo_�OX~}AjXp!7|�$m닼<իR-**[�8>âElF͛7A~kG`` ZhG% """"d2f̘@III�W"??=̙3vZhWB`MoDDB@xx8RRRl>VXX`(ԩSuVd{2"""pQt| """`0��O=ڵk'+NXREﻻ;$Z ,K&F :t(>C_b#Ν;ŋ�899!++ #GpoѢk.L02 EEENo- qQGAr94wbbUdz~k}ؾ};?{wEUݝ=H $ ,!e"hF3* 1° j.�7 p,8_df@e N,"j~>mRUIɩs^z%xuI%DDDDDj;wdl6mD׮]#))ŋIQQyyypAU9r$~)Vtgv @ٵkU?ҥKٲe L>'O2bw=qqql۶_X$髌 rrr0MBZhŢG2QADDDDD3g0j(ˆ$!!>}x 4idv"##+@/2 G%$$Ν;uV�iժ͚5gxMF6m޽;5bƌ̙38wLLL SLaѢE^YeWu#&& e^y݄Ru K.9r(<Brr2vl#ϟEy9v � 44M6qqԩsU񆄄׿N>Qر'N'v,**(suyU׾a8w (J2HӨQ#5jTFDDUaÆ x +G\M'Ֆ^BI.dBI.dBIȑ#|w\+:o̝;W(" """""5ڪU'66f͚Ʈ]>ݺuYڼys}z/̦. 6l?aŊԮ]?<_|9%%%�|<dffҨQ#_,+NIoٳ<ӄ�0`_,իW [lĉ�~DGGjkH ոqcl6k׮iL<("""xW+iwAݺuiѢ+V୷bٲedggӶm[?~Aǎ={sϱdZn͛o d„ DEEѼysf͚EϞ=* n'""9sjK#DDDDDj0+Bnn.)))r0uTVXAzz:N⩧e˖$&&[gU哓yHNNԯ_; 6pQRSS :r]t3K.^GVZ�=z;v}vƎK�<y2seĉtޝٳgqFw=^Cjj*'O>ĉ%DDDDDyhܸ1|,]֭[P\\̙32e ;wVXdII3c :uѣ<^u$!!ᚮiԨQ:u*7ow/,,d|�;Oϟ1c~{ō/22kؽ{77&**M%DDDDDz2 'ҭ[7x tիpBVZUURXXH=~bӦM|w$ڶmN0\a^]_E4h~-;A!$TKlݺVZW^.^$RUp<88gŠA/2d}aܹUwU __ \i\лwo0a={dɌ7N7( """""WXXwy'^eݻ*ߴiS|}}2de p/QyKff&k׮SNzu^Æ a۶m ]vqkeʕK/bh~~tWP;wdɒ%ͦMڵ+�~~~$%%xb233)**"//r뫪?#GO?eժU8Nݻh߾=v￿k 0 DZcǘ2e �ǎ^z1c Fɘ1c=z4l6k ''4),,EJ0 """""R9sQFFdd$ c(I8p ÇnIZZZuVU_f<裄йsgn @bb"ZYf<3WuM$A-l 6dz~Jϝ<y2?<{IPPW5̛74h-[xWtI%DDDDDj.]?p{ (GJJ b?v/h+i&?N:u*GMxAjj*/~~~0~xׯ_n/mٳgi֬W5lذ"Ν;Gzt㉒ """""R}5jԈFU`Fiذaï.B2˖-u]8pYfѦM+KߝQADDDDD믿fٲeq#-DjJ2P6Bbb:BhG.dBI.dݔ)SO 0w E䗥$H ַo_>O<}vϟΝ;,w)jժE^=n:֬YS:u?^^{M7u%DDDDDjmo-٫W/ eҥqF?Nxx~@"!J2pj;,X~nh, .$>>/L?$%DDDDDBǏ瞻l{t҅h^usLd„ DFFr뭷2k,ڿ?۷o'99X/^|î3''!C`ۉ`Μ9c~!#"";2{lsN'&L **͛3k,zIFFGL<("""xWn_D#DDDD(8[ 9_ycuui}翖:,z;t)ќ9w6#Fp &� yT7/2 ̜9E]@TDc:пӟ=-ZToWxӧqlN8A@@ؑÇ^d.] ?ǣ=j`fĉtޝٳgqtԩSYb:uz-[X~j*'O>}%DDDDD~A}ݷՃ~a<1*83iB6pSh%KеkWqi&7oNii))&ci <Cwb5?sYŢp9LX/\gx/c+%wƍшQ?F|}ZҨL2͟o裡wޚɓO>.7i|b.gY3g2e:w dwa4i҄(6meQADDDDװu!~w7d@` -6lׁ{Ͻq?g9}=h~[ �>~6kסaƑΞ7mylaX}*YY>K9{⮄{Y)S1 x<˹r_?is 4o^s'.bӦM|]Ϣ{;Ԇp|AYp!VII :EdA^>!:I Q}I Bq1}ϔdT61-c+<}ɾbX ^eʳpJ½.O@|H:]vAP%L0<ɓ7n.A_2d<{sY+XԆ^zѲeK{n㥗^gϞE~k4񣈈\7~;aaa|W?=STTT9EEE,_7xǏ?VZ,Ziܸ1g&GaÆcccYr%/iii޽{we̘1s=4lؐm޷k.Μ9ގחӧOӻwoJJ%( """""5atڕt6l;xG(,,r{G}DII  N:-B>}X|9WO߾}ٿ?SNԩS9sW^yb^w rrr0MBZhb!((0طoǎcʔ)�;v}n^1c#Gd̘1=�l~~~$%%xb233)**"//*HII{epz-$Tcǎ={C1tP֭Ӽ Xh?0k׾O<ٳgYfUҵkW&MĴihҤ M4wa֬Y͛74h-[xW�p'Zhfcذa?0ydyKQQ>N w&Mb >Ndd$iiiL�� �IDATUo>p8^m4'H Tz|n_Zlɷ~Knn.b6/_^ᱻU oԄ =z4ח&MQfÆ q9իq,55^z ????~<LJ_~]~[8{,͚5s#%%drssw8_ܹs;w{sb\DIv.^=D֭+-N"\Iw`ٲe<x0hӦ0 ۿxo """"""חe˖GBB^S!"ՙ """""" 11ğvN05?LQDDDDDDD %DDDDDDDPADDDDDDD %DDDDDDDPADDDDDDD .!""""7ߨ~ ..aZeqӉfazQljL9/&&W """""zII\J2u$\J2u$\J2u$\J2u$\J2`}¸;yOзo_PE~AJ2p۷gӦML2O?ݻ1Ǽz?/Ȧ.j׮M\\qqqz$&&m6Zjy߿~ڽ_~a4ADDDDDܚ4i�`<s,Y֭[o`&ӧO'66zѭ[7=pʕ+ر#v$JJJeLdDEEZn[ol2i۶-?GYoaȐ!v"""3gn�k """""`�ڵkѣGٱc۷ogرtd~mƎ=̙3ڵ+v"22}nvv6v"))lfϞMll,Æ `ԩXtN:SO=E˖-ILL}Ɔ 8z(SSS9y$}'N @7 """""r-;FZZWf :ۻ|rnf�JJJ_ygHOO'<<7x4AAAZ@ϡCO6l̜9)Sйsgwcɒ%D@y?P5ySݻiܸ1QQQ4mT7 """""rrssYz5QQQ$%%zo۶'>>޽jǞ={<mܸ1ua j*�8n}oxSwRR o^s'#DDIJڵc^/.. 88c`` yyykX(**0 N'P*D˖-eBBBwDGG3azɓ7nn%DDDDDFiڴ)[ңG-[p}Uznvv6Att4>}޽{_Q axL y)o뎍eʕK/bh~|"AAA<,]-[9y$#F(uV>l?CGRR/&33".[<۷g׮]| rrr0MBZhN0н{wDUm """""rMF6m޽;5bƌ̙38rL>zGyĽI8p Çn1qdEiժ͚5g)LUuϛ74h-[xWGVV{)ϪE#4)--bJKKq\%DDDDDj>/wHH_)((v øM7|^"yHII!99\v;6CCCٴiǏN:喭 6PTTĹsWǹseܹ^oTBII %%%p8ZSn] j* """""O``juFDD^e_?H|,ݞW X[ߟx{.FAhhoB9iƽ9NΜ9{; EpK(7Cvwp3${-[VZu( """"Rl 6*Byb30Mp`Xʮ ib5M ]`ua�F ׎S'L\.,[ l<nB@q[?MmoO7ohPADDDD:ٸ'o+JW)3r8=ÁSZ P1}hh#,Џ@_sʿ%,r%DDDDDDDjR>u-RZ>ZR|e!LJ�?|!AryG=J2TW^p]Q41Młŋ%LWb}_?՝ ]-jKarB͂ł`B`@s&/晴 """""5B^=rV뗻m0dȐ~N0`ZuNp`leOoUw|kJ2ܨ4|ZŠ `Z,8-4r𧤤ģRDDDDZjҬY3صkO<A߾}8֭[ǚ5kk߾}K_qw&7䷡Y2 \[ipAJL(q8M4=HaÆq VXAڵezsA~_$믳}v222xi׮Z>_?.eA Ru( """"RC}={~� Q_~W^=odk&..8nVٶmۯ:K\..  NͲ,K0X�.J"""""5Tƍl]2Ǐ瞻l{$$$ФIf͚#5wtL:սm&m۶O>?~Aǎ={[oŲeΦm۶<j&ӧO'66zѭ[7˽͛7ӥKyׯ4ip%Kкuk|+gʕtNRR{i2ydK(+aȐ!v"""3g~.|mV𵂏ՅV-' """""5TXXW^!77W%�=JAAW_}Ŷmx^`ݺu4lؐ{{9skp!\.G{!//؎9B.]ҥKyxGU> 6lѣZnɼی;{3gҵkWvEddlܸ#Fp &N#<BDDW`�ڵksǗ[ٞwƎK*端aÆsٵkIIIdgg3{lbcc6l�SNeŊs)z)ZlIbbOl6OTN<g}Ɖ'/R5bX̲ JM&Pj8v5F2( """"R{4nܘd>S.]J֭+=+VP^=f͚vZ>kkԨQ:u*7o'22p~G*/ g ==px eO<ɦMh޼9~z\a|ǎ#--իWyfJ Y|97U<sXjߟC'0l09s&&OsX$ǒ%K܉�oٽ>P)eu_H\\ݻiܸ1QQQ4mT@Ռq>4RM)&;Brd"""""508q"ׯrѥKJiժ 00pY"99qPTT$??x>J\\{({wӼys�|||lYKzj䭷8޶m[+q~Pƍ1M]… ѣ=z믿Õ%}VYIII/wu7n/P5迸 .0qaq\d%T5ADDDDDg֭jՊa?\ 4/!CЧOΝ{Eu?004ծ];V^}]9}tZ,0 ÝիmZz!ĝ[lqݽ{&:: &гgO&ONI`1a1𵀏Vk}) """"" ;d߾}bнyJݻL֮]KN(--a6hڴ)[ңG-[p},nݺUznvv6Att4>}޽{WҺ+ʕ+y饗HKK_b 0ʒ 6phMhXPďDDDDDj;wd_ٳٴi]vűm6b *-a۷cǎ1el ڷoϮ]+gҥlٲ|Oɓ'1b +g֭7V^СC#))ŋIQQyyyRQ̛3224M iѢ;BIV-N&V_QUI9̙350"##IHHO>}{ &&&)ShѢJGDD0rHƌC-l 6dz~z�iժ͚5g)iӦѦMwNF1cs!..oo㉎fԫW<#%�&M>|8vH,+MUUy󈉉AlٲW^y}l߾}deej[~} ,֋ >ĂRh𵁏,%,EDDDD.]?p{ (3J/ҕ?4ر'N'#KMMM套^�ƏO eӦM?~:u[GHH_)((v è]1Q>t̛n>D8Bʫ.ݎf u'''{y6lsι'`ܹsgT-N맑 >}|',.W#d5jDF~vtK'3`4Q@~iSUl6"""}o݉^ X/|OkQ >V;\q/5$Hu+n4y~P7LibX, ;}uJ~n0�Mn0$Å LΏb0*;$HMqcG~u4Y=v]Uyz/_ ,V6 O_kYKKHL�\rj8]lN ,`ס$Huұ#~%.z]¨źibq/YՃ:fkNnPYN(9`(=?i """""\eҜeKXl`VYtt80l*ϰPde[LE,PjRͲ9J """""""R>B5R'8F46 (;v)%DDDDDDDW$(U6, o7|N-%N'͆Ջ%mu 9/&&S40/̿0(. ~u$DI!J20)f�>Zע$jXp_ąbc@ 0]ɉ) """""""X`:,ajZ\ 0\`1˖]EDDDDDDj6ł"L La8,qD1+EDDDDDDj6FD}wGi)NL|Ӥ N˧yxԣ$H Cva|)NsD>əB?ps=z=ќ """""""5f#^'.=cpbf~9:|Gt0<QWlaĀ#(q吱lց"6brl&#$M6%00У%DDDDDDDJhh(O=GV'-g9wv?61 -"o"""ur<PA*))alܸΝ;ӬYfʔ)SHHH[nT旎JԩSc؂ ())aȐ!^wA]uL{5qx$ l6ԩCVր|V`֭Kpp0XVQڿ?}СCSDDDjSNQV-z9gΝTo߾s);wߟk.obJNNz",,N:M:uڵ̺uXf{5TUSb@ݺuiذ!4iNhh(X,dؑ:EDD[t)lܸǏжϞ=ˤI~rQ:t@nn.YYY>}˗G}$�p}ɭoQFWp .$>>4̼m2o<u2m4JJJ?Znaӭ[7^}U8"PA턅b&/EDDDj}veŗ1M &ɭʬYLy{1BCC=zt_b&ӧO'66zѭ[˒8yd4Qt:`r-Wԧ{ʕ+ر#v$JJJ>CGDD;vd^SO3x?A9sn|QAD___jժEii)VMsd-"**xΝ;ٻwGd?~<+V`׮]|wW\<u%%%۷`r$''ʓO>nk׮:tڟ:u*+V ==3f0c VZUnG:\qz/޽{IKK#))~NFFG ]taݺu$&& /?zCvH(̛7p֭_drh"a1~2|pbbbxwiР{7e*3`�^&L@^^DZcҮ];7bfΜܹ3}fɒ%Ɣ{APPVr}'5#Fмys(..f^ѧO `>Zp!ԍ/J2yf>LϞ=9{,u],^p~Ξ=K۶m/;$pޔ̙3cԩ<H~~>}V8uYp!=zG|>|xBCC8}eVZń =ϛx/hܸ1m۲qFLt"99qPTTU֭[xEfN'tFcEDDDDj Pn"!!�*Ǜ2UxgIMM;p/.. 88أ|``{ԃ7;N�zE˖-CBB-p٫#�;v`$''_v̛x+bX(**0 \. /dȐ!Ӈs^Q0}CFFW7l4ADDDD***b?~9|0jro',,A⿨{SƍaÆL8ѽiӦX,nQv˖-4kڵkѵkWfϞM~~M&::0ػw/3{waaa]VJ """""裏())aԩS[ӧ˗/0ڵ+lذ;v#PXX~›2 --cǎy<?,]-[9y$#F}???Xx1Wҙ_ř3gxRSO�� �IDAT8pG"{֭[s0^?C1 }q1L7Uf͢uƺн{w(Ed -Z~ڵk_v'ٳYcRZZJϞ=y衇:t(uo2ѣ{7m4ڴiCiԨ3f`Μ9]Q&MrOiۉ$--XڴiNQQ-[nܹs=/MPөWyG6l�91cТE l6Æ c_߿?eGVVëmo3fp 8>ÇGDٳgӷo*͛IOOgРAy}12tߜy[v2xއzAw\.\.it:1MÁ餤Rox]KX,Tjpiv{ ow8b۽^ܹs߿oFU<1`:bxG, ?~r�~woV/7YYY$&&rС 矐ᣏ>"&&???|||u/YoXZX, ø~ܱcrλZ8QDDDDDrW Xj۷lDDD\Q۵k.wVZ@ل7tSɎKazCZZ= rCu jܹs�:Cndj׮ҥKrh$\J2u$\J2�ݻGb,Xs窓1e>SuJ2xG 44{w͛BNe֭[ǚ5k~׷o_9u;wOaa5?|vyU6o ?={ *)Z]BDDDD;z(۷'<<͛7Kqq17ofݺu:Ϟ=ˤIxw~Uq-_B۷o_$33FeC( """"RM6֮]-?ݺu[n:}}}7oC m۶Zlpp�nvuso^N'<cCU6oL.]_8ү_?"""ر#g8>~x{Jp:L0(7oάYٳ'2i2ydW_2{PF*iL>XիGnξ̄ [oe֬YsU橧gsw\;bIJJgIDIpi߾W[yǠA8q"K.[D^x~GGnݺJ<y2sgʕ߿7rIwSb ә1c3f`ժU^n]RRRؾ}; ,(Lrr2<|vvʡC<ʤ3~xVX]<깚*Ӯ];222#�͛Gxx8uѣ]4ׯ """""!'' xUɓ#F`ر~zQF1b7oNRR{no(**wcԨQvm̘1 G3sLNΝӧw}7K,2p2a<{g}vڑ/oPo>|8111-0X|; 2p@w VZEIMMO>bdBCC8}Wn7oCشiEEE^qA HHHm0eYp/n{u 3gΤCL:{̽B}V88{ls:5`^Q|[.<�-bȐ!Y~;wƍn۶-iiiy}&$T)** or\ 4/!CЧOΝ{EuԪU ("N^zѲeKڸxgIMM;p/.. 88أ|``{CAA�aaaת XW_E @߾}!##WO" ø>QADDDDDDnxxgiĽ{ڵkԩW\GÆ a۶m ]vyE/OwWqdĉ}M6buVz޿e>lՇ0+tNN\<Z'}GXXok׮_TZ>;;h ø.}&- """"R%''s9zݻq\8KƌsE 0طoǎcʔ)�;vի3f`ȑ3ѣGVQ???Xx1w*  --# q.]ʖ-[g<y#F�eDtڕt6l;xG(,,tp=+5k[&66֭[s0^?CzSJJ ݻww֨j[" ""73\V<tMڴiSO=Epмys_N =aÆ1~xnVvU='Ofi&nv} r4i >#Gb&̟?x{A޽Yb{ߴix޽;1geƎK>}ٳ'aaa̚5={dpW\Xߨg*=䥢>}:'??'|aÆyg#++ նHE3f|#"ٳ۷oo\ocMJOOgРAߒ/A`my>!憆rp\4MNJKK)..o'M6(P~i۶mtvH론ӧOc=ͥ~X, 7`:p{x9N6 +HLLT+<p .[3u裏|}}Zl6, Vła;v ]y~q]VA``yCw~audddqFu8!!!y\Ů4l2<]wŁ5kmڴ{ャf#""C``J fe_ZZ=!!!8|74&1uԩo " ___k-[ y\T?̙a�aDddwDMAQA1%&q 46Imni/mҤYjXIJ$&, eM#( 0",|<|9s>F?~㌂F�<cݎM>]z;  qqqcCtV�鱧z D.ADDDDDDDA""""""" 2Ѡ DDDDDDvrssqUL<f DDDDDw"** &jkk ooo<CwD=j5i޽{jf�(ؾ};ϟYfAP7R0~xoPӵA""""" u 2r={׮]ٳo:/www,_hhh@^^RSSp�@`` tNUU&*++ m%K}>S<ZG 2]FV j$yv %ȠR*mO6 ~!=jL<Z( `}#T*<<<;;;ݻ.]k DDDDDt DNNjMM nܸKiEQDVVrssԄq!::nnn� .ΩA\3gb޼yf˕Bz$''K, x뭷ȑ#tXt)򐑑Nd899!00۾Ezu9c:-X$]˘'222pcǎテ 7iy'NѣG؈3gaVxdmԗQFɬ:Q|rDDD&MMʻtR8k,DFFs%rg􋋋}m}FF233;wDCC�}5''P(ꫯPTTUVaҥ4Y+ xyy 1111cEe'''j�4 �<y2A@LL Νkv>hp9dggcܹ 4iBCCq=Qot:N8[[[xxxH*KZZN:H](++CKKIygi_UGbF'MMMRaҤI&iz=0uTDDD ǏimmsΜ9iӦA /BBB퍂erpp=퍱cZTRhnn6̘1}Ka͚52e -> 9s&Ν \ۨ'׿HLLL&SNٳ䄥K8M:%())Z[[燳gJij%d•+W��666GAAPZZ BǣZ7Z2׍7=3IAZMҹI)t= 8S�r9T*z}˩T*+WYlxک?}5Xu$hȄFAHHrӉAB@kk=e|jŔ)S ɤG(brmKYZKd_eT6,>  =c̘1X`&LĉסK[W  !!!ؿ?ov*PYYK+**L��N�ptt hii =XO,BP`ԩnn!�_ џo0i$:t>>>5jT}V쌪*i=zНk2dExRiӦ̙3VEff&1sLt8z(\]]uoOǙ3gֆjiK`N؈r:t݀m "qnTM??^�"�Ñ3hچK9&>=C}CPB^CPbi+8hm"L\ьаg2k׮R*::]P(P(g�<y2 Xp! \QիW^pp0rrrobXle誢:d2쌍7՗ "D! }jo>>|rd0`=cu ~�*QXh۷r0uT̝:>|[q8;;cyJl߾2A):Wc_-[qn=>i+_+٫*&&&bϞ=شi[>񳀈عs'6n܈;v )) 2d$�"-뻝9ظHZ9oiqEQ(0 0 thooVE[[ ;Zբ_6 h4nk?kkkWjl`v+�yߏ?YzsE爖PMUUv؁ 6gHAz駟bĉPTP* P(r2[ ɓsAN4L"""""7R R9r9,Noq-Pe <K Ah{A 4{ɓ' _Rg%=O Fzݦ7͛dž! 2Q7o """"""A  hPpM""!cǎŜ9sxݡ ??Ϋr>777z3f` 㑇A""!RWW*6 k)))(--5٧T*ׁdػw/Z-֬YcuKKK+W@CP )) ƍ8C޶@}3}cHNN7z!+jkK{d ""T*Ǝ{WԵmmmt˗/e2Y `Ϟ=k׮afkZ۷X~=r9`ee5ڭkZQQQ Caa]~*o6֭[gcǎʕ+۷7F JWW?ydgϢ իWڊٳgCR�N:ڭkZFUU4 jIVPJIIѣGi&,ZA"""""󈢈4AP <<[#G@aҥFaa!z=%K=z4r9{`oo Hضmoh4 %K I<==PCE#77(b̙7o^zC.#""4iOޭs{4 1pssV'NѣG؈3f`֬Y=~9sF Hu^[݌e ±cǠh0g?GQQܰd8::Je(,,챭-n׾hllDzz:Ν;\#,, r)GFD¼9f۾=uË/bfFNׯK۶`,##OƢEǏCјhj�AAA(++ױdv Lth4DEEI3 ɾndoExx8qI ,,L*ۥKp%̝;� EEEXjZZZ~ ((�SNa?~<N<2�Gz*;;DdzObΝx se#,, ---8r`6Р |||PPP OKit:9 b nRQ]] . 22/^ġCPZZ Z|gFTT˗Ԅ0TWWĉpttڒ^t /^Dxx8<<<鐑F_P*tP(:W^1}FhCLڴs?h4TWWb/~ cÆ fd """ػwO"$$dؗغu+;߿Jt믿.m]0 Fhh48{j~ XfM}4R*xT*1e\v ϟ7Lt:YFDZxbX̲�AAAt8qBCCYK.EIIIBhhhǺ +㈉677#)) NNN0 @EEE( ( L:| Z[[aggRٳR^'Ob��9sŘ8qL&úu0j(xzzpwwŋ�.\KB 6l�RP\~] Xz]e capvvL&`0  :@YYBCCoz=RSSq1lڴIHa( ]�)++  /c'O_GJJ {<�izcc#Z[[M{Ν;n:xzz+ѣGCTJʂ(nnn&چhZKo֨60Tu9^^^>L///\r$6i* &Lq9xxx@" �ϟyI\�� �IDAT444`0I݌ �wwwRJLfrɿWʂ\.֐3gtDEE$`l/c{ b$GLyd "":?<mڴ`r ֬Y{キtoҸ#H&<nd~?S===c֭8}t zHpqqƷ\}㠷2 Z[[T*ƏbiW1\w„ xq{X`ٵ?HJJ= DDDts4 z=ƌkZ ~ 5Ġϴ>>> 2Eakkj^/,t[nnnz�sUUU%艣#A@KK &LZ3cŖ3f d2*++1פuCHHߏ:ns[u]\\"-- Ǐ$Q֑`ĉؼyH 0'xZ?8ZZZxnyP(#qqqoQ]]X{=z4z-l޼(⩧s=M6aϞ=�>OFqq1�`Ϟ=8un݊I&t}ʰsaƱ=>Ltq/|}}qiARرc&sݑ&u;^SS:L0 3gvjjjnZ8<qY\x .| <<N'Q__/=LܸqJP*fg|�k�L6 gΜ\]whnn̙3 9,@7sݜAVCIk3 UY3?Gtt{A""adӦMزe o>ٳ+WD||<>#!::> mۆ4|7ʂ/BBB駟ǫ{ _plٲ~t{E~~>L}YǏǿa;v@RRo6"3.t!cx`kk+Vt[c`7ӱl2---8x >ڢ SL1y)SPRR-[`رHHH֭[4233v̘1â.\}A.CEc�EA.… pvvʕ+}vƁk.(qqq-JڵkT*{Uꫭz\<xVVVptt=s4vGbb! 2р;w.fϞmSGfϞ-M={6{xWyܞDDDH+y;v7Q֬Yqgggl޼d6Iuicc$455]w< ܌ѣGw[6m7As=gfŊdP*hnnB&BO\A{jd\.ǢE*LJ½ hqjG@.Y_#on]`gg׭mO[FthkkèQL驽Ymjcc5kH3Qu8z lq5󺺺'J~~~XriKn^7XϢѣGcѽ[ǁ.N)mQQz<y(J(^ Dz 5sY 2my%[9cN%jjjPXXBooo9hrsshqR 2jjj�t,f|Lb.ED4!(( 1EDDn#n+�}z܋J/�OK=<<pY9s/cuuu�~FZPP|:u f˭QXX�҂ dB4�6Cr�N6ѭ{ᗿD479^%''ŋ&y3WF@@�Ocƍpqqg}///��ٳx衇��_5^~ew}f˽sNlذ �z<#O٩DDtFb$@DDt _ׯ7{g=w\@CW8x JKK1vX8::KP\\`d2lܸ}偁Xz5r9\\\zVRRKFdA""" ?|3 `ҤIv�+nڻヒv<l ! w X]]7(yb�~>hH^u3u%%!!AzI&xGqZ_|fr 2 6TUU J^󃟟�`Xlߘ7D}}=bݺu_WCr̓d"d """cǎ<W^="��܏G^vcw{{{̘1Cްa~@BB<<<ٳgd 0@DD4D̙F~ q;qT*K6mv܉0 xk. <-wB",, -+k DDDDwE@d/g;@1uܶAA^??ػw/v؁WGɓg"-- xWDC 0"r9A"""a(2q `:qwwGmm-oǢE�tM"%%l�puu1o<!haܹ(++Í7 �;wǵ~ %d """"ArUTTT 00z�|rL<YJ3zh~9DCcy7`mmD888 & 2 :v`d """"˵:=>#kq�?o6"""j*ܹs 떟J3Y 5557nE U m@hL&u9RtEBiA!pQ1@DDDDDNVV ɓ'رc9sZ-6mڄqqqصk<J Dbb"|~_h0D bD?j^;-0< ��R d """"[cϞ=ST_?O]}wttDzz:._ !jrYLK,A d1<pco9d]-eo,Y>P(3h]]]oDA.�(B A.cI?&Nr dQ 0 [k2@.A>_U9ۏM@DDDDDDDA"""""""|\nQDCm�ir>00@DDDD4BhE@}drzt:( ���h\.07_ &N8, D^1A"V"3tg&Ýd.&Z]u |TbxbnHT�)J {h9 gav-nhhEt۝ 0|qM""""""d�:z^:�� @Pt"~.p& zƨAz g0  2Ѡ w}d/dC!(Atz(2r,0Pl9"""ᦩm@Dwpah8|\hѶ~a+==4!77z3fq, 0r(÷.48hz c---xkP|N3RRR׿&kjj /Ho*Ο?s/?Xmm-^xڵ5>o]A""""?@gΜ`@YYnuϞ=Aɫiiiæ<JQQQ}G~---#|\v=?n_.gm+u5T ]91{$e兊 9s,P__ٳgt^ ''3f̀m/ϭVQUUFZmdM_JJ =M6aѢE 2�}(={w6a}8)=wyrUTUU!11F~~~ (HKKC^^ %i:Faa!z=%K@Edee!77MMM7n L:%%%8|06nh6(HOOGnn.DQ̙31o޼sux{{c֬Y�:/rJ�kH~t:xzz"##fɓ(--EBB'00999(..#555qBBBP__oRfI8p�X`tζm~;/"<͛7ۛA"""" A:f2h<:X80y9SbPPP1c SL_~:;VJӧOcѢEǡhL$2\~K,Ovv6͛'sN<cppp1?DEEa߾}ŴiӺꫯPTTUV ̖(.. ŨEYYd-.FKp%̝;YVV#G`ݺu=�@Ra&ABCPt럾fI644@E}hkk뱜;u_dž  :f-d4 0<qpeѐԩS�&M‘#Gŋ� 0�@ll,Ο?/aI`ooV+}c둕PDDD��/㈉.SNE^^= &8~8/^ _ߎߧ\ ((lyq hZ(J;wAAA(//Gdd$\f:k֬QաXt)<==쿉'O>ASSPXX={֤}m }hڝznT;v 6m~d """ n,ۂŋЀ@BTҠ>`IK444@K'+WXDzeːt ƼQZZ* {[2 .\ѣ�ؽ{7 JKK�ApUf6ֆݻwcҤI>}E \.GII <<< ??? %:X}h hZt:\z---͕lllkF zLBL6, #3A"""}2 4�۷o7^۔mKX:BVprrBdd$233GJEگRzKT eeeC@@�<==a0P]]1(q[UU^\~#!!!nC�N�BB\Aggg( kߊ�VEQ{d2bcc{{{&8t<"� !NB,]SL13lmmQ]]-MwҠEi ,�1c PYYK+**L2o< ۣ=xd�666 F~~>jjj0heªUc00'$$G]]lL&3WTTHu~B!# t:&L n'^R L&E]6͛7KH"G+09 x&ɶ!UZZ ^SZcgg'H((//Guu5RRRLhjj1s`ڴi8s ***jf̜9) ,[ ׯ_ p̙3thkkCuuu1jkkM߾8uamm=e<J>|آs 7XZ6KUUUvq!)8% 4;F^PPn R,KEQa!ɠT* 7O?4� DDDDOd-֧M={&L{n{Ŋ+3`I7|ӧODze`׮]Ҕ8oa1aK.\}A.CEc=pss0 . !!|0gΜ^ӫT*]VvKfIN2%%%زe ƎlݺU `v?p�:d3s\.GWg X2kd#11Z 2Ѱwx =͛7C2 &X+$%%IRpBբŢ׬YcvBBɶ =FZm24W�xꩧLqww7i΃n h>u1&KfI:::bӦMq4 ~g2[]zkwV Q"ڤy -h0T*!ˡja0`0(Rv;sA"""""%5ή>Ri q r9Uʲ,KfIF2LљL&t'sz&1@DDDdN"''@鰶ƛoL {^/:0 BZ@BAOn&3$+d """.Q(PWW�_믿F||< DDCd0ލA\.G{{; >cGE:$`0͖%莕h>""yc F>[~CI iIn DDDtNJ珯tuu 7@XrqPE?Uƅ#u:Z-Z+8A"""n xjhh@yy9��uuu(//GCCC.�\-:AS]cDDw(㢒1`|\AECJ㢎'tGW: 2�֭~կ~k^{ ~~~xg��< kG_~vg:qSN^v ǎCjj*JJJà/r9P(ABJ^AٙL&ɟ9T*T*dee… R^*JJSfc m„ ~͓O>i2ܙuϓ@dc6VRRRPZZ*mj8::",, !!!syhZ̘1㖕]El߾ǬY�1%%/^?[[[iMM mۆw~ ߾4CQQQ1xp$''=PBnn.gqdNktmv'뽞`->5!QN=A߭ PX?qww܌!55k={׮]ٳGUU6HKKÊ+nkjEEE&A�(,,/~m[666 2 _>}?<b? OeT*\]]iӦ?ѣGZ=$ADBP  ''3f̀mk[IV ~),,NGbӦMXh DDDDÕ'{z ?>DQDzz:rss!"fΜyGo鳳QXX^dbɒ%F^^222鐜 '''?ő#G鉌 "<<("++ hjj¸qm0cǎA`Μ9 "aɒ%pttSNEII >7J\~ޘ5k�K\R }o׶ɓ(--EBB"''R`7n@HHMWDQDZZP(̖ǂ smۆoN0�� �IDAT(݇:8x 6o oo'''jm+_}j*,]&k9t[ xyy 111/&O As�4 Ν;l̝;� dff"44ׯ=viFiii _?(E]]]" ** UUUQ(../..Fmm-ʤ}9997n\k:+++Ñ#G` @lǛfXR >}<h4|E[[ۀ$''/hnnQ@DDDwgG~=NAVzǏŋ cu;V5j5ƌ\^N5k`ԨQRYYY /Ǐ#&&Ƥ?FWWW8q...Xx1�ŋlS"//G@'NVRĹsrDFFʕ+hnnO۵:Gjj*.] OO><qD|'hjj gϚԽ dgg#44aaa�X?c^Gjj*;M6I DDDD6V\0hݸqhhhVE~~o}}}7@鉛ɠ٘O& W\19wܸqҹJRK3  EXliӦT]!p=�ݻw`0W^]ʨ wƤI0}t\xxx~~~&AK^Vc:>r)G'u҂F899I@HiT*s~gtB!kC'''DFF"33dáUT eeeC@@�<==a0P]]i-L&B@UU{}TsLh4@./t:�t0 =6d2bcc{{{hoP(0uT@toE3cƌL&Cee%Ə/0 CAAn}ADDA7QSSAVZ;v 559!!!ؿ??pvv-z|<j&y }9L87ot$DDDDDw9Nׯ8t233;;;p̙3thkkCuu,Ij455Y|@)JL6 gΜAEEZ-233܌3gi* ,[ ׯ_1jkkM߾8uamm=<J>|آs 7#XZ6___>}娮FJJI@�<<<PUUk׮lCy <6" �g2***C&ظq3 .`} !"zjy>88999x71}t,[h8p�vBB@\\<<<}Ǐ &ya [[[IE`0t[p₄|ppp9szMRvZ(Jd{n{Ŋ+'1e`˖-;v,u^7͊Gbb52F٫*&&&bϞ=شi?aPHHH3? n33w~I4g-(Ez:NZMբ e0hV->W&X[[氿Va@g$׷eh41`t,P߁Pcӧ~sxjϗز!"CP@.CrdnmzIHABsAN4L"""\v V1zht:s=h4d~6,zelݺ}ΣaO.a5CTJ�FB{k\͒@{n Q9D�7|�sj*⭷޺<y$^u<""#1ʰrJTUUW^ �Go x 8;;㈈ 1{1477+Vv|ܸqӟd˗/kh4\v3{l3$BDD4q """#444>бzO1?裸qㆴ]\\ 6`̘1=z4gj$'''V?�8޽[Z|d """A {{A.�ڊ˗vvvxqlڴ [lA^^ۇ={`ʕG}4DGG DDDD#իW E礤 �;F}}=aee�;w.fϞvJ!""bh8qs~~>DQ׿p)�Mcc#֯_/*Az=�1@DDD4L?FAyy9��7oFDDf͚cVŽ;�ގ;wJ+qCc@ۉA.㥗^s�@nnd��g�@PP� 'N@dd$�@B&Y,|F DDDt~|�ꫯBJZZZOHH~3\r@�gK1GKL_p(hDcX2 >VXgy111]vATbŊظq#�16l؀SNaʔ)0a}a۶mR -- | :$]/99+VwsN|hhh��GA||<bccٙDD pn:[555((( ?OOn.̞=EEE())-|||c<ys /횽cNRRÈA"""nܸq7n\r9BBBnzH5hP0@DDDDDDDA""""""" 2Ѡ`*(**B{{MjQTTJ 6.d """"%$$jcyyyO~;3ϟcիWͶ50c ׊+  ((G… 3n8lذG?acc�,Y}oVbF{vۗzԯhmmEAAꐙ"̛7&g͚t</�ĬYPUUoH<8u{>L߿ֆu_Ė-[xc o6ZZZd """"'ODeee QW^yz�`ؿ?.^m۶W͛/BE|�^z 0uTd2iǟgWG\xٽ3f@TT~?ҥK?UUUOxs )))xq1hZ|9KrssQ[[h| x ""&ǟ}Y<Soxbk???᭷²e;Hi ?>>>}v_&bŊnA�:z֯_q]\\JK/V;wنߑaaamQWWW_|opEhQՈ6yd"55qqq6I[QQŋ/@\\y\~]:^YY/O<x$%%޽GUU'z�yW%K,kLQVzq|$e⭐x^o]:`S.-#DRSc4&K[%):`" ~?g9<G~:9޿ߗ'Xl6n܈ `Ν(,,D^^ʌeVXdee!##mpQSS!C4q)\�CEQQUvnf�bbbcǎ5Y&L@BBٳgUz|7;w.֯__o(C"""""jo>/�m۶aʔ)KKKܹst8ݻg2{;w.^xL&޽ۯ2<3f -- GFFz]�k׮Ejj*x$''#!![nmp<Gn|{PUg(BII 2331f^O>$㍿.ïz1atؽ{7$IjwԣG6YzBnСC1~wzl̞=yn_?& ;v@||<.^QFᣏ>_~/? xKHH@LL �d2!$$"+ԩSƈ#Wc*l޼pĉFҥ �ŋ EL&tx̙3صkztL0�йsg�@yy_j0l08pQ/-QVV3tÆ@n!]7C&0i$ȲosAu={6qf2BCC�f.=;t} (,,l'N;b1^:t(vUoYϤGk郥KbС4i~aL<QTT~{wGח 0aRRR HNNƜ9sp1dee{�[l'|#G6:4UFϞ=#11{ .DGGl6&Mjr6 'NĦMh"F_|>}Q?88F1|qaʔ)HOOoL鯵kjb֬Y~} ;]?HKKCtttv@DDDDD�C&$Iil` Ǐ˗/_ <Xp!}Yl6gbAzz:}]lٲv8tP]|9Ξ=�R7A߾}~K/J;~-t](8p�.\֬Y]3\|Á!//Xf V\]U8|1F ;:v숅 _nC"""""2aΝغu_= 2̙%KLx%l2,X�x7*r.]Yf!55ի233]oLL CnЧOvm(,,Ν;jѐ8ٳFxx8nջp^ؼys۷{ߎz %%%ÓO>w&%%aРAׯ͛'"++ cƌ1i }֬YضmRSSݤ6l? y+<d<quݺCuhUUiE1&zs\p88z1`kPQQb4KJJ|&M tȑ#E3gYoƜ;w'O+ȑ#c„ W8y$۬z}gϞEǎeQ׿q^AeI "Ad<x6XN$Ȳ\wY$AQ @DDDDDR1ݒFƩS0|p8q֭C\\zȲf;<<�CDkdddk1xV=Խmg ;+a@DDDDDlƑ#G ł#F`׬ O� UIJJBRR+ ďDDDDDDD ( 2Q@0d """""j\. P\\ MX!&1d """"j&O Պz}Z5jTǘXFƍ�<c<yu߾"?;wߏt#GlǔjfCtt4ƌ۷C"""""jrrr꽖}Sۑ|Y�eW^y�'^m+..F||<Μ9{p:2d󑛛ŋp`?j7ooaIDDDDEFF(..FϞ=}B64;w�pw ::gS^m[jN'>t�#mIhh(l>sL<#Xt)&Oqk.gin݊ݻw#55<@d """"ja6>|=zϲ;vԩS{6lyɒ%xw^<f*^|E111XnƍM6he˖wވʕ+<^ݻwcĈӧ֭[EQz+&M'OhTUŦM0c #`hiXz5NDDD`ԨQ8t2O=VX!C>O[n]we8}4fϞHDEE_h][,Z . oV'dggСC2d,Xױ֕=y>}!=aaa=zϐl$%%j,[TT|~)h"\tx~)͛S"%%O?]Ʋe˰qF,X�;wDaa!PVVf,b ++ @nnUCqqOî߰tR̟??0-Z)S@u_> lWQQܶ^z k֬O<?կ~Xę3g|>ߣg>c+x(֬Y2-[pwcbbcǎ5yL0 Fff&fϞױso0w\_ mINNƾ}/��mۆ)S[.-- sELL p8w^e{aܹx`2{nʰx0c @=:�p`ڵFd$$$`֭Ӊ$''c޼yPwq֮]D;{ivy=z4 1c ̟?CEVVf3^~fSMM oߎiӦCF[t{=܃u=PZZqЫW/t :t#wPU٘={6>6ݜ0~xL&رx"F>޲_~% F0-!!111��Ʉ8N8u1bĈzX 7o6~ĉk2ĠA� �!$6 h:w �(//6xR$ 6 }iȐ!y-==)))8vϘ u]VV3m=l!jC&0i$ȲosAu={6qf2BCC�f.=:tlW޽�Gb�zPPP1i$DGG_ĸql2,^8u}y_~-:q% `„ HII1]0d """"6#99scǐUlٲ| F u4UFϞ=#11{ .DGGl6&Mj5 ƨQ~z̟?aaa .׷o_ cǎ5^ǘ1cEQbsyعs' xZk׮jŬY:A ~ "66iiipN"""""2!I4M}`X?~%%%X|9�uSFbb"222Oc…xgaٌxwevTTTԻ֒z饗PYYcoP… :9s&}磪 WFYYΝk5l0߿?t}ӦM8}44MCMM  �Q[\%%%(**B^^ӱf\]cCZ�� �IDATv8ÇyBqv;v… /ɀ!°sNlݺXe4 �Y1g,Ygb+e˖a(((nǛo UUltR̚5 D^y밹={@4}-܂4;{Z qqqx衇p뭷"##: f,3m4 66˗/;v[E=޷ozoO=JJJ'| ))  B~0o޼ĉ1cEBFF>k,l۶ <ݤ6l؀ɓ'7DD޼ kRFn]ס:4M4 \.8=z&Lh5uVQQb4KJJн{kV1rH7EQpDFF֛CFjvUTTɓ۷osTWW6Dϝ;WobGvTVV]bq={;v4 w_X8rm L{ 2DQ$IE ;~<f,'IdYܻ,I( d """"f�nIJedggԩS>|8N8u!..rdYFTTTlW0x+.d1- �juϱԭ[t }V&fGAvv6, Fŋ.DC"""""jUĊ j8#C"""""""  DDDDDDD nRo66nȊ!Q;6ydXVddd{ojŨQ>gl1nܸOG5#11V6 3f o ɩZvvMo۷oG~~>f�-[^y�7~W_} |bp8>}:2337@MMM^y K""""v.22Dqq1z2DFF8pܹs�;o]v< gΜGyK.ɓ:F]׍uV޽xʞ DDDDD\bb"f3>ÇGYvǎ:u*p=`Æ >/Y=݋|Ь2TUŋ/޽{#&&֭øqi&cMӰl2QQQXrUCSezm1buAQŭފI&ɓ>sNs=Dzz:NzW^;5j:ືn݊}T]6?ߟ?SOaŊ>8d|g�?OơC0d,XmX,Xj\.z&롱u  ѣ}Ldgg#)) Vg٢"<OEҥKO1o<L:)))~~2-[7bعs' 2c+V ''YYY@FFrss*߰tR̟??0-Z)S@u_x}>' 33:u*|^z k֬O<?կ~ѧ? ^xc겹٧gΜ)GEE�`„ HHH@tt42331{fmgLL "##qر&롱uoܹs~zTWW3d """"%99/�ضmLRo4̝;111HOO޽{})++{gs^dݻ*n^Ì3###=z��Ákʓ[x-t"''ɘ7oEw܁k"11cǎŞ={|>\L6 k֬1c;NČ30| :YYY0x}ʩ1m4c?Gs55Oիu:`ĈmvMCcuH";;gf%0~xL&رx"F K|矍`[BBbbb��& !!!>]TƩSP]]#F[ 2UUUؼyĉW5e4� �Rb٠gn6cY=aff&4M3{KaÆ)gȐ!o\|W'Q>.++CBBUCZ u!jC&0i$ȲosAu={6qf2BCC�f.=:t\l(�LPP1uy=ypy_~-Tw&L@JJ!ɘ3g;z`˖-O0rH\f2zX߿�ܓP^pX&::f4iR@Z٘C!:: o߾E_}Ǝk,1c\U]^O o0AZkjb֬Y~CukHll,P8'p$ ~pp0AQRR˗�JJJ^?e$&&"##O?4.\g}6YaXw}[lnGEEE;24ǵ(㫯2+صkك'|Ҩ3gG~~>zjaܹW]ʕ � 'rrr^x>|ؘ1%%%(**B^^ӱf\]vFݕt ./foʐ�Lܹ[nmp\}TT0`�dYƜ9sdɒz6Ɵ2-[ �vo&TUEppQҥK1k,"22zBffU(pXz5"""0e79sWZ8<C[_Æ 꺼VڧiӦ!$$X|9yze$%%aРAׯ͛ۇ޽{oSO=?Pw]73qDdeea̘1mɵ dddf¶mې3+MjÆ <yr\@DD[v +a uC4 MӠ(1ћ@AAƏjꬢŸeII w~ؿ?Fitm( Μ9zsHT |P]]m۶ܹsl_𨮮Fyy9"## qܹs NVٳرcۥ^w]kv€ <3:3 3,E$AEP;x l6$Ies$I( 2{5Ed-i]l:u Çlj'n:W,ˈ ]24 c>>5>�tuu#K+cs &tNDDDD:_r08raX0b,^MC\\q͸O7Zh(x`@DDDDJ ף%%%!))ؗ{~n};oSqG""""V@<o=Afw DDDDDaPjEDX,Fm/ Yu DDDDDDpA0ٳDDCXXX#ЌPv4k @2u&!qN:l6#77,"2 77& ;wv 蹥1eeejVoz'~$""""Ⴎz1x $gϞ(++_|*\.( E4 AOFD9Ȳ Ya2GPP:w]B$#tb246\.d2!,, $5m.{ ZYp I`2ХK>=C/dL&slf �AѣP:u2.\.TVV(--e@DDDDZ^ @Ө4ͧq6x/ {<Ši+�OP7p>WKBM`2oo8~8!2aZ:] f2d """"j%w "t]$I4 ,\{7<TUF A0BY2@0&~>\E111_PSSc E5, BBB%C""""V4.Ѕ PU@$#d<2<!PyHT0Spft.]BUUTU5 O`2|f0d """"jEBݠӓཌ$IP,d {^ <%z%IBhh(DQ4nSY7hC""""ܐ xB wYA4c(Hxd@6 Ͽ7 M uC M Ő}oغu]<@5Sנ{\PUh]זa `@xM(=E='y 6νp�T$\t !!!K6R&C"""""�y~DޱoTsxw]}"j)9@C{bGߍ7g^L�/_Ɗ+h"t'`@DDDDTĸ@ʍcXnׂVkvIwuHpQ[ P;s Q k.pw ӣ3{g .w ,!kH*{Rֽ{D&Cݹ:C"o3uQ�9rï DDDDD1 4$x/S7``@t � A%s1xs:ذak7oF\\, C"""".};P$^p>? ̱Ps梸絋/"''O<C""""Ԙh(h~;\ID7�!PĉCUUTVVBQL&L+~!Q+mL{ ns•^kxȖ$ɘW 4*lۣ! "jt`@DDDD {^h 2qAD"=9ł?ϐ$ (BXVXVIEQ$Ie6 >0d """"""j{1@UUMӠ****[XffXV�c|p """""""  DDDDDDD ( 8'PUCEz1d """""""}|MEQ:AC=hs.ADDDDDDD>ƍ})S\s ȇ$IHMM k>(BBB9 DDDDDDDCuƍ�{/4M~!O:&O.]` .S'~$""""""f'BCCim.d """""""�]׍ip: TU5M DDDDDDD.jTUUAUU Aby`@DDDDDDUU( PQQhA "$I2Od """""""$8<v;Alb$IFi2t:2˗/#'',CE A abADDO9 A+Wl6Bn\A,0Lbjz㲈#OwRiLu$ $l6DD/f555.](PŘ{>|8xg AGF>}|.5MÇp8 ˲q!s""jTU˗Qt:Py "A$h�0 =@ �tsBSzj24U.oW&ͦ#R>D�Ix@Q'SlPUZ:t(dY вӧOcMnt]ס*l2Q'Y˗a6'>Ap8((((Z0L><'- D^) .`KYstsD6+tA�It7ڵT 4XFچ�Yt7% Hn~p):DU@e%_`g<@7CyID7dp4 ,t믿=cܥAܬ:CDyyy@{OD ܖr駟p%d2d2c=c0Q{*BG|d:A%B*l$Wuhܫ ꀪ&@I D@�I -CQ %XC8`;Pt҅=] !ƼUUUпfkiuzsdzMp8 hDI먪…  jr<C DUUUO؞/ ~0YCI24uw�U ݃@ԡi4jp @�Qe(`�Ud C%% LA/"￲lwAQHdpYD v'��ݎӧOo0hh.˅/2e\{M2 A fuTVVp!dl6z3xM0` H4TTT J L6Ti"4�At Pt{ v6ű ^CD7*C8E H @ժK^bp"H"jAw/Q^cWWW%JvoJKK1m4cHQ/^{bٸTUEuu5jjjkz DtMY,fI逦NdeL&{2Qt:aqXvhr d%EG\T C@ԡjKTU�Tp@&@@a$&0>ndN`YEd*(u8qܩ5k')nE,Q[ Ll6C4\| /\?طoQ([Y.Kj*Cǎt:Q]] MӌT2d k+Au$Hܶ3/ɒ?Q{{Q ":,``%8EAluD %&@SEP Ԩ�4&IIڇE�d 7 ڐBuD"L&$']q. ,b@!v0x sid̫PUUÁK.pE2/]T[TVV[傢(ñcǰdAQkrg8 D(OhiA0&eP'C"jE,Ê2 }CmZM&QTU 20pRTQC%C 7N.fI Xk't Պn5nwcwHL&(DC$j`u'O4 Xd lق ]c\_äI ]׍?*z3C"jD9xNDgGOͥ2"vl6#,, )*'XХ!& QKp5.!:LQhKӃ@Ir?,5A -KYl&O$@U(.E].l&] ?ys$ HKKÑ#GoܹsFo! 5k3|{"wc@D ';P |z{b@D-dҥ FE DtYdI\� \nKT |X<kD!Y̲�Ȳ{nY̲,*&AKP\H݉r-0͜]Pzu4 {nȐ!8p rssa2KvϜ7`CE<z�!5;@NLQ]]1\uDDGbf9툨0�D. $ 8XEDݰ7iڡ .UqnfI}~F9XL,E@ҀjJ񫎥=aaa@D{s <s0bb +��rIDATӧOot=M\/| ̐ŲBPPqN/_gn}"%"j, `>Ot܄uBph A!*IeI(h*�: :d j19vF7 U�oѩLn(}bijDD r0L 5n=<9;.<88  堠 ca8<JKKf|nOj DEt x?ނsR WPfk)(׀ZۓR67z EwPq#˨qy62 Kq{tΝ;'"jOB݀AUU\.v={֘w!$$gBs'wdEQza DԠTTTҘ JjSNQ-͆S_UR翅鄪xɅ*Zhvq ˨}.I{^n]нڵ+l6y@Bp8|sZ}={^aÆ < 82uUfiΝ;s '"jcyZ%ɕ7 DDDDD �6mbmU._Yx C l"""""""j"!C"""""""  DDDDDDD ( 2Q@0d """"""`@DDDDDDD!C"""""""  DDDDDDD ( 2Q@0d """"""`@DDDDDDD!C"""""""  DDDDDDD ( 2Q@0d """"""`@DDDDDDD!C"""""""  DDDDDDD ( 2Q@0d """"""`@DDDDDDD!C"""""""  DDDDDDD ( 2Q@0d """"""`@DDDDDDDɓ'29y$>Ȭ """""""j'N`ǎHIIaO"""""""jK.@DDDDDDDwqɓ'2QصkO9Y عs'd """""""])` DDDDDDD䗣G⣏>j4`(,,dO"""""""&;wBX~"""""""xQXXx6cs7:����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/biotap_model.png�������������������������������������������������������������������0000654�0001762�0000144�00000172724�12122071021�016504� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������iCCPICC Profile��xZgTM0 9Ðs F$A2"�DEE0�&"(b�%b~gw_:uޚ;\�$NxQ0� ,<:DBƽ|z66(#6Rel=77 ԪtR0#�@6%7޿qMFtOU!X:bk�ۘƌoWd��}W�H±>}.d XpߠpDE� ZF � @%5+\@x!w@e_�4-/dl�4sK6o<!QJ "bfss^�\�녛5�� d8@(5v#`8A@82@.(�GAuh-]<�x&;|?*A81A$IA :A- yBP%@iPTBY j:>hzM@wha",`; ~8 > *Oq#�ohQ(2J GYQ~(***AU.QwQOPoPPh4͇Fk:A@A_Aw/5 ÅǨaL0?L4S c1X+Ua8l6 ۀ}p81灣ppgq7pp<ύ$| :~DCQ1񤉡ɡJffH+HAkMG@[D{9KP&|ńBa0O$Db81XMN&~ґ4(ttYt5t7}'ҋӻ_�31h280D23401%A$>ɉK*&5i};7xv02313dɬ\|yyEeA;,Xqa-Xظش<پ3;'װ`PpH̩y< "/W0WW+n, 7;<7O(O -j9y_a\5G;7$dWr&2�T ~e!!;B^ 5 \eC)',.)*~X7 A {Lv9I~I[t6OR|RRRץH J;HHwH/Hxɬ*ɞ}*Gӓ'(V[V>[K~YA^!@R"bbw%I%JϔMSo*/ȫVWRW-P}UWKRkW~^F+MvMfc-:-sl{;; wֆwj'kwho$M vLyGgׯOԷ/6`3p2(7xc(`gxpH(ڨhxqq IS! K?wi:Yٔ^6 `ajQ`’lhlbog̚:z»wۢmml)%QX(_EY7,ʜf՝3D2j ݏPxGzOҞAOAh{^^^L~>DO+x_7f?%�tK@S 6-%&hOе``!!!!=ܡQ„žˆgODhFG|P{6E"#x⢆sgb bbbccG(N*.;nfx83�߁c ;V]o$q'%$%k'JLL>(t0LԆ44j!C={22r3fR2۲xf϶naIș5mc;7u|wG,\--H/RPQ$^TXR[<PVR}p41cW_:}Qf2OwN* V쯘9eR*jڵAfZڜڕo=SYOO_8w9s7˝i`mjXqa/_hbllZk<2|y+W.^Z~Zv+Ժ{[PdKйzS[·N]Aߑ݉L\=3ugϝwGzzY{gw~; t?57HQc=C&C}O̞<|jtӳ~g_2ʫQhXkק9?0:3qwbrxejj:xwOΈ\{bvǏb>m|f\EKWïܾ~823~AmOKyia5n V.~}|cl3o,7 cXs ={.\ G=�t�0@@o( BH!x#<(EC X!=(¢p|łڇDۡ0v)~;M#C@K&ӛ3(ȌLh +]Cӂ+;2(?!*X-4#$(/!',&k*W(RQ@GVeR[٥5-c{x}aQ S.35Vw iP,=ӝJ/rtt$y|t|-\WFG(Q2GD6WcVc7x\ BIdL4t桕̙79r==<\\8(t,RZȩZwTJi3qg ybYcf)W]ޮvM[;;C»z-uUCGCO;6=)|~EWQcQO|369617yn*xZazw'Ψ}|x0QO?3|r=?[֌77�#<$  Y"P `+^GF6O?GLBƈ-tA $EFN&:<golK웜D.2w/_ 5A&!k,^1NDVyYSOJ{TU[^ii׮y'ojjod<`tՌdNԴ2qi`N?\RZV~ʞvn>S~Z%8i+DHP#1T++KNKLO>ȖJJ#§73V3rsym..J)>K<'wT8!+!JJi]z. yѷP3ErЕW[qmF퇮DҾ}Z\`N˽}JBH{8w0{(Ipgԑ/"_ƽJx&f<lciz[wg>Ϛ~d3gY Ǘ/_~s^xآҕ_U2@hxaPY1PY;DE@AYщ; m hDhn:.*QC HXC̦,t,#lknpuSg' \Vmw$I.H=n9!O"@0إt\9LEOEZzVھ: *=aQn]s?8jioi5f]c[c;lWC7rpsp*vpvp6~#eלwOoz�sAuC,BC*PEFDMF|w0.`u <$dTF_iˇd,gqf[/vħphűbeWU(r^K㵸:gC7jȿQ-Ɨ^%\noߍ$[m {ݵ gx>``:{E;vx<yjq3"jk[{V�8@�` �Lh9{C۬=9p'GΠhwt9zÍqc^c: .׆Oihi=E6AG&F cch#H ^CL:L üՏu.}?qrœE\\7! z+\.pbE\gJ0Ȭ.?0ZiDy@[ZYJZGvdj$f,k4xahl"oJoVm~⧕M'vݔ {Kv6\go=Wq7wǦ'K['į?6"0=d4t%'b'oA=*&D$N"&2EZbή9RXX,\zRK%|usg:VϺѥɴE 'ovޱ'%.<~)0Zfפ[s׾~Wg](|WJ٪u3"]ۿ&HF+ 0k‘y-Qh7tz# 4`cհGUfJGHNsՍhҾ'h DMb 9yz}8S Id7FL32Fl8*؅ٛ8t9887ʸ5Gyyy#r`PP1%u^#RRRC27d/5_TWSR.S)R=~PfuGvN.ug^~UA9. HRo|6ֻl.R)ҎN.n9{*=y {/ aBLBÓ#ޏ뽯8wīI):3Sҭ2 2I95yՎdL,s9]*Sv$sJƪ:}.mlm*j uF-.D ={,>$>,LKQRno7Ϛ~-GB"yvycEvuǚ:n}`{-@Wd@o`8 C)Qf"&="p/y3ii}iG;D]m:;BHtQq)\b2ZĦÕs;G!x_MN-#,-',FKJydddf8MTTԞj`45Bwit+bbj\e2K,|R*]g),Yd.K[ X Z 9&~*rzt[Ҿrd/&˥J5NkO2,3K&sdsSs *^+v,?tҙryUkkO;+~ABkҥf$Nx67hocz=J_C?x@yxn`ɡOOs<{(X7'&Zb9h)i/_c^nN?--)/Z6^~KׅUՉ5ĵ+kם 776667)7{wh "B#"練$k0!51<j+ >z#wڠn!:_"V`Hc[#}!j@?5چ<)> DD^eNUD�jG0;bH~HqGg9 3Eł 0 V !1x$R#9a�S�"mQ Gp#`?z&1H~YȈ?6/Ƚ[m[/4mFA~V~ϘТhE ZAk�2 dhuZi�cg[ZcODtDZVభߟm \ܟ 9ȓXdN"y~�Iu%/n+WDPGFI?ipYi</ e\}��� pHYs�� �� ��� �IDATx]Eү˲ dDDNŜ3f1NOsO< <9gŜd6տֳ7[Xzo?=k{҈5Wtn{۹s罳{2M"("("("(qhѢ9yWL K_> njÐ!C.ڦ TE@PE@PE@PE@P@zz:Ojkk~ob癠`w7lSQQ^ "("("("F�@lqtlmE@PE@PE@PE@H8ceC:rؐ2QѠUӌߡeBNFv.8zޛ )''233)- > `ˬ\\BeoI5?@ -[M6Gde }8mHr2Mh}p2W"("("("x! @;m_|(4̂ҋ9}A=8N]])X1g.,\@S+8 x=_e_|LUOOyQaԪ[O(;Ρ%K(SɏP|й#u,Duh|ZWV1[H61L?("O,'ZHhkY/"X+׌ːl`Դj-+5cjQE@PAXloHp4gִI{}!Cŗiko /ڈPvZ_ O(Xڭ5u߬  t8;ҩhǯS v+?>'@ Fh>}RKiެd>;m("4wһ%D! n0Ɣ9?@7]}&3,K/Me'QjShsΥe}c'Ji<7bitٴu{.GF>&~vP9}|c=yòL>fvֶfmiG?vQ>%X ==("("\˞XR1뱧;VZK]ߦR_MJ,]EE54)33oQ~3B/H{?ԥWm/r;USv<J#EXOV\*TI9PVv-`ފ>X~"izq5ʥ~MYU֖%TPM(Ww{L_eZ("LѪ^iGӈ-ƍ{^|aiSt(n*}HՍ?DrkTˮ~9r;1r󡐨8:=_AJ'M;/W>T.NO|5(*Jn0%iuˉe4ԜVA7yT=͒"jDV ޢsL/Zbr۵'ϳ90vk/KpZ& uCbMk߁zhW-\qWE@P6逯WdlO/خKy.e-_nN%]SGy"Lc[TPTK}.6Y,J_u3(3ҋO~&~QJN(#;6جs(='Bh}_Z+jieV fRԺU.^Pc|ej"(FI|ci}iԉЉ;y4CSK١Ҋ#)"G4]h#|l;Tbke4;G-܃-qܹ TjP -3)tb Zgό\I6U Ϙ <H{n*XySUW 3i)c/O7_b-w_T]i ʃA ?ekJPE@X dxoy~6KT 6{a/BiP=6gޙN |{T ޿ vlOYm鐟G|3Θ#٦RF,҆i/YF׿3bo o<MYQGi%TSZeSf]覘yT3 KE@Pz$hB/Ȁ\}rf�s^e{n;_d5l^zqhUIKK`yJ_C KJ(pF-M-7ҧӢ\G眴#/1 ]tA%t NǏ Nߍ/n_w֍dxw)ԗg!em2_<uoe'epe&4)3ژNt�mtTĻݷӐC4M ^f�Cͪ%TR[~`k].+b02z~9Шs=:O1n}c63NwRycnWlz},ݰB<zoh=S*~{zv1sLXst {NŦz%?0#<ϡ=Nߑ VwRPӸO :6WMo<@DC6kOK<4Ne*muCsWq|C"|*?zN!iw^/;/ۏJ`5Uw܁F翘A;Nӊ"(F M<)C O((QX^GUWSA/M-( ̷)ŔUN<Jeǀ u^CY<#W Ŵ"ʜrҭ (;+YV;B296_˨Ϧ__N tK+V鏊("4<3˖̥3VׯO_Pzd|e,FcBza 84RzSvF?ĂM?-eg>@WmۋJ>Nr~7hٔ^_ICg={ v{4|h*/n9|�UzdI7?Iwnۊ^quGzU,zYۘOEus>Ҟd4}=|4mqtxBj-1x� ]~}ЫOG zvZzO{\ىN)d2HawOrS7Z@>2vu44Gi8< R3"N*}.6_㷥ʟ^#IaaT9m3h.h.sLj*.7^"0J`hYEh{Wv&61oŬtțoE%?I'\ ?odSœhQwГgV}'\Hߕn:7k]H>?h4蔑SӖICo|v*]/.,6u*gY#MtΗ{֟n;rGl;?`}Ym<I6m>Uou5("L[H"7{>,xۮּg&N|:s{x &/Yٙfory_UT@imߊrfJ93x2+<Pf<l %ryb,X&?rUSi*6PZ("LQLLJ@ːè5̂]CreϞOtWӇ]C_L=͂::]D]?ϨWRMv4.wԾ6?x<]TZqH_;-.ߋvKjh<cQ?LD{m4p�TlΟe G=6ȤJ|GuE|r=,:fv\x-M m~ }0EhJ*/D؉V,Z̟faN0SMї91u*m|iT<LJN݁Z9|XCIO{3mJל;//­'G}D^àwכ튨_LV?Cłi<�%q{/_LݑfEc|�Ye*wL;ZUNw:]}~ uQC{ܿ+ݷ%z$'誘 =чgPр̱pm`ڌygtE=z J[6)##ҟ.QZv͐!(6UXU3GqZ.5_p ׼"("=n$g#1w@K!mؖ D+x+%ޢ78mr|~ l\v `fO ` pؑy:3P'hVF׶]ZgP.;/3*T݊*ެ P^ ,.\$hPE@h)S%&h_*-];$2k$pXo)-;y%c9-g7);']f:}՟ţty\z4_$BȼyĬVH.yTUecK63{c>ےZZ^PqWmGOg*|C:^r%9]GXi O$jmN7d M`E+ 45C}tOоSӾhk(mRN/\yȑ ^v |ie,Xb xQӑejv=ft.WHkxP]O$ow8Ds>޿񿄶* ˦299r/r6`ۡF4wRN 2.u<7)Kǵb]+m+cPЀA;YT՟۰wOb8BR$Z)F12NߎJ"(ZC !gh|۾?*֢"7ltӁgF 4ȢeK)cye<S8ydHʩꨲ֍ ]6*Oߕ|J9LxY <_2kkEeme:4("D%4k,݈d[zOiV~'kw]9iSh*ڸC8Ԕ-41ap)? t;j&o8R-+5*,˦OG?\EK ͧZ`ߣK>{~�~2M0{F*t}ڿM'*Zӡz,ƱaksSovLK.o؛"›8Ol\E۹B QqU#2Dhr/xϜ90 M]ǯ'/d@ўTJue\E1Vߓi?E?YWBSgRLяY$o*14.yK:~<KӒ20r:V9{x6Ala4Wnx=uBDkE@PE`#`foyE[Pݯ2DwރІ0C\0/̅~QJrs3}1ʰHݩi*ܞJ7Xb6!a,l;zi)M/,vZSvZ6cyf:D(o9i/rZQM;84("x=[t9V̞DO3::g�Dt@ #9{S3NNnbʑyTW0c ϶ P[Kr(KWG8UNNGi@&ґ;ixԚgt8WtKډ 3*h*ߏͧwzm umSLD{٧_Lїy}uew{}>oKuԮ[bzx). ϜNsjZ^.+m cmHGl݆{+&3E?z g&r!moazqtԮ}bt,q#`o 猺.t?,b7`9UwOK#&<Ź#Rjfv6USA2j:L:wL4Q/_膣GSC:esh#6p&Mn(mKh5چAǟ§ڗnnfTGs N6]ZQ+^N -_9s][D4("(-?g:= h=i7_SJ=p,FHW ~v@$[ _̢|*o!64l,e/湣 fQYé˟b"<rNChR+,ZoCuf=jMofFhlfI9`. ("xf~p4`T6E} ^JejTWyoO4T:qQ>'7NEUyo( #6Z/:ebn:iI\}aYCw:n}v ڃҾNR8w]t.xr.#e'^M_j`i3)X|/b#i1pcv`vtGw3;HӮ}\Vtw p^MP>M}}t?!!rũ<>t㬹t]kLسAc+~vvG} @/QJ{ =A]ONL,nq'Yg ;:n1v"Γ>'Lh++ʣ':gӸ ҫvқ\EV, \}]}1λ)v2dVG]A:gCycOvǟgV-fL`J^;i}1c苼(N,</Hz~�/ /hPE@PZ<7O x pZ-ZD?BzUmx�BQ9\kOAUֵcG2 2OKߥv l,VQTZ'nZ *WEϢhvCFiE%-Y,)͋"WJVE@h62 H~<+/ס;u̫93=V-uO%Wgky6Yz>-g^;w܀shάhhY:v_U(~^WM|[F2yh=RfJ}Z&/3!#M.JW$o9̚{6SńUlhI`W:uoyH^LQtuVbWϣqG\0ٱa�;\Z:g&N leA҅W/\Ufx9sJ {t*]'V:[/"heƞL~Q01Uc^@hOUТR),7A]F>8魋G|n 2Muu'֖7Ǎ_5sw(gci[Ƕfɋٛݦ#ue ˨de y|}C?N+]jOņ݊ر})'1>οLx9[X0p?E@PE`-#paOj=+ADb6TS&G9<l2^RQK9 cvM0 '2 [燾T&ibU&m@mN*ٚ77ZQ722s\j! ,L("Т/EFi~gro<C ǟM2{ײ]Bcoz)^5x`&k ҍgrAv;|F*$1zm^</Le(ҀW@λM|`w33;"] +~Q'\BNWOJ3iwK]t vHsKbܕMkDq;1Y&FJ2?yYyZf\+f}A@'-nJs"(ZF#@?}u�� �IDATg^gf&`B$۶mKp@Jy w}Z("~"UdSy<\}G=kÆ53-:u{lQɛDW&6?UM6ڎrΤNA}0gct.y <"(Eਣ:Oz1vN 8lIf("(@f^!Re kiW؎ZWb[5eBKiKZytJR_S.mo[lPE@PZ8G}y&]:Yx}7b!Fx SE@X?)[FK-[LkՄ{(khŒEڗ~LM;T"(_+x_m"("("("4 SVLY4PE@PE@PE@PE@![3YkiobE@PE@PE@PEூ@Gs_PE@PE@PE@P!`f: k+`M3^k+"("("(@Eth> ?B`YvWomQ4L֥e"4᧵E@PE@P2f9^^q!o׺ub{,Gĉ^e&Mm8qgS߾}=>3ԩS'§Dה=$+$ֳgF{)m8s*'IуczgSڶ?o6zm8eTE@PE@PZ擙 /fm{5 C ɮ80myWiڴi4r0Cp]wѷ~K[mUzp:~f@ӈQ3hc+PuuO?s=E ڴicuSK,ӧC=DC[n?PkcJ2)"("(D ̄t�j뭷4 baqۂ)SRtq'lt(//7D0HCp i@s6,hѢE&馛R>}b!S'|q]zн{lcW2("("(F "!C]tQ࠼.r֭u҅ƌ$`_L]v6ڈtm;+�oS0cz"HL믿N뮻mAXݦz؍7(f_x:#qnj{'O3<3G_~-؂-[fz 7P~m۶gAW_}u|pv<1q)^;jfΜIÆ :|H.o*999 tAIae[^2|ᬳΊ~4E@PE@PE/@g& ==#4vX馛襗^co͛!/h„ #1`4w\)6ݖ>vygK!ވ,5k}g1Q m{oQ_0mA[n),}>C=ҪUAA+ p|***"/8y Hm^baic(valJJJ?7o4[ 781jʌW~ .l&jؐo 5f%9b(MPE@PE@ `&8`t2߰ <hk~bu}<|eee7~R9"G}t,lv5oF<F.Fx1m;hT'M%X^Zazbjl{aɳ$"YYYRS 60e}5>RPPaGLL~*}=+jʕ&wҥ~k7nu1³?7<$&oc4vhDN;X74:~!{=^Ӌ׎0<ewit#hsscNgxIUYn51j[`rGgDء3`va&E@PE@P5d?W`39J20&xf7-i`$ LٝoU/_Nx,uX[.f;e]Zv|M?4Ep63 d3ʗ_~+Y} 3xga6l{G,|_i+cXfFaǫx~Ǜ7ԑ?^lF,]v%&8<»ۈKD.BCcu \\_nV4l7Ơ E@PE@PE`G $́& \a~s823ůlЈо}?- %G6rwik^<,1 K:wLxB;ly8=N8/Sᨣ7wI'ϭby~NY-6 Raǫ}+Vb|k5{x񦚆/YϾ9ήd2RwnGjkӑVSE@PE@P th&٫ŠH R0HZ[_(..o1�;0ؓ~va Ei 6l7.~! =cƹ2j(¦pDw/mr?L?8r›fϪ~M= ݛ0~!D h>1E0!ڐ6|se]f%vͥSN9g标9ŦN0h)"("(@:7 Ț z1 'x A#Hi8 0 Ӭ184~ X/l4i$Z`K /a<xY~`;Wn7L}-D7;/ap18&h̬uO>, 06OL?laMCWô# ȳc80C_]M6٤Yrl1$`M,of3 :1SnksÜ[^6`OY!61‹Ui"("(_kBSy*m&^lvMyiժ#婊۵7*bϞ=M9z'"H?!3m Ј>f1T&x0g6jb]{aƳbKfrHʄ<s#2rHsx?8F�2}ݍ=8"P/k.4ƍl0`@䧟~2i{#5q 6a H RyϕhM*2^zE9FgcN#MȠ ^ $!>޹;Y<6mژvѿyFOժ"("(�| :П_XМ9s&^.)C`C׮]z+<|GL)o ` ld3l&%kF|oE|!"=} ô# 8,:uk%8( /앂F=HִOPE@PE@XtXۍW-,s` _Р+NufSPE@PE@hntXͭU+>\Ҕ}>JVZ&�]hPE@PE@PLESE@PE@PE@PE 9xzE@PE@PE@PE@PR@ly5\r*PPE@PE@PE@PĖWty_hE@PE@PE@P"о}{]^RDU"("("("=bPhBPE@PE@PE@PR1&E@PE@PE@PE@@PGD?O5"n#}?uOL*IXkC溌l{ꏤJTFp)6X+"("("(@G@7lH-TE@PE@PE@PY2'L_1Z;1sYXI#v槟~Z&hSwx~HHji^GRpPUDA`]6lf-x=~gNh"{$t@SO=Tl&#V[[Kqpf{Ko-HiҤI-%ZbDؾ5ER Ƨ]GԞ單K_1 [-]":12t0'PZMy 9^-<Z=bW)N;6d<xpxKqʕ11Gn?|BAt-S%0ZK'<#.OJnJV2^r]AåsˤRnn/Ȱv6^;v$=gtu Wky$I9<E`nm{lxٻ.gyQ׮]騣j&%ZڵYQ"Тhwr#rCk) ?m]ϋ訫4{b5$쩮5.n駟KXڵCha=Y|kԨQAW= ܹscR*> !H 3'tsQH?`�s8?ز`c=a[[c ^t[2d~_ܷo_}]3|?7 ]Dr ##iư瞫*7ʾwޝv~k5km4{l:fap>& }msy~b<|:si1 ȋ6%_h'Nj}~VAw_`Rۗ_~***pp@|)LW+I'n ۽ߵٕ/j^P?t өS'p~…u222bưv-ضǦ#4-e2Bl[=gf:A]{ ?l;w~2mA,ZOx㍱<_|žvAVVd[wЧ쇟6,Ķ=6T 4h[j:uf0P'p(.nOn-egg ĶAV;quayC<N2Ř5vmC>y"uW:&;cƯTUUIoYz>fP^pyA'#B(>OkA}q68>k|ѣ%sYGƉ^oEnsԾw㺆K[tSumpy8xHt-]aNd1  ˖-#p-**VZѡ*M0 =\O ؀7k[W"!$^ަ ><ވ#biĸqbd]xq, $^ݼ@,;vhޔK_m ؈>}.Mz.⇽<)M`eۄDmoi=)pq?n#f8v(#3#K)ˍ: u Wl {lYv}؆<*`˰<'^: UV1df2|;^Kۛ={r13^?v}`/Y,anpͥRsFcn 8{x͌ aoVóK;|�֓ӊ~-8ƎF^yAѣ/lΥ THoQtGO$PG:^"uOk/\0W�LZ2v}gp<Ahrϔ<bTc@zɒ%zX `g CW SWxNI{dž v[G/Q$<vo")T)g8$B?Ó6'YLέD,syܓeiе9Qʯ(Mr:i7 O{ձpP 7e[}3ao9ͼٳP>}xjvWa\DX {D>[~D6|*~+M?մラĉ'γ<vBKD8^"&|C%+p Ds~riJ߇><K]C駟}}_cٵk7+:v/nsT,ᐓc"`m/\iݺi<ćq<d_=YW3us4ՅmbW~~!34a:ܛ4vgeĜ ,]ަo /pn6U\0!(< fv{M Uz~4{z1h^2Rm/<sdOS m^yp̚ [ίxn?[8C_N%kg8)|j[{ɊGǃcU?/{+MPmtC\4^T"z e{>F<Dးo~rr:Iq<mmy6m̎zn;<yr4m7*�ODmOƞ+8nf~`2 (`]w,Co s!y<Iǃ~:xmy#&vq8ϙpD.mD+KWQQSSc域>הsQ8KBxv8� Q!L}W]5<,:3|j蠃CMwlcJ6o@>K/믿>f;bd% ~D1ǀٞ\ D#|uqH,ošg+)WVP^:  _nDMNwy'& t=10 Lla }Hǃ5�aXPtþG.0t#CF5p8,[@JS"ԧo�~x!4m]/vEt%?ɓhY#Fwj*E[ td\ip<^sy9`ˏ64%ev/R&mcw3A'2/ᇞ˗Z+Ŝad"ᇥ)QJ2áLccޫ`%x?6}쳏ik`cȐz1c4hizշ!?NO;^_;鷠$8(`y庐=bY.KsA=ɁtPƚAF)6X|l. nA41FI6VA$/4Rsۂr8LEԵc2G鰯^vE%jԗ&L0nȀ tLC /{'Lء4b7~e`Ňry?hiVad OLhܥb. {̎jL!^m{8v?(=\.tE@XHB,+n].6]A~@oOpx㍍ák4o|"KzfAS meضb,r8̊+<[fXۓz'[TٰɎv{WlRtYYYl!C ~&ᅏ ?7VI-zc+͖'|~Ǖg̰D@M'Q2پ}2a3K,:CJ+ )G\72A={7~(6]%ʥɮ2{ E?EzUW:R!'=bAX\;Nq8` np@6+�� �IDAT 2@3 ' K)k6K`.m;S HَIiȔ<SBtH9b[>R.8P!%"1~n 9vp߫㺄M#b À٦#-Td#mO&HȒ"[H#[06m۶5\oE>$O2уv +{im-ϭ/Xt7zK0q*1 ܷ~ۘx,%7 !^p<iv=M+@ l}ضMh IXWr^ߵ;796}}bix>Muz۶#M#X|p"4؞<6ٲc $ئ!gsusbף>{-Ln\RRbHV]d dp 5&*D#v5טoK^$:b;`p*Y咆/Y^j&"^ x<bo>.d>d[ҕptXsHbWҊMl|�풖u$x㸢[?=.O,6LEG=%o?@Bt%rۘ>Ghc!v  d;D`.<iMK| BC#۞ =:6#vQfKZb/>E?Oʏ_Iec ¡+]Xf[]t2耬w}-2y@Yل (j=TMSWرcc Gy$"N" alwYEf< -}ĭ:ռ"\B,7JaM"G0\lڳpҊÁg80g|/xI.F/{\|< l% 2� !^Ae{20nbk iLa:HI n<cƌI<`O Qq:AC >yДp.t?{Cȓ.Û8v 6^rQ?^]Ct^xNp(*Zs=GGqy(r{>:avL/[=vyش},~80D2[ߵGzX,z)S?42~Wө{}m&G?v7[l,LEg$mP˱ď2I c3WD^RXl6` _ ټ _"]C&{Pw^&b0mGk"[aJخo]^aO |sȑ1XFGݨ?4br2aiMJ&fl+pm ``/ D1E Aq\lgҴ"4 .l͋u`Shvl¦ |AH]+VRwkrsiyxF;v [~AS݂lnYL|3amy3IQʉlvA#rAYs#zap .nx?6D~|0xgԨQf`ryte_[m$ :I J^A~c e=!پ<`aA{:6(刱f:t|3ΠSN9<&im_6.Kd\m^Ia)<Fɋs<lJ>' K:}40qD~+E[ta-.N8[T<1__#=Ơk׳y\|nf@[[TWʄWbЅǵe8p@kaN=^+`[%[n%Fܶn:Ax_lz 2l]%;kG 7K=pbh(dB×$i6GFb/.F �|1@ly ?3\/9 #jNѡ"X0 {q H +| v:+p[RCVЮ]L` F"!Ȇ0Sݼt&4ts8lKG51KL\mv+>7nY{Np햼8*++db)֐;mL�rƌ! ~PaMz îxAvM<8?:Њ^<á ?ʏz$.km5u>I#kaCo2X [߫=vڋW|p6LpVKް|`a3<� zx``x Ym vAb|s=6i A Xl #K6hv];<VO\D.yضN{ Z \lƹ$ywsqF2(l#NRmFɀ捗´9lgq lS_yE`B )!?[{!`qye+<~/lbĀ�Qp&\{&,A.BNN,ג۶ <`}ܰK!6!ggjݢWl7xDRc/q8"׮>l>y {8b b!yr!+=RWdߴdF 'rmٳn<~^u=~g3|a?lc4pEpsPuR_\{&LwhHLW_uFv8蠃bY r¡CDz]w5?m<],AH�]lpyd`p`y |[o5fxx[$Et)GH=[&x!e8A*<rmp#"Kd?)i2O#рX&r\{DĢ׵GabD}7zÓO>iRObt/^1LshrW5MKSf;# 8/%)퀺?ggv)<~ה E@XhAZ b@J^ #ܼK6&LyryW^T7m{?6m ۄ %က7"vJZ\V#^bbld8DE!޿={ڤX2c"I,ǃ&ЇC)XxSChC")A uxOM!^<;hTQYA5t_a.}ϰs afdg}_h'wj;ʁ;duץy8K'v'&;AhR~WޭL^<ځpٮM n,um .͋ #v_Ơ1y"_b]>/{%0µҾ!v<B]n>=/eiKw6/\\?� ]b{�-xq<> A³Tb{ p2q! Eԗ~+ō;8S6Sqnboc|C㚰m_6_L&E`F %N! gY(syvǎGyCA諯!C6ipΎb?܀c 頩ncǮL8~mF?RXlI|ԅ?.NTty; {\AM<=ٱg(]^^nO< l?|7dlG+2@`U̡'0QB؂rWG1ؕؠ_vٓTTXdw}8j*!5‡;? WMem@̳v9({a'z`~ 71rݼȱ0XrS=;Þ'vICw./D[ꫯJQxԩ1^{;$lkh8~ W) uݼ<?>ԕFo~.<"۶-sRǍm>q8翭4,Q ^3[[fhvIen^dq2;el 6i<1׍Jl=dP}ئt/7FÎgy&Cb/x(AԖ'駟&|_Lu -lzaleym#FD=`|B:+@a/^D`ݼv4�ǃllj?++.<eʐR8+2nym\tenՇڶ礓N2ıQ6ɴ#}_ppؤ1 nyV zH:~UߋץyՕ 6_ƃJhǏ?-wV1f8TVK whG/@qq{W~ݼk |ɧ_0Ep6`( A:ʼd4kta@NNNRD03l[ ,Gҟ*{086o-AۛoIؤ2(4=Nq69pd>9�"v8&] /bӍm>7w.W>:AAe^mZغ#W,ϫ8rD6cFc!dcq<`ؔ8pj8`p!|[^tX/xGTi"C y=`^i?-M^n,athݐqxp.уb?{(Tx۲d@-mDa K8Ʒ<h<?[=boC Ö}Q  :x\lGz2g-77rC1tdGB;c0>mP!/.f+iӁb|6zaik% pB` KD^ g$Ro%Lbɸ>$x�?m7mC:'3_ aցK׎Dh!ޛBd}v^h. W,<f<ۃn`Idy"SA;-2X�yMy8D,0D럴ޞ<~)yEDTN0u^`#6%mǃyŸHnMJ� q<H>8UNYJ'p~0g;J} Mt {4a_ʑG?<+z S )q:Z^*)sBݼȱvZaGB]n^qn ;mp^| o?D?<qD/(vڮ립Ra\W6i؁\�>G]/ZX_]Ʋ^zѼzܺ}8*+*TPx(6MY?߮l@y7cGAa;�lvm v O]!ү8=ǃ8w9l;%mdQ'3q!^߱cGB .нhŸL,x'׶N'ROxQ_2G˦iёL,$N&?]6N |G96N/yѽhGu&smiKnZ1+-NIδp`Yg֪U+8T>UB|DlG"i75>e!=͏?.?(.Mr:12 T~#v-^}'|~/^?Zۥz-e ïx(y1箭5(v~<k/ƾC<ަ'},+gViױIٓ uMm t 3 ~5s HaL<sLlf ОU,:&\f:غD?b?^WY2הXhq<`dCK>4?i>9mڴ'3sssn0{j_!7thn,NYJ!S]b#(ubP&Nqq8 ⺄˖cg O]ߏGA&97 u.y?]"|~< >/en>.kδ|^~:W? =QphN؍k�C=d!WxD'ʅ)q"}Yp l]/~?F5(%Mv:ȅKb?9 t4Ǧ İ#Y8, օ?(f 9AvWߣjg 2ύcL95x뭷lVtO{3<^P.<ɻ/L@.x1 ̘1R=&7FhH{@#-yG9l@. %{Ѥ</ffCt|Pl>yz);<ʛF~hf6`FD{^ZQSSE8b<!YYYbV,mGZDPWYSh:KA ]nuxF K<1~3ضQa>svnB/h^O/r+2 ۺm]R#%l|pqloM=mL9V6⺆6E)=& i,.v,~g &M6 ;^wl_Nv{\ꇡ: 6wyROoq48Jb81xH !KI,mBUI,}YuE`DIN Hpq/dLP2ܬU{Musu"vK+㾎3Yۚ|B?|Rsذa6ʇ"?lı 7hk1u&H>} K'i$f8`}L 88셝gʛFn2p3ág83"d1Z`iv<`A<pC/l͙qEtc�I6`fKTn 0Kd#“sSd{20r.1 ~2n#G[ĶaOs1H&i7IeHl9:`̔r?zIEHTc^|\/O\CwCN3a|OfjI}'d$k{~n;A{/4VMr:!\ʍT CM h:Do-5Lv/AIx:rz2-N$/;6F8$ϫ,xyW肜_FC1Qi2Hà;E蔼Km]/% �GAW*7f8�!ÖQ _=P_`^cs"ǥ#y%% /ݢ xr8� $ߖ-$*KKCg6qy ]{i%Iz~"}WdH 8q>Q�'yn#md"/ƵDurlaquʠG<h <l^W%k9c{Ґm˗4 KA&utDu8'j3<eN\O8"d\n<se~%N/5(Mr:r񰛋 e"$%#vڴǶ-hn |D.kӽxm,m0i!r۞O>y5R&(G4eu'_Qe? aMxʓpZa�#1lbˇ<^mݯ6]t/v};,8Cdn];e{غ4yl/{:I۶~X{ كH}$bc{|v&/ަ%ϋ&:oZ2mco,n0::u`!a16rBg^a0`kj8~ uΧQ�� �IDATlWyE`BINxBb_@w/.v^ ["CʄeB�AE(%_n] )^ ͵evloi�[Ă y /i(#o].>C/d2#-6@mБO6ds>y�*D`axeMpbɋ}bbHH ~< ۄ.�]xv4EȐ2z#6 ,ĢExL,t0l /H;\{DF21Ni,nBZl@!o y B "/.ڃk"׭+|Em�yve"/I[/v;Enx+E.6_!  ["_ )^ <b]x@YH#زuQ*2LxQ&4!kC}?g`lm JAk,LX6BC,t9~\W!d__oA"W+d`x~x}y5EJPu&9\Dl4\ [!6Hhi]af{K7)>ܼ݋צ#vٜ1lgm Gx2 ׶)>yڶ4{-ab'^},Lۼx0'>>Ny?>|zvZl|D߷mj 5{lѶtmgPޜxr׹Z'+Y}IVSu&9|Җf NTf{Kg.k5iiGH ,< U Ƨ]GԞ單K_1 [-]":07k' Xd}Xlv)y4("("("(۷?cmh8("("("(@!A]PE@PE@PE@P!Np8)"("("("$ QvE@PE@PE@PE@Pb1(4("("("(F@WQ("("("(LϗƊ"("("("4a-aÆ5Y PE@PE@PE@P6= t8.RIj()_}ܖ .Dʠ("("(՜[o5 >ܣE`}@`񡚡ׂP0)"("("X՜oʒ;Ud>oкhڬ("("("C`رTUUE锖fl5y222޽Q+ y@H�a�E*rdAF8㹞Q^GG.7D1: *%(h@H;ݝ[n:N'ݽ[ګV]|cժ &GfCGy$^}M.va] @� @@Fo}[_+V룩)* )H :4,Yi7:a}qS @� @P1f̘y#YV?---mRؘÆ !i8!MXretAq=^(H%@� @�6HACeC{zb W𡹹9Rf9黫ӍRSNn>Cke.>6~Wuۮ!ƌ캓]]� @�TfCN򻲟>^f:TBӂiKwq[~ƺ;P[vh=wsX%>>,_x @� @@Z, zHz k׮wQU2QPZѱ4ayqZ1eʔl{֘G6* l/7%f<H4faŠS @� @@,TXpaBnQDG,'i.xlPy# <0Mi%'x)51.8+ 3'ǍwznUץ;2ƎjR۹-ķ;>ʸĢs/NiygK#[snk? qƻv|5nT6bʖ7e+{5 @�(@\f1ȟz=ztۺ \HҥKO ?vѾ*thsH H+[5*Wq?Dx;[;xF:wM=뎃㡧itlqH%1m;槤@aʮkXx.gA1;dh{f}8hڈ씟qFFW&  @� @@ /X 3E~Z$@!7.);ltB҅mxW7\ڰ4k[+[]co5˸8{Ƅ|-wv[ͯ}lA1zDS6#bU< ieq_/׋EyW5?[^Ͽ&{^E @� @�H #FQ>T/n'CKw-n,lhmX}IϽ&:" o 0uظWbxyٺyk z5 nȯ4{{ur" @� P;C >|u5 MR?~|&eO_NthEF]54c`İl&EI,DvߣKW^<,viH<̊x$[̆iYd$0#=ٶ^=9 @� @?z][R>fFtmvCV+KsdK3~pi|'"[qE/O.{*>->yc�984~"%㻷-w3+#tHvWn^E񵏧E1#?jeZasۖks9N� @�K =.ѓ }iζ͆ [!W99Oп]28{!~;cG*폧 W}8[05 K6ɐ/dox1{L>gB:Ǽ<?Ջf:`|Ѽ<qm^m @� @�WaV^;vGCWI:gKڎCc= Sv<7P :wkvGggu^ @� @__ݙ� @�Q鐞cf͚hiBZ,bʖm]5JY @� @@_ l6t8CMG� @� �W A @� P7F5 @� @� $`CKS  @� @@E-m%@� @�:h4� @�I@PV @� P CKS  @� @@EV @� n�B?>b*TJl* tD  @@R0̢:9;Yթ[ t�' @�ztCЕ{D<q6TRla\A� P8u {􉀅$M @� @@s=&@� @�}" tf7!@� @�:o� @�СO݄� @�O@P1c @� 'B>av @� P>C\  @� @@M @� @@e=&@� ++WMlz%;|h[ 4@Q!@�*8yZhbZ� J8L� е&>2p 5� 6K� Э@ <K@:H@ XHݎ� @�E@PO @� B>w; @� PCYFZ?  @�mǛ5& t7z7&@� Ps/O� B$ @� 'MEɭ܄�:@h @�2"e> 9 @� @OeyOof@c?m  @�y2v3ܸtm#b⍏eO;dˮq6: @�(@ kNs{GG̚9/Cɻ/ @�KĽGnٸ1em\W<`g59@ճU3 @� "&_ C"RprhEa÷?\`sIFW]Cz� @�nRwFL߭"@` @�5/wj~4@/ zSU @�t.И#-x8cRǕ 00<^10U @�Ԕ#kj@4@ GnC� @PQ2 <N� @�( t"  @� @@Pw @�!?xvɲ?g^H]G/9̈kύ"z `CPUI� @/Cn[?Iy0C఩ t*  @�#y>o P%C`UK� @/?66O%RYgOTzz[y@@nA� @/fl M{}'o"^/G� Fb @�}+pŐQo|>i;6|�} } @�B )xX9F -qhq_С&@� k[#ִS|@inWm|M݁Gź{Zo+} ndu@A($@�(﷤ގ׌8=X^߿[/sG|Mս =Yc퍉 @�Fg~s; Зۨ/[^ @� @ua) @�"𿲗P|7a[5lO@P1c @� -XT6xF~ @� @�% t-I @� @� 6� @�-CoI� @�HBqA� @6,Y_W#Goq1IJeˢ.:~oK'#<298]@@]  @�X E~̙͋'O=TtI裏e]u7͸cw+["3$6' @�H駟O<1{|C%pH]2eJQF{y晘0aB|1{׿i1w~o ?f:􏻻 @�+W!Cq5;S\|śEŠAb̘13ZZZbѕ{RO C:"nWlR J5:K� P$W^y%\!yҤI1|N8VXvlqg!Bzaҥq 7kA\qqĺu΋UV5\_{ 'u]]=m7d5/G̙4E@@PAE @�b E#+۸q*|Lj#իWǻXpa>C!+N;[/xRߘ1cFxqwıgFVG /Bi<tx(54J� P(^zi@O믿>:i}hCSSS;6nx*#iKo8C]zW;=v;ӦMqꩧ楩4F@9t(5 @@w߶V>C~՘0)n9)\8SoHT~TO bfCTC1Ҷ%d>cio|./_!| 0oL� @`yHf(#'O{wao~iBzk'?ڵkWVVgR̊m'-pHkQ 6lK|+  @Hk5|_n<жv#m=wNY&|ߛz҂կ)+u!31QWWW)M@%l]%@�(Ygiȴ]r%yxPE~Ow9/N!bϏTϋ/E"V !қ,*[e'TIo{n[D׿uezF@9<^Qqk @�^{mwqq oBؙg(tM+3zy)+kHo7o^'?iHLvk;)~ם8ꨣbĉ?!ug&@Br^3;/^gU8Ziv @�>ַb]w67R<c^_9t/>;ҧփ袋,Y=SL٤]�/ tcT iel PFܖփHomKI~zK 0h0u@- <8'x-mI!KZF� @BMM qO<j*ΝkfGm @�W#[ @� @�, tȣo @� @ p5{8c>|E"nn '=P @�jB51 A` q?~||1dȐ~=zk4,kSOg}6> @�:0ӡSVË/ j[:\2.я~oOI;7 @� "O`ٲeG/BF9%[ OZ UW]'OO3gNNH� @� 6o $pW\֭;/VZi ь}{qgG}7Mog |;߉k6?X~}||3q9 7ܐw7ƌ3k_Z@!m_~y o*ocƌXpa-oXOW_I'x<}w<?뮻k߃+B:iez@: QH^is!')$;'O;+͋äIb}[n%>%\_җgɃQFuuoDZo�� �IDATOwfVwwM @@? yUր6g]%tS%0{5kVW/>:) Q`РAyёGrH]픴pcek?1B7-?/;) }})x;پ~ʝwG}t̜9Q?  iü,l8#գLz)1qxqެS][@#l$;ݖ^cŋvwK`?yY=i4Kֽ@ Rt( pOV,t8. ճ ?:*fz+mW %8HAEojhϘG>?cG<z'@� @3:AQD@1SNՆ-|G^z).xz^*#@� 0qT@ _Tz|72mM~,?=Jf6W^O|"0aB<y8~V,cذa?/(@z}{_U+gM#FhWb� @�<^љ2zM ?~G}4#EN[zSEzlᢋ.j;7Rs3zx{SL&3<3?STqGZӻ"c馛@"?0+_Jr)|ӟo}Qڶo� @�tzAOlw}PzEaُO<z̘1mL>=׿Ƃ bڴiHDzDs̓<h/9F� @ Εt#(1wnزC/B~EzTozf_l6 @�::t�mXfM<sXˆׯ_ R3Dc} J @�TQj" Q`ر_qATyZ!-^Y+۸qj)A� @f53B``qޑO<T! @� @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(Сî @� @B @�(@c){ @�[`+wϜ}ꮈ=Ι6'n, HÀV"@�\g6�<qgDd[`v֌yWE-t sz(0svzx ,O!@�Ha_fnܟOf3z)kvL^ ) t(i4 @@R¼>p׏#]f=СUQd Iy� @�԰СG @� @@E=m'@� @�5, t4 @� PdCGO  @� @@ jxp4� @�Y@Pv @� PBM#@� @�E:y� @�԰СG @� @@E=m'@� @�5, t4 @� PdCGO  @� @@ jxp4� @�Y@Pv @� PBM#@� @�E:y� @�԰СG @� @@E=m'@� @�5, t4 @� PdCGO  @� @@ jxp4� @�Y@Pv @� PBM#@� @�E:y� @�԰СG @� @@E=m'@� @�5, t4 @� PdCGO  @� @@ jxp4� @�Y@Pv @� PBM#@� @�E:y� @�԰@c M @� @�~hmmYn]455埆J#&' @� @�r aڵgŊ)l>|x=::th^֕С+ @� @)`HAãZ?oiL],i.F<$Nmy>Ṙ6i8qb3K%C4 @� @� Ē%K?nK|;e 1显lIobĈB :eQH� @�'~|wos|UqIo;Fl7,b{!g<4>~idl?v1Ni t(?CzL� @�:HU,|nI<ҠYF1~B]|1)v; cşi?abvڤN&$  @� @@9*~x~#iH ]Wؽ)Fda,<$ abTLzN+m @� @�P܋C8 2(76ĐqX룩aPD̡#Ƌ-#cҥ)B @� P>F nH47Dk]C3Ҭ,thh~E jeuCjv%tLE @�(u-Yu.ֿf2ֺ֘hξf4fK֥�"+KaEgС3e @� @--)aC &K6gade9C}DMЕr @� PB,p45_#64g3RА Yw QN� @�J*Rz{} jl԰>%àGС  @� @iBZ>lH8duk.鐯cf:}&@� @�[!Mlȃ|ȴ ˳5}R}7eVlI]lL  @� @Ȳlg}eGZ<Cٲi.7WtI� @�(@Zϡ.琅 ً1vCS*> ٚ铎g܄]8@� @�'B:$ Ci!,ahʾgHI$78� @�@<xHBzE>!;+?cQɢ*tJF9 @�(@>! cС)6~_ M'XWС+ @� @4! *w>!NJ6dMb @� PFdCB)dHBՐ,OSERB] @� @� 2!-*<�2!OǺڄ]('@� @�%]xh6TC] 6CW2  @� @@ Z !ْ }]4Ffu'!j:t%� @�T ٧% ~nnɾڴ}5oIDWС+ @� @! y}fú,lHBIY&tXגꢋMb @� PVDI3G+ iCI3fei*Dl8֕С+ @� @iG*'rHW;-C @� @`kdL3 ufm՘&>YY";fCW2  @� @@ +2OzMfzufwkߔ}ҫ3cpS6!{ŠMЕr @� PB,uϞς8g;M CU#!gӘ˞h̎u QN� @�J(PuYzȂhf5dCD4dߍYfZ`U  @� @@Rx0hXbudZ)5gXܜВ=Nњ- l͇ubM 4S:C,  @� @@c.M.ubݺXd\}jiUY�Gcilb :eQH� @�'8xËⱿW^\ հdUsrm,[2.[>r9bi7S,k:tʢ� @�O t4atrx;Mi9<-wg 9;!5Cb :eQH� @�'Pbذac?ǜ>1fT#Ǝx)[nls&{g :S,C,  @� @@9b̘18cɲe1z8fxǤ}&'ѣ&Xt :AQD,k׮'|28crٲ' @�1QFśnx.bŊ͑ÇACN3RY:&tLE[n=#.\ c%n @� Н@z}vm?nf3--4>C ÆtNwС; p+=찘4ib 6<֬ɞӲ @� @@ lI3 wZ'С'J!0@>E}L:5ҿH/_>@{[ @�С?ݓ@L0!ݰ&Z[[ceݮj @�:l4@o 4(_8rݺuެ[] @�~> @� @�:l% @� @�8J� @�la+\F� @�t/ tQ @� @`+[ 2 @� @{C> @� @�[) tJ8 @� @� q� @�JV¹� @�^@н @� @V e @� @@B}%@� @�R@谕p.#@� @�:t( @� Bs @� нС{G  @� @�:l% @� @�8J� @�la+\F� @�t/ tQ @� @`+[ 2 @� @{C> @� @�[) tJ8 @� @� 4vQ лs F?;vl- @: Լwc#P$ٳgǬYdm%@�5! ta |3f NH3sdnXu�P@ЇnE�2 5).?�С !� @� 00s\� @�С߇@ @� @: q+ @� B~ @� @�S@00U @� @@ }4� @� LW"@� @�. t!� @� 00s\� @�С߇@ @� @: q+ @� B~ @� @�S@00U @� @@ 4{ 4� @�Z`[}i/<~b!B)/t(0$ @�UοFOٶGG̚V^B⍙ @� @ fL.'BQƐ-t(i7 @�5_P-$YR @� P(CKc  @� @@q+-%@� @�:j4� @�G@PR @� P(o(pi,QŋcG�(С P 8<sj @�zG@;j!@�<xp_--k֬)CW�F@ b�� �IDATC @7Rp'f5[ܹs0 wBv' @�lV`Μ9=L')8U0GU @�(wc 0{5k  :pM�kG?Qmc=h>mehѢ}|͵L"@@f̘QViƇկ_P}cw @�qcǏ>dȐM{'nָ袋~׿_}]6:.u�L`ԨQ~2C/`5� C=p@g/Ʃ̋ƵimmqƵ+K�\@йR P3˖-%Kl=/BtKuO>=}^z!ѣcĉ=  @�Wg�ԐW\\pA[.;XjUv 'u]?}/>Xre^^__oo[Uo]vY~?gsΉn!o?`w*7eO?W_}TZIUH�:tI�{\zܹspOX 8cN+2=o޼H1L4)_[nq%Ĺ_җgɃp?A[ҹiQˇz(N>|͆۸smw/ zz�t' tN1  zGFz!-X?Q9/^{姤?:)1xnտ;x;YVAs @@ zSm @liiilgvˋ/^˗/ÇwvZM<9LZ٬^+# P Ie�J!PP \$@�X@d. @�+獛:ujcuuu`-#@�+Բ@*aAjիf777M~H3+/'>Q9&L'|2y䑼gmci6lX J7X̜93/GzG͋+ T 6:*M�vin1|l(С PpJV6/{g_ӛ*қ)~TNJ;.v}ѣG{x'/K3l;O}*o>{7tSmo~4q]wWmIOJ^/LoH @@'O>fΎ8|V8Z8CL  @` ~>mQqzE]QYǏCcƘ1cӧ_X`AL6-ҬJm祷_ࢾ>vqǶ;f͊k;�: 0#Ic,4D(3`: ء1(@kkkմCW[ZX oxCC06Er z*U2 &@� Ν+_~}>s!U&nhl^Y+W: @N K @gk֬{g'o1yNꪫ]zW 6 @@je$�@ZgBqoln}zVmQ @tB  @@_ q}}K58y"ּ.c%.i @` ^Cy[G � SGg`){+tDG�OƝO,ϝp�e&t; @�6(j  Һ>Je @� @` \tjuPP-Y @� @<l0 Ε @� P<|;K5zRM @� PP`\5meNZaqV }MÇK[ @� PK)pmc=N=뤘uā$C) @�Ԫ&E0/6jvp|訃^بV̹)lС&@� @�B e_9ox]k}'7C5uM� @�qo;Gt+C=  @� @鑊ϞBiC-6 @� @@ S :pM� @�HL;ضMj @�C7VCo(� @�D@t  @�OE<u׆OYO#&aݟͭc]6VӯUN[3fBC @� P2kΎwՆN9gFS*\`'ϼ3?8t V#B @� @@Mr]>6b7.kkv?^lӳСݗ� @�e8|o<9b:yM i,ծСvF @� 0_c#^ >-PfL5w- jqT� @�eh,xH.EL<8^yXpa,^8/Nw*OiWGKl- t: @� l^{D7׾<yr\xywv>8x\^hi @�P`msK>=Cw{S:}~й)eDmQǫÞ :~ޣC]li]t 1(ضM@m~&@� @�_ɯ7Ci?7]Hcd}}|nG|&Fs'=m\_+xE  @voxve.[VQ*[gD@% @�C`{ @�^xE0� Pu#8%+#PnJTG-?:QBPT @9;blռ  kiF0g+xEO  @�\uZJ]%@�!`G @�o1{hQ1svĮF<;cwϜ 5V{m  @@ m @�Hwvڜ3#ޔt^oMm\{z> @�+ tCc @@f:,[q7"{~u.+%@�>:  @�@ #"j/L?ae @@ jxp4� &[G~-mv PK,~ȑ#c8cbٲeQWWguVwn/| Oǁޮ�@I @�. )<fΜm޼y1q|N:)}Ѹ?SOmkdz>>`mv^+3Ε @� ᑊc/w @@/'xb<sLJ2eJQF+WǏ~oa 4C߶]&`C @@ z@{1r|5Ls е/C ;nwi7),Z( cƌuhiiѣGor'u,X ꪘ<yr~9s"-=/nR:l @�o=܁�(+ߞ8iҤ>|x+Vlt,�gqF".]7pCW\\pA[.;XjU\s5'pB\wuձͲo|7*J!Gzb…񖷼ec~la\I� @�ҢmܸqMcĈmWw_,<8[os9'.|saDzcƌq7wܑv.v^xvX,[* tR1 @� @@/R[ykkkv i-4 =cFz/?jHۑGrH]6H @ :;sbTiP@谅`N'@�%>/o|tbHk  Po[zX~}jTo~3ߟrJ^fH駟狀M/Hi6DeKk;<-r}jOr. tvC5 @�5,]xqu]y+w)阍�zO`=g% iǴ>Be??ң o~ g+"셫zuE#?Dz^{핷'63-*޶a66?W @�+}S;+k>l@Z_rۅ<@~ڙ0aB=أmԩ5kk+O Gk=ٶ {8Sn)EZ2m:l @�H +c镟  @:H @K.8Q>%On{!͈H RR]W&V !R Q~Oꨜ#{o'tR=}C1tЍl-:l  @� (f͚hEev;oiJpz,#m;N[ia wc6 @k;N<Sy{HBZ!{3lQYiBZ_aσyqWFe݇E]v}zfz#T誎_?7|si- 㖛�(>n׾N #}>>k^O??}>*@� ?\H ?~[guNz#Ez!-fL8g}vO- >xHv}.hmOq{G@;j!@�j\`0KLmG7Q97-ڎh:d-Z @=]! >lSzmj7:l 0 w7٤+3 e_XQCbk_?1۫^6z҉jmpyNg p @XBb @�= ?5eяS_O:#7<~ð @�  :pM�l( @`b\J� @�t-`C6 @�E"DQ[zLxQ@PQf @{7r�+�- @� @@eu}&@� @�} td @� @�e:q� @�С݂� @�Q+8L�J"dɒW?p92~hnnc9&-[uuuqYgՄƢE/q7D4�la[]O�Ԥ9sf޶yĉz*N:xG.wqڵk㠃6i�-Wz @�xO{.P RL/bԨQ57n\MG# @@o zSS] @@M{r2dHwqiv/xTsx;=־0=ji=rH=m&FW)'@�ExEGM  @�.^y啸&MÇwz?XbE۱ g�i퇥K 7ܐqW\֭;/VZ\sM~ ']w]46nUv3; @$B n @�E#+[w,Lj#SW^~c… <8[os9'.xcܹyߘ1cFxqwı. @,B~ @�Km=M%dK8u vutرcn3fL 4(#HDZ=nO\�A@PQG P"}ݷ=P_>5f*7wijjSN9%RH駟zM/FY9x4iےz A�an @� yL=G&&Osqaśw0{'?N԰2b[:�ԪWh Ui/m>mig„ mc|ԩ5kk;lnnnުgsq�E@PN @guVE v%o\<q;cw΋l#/iȴUBHT~O\;=Qy4g i>(+:rM�t)PWW^{mwqqF#后yyn_{cHaĕW^ 7Ư7/~򓟴?R3շw[Ov?O#3m鱐>;3L @xB⍙ @�=>ַT46n?){xcС1qĶ }oi=.}Q]=̚5+F�vN @�N;6փg}6wfV= @@ XӡH @� @@QE9&@� @�5. t< @� PTCQGN  @� @@ j|4� @�U@Pԑn @� PB #@� @�E:u䴛� @�ԸСH @� @@QE9&@� @�5. t< @� PTCQGN  @� @@ j|4� @�U@Pԑn @� PB #@� @�E:u䴛� @�ԸСH @� @@QE9&@� @�5. t< @� PTCQGN  @� @@ j|4� @�U@Pԑn @� PB #@� @�E:u䴛� @�ԸСH @� @@QE9&@� @�5. t< @� PTCQGN  @� @@ j|4� @�U@Pԑn @� PB #@� @�E:u䴛� @�ԸСH @� @@QE9&@� @�5. t< @� PTCQGN  @� @@ j|4� @�U@Pԑn @� PB #@� @�E:u䴛� @�ԸСH @� @@QE9&@� @�5. t< @� PTCQGN  @� @@ j|4� @�U@Pԑӻ=��IDATn @� PB #@� @�E:u䴛� @�ԸСH @� @@QE9&@� @�5. t< @� PTCQGN  @� @@ j|4� @�U@Pԑn @� PB #@� @�E:u䴛� @�B-r2 @� ^ B^> @�(@wBw,]]'tN1 @� P"B"~ @� @� ,]4z($ʹ/rbBNY @� @� ^:+VtzСS @� @|/  ]B:�8k+q0qH)YH(Ȉվ]e BqqpğEH / BKDb.*BA^ K^Hǎnwqet}kRէUO:� � �@`rrmtteXn{@�@�@� j5ۺuiT*Aagڹsl͚5c;Zڰk@�@�@�h:n(vwC'Ztww[GGGr.B!� � � z1(L(Jv7ӧ٠YB(>===BAOd(G�@�@�@ g  BmÆ 622ԭ 4AK{MT(C�@�@�@  4[(,bCrI^Nm � � �P 1xP W a!@�@�r)ry\44J< Bc8İaA+B�@�Xl@� qzQ{쥗^ <h[ %.Dp9!� �F;~B@ G+Zp߷!{_ SbbBlG�@�ȅ@_W~V.X7|c o9r>|ضo߾C0䒘 @�@�@� T*ۻw wmlllNB/@�@�@� <x~9 .\)[W,$C9 � � �9xGZf/^jjb1K!tX � � � C=*^[|E|bii{-H� � � �$"� � � @vYr$@�@�@�H:$0XE�@�@�@�H2;K� � � /ZT*MHjH  ڦ}ڬz{{^7CC @�@�@�ȟ@\ݻw[OOOxLZW葙óloo7 $4;v!W4d@�@�@�V*@RAޏ� � � � P� � � �+`L ~@�@�@�T@c9̟5ʖ2:,E}@�@�@�ȡloi@jzŃ>h>"^(; � � � OGyĶl2x;v)[B2#� � � sV۳gwCv__nIp9!� � � cVipp~Vhb; � � �9P'?ovK Hr@�@�@�h$n/i<rbY,4-ewP� � � �M+Ի! *uuu 8,=#0tHj� � � @a1ti=9FJ9I>B � � �X@J(\V!hУA!bOG0_ � � �T@w}gΝЃA97!.b@0\6 � � �KX[[[.tttY=bo-c@b``ᏠCC @ d3vR+-U)\n]H?U!.M΄�] v?UݨTsOjj mk@�bO�Ս]Am呑pnev]۷o?<Yvŋ_}فa9Z@=Cy9Qm_}UX*| Kjr%#�A@1Ԉlj]mjב~/QGZ K}5iꆥ{YiQ~z,9eKvݸq #I CqV;Z~G_Bd-v[uY:>˾J6:\A G `V"uUR8|!UE.-C؝2Gd\* А});[_߾ٮXcmA_hvu^ξVcU0}^QiD|Zǘ9(ts)EM{r~=mG~Wׇq=„�Q@5i{izQ=KfQӗۖ^#s8|h/�؉X@Tѩ" ^+t8ydM؝VC2xȣ׌�P=G{}=gV[AA7<pE!B` vAQ_GCgB6tծ1Eϣ]ҚˁM|z֞^Cȵ@ b nG`W2N_[b#1%!kQ@ Ċ'TB~nĪr TiƊ3˭,A� <v}yobG[BO)AA5B[oCz7(tPWaaתSlQtËV/V:ߢKկ ~m>CwzAƖ-\Np Фpqw5éSlƍ2S&=zć~n$Y轐,u}y;؎;`ջ!smwBy!D�1TPGU+XB:A`<W @ 1g_4KNTo7<1~70ݣaS}d A!EX:OA V K*AXFZ:̮﷏wz]Ҩ2BȻd/U'jqpv݂oڙ3g쩧 J?g}f<{ウ(pM?1B 9 *ơP)V^M4J)qӡY%p] Tݒo5u_[,و'8\I=SA]IׯVv`؄72˾UC-Rs̼ǨLXwq(y˲?3~RpZڥ W<vM)hx_̞zIP"x O*ϝ;gos={n Q+tU^sC֢&PePD9\cQ*'C<cl2.h(j]ӡlMn-ZnP JލփN,^>8Ponbg}^W0aP\,B_c Wϫw&<ѵ bqZ>)VX;@�IK 4ݡ^kzgnxW… sT7zK̟TR^;v^ySMs/%CV&!*CUFzI x[E\,VWS\�4o 6vO]Qz`aqdA¦^-_ xzۈ"z= -!FG Vk֑vK:_\>1X߆l@5 '8h:jCvlT,|vY2 *?~Nx{í*96/%CV&_b+E55^ZWUMJe!�A@!5\c}tb{Jz֊wO&T0>=  R2N/{:cfnI4{牟oew:xOQꤏR ~h)L @~-yq=@6wlSu瞳#GomgϞ4q u&ߴi=vM7vY:d1hbU>O*NHF~Zί�)}֣!vӷѲ{7/t(z/Z=t!Dr(u_*!p=0ƃV0Co#s-L7yNm=vuׅr=�E@mhY4e9֗zmn B=EG'AqФvi?WM 9V LP壊JKUnԓ+4LOOO(SyyR�4Kt}pY;qn\w?6ӯo;N = t[}�F BPpAR*D >X0Z1¯4sN C(KcS6y3v-j6' ~ *>k 1o4@KBvE%CNO<Fj@gs9B 9,lPE+3-5BFU@"v6MBkf h$zq˖-?d/;yh7juz=鷡y�  MVxLc5hI+GQF=|;H}mxC1j-]x$se|&F&ۯ&7\ ȫ@ T}1ԞV[Z7GcԧOğA?CW^`a9@@TؠY&Zѳ-HC T\D�U@ ŵk]w:}m|NζDK >z17@XPOUu a0ISA= <tW<g ??sj?٭mg얿݁Ѐ&{Oȇ@Ӻf.Pؠ!N:>k =r׾]e5B=%VE=ދ@& BJVXI)xPFv,s%"� Klppv?zPXMH\YdBtޞ8%y51sN,kq}mp_>Һ% ȫ@ CCC }6}9NcbKG]lc;nh}% C{䘼D 'Nh+2@�VLA53!�LO8:ٳ'@=)E@�@�$?o `w@�@�@�@� h|;@�@�@�@�>8?tx{P� � � �\lm6+Tm � � � 0+N  � � � �C@�@�@�R) @�@�@�@ B,9 � � �R$ � � � @Y(r @�@�@�H :H(@�@�@�@�,P � � �  tHP� � � �Y:d1@�@�@�@ %@"�@�@�@� tBc � � � @J!EB � � �d!@萅"@�@�@�@��C@�@�@�B! E� � � �)B  � � � �C@�@�@�R) @�@�@�@ B,9 � � �R$ � � � @Y(r @�@�@�H :H(@�@�@�@�,P � � �  tHP� � � �Y:d1@�@�@�@ %@"�@�@�@� tBc � � � @J!EB � � �d!@萅"@�@�@�@��C@�@�@�B! E� � � �)B  � � � �C@�@�@�R) @�@�@�@ B,9 � � �R$ � � � @Y(r @�@�@�H :H(@�@�@�@�,P � � �  tHP� � � �Y:d1@�@�@�@ %C @�@�@�@�+Õw"� � � � P� � � �+P[+b@�@�@�~-XC�@�@�@�,鐥&B�@�@�@�(@O(@�@�@�C @�@�@�f$@{@�@�@�B`GϷLMM@�@�@�( O+t[|nM̺"α\,Ki~브eɥ֙@�@�@�@`uKYgUKzr~z}4'ŲnЎ'|!B\*Dz\*D۴AbY rzqd � � � +, 9Ű!TIe1H *Cr9Ѵ;����IENDB`��������������������������������������������BoolNet/inst/doc/biotap_logic.png�������������������������������������������������������������������0000654�0001762�0000144�00000107327�12122071020�016475� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����[���D��iCCPICC Profile��xZgTM0 9Ðs F$A2"�DEE0�&"(b�%b~gw_:uޚ;\�$NxQ0� ,<:DBƽ|z66(#6Rel=77 ԪtR0#�@6%7޿qMFtOU!X:bk�ۘƌoWd��}W�H±>}.d XpߠpDE� ZF � @%5+\@x!w@e_�4-/dl�4sK6o<!QJ "bfss^�\�녛5�� d8@(5v#`8A@82@.(�GAuh-]<�x&;|?*A81A$IA :A- yBP%@iPTBY j:>hzM@wha",`; ~8 > *Oq#�ohQ(2J GYQ~(***AU.QwQOPoPPh4͇Fk:A@A_Aw/5 ÅǨaL0?L4S c1X+Ua8l6 ۀ}p81灣ppgq7pp<ύ$| :~DCQ1񤉡ɡJffH+HAkMG@[D{9KP&|ńBa0O$Db81XMN&~ґ4(ttYt5t7}'ҋӻ_�31h280D23401%A$>ɉK*&5i};7xv02313dɬ\|yyEeA;,Xqa-Xظش<پ3;'װ`PpH̩y< "/W0WW+n, 7;<7O(O -j9y_a\5G;7$dWr&2�T ~e!!;B^ 5 \eC)',.)*~X7 A {Lv9I~I[t6OR|RRRץH J;HHwH/Hxɬ*ɞ}*Gӓ'(V[V>[K~YA^!@R"bbw%I%JϔMSo*/ȫVWRW-P}UWKRkW~^F+MvMfc-:-sl{;; wֆwj'kwho$M vLyGgׯOԷ/6`3p2(7xc(`gxpH(ڨhxqq IS! K?wi:Yٔ^6 `ajQ`’lhlbog̚:z»wۢmml)%QX(_EY7,ʜf՝3D2j ݏPxGzOҞAOAh{^^^L~>DO+x_7f?%�tK@S 6-%&hOе``!!!!=ܡQ„žˆgODhFG|P{6E"#x⢆sgb bbbccG(N*.;nfx83�߁c ;V]o$q'%$%k'JLL>(t0LԆ44j!C={22r3fR2۲xf϶naIș5mc;7u|wG,\--H/RPQ$^TXR[<PVR}p41cW_:}Qf2OwN* V쯘9eR*jڵAfZڜڕo=SYOO_8w9s7˝i`mjXqa/_hbllZk<2|y+W.^Z~Zv+Ժ{[PdKйzS[·N]Aߑ݉L\=3ugϝwGzzY{gw~; t?57HQc=C&C}O̞<|jtӳ~g_2ʫQhXkק9?0:3qwbrxejj:xwOΈ\{bvǏb>m|f\EKWïܾ~823~AmOKyia5n V.~}|cl3o,7 cXs ={.\ G=�t�0@@o( BH!x#<(EC X!=(¢p|łڇDۡ0v)~;M#C@K&ӛ3(ȌLh +]Cӂ+;2(?!*X-4#$(/!',&k*W(RQ@GVeR[٥5-c{x}aQ S.35Vw iP,=ӝJ/rtt$y|t|-\WFG(Q2GD6WcVc7x\ BIdL4t桕̙79r==<\\8(t,RZȩZwTJi3qg ybYcf)W]ޮvM[;;C»z-uUCGCO;6=)|~EWQcQO|369617yn*xZazw'Ψ}|x0QO?3|r=?[֌77�#<$  Y"P `+^GF6O?GLBƈ-tA $EFN&:<golK웜D.2w/_ 5A&!k,^1NDVyYSOJ{TU[^ii׮y'ojjod<`tՌdNԴ2qi`N?\RZV~ʞvn>S~Z%8i+DHP#1T++KNKLO>ȖJJ#§73V3rsym..J)>K<'wT8!+!JJi]z. yѷP3ErЕW[qmF퇮DҾ}Z\`N˽}JBH{8w0{(Ipgԑ/"_ƽJx&f<lciz[wg>Ϛ~d3gY Ǘ/_~s^xآҕ_U2@hxaPY1PY;DE@AYщ; m hDhn:.*QC HXC̦,t,#lknpuSg' \Vmw$I.H=n9!O"@0إt\9LEOEZzVھ: *=aQn]s?8jioi5f]c[c;lWC7rpsp*vpvp6~#eלwOoz�sAuC,BC*PEFDMF|w0.`u <$dTF_iˇd,gqf[/vħphűbeWU(r^K㵸:gC7jȿQ-Ɨ^%\noߍ$[m {ݵ gx>``:{E;vx<yjq3"jk[{V�8@�` �Lh9{C۬=9p'GΠhwt9zÍqc^c: .׆Oihi=E6AG&F cch#H ^CL:L üՏu.}?qrœE\\7! z+\.pbE\gJ0Ȭ.?0ZiDy@[ZYJZGvdj$f,k4xahl"oJoVm~⧕M'vݔ {Kv6\go=Wq7wǦ'K['į?6"0=d4t%'b'oA=*&D$N"&2EZbή9RXX,\zRK%|usg:VϺѥɴE 'ovޱ'%.<~)0Zfפ[s׾~Wg](|WJ٪u3"]ۿ&HF+ 0k‘y-Qh7tz# 4`cհGUfJGHNsՍhҾ'h DMb 9yz}8S Id7FL32Fl8*؅ٛ8t9887ʸ5Gyyy#r`PP1%u^#RRRC27d/5_TWSR.S)R=~PfuGvN.ug^~UA9. HRo|6ֻl.R)ҎN.n9{*=y {/ aBLBÓ#ޏ뽯8wīI):3Sҭ2 2I95yՎdL,s9]*Sv$sJƪ:}.mlm*j uF-.D ={,>$>,LKQRno7Ϛ~-GB"yvycEvuǚ:n}`{-@Wd@o`8 C)Qf"&="p/y3ii}iG;D]m:;BHtQq)\b2ZĦÕs;G!x_MN-#,-',FKJydddf8MTTԞj`45Bwit+bbj\e2K,|R*]g),Yd.K[ X Z 9&~*rzt[Ҿrd/&˥J5NkO2,3K&sdsSs *^+v,?tҙryUkkO;+~ABkҥf$Nx67hocz=J_C?x@yxn`ɡOOs<{(X7'&Zb9h)i/_c^nN?--)/Z6^~KׅUՉ5ĵ+kם 776667)7{wh "B#"練$k0!51<j+ >z#wڠn!:_"V`Hc[#}!j@?5چ<)> DD^eNUD�jG0;bH~HqGg9 3Eł 0 V !1x$R#9a�S�"mQ Gp#`?z&1H~YȈ?6/Ƚ[m[/4mFA~V~ϘТhE ZAk�2 dhuZi�cg[ZcODtDZVభߟm \ܟ 9ȓXdN"y~�Iu%/n+WDPGFI?ipYi</ e\}��� pHYs�� �� ��� �IDATx`[սw$",�!FYʃҔ*i )PJKieQF[ H);MaHdQɶ[{Atǹ|lttOD?q3f:dȐ322F<&@�@�RqYII :=u%,Fs#UzzfimmRi@�@�L %%E4JKK;=~H{ס@`Z}}=R � �Ľuji{aڠ-f`eB�@�@ ,�mނo[62K:VBd3JgIKCMjF>`8P233%--M|>I~2$^SS#˖- Vö-((1cH^^SuYwU[Ryi3dgr[%3-G&o/O8Dwk\@�@�x9JbtEYŭ7؆A|}|q|ϕJaVukēN{!θH~rW\^ yi:-)Ý:RNyVϷ.IA2hd)[W*uU rԓe1{uYψ;cx,"+XjsMq[GQX|YV' {M-CoP* ]0d6]\~@;;R|"`KyL>|Zנ]k@FX&Yf^Z, AP,WVnR)-)qֱޡC: z)ereƄäF٣7/er;whh}>3Ҿ@_ }̻ryyi~\v>A"]'r|<'r {(o;o]FϾ@fʉ~.h\HneiΔY S9Du[Oܻ,z탻ϕL?pU O_7R򶠦7W{oZqȡ,gO"<|ջe^1?Z:ion_ްe/EviՒRI{M R~}4YM(YKiR f!N-[~)YYκ6΋4m(Gϗa92`lJEZY#ihr/̐IՑ&d>1'/{S:r]sOs[.MÚa!; ۮʮ~LݗS@rw7ݸL_ >k}D&5KZ!Oy1s&a\t?[U˲ޕ=~$EB_e[:~)mW#/?"W9dcKw[?%GL,+_G㯤~}CnV@'NMaMk_zU밄kEK~Zu:7󥒹T2&R愙-//;nmiKC}յ)++Y6c/eIH;JN^dDVȇ5M:ԡEK%0M,Rlc`3!zdjFl;YrR7OMf4g]!Ww9p?󝗝)?DNn kmiMhoW:ԧ}~i7_?H _U5dm֖̉r%XN*~cI}Ԛ<gSϑeO9NNc|iwH|E;;nmfK%"R|z{)zw@^O_uSGYIum{ٶG_(S|R["f&?m}a RGW3tv ɰV)> m[re)2L;lݜϗtZk'05v;ֱumwyU ȰRԿH{$=/uR^R_ ('!m,u|DXȆj(_'lpz|aev<A_z67WNe7<|~eW˿;^{v KS.G*_<D?x-ʫ+kS+/̛~Wp2u~Y՛y,;ږoOJ¶C侏۵da,XH^st#T[Z{6ʪ>_ڶȼG_7Rk`۠/|~˟A|h~:w徳`eYimBq+1pܴOEm^Σ: /5_+?V7G^X.^ӦSnNY"c?xI_S"zHJ)+Y#%5R#nw\~yU6tǵ}w?RDJ7Hm]TY-eZdqF+,׀lCU`m "Uvt\^X|}G<TO$Xc\ ֛k=BvͶ>sֵյ!NnS(E3S%Cs}4rZZ3Yj 7e6K6)nCA F)ןw|/?;:U{yRMrʰn@1`e<u^Oֽ/_4Hׯɵ&?vrW ߽Q .Ͳh/ߴBb!_226csiGQ"ʊ)sl?+cϼBq<ytiq9nUͭ2uVrㅋeyio?@|Aq8&SuHt/e]dnŰ{w!ſ g,y\|rHޥx}O~r/u7j/}wS\sCk5e|`s],_q;vW9͛7s/7Nϖ/8Zμt<1wtRdkm8'/<#{O"yKޫ cux 6Ɋ E&B&'kmz\ݩ3j}rźWF^?rȌ.\=eGʒU׎<HiJ<F R-tqMʹUt`U45]L߉a WcHHc 77ނ=pYXu:knf3!_gX, )zo#["uzk`ޤZ:z:bH(~p"=9#ޕZ3foKhe<(m',2VF?MR״Gmcm*ԓWCOrMO(B88&p2 ?[);IOutC^z)?k[񩓥B ND^HwiK]42vYZr$V w=Q?e9Go&ՍMrܓ܇Smw}_/lّ˅ &l_r5%^,k~ }+mo%<2FSN_]~RpxncTJ~(]{~vjH ݋^;"c]}eȷڃQNj\,9\&(Ŵa2y$P_-um,8%t9RM*ێ.U-jArϫIiP5"%(=gdW^+tzԦeh2]nzV3QwLqhN ?|A}Zy�~#^o8m&ā@NnK?F+R\,O{wu#nzltu1bxwrX/ukk=nuzku][a5'teJvjQ2V˳h@C -mBz6%A{ #^t3eШP$MkoF rbn4G6_֟pS'ew6� ^ T7W9/Ϝ%3f9 5�tIMʯHnjycNJ|-r`۶L[5w4):iAo&6Vdɪ7c8U4s񿐢aeH[5>m H``kI&u6i2@-~#k &^ݦ)^^3I9n/_"gBJF\kk*Vaclm9nb9ڶ+S%[Mٚ>V~9xF~(I2M~}*e6:N?L4j{MsYs2L?`te /nY&tnT8\vH-Jm}KM&Zruw}ڡ2﷟e{/ tʛl)d0k_EEz7#k=|U5ҥTOIqv~݆mfܵ˗׽ ^f61$3߼ K|W*H-iuZf3>h$%c[oT{*`7KzNa]*~4-u{۷M^sH4hO?d=beǀC _/y}#=yij߼, ?yLddiS_:+nalPݷ?@SS:w~d8kk﬎a-,~qv#zYMommհ ^LR^|Mqt"-ăAxcԶ]K NL\M;mag9C]Bf~'#m4W^#5e!rGGH٧E?<W{;YxZvw:^moe6jH>3d}t<֡rF%8eןzZ@yR$us?(=jMz/*YnuY~3Oэ)Sw_J?|�ݣ gntciWucFJ)+#($E!*Nizz`Fޏﷃ,{Wʿs%×!;'8Cet*[V.92p \}XSNc(闱^uS L=iTV%dRn4R%GsĒ%/#tHo2uV߾֟Iv<aUg-8C{X T?oo'G0@˛~Plgzŀ} V,O})m'Í_?wtKoȟȩH\6̣C-7N~ᶩJQᾩpmoaSFQ'ș._"{ӱ=" wv@;[(?{}%i /!']u\9r.ô#\ǙL<\r<7yu3fEar̽0^VS*'M~5oة˰Vf~߻wkutw8} #w^i:J9B]ehusn#; *}Fko0ZN];VHKXzIQ2_lX WͶaĨ@oA):@Y;)6BZXq:vL{eWvMB^– ktxDncf!74s m]͋4tťKE^б6=jdzpi3(i L#k)y7 e-6Sxyd^:S.ګ>4.3/yrѿ'+njNˮkQu/7Bv~ 93oP[%ɇz' ʞ?-2/rSasٯܷ܀ivPW'W|\coޖ1~>:LթO6ߕcϹH}UL5'ԉDx bc½9.y0l믒?Uxz+ιa9fX[eϬx޻H~Vo /˪d1WΑ9_4T6Mސ4+s\|rƣm;$O{S?wiV'X'3XlzYeNG7ڛVqjKkT[-gZd[E[c~VәM M_וnfeǷmk>hH-v9:fe}Y0X,!Ĵ}ᇟ쬚R#[2>Lu]1_>VYcʖ-FVfcmB zs5Pۥln0lAuUs֯*Α 4k=u5 z-*ZL):T?4+|J x5I^Z.ۿXRu] 8y2t@sY%-: GVJ~LF J;THЩdĔX.+)2b%%O(2ڡ4_b竕z} VANϐYDoZ~F~u[u|:넗Voޖ,=io4ڕQIPP^Z]SXCbYW-WꎟmZeaC$E-^m`,}r9ɫ#iz.nE5Ӥp)LicB|Jܬn~7]-XϒZ,J: x mNRWl6LV:&YNRNԿ 97'C/*m&x ou^WjUuαJCWc E_G):LgX՘@ ~=؂#z;jHWo^Z M#C"*=q&cnmjW mx=16uLgn\TOn_.i{~K%In) kz ^dE?lJՓ;Sf=3tnI7ӍU{r!AhWMtu�} N]j@4j+jkޥjpKуZwڗ/]w0xf"&z4"oqNt >˃B`}7.Hζi"_6L#lۣtWڅT+O< @ &;#-`ǺZoY`m!5zq~Dg=k3u]&Zuŭ떹5= @Rf!9i^MY � ̜9(6 ݙ,ں%:䡬lM2,Z@uoR'֣k&7ܺ-ϖqg֪ggd ?wL+-#� OnnuÝ]}ޝ{w>tpB{nu=y @Ok+$8ܷ'  @tN=m � �ė#?(//__ � �t_`3zc~@�@�Hd_1!� � 7Lȇ!� �Kŀ� �  uH#L@�@�:B@�@�H :$a � �_^ � �I!@ML#@�@�  � � /7%! � �*P^ � �I!P84@�@@Ԁonㅀ�[EEWKiiŹׇ*Q<�� �IDAT3l�V$FraBkc쵑/'N}W222<("@�M||@�,gd΃W,HFWORn7KdAގ綋X ykk?o!f""<F A�7˒[25ִ^=lPdhe1mvY!gj{;QvSD3g}ˋ/(w�x#@7�{_ 4M7)>fZ ?3c /phX rw̆ @:t�)lúT<ԵkϧhCB=}V7f )6kioj,Jv|voBIOOw`XO0 �Ch/RH8>Iuܱ�ƳOHQ`nelEpz?ҿx<]>rivk xƝ `mp|I=TO/SLQGE\+'o2p`{Y�fB�<`G�!Pt >T]jQ&�[;LsZ ]ړ<2a49i'gtzG*ݍ%5HccL0A{=Yb{rGDUNݒWZt6baՓ:kggg3O@`冔�2dMUh�N[gP9GU;S5M!+{>km˱YQN6f.s6;#;}{k{_U鼍 kYYY[u�)</&tV)*41V5Uj[NotUNZ]VfL|irʾ_/:CW]#s6Sf9\^r W?دku<[_ L9rnvN]淴fCo[/pʹ[cQG%oV{~tM2g5jTVTHWr vMO,Y"J ;SL>].\^ڵk夓Nrʞ6ms5kPKN."O>M]G?yd]1ӞMM߭HJz|hzA@giZ,z93;G)UoS.kݾj +2a3t@_ۿO^/8O9^S䰹Jteq3//p+,+g)h7R24;?qz 5U+gdwn}>-o{ڶYc4z1q˗/|P^:-kNP7nwyr 77s='gy<E)] /8}g\"lԩΕj W]u%N;M.o^x<r'+NyVH[Yu}ozYrsm^nrz{́B <bz|@ @f*HM697Nvklη[v6Bw_ܶ߾T[%W-*V ɶ3wceY9V kU_<]M;TZ2߈Iewipnm]B{Mg̘NvwN]?p~Ph=3zgϞ-njq.w:6˓믿pm-tANOT/rssؐ:[c]Ǵ555R /lt^}oF( �=^jRlбӛTI1fNo\,]/itUÑw܌௫Oke˷߸<3M"9NO`ycvٯ}S=oT7][6ەN=T=z <}7O?LG& el!C?]?p-x҂~nvoa&ηa |M{lWW>e}38C.'D;;mҶ<+=x)y[1^]],#jQBo^[Mդ`ncpjªeM,2y\K<dxݪ/H~0I̖ }nSkz˽&ۏm3ڙW{2z.c< &{23FkM6믝6w_͛>,Pv}6t{7Zy#Gt_J'qۮַCem\  r-j,:C{r/,:Ă O ''GFu9j^V@ ,J榧H |5jc8T{ zu-٢mavOWﴇ P2\{}3)g[/}Kي/4=Nsjy]ŏ.cLmRfm~M8c+]{n~z硝f]ݛh!+k'X_봰iǭNq6]݇oѢEb'NͶ69moz|-qVH=`W -E4`Ҋ=ď33' ۫3Go6!Ն9XՐktN"_lw6/^*_Irc~2nU'Yκ'^z<_ɛ"v!|<}e|mP;J!ܦYW'hy7Cr\/x큍rVj빡pquc=C[䢋.rlwqS[g۶vs޻vmr�n9=555r]w9Aծ0k,]wo =QXXׯL4)ݷ-wkc m$^TVV:C mqZyy߼ ]x 6Lj@ *[S#fKEb+?w6_6 br ̩S Bu$w<ɢn!uM '_[&MمC y*fE]?R9Z۠AY6满t~m,LdA_޾nk֬qN7L \�իW;bB@s333o۱w^/e KaJAVf|`m zs$?o@s񛯖r9y'zT׀6\vL׿rsծdSwƵF[v{fp6O.lFk|^Dc>+`?vopli𵳆P)`vxN(r.*`\uvi_'ւ=v&[ i5"K=+ ~EstwtDzpDp'S7ywlC�k+xOWoE5!VJ~(;-j&Ch4sd5m_+;pyScJA�x ѣĨ w/Eo {s{GIz,=-1 [oM6:՞3mb|'/ذK{@@?yZ>]kok_2'/g}fy6כ{N}cf׏cB� zIY .`?OĹ,dB ^v@ <R =Db'Y7bYc7=. @�NpÌ{M� @tv5 � � /@MCL@�@�L�@�@ )Iqi$ � �� � @Rl:dee% D�@�^B@�@�bQG:!� �x.@@�@�bQG:!� �x.m@ R` 4RV)kVmH?qݖd@v INIFE �q/u4|QWX/5BoeC { [{1t,Ƃޡy29x_BF@�:[z|m*%խQ_VVHņjVF|O:.Jog7([G1R՘&O2M چ� [7^:zKJNk̘6^Kxֲܹ"}iq }x7Ujŷʻ%u", ><d � vGu<^ӻJf3vr$7#U{57Vȁi")uS44ZՎ[gay&o -R!Y9Ke2 kK@�D$:YpNd^2M-4K~iֳlX;TBۙ*nVHQ m "V묏e"YE;ev) �t)@품_zCŖ, r$ç!9xݔ;~-xz&߰D.rHѠa|`X33ܡ'-z~ERa帩 �D/@ެ}I}&.Y֨iÛ0HV1 nyno?{9yԩrGKzzz{E|I)-+uSG-{ddd/wX ٱzUt,mP7sURf׹27:kWYm5Zo 527cB�@�b6?Aɮ}駟!CȔ)SXe /0ֆR ^!g!szWm^7 && M#D':SN9EV\)_W{aÆ>7o444Ȅ ߖ y衇dwwG*kk٣ЩZgڒv +"}ޫ;-zQˎ{Ug-|F{ŝ^Cc@�@kwN^veUf|W^1}v_3jjj DfeO;w|K/IAA֙g)w .󟖠x~;g3fm&ӦMsG*Ywg IhT'c/?Ly/_J:uFr]ؗ @�H fuw: ˼+%Y;vl_7ܾn<pzD['뛚[Tn ?Ov5Xhv' W\q|'2vmulpܰTZt鲶EҵT^ڪϹz[ȵl\lWuk5s/l�Wp �@\v#_^:,4ilvLow?яdܸqb|\sXϟ;ٶwqT>[va5jG|\nClLӉ'(>`{QSgw?Yvi'97w:/_~Yϟ/ӧOz)2\;3jVHC<6t> NoKSmr}ݴW?w>{rkӧ~*X ֭<(/1r"o˼X~+rU~r_ےEԛmIe2}TU67z[Rx~1 �l@\38C֮]+=<裲j*SOjyg>eٲebg秝vb/[o}СC+>s|7/΃uɻܬ'ҝVX!UUUS'ۘUw6Y},?ξm;EV x .lV^h2j{S3,-Uunmӵi!o퍐㴳ҡ ɹ<Wj-P:mYo˺\{vm^ƯV <׋9v3=wםuudmm"� @n7|#/w}N/BZpKbkN1c;ʂmiX/\9g'jdNfzWz66[n쳏mW_lYsss%33SdaՕÝ"ZoN}j{h=6[ghtyRq ={s1ϊ)Lv:[|/pFZTwm[[x{l,,PTt_$ٹ-@�:V;s]&Eu;}^VcP;IMўYqxohpyWnms;^vk{q -ouNl-InY&b?~NBw}m^w|tB[ֶi@)bm(]>_q3ׯ[ҤZ&K/CC�@` S =6}Ϝ6,vlAYYYUl'rY/vzmx{Z+3tBW]mk˻2N^cniiiao`ݛ]׎o~yze|sI3]\\h[.;gC`;<gL?w{}O^ձyi[|ԋf4UW\9bΔ4Fu%³f9Ckr@�W z|N2am؃ѣG;=upwNzꫯ/:�nl滁8' W^wىwd~92:H[n#M]F.tB.c;.n }ڣk 6.gf۱[{z/˚=_9Gm6dyAF_!E{nmlw=Ǟ*w.eCҪݾm,�s93@�"q6Vnv* 5vEKʎ;d0ڃgC ڮEEEb[ =cl {:pۿX駟;j's9QVI'$v-_ v%Sw ;n.ۣjԆsts[l;3Ůa=vB]G|w]^9~ֹܬ-7+Uw2r49K$Wg2[OoMNVfH>!{̄� �[&`P\ֆ1=%,8ׯ]o]ᡳɮ`cymaa)"''z׭VTg[lW֦HSw #mߓkd)h=GȾJ~Ns<C{^c}og=>h0~)xqC]di{^{ll_bQ3xy+adaY2uHl7 > =<F�@KHv-tрNg0lk?l_s+jW^yQ]Mn ݏGwBnHukBպ^-qy)ڣ*eRۜ/^B$-�� �IDATWrY ^zvz'4<=-xo6hkRt2帙 � u49^hs2|'3c~^, NAyZ252rH^!baW1iP z{: u8X=Mu %ue Z]i6/s3?&@�^ !o7A9)2 M(-[ EY1yd%xV"5~ Y65eY2kQc9^f~L � @Bآ7G87EjBŹXYD"/-֏3$Z}ӳ%5HF蛁miD~=I~xi> @ |>wk$4),E9b6YǸ&dBOȋMv3MQ:ɘTGoo4� @GoGZfH`NT/]{t^9 ,+/Ov� =, qv@g! u-ix%6;/� �3J ꩀeC�@�,1!� � ߄?4@�@@�@�BF"� �|y � �$�7)3D�@� @�@�H oRf� � @5� � @ h4@�@` x-=bשG}r"� �$;]e˰u2N"@�@�Tۧ@�@%~@�@�Tۧ@�@%~@�@�Tۧ@�@%~@�@�Tۧ@�@%~@�@�Tۧ@�@%~@�@�Tۧ@�@%~@�@�Tۧ@�@%~@�@�Tۧ@�@< @~@�@�\li| O@�@�zKli-� � @hX@�@ .qyب4 � @hX@�@ .qyب4 � @hX@�@ .qyب4 � @hX@�@ .qyب4 � @hX@�@ .qyب4 � @hX@�@ .qyب4 � @hX@�@ .qyب4 � @hX@�@ .< @ .4 � @ x-= >/Ĩ � @\ x-= q)J@�@�BF"� �|y � �$�7)3D�@� @�@�H oRf� � @5� � ߤ84@�@k�@�@ )Iqi$ � �� � @R|0H@�@�/@�@� &a � �_^ � �I!@ML#@�@�< @�Q@�@�<:[z|}>'@�@�Ζ_ � �*@#C@�@�< zIa � �*@#C@�@�< zIa � �*@#C@�@�< zIa � �*@#C@�@�< zIa � �*@#C@�@�< zIa � �*@#C@�@�< zIa � �*@#C@�@�< zIa � �*@#C@�@�<4O+Ga � �+u4|=2@�@SӖR � � |=Ĥ(@�@� f � � |=Ĥ(@�@� f � � |=Ĥ(@�@� f � � |=Ĥ(@�@� f � � |=Ĥ(@�@� f � � |=Ĥ(@�@� f � � |=Ĥ(@�@� f � � |=Ĥ(@�@�4m)5C�@�+&E�@�]7v٨ � @ |@@�@�$ &Ɂ � @ |@@�@�$ &Ɂ � @ |@@�@�$ &Ɂ � @ |@@�@�$ &Ɂ � @ |@@�@�$ &Ɂ � @ |@@�@�$ &Ɂ � @ |@@�@�$ &Ɂ � @ |@@�@�$4$a � �[[li|[� � $^gKOo� � 8<hT@�@ zofl� � 8<hT@�@ zofl� � 8<hT@�@ zofl� � 8<hT@�@ zofl� � 8<hT@�@ zofl� � 8<hT@�@ zofl� � 8<hT@�@ zofl� � 8<hT@�@ zOo l� � @2@�@�^li9l� � @|{Ǚ � ���G�@�o8@�@�> ` � �#@g� � >>�@�@w^@�@�X#� ��w  � @ |�{@�@� 3{A�@�co�v� � ;qf/ � �},@@�@�zG;@�@< @@�@�Eli|L;@�@�Xlicv� � @DoD � �$�7&mA�@�(@H@�@�D &Ѥ- � �iX� � HD:@�@ �7" @�@�IHG � �D Fa � @" |h@�@�߈4,@�@�H$o"Mڂ� � Q � �$@MI[@�@�" |#Ұ�@�@ < @ lh  � @ x-= >i5 � @" x-= M[@�@�KXǓ � �D Fa6 � @b |x@�@�0F�@�H,obOZ� � A � �%@MIk@�@�"|#0@�@ u<i  � @of#� �$�7'A�@� @�l@�@� &5 � �`� � X:@�@ 7D @�@�Nli|ѵ@�@� u4F3@�@�so*� � Pf � �}.@C@@�@�zC@�@}~� � @o|{C} � ��@�@� oo(@�@�> ! � �!@ e� � >?T�@�@7>@�@�\燀 � ��7 � @ |P@�@�4ި3@�@�H%! � �!u4�@�@�@'ߞ  � @ |Qa@�@�|{6 � �q'@CF@�@�z"@ � �ĝ�7F�@��'jl� � w߸;dT@�@'ߞ  � @ |Qa@�@�|{6 � �q'@CF@�@�z"@ � �ĝ�7F�@��'jl� � w@ w�T@�@ 6Ζ_j @�@ Ζ߸Ӥ � �I#@MCMC@�@� & � @|PP@�@ }i= � 4ߤ94@�HnorZ� �$�7i5 E�@�[ǟ#� �I#@MCMC@�@� & � @|PP@�@ }i= � 4ߤ94@�HnorZ� �$�7i5 E�@�[[#� �x&u4|>JA � �-u4& � �,@C@�@�< zFIA � �,@C@�@�< zFIA � �,@C@�@�< zFIA � �,@C@�@�< zFIA � �,@C@�@�< zFIA � �,@C@�@�< zFIA � �,@C@�@�< zFIA � �,@C@�@�<4*FA � �-u4|>:@�@3׳VR � � |=8@�@� qV � � |=8@�@� qV � � |=8@�@� qV � � |=8@�@� qV � � |=8@�@� qV � � |=8@�@� qV � � |=8@�@� qV � � |=8@�@�4l%B�@�;(F�@�M76ɨ � �"_^ � �I!@ML#@�@�@�@�BF"� �|y � �$�7)3D�@� @�@�H oRf� � @5� � ߤ84@�@k�@�@ )Iqi$ � �� � @R|0H@�@�/@�@�4@ � �[_li|[_= � �$GF"� �ĥ�7.F�@�V#� �ĥ�7.F�@�V#� �ĥ�7.F�@�V#� �ĥ�7.F�@�V#� �ĥ�7.F�@�V#� �ĥ�7.F�@�V#� �ĥ�7.F�@�V#� �ĥ�7.F�@�V?#� � Vli|a+L@�@�:[z|m #� � [ޒf? � �}*@S~v� � [ޒf? � �}*@S~v� � [ޒf? � �}*@S~v� � [ޒf? � �}*@S~v� � [ޒf? � �}*@S~v� � [ޒf? � �}*@S~v� � [ޒf? � �}*@S~v� � [ޒf? � �}*i }v� � 8^gKOKiZ� � Ч^gKOoʰs@�@�: v"@�@� &α% � �|;a � @|X@�@�N@�@ qs,i  � @'NpX� � 89@�@o'8,B�@�HoKZ� � Љ�!� �$�7q%-A�@�D @�@�G8ǒ � �t"@E � �#i #CK@�@�Tli|}@�@�GliMfZ� � hD;@�@ �7, 3@�@�MhG � � ea& � @ |@�@�߰,D�@�H4oQڃ� � V � �&@M#J{@�@� |ò0@�@ vDi � @XoXf"� �$�7ю(A�@�+@ L@�@�D &= � �a< @ N� � @^gKO狶=� � @X7l� � @ |c P@�@�/@@�@ 1p �  n}c� � 8T@�@` |1{@�@ۻ)]DADy^E_ hH@ぉ$*`y|^cTOxx[J(**j<APeRC,3=S3"MtwuW}7@|K( � @|o@�@�J@" � �_Ɯ@�@|K( � @|o@�@�J@" � �_Ɯ@�@|K( � @R |lK@�@�*B 27TD#PI@�@� [@�@�|s# 씥��IDAT� @`5E�@�O7?7r!� �&@XQ\@�@�|s# � @`5E�@�O7?7r!� �&@XQ\@�@�|s# � @`5E�@�O7?7r!� �&@XQ\@�@�|s# � @`5E�@�O7?7r!� �&jf>E�@�(UcTL&Sn @�@ 0cT,). � @ VPcSU@�@|+; � PAT@�dJn}� �T�o56UE�@�*Y[#� �$@[AMU@�@�J ֧ � @ VPcSU@�@|+; � PAT@�dJn}� �T�o56UE�@�*Y-+_WWז\ � �Q� � Pܺ @�@ 'zfsg@�@�|SvVZOȃ� � @N@1b4S7uݖ.]jUUUV__oL&Ͳr,@�@�2PO˗b4So׮]ږ-[4 ʱ@�@�*Cƺuf;wN©* v!S1C�@�HTV F�@�B7f � � *H~@�@� |h& � � P�oG�@�B7f � � *H~@�@� |h& � � P�oG�@�B7f � � *H~@�@� |h& � � P�oG�@�B7f � � *H~@�@� |h& � � P�oG�@�B7f � � *H~@�@� |h& � � P�oG�@�B7f � � *H~@�@� j(%D�@ eUVlsε?ܖ.]jWv?U6uLƯ2."Zhg3֡ujkkk/i߷P1m5Wi]a? �޼?#9su d[hʕ+?p{饗~c=>h 3ſbʸGc|ߞ@Dm֬Y{%\b{^DYP1|zkmÇ[uuuAnmrsƴ-~maL@ 0 z5/-ªW_V 7G6@B?`zdž 꼡i/;gLӸ,?F+m߁?3@�Tj,#Fئn^TNA4V& ah\S.]O{̶v[g}˭sܒm%s2&mU؆� P˗/ `[MlM}5)WTk@Ϟ=sX:tzvWp nkؽq�lvuo/.n<sNp4:SO*wu!O?m{={[r5ݜ9s>p;`;vaȤކZ=[55a@�JL@'|bom+Va�Ԥ`aZsAԩSmرvwzUB瞮񁭯ϧ] *PooU͟?߭Jks}vWoo7|kn})Sֹ_ӆM4zuQn_e�۵^kAS&ikOcz|}K3G�(K>S(`XӛPpݤ al|}}4{w/u%(=BK`h\զR hy:Vc馶;vmg ,p9dM:Etn\OjҤIsm=M=sM=]vw}5 o{\[{צ2G l…'}hlO |%מ?7g}Ә׷s@�?3z5Uϴ*8ԛp*Ǩ;Dao4o?s\`[cÇ sfdr=j}c^{\ڄ#tnknziWZi\n^zG/b E?]O\[!zU|2(6[n_좤ْ%Klڴivgz,||:lyͳvɵϊpvywa=ә<jچfXwedi[Ν:k9~iz'M8h]s5fMq}nٳrAz_1^{5w]wu@glGc:m@�P@=Mo �u㘟ɪ2z;!D)i}n=pv)XƗx`:ۿ;zT7ࡇ>]6. @-mp+9|ӦېÇΩzTW7<BWѲPgg$픦s|z 6Ueg ru_5r7΍<ޮt ~}宛u<Tڎ_{~)G-cmȐ!nO<aݻum~ݻwwyFmq= |x �%#^Ot o =ћ.nbyN;w駻K.*~'Fjĉ]ϙztlwk1zmgϞ*�15>ӗ3ʫ:DjY !@&I+QI=Zc=\A9_}U7uz;qo\kkOcu#9cƌc/@t=nP_h+vG؏?h>~ӘW-MB�([iWpe?@tA]weW]uU yqSjRu˥�㏷3fӧO#G>^WU5ϯ\ڑf/}}޽{Ӽ__GydKOPo?Ve<*(UouU۷o.qnv~ɓݵ%'}tmw~HSme_<� PzCQ=jKO5'-+Pn8Sǁ;.rS+kmqL]cZuǥ8qux:-kM|JgevJٗIE7yo#4|C6S_g&7�>LeGy=.VuUoM2j6e G?62@f}J7~ߣ:7oOc_ @,'7hiS=M)=XPϖ瓾sPJoi<zl~t(xfKUz4AcU\tCBsM WuhM}=[Xi8o<ЍU闢'~nW`uכ|}禛nr=~';(�LtM;u']w?|w}>(0֤M郄m8 }^m;C)89 ГDSDS- |j!�n֦1 H7hMzR0UOz㯫{Dci3+Xֶnݺlٮ4iԨQ.z}Cs*z{e!S͕IzCv\m}5)`?3-~xh jK Ї7=Yק~ZO\מ:ˍ5`Ӣ'k ѷ6C׶Yk_Gvm'gXw;PR*ڿJv@�Ph7qWNwϯ\_n('C3gt?qOKճ8)hUے$CuI?oذa >pn ~O=TLZկw4WmOzV<)0Q|[MjݥK}]oxf;(i!=O> x`'b[e@�ЛP<pI'n@SU�P3>~??WЫ+b77W' oO*PLNm鬠=<TS]IT}{\ВKmǤJ6@�Pz4W\u~L zE4qCy u1bDM-V4ijj dk@ܡ-[Yw4uXlc lucw3@�2P�mճHG= ڊ *ܹsݸL5x`띴8i{ji+uqC=u^ � U\ՋoڼyM^S]OdЄbՖl :^?׺*MmWnΘ6n_1om@�J\@ftϷ/(h 9ZwbkkkznLwܷU_1meL[  �%({%uǹ&ŲeP_sO4) ~fo $߾miL_ @7M9|-0_=meǙ=9 @ MW�z(@ h8ϊirSg܌ � � h@�@ �or3r � �(@`Qd@�@�ȁ� � �oF@�@� &7# � @6EF�@�H.@܌ � � h@�@ �or3r � �(@`Qd@�@�ȁ� � �oF@�@� &7# � @6EF�@�H.@܌ � � (Xn� � @,=I@�@ X`#� �$`C-E�@�UF�@�H&@o2/F�@�S0ۍR#� �$7#� �(z|yoMG@�@�&b_@�@�`GSul?z}z?:MOɿs.>2 @�@�/G Z^-'GS|_W_mXM>sZs~>\ɯ7lm_2 � �>>*i7>W/jgN֯z)o|>h7 � � Pmqgssşzx]X";P+����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/biotap_initval.png�����������������������������������������������������������������0000654�0001762�0000144�00000110405�12122071021�017036� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����[���Gy��iCCPICC Profile��xZgTM0 9Ðs F$A2"�DEE0�&"(b�%b~gw_:uޚ;\�$NxQ0� ,<:DBƽ|z66(#6Rel=77 ԪtR0#�@6%7޿qMFtOU!X:bk�ۘƌoWd��}W�H±>}.d XpߠpDE� ZF � @%5+\@x!w@e_�4-/dl�4sK6o<!QJ "bfss^�\�녛5�� d8@(5v#`8A@82@.(�GAuh-]<�x&;|?*A81A$IA :A- yBP%@iPTBY j:>hzM@wha",`; ~8 > *Oq#�ohQ(2J GYQ~(***AU.QwQOPoPPh4͇Fk:A@A_Aw/5 ÅǨaL0?L4S c1X+Ua8l6 ۀ}p81灣ppgq7pp<ύ$| :~DCQ1񤉡ɡJffH+HAkMG@[D{9KP&|ńBa0O$Db81XMN&~ґ4(ttYt5t7}'ҋӻ_�31h280D23401%A$>ɉK*&5i};7xv02313dɬ\|yyEeA;,Xqa-Xظش<پ3;'װ`PpH̩y< "/W0WW+n, 7;<7O(O -j9y_a\5G;7$dWr&2�T ~e!!;B^ 5 \eC)',.)*~X7 A {Lv9I~I[t6OR|RRRץH J;HHwH/Hxɬ*ɞ}*Gӓ'(V[V>[K~YA^!@R"bbw%I%JϔMSo*/ȫVWRW-P}UWKRkW~^F+MvMfc-:-sl{;; wֆwj'kwho$M vLyGgׯOԷ/6`3p2(7xc(`gxpH(ڨhxqq IS! K?wi:Yٔ^6 `ajQ`’lhlbog̚:z»wۢmml)%QX(_EY7,ʜf՝3D2j ݏPxGzOҞAOAh{^^^L~>DO+x_7f?%�tK@S 6-%&hOе``!!!!=ܡQ„žˆgODhFG|P{6E"#x⢆sgb bbbccG(N*.;nfx83�߁c ;V]o$q'%$%k'JLL>(t0LԆ44j!C={22r3fR2۲xf϶naIș5mc;7u|wG,\--H/RPQ$^TXR[<PVR}p41cW_:}Qf2OwN* V쯘9eR*jڵAfZڜڕo=SYOO_8w9s7˝i`mjXqa/_hbllZk<2|y+W.^Z~Zv+Ժ{[PdKйzS[·N]Aߑ݉L\=3ugϝwGzzY{gw~; t?57HQc=C&C}O̞<|jtӳ~g_2ʫQhXkק9?0:3qwbrxejj:xwOΈ\{bvǏb>m|f\EKWïܾ~823~AmOKyia5n V.~}|cl3o,7 cXs ={.\ G=�t�0@@o( BH!x#<(EC X!=(¢p|łڇDۡ0v)~;M#C@K&ӛ3(ȌLh +]Cӂ+;2(?!*X-4#$(/!',&k*W(RQ@GVeR[٥5-c{x}aQ S.35Vw iP,=ӝJ/rtt$y|t|-\WFG(Q2GD6WcVc7x\ BIdL4t桕̙79r==<\\8(t,RZȩZwTJi3qg ybYcf)W]ޮvM[;;C»z-uUCGCO;6=)|~EWQcQO|369617yn*xZazw'Ψ}|x0QO?3|r=?[֌77�#<$  Y"P `+^GF6O?GLBƈ-tA $EFN&:<golK웜D.2w/_ 5A&!k,^1NDVyYSOJ{TU[^ii׮y'ojjod<`tՌdNԴ2qi`N?\RZV~ʞvn>S~Z%8i+DHP#1T++KNKLO>ȖJJ#§73V3rsym..J)>K<'wT8!+!JJi]z. yѷP3ErЕW[qmF퇮DҾ}Z\`N˽}JBH{8w0{(Ipgԑ/"_ƽJx&f<lciz[wg>Ϛ~d3gY Ǘ/_~s^xآҕ_U2@hxaPY1PY;DE@AYщ; m hDhn:.*QC HXC̦,t,#lknpuSg' \Vmw$I.H=n9!O"@0إt\9LEOEZzVھ: *=aQn]s?8jioi5f]c[c;lWC7rpsp*vpvp6~#eלwOoz�sAuC,BC*PEFDMF|w0.`u <$dTF_iˇd,gqf[/vħphűbeWU(r^K㵸:gC7jȿQ-Ɨ^%\noߍ$[m {ݵ gx>``:{E;vx<yjq3"jk[{V�8@�` �Lh9{C۬=9p'GΠhwt9zÍqc^c: .׆Oihi=E6AG&F cch#H ^CL:L üՏu.}?qrœE\\7! z+\.pbE\gJ0Ȭ.?0ZiDy@[ZYJZGvdj$f,k4xahl"oJoVm~⧕M'vݔ {Kv6\go=Wq7wǦ'K['į?6"0=d4t%'b'oA=*&D$N"&2EZbή9RXX,\zRK%|usg:VϺѥɴE 'ovޱ'%.<~)0Zfפ[s׾~Wg](|WJ٪u3"]ۿ&HF+ 0k‘y-Qh7tz# 4`cհGUfJGHNsՍhҾ'h DMb 9yz}8S Id7FL32Fl8*؅ٛ8t9887ʸ5Gyyy#r`PP1%u^#RRRC27d/5_TWSR.S)R=~PfuGvN.ug^~UA9. HRo|6ֻl.R)ҎN.n9{*=y {/ aBLBÓ#ޏ뽯8wīI):3Sҭ2 2I95yՎdL,s9]*Sv$sJƪ:}.mlm*j uF-.D ={,>$>,LKQRno7Ϛ~-GB"yvycEvuǚ:n}`{-@Wd@o`8 C)Qf"&="p/y3ii}iG;D]m:;BHtQq)\b2ZĦÕs;G!x_MN-#,-',FKJydddf8MTTԞj`45Bwit+bbj\e2K,|R*]g),Yd.K[ X Z 9&~*rzt[Ҿrd/&˥J5NkO2,3K&sdsSs *^+v,?tҙryUkkO;+~ABkҥf$Nx67hocz=J_C?x@yxn`ɡOOs<{(X7'&Zb9h)i/_c^nN?--)/Z6^~KׅUՉ5ĵ+kם 776667)7{wh "B#"練$k0!51<j+ >z#wڠn!:_"V`Hc[#}!j@?5چ<)> DD^eNUD�jG0;bH~HqGg9 3Eł 0 V !1x$R#9a�S�"mQ Gp#`?z&1H~YȈ?6/Ƚ[m[/4mFA~V~ϘТhE ZAk�2 dhuZi�cg[ZcODtDZVభߟm \ܟ 9ȓXdN"y~�Iu%/n+WDPGFI?ipYi</ e\}��� pHYs�� �� ��� �IDATx^U{ MIn41Xw!6X` (ٛeYvn=vw͛>ogoD@ B;|Day<"� � .y%qjyW_?tA!: @�@�Yf͚uzzdL:u>ꤱ1)+F@�@�0 V?{a~*@�@�Hz`W233ww4teB�@�@ ,7C{w_Ժ2u,]+ vɓۏ!"{\/5lXn]^^.K,ҍҥ :T k<r˛̑E*ͷQre^]zQQX� � ~\i׆;,#3s٧t_|:wRzX:SdSNθh644l2'ص@u=jRpwN~--K'?+%?zH Wһ[ol5VRYZ-'=Uw区1 쫅RQ0LFad~5ջok+dC$s@�8=-]f=yG2Slף8gGhZK/՚A X2h}lD2ʕ+eŊҧOݻSmذQK5Nׯ+-S+o+>< Gy4p)WxNuYt<"9rfm[G ^k?{Inq&PϺIzPyW[Yn+9l)<yȭO{Ҙ-^2d-1Eͪwe=sF;Snrn=q81$ov {?q˪w L k?NֲՔ/?Da?~Qc=h@^ưe/Cv)~%eo$4hl֕I:Y!K4mѣ%O{eMR=ugh[Ou-ܜ\䤵!v]ibyvL)/=IALY߸JT+4D:H|vx2 o`,@B 4}O~z4CSˆϞ _)ZVv+r}#֩{Ey~KS+.^>^u+R^r?)L}L.>p3l5"vڧdɛ:F2N;'l릚1m!g_.e"KۚayS ·kNL^ܴy]Y!үJ:ҡ ly_~#KN]gƌ:q9鄨ٖHݝ]7ogkS^^ƞ:;ww+92p"/̕\Iyib-ʒ]SPAlc{1?f"hU9Eg؜jRT*=&Zˮ?]Csɩeպ-6Ҡ_T3sށ>S; %oГF˷)m䎖- e}UKoʩ#|o˩)/^)MS\vkmHP,ٯU:gX z=M>A7j6Kd]e3Oߣ޿˶.s@; gC+٩'k~4ֈ EV8P]W~_.j6Ok]f ri|KcimwyK1=u|qwֽJvaTfKU:T!ݺvݺJݥu"żGˤMl,+%eʍN&8@8&s;ofEd+2U&;|N$^7r+wɌ)+2}}2oYEv*[le)o#~խ'NiYq`XOG>- kݗT!q쏥)ywe5E.gN +'s,.;EګYӨus<}D {Tdzglz`sLs|`+f.2j<q˦e3mҼ?slũHmnwgeur:/M4o }WȜN׵j-y}Yu+;[>~ANg~p?Ot1oR;ϑ;uS>.4Jy2eV{N[KAMuΘukTKx4nxpzx@M]V~tv\kk`*ݵzdsy ֯ hkZ/kֱ8k^7WJMt8';Sr2gsӺ:&CVo  $@Z\t=9?=ܞrOϐ?V^z Y3.KS3dy\w0)ž|>]|UX!C-mp uwrͤ#*#OVf-4Y|y Lj⯆7nN~ޢ䩋orv_n.,]XehOK_cϾ^MY^:eT?7mt帑u+ 䠋ʽng#xM~~)'3ɿ䣹2C_hҩQ?-ԿM6WOA~s뻟 *;XGt *<Jn~`t5tRYW-墻j^j3e}tˁ3uu~ҫsY6۬e崛g_ug~39-?N KY/!o;\.Z* oeI̹ESv¢L5Zge[U'YR;59\@μ^߇6ʽ'YRX^,^*zuu o{.q `!6Xkb ft(GfjBb#_G BnOVVzS<s=%ކ>Z@km;ekP:7Wi )#[mtcT5Kh@^,r:DS. aOw&g>ut=rCjɇ2S9頑RCteɎD;L $URVSsy`TgG$zY_$Eba]; _, ;La[ZoN~vyp9jz)2Tv%2/'YY.4q|ѿ5J )du\9wiGZ9P} l)Z? Mk~'|,eG_!_j7n:oWH*jByFq͒w+ˉ3^Lf~"iKri odٺ<T  OY39X@OS&UP]-jp7"G~1?=Q䪷#dTϹO"__3FUeRYdL yq,Kر2|�+](kU}$ͻAͪ-߃M~vMNM<9cLTgʕLW'ΐoV(;e.̲![paR~5  N\>kP^Djo 7 M/@zgF+=$9l=zumȺ=u[wVZڿk?=W.Yz(ֿ\错Lk$G*6k:_]!tHC sE@Oɮ\#L*2?-?#mlFRW \wme#L}Pl=;eE+uЫPW[M<s& k=m!~*wMI{MCaDܴnc4JN`T-:JR^[JmC4V=56.IWR>uM'p>ҭHٯݦ-7jٰbM V罿n^_dJ,`[&~/G /ZQįw)q;l|n//\%ǽ3*#'#UUk7%a6䴛X gj:5etar̩R|U2i_Ev~)m B*P~ye~k5zo5Z_+|Ϧ@;zFmyug:."\QZ);[~!=ohd 4r:"@ *i{Yr]/wnv^ xWUX/q{P,G]f̵ېAhLvP@{D9h[0+G 3;i8嫃'Ӂ:bM{yF@]\2r97M{<G{6Y@qc)۹7MKD{-*۠ׄ6iX1zM zn^JYu3f8Ue -XPv+_/NXf˛s5<24/I $ܼ.yaNңvBV5!=mN5z87VǨimm)yW=P^UnT 0kq=425Vy#$_mpP/nX-_/\!M:oMA/[QMw:lƺmg9G]BNٟ^h~J) 8TOde?P<=FfS`\~:^vԲNM˳u.[\s%)W[)@TM,Jt? Զj,A�Dp^'5Z2, _~-zЀW?ԻgAA5[?Utr;57td)pJ*Jsz Rnk=o28k+Ȯ;Ȓr>@r|9="h=t8~T]R"dDnxD +|P6PƏ,]sGf;EyD 1ϐ?˟~~t$'G6^.5݆ʐ|Yy I;o65wZ1p9pBƶ:4p`yөh j3GUؠ{]\|?r|/cA7 idq`sR Rײqν^=w SW ޑn/r=2HV4?8-mԠ=6U] 7}uoa3O'o& J#_E1i[I{H&3R*.7)r c |Arʍgʟz.?ٵvܖȲ5"n?nl}S-}r9r HQfXzn;Z66_Nw);jvޭm@yuy܏> o'u7<?GGVPu ʭMgx<~9(n [ ˠVoyQW�Y'KWae AUo~t;`Y+l ֣kAձkvޚ(k=D?oܑ l]QA:Kk!k -0vm8=- _R0Pژæ:,Lu?KYqR[B9ZG 2ˌ[  2G"W&}Br9AŞrcfˮ'\%T'W7?,njPalޕM=n~ vL?ΌFąz,h{7YdmrEO&-S2gowu2r5rO됆GMwO+*;r˺ -+8gos<sG;`qwhٸF#g}*}ڃiS?3B�a݆R}tR||3D/-2!>H|L~Tƃ&%]֭-AfI"9zڶmQ~K;T'sN8\F#P5|~5yXv#'Ȍbs6Mz/jC~G+ꛑhMY>s{vl 9sZi/ћ­1rÄr-sExO#m_X?|X&ߦ4_~sC'ɣ~@ qKgyhC'ճϾ^:{Q!|+fղNq]*4'hCMnk?4a-@nAfu] -(qx-i(Ųp'{.k9uUz/RZ0 WV~#^WVpnRнdV{,dJzTjuhO|YLt-5*,a XЩ^WS"KWilY[2 e\w,@.Kz*d^@gPڻcs$?Z-]7?s/_2tO>^iwqٖu)ӋzHuS]^s t<Z6^SFA/K:[eg6/rg],mNIo%vdUh{z_+Ef*?˗-S-m߼4Yn^ҧ{Vm^)%KIZ0ݜAh˗m_ZYVlmSu_{kSVao=/n;nQ0U2s尧n!~ٰb9ol}lHAﰑ?@I㾏-VRcS*u $?yꩧB.ز\n 5},z7|핵 P=:ańֆif⺁ua`m MYе@> W66|'Y5긻<=XﵻTlhU9$wL!DvrFS^g7Хn~byI*z&ZO˪1ïS/0TK<tzՔU{>d mвWͽLλyCPOбu;[LN=g9ojӌָhGEu?SCyfݘԮ<9GAzu}Dzo[|zv"_b.+ @ X{O<|KeY]{n 5(//w'?\O-7^] |su݉&;dv-uu`ͳ=# @vYT#C;zoZ0.^lu#HL @4 xc=-A| Pݠ3<@Ӧ46<t77]\B񲜡9 5Y#9y n]qfj/W,3PezTnVB�AInpٚi#ᦉ4\w14Uy#=w񺜑<@ V:5ἱJzW׏%@�,ioKX� � @R ؐ %%%O$e)4 � �-},eB�@�@ %,?&@�@�RRޔlV*� � <"� ��CRY � +@+# � @J dR)@�@�Wו@�@ %xSY � +`/ � �)+@o6-C�@�0^ � �)-n^*� � >@�zK-Z$%͆ »߬OvVpN1{"3SDثW'kr/Hn@�oDƑ\@ L݇zHf(2�� �IDAT#vCl¦`_:}Qae~ 4l>4R_ Wɣ-_1GPXQI�QJ7x r'L M]v=l9ioln[j-S26w7=8^dw/[.�l�=[ IQO?T&N,69&T 5 cruC]"9<{8\yMA'5u"NI ;o  �of�-4448u&ᵞ<`т)[pVAY`J&[&=}?o:Fz{*;8 @[5A�f-ȵ^7uOgC5`_rslqX_~Y#;4.5ၮ[ϋX+.Edv;KCerR;}bcyRU/RӘ!߬󉽏#W @ ƀERhv t�ݠ7KS7|>nMw?ٌrvYdww9<qWL}9恅Ijke)9:$,pokW-a ҧjnzx-mյZ{x32T b@� @4VA�`C v'wyy}}9{^^scK[`~?S/&5f]v=h Lv.ǖwT"_^rmֻj^{@4ؐ"Q+7<zv͜  Ƒ\@ L^5݊zEqaɜDZz=2Yn:+_wz>`~4)**rb wߕʑG)?qr:s<Io]{kIYY 6;dZ' Y`:U }ܒFoA]uMr!#eܗQ^ytgddж; FF찛+'ʊ%W_\>H>,Eo?/NdfeIN0'k?V?W-6oO}C>䋮]8B6-벯?_/K>t?|S:weuMU%e> u Ƒ\@ L᭮Zph솎u34P^I{UWͳ{dw/-.ŋ;?m?  ʦqŧ~,]TnFwdɒ%ݮ=ϼZ]FڃBeu~Q歨+f޲7n<tr9/Y|?ϑrZLWe!G<[^IѻW?* !y?忒} |,߾L;9~<|ЙҥPK4]Y'қ[֝9WS~B,Qm[5VxCS'O?# > @6Y״(`Ag6=rgȑ#? Xww;#&MCHϞ= *_~ ) FG$+Q?C-!MvfY<9ylxud9 uʓ>%k/g?'L#)-Ѳ]"z>;%ٝ emFJ%;o\,_ 0)[JzC/J*/P2s%#du-<i.9eaR}),Yqr<YRiͫV1c\{z5ZuCS.C |zCr@�0s.VP_‡=XPkرcv%p[Λs oβ| rB>:}i6߮3j=t\eg,MC:,t,l#S]6[Jߥ{`,] mk&N>{/c5K>$S [G(W+ky]e _^)9eȾYl]ZL+o^qP' @<DYjRYYٶ$ x@}ez_~L|<_hhm_up|CAw裏ĂLWA?lMqo| \{.#w_B[̾9gd?Om r4,t5Zj V;>dlQ,gۛRzێ5ԧ`Pm/ҏW,=ݏ=5 x-Ґ{Ӡfu2vʖsJΝ2@~~ 3w}nOիW;BGץK6lMX/PZZ*NZBGvk]w裏:?2ydg/ ݼ-_uw_y<,`=¶Ns+lm5_W܀|,M(uai,P5?WV}kz @-u˜=.:Jq7ϲ͈[AR[UC5%/4RV.8nK3nGdЎeHmIƲV,.۠Dd:8_hX„�%`u81}v([ik {\=ѬL ~66  x1ToYƍٳgwg kƌ#{gGv\{r;7tAZӧg-z/Y/em oA Xzw^η`0KN:65tq-Ѓ'_'_<Sg9j6-Xglk ֝:h<vcGKmHmev2\{=LcFϯh!Pg-JEgϖiǮsK2 ;G|yz )̕=rbB�4^kφ 5x-"=^/,XV,((`E�#` d6S Xjdk׮ͮvYgm'l6r_x&,챷3>@AnH¶/PcmP ^V:D?-F]n}֬=:^һCuEY>z[2w=:C44HemR'|)qC^孨+V8g䶶)Lu%;(倶a}H &<p{yҵEnv^;sG!&C[& ;n kZ;` kz7|] [Vw?҇;t.켙Zwv:AozݬlY[Z%UqcI(:H;F؟Ŕ[z1y=9m9yQ@�\pO}Ǐ~ vD[/HkMy>E:T4'^Lgn|ozvm`WXZX{WgJ5@E�ug7xQ@�(S˧~ꌫ-w<=rя~$QSNNh%V  :[A{yW|,=;meQYR@7* h֣kA O>:J `/nSXg[v0+=}/}؏g/ v޶۱&DSQvک*/ON:u{y4ٽ}c{̈́�x!@"y 6tar9Ț5kULDKQQ9@Iy V޶ʱ(`Aݓz6ຏi A@]xۅL@ T be<G�@\KK � �(@#@�@�K7ڋ"� �(@#@�@�K7ڋ"� �(nwi_#bB�@�@-mY-:Fda& � @JKR@�@�Y� � *Ғ@�@ qg^~S@�@�pnᆈ-ŖW0ӀEĦYL4i !� �3ֿ2a KU7L֢SnZ}+%@G[ܫnt�V4hg{x+ZC!|]ʶZ+=mZ#C/iS>_vGNQ"g6m%͢yo5XV\)%\x˗KNNի-a[gR N+a+\ H/ׯA=#cǎ,M<_7{Ɛijl;Bs9Gf꫃/--u/BrssC~_B Cgݷ =n>^{]p3bĈv1۷|2`6b F&L v\={dgg9oVD >=s2p@o+Oo<32jԨl"Ov._؞z)9%++9йiC@h@[xw }AܹVV~w~ǂw}矗c9&8'@\.Zs vmeѢEkA$ƍ~ؙgƏ/?9s洘駟Ovayw.s_W<{!r<iӦ:SĂvtdà~no=t7x#>9s?w^Gۿ,Fw2'si/~-;Ͼ<ZgMyyyK/$;s /WKڏcYb_}1t{{on>|x2;=);蟸66}Xqƍb;ݚҜyN�G9=U??DgKʼޒ^}RZ^usoW_uwi=^OOurγ<9R4�AE*Shx@G['t<_gYl7N5X9m}R_W< mE:l}d(Aҋ/[7,}c]w-Dlv|u҆k;.o {v[:&RM .o@C';xڎwȭ* <X븥y2`E_,yyyͥK%K'٩w];0g6.j7,ns[lv^ik۞?~ZG#m~5MӘv65ϸyKgy_}Sۚ}cB -;nYϪuȜ{N;5{@mzѦ9SiZ^6s לO>zv\jn{~L8t#*OCeQG}3׽-tĖP [7ݐ[f~3g=)&]hyD#B߳];j z'y_X>n^-O{ݚ}2!*ZLaII3:Rlo|B_Bkں_=w[<"q xmSd; {9Wy晲`g|&{tӷ6cڇ]jxCnݺɺuuK^<x@G t޳gO3f5v%zqq;m}!t<G -ecj&<bm߰ݳ>dw[xQAyO}͵ =>oLqgvv%ݭ7 g{u9n[Һ[>\u^v'ߝ r ":V|bOwsudhH?`m?jdDCɣ}H{ܲ^0ڮKOJBz+o}ͭsӆ>on_ln{v\ Wz6 `ڻ|s+klwW7<_>)U2˶v+B:ۤ}PDbI)GvZ' ->`:EK)O!QvNԚ}Ʈ>/,|O^XImٷUUUą ʩ*~i}-(ʓC%f#Сou&v$|}$ŭaˎgC lu:unXnb >EũH5-˾eek>cM ,Ubݷޑ ͷ}Y^3K/{JA}+l2-޷bҹs gi =1![ޛ#&eC槂iM .o[)I�`jY}+f2V@ < xm|k&̄� � @s-Öy: -m � �4'Uli\Y�/ߋ֥SK[Z@�k;x`3gNv:+ږ߷o_Wn6ill l)`^{9ݛ2QȜҷ~Ůb_.]Br) �kZ[oU/^,wuWl;dٲe1Or3&.pE9d6|>}QWh)}K-c&_iiim�d_'9sf2W# rwSO=%999poϣ>wELL]Rf͚fa7~"Ҵ3e&)(p5/_|=Z#\99䓝Zlsצo2j?2q4(!O@ f_~cOK^ZQG%vg}bZ vF~{С29--w={tINWWպy@"W_+iK,/\&O,6ΦoF'Otyɱ6:z@7c4hPjkCUI@ lܸѩr~~~̦'h[ZnX*or%85.`gKl|>}ձqټ'eee"-))qٿ!)x�%+Çˉ'( -s޼yi$[ pġh-h ?#M-oiٳgO9krKMMM1ׯ_d/;bסr)K/JDl@^뭵!tX#1cZLKQҭ[7YhQ6th }Rew_K5kh͐\w8}1q>3s\J%D=5=z8�vk#4Yգ>*sx㍒)H{iwL;mz&N輶;R3mzb_`Wؾ2!jv?j 6L>c! v;we5js snذټX�$DkUiwiw{ȑ#{ͽM#l.0uTYp>2n8gAh}Z-oi Mmdرb^:[FH `com مm/'7|S̉6 _8SŦĶSmO>)&Mb>3@}pDkG[nUv@h[bB l& jsڵka�� �IDATNg]Pʄ@ ̘1C&L}ŊΗ-8#+$G�$5YkRh͸&N VлDeB�H! We� � N@�HC iiHMh_ybKLi*`!㸕OU[5%ʱQ5MG@[H[XtHChO> D^ؕoL6͹܋<@�*4?(-!rġ[rx?W[O}{ɀ^E _nf?%_Z*qor5 �$klӀ7F?O_{m88?4]l++vͫq2罒<A >˗/~8ݪN}hWcPn@S#EOn9k&;$dŸoOMwO' G( -.݂i]_9&_z{yb=> &R\G6C]A>cw;.�/#bƎ ѳw_:F^ˮ2)7`y@ uO37N, %Z9wp|Wy7}) ~צ_W篓FvUӿӮ[03!� @1A3v|:k/-u;Or7XL䅧 [/'^i{nc-@ q x7*v͒TV78AnyU+sٰ=tګk g mXQ\#e2jy@�f",#75uKѲtjTdgzrсh0Hے-[]U]}68#ʓ+q6jqvh|yC?@�JdCvQ(Y>CIYH&h x[[M'kZ~6һkW>TNvІu �[#~ W\`zԧme?  55YUR릷! u#lCYeY_'v1[9b@�h@cPx>+HgXs~oiJYg2֙فoa>Ǥp?^#I>V_Oe]*8祲R?x v^~ܗqA!@eetMƏTqԨQ}yS t S3<qN+^_$ܮwlxNK(ל9<|u^#@;93KJJ"EI%+++-|I4iV&"*jMR}M] Z^k& "`In#Wi^x Ծg5 +ѮGcQuM5 &`-f̘!&Lآb Nr ݎzu[;eO:@�h1@cQ_ib$etgv @�]ر5@9342.qv@"$EkF@�@�G7yڊ"� �A h� � <V@�@ \0ӆ`@�@�^Ŗ)b[1@�@ ^Ŗm � � ЮK � � w }@�@�v mW^2G�@��o[#� ��o9 � @xl@�@]xە@�@�-@` � �*@ۮd� � ox�G�@�hWv%s@�@�x ƻ> � @ +/#� �[7-@�@�U]y@�@ ~?a � �)"UliRj � �[Ӏ7(l@�@�pp^#� ��oJ5'A�@� 5 � @J TsR@�@�pp^#� ��oJ5'A�@� 5 � @J TsR@�@�pp^#� ��oJ5'A�@� 5 � @J TsR@�@�pp^#� ��oJ5'A�@� 5 � @J x¡2 � �*4|a � �)%UliRT@�@ %xS � @4h2G�@�H ޔhF*� � M7 @�@�RB7%J � �D &|@�@� Mf � �x0@�@ %xS � @4h2G�@�H ޔhF*� � M7 @�@�RB7%J � �D &|@�@� Mf � �< x~0@�@�-= x}>_L 1 � �-= x � �K7^l@�@Cx; � �K7^l@�@Cx; � �K7^l@�@Cx; � �K7^l@�@Cx; � �K7^l@�@Cx; � �K7^l@�@Cx; � �K7^l@�@Cx; � �K7^l@�@C< x~ � �WK}yj� � !^ŖRs6� � @ 1`@�@ x(1 � @ 1`@�@ x(1 � @ 1`@�@ x(1 � @ 1`@�@ x(1 � @ 1`@�@ x(1 � @ 1`@�@ x(1 � @ 1`@�@ x(1 � @ 1`@�@ < x~ Pb@�@�*4| E@�@�OӀ7)1 � @ z S?@�@ x @@�@�T M~ � @ #� �.@-L@�@�4 M7�G�@�R]7[!� �i.@o�� ��o0C�@�\7�T@�HuToa� ��o> � @�Hs4P}@�@ xS � ~?9> � W^Ŗ>ϫ � @ x[zyP}@�@� MFH � � zgIN � � (@B@�@� Β@�@�P7"!� �x'@%9!� �$�o6 EB�@�N;KrB�@�H@l� � �w� �  ( @�@;^, @�@ xQ( � wY � @ &`P$@�@�< x~w%#'@�@�*4|i(T@�@;bKO^GN � �x#@# � �$�o6 B�@�FGrA�@�HPm� � �7� �  0 @�@^o@�@ Axa( � 78  � @ &hP,@�@�oxq$@�@� MІX � �zH. � � *@ C@�@� Ƒ\@�@�TӀ'h5) � @ x[z|ds � � *UliV @�@ xӸ: � @�Hc4n|� ��o:2uD�@�X7#� � @L@�@�4 MƧ � @:C+SG@�@ xӸ: � @�Hc4n|� ��o:2uD�@�X7#� � @L@�@�4 MƧ � @:xt0 � � Uli:l@�@ -= x:"� �$�orE�@�Q7F0#� �$�orE�@�Q7F0#� �$�orE�@�Q7F0#� �$�orE�@�Q7F0#� �$�orE�@�Q7F0#� �$�orE�@�Q7F0#� �$�orE�@�Q7F0#� �$�orE�@�QӀǸy#� � YӀE.-s@�@�QӀ7:@�@�v mwb6� � Oxm@�@�v mwb6� � Oxm@�@�v mwb6� � Oxm@�@�v mwb6� � Oxm@�@�v mwb6� � Oxm@�@�v mwb6� � Oxm@�@�v mwb6� � Oxm@�@�v mwb6� � OO^Ϻm@�@�*4|)DLU@�@�)UliO� � @$H*C�@�HޔiJ*� � I7 @�@�RF7e � �D <@�@� M" � �x#0@�@ exS) � @$H*C�@�HޔiJ*� � I7 @�@�RF7e � �D <@�@� M" � �x#0@�@ e< x~P@�@� x[z|u@�@�*4M]*� � 2)ӔT@�@ �o$!� ��o4%A�@�$@Iy � �)#@2MIE@�@�" FRa � @LSR@�@�HT� � 2)ӔT@�@ �o$!� ��o4%A�@�$@Iy � �)#@2MIE@�@�" FRa � @LSR@�@�H~?6� � @^Ŗ>/抰 � �-= x#y � �S7l@�@x۝ � �S7l@�@x۝ � �S7l@�@x۝ � �S7l@�@x۝ � �S7l@�@x۝ � �S7l@�@x۝ � �S7l@�@x۝ � �S7l@�@< x~ � �WK}j� � ^Ŗ^k6� � @1@�@ x(- � @1@�@ x(- � @1@�@ x(- � @1@�@ x(- � @1@�@ x(- � @1@�@ x(- � @1@�@ x(- � @1@�@ < x~r՞"� �$WKX0 � � \^ŖEHi@�@�A7Z:"� �i,@ƍO@�@�t MV � @ qSu@�@ xӡ# � iT@�Hthe� ��o7>UG�@�A7Z:"� �i,@ƍO@�@�t MV � @ qSu@�@ xӡ# � iT@�Hthe� �OcJ� � ीW� � ^ŖiT@�@ Axa( � 78  � @ &hP,@�@�oxq$@�@� MІX � �zH. � � *@ C@�@� Ƒ\@�@�T7Ab!� �x#@# � �$�o6 B�@�FGrA�@�HPm� � �7� �  0 @�@O^M@�@ -= x}>_7 � � �x[zzS5rA�@�@;^, @�@ xQ( � wY � @ &`P$@�@�x$'@�@� MFH � � zgIN � � (@B@�@� Β@�@�P7"!� �x'@%9!� �$�o6 EB�@�N;KrB�@�H@l� � �w� � ~?H@�@�QӀ%%eF�@�H@bKOtH � �i.@o�� ��o0C�@�\7�T@�HuToa� ��o> � @�Hs4P}<F2gQP{>5h<�E $*jd]uGdc/��IDAT}k5 >3tuuͻHSUUzjҟy@�.@z S?@�@ x; @@�@� x@�N~P}@�@ ެ0C�@�:��T@�Ⱥ�7-L@�@�N.@'�G�@�.4{Q?@�@�Beˠ7%T}� � uP2h::C�@�=o%F�@�(C["� �Ԟ�ڌ#� �!@-M@�@�jO[{mF@�@� Ŧ � �'@୽6 � �exbS@�@� ^Qb@�@�2e`) � @ xk(1 � @2@�@f@�@ oXl� � P{k3J� � P@84"� � PZ T xs\@�@�2Beˠ) � �xa  � � VK"� �$"@M � �TK[-y� � �7f� � P-o9. � @"D9 � @Ւ � �xa  � � VK"� �$"@M � �TK[-y� � �7f� � P-o9. � @"D9 � @|>_zp\@�@� ʖAo.3A�@�@l4V "� � PJ[J � � f � @)o)#� �dBf � �dX� � o&J � � a9 � @&hF*� � PJ[J � � f � @)o)#� �dB!ZL<9Cr<@�@�N,h3fL' � �ϟ_lqeJW& ;B�@�Ȍ�cx3ӔT@�@� @�@�2#<P@�@�̔Ao׮]mٲeQ � �PT 1hW^pB&r!>@�@�:zvv/^lʖ!GV__o-rd � �KziݻwRW%RB.H  � @:SKRy@�@�T xS, @�@ �7$A�@�H�7B@�@�B xCI@�@�T xS, @�@ �7$A�@�H�7B@�@�B xCI@�@�T xS, @�@ �7$A�@�H�7B@�@�B xCI@�@�T xS, @�@ �7$A�@�H�7B@�@�B xCI@�@�T xS, @�@ �7$A�@�H�7B@�@�B xCI@�@�T xS, @�@ �7$A�@�H@C*KE@�e>Yfg}f .fi./+,Tk?ub=zF߿PݏZuƴ ^:>4O?-@�-~a޽ 2vi'|V/]~wW~W;\!# fʟ1Ix+ߎ@ %MMM6}t{wsα~;bR1|/zkꪫl]v#FX}}*oΚ3m߮ޕoމ� PC pgzguuuQW5T#Ӥ�?_o Ç:U]9gLWh Wƍ[a @�jS@Ocu_~e;#l6rO˛W*G*dƷk>/ښki}XP qb;ʜ{:,icę@�2-xb{mycѭ[!?{ 6EiUy=l0ꫯl~UvFe!WehYl˖-u=*kVjrHb#<bwy=O?V[mG_Kzv-n3}g~;k:=Judy5-ԙ@�2+z}:馛Z>ðd#W߰n<L<yr#m|#ė\eW9}z䖫NmƶG}c!}]_~C9."[}]{^{6tPo mqWړO>Yx=i$2Qg49|n(ϟio ]vğ\B.quUu#� P!}.((iCW=[ KyWZz~㋛[vm[矿˜Xo5[Pq Ŧw^?ہ)h_Xk׮&؜9sXcbXe![SK^z%[;{);Wvս ]w=Sk7Get„ _ܡ^n?)K.{~~ޖ1׷s@�L ;'m}C}SP)4Fݿ ѼJh3] uG،3lk$Z8~=p۳ O:%֫Wvi4asϵ}ڸ gO/,SpuȵWWG^xu?^}ͯ+Ё7KGx ؔ)SwXiaf?۶b >K"Yg٩j7|ۙi[bŹg~s_nݻ-w:s*_r% /sh!ڥ^jk{omd>}BVqW^q_n{#V! y� A<b-}P+ ~a4SѶwys16{Nkm}tMnƍ6Q̻㴷>:Ǟ.-]Cם:ec-wPUns k߰LBO!Wpg!=}{m7Ue's u_5r;{{<ޮgϿp 8t#'3N?}7<>&^68�7D桇^={i^z[oeG60ͫaL @�R#^Nꯏuҥ7z[>x[zxx̛7}%|Ǻ;87VtGyY_9]Ozw5Cu3fpU>5җlcV^l\=׶z e"PSHg_\ԃ_m m_gi {_͟{1c6l'|=쳦Os=^ofnȌϝ; d|^0 @fWQ8E냠7ԷC.]X[ /tJT>5NؿxI=x#UFm`z۴iSȑ# s>֭ZUaן8}}~üS}}ckG [\p]}*yLF5}m:Wj8p`=zotM8ѝ[շnîwRS*y25 !�dU@[f.!|k\( gm[iYg=~Z0[g^cVn%? {~/8Oާqs2 =peRuE}.:_?sL7LC/^ޣ>c޿?_폣ezG-N{+=2-4g?ׅZW_}FF.'t0Rۍ?~u\S޸8@�2%V݉AKj}b�O?ۇz׵hM=70UCf{Uz4AcQ*ڻL3_Gv*w1b˴eSs ￿TN]qe<MzW_z$5DwjP[;il/Vn2zNs TWi;ovuWw!ej[mugtcc3{~}52N!tggؔ1<@�2#qmᆦ1 գI 4vW!>v/ iP Ӈӽ#{~5j +C_חხzwe!S$_DQ q5Wj[= zvih j:/5C:?u9-~?iCkJt פo5mֶڏ[oյ`@ḽR)} z@�jQ@aO?uaG_oqYO>0<Ǝ>n;X~O{k{̞ybK.S=TԳ?! Çwp>A+rVtOYEvҒ`1 .tsNѤt{]lue2^+dò@�ЇonQGUL/d`Ҿt<vnjz\!R.>¯okƠЬ(xokKym-hת΁r&?{mI[;RvqVY� @ ߎKOj Y/NicPe2WQY{h"u0kl22'쏙ʋWʘ! o;� WẗN3YARc֬Ynܥ.:t.d{jigDǶ1cV �5.Te}B_u={z+u A\I)l^|A՛=x]ֺ~Ysƴu 17|G@� h\V` _~kh_a'Rkkccz^GXU8cgBO˜~; @|/ CBc]uGZ ѽ{wu 5=BsS֝1-Wnۤ +> @ # e v}S%iת3?{0doG� b}O1IEsxVL;nݚ;^&D�@�@ �7%;B�@�H�7B@�@� xQ#@�@�4 x* @�@ �7%;B�@�H�7B@�@� xQ#@�@�4 x* @�@ �7%;B�@�H�7B@�@� xQ#@�@�4 x* @�@ �7%;B�@�H�7B@�@� xQ#@�@�4 x* @�@ o> � �)7e Bq@�@� xz7@�@� 0!e Bq@�@� ֓!� �Lޔ5A�@�+@oXO� � 2zxS @�@ �7'{C�@�H�7e Bq@�@� =c`Z~ezh;Me3!� � _?]Sus<vzmkj̉>_k|-mx� � ^\!VZCo|m,����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/basinsize.pdf����������������������������������������������������������������������0000654�0001762�0000144�00000006426�12122071020�016014� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20100128144755) /ModDate (D:20100128144755) /Title (R Graphics Output) /Producer (R 2.10.0) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream q Q q BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 173.62 18.72 Tm [(A) 40 (v) 25 (er) 10 (age siz) 15 (e of basins of attr) 10 (action)] TJ ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 12.96 230.86 Tm (Frequency) Tj ET Q q 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 127.33 73.44 m 448.76 73.44 l S 127.33 73.44 m 127.33 66.24 l S 207.69 73.44 m 207.69 66.24 l S 288.04 73.44 m 288.04 66.24 l S 368.40 73.44 m 368.40 66.24 l S 448.76 73.44 m 448.76 66.24 l S BT 0.000 0.000 0.000 rg /F2 1 Tf 12.00 0.00 -0.00 12.00 117.32 47.52 Tm (200) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 197.68 47.52 Tm (400) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 278.03 47.52 Tm (600) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 358.39 47.52 Tm (800) Tj ET BT /F2 1 Tf 12.00 0.00 -0.00 12.00 435.41 47.52 Tm (1000) Tj ET 59.04 87.20 m 59.04 395.44 l S 59.04 87.20 m 51.84 87.20 l S 59.04 148.85 m 51.84 148.85 l S 59.04 210.50 m 51.84 210.50 l S 59.04 272.15 m 51.84 272.15 l S 59.04 333.79 m 51.84 333.79 l S 59.04 395.44 m 51.84 395.44 l S BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 83.86 Tm (0) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 142.18 Tm (50) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 200.49 Tm (100) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 262.14 Tm (150) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 323.79 Tm (200) Tj ET BT /F2 1 Tf 0.00 12.00 -12.00 0.00 41.76 385.44 Tm (250) Tj ET Q q 59.04 73.44 414.72 371.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 46.97 87.20 40.18 8.63 re S 87.15 87.20 40.18 181.25 re S 127.33 87.20 40.18 344.00 re S 167.51 87.20 40.18 286.05 re S 207.69 87.20 40.18 0.00 re S 247.86 87.20 40.18 277.42 re S 288.04 87.20 40.18 0.00 re S 328.22 87.20 40.18 0.00 re S 368.40 87.20 40.18 0.00 re S 408.58 87.20 40.18 0.00 re S 448.76 87.20 40.18 135.63 re S 1.000 0.000 0.000 RG 252.69 73.44 m 252.69 444.96 l S BT 1.000 0.000 0.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 219.72 350.25 Tm (> 66%) Tj ET BT /F2 1 Tf 9.00 0.00 -0.00 9.00 176.05 339.45 Tm [(of r) 10 (andom results)] TJ ET 0.000 0.000 1.000 RG 458.40 73.44 m 458.40 444.96 l S BT 0.000 0.000 1.000 rg /F2 1 Tf 9.00 0.00 -0.00 9.00 399.17 377.45 Tm (95% quantile) Tj ET Q endstream endobj 7 0 obj 2189 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <</F2 9 0 R >> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 8 0 R >> endobj xref 0 10 0000000000 65535 f 0000000021 00000 n 0000000164 00000 n 0000002555 00000 n 0000002638 00000 n 0000000213 00000 n 0000000293 00000 n 0000002535 00000 n 0000002719 00000 n 0000002976 00000 n trailer << /Size 10 /Info 1 0 R /Root 2 0 R >> startxref 3072 %%EOF ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/attractor2.pdf���������������������������������������������������������������������0000654�0001762�0000144�00000107435�12122071020�016114� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xˎ%˲S{d'j{\ y�>@DI*|}~k6 y035U!C.|߾ۗoo߾|/_~_߾O_}o~߾}o _gw?owǻ7w_w__-/|}x_~[~߿~aqoy[?a[}3׷_y ",׏#硫-_-K[W/l )}xBM%_>޾ﯷLjo__[esno}g&oahi5Yv7o߽y&}ymZƻYY /a(y,JsIQߖ@A)`=;~x ObL4R_o?)g4w||_'7͟ FQ\=M3tr ]Z5E7Y>[kʣB<2wc�_;~[VΗ5Xo7f`({>Z;0o[?~scߏ{ +٪(Q! 5|1޾˽!3/$Ò޾3B?NS-~fo֒#@xyxf6n޾F 9^]uF>8 /w;CY^a�{!u|:~.>`2&1|;~\ZNx*RƘ~N[ >#r}4~1AK{$?u4?`u7n~3Ə§~1`鏟a1oۇrf!ڛN.{ˇeBPS4ch1b4:,--y@_3r}C6x.`'}i1ߦAa9ƒQ.141?M8mAMnf o7m7)/th0|8b` ߻U) 5f ]FZ`~G8\ɴ{2Cfݓ\r7x_Ttu[Q*z紈�EI xN:0<,h!\T4R$:w}/ {^:W@3{O,,G'WmE&ֳ peIe y&KX͞n~y~^oKuUЛ/R2~~ò{EMקp?zΠ +<!]:u-Ciy~5ڣ/XC˺%Eؕq n8W׃^FM\ɬG8ɿ7F2CW)RwgI4Vƨ Urɭ>#%pyRwD(u VWP;~|*+4D #ŤB˻`}>I7/oTZfaB  0nR~4Jfm9wxi`&!&\(Z]H޾/s!#3Nj-HT۝ʓKXMMY2D'uGKǣip޸4jƬ.FY~M /s85_ ].,mPRZ)4|xd92*qZORRکU ބJ68G%$zU5FixԈz*c↧k$Zէ󖗴ֱ;A< ݎqff__uGKgȾ'4s` h.$?{T.SVF+)f�3(ErBoJ!/0,#"gL<_Rr =rq( �!Є6"_(|8=4JC *dP&न<a4ύ޺6P^nd7> vÊ~̫;(g`y[DboXd˥U%EGO߿-|w@e+\\.ػcYja6oj/p4&'AU|�$]z{Tꆀ!|]~˰_sRdEO7M%@o?eEk{AדvC^"&!L0m/tULw ;S.KL;JV]w417 cjO_HGr "b]%"n=V2*TWCjYӵ)xng8E270M7U y{fzYdqp7|'n2 7|4Z\ ! CS7YˬKWh58A2ݩb㎛BWe?σe?E~Pz<^}(Ӥgy1Ò {nZWഔS,kSW<s{ ݀1&ʰF#ev j̒"rsc~cJ8�'&u_}? vOje8&Sn5 !o}+xt7PGOtHݰ7,+ym+\ ]t#x@5%<3˚ ڒX7qzKjz>yHD u1$!:9v9o~+ժx�gS^yV_i3cQ7X͜ٿE4�ǥʄ:}Q"{>}t H˝7 vĚeȵ<YiDz+%+ş'[j(Z_`t@8~֭Y3 rEՋʄH6*+*H< )}[1Ey݃t.}p#wA$hX\=~eow,"ʪi3e'*Lx[%"̩g t,?Eo;pz�PhCh49Wi0z} 2˸Enwhݱʬ#*:^`GοD~ud(urw%.dKҥR)n~~_VYdYBZwam+׫˰ɯ /E{r /!LA2TQZ4eje@9Msg5@-byF^BaQ,D$){\B- %aB) [)y`@9{jC.Km6FmD3QJ̵&@O_#z&+tD|i>iRWqT) u4oUV1xvu`Z<Sqműm3~xD,hN!oxUfwiC2kBQV)8T4xfZoEb1U|J}N *|n o}hoSnUŚko" :oI$@<zݡ q|d*wҮǟ-GXSGo GIϰɱ;R \ =f}ԳS-[n3ٟyȆ6F㍁c0 hmvĪ7:/ u&k4 5\(`z&Jɨ;VܽrRJvD$X=~е!6]N%2gCir7\⣌)# h|ѶB58`$('cpP1%B6>ʤz!{ɋRV{gUwnyw"H4ĥCxkTp�KV)3 3gZtw{,7uPwgtKfn֏uf dBS,f務m ZYCYDDLaA P*1ş 1 9Ѷx!U|6}ݟ;j1.-gd5)nrw lb Q☏=;ޭJ}5-�M[?gtlm?p<@qʎ؟'(CLFyM.Is(>6xG�px3d PͶ֏uH_ħ;H4H7 ehVBxk?^M15V"{Ʀ*)# Lgc]vbEP߹ Sټ%Ń0{Ʒ*)řfuD]C}S~ /W0Ox[,/A.6G G sr|-K}o/dmSQ-K=P%`igo0Qa<, ̓񎸢T:o (V"9|"mcp!xu2] nfaK||gV1<,_�˟LiB�!D7W2sݔo 88􇺊S !DשެNapQm ϫKRHK22 [i%υ@@Y:,|%kW|]u2L7svܱpL>E3=+Tsi` Jڛy-twURpI$`lKKmV%Zn olur7&d36WKm錶ghG Nk0i\{\Ў4 &mq$]1;@6Ol6(&E3n |n ;yL\i5y-K珉D}{-{1ʍ5nAMGw2Lx=󠆝gk[SjU.QHm2S(nݰ&~&Yw,kY?`Y7j.%JYOr1VnIgZ#n'!gm4mݻ.Ljw̺/#] K)L^J$Ԟ\}lUQ2n;`2>t5Jn"˿nd[mxe޾bGK.U32dbll;<پ\Sk&Rlÿ-CDߪ˺v;W$ nS߶[ad^Lczd#7a1y9iUv Ҍl\ge@Ea9 s{싫- ]!/HB<r "^%=wy{ ? Um3װyd\eL ي덹fCvv\}SF\Y¡Ē1cmք>n# 7juP"R`ozmsƺ 87=WK&,(zp5c?9_7-ȥZNO 8ʞF[yyP7l 1g! ^>2kll^"%>.h4R = ydCT3b'Zҙ(8x&d_J2-)O<M`ܮ]dV(S<Ë}ژ ļ= ^< GfkCy$ .O%ك%�wܚB`qY>&yLgޟڛzؖ3 etEQZBmT~=q<m:1.O,HG!;H'yRᰓNw 9a4,ln x%ߋHk*H_SG=-w- Toa\ J"գ%!bVr g pHܹP ~xRJ<'' _#H{>F h RêМ["$Zluͥ M{b=ؙ~b: .yDTιuZQ~'`l/ UXb Naߺ`R&H8w(̾)B4`O?PNd"?B$Jc@V~qЉ6FioZԷ] hVx5~+2M Mt~'4PRF'qr(�5,\^<fiKV ШǭY --rHk,kd Na΂jN{$Cv/$}* ́]]߂_Iv=̕gM\p89["vuwY|=T%r[k-ON7pѮZ8&.Tg!-WU.<B"rulJ:hK g}FPd+ k(\fr 5DzFU`o :D v Xd3x`m6ge8C~Xt|"hTa=@)<X[~fw{9_lcuwS0 JKfRN#berr0."8Fl4KPV)̑F2k�eq-h yL&!gƢgH"RR@nKHJɅJ'jKT T,x1Oț^BziM,70XHUkM R֋ p@D.{?D;9 +3@_:q*u-Pr#Ǔ2΀Bfz?'>{8ҏd ?K<D<GrJ? ZE PΒ:J= 977_o$42ެo)uMɒbC滟4w`,aTUm59En 6�rKsy/}"@s=dQLRwa0O()e!kċ^qH?"$ǛVwN\c6*%䈑O> S; zTUSj5gVx@0>Yc !ˉ1Oe@~Jn>>H{ÅBCbG}&INeEmz6<Uoەct1|9!O$/]9ؐ0M-ɋt%%a rmL1̸QIO#DFک,n7h]cb9_' uɇc\@Ν{87Y M/n^(p ePI6aR&nwK8`/cח+glΔ8]r -c/H}X&9v s8Kލ]NؚY.؛\0ǥT)ǒ!(e^j\2 zªb jγťVn{O-N*[u jR6;Ց&O ׵36jMki`{ų\r_c[7܀)ѻI5&džNlHruT2# EdS( IⲨB Xo3LQALW4M_jgbBd6jȔlA^x 0͆0W-ԕ<O` mrY؉jkFFGqP[q5�nq "QtvzҴyvWy:89+gN٧ŒԢlp-:\9 $.A^i,c躴(cy'f +{ s.x;CncBE^D˵sEZnj|q uD9oH(sxx!ݘgX]_Fޖa^ێ f9pޖסmZ*)}["?p3g2" o=] (gʔdCr0>ʼn.7F vavΚ<89<W&[[ sHROxdQc#!/o$j USZjL;2 }d rJ L VVK}׆Tȡv*_۱m ǘ9ا ~e.yY/,"㶗3{xhSDzd|=~ʮ7 tV*#7k'Gy[$.ҥR9+L@l;0x]0Jޔza)+ y}yQ.�a( R60b8i譟9o&%d!ɔ:˭ߜ?$vج8KzM6Q∦:X ;A\@*ok~mbjg܄撍"mZ<MXVu0EN܎�`Ќ,*RɃO3B`1 (/1=~QQ k(+g\T:< %z<x6Y"H'\DoI<U-lIn?d`ueHOO~/x<LUfbQy'-% K0Xkf{QS~9 ˧7( łD^4>#BgZo朞a{ǢkU v�*J%ц ̳#yf\ޏAyG2m_᤾T` J %Ֆ )]p9+\.H ˥aϛBd?x_$EoXd6C/Mnj }4 \]3 ]6;.ĄrHW8ERp鿲/2ʣds RgbX]/!K2gcg2:3r03)9w'ϠH]7,If)̰́"\;3Ò,5%2'ngS(!3\V^P) ^n 7 q=tĦѿ{7‡"՛Pl߶s%Qmic<D^k5tgł?Qm>i '(ڂAq|hМwbf<2(r`RK+LQvuRK#YA4}(C:Z-4r#y/ 3630Ǔ0W֬qyjUPF_vYA,U̠_݀|'?Yr2c:Jj_{vC,FJ±j+%'[vP}޴ { gb/xvKVLoVwtH]T~fAe;dB[6&K֪vZ*+xJJ)U~Pߋ&oYO^UQU>QKp&QYS朎GMlVl2EK<LAbg<ąkD<LMft6Z]@Y{v&IFz) F ov4v!y<<c"y |f�D'77pBŤD7FZEL6]PΩM30,[&,r2P󇃌/-&P7~;di !pI~OnfnlA;8G=W+R~"RW;55f2N~D 5QE~c][@o&to%'Z_Kb+[ʤZmy~V-&isw-Cj,-n+]‰-DjDS&w,[e^f$%m[uQn`LV4@c@58H;qq_`PWvmbˀ"o~ @CyKhd|Fŝ\<gs!ntDEv?[uh2#ϛ*mbV8Ӽg|łC7s#HwJOeZ&LqN0ʼb9pPn{of*:U`0mhS(( iTDl6s<,<FD|yl '1GBۖ%<7rar}2 įF b|h-ɽ//w5"{OU;âK͞yռh;0o oz$p>xJ 6X[[9{0z/4lZh~]B9+[�m;؁4Vk0h6dK{ൗ@Xc~:+д4p`BD;uB:v٫-Lhjb1CWuFKPdEC=/-0zp<=^,:BaL9Աf8VXv1jt4\Jq3viRcYo@.(8$8,qh``Á9gmϧ%>Ƈח0;蟻F\cs~!n j t1ۋgz@<Ⱦ3/v8ɟCvDnٯХne"tYݯ7P vQ`5( !qmgR]l ģ1PWv0k(L DicBcO69($yHVEo9TMNAS㓚<n "/#e4yYK?=q]'|'kc 1tfB&+hP(~{" \eDiJ>!"AO2Z�äN2);cL=gp.1"Dd~ڧ %KN3~yαW$zx6̒<!u!gƱa1O_UWOY6S޶Pnros\\KnTJ}myY|4y:jmϭWOٯB'#^㔎+i+Bj e+58Jf5?s[ݿTu%L'ZN6nqi ^)~o.} pNA4u-9#5J,?HCKa vgNNBy2ױ` ./Ouec^#N6㐌U>;m&V:=gGm[\C[5%6ש7jdɯ\G˰1MF4 .9kss?m{yS%SK/y̫ =(o+.!/n+uwJ`N]jlәq-VmνEIMtn ^![w)SF?m@ɕ]Yɜ+pvzf9qMy=]a#&Xd5 J9AُG)N繫9- >*YǜsAC'b& 6̖:]H;OɐZګ};b4Q:mn0]g[[eQ[8!qj/#w"ZftO){ح#rMAk  2+:Uo|72MogvD~mj:46:[o~я&ڈzuCI>l6!#:'WsɂLPݺ@n >EZmeQZ%Yok`wva?pSTre_aa?]Jsϯ95߀fe镕J]%0GkChwDǿigۧ#.9ssq^~*~; s&ܖyۤ@6{^ n/ s14z'sSf}_׺EVx?,ޢ|n}J7ȉ<b牀Jc'V9"*-r<$^3wⲖ9j~q>`].OchC@\8NP%}* $wGOc:^y;L%UG)hBC;z~ Ǚ TxZd~ڸlE@m:tFCFMګyJTQ5=/v}!wI*@:sP\v5d+}!j7F2dFfwf3N`3mSW/;Z<! y{;O/MIv)..\8]W=Wp;x~35uւ0İf#$~xGCc}1YC*k%H4j]lWg`"An H];dOh7 "^)^ޘ@DoS]vUJ54ms@C 5<}ާ+ 6u~QrIs`v- ]JAo)[;裣IB*kQ?ޯ-#6T}˨ZWbzw譃*$_Hނ¿PVuܝJO^Jd+RHڊ]?౤ۮe<,9 C9t}/h- 40E!zs*y5Uz LT.'L% a0q."_U"=n&~ 䑱nN*QoxV�JJ,g0 N+%0Jm&:=aH,r6XwCH6W+Kc5g\Ut4 [VN|VW_7ߢn8r{yh4˺絝;z[Ƀ]?@-_n~g@8B+=Аu/C}&}N�F 7ē(RS[c}?*cB'LSc S=<>s{G̉KN+ak.pC 39L=|y ru'@L\f>xKOD `~^8٣ u6C8 \ |HO@H:1SRA6x?yˌ+W]$ҠP@yc b20/B^~H^Sd(g~#5M~z~͆)󌡠dxg:za+p6:5)LcN` !kpzEߩspd xcKtOuyԘu�6h!qg2FES7w<^ ,6u>ש^Nܙg^{7~6kP0?J5x4sxcW@?Y0bl/?]^3,Qm0Y r"˦TC@zqP2H&gK:ז�Y~n)?r-9IT0eAZWH΋&ywW.XgO;moA)&UU}%W1JvF t-/znS{Pͩ;4BKnx+[-uҏyn*]sy4<  'Ipb~ȩ{~|#愀z7^7|Qc]@Mj_ fmSp=糐4BGwx|Fe?Ԭ}v¶zz SӸZ (nQo\ {zMIE}F<x&)4<5~v΄ ]Otg6XXZȫwy/] ڱ(әv өwgpbT.Lg2T)lQn:<+%ٷ\}ξq8Ѳ�WXI^>` kb<VXV+4޲'P )6jn#*Nϡˡ &{)I|<kNpۜJbA×)w%~s%^I~;ې̞)_NWjWuⷼÌ;Öt{O V*a.n eA0Sj@4fȻ8Qe畷=~@=J Ax6"\YN/uUJ!q.(m4Jf'i#6+'_2\G==!4=ؔ6'ƒ)qregӏ{缹>QVYߔa~ڷHLMh{nd=:Wyع[ڡZ#vJR!gtysFYAK^d G-elxg!Ut34Gf yh8P*z*J[X}9Or#y94drRs+.}%So Ʃt6R�QA8&c!=O&(rsĜpuhsҶ87ۮr+)%1Wy%F!1;{~v]|ROkPc8CP8f_ns=AgJ\,:ir܉rI70ƔzZ_a�%"dB i@5Rb9@gS9x]U3GWVh`[[+a WS{Yb2g&R!RS_335Dfbn3�/?^-9TӺ)nST|A kUEmh"m?q#3a&m~gQb=C@kڊ 0"�yzRd4lVme 5𓧟U}R@2)䵜�` 9-{М2)sA\vT1.38Q\+}XoJ%Kr"Y/+Y3nj.\`C4穀|2#ā.>M_!#$=ɡ#(٪b&#@Y �Goq ށ+au *̜c*-9z-Lux5~?o;*J|5%>Tg`gL[( eM}?UHsjP!_n`. iŜ/ |"ĐϷޮQ 㲛@+S;6|5RLJ]v;a"pea+}0Gh;ÔCͽuQ$1= ? _.sTJc*LY eѥ*WBd3~v N|yU*Z\q4N1l�@ yzͭ<%q ZJk^V /.F:BzMX Rꡒώ]@<!sj?UuB<j$ZJgi<,s ؆r.&:sRE4Mc[!gXZ</p)ÚvYa//qF@ͳo)ļn3Y@ώjluO2K} ?A_Lh%"]@&A83*yz+mhe1{)m'vBS&{/yމx޽.!r$zfFөzTRTҎUtx<%e/*Q.7DzTy1P,tխ-^^z۪F4lƃduv_>Knyw4 ,5|sߚ*,tPiރz " {9e;Nk ^ޚ' A-(bϻZNIaEc|tIp)бg.xwb@Oݝ&8սf07Ӟia[-OҰy`$^hE W E1hb R7#?KzCHΟ0XbX0]w;`~ir?3ww4?iR&2g$u+K7?}Ϳ5.:�QJwV:\F~̬!hK ݷ�f- ܒT[B5cgV| 2eOi,JC ?SBb\PN=,y@&;QhXBrAMk+�ݫ<bEOU ` (%I4ZOn=.Ww*(s~xHγZ~x}͞= o]gsZM~yu[7jEgONPȽRی@m�5]xkCo?􆌧1j Y#Ŋ05Nq ,W&8MiB*0Oh3NO/9#sw^g!+1GO�\a,YFPdC@=0>]i]F"MViz_WFBm?RtRz;۷^t]HSsZN7*_d�nju&2 U~iB ~<J}ʊq#LK">pYxn;G@8'޻IUac4O\\^_sbS?Ir8FrEy_r :<3"R3]%)T0@CDr]D0l|wصq`2L;-gwbjѥG8 ׵ WԵy˾穱R@ƿ./MYS`"R, 3?"kl~~p^ۚeݾq;[$n5q?/(oo '6CI\vF'9Ɨ2Ӽ$h2%# ĒGWa+Pg`J%j8ԿI `+븦8 U@d1Y&#t,csW`HinrKR$U7wTo^:cE,So+~ 쭀͊P aůU${c%O?|ZwOǹ~O,aQFX@<XGD+Y'ζ} e:9eb:.<Z ykim#ӭˡ Z<te:UZaR.%%Dy!ag] ;-/ܨG#w3Ij;Wt Y67~KtԾ Wl67C!ӀPo.  y!M!Ӕ,]ن;ฺȗ�얖(<S/Cx8 uҚb{l~OvVy?"C]h-aG ҒP_4)e%9RM ]! =~x% ;Haiu2PE8[tڶF-v ,|TvgYvlF|;9sy rB,D�b-_|y::b540#Bȇ{F2r{ [x{ e $.bh!'2Yrg'pB_5|f>Xf@hs(8)J~u(aD;V&\("yajOi& V "+Or_J+ WiqV?-%+RK1yϟ_,!+say8, sG6~df><ϔ3P)mX͛Rt@haywa2㔗ROjKe_"Cl呶OG*Fvpy?|sbN|L|?s MP]D겊 4z$6L"oV|(&Fn㰔g_dLyn$m .rLLw Yk#X܅ڏ*{>nk4ǹL$d=?l<_wklBG ]'hl>& ok2,*tȡZ!G^|@,+P]ǜ~5%=VKmݮ~woS6qٴߝ ٟ9�osYc]+QmRk!G0'TwD8udE9ӣY7u6Pɮs߰fkn,6�*w$LpQt n [�5Y\/J>Z +/>W~x0?P._6Ǭ~WuVwb9z^[`_W? Y~0 s%ӉT[U9GU‰2ySD+ =ݎ㖒*2t+ٻSDkEb2kD9jv"Ǥ-%?~{38t¶WrӚ͸x~TVSʂɻp(lȁ!W<fp`mv R<L2 @%ξd;)Y�MA30gXMID$h!Ԧ ] ;| J\ {r܆ۂR!ce vPȨWy]qo odD|c%RzZLWcY\%%D@cySHYWJ^}Fj cy=-I(K^qZ,g >ͪ8}p3+I(9Kf z(3QbeJ8|wdžҗiEg`e.[&9O10$Drm=4L>AgA֏Ƨ.xύʓzRm*g;JTA Y[&K1M\l5X{<_b=YOݙۮ2wKz(̀HdȴpQdwDhN>{<v8=jjEٝ{}ȷ9c䭮7z;%Qp$ s.K+%�ܦXo馎eNS/{uU`*h؟�?>啂xWT _f=sUL}fx h/R8:-hԬK!" Z!R) jP?m܉k b݊1,hxc7~ aPjX3~`V&1V-?_[L&^l},Wߵ$ًP N55v%ceA#r?Mr=x\s`۳�}M\z^u`jzdK-t�/)2]=ǫ:]/h|5v5S2uBRvtfS?D-]=g/]EX UfՀLAepj('k/E ~\s$ !pik z wZW q.V 暌. hůi-VIXBqg,]^=C3w3 c^Q{B J Z">`fߝD ãW.g Wu=Wnf`azG͍,աp:ܷn4<LFYpy~{(B'Kr<x3ia)ub2fXX"i&]D eKFﬨ#EI1X0wA/z[b g97ÕD&W�u&y^juiz/$K2̯ï"Hzn{3`2~[:>m+I(Nnoێ[&yL:q&մKLe('fZ/cι�WswwH]kiqݲ{iLf6(V�,ou8־USJƴ(s7‹uKWebWP"#JSxYdjKzTRs&h2 uhx(%|Cw>9C"QZD (Z49`A WΚ/1zb%ӡUM&kC$'!%W!rfGB>mj%hMl ;U;dft~? ^}OCh򟊎a ;(>;_@YEN`V`RF.?cyJF>#&jɛ/UeeI~^&8yuƬܹvKXfe9>M>#SO]x@_Jܷ@r63JL7Ը4Oa'D+uPpT6rFuw?Y&HHT!Fg{=͑yGVtD.MGIv)EFݕkB̈wfa R/ۍDeq)_S{ލ'A/c7\ ☠0+;|/yiɾd_uVPnAUdc9 =Rd`crWF]f Ő@&仟χ0;Rr-`6ЌjjktyU%wVbA YfX-Mdެ*q̜NZ4X@ b'ef(Z+J'e_}p|O<2ż-�+>ddB^,Y`BH^ ׫{ad<+*HL(kL.2o\�-e 4Ȏ*pjk3uW,)a& u4=bcyX\%Qn[.6t0]3ټc 1.FggxFCej&>PR$|gM/Y5LWx}E#*NȻ}&jxy3ty4x\,ɐC+>pl(܁Z )|{]y>cѓG[3ۮ{J\>oYT0ˢs?Lp.@0t"eԟ/ JiB=i &~LMخr.S{kn�sٸQt1s(B%o?ԉ[҄$wPUoCX8vl¡L|5/]ty`c2;U[$숋7v=K*bF(==gz)NѓpDcAt49ɺ7ԝ!iNfةXS4cF OgĺhM^@]eɭg]~#q rhyt|m*5Ӗع"%\ˍ㙩4If #o_>R L#AKD Jv.(gpk? c*"AuJNUygr͗!'9oŅ?_{9bRjKbu>;WcKJnW7KJ>0T NOW QYC>'{b.l'vl}aJCBo?09g, Zt~C~t6_" _*̉^YL s!/m5-[):!n(kfjS*BVlJ}˖,Ċ:b4niC-h nV=N^iU# KG\JHcvbmLm%ͽ+"Ȕ吴Cn.{?Ϭ_l2D.C$abIY|A B*.Gg1xS 3AXȹFix݂4ͯ�+=W<Masg|Tzq4{ImWU1 C,lA w[A75O'S>2.Ry[TD޾UT/EfX24X.%E;VJf@%:ZͪY_o݊):q O/GA>o<J~a'S h2Z*3‹R𒔥+Ț̠. Wf6 ITOzq|Mf }+*`kG>]\HBT3PpWFezy዆,v/7öR ]uIC͊;+Q-SQ')vٛ&B:,!by'}W{<gkY=<x6C a6<?3hF BT-]ވ5ͨ͘-~ T!?,< �>eZjAseLXmG4ΛLc'FB=1ȴ]gXKn5_]J]_A\)Z[qƛ۝lA|umq&_ ,.yLmG=kpe 4mkvꨔ=> }2 @qزLL| qדNm,5?5>i=v aj[w:_jcei2Slm=]&!_&62&CH3Z:9+`<V L2akQ-~92P Ōt?GADbS.8(VЦ;ʾ/n䆨XG[|v J;2𤡟]o49gע|G(jl7 YYx 5:<Z ZLy!扤zt{ZX5^<4v<-^rLrJZ(<Wϣ2u#^o/zU^ѲzaW\^[=-g/yq}}Gt@KVHa>Z4uvA]b7_Sܡ[hݍ> >" $+@["{'=80l6HFT D/E!(_NE緞_*(?[|�>-Gc='*p}l[nƍȋtDɑ!۵�ud)⁁gEX9҆d})*;xȢdnWdԬXy\Z= 4Zr]|oF2y^ow,#da-CV<Ociywg񦰈p\d8!><Kd5̕@Ĭ:{gFf(ncg=v&oCF[pP)m y"Œn(8\P)|C' 9qZoe/3yo4Jbܢt?@#LeVE(3T%OPkjj;^d/4-~dmߗxIhi=~T_ />So?f^t` II#CjhpSVgGV=#W­pe^ <i9Ї,(量f o78C-VY]oKۜ2/(KlG?$ˣ7 J<& '/G0z_yX_ٞ~UĵR:Y-uM#3)j\Wp:r"AEy>vOs֥%;PQv$#-~9Y37DT2n"ZAo:iYɗ۪.5'NO6<o?ߛ0kZz쒗/?Yaor~Qn&?BFT#y\0x{gc`3**7=vBK,ztphyr@<Hࠓ Rk)*ya$fZK1b+\ `KMhV q;:(C舫1pPU \~Pr5jׯa]c2&Y'ۍf?`]1Pk:δJ>"Պ~`B??�:nVLI}tp>$p# r 7~ގob<Q{uoZ/pⶑ1RQ ;\ 5} LuQ"ǫT`-=sP4Y /4%n6@SbPR F7uTh D ]M61"5政YR6yH2 qeQ#"_DR>:8'sܹR%2 \A]?fy�Xǭ3>bc URؒAHlEVPQ Oy:(Ym4 .ZK@O*F"<~[Sf\&D8sJJ5F.5bϐtysG;SS? o8ӡZ|Eֶ pyOnC}W3.4SZh#OWS8/ ѰGѢB嚧Vj`%U^FdPkoУU k4�ǶMݙ40֒K"pP&k[U)t΃C^RPw8qczYX:qKX0/s9EP[zܖ#0œ 1Ås2[כX'7<Y0{ _[ z2xh{d>c.w.O9FE)x=̪9z@7xdpm~" [ʙ |9|I '=̞ϙ=]w;w".-WNʛ`<)Nؿ&EkU6p^N3OxX*;ߐOM~"Ϝ6c< TYyɿq{mc߬_]{}ۤԴv^>&QsY9C&{.>w/ߏR3ˡkIe:a= +zUjy?{@%|7\r`N2zs:VP^|髹AX"y{kf@OYD(3]vx˖W2pXJ]r:j(gdu:0^j!_#  e y`oN'Rɡa, �;S~谼�X3|'a&yj96a #.]3ʖ啍n`hfYdW}$lJ [Oh<6r=إlȗ}Oj !yL-(J=3Ouy{$Le)E*_hB9f3uh~ǘ٘Sxc/c иǽ:Oq&ُnʰS!e4] =}jgppFLA?mF2JHJ߰ S5myk^ .p_\؅΍T7&dp@-sKٛ|և{iH"tWv3�Mt"B3WUm,Thgx<de'{۸-WZ؄ buGnkd2{T#o7ی %+ Zӽ$t ,, "+Jr>C6قCvT(?@S!+:-]f.p7ظk8/_^o88K0]Gk;bYqi5(La b)8D`r0 FF ,= p Wӓ9M5(O[bށxG?=LCd}Yo,Y7>Ag`% [{{s!u!x7_i9vĿ<, ĕCIh7Z2TD]{աwd8 ]"'z(o]*= |vrS!V_lKʃFPclbC9>?I?OH_5=^o7aP9 ȯ"_vYBIiƎ.㉌42ZΡ2]n4 lv[Qof>;1թ8ѱ'.U^̿jh9C >r̮s?+unT"*יisS@ɓ:7-a3l{%~sRϸ_4]̙A!2ۗ+,WW pձm3a|nNש>\$ɗyrؐ'XRVSNWn<;|Ua<c#lDETB@V$!xw^/T͗놛2k ʫ4_RC\Xf*em ?IGsfx/t .ᳪDy.z,лށ<&+_"ޟJeŊ^Q({ $ 1]É0s>n1Hqn$"Iޓ#gvowq9x`9R;9YΕaw^im%^D.9 �89 ],\!Y=S^R~Ѭ ǘWq@X<t$:q=O3rşu  Bj<fjm:,nNٚv*.o)ˆ7ܓ<y8yxa5Oy7 WjtQy?yd/m<H`^+v¶MJF-Հw]<v6f^shG/Q%Y^^JmҮrT\-9M.'qҲdh0Azry~-V?[1 \W^;8d2?>Է SvZX瀷}:`i\?Owy x_`19[4Qig0 Ql@>jAL$7<.3y$DRa,�'v�uyWۗd5;{`WŚƓ<[A`խ7W d8丨?\"?I%6<8,ucK^{KF^0#7\#7z7my!YP<o29Cǀy+mj!5h͔ nZ=kuf׋u\/~l>R^&թ#H>{uxѣjve/'.kY,=5:oM=xryiIJ(~=jDᖿgJ3<_\<3ܧxmۊ įQ }.j ɗD֪ @t?rG~1S^-tEg %@W={:@L X1 E“`H$^C�T ycetW&lxc9zXݾ0&XsY7{Gm/x$aV%prLV;֭9D@ 2n/C$i}?_n'*%6:]UOu{jX53vj4fm!DI࣯9? ͈n%?"~@/._r߬?Zc}؞IUwLcI @ɏ'@ܤiy7gpnZ$f9yb8 |9p͞Q>{TAd;o܏ϋ/y/7ڞioM6Mdc,OPHFV^Ԫёڅ˩v%7^!<m@׶$5M{;;a3n/.g4aPF,^ .V%hn}Lojёq;?^~6@߹9g䜂u)7AF:#z"'u}>rN 59ŕ"/T$cK $5$<"2r jQ;B9 W.e#XVF[t\`%7o4D yT¶$ýd~4$ JOa}P3x2L]esA:` Z|oSẻ^ ^ ԛ4IJJ#=m{%}j;wu8 w,$/Im?gwNkÁup@=_}i 5Q;!slGO8Kl/u+&tbE'-^ Fn.oM%__0m84؏#?ۗ}__sy0j1@y$&C`&Hҿ{O2{Rݏؿ7@!Cb6wo.'jVTTvV1 Y[ep=7zʊHp?,KqG"!3h M,sD`◤r(o),:~2{CgF:SX }?),d.HsXkNb{9vi G$gE1 R}kQѬ\BK(Z*ó$-:S46*f`w#(,lI),N]s?wGH -\ CM1E}F+@j-'ƑjHVVڰG );B]d?v}!yins֟Q BZ֏ 0H: H~MIh4j�ɦg? VlS:V IL#&@H>-3UibS#U髋 V-W>H?_,((@tm3)ZQfϥoF[GH.͂R RT8^˗e{s1 6sؗHa)Jay͊f~rڦ9%\6.}Zy&;}z݁9OX*@.ze+A|];ǏΖ#+ݩ1>, =&{x̿#"W|{aޣVC2B >cŨ<Sg�\*Ц?,8\5DYny-locl(@%�H5 ޹˜_tK1ZI1qviXKj&.J+D korT� Q\Gcpv)(p/(: endstream endobj 5 0 obj 29769 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 504 504] /CropBox [85.00398 79.6494 447.7769 441.0837] /BleedBox [0 0 504 504] /TrimBox [0 0 504 504] /ArtBox [0 0 504 504] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F1.1 9 0 R >> >> endobj 10 0 obj << /Length 11 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w�(!a�@P"f'0�D6�p(h@_63u_ -Z�[3C+K��;?r!YLD)c#c1 ʪ2N|bO<G͓q||o%ez6 �"%|n:(Sёl@})__ �;GD,HK0&Lgg3ŗH,9Ldd8%�|fYPՖ-d2ϞA/ڗ/ZN-�)6[h);h[/>� h{yIHD.VV>RV:|{<KykrYܜ+pLUZ_aOBt4B@"2¿ *~khu=(k�I܃@B=iQFa21e2;2ɕd t08W |A ,\` (%` ^P@8Ip\W5pC`<5 Q!iCd w "x(JZJr5@C'se C;)0ք a+{p4NKBx3\GV| ) d  a#aHH1R"MHҍ\G -a +&�3,ƬĔb10.u0fKj`Ͱ.@l6 -Vb- ؛Qkpx\n׌;Ǎx s|~' ~�?C  ?BAHXK$&& 3DхFˈubq8CR$HѤ RttL&뒝dy5||<L~KQRؔDrrrJR= T u3zF&g)(Ǔ[%W#*7 \(o %H~|q> [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l�6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrg<O^o/珥>IsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6I<r;ڛ,73KңOOֱcYǛ~0aW j]:ٖ6"DgkGˏ?<sӤӅg,=3uVtv\ڹΤ{|E绽\rtWXWڮ:^mqi᧖^>k:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_Cggg� endstream endobj 11 0 obj 2615 endobj 7 0 obj [ /ICCBased 10 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 12 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 13 0 obj << /Length 14 0 R /Length1 2908 /Filter /FlateDecode >> stream xVal[W>g;I'MkzϻuIֆ6l?/-xة=B "MhNH-B $~�Jo?(!JR6I5|ι~6`5pY[4Cõڥuז'�Tvŗ\ۿ W% e\I+o]qm"Iߋm_}?ljn1V6KxkkGjo6j#J8]!HqFzAon,OYWpy*uIw)t<v5^\j[Em3jբVM.ZUلQKEm\e ;jaTQK|OK=tdROj}IPϤQ&5:!Lj}Kbn{=x[3ܷF[ׯC Yx1(v."HY*W~G?Z8;:܂mg^a>C�3Kn)[ <}|Si3L<iϞ=}3'O<1p{L zuw}^գBd· \fsscf6>uc.:iPCit"1XL7oY)]Gʰc"#,tYHŰݕdRX ]ݤvGX#gQTC!-#] YLἃAYIu+85{N�V =EVlӤlQe)} c,eQF2; DLgwE!vQ#]NbL=1aڎ+d:~hKy{sdIx<F5Yh_AŨJ: +e!R(C%,҃"Ű4o((CX­6HĬ,g| ɡڞMKGĬb-nTƴLC^IjʰYk\+t>t+FʗgV)/<mG̢ 7-)$Ep5EG! ]B;r$9GI\(LRMhp_B$<8Ojn Rjl<%Qv1OsN0H@AÂn3:CƂ%#j7ct}JXkk\JL:M=uc=subg^<:=37%KL麽^7 ^3 S|r,5yzEl,&bI4^6 [n�VCD"FEq/ yqa IrdgKl%wRw*p/Kp1P�"CC2A�.ؼ##+Fׯ~׫yq*"eK؋J"y{)S|O("{ yd>/ަ ]q|kS;Eyi)wg;>:y"TMkGpuT'Rk[:� ~-?x;alV?V/]x~_VKdc}@WUc>?,=1ıIeh_U+4w˕*}&ZJ 卍 y*j|&?J}#; X~ftٮ*K+K endstream endobj 14 0 obj 1791 endobj 15 0 obj << /Type /FontDescriptor /Ascent 814 /CapHeight 723 /Descent -177 /Flags 4 /FontBBox [0 -143 976 814] /FontName /MNVBZO+ZapfDingbatsITC /ItalicAngle 0 /StemV 0 /AvgWidth 668 /MaxWidth 1016 /XHeight 542 /FontFile2 13 0 R >> endobj 16 0 obj [ 791 ] endobj 17 0 obj << /Length 18 0 R /Filter /FlateDecode >> stream x]n D|C)7TCN?�b! /7z3`X~;r -zcD5€#8S9ԑ _S\af]hJ )Aä6_§xEɾK!SrLJDHqHdY0-ylsҶ/*%ܦ-kU`p endstream endobj 18 0 obj 223 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MNVBZO+ZapfDingbatsITC /FontDescriptor 15 0 R /Widths 16 0 R /FirstChar 33 /LastChar 33 /ToUnicode 17 0 R >> endobj 19 0 obj (R Graphics Output) endobj 20 0 obj (Mac OS X 10.6.2 Quartz PDFContext) endobj 21 0 obj (R) endobj 22 0 obj (D:20100121171211Z00'00') endobj 1 0 obj << /Title 19 0 R /Producer 20 0 R /Creator 21 0 R /CreationDate 22 0 R /ModDate 22 0 R >> endobj xref 0 23 0000000000 65535 f 0000035914 00000 n 0000029886 00000 n 0000032978 00000 n 0000000022 00000 n 0000029865 00000 n 0000030105 00000 n 0000032942 00000 n 0000000000 00000 n 0000035595 00000 n 0000030203 00000 n 0000032921 00000 n 0000033061 00000 n 0000033111 00000 n 0000034992 00000 n 0000035013 00000 n 0000035252 00000 n 0000035276 00000 n 0000035575 00000 n 0000035764 00000 n 0000035800 00000 n 0000035852 00000 n 0000035872 00000 n trailer << /Size 23 /Root 12 0 R /Info 1 0 R /ID [ <19fbbc96b00fc481d4b3569d9ab62063> <19fbbc96b00fc481d4b3569d9ab62063> ] >> startxref 36019 %%EOF �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/doc/attractor1.pdf���������������������������������������������������������������������0000654�0001762�0000144�00000012042�12122071020�016100� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20120316180758) /ModDate (D:20120316180758) /Title (R Graphics Output) /Producer (R 2.14.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 946 /Filter /FlateDecode >> stream xMO@sB+VIp�DhKڳCwgⵂcPp,וRJ~ޑ7 jcuXdyXn~<MA9ns ֛d}6:\4%[_$\U s_ϕ`mhj%ѕ]8C-6u-б)F`{ :вpG'6uP}}tp{'dv:]CSW Wcrga ?>n׵0{pdzY`D>ݍM(ɕ۝ڭ;ANM:EȐڸ}Բvڼߪ{bfL ].?L iͲ Z4;CA س;<Yg󖓅wrnxii &֧ܳjOHӺ|!6iQBѪN Qf"jA~FcjgF5ڥnԴl1RCLͶ+/M ,3Hf|2Đ2dh,33R4 ʅ4TFL LLđ#!I\61̐##eQhdCdn޳j,RdbhgVX&9rYfK2rd*"gl.$ME䲉!G2h\rY."G&h,g eSlbȑ̑rlbeeC.Š=kOٞ V@6d$`m{_EPЌl,'d<p0#<?b׸Fs{Qz� æ ۋ) Q ݨ9aŃQG 6X(q)N-Ln3a,nR~8ցNendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <</F2 10 0 R /F3 11 0 R /F4 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J�"6DTpDQ2(C"QDqpId߼y͛~kg}ֺ�LX Xňg` �l�pBF|،l *?�Y"1�P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6�(.sSdl-c(2-y�H_/XZ.$&\SM07#1ؙYr�fYym";8980m-m(]v^DW~ �emi�]P`/�u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~�(* {d+} G͋љς}WL$cGD2QZ4 �E@@�A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t� CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFk�t,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\<N+UZp'pWpeF|~?!( HB*a-F8KKxA$NpXI<D<O%%QHf$6)$!m!'"" Fdr<YLBn&!'Q*X*(V+(t*\QxW4TT\XxDqH^HQZTtTҴ2UF9T9CyrG,ňCQ((g(cTOeSuFY8 C3Rioh)JJJq)2au;U-UOU&6+yJFީ3}Էw@iikj8tm9ք54#4WhМҪ:TCUMGCc ÓΨd1t5uu%3zzQzzz ,$S:! ,]b6u=2V307n5kB6q7Yf`rc2M3mz 67K112͇-NBLӓleZ-- -,YX[mhmonh}džbhShc󫭙-׶\\߹v}ngnǷcwӞjbȡa1ѱ cmfwB;y9v:Y|KKˣy獹r\]n DnRw]w{}GDŽgAg^^"lgJ)oϻ{ЇSsW7ٷwo)6Z܀怩@}AAA͂E=!pH` wЀŒÖ}  aQѿ`ɂ"""DDIz_xǔHcbW^ӈuc,ܹp<>8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞ<RTT ֥N M۟)=&=qTH 232̳˜\6% 5eCً4ԀD^2S&7:Hr0o`M'}^Z][[`tUЪzW.Z=óik(.,/|.f]OVњ~[E76lۈ(8iMKx%KK+JonW_}ڒe̡lVVܷ(W./scGɎ;PaWQKKZ\]eP}uJHWM{f׻yVUWZn`z}}96F7I~~遈}͎--epu`xlo$A{}g]m\9Օ%>xǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000164 00000 n 0000001310 00000 n 0000001393 00000 n 0000001527 00000 n 0000001560 00000 n 0000000213 00000 n 0000000293 00000 n 0000004255 00000 n 0000004512 00000 n 0000004609 00000 n 0000004711 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 4816 %%EOF ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/inst/CITATION�������������������������������������������������������������������������������0000654�0001762�0000144�00000001416�12122071020�013714� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������citHeader("To cite package 'BoolNet' in publications use:") citEntry(entry = "article", title = "BoolNet -- an R package for generation, reconstruction and analysis of Boolean networks", author = personList(as.person("Christoph M\\\"ussel"), as.person("Martin Hopfensitz"), as.person("Hans A. Kestler")), journal = "Bioinformatics", volume = 26, number = 10, pages = "1378--1380", year = 2010, textVersion = paste("Christoph Müssel, Martin Hopfensitz, Hans A. Kestler (2010). ", "BoolNet -- an R package for generation, reconstruction and analysis of Boolean networks. ", "Bioinformatics 26(10):1378-1380.", sep="")) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/DESCRIPTION���������������������������������������������������������������������������������0000654�0001762�0000144�00000001301�12122272240�013310� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Package: BoolNet Type: Package Title: Generation, reconstruction, simulation and analysis of synchronous, asynchronous, and probabilistic Boolean networks Version: 1.61 Date: 2013-03-19 Author: Christoph Müssel, Martin Hopfensitz, Dao Zhou, Hans Kestler Maintainer: Hans Kestler <hans.kestler@uni-ulm.de> Suggests: igraph, XML Description: Provides methods to reconstruct and generate synchronous, asynchronous, and probabilistic Boolean networks, and to analyze and visualize attractors in Boolean networks License: Artistic-2.0 LazyLoad: yes Encoding: UTF-8 Packaged: 2013-03-19 14:12:20 UTC; muessel NeedsCompilation: yes Repository: CRAN Date/Publication: 2013-03-20 09:34:40 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/data/���������������������������������������������������������������������������������������0000755�0001762�0000144�00000000000�12122071021�012511� 5����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/data/yeastTimeSeries.rda��������������������������������������������������������������������0000654�0001762�0000144�00000000557�12122071021�016330� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ r0b```b`bd`b2Y#s1ejbqIHfnjpjQfj1P%Pbc4Nꡇ\S(R  J+·?l`T9a1Ȃ%/@, WY_C?`�vn۱΍ ^w΀Y::`*޷ [l A@9 �Qo1Ps?B‹ Aa;D=pu>Aƾn_`=`Ӵ\?4^Т9%3HSPДp�%悒�0T�T-H-;.43 al$ �M.yс���������������������������������������������������������������������������������������������������������������������������������������������������BoolNet/data/examplePBN.rda�������������������������������������������������������������������������0000654�0001762�0000144�00000000607�12122071021�015200� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ŔN0KD3ٍ7ˁ^/z,^agYKEL"2>wK|`ZJбœo}���Uj7 =:^ O 13kiS![IcDEnmav3¡\UDBq$pLo~Ð0*}?`g@<=/ VE! ߱='b$! eD%"A HEdR5/MZ01`bЂ2h=DYf?9" +2 ƭ<Ng˄WYh_gF8p܈f<1`Hb|W~k] J񬗱 #vC8zdL9-WZ}6y���������������������������������������������������������������������������������������������������������������������������BoolNet/data/cellcycle.rda��������������������������������������������������������������������������0000654�0001762�0000144�00000001064�12122071021�015142� 0����������������������������������������������������������������������������������������������������ustar �ligges��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������WN@Ki|4ƴ `ʨ<+$&l0(B1j¿K~zE%`$ܶ3ǴUoW2q3i2Q"&Ap@ 0jZ0>ĸ7\h7H$sf?>U9BpD?jaXL!9^Q0~at\;RK9VU<N2EcBΚ%bgB캄bjn2Ĥ=Vﻍʍ1X(^āE}+#m%ytq$}(trkmنV5-6)mZHСba(EN)ZTfC>ms59RU8nܔ=!BٛhN<a4N8Sk8H9dʥ·N72)GQh(T0Й<xdP(`PBwAHVVyXc2b"'!]|ǧyX M2~/~L4����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������