RProtoBuf/0000755000176200001440000000000015130750012012126 5ustar liggesusersRProtoBuf/tests/0000755000176200001440000000000013617263320013301 5ustar liggesusersRProtoBuf/tests/tinytest.R0000644000176200001440000000100013617260253015300 0ustar liggesusers if (requireNamespace("tinytest", quietly=TRUE) && utils::packageVersion("tinytest") >= "1.0.0") { ## Set a seed to make the test deterministic set.seed(42) ## R makes us to this Sys.setenv("R_TESTS"="") ## there are several more granular ways to test files in a tinytest directory, ## see its package vignette; tests can also run once the package is installed ## using the same command `test_package(pkgName)`, or by director or file tinytest::test_package("RProtoBuf") } RProtoBuf/README0000644000176200001440000000355612440004312013013 0ustar liggesusersQuoting from http://en.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers is a serialization format with an interface description language developed by Google. The original Google implementation for C++, Java and Python is available under a free software, open source license. Various other language implementations are either available or in development. . The design goals for Protocol Buffers emphasized simplicity and performance. In particular, it was designed to be faster than XML (no reproducible comparisons are publicly available to confirm this, however). Protocol Buffers is very similar to Facebook’s Thrift protocol, except it does not include a concrete RPC stack to use for defined services. Since Protocol Buffers was open sourced, a number of RPC stacks have emerged to fill this gap. . Prior to the release as open source, Protocol Buffers had been widely used at Google for storing and interchanging all kinds of structured information. Protocol Buffers serve as a basis for a custom RPC system that is used for practically all inter-machine communication at Google.[1] . Data structures and services are defined in the Proto Definition file (.proto) which is then compiled with protoc. This compilation generates code that matches the services. For example, example.proto will produce example.pb.cc and example.pb.h which will define C++ classes for each Message and Service example.proto defines. . Protocol Buffers allow serialization into any number of formats. In the officially supported implementations there is a full Reflection interface available, making it easy to serialize protos as XML and JSON. . Though the primary purpose of Protocol Buffers is to facilitate network communication, its simplicity and speed make Protocol Buffers a great replacement of data-centric C++ classes and structs. RProtoBuf/.Rinstignore0000644000176200001440000000002212440004312014420 0ustar liggesusersinst/doc/Makefile RProtoBuf/MD50000644000176200001440000003011215130750012012433 0ustar liggesusers64abfdb8ca3f2c6c6d30d390405c63bb *ChangeLog 61421f23828a1e40fc67bc5d3a6bc387 *DESCRIPTION 62fb696527f6acb69d98f22921ab5ade *NAMESPACE d13e6ed8a462c7bc058d24d3a59face2 *R/00classes.R b0bfbaa369be017c205961a53aec8a4b *R/add.R 4ba4ce9b1559bbd351f98b363d1eafc0 *R/aslist.R f7728fde5a6a729996478c6cf8028d81 *R/clear.R 51beacca373595b7d3c6c46541adaa9e *R/clone.R b897282b8dd73a7d7beb64fed4b1c1c5 *R/completion.R 4c30cf2b312eda5e226401c36e5b58c0 *R/containing_type.R 058cde593b8b6c16b20416eea312e7a7 *R/debug_string.R 934628b4354b9b55877bf82b1144716e *R/descriptor.R 918d8a6c857fc0202370153570332c10 *R/extensions.R 5477d8fce19f2652f9556e5dc748f48c *R/field_count.R 545565ffa1de48a2c0e12f4166d5573f *R/has.R 188ebe5cd74c4c742413d8d2e8e1668c *R/identical.R d2332f600cbc6f7197e980f4d199a8a5 *R/initialized.R 11a0f80a8639821170ff6ca45dbeaaaf *R/internals.R 5b2fa1784a983a62114fbdd7aacdfff1 *R/lookup.R 4844c546820ace66f435c3f9e8a1c835 *R/merge.R e81b2c175d1f6281711659491c960b48 *R/read.R 669b5c47e1332fe7b22e281e7cd70c00 *R/rexp_obj.R cbf49a7e2389fe793ba7a9515387f1f4 *R/serialize.R 1e07553fc771bd00c48378440481ccb4 *R/serialize_pb.R 057d7f1eca342178c0f395f0bf41212e *R/set.R 222dc70f1545478536720b27e6e92926 *R/size.R 4c0c001d909594ded884c537cd30bff1 *R/swap.R 909f78d384b5a017fded1cc619651a12 *R/text_format.R e403daf56d76175b0dbb779fbf241a12 *R/unit_tests.R 8e22673ceaf555fba67d88124f6be9cd *R/with.R ea66c0a03e9fd9e20cf1e2188087c1da *R/wrapper_CodedInputStream.R 17289425d50a619214e0f0e791a82faa *R/wrapper_CodedOutputStream.R e05bf8f936ec7303bc65142865251a25 *R/wrapper_EnumDescriptor.R bd667d461c131e1d403e2d79e7487b30 *R/wrapper_EnumValueDescriptor.R 4c742da7dbcd7e8dc3abc57e8b7e33ef *R/wrapper_FieldDescriptor.R 680c75f7c6ae99b5ed9f05bce01d428a *R/wrapper_MethodDescriptor.R 09c56f12a682601dc841d28fb56ee50f *R/wrapper_ServiceDescriptor.R 76ff7a641b87452283923433646f5e8f *R/wrapper_ZeroCopyInputStream.R 48246df8f2532ec2870973dab664f4b6 *R/zzz.R 0a7dddaf1478bf6737351c05852168f1 *README 0e626df91b766e00833ef09fcfe78f2e *README.md 9c2e29fe733b28fbd0058fe8f82a4c86 *TODO 7d757b4f4016670bbd0dd53970fa3128 *build/vignette.rds 6f02a7950a1a6ed8f6922958ef2e9948 *cleanup 49e25e7fedda68de08cb931de2b68cbf *configure b736bb19ab0c3328c867ad5371ecf163 *configure.ac d41d8cd98f00b204e9800998ecf8427e *configure.win 38719099f12809ebe19a43b951474c6b *demo/00Index 6275f697db7b64510f10f6bbc95c0498 *demo/addressbook.R 81d0dda686db1c07b625f49ea321a0af *demo/io.R 9ed50fca39d7442e4baaf9d24a1b1663 *inst/CITATION 302cdd84ae22770de621495fb8da0519 *inst/NEWS.Rd 5485d1d9d1bfb19216aaef28bd8fcc89 *inst/THANKS 016794dadd3fb04958a8e7518d109ea7 *inst/doc/RProtoBuf-intro.pdf d5d7da6f07ab559904d337de15abae8e *inst/doc/RProtoBuf-intro.pdf.asis eeb2782b088104919206d56ce484263b *inst/doc/RProtoBuf-paper.pdf bedec44010e86cfa70e69d50566090c2 *inst/doc/RProtoBuf-paper.pdf.asis a8033a5d82c98db5d632131c88b74f72 *inst/doc/RProtoBuf-quickref.pdf 55c010a4cc59563d0bbe375a406b98a5 *inst/doc/RProtoBuf-quickref.pdf.asis 8513688afa8b8be605c63815fe85dead *inst/examples/addressbook.pb 7f6e97dd4d48fcec1cfd7f9998dc0a62 *inst/opencpu/ocpu-getdata.R f16a4dde30d41003822a89fc99c7be66 *inst/opencpu/ocpu-getdata.py a9db27c47c52780e2fd620644059c6bd *inst/opencpu/ocpu-rpc.R 3de58b5add288354f79acf36a25429c2 *inst/opencpu/ocpu-rpc.py f3af33a40592bb447056578db18dfeee *inst/opencpu/readme.txt 45d4975a534ce2ea5aaf45c502ef4ec3 *inst/opencpu/rexp_pb2.py 9f9089f3b10a48b44260a8bd70db28e1 *inst/proto/addressbook.proto 2a3e35b1bc89e486008c91f67f39a818 *inst/proto/helloworld.proto cee1ab85ab9b103b74e0bf5be25f5cbf *inst/proto/rexp.proto c53fd49e9bd1f270d6fc87c8904866fe *inst/python/readmsg.py b4383797c61d0ec353a7e2ed5d571018 *inst/python/runtest.sh 95732c81a78c63573be5c9f43a36bddd *inst/python/writemsg.R 0d9b5f1be466ff971309ecb2afd30cf4 *inst/tinytest/data/bytes.proto c853d888d9648d142f1ba3a867fe376e *inst/tinytest/data/cyclical/proj1/proto/a.proto 66e65922360db0cbd266c44dfe39d53c *inst/tinytest/data/cyclical/proj1/proto/c.proto 20fe6aa791698528054fd3c44d11676a *inst/tinytest/data/cyclical/proj2/proto/b.proto 1421dbdd4d2390e9659eb436a99c0ace *inst/tinytest/data/encoding.proto e78677c37ce64acb1a5d6ce9155ab83a *inst/tinytest/data/int64.ascii edcac7eaf963ab392904f481e616f7a5 *inst/tinytest/data/nested.proto a8a596114f1818d1f507f8f4e6b30c24 *inst/tinytest/data/proto3.proto 0f55fc44f50565d09be96de324ccc451 *inst/tinytest/data/recursive/subdir/subdir_message.proto 64a90d269a1f1460f7afae971bd5dd93 *inst/tinytest/data/subdir/subdir_message.proto 98dc306b2d0214026885e8477fcc77de *inst/tinytest/data/unittest.proto e2af081c633af2731f87220d75873750 *inst/tinytest/data/unittest_import.proto 68b65e84fd3f2de818c802b905b6713c *inst/tinytest/test_addressbook.R 36f307d85021e6ed0f8c980e3a1179c0 *inst/tinytest/test_bool.R b4c24c2f91f7ab6b5e277d7c63fd45bd *inst/tinytest/test_bytes.R f9cb439604e88e65a59cceb21c281164 *inst/tinytest/test_descriptors.R 22735aeedb99726fe0a970a6aa91828b *inst/tinytest/test_enums.R 2640fa64284f9e6702b32d86be5f3ec8 *inst/tinytest/test_extensions.R 557b2707cac83a59351ddece21b9ec23 *inst/tinytest/test_extremevalues.R 29a0b8fb75a7b134a337f059ce2e475d *inst/tinytest/test_fielddescriptor.R 0acf51a1f7471b660d7262479ae62d44 *inst/tinytest/test_golden_message.R 0bf7fb246ebc7fcd4b04c10c375b2f83 *inst/tinytest/test_import.R efc963895c5e86755c700467bdf82dfe *inst/tinytest/test_int32.R c4fdc31f4324f423ce0f66369492ec01 *inst/tinytest/test_int64.R a810b2d8a25c800b27f0859d987e4d72 *inst/tinytest/test_messages.R d2b8e2924a0d3765aa67ff768f36a274 *inst/tinytest/test_nested.R 5dd9d25251f212a0f77459cf82001059 *inst/tinytest/test_proto3.R c769e7fded71d0a8a8eea6975d53b1e9 *inst/tinytest/test_serialize.R bfe1de5603f8535c291b87885d4f414e *inst/tinytest/test_serialize_pb.R afaee97f6b08865fbe213d9a7eb1c69a *man/ArrayInputStream-class.Rd 40890fed5d4ed64cafc7095aa9a0b46e *man/ArrayInputStream-methods.Rd 957f47fe82a7f668ec02282aee4af2b8 *man/ArrayOutputStream-class.Rd 0f2696eff9e3308e2ffea7307dbc769c *man/ArrayOutputStream-methods.Rd 5cb17d6909f88e5aab5887e62cd03e0d *man/BackUp-methods.Rd ec65248e4a40e1f705a69a2e660425cb *man/ByteCount-methods.Rd f6d8ae782a18986ec842ab22c4107f42 *man/ConnectionInputStream-class.Rd 9b86bbf0669b15a1c86a90adbf8784db *man/ConnectionInputStream-methods.Rd 9c1dd1706a12a141a94a7982ca4ac1d0 *man/ConnectionOutputStream-class.Rd 3ef50451a780e5a3573fcf5c89590fda *man/ConnectionOutputStream-methods.Rd b7729105e950069a2ab727d81098df8b *man/Descriptor-class.Rd b29c09ea587a461f7f6447a8e48b781e *man/EnumDescriptor-class.Rd 1780cb972946ac6cd458a917f4c60610 *man/EnumValueDescriptor-class.Rd c719999a64809be361a95ef8ae36c8dd *man/FieldDescriptor-class.Rd c233dac3e52f8137460430be14aa4c99 *man/FileDescriptor-class.Rd 909b67870f6f049dc4f531ca165aa6d3 *man/FileInputStream-class.Rd 8410f4bcb3dd93a643d1817b7cab66b1 *man/FileInputStream-methods.Rd ab0493c557b9a37cb6aa699e6046b42d *man/FileOutputStream-class.Rd 6d89722407047c622381b971f70effca *man/FileOutputStream-methods.Rd 359bb4bc81b9ea412fb7fe4248954ff7 *man/GetErrno-methods.Rd 47d2382e0e095e6580aa10a4877161e6 *man/Message-class.Rd d22d70747d8b6a2929054c2b1cb1a5b5 *man/MethodDescriptor-class.Rd a8f24fa648bfa9b4b311086b81d4c81f *man/Next-methods.Rd 29172e33c7df0cdb8df4b4ef43c14134 *man/P.Rd 04c2989db68ada4b236a65ac616bf2f8 *man/RProtoBuf-package.Rd 5e00d1563140d560193bff4d0fde572c *man/ServiceDescriptor-class.Rd f28fc53c2c8ef8b09f4fae34adf738e8 *man/SetCloseOnDelete-methods.Rd 79b80066abd78e6af423a45407d557e7 *man/Skip-methods.Rd aeeedf936ab1e7fc71169fe1c6224b75 *man/ZeroCopyInputStream-class.Rd 513f1cae2551d76a2c702fed968275fa *man/ZeroCopyOutputStream-class.Rd c092e6235449f92bed78cf42ade227e8 *man/add.Rd bfcd76fc10327e8e559d568a22e399db *man/asMessage.Rd 5a569e9722221656abeaa53e865ac403 *man/aslist.Rd 437375c4a91c79c4618d9439bb0d41e8 *man/bytesize.Rd 650fee9155267d10598ca3bfbc30d5b2 *man/clear.Rd ec80b25ba5b04242a998dd4b743c2826 *man/clone.Rd 28e05b535fa45594cbcae8ab58a92e9b *man/completion.Rd 58e6fbab8fa48a76201ce96d3c67feb9 *man/containing_type-methods.Rd 4adb8eb20d5e6c6961e50efc3261f65e *man/descriptor.Rd b0d10473fc610c8763aa8e0822d6d428 *man/enum_type.Rd a5c50110525b52974417e4f4860781fc *man/enum_type_count.Rd ac509f4bcfde554b5541b143122ad49a *man/fetch.Rd 5e6e20abc7caae612d4a5cb0d5aa8f97 *man/field.Rd 29a2f92961280e7ea5105235f05e06d4 *man/field_count.Rd 2abfd8a218be88e5108a048fd2974b01 *man/fileDescriptor.Rd 54e1485862abe98a5bb444a446945e07 *man/has.Rd 9b76094272fe261773739f60443f9bb0 *man/isInitialized.Rd 99613c07ff0d286d571b75052a331f08 *man/is_extension.Rd f3ae2777164af8aaeabf52587913ea03 *man/label.Rd 9b42f851d250af547c5adc6381e3765c *man/merge.Rd 5b4e21d267dde303131629350925e52d *man/name.Rd 1d36ed77357d85fd08bf95d70ebd0763 *man/nested_type.Rd e4b536e4574dfba5c1684dbdadd37000 *man/nested_type_count.Rd 6c281b6344bdaaf719bad2430769f80c *man/number.Rd 8c81a58d60569755860b6e46bc4661d8 *man/read.Rd 1bb12d499e1147754a02e8660ee6346b *man/readASCII.Rd ddbaf3c0c0bcba202112685e7bc7b076 *man/readJSON.Rd a82daa5d1d504c4fe08527652e8d5918 *man/readProtoFiles.Rd 9819c09ba88a668ee8285a13b8c17630 *man/serialize_pb.Rd d9b5d35f7caac9c5f3780cd80cb9f180 *man/set.Rd ea60927461e723cba2b921693f2ed82d *man/size.Rd 3983a1b4b6b4d817447ad13d79d46228 *man/sizegets.Rd e0e38658a97060b87e9b1e5e704e224d *man/swap.Rd 17d0fefcddcd72efcc76a60978bb6b00 *man/type.Rd 5badc02095845ac4e1498539be042e7d *man/with.Rd 544f42fc1c35f1de8d8c2c6fe2bc7c38 *src/ConnectionCopyingInputStream.cpp c308631a6248210e33044f688aef16e7 *src/ConnectionCopyingInputStream.h e9ecde274f161c38541d2e6736a9cd97 *src/ConnectionCopyingOutputStream.cpp 2f7edbd09315738f39a635c991a8c3b0 *src/ConnectionCopyingOutputStream.h 9af4f9491b2b3e5bb9258a7cef42d274 *src/ConnectionInputStream.cpp 6b5497098f3def43a3adf5357cf92d46 *src/ConnectionInputStream.h 7367fe0ccc5c97cb1a98cb38c9fd064d *src/ConnectionOutputStream.cpp 9fe964bff78152777033909f3d8aa4fa *src/ConnectionOutputStream.h dd1b2ba5d6bef4a10b976086257ad4e9 *src/DescriptorPoolLookup.cpp f937c29352af9c5f559e4bcd4bed4d76 *src/DescriptorPoolLookup.h 45971f53a38684aebe2a25a5eccc6709 *src/Makevars.in 81cb9256b27bf2a1e636e67885d793d1 *src/Makevars.ucrt a9eb8e6e841f379592359e9ba8506c85 *src/Makevars.win f0a9025c80ecb4ecd7e78b56970df1a2 *src/RSourceTree.cpp ec2c0c626cdb19b9b1b2a3850a46da03 *src/RSourceTree.h f8d0251e4e9c272d0300366fc30174dc *src/RWarningErrorCollector.cpp 05b6f560703253279372cb71c6f14926 *src/RWarningErrorCollector.h 7a0a19d1f7e7274492e2bc23ed5f6900 *src/RconnectionCopyingInputStream.cpp dffb1dcc72def5105f3c563ca9b6644e *src/RconnectionCopyingInputStream.h 9eb491ac170419ae6557de8acb57d7eb *src/RcppMacros.h 568cadf0482951d002c2183cf5415c02 *src/Rcppsupport.h 42b0baefe8adce8cc83c27372889e604 *src/S4_classes.h c9da30f2ded23d5631d1cc1515c6858b *src/ZeroCopyInputStreamWrapper.cpp 303aa1ef2030275d60d8e4bfeffbc4eb *src/ZeroCopyOutputStreamWrapper.cpp 00d70d3ee7758426b43694e94948e994 *src/extensions.cpp 52afd56eaa8013202920fc5be4a4dbe6 *src/extractors.cpp 699307a87cee7adf4a5087b934c27b01 *src/fieldtypes.h e9e2efdd787965326656177c2ab48a2b *src/init.c a81bea8fd0b5bec76fadf4c63628de2a *src/lookup.cpp aa3c96d1b066877bac9e83526a25022e *src/mutators.cpp 5ca6a8fee2675fbc555e292588bfcd20 *src/rprotobuf.cpp 2ce0ed76ec92825ede108c82ee71f05c *src/rprotobuf.h 77dcd57d1827ecc62b6cd8380314e910 *src/streams.cpp 61a9cf9d31a974cffc414370609a000d *src/wrapper_ArrayInputStream.cpp 4d6efb41f45428c4757c1d8cffad6035 *src/wrapper_ArrayOutputStream.cpp 84b902ef93934f79d5c5fbdee19101bb *src/wrapper_Descriptor.cpp 726d2b76051ca4a32e4fbcd1e7f7a844 *src/wrapper_EnumDescriptor.cpp 2e96205486af877e22dd4ded050d7f08 *src/wrapper_EnumValueDescriptor.cpp e2ccfa4f95218a8ef729d12958cb6cd5 *src/wrapper_FieldDescriptor.cpp 5a398bcb6ab67e6506927b01231118e5 *src/wrapper_FileDescriptor.cpp f747cb031a743e725a864ad33e9d9f67 *src/wrapper_Message.cpp 1de57faa9489d840d3fb1cba36dfd897 *src/wrapper_MethodDescriptor.cpp 9a472d60c8b3c70382fde0e36f3b6d34 *src/wrapper_ServiceDescriptor.cpp 2c1c7ee61c0e6a8f30c291c89b46bf55 *src/wrapper_ZeroCopyInputStream.cpp 59937d13d10add259606848f88f4e65c *tests/tinytest.R 8a91a82dff044d44fcdd2eedc5bb4132 *tools/winlibs.R d5d7da6f07ab559904d337de15abae8e *vignettes/RProtoBuf-intro.pdf.asis bedec44010e86cfa70e69d50566090c2 *vignettes/RProtoBuf-paper.pdf.asis 55c010a4cc59563d0bbe375a406b98a5 *vignettes/RProtoBuf-quickref.pdf.asis RProtoBuf/configure.win0000644000176200001440000000000012440004312014610 0ustar liggesusersRProtoBuf/R/0000755000176200001440000000000014752644230012344 5ustar liggesusersRProtoBuf/R/completion.R0000644000176200001440000000743414535123416014645 0ustar liggesusers# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: # implementation of completion for proto messages # through the .DollarNames method (R>= 2.10.0) # S4 dispatch does not work for .DollarNames, so we'll use S3 # {{{ bring .DollarNames from the future if necessary if( !exists( ".DollarNames", envir = asNamespace("utils") ) ){ .DollarNames <- function(x, pattern) UseMethod(".DollarNames") } # }}} # {{{ Message .DollarNames.Message <- function(x, pattern = "" ){ names <- c( .Call( Message__fieldNames, x@pointer ) , "has(", "clone()", "clone(", "isInitialized()", "serialize(", "clear()", "clear(", "size(", "bytesize()", "fetch(", "swap(", "str()", "as.character()", "update(", "as.list()", "setExtension(", "getExtension(", "descriptor()", "set(", "toString(", "toJSON(", "add(", "fileDescriptor()" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ Descriptor .DollarNames.Descriptor <- function(x, pattern = "" ){ names <- c( .Call( Descriptor__getMemberNames, x@pointer ), "new(", "read(", "readASCII(", "readJSON(", "fileDescriptor()", "name(", "toString()", "as.character()", "asMessage()", "containing_type()", "field_count()", "nested_type_count()", "enum_type_count", "field(", "nested_type(", "enum_type(" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ EnumDescriptor .DollarNames.EnumDescriptor <- function(x, pattern = "" ){ names <- c( .Call( EnumDescriptor__getConstantNames, x@pointer ), "name(", "fileDescriptor()", "as.character()", "toString()", "containing_type()", "length()", "value_count()", "value(", "has(", "asMessage()") grep( pattern, names, value = TRUE ) } # }}} # {{{ EnumValueDescriptor .DollarNames.EnumValueDescriptor <- function(x, pattern = "" ){ names <- c("number()", "name()", "enum_type()", "as.character()", "toString()", "asMessage()") grep( pattern, names, value = TRUE ) } # }}} # {{{ FieldDescriptor .DollarNames.FieldDescriptor <- function(x, pattern = "" ){ names <- c("as.character()", "toString()", "name(", "fileDescriptor()", "containing_type()", "is_extension()", "number()", "type(", "cpp_type(", "label(", "is_repeated()", "is_required()", "is_optional()", "message_type()", "enum_type()", "asMessage()", "has_default_value()", "default_value(" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ ServiceDescriptor .DollarNames.ServiceDescriptor <- function(x, pattern = "" ){ names <- c( .Call( ServiceDescriptor__getMethodNames, x@pointer ), "as.character()", "toString()", "name(", "fileDescriptor()", "method_count()", "method(name=", "method(index=" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ MethodDescriptor .DollarNames.MethodDescriptor <- function(x, pattern = "" ){ names <- c("as.character()", "toString()", "name(", "fileDescriptor()", "input_type()", "output_type()" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ FileDescriptor .DollarNames.FileDescriptor <- function(x, pattern = "" ){ names <- c( .Call( FileDescriptor__getMemberNames, x@pointer ), "as.character()", "toString()", "name(", "as.list()", "asMessage()", "package()") grep( pattern, names, value = TRUE ) } # }}} # {{{ ZeroCopyInputStream .DollarNames.ZeroCopyInputStream <- function(x, pattern = "" ){ names <- c("Next()", "ByteCount()", "Skip(", "BackUp(", "ReadRaw(", "ReadString()", "ReadVarint32()", "ReadVarint64()", "ReadLittleEndian32()", "ReadLittleEndian64()" ) grep( pattern, names, value = TRUE ) } # }}} # {{{ ZeroCopyOutputStream .DollarNames.ZeroCopyOutputStream <- function(x, pattern = "" ){ names <- c("Next(", "ByteCount()", "BackUp(", "WriteRaw(", "WriteString(", "WriteLittleEndian32(", "WriteLittleEndian64(", "WriteVarint32(", "WriteVarint64(" ) grep( pattern, names, value = TRUE ) } # }}} RProtoBuf/R/set.R0000644000176200001440000000263314535123416013263 0ustar liggesusers## TODO(mstokely): Set and fetch are undocumented in Message-class.Rd ## And untested. Are they usful? setGeneric( "set", function(object, field, index, values ){ standardGeneric( "set" ) } ) setMethod( "set", "Message", function(object, field, index, values ){ if( !is.numeric( index ) ){ stop( "index should be numbers" ) } if( inherits( values, "Message" ) ){ values <- list( values ) } # TODO: we need to handle R type = RAWSXP and cpp type == string or bytes if( !identical( length( values ), length(index) ) ){ # TODO: we might want to be more flexible about that later # recycling, ... stop( "`index` should have the same length as `values`" ) } fsize <- size( object, field ) if( any( index > fsize ) || any( index < 1) ){ stop( sprintf( "index should only contain values between 1 and %d", fsize ) ) } .Call( Message__set_field_values, object@pointer, field, index - 1L , values ) # we work by reference invisible( NULL ) } ) setGeneric( "fetch", function(object, field, index ){ standardGeneric( "fetch" ) } ) setMethod( "fetch", "Message", function(object, field, index ){ if( !is.numeric( index ) ){ stop( "index should be numbers" ) } fsize <- size( object, field ) if( any( index > fsize ) || any( index < 1) ){ stop( sprintf( "index should only contain values between 1 and %d", fsize ) ) } .Call( Message__get_field_values, object@pointer, field, index - 1L ) } ) RProtoBuf/R/size.R0000644000176200001440000000170414535123416013440 0ustar liggesusers setGeneric( "bytesize", function(object, ...){ standardGeneric( "bytesize" ) } ) setMethod( "bytesize", "Message", function(object, ...){ .Call(Message__bytesize, object@pointer) } ) setGeneric( "size", function( object, field, ... ){ standardGeneric( "size" ) } ) setMethod( "size", "Message", function(object, field, ...){ if( is.character( field ) || is.numeric( field ) ){ .Call(Message__field_size, object@pointer, field) } else{ stop( "field should be a character or a number" ) } } ) setGeneric( "size<-", function( object, field, ..., value ){ standardGeneric( "size<-" ) } ) setMethod( "size<-", "Message", function(object, field, ..., value){ if( !is.numeric( value ) ){ stop("value should be a number") } value <- as.integer( value )[1] if( is.character( field ) || is.numeric( field ) ){ .Call(Message__set_field_size, object@pointer, field, value) } else{ stop( "field should be a character or a number" ) } object } ) RProtoBuf/R/lookup.R0000644000176200001440000000073614535123416014003 0ustar liggesusers # attaches the descriptor pool to the search path at the given # position OTABLE <- NULL NAMESPACE <- environment() attachDescriptorPool <- function(pos = 2) { if (is.null(OTABLE)) { ##unlockBinding( "OTABLE", NAMESPACE ) otable <- .Call(newProtocolBufferLookup, pos) #attach(otable, pos=pos, name="RProtoBuf:DescriptorPool") assign("OTABLE", otable, envir = NAMESPACE, inherits = FALSE) lockBinding("OTABLE", NAMESPACE ) } } RProtoBuf/R/clear.R0000644000176200001440000000162414535123416013555 0ustar liggesuserssetGeneric( "clear", function(object, field, ...){ standardGeneric( "clear" ) } ) setMethod( "clear", signature( "Message", "missing" ), function(object, field, ...){ .Call( Message__clear, object@pointer ) invisible( object ) } ) setMethod( "clear", signature( "Message", "character" ), function(object, field, ...){ .Call( Message__clear_field, object@pointer, field ) invisible( object ) } ) setMethod( "clear", signature( "Message", "integer" ), function(object, field, ...){ .Call( Message__clear_field, object@pointer, field ) invisible( object ) } ) setMethod( "clear", signature( "Message", "numeric" ), function(object, field, ...){ .Call( Message__clear_field, object@pointer, as.integer(field) ) invisible( object ) } ) setMethod( "clear", signature( "Message", "raw" ), function(object, field, ...){ .Call( Message__clear_field, object@pointer, as.integer(field) ) invisible( object ) } ) RProtoBuf/R/rexp_obj.R0000644000176200001440000001064313344204501014270 0ustar liggesusers# Functions to convert an arbitrary R object into a protocol buffer # using the universal rexp.proto descriptor. # # Written by Jeroen Ooms # Modified 2014 by Murray Stokely to support language and environment types rexp_obj <- function(obj){ if(isS4(obj)) { # Some S4 objects do not return "S4" from typeof. e.g. lubridate interval # These must be natively encoded or we will lose the S4 flag. return(rexp_native(obj)) } sm <- typeof(obj); msg <- switch(sm, "character" = rexp_string(obj), "raw" = rexp_raw(obj), "double" = rexp_double(obj), "complex" = rexp_complex(obj), "integer" = rexp_integer(obj), "list" = rexp_list(obj), "logical" = rexp_logical(obj), "NULL" = rexp_null(), return(rexp_native(obj)) ); attrib <- attributes(obj) msg$attrName <- names(attrib) msg$attrValue <- lapply(attrib, rexp_obj) msg } rexp_string <- function(obj){ xvalue <- lapply(as.list(obj), function(x){ new(pb(rexp.STRING), strval=x, isNA=is.na(x)) }) new(pb(rexp.REXP), rclass = 0, stringValue=xvalue) } # For objects that only make sense in R, we just fall back # to R's default serialization. rexp_native <- function(obj){ new(pb(rexp.REXP), rclass= 8, nativeValue = base::serialize(obj, NULL)) } rexp_raw <- function(obj){ new(pb(rexp.REXP), rclass= 1, rawValue = obj) } rexp_double <- function(obj){ new(pb(rexp.REXP), rclass=2, realValue = obj) } rexp_complex <- function(obj){ xvalue <- lapply(as.list(obj), function(x){ new(pb(rexp.CMPLX), real=Re(x), imag=Im(x)) }) new(pb(rexp.REXP), rclass=3, complexValue = xvalue) } rexp_integer <- function(obj){ new(pb(rexp.REXP), rclass=4, intValue = obj) } rexp_list <- function(obj){ if (is(obj, "POSIXlt")) { xobj <- lapply(unclass(obj), rexp_obj) } else if (length(obj) > 0 && identical(obj, obj[[1]])) { # Avoid infinite recursion # some R objects return themselves when subindexed xobj <- rexp_obj(unlist(obj)) } else { xobj <- lapply(obj, rexp_obj) } new(pb(rexp.REXP), rclass=5, rexpValue = xobj) } rexp_logical <- function(obj){ xobj <- as.integer(obj) xobj[is.na(obj)] <- 2 new(pb(rexp.REXP), rclass=6, booleanValue = xobj) } rexp_null <- function(){ new(pb(rexp.REXP), rclass=7) } unrexp <- function(msg){ stopifnot(is(msg, "Message")) stopifnot(msg@type == "rexp.REXP") myrexp <- as.list(msg) xobj <- switch(as.character(myrexp$rclass), "0" = unrexp_string(myrexp), "1" = unrexp_raw(myrexp), "2" = unrexp_double(myrexp), "3" = unrexp_complex(myrexp), "4" = unrexp_integer(myrexp), "5" = unrexp_list(myrexp), "6" = unrexp_logical(myrexp), "7" = unrexp_null(), "8" = unrexp_native(myrexp), stop("Unsupported rclass:", myrexp$rclass) ) if(length(myrexp$attrValue)){ attrib <- lapply(myrexp$attrValue, unrexp) names(attrib) <- myrexp$attrName tryCatch(attributes(xobj) <- attrib, error=function(cond) { #Try not setting the class in case the values are invalid attributes(xobj) <- attrib[names(attrib)!="class"] warning("Unable to set class, ", cond$message) }) } xobj } unrexp_string <- function(myrexp){ mystring <- unlist(lapply(myrexp$stringValue, "[[", "strval")) isNA <- unlist(lapply(myrexp$stringValue, "[[", "isNA")) mystring[isNA] <- NA as.character(mystring) } unrexp_raw <- function(myrexp){ myrexp$rawValue } unrexp_double <- function(myrexp){ myrexp$realValue } unrexp_complex <- function(myrexp){ xvalue <- lapply(myrexp$complexValue, function(x){ complex(real=x$real, imaginary=x$imag) }) as.complex(unlist(xvalue)) } unrexp_integer <- function(myrexp){ myrexp$intValue } unrexp_list <- function(myrexp){ lapply(myrexp$rexpValue, unrexp) } unrexp_logical <- function(myrexp){ xvalue <- myrexp$booleanValue xvalue[xvalue==2] <- NA as.logical(xvalue) } unrexp_null <- function(){ NULL } unrexp_native <- function(myrexp){ buf <- myrexp$nativeValue if(!length(buf)) return(NULL) unserialize(buf) } #Helper function to lookup a PB descriptor pb <- function(name){ descriptor <- deparse(substitute(name)) if(!exists(descriptor, "RProtoBuf:DescriptorPool")){ stop("No ProtoBuf Descriptor for: ", descriptor) } get(descriptor, "RProtoBuf:DescriptorPool") } #Checks if object can be serialized can_serialize_pb <- rexp_valid <- function(obj) { # We can now serialize everything. just call back to R serialization return(TRUE) } RProtoBuf/R/serialize.R0000644000176200001440000000256014535123416014456 0ustar liggesusers # serialization of protobuf messages # at the moment, we grab the payload as a raw vector and send this # to the connection, but in the future, we will directly stream out # the payload to the connection setGeneric( "serialize" ) setMethod( "serialize", c( object = "Message" ) , function( object, connection, ascii = FALSE, refhook = NULL){ stopifnot(object$isInitialized()) iscon <- inherits(connection, "connection") isnull <- is.null( connection ) if( is.character( connection ) ){ # pretend it is a file name if( !file.exists(connection) ){ if( !file.exists( dirname(connection) ) ){ stop( "directory does not exist" ) } file <- normalizePath(connection, mustWork=FALSE) } else{ file <- file_path_as_absolute(connection) } .Call( Message__serialize_to_file, object@pointer, file ) invisible( NULL) } else if( iscon || isnull ) { # first grab the payload as a raw vector, payload <- .Call( Message__get_payload, object@pointer ) if( isnull ){ # just return it if the connection is NULL payload } else{ # otherwise write the payload to the connection # FIXME: we might want to be more clever about this so that # we don't have to store the full payload in memory # but for now it will do just fine writeBin( payload, connection ) invisible( NULL ) } } } ) RProtoBuf/R/add.R0000644000176200001440000000045114535123416013214 0ustar liggesusers setGeneric( "add", function(object, field, values){ standardGeneric( "add" ) } ) setMethod( "add", "Message", function( object, field, values ){ if( is( values, "Message" ) ){ values <- list( values ) } .Call( Message__add_values, object@pointer, field, values ) invisible( object ) } ) RProtoBuf/R/unit_tests.R0000644000176200001440000000017713057365267014704 0ustar liggesusers run_unit_tests <- function(){ script <- system.file( "unitTests", "runTests.R", package = "RProtoBuf" ) source( script ) } RProtoBuf/R/field_count.R0000644000176200001440000000452114752644073014771 0ustar liggesuserssetGeneric( "field_count", function(object){ standardGeneric( "field_count" ) } ) setMethod( "field_count", "Descriptor", function(object){ .Call( Descriptor__field_count, object@pointer ) } ) setGeneric( "nested_type_count", function(object){ standardGeneric( "nested_type_count" ) } ) setMethod( "nested_type_count", "Descriptor", function(object){ .Call( Descriptor__nested_type_count, object@pointer ) } ) setGeneric( "enum_type_count", function(object){ standardGeneric( "enum_type_count" ) } ) setMethod( "enum_type_count", "Descriptor", function(object){ .Call( Descriptor__enum_type_count, object@pointer ) } ) setGeneric( "field", function(object, index, number, name){ standardGeneric( "field" ) } ) setMethod( "field", "Descriptor", function( object, index, number, name){ has_index <- !missing(index) has_number <- !missing(number) has_name <- !missing(name) if( as.integer(has_index) + as.integer(has_number) + as.integer(has_name) != 1L ){ stop( "need exactly one of `index`, `number` or `name`" ) } if( has_index ){ return( .Call( Descriptor__field, object@pointer, as.integer(index)-1L ) ) } if( has_number ){ return( .Call( Descriptor__FindFieldByNumber, object@pointer, as.integer(number) ) ) } if( has_name ){ return( .Call( Descriptor__FindFieldByName, object@pointer, as.character(name) ) ) } } ) setGeneric( "nested_type", function(object, index, name){ standardGeneric( "nested_type" ) } ) setMethod( "nested_type", "Descriptor", function(object, index, name ){ has_index <- !missing(index) has_name <- !missing(name) if( !identical( as.integer(has_index) + as.integer(has_name), 1L ) ){ stop( "need exactly one of `index` or `name`" ) } if( has_index ){ return( .Call( Descriptor__nested_type, object@pointer, as.integer(index)-1L ) ) } if( has_name ){ return( .Call( Descriptor__FindNestedTypeByName, object@pointer, as.character(name) ) ) } } ) setMethod( "enum_type", "Descriptor", function(object, index, name){ has_index <- !missing(index) has_name <- !missing(name) if( !identical( as.integer(has_index) + as.integer(has_name), 1L ) ){ stop( "need exactly one of `index` or `name`" ) } if( has_index ){ return( .Call( Descriptor__enum_type, object@pointer, as.integer(index)-1L ) ) } if( has_name ){ stop( "No routine for finding enum type of a Descriptor by name. ") } }) RProtoBuf/R/extensions.R0000644000176200001440000000363214752644073014677 0ustar liggesusers# Copyright 2012 Google Inc. All Rights Reserved. # Author: mstokely@google.com (Murray Stokely) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. setGeneric( "setExtension", function(object, field, values){ standardGeneric( "setExtension" ) } ) setMethod( "setExtension", "Message", function( object, field, values ){ if (!inherits(field, "FieldDescriptor")) { stop("setExtension requires a FieldDescriptor") } if (!is_extension(field)) { stop(name(field), " is not an extension FieldDescriptor.") } .Call(setMessageField, object@pointer, field, values) invisible( object ) } ) setGeneric( "getExtension", function(object, field){ standardGeneric( "getExtension" ) } ) setMethod( "getExtension", "Message", function( object, field){ if (!inherits(field, "FieldDescriptor")) { stop("getExtension requires a FieldDescriptor") } if (!is_extension(field)) { stop(name(field), " is not an extension FieldDescriptor.") } # This check causes a CHECK failure in the C++ code, so give # a more user-friendly error here. if (containing_type(field)@type != object@type) { stop("Field", name(field), " does not match message type ", "(", containing_type(field)@type, "!=", object@type, ")") } .Call(getExtension_cpp, object@pointer, field) } ) RProtoBuf/R/initialized.R0000644000176200001440000000032414535123416014770 0ustar liggesusers setGeneric( "isInitialized", function( object, ... ){ standardGeneric( "isInitialized" ) } ) setMethod( "isInitialized", "Message", function(object, ... ){ .Call( Message__is_initialized, object@pointer ) } ) RProtoBuf/R/zzz.R0000644000176200001440000000165614535367160013337 0ustar liggesusers .onLoad <- function(libname, pkgname ){ ##minversion <- packageDescription(pkgname, lib.loc=libname)$MinimumLibProtoVersion ##minversion <- as.integer( gsub( "[[:space:]]+", "", minversion ) ) ##.Call(check_libprotobuf_version, minversion) readProtoFiles2( protoPath=system.file( "proto", package=pkgname, lib.loc=libname ) ) attachDescriptorPool( pos = length(search()) ) options("RProtoBuf.int64AsString" = FALSE) #if( exists( ".httpd.handlers.env", asNamespace( "tools" ) ) ){ # e <- tools:::.httpd.handlers.env # e[["RProtoBuf"]] <- RProtoBuf.http.handler #} .RProtoBuf_libname <<- libname } .onAttach <- function(libname, pkgName) { if (interactive()) { packageStartupMessage("RProtoBuf ", packageVersion("RProtoBuf"), " using Protocol Buffers library version ", format(getProtobufLibVersion(TRUE)), ".") } } RProtoBuf/R/00classes.R0000644000176200001440000004623214752644230014273 0ustar liggesusers# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: # this has to be IMPLEMENTATIONS <- new.env( parent = emptyenv() ) # invisible version of .Call #.icall <- function(...) invisible(.Call(...)) # {{{ class definitions # we need to formalize connection so that the S4 methods # ConnectionInputStream and ConnectionOutputStream can # dispatch connections setOldClass( "connection" ) # FIXME: there is probably another way # TODO: include other subclasses of connections setOldClass( c("file", "connection" ) ) setOldClass( c("url", "connection" ) ) setClass( "Descriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::Descriptor c++ object type = "character" # message type ), prototype = list( pointer = NULL, type = character(0) ) ) setClass( "FieldDescriptor", representation( pointer = "externalptr" , # pointer to a google::protobuf::FieldDescriptor c++ object name = "character", full_name = "character", type = "character" ), prototype = list( pointer = NULL, name = character(0), full_name = character(0), type = character(0) ) ) setClass( "EnumDescriptor", representation( pointer = "externalptr" , # pointer to a google::protobuf::EnumDescriptor c++ object name = "character", full_name = "character", type = "character" # TODO(mstokely): enums don't really have another type, remove? ), prototype = list( pointer = NULL, name = character(0), full_name = character(0), type = character(0) ) ) setClass( "ServiceDescriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::ServiceDescriptor c++ object name = "character" # full name of the service ), prototype = list( pointer = NULL, name = character(0) ) ) setClass( "MethodDescriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::ServiceDescriptor c++ object name = "character" , # full name of the service service = "character" # full name of the service that defines this method ), prototype = list( pointer = NULL, name = character(0), service = character(0) ) ) setClass( "FileDescriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::FileDescriptor c++ object filename = "character", # filename package = "character" # the package ), prototype = list( pointer = NULL, filename = character(0), package = character(0) ) ) setClass( "EnumValueDescriptor", representation( pointer = "externalptr", # pointer to a google::protobuf::EnumValueDescriptor c++ object name = "character", full_name = "character" ), prototype = list( pointer = NULL, name = character(0), full_name = character(0) ) ) # actual objects setClass( "Message", representation( pointer = "externalptr", # pointer to sa google::protobuf::Message object type = "character" # message type (fully qualified, with package path) ), prototype = list( pointer = NULL, type = character(0) ) ) # rpc #setClass( "RpcHTTP", representation( # host = "character", port = "integer", root = "character" #), prototype = list( host = "127.0.0.1", port = 4444L, root = "" ) ) # streams setClass( "ZeroCopyInputStream", representation( pointer = "externalptr" ), prototype = list( pointer = NULL ), contains = "VIRTUAL" ) setClass( "ArrayInputStream", contains = "ZeroCopyInputStream" ) setClass( "FileInputStream", contains = "ZeroCopyInputStream" ) setClass( "ConnectionInputStream", contains = "ZeroCopyInputStream" ) setClass( "ZeroCopyOutputStream", representation( pointer = "externalptr" ), prototype = list( pointer = NULL ), contains = "VIRTUAL" ) setClass( "ArrayOutputStream", contains = "ZeroCopyInputStream" ) setClass( "FileOutputStream", contains = "ZeroCopyInputStream" ) setClass( "ConnectionOutputStream", contains = "ZeroCopyOutputStream" ) # }}} # {{{ new newProto <- function( descriptor, ... ){ message <- .Call(newProtoMessage, descriptor) update( message, ... ) message } setGeneric("new") setMethod("new", signature(Class="Descriptor"), function(Class, ...) newProto(Class, ...)) # }}} # {{{ P P <- function( type, file ){ if( !missing(file) ){ readProtoFiles( file ) } if( missing( type ) ){ stop( "'type' is required" ) } if( !is.character(type) ){ stop( "'type' is not a character vector" ) } if( length(type) != 1L){ stop( "'type' should have exactly one element" ) } desc <- .Call(getProtobufDescriptor, type) if( is.null( desc ) ){ # See if it is an extension desc <- .Call(getExtensionDescriptor, type) if (is.null(desc)) { # See if it is an enum desc <- .Call(getEnumDescriptor, type) if (is.null(desc)) { stop( sprintf( "could not find descriptor for message type '%s' ", type ) ) } } } desc } # }}} # {{{ show setMethod( "show", c( "Message" ), function(object){ tmp <- sprintf( "message of type '%s' with %d field%s set", object@type, length(object), if (length(object) == 1) "" else "s" ) nexts <- .Call(Message__num_extensions, object@pointer) if (nexts > 0) { tmp <- paste(tmp, sprintf("and %d extension%s", nexts, if (nexts == 1) "" else "s")) } cat(tmp, fill=TRUE) } ) setMethod( "show", c( "Descriptor" ), function(object){ cat( sprintf( "descriptor for type '%s' ", object@type ) , fill=TRUE) } ) setMethod( "show", c( "FieldDescriptor" ), function(object){ cat( sprintf( "descriptor for field '%s' of type '%s' ", object@name, object@type ), fill=TRUE) } ) setMethod( "show", c( "EnumDescriptor" ), function(object){ cat( sprintf( "descriptor for enum '%s' with %d values", object@name, value_count(object) ) , fill=TRUE) } ) setMethod( "show", c( "ServiceDescriptor" ), function(object){ cat( sprintf( "service descriptor <%s>", object@name ) , fill=TRUE) } ) setMethod( "show", c( "FileDescriptor" ), function(object){ cat( sprintf( "file descriptor for package %s (%s)", object@package, object@filename) , fill=TRUE) } ) setMethod( "show", c( "EnumValueDescriptor" ), function(object){ cat( sprintf( "enum value descriptor %s", object@full_name), fill=TRUE) } ) # }}} # {{{ dollar extractors setMethod("$", "Message", function(x, name) { switch( name, "has" = function( ... ) has(x, ...), "clone" = function( ... ) .Call(Message__clone , x@pointer), "isInitialized" = function() .Call(Message__is_initialized, x@pointer), "descriptor" = function() .Call(Message__descriptor , x@pointer), "size" = function(field, ...) size(x, field, ... ), "bytesize" = function() bytesize(x), "swap" = function(...) swap(x,...), "update" = function(...) update(x, ...), "str" = function() str(x), "as.character" = function() as.character(x), "as.list" = function() as.list(x), "asMessage" = function() asMessage(x), "setExtension" = function(field, values, ...) setExtension(x, field, values, ...), "getExtension" = function(field, ...) getExtension(x, field, ...), "set" = function(...) set( x, ... ), "fetch" = function(...) fetch(x, ... ), "toString" = function(...) toString( x, ... ), "toJSON" = function(preserve_proto_field_names = FALSE, always_print_primitive_fields = FALSE, ...) toJSON(x, preserve_proto_field_names = preserve_proto_field_names, always_print_primitive_fields = always_print_primitive_fields, ... ), "toTextFormat" = function() toTextFormat(x), "toDebugString" = function() toDebugString(x), "add" = function(...) add( x, ...), "serialize" = function(...) serialize( x, ... ), "clear" = function(...) clear( x, ... ), "fileDescriptor" = function() fileDescriptor(x ), # default .Call(getMessageField, x@pointer, name) ) } ) setMethod("$<-", "Message", function(x, name, value) { .Call(setMessageField, x@pointer, name, value) x } ) setMethod("$", "Descriptor", function(x, name) { switch( name, "new" = function( ... ) newProto( x, ... ) , "read" = function( input ) read( x, input ) , "readASCII" = function(input, ...) readASCII(x, input, ...), "readJSON" = function(input, ...) readJSON(x, input, ...), "toString" = function(...) toString(x, ...) , "as.character" = function(...) as.character(x, ...) , "as.list" = function(...) as.list(x, ...) , "asMessage" = function() asMessage(x), "fileDescriptor" = function() fileDescriptor(x ), "name" = function(...) name(x, ... ), "containing_type" = function() containing_type(x), "field_count" = function() field_count(x), "nested_type_count" = function() nested_type_count(x), "enum_type_count" = function() enum_type_count(x), "field" = function(...) field( x, ... ), "nested_type" = function(...) nested_type( x, ...), "enum_type" = function(...) enum_type( x, ...), # default .Call(do_dollar_Descriptor, x@pointer, name) ) } ) setMethod( "$", "EnumDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "as.list"= function() as.list(x) , "asMessage" = function() asMessage(x), "toString" = function(...) toString(x, ...) , "name" = function(...) name(x, ...), "fileDescriptor" = function() fileDescriptor(x ), "containing_type" = function() containing_type(x), "length" = function() length(x), "value_count" = function() value_count(x), "value" = function(...) value(x, ...), "has" = function(name, ...) has(x, name, ...), # default .Call(get_value_of_enum, x@pointer, name) ) } ) setMethod( "$", "FieldDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "asMessage" = function() asMessage(x), "toString" = function(...) toString(x, ...) , "name" = function(...) name(x, ...), "fileDescriptor" = function() fileDescriptor(x ), "containing_type" = function() containing_type(x), "is_extension" = function() is_extension(x), "number" = function() number(x), "type" = function(...) type(x, ...), "cpp_type" = function(...) cpp_type(x, ...), "label" = function(...) label(x, ...), "is_repeated" = function() is_repeated(x), "is_required" = function() is_required(x), "is_optional" = function() is_optional(x), "has_default_value" = function() has_default_value(x), "default_value" = function() default_value(x), "enum_type" = function() enum_type(x), "message_type" = function() message_type(x), invisible(NULL) ) } ) setMethod( "$", "ServiceDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "asMessage" = function() asMessage(x), "toString" = function(...) toString(x, ...) , "name" = function(...) name(x, ...), "fileDescriptor" = function() fileDescriptor(x ), "method_count" = function() method_count(x), "method" = function(...) method(x, ... ), stop( "No '", name, "' method for ServiceDescriptor objects is implemented." ) ) } ) setMethod( "$", "FileDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "toString" = function(...) toString(x, ...) , "asMessage" = function() asMessage(x), "as.list" = function() as.list(x), "name" = function(...) name(x, ... ), "package" = function() x@package, as.list(x)[[name]] ) }) setMethod( "$", "EnumValueDescriptor", function(x, name ){ switch( name, "as.character" = function() as.character(x), "toString" = function(...) toString(x, ...) , "asMessage" = function() asMessage(x), "name" = function(...) name(x, ... ), "number" = function() number(x), "enum_type" = function(...) enum_type( x, ...), invisible(NULL) ) }) setMethod( "$", "MethodDescriptor", function(x, name ){ switch( name, #"invoke" = function(...) invoke(x, ...), "implementation" = if( x@name %in% names(IMPLEMENTATIONS) ){ get( x@name, IMPLEMENTATIONS ) }, "name" = function(...) name(x, ...), "toString" = function() toString(x) , "as.character" = function() as.character(x), "fileDescriptor" = function() fileDescriptor(x ), "input_type" = function() input_type(x), "output_type" = function() output_type(x), invisible( NULL) ) } ) #setMethod( "$<-", "MethodDescriptor", function(x, name, value ){ # # if( identical( name, "implementation" ) ){ # check_valid_implementation( x, value ) # assign( x@name, value, envir = IMPLEMENTATIONS ) # } # x #} ) setMethod( "$", "ZeroCopyInputStream", function(x, name ){ switch( name, # ZeroCopyInputStream C++ methods "Next" = function(...) Next(x, ...), "ByteCount" = function(...) ByteCount(x, ...), "Skip" = function(...) Skip(x, ...), "BackUp" = function(...) BackUp(x, ...), # CodedInputStream related "ReadRaw" = function(...) ReadRaw(x, ...), "ReadString" = function(...) ReadString(x, ...), "ReadVarint32"= function() ReadVarint32(x), "ReadVarint64" = function() ReadVarint64(x), "ReadLittleEndian32" = function() ReadLittleEndian32(x), "ReadLittleEndian64" = function() ReadLittleEndian64(x), # default invisible(NULL) ) } ) setMethod( "$", "ZeroCopyOutputStream", function(x, name ){ switch( name, # ZeroCopyInputStream C++ methods "Next" = function(...) Next(x, ...), "ByteCount" = function(...) ByteCount(x, ...), "BackUp" = function(...) BackUp(x, ...), # CodedOutputStream related "WriteRaw" = function(...) WriteRaw(x, ...), "WriteString" = function(...) WriteString(x, ...), "WriteLittleEndian32" = function(...) WriteLittleEndian32(x,...), "WriteLittleEndian64" = function(...) WriteLittleEndian64(x,...), "WriteVarint32" = function(...) WriteVarint32(x, ...), "WriteVarint64" = function(...) WriteVarint64(x, ...), # default invisible(NULL) ) } ) # }}} # {{{ [[ setMethod( "[[", "Message", function(x, i, j, ..., exact = TRUE){ if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } ## This works correctly by number or name. e.g. p[[1]] or p[["name"]] if( is.character( i ) || is.numeric( i ) ){ .Call(getMessageField, x@pointer, i) } else { stop( "wrong type, `i` should be a character or a number" ) } } ) setMethod( "[[", "Descriptor", function(x, i, j, ..., exact = TRUE){ if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } if( is.character( i ) ) { # gets a named field, nested type, or enum. .Call(Descriptor_getField, x@pointer, i) } else if (is.numeric( i ) ) { return(as.list(x)[[i]]) } else { stop( "wrong type, `i` should be a character or a number" ) } } ) setMethod( "[[", "EnumDescriptor", function(x, i, j, ..., exact = TRUE){ if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } if (is.character(i) || is.numeric(i)) { return(as.list(x)[[i]]) } else { stop( "wrong type, `i` should be a character or a number" ) } } ) setMethod("[[", "ServiceDescriptor", function(x, i, j, ..., exact = TRUE){ if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } if( is.character( i ) || is.numeric( i ) ){ stop( "No '", name, "' method for ServiceDescriptor objects is implemented." ) } else{ stop( "wrong type, `i` should be a character or a number" ) } } ) # }}} # {{{ [[<- setReplaceMethod( "[[", "Message", function(x, i, j, ..., exact = TRUE, value ){ # TODO: we might want to relax this later, i.e # allow to mutate repeated fields like this: # x[[ "field", 1:2 ]] <- 1:2 if( missing( i ) ){ stop( "`i` is required" ) } if( !missing(j) ){ warning( "`j` is ignored" ) } if( is.character( i ) || is.numeric( i ) ){ .Call( setMessageField, x@pointer, i, value ) } else { stop( "wrong type, `i` should be a character or a number" ) } x } ) # }}} # {{{ update setGeneric( "update" ) setMethod( "update", "Message", function( object, ... ){ dots <- list( ... ) if( !length( dots ) ){ return( object ) } names <- names( dots ) named <- dots[ names != "" ] if( !length( named ) ){ return( object ) } .Call( update_message, object@pointer, named) object } ) # }}} # {{{ length setGeneric( "length" ) setMethod( "length", "Message", function( x ){ .Call( Message__length, x@pointer ) } ) # Returns number of fields, enums, types in message descriptor. # May be more than field_count which is only fields. # e.g. length(tutorial.Person) > field_count(tutorial.Person) setMethod( "length", "Descriptor", function( x ){ length(as.list(x)) } ) setMethod( "length", "EnumDescriptor", function( x ){ .Call( EnumDescriptor__length, x@pointer ) } ) setMethod( "length", "ServiceDescriptor", function( x ){ .Call("ServiceDescriptor_method_count", x@pointer ) } ) # }}} # {{{ str # we need to do this otherwise it gets messed up by the length method setGeneric( "str" ) setMethod( "str", "Message", function( object, ...){ txt <- sprintf( ' Formal class \'Message\' [package "RProtoBuf"] with 2 slots ..@ pointer: ..@ type : chr "%s" ', object@type ) writeLines( txt ) } ) # }}} # {{{ name setGeneric( "name", function(object, full = FALSE){ standardGeneric( "name" ) }) setMethod( "name", c( object = "Descriptor" ) , function(object, full = FALSE){ .Call( Descriptor__name, object@pointer, full ) }) setMethod( "name", c( object = "FieldDescriptor" ) , function(object, full = FALSE){ .Call( FieldDescriptor__name, object@pointer, full ) }) setMethod( "name", c( object = "EnumDescriptor" ) , function(object, full = FALSE){ .Call( EnumDescriptor__name, object@pointer, full ) }) setMethod( "name", c( object = "EnumValueDescriptor" ) , function(object, full = FALSE){ .Call( EnumValueDescriptor__name, object@pointer, full ) }) setMethod( "name", c( object = "ServiceDescriptor" ) , function(object, full = FALSE){ .Call( ServiceDescriptor__name, object@pointer, full ) }) setMethod( "name", c( object = "MethodDescriptor" ) , function(object, full = FALSE){ .Call( MethodDescriptor__name, object@pointer, full ) }) setMethod( "name", c( object = "FileDescriptor" ) , function(object, full = FALSE){ filename <- .Call( FileDescriptor__name, object@pointer ) if( full ) filename else basename( filename ) }) # }}} # {{{ names # as.list() and names() don't make as much sense for FieldDescriptors, # EnumValueDescriptors, etc. setMethod( "names", c( x = "Message" ) , function(x){ names(as.list(x)) }) setMethod( "names", c( x = "Descriptor" ) , function(x){ names(as.list(x)) }) setMethod( "names", c( x = "EnumDescriptor" ) , function(x){ names(as.list(x)) }) # }}} # {{{ as setAs("Descriptor", "Message", function(from){ .Call( Descriptor__as_Message, from@pointer ) }) setAs("FieldDescriptor", "Message", function(from){ .Call( FieldDescriptor__as_Message, from@pointer ) }) setAs("EnumDescriptor", "Message", function(from){ .Call( EnumDescriptor__as_Message, from@pointer ) }) setAs("ServiceDescriptor", "Message", function(from){ .Call( ServiceDescriptor__as_Message, from@pointer ) }) setAs("MethodDescriptor", "Message", function(from){ .Call( MethodDescriptor__as_Message, from@pointer ) }) setAs("FileDescriptor", "Message", function(from){ .Call( FileDescriptor__as_Message, from@pointer ) }) setAs("EnumValueDescriptor", "Message", function(from){ .Call( EnumValueDescriptor__as_Message, from@pointer ) }) asMessage <- function( x, ... ){ as( x, "Message", ... ) } # }}} # {{{ enum_type setGeneric( "enum_type", function( object, index, name ){ standardGeneric( "enum_type" ) }) # }}} RProtoBuf/R/read.R0000644000176200001440000000473714535123416013412 0ustar liggesusers setGeneric( "read", function( descriptor, input ){ standardGeneric( "read" ) } ) setMethod( "read", c( descriptor = "Descriptor" , input = "character" ), function(descriptor, input ){ file <- file_path_as_absolute( input ) .Call(Descriptor__readMessageFromFile, descriptor@pointer, file) } ) setMethod( "read", c( descriptor = "Descriptor", input = "raw" ), function(descriptor, input ){ .Call(Descriptor__readMessageFromRawVector, descriptor@pointer, input) } ) setMethod( "read", c( descriptor = "Descriptor" ), function( descriptor, input ){ if( !inherits( input, "connection" ) ){ stop( "can only read from connections" ) } wasopen <- identical( summary(input)[["opened"]], "opened" ) if( !wasopen ) open( input, "rb") stopifnot(summary(input)[["text"]] == "binary") message <- .Call(Descriptor__readMessageFromConnection, descriptor@pointer, input) if( !wasopen ) close( input ) message } ) setGeneric( "readASCII", function( descriptor, input, partial=FALSE ){ standardGeneric( "readASCII" ) } ) setMethod( "readASCII", c( descriptor = "Descriptor" , input = "character" ), function(descriptor, input, partial=FALSE){ stopifnot(is.logical(partial), length(partial) == 1) .Call(Descriptor__readASCIIFromString, descriptor@pointer, input, partial) } ) setMethod( "readASCII", c( descriptor = "Descriptor" ), function( descriptor, input, partial=FALSE){ stopifnot(is.logical(partial), length(partial) == 1) if( !inherits( input, "connection" ) ){ stop( "can only read from connections" ) } wasopen <- identical( summary(input)[["opened"]], "opened" ) if( !wasopen ) open( input, "rb" ) stopifnot(summary(input)[["text"]] == "binary") message <- .Call(Descriptor__readASCIIFromConnection, descriptor@pointer, input, partial) close(input) message } ) setGeneric( "readJSON", function( descriptor, input ){ standardGeneric( "readJSON" ) } ) setMethod( "readJSON", c( descriptor = "Descriptor" , input = "character" ), function(descriptor, input){ .Call(Descriptor__readJSONFromString, descriptor@pointer, input) } ) setMethod( "readJSON", c( descriptor = "Descriptor" ), function( descriptor, input){ if( !inherits( input, "connection" ) ){ stop( "can only read from connections" ) } wasopen <- identical( summary(input)[["opened"]], "opened" ) if( !wasopen ) open( input, "rb" ) stopifnot(summary(input)[["text"]] == "binary") message <- .Call(Descriptor__readJSONFromConnection, descriptor@pointer, input) close(input) message } ) RProtoBuf/R/containing_type.R0000644000176200001440000000162714535123416015664 0ustar liggesusers setGeneric( "containing_type", function(object){ standardGeneric( "containing_type" ) } ) setMethod( "containing_type", "Descriptor", function(object){ retval <- .Call( Descriptor__containing_type, object@pointer ) if (length(retval@type) == 0) { # Descriptors do not always have containing types. # In such cases NULL is better return value than malformed Descriptor. return(NULL) } else { return(retval) } } ) setMethod( "containing_type", "EnumDescriptor", function(object){ retval <- .Call( EnumDescriptor__containing_type, object@pointer ) if (length(name(retval)) == 0) { # If this enum type is nested in a message type, this # is that message type. Otherwise, NULL. return(NULL) } else { return(retval) } } ) setMethod( "containing_type", "FieldDescriptor", function(object){ # Never NULL .Call( FieldDescriptor__containing_type, object@pointer ) } ) RProtoBuf/R/aslist.R0000644000176200001440000000102714535123416013763 0ustar liggesusersas.list.Message <- function( x, ...){ .Call(Message__as_list, x@pointer) } as.list.Descriptor <- function(x, ...){ # Fields, then nested types, then enum types defined in the message # are returned in a list. .Call(Descriptor__as_list, x@pointer) } as.list.EnumDescriptor <- function( x, ...){ .Call(EnumDescriptor__as_list, x@pointer) } as.list.FileDescriptor <- function( x, ...){ .Call(FileDescriptor__as_list, x@pointer) } as.list.ServiceDescriptor <- function( x, ...){ .Call(ServiceDescriptor__as_list, x@pointer) } RProtoBuf/R/serialize_pb.R0000644000176200001440000000315112710022354015124 0ustar liggesusers#' Serialize R object to Protocol Buffer Message. #' #' Serializes R objects to a general purpose protobuf message using the same #' \code{rexp.proto} descriptor and mapping between R objects and protobuf #' mesages as RHIPE. #' #' Clients need both the message and the \code{rexp.proto} descriptor to parse #' serialized R objects. The latter is included in the the package installation #' \code{proto} directory: \code{system.file(package="RProtoBuf", "proto/rexp.proto")} #' #' The following storage types are natively supported by the descriptor: #' \code{character}, \code{raw}, \code{double}, \code{complex}, \code{integer}, #' \code{list}, and \code{NULL}. Objects with other storage types, such as #' functions, environments, S4 classes, etc, are serialized using base R #' \code{\link{serialize}} and stored in the proto \code{native} type. #' Missing values, attributes and numeric precision will be preserved. #' #' @param object R object to serialize #' @param connection passed on to \code{\link{serialize}} #' @param ... additional arguments passed on to \code{\link{serialize}} #' @aliases unserialize_pb can_serialize_pb #' @export unserialize_pb #' @export can_serialize_pb #' @export #' @examples msg <- tempfile(); #' serialize_pb(iris, msg); #' obj <- unserialize_pb(msg); #' identical(iris, obj); #' serialize_pb <- function(object, connection, ...){ #convert object to protobuf message msg <- rexp_obj(object); #serialize the message serialize(msg, connection = connection, ...); } unserialize_pb <- function(connection){ #convert object to protobuf message unrexp(read(pb(rexp.REXP), connection)); } RProtoBuf/R/wrapper_ServiceDescriptor.R0000644000176200001440000000136314752644073017676 0ustar liggesuserssetGeneric( "method_count", function(object ){ standardGeneric( "method_count" ) } ) setMethod( "method_count", "ServiceDescriptor", function(object){ .Call("ServiceDescriptor_method_count", object@pointer) } ) setGeneric( "method", function(object, index, name ){ standardGeneric( "method" ) } ) setMethod( "method", "ServiceDescriptor", function(object, index, name){ has_index <- !missing(index) has_name <- !missing(name) if( as.integer(has_index) + as.integer(has_name) != 1L ){ stop( "need exactly one of `index` or `name`" ) } if( has_index ){ stop( "No routine for getting a method from a ServiceDescriptor by index." ) } if( has_name ){ stop( "No routine for getting a method from a ServiceDescriptor by name." ) } } ) RProtoBuf/R/wrapper_CodedInputStream.R0000644000176200001440000000403214535123416017435 0ustar liggesusers setGeneric( "ReadRaw", function(object, size ){ standardGeneric( "ReadRaw" ) } ) setMethod( "ReadRaw", c( object="ZeroCopyInputStream", size = "integer" ), function(object, size){ .Call(ZeroCopyInputStream_ReadRaw, object@pointer, size) } ) setMethod("ReadRaw", c( object="ZeroCopyInputStream", size = "numeric" ), function(object, size) { if (size %% 1 == 0) { .Call(ZeroCopyInputStream_ReadRaw, object@pointer, as.integer(size)) } else { stop("Size must be a whole number.") } } ) setGeneric( "ReadString", function(object, size ){ standardGeneric( "ReadString" ) } ) setMethod( "ReadString", c( object="ZeroCopyInputStream", size = "integer" ), function(object, size){ .Call(ZeroCopyInputStream_ReadString, object@pointer, size) } ) setMethod("ReadString", c( object="ZeroCopyInputStream", size = "numeric" ), function(object, size) { if (size %% 1 == 0) { .Call(ZeroCopyInputStream_ReadString, object@pointer, as.integer(size)) } else { stop("Size must be a whole number.") } } ) setGeneric( "ReadVarint32", function(object){ standardGeneric( "ReadVarint32" ) } ) setMethod( "ReadVarint32", c( object="ZeroCopyInputStream"), function(object){ .Call(ZeroCopyInputStream_ReadVarint32, object@pointer) } ) setGeneric( "ReadLittleEndian32", function(object){ standardGeneric( "ReadLittleEndian32" ) } ) setMethod( "ReadLittleEndian32", c( object="ZeroCopyInputStream"), function(object){ .Call(ZeroCopyInputStream_ReadLittleEndian32, object@pointer) } ) setGeneric( "ReadLittleEndian64", function(object){ standardGeneric( "ReadLittleEndian64" ) } ) setMethod( "ReadLittleEndian64", c( object="ZeroCopyInputStream"), function(object){ .Call(ZeroCopyInputStream_ReadLittleEndian64, object@pointer) } ) setGeneric( "ReadVarint64", function(object){ standardGeneric( "ReadVarint64" ) } ) setMethod( "ReadVarint64", c( object="ZeroCopyInputStream"), function(object){ .Call(ZeroCopyInputStream_ReadVarint64, object@pointer) } ) RProtoBuf/R/swap.R0000644000176200001440000000063214535123416013437 0ustar liggesuserssetGeneric("swap", function( object, field, left, right) { standardGeneric( "swap" ) } ) setMethod( "swap", "Message", function( object, field, left, right ){ left <- as.integer( left ) - 1L right <- as.integer( right ) - 1L if( length(left) != length(right) ){ stop( "left and right should have the same length" ) } .Call( Message__swap, object@pointer, field, left, right ) invisible( object ) } ) RProtoBuf/R/debug_string.R0000644000176200001440000000506314535123416015144 0ustar liggesusers ._toString_Message <- function(x, debug = getOption("RProtoBuf.toString.debug", TRUE), ...){ if (isTRUE(debug)) { .Call( Message__as_character, x@pointer ) } else { .Call( Message__print_text_format, x@pointer) } } ._toString_Descriptor <- function(x, ...){ .Call( Descriptor__as_character, x@pointer ) } ._toString_EnumDescriptor <- function(x, ...){ .Call( EnumDescriptor__as_character, x@pointer ) } ._toString_FieldDescriptor <- function(x, ...){ .Call( FieldDescriptor__as_character, x@pointer ) } ._toString_ServiceDescriptor <- function(x, ...){ .Call( ServiceDescriptor__as_character, x@pointer ) } ._toString_MethodDescriptor <- function(x, ...){ .Call( MethodDescriptor__as_character, x@pointer ) } ._toString_FileDescriptor <- function(x, ...){ .Call( FileDescriptor__as_character, x@pointer ) } ._toString_EnumValueDescriptor <- function(x, ...){ .Call( EnumValueDescriptor__as_character, x@pointer ) } setMethod( "as.character", "Message", ._toString_Message ) setMethod( "as.character", "Descriptor", ._toString_Descriptor ) setMethod( "as.character", "EnumDescriptor", ._toString_EnumDescriptor ) setMethod( "as.character", "FieldDescriptor", ._toString_FieldDescriptor ) setMethod( "as.character", "ServiceDescriptor", ._toString_ServiceDescriptor ) setMethod( "as.character", "MethodDescriptor", ._toString_MethodDescriptor ) setMethod( "as.character", "FileDescriptor", ._toString_FileDescriptor ) setMethod( "as.character", "EnumValueDescriptor", ._toString_EnumValueDescriptor ) setGeneric( "toString" ) setMethod( "toString", "Message", ._toString_Message ) setMethod( "toString", "Descriptor", ._toString_Descriptor ) setMethod( "toString", "EnumDescriptor", ._toString_EnumDescriptor ) setMethod( "toString", "FieldDescriptor", ._toString_FieldDescriptor ) setMethod( "toString", "ServiceDescriptor", ._toString_ServiceDescriptor ) setMethod( "toString", "MethodDescriptor", ._toString_MethodDescriptor ) setMethod( "toString", "FileDescriptor", ._toString_FileDescriptor ) setMethod( "toString", "EnumValueDescriptor", ._toString_EnumValueDescriptor ) setGeneric( "toJSON", function( x, ... ) { standardGeneric( "toJSON" ) } ) setMethod( "toJSON", c( x = "Message"), function(x, preserve_proto_field_names = FALSE, always_print_primitive_fields = FALSE) { .Call( Message__as_json, x@pointer, preserve_proto_field_names, always_print_primitive_fields) } ) setGeneric( "toDebugString", function( x ) { standardGeneric( "toDebugString" ) } ) setMethod( "toDebugString", c( x = "Message"), function(x) { .Call( Message__as_character, x@pointer) } ) RProtoBuf/R/descriptor.R0000644000176200001440000000203514535123416014642 0ustar liggesusers setGeneric( "descriptor", function(object, ...){ standardGeneric( "descriptor" ) } ) setMethod( "descriptor", "Message", function(object, ...){ .Call(Message__descriptor, object@pointer) } ) setGeneric( "fileDescriptor", function(object, ...){ standardGeneric( "fileDescriptor" ) } ) setMethod( "fileDescriptor", "Message", function(object, ...){ .Call(Message__fileDescriptor, object@pointer) } ) setMethod( "fileDescriptor", "Descriptor", function(object, ...){ .Call(Descriptor__fileDescriptor, object@pointer) } ) setMethod( "fileDescriptor", "EnumDescriptor", function(object, ...){ .Call(EnumDescriptor__fileDescriptor, object@pointer) } ) setMethod( "fileDescriptor", "FieldDescriptor", function(object, ...){ .Call(FieldDescriptor__fileDescriptor, object@pointer) } ) setMethod( "fileDescriptor", "ServiceDescriptor", function(object, ...){ .Call(ServiceDescriptor__fileDescriptor, object@pointer) } ) setMethod( "fileDescriptor", "MethodDescriptor", function(object, ...){ .Call(MethodDescriptor__fileDescriptor, object@pointer) } ) RProtoBuf/R/wrapper_MethodDescriptor.R0000644000176200001440000000063314535123416017505 0ustar liggesusers setGeneric( "input_type", function(object){ standardGeneric( "input_type" ) } ) setGeneric( "output_type", function(object){ standardGeneric( "output_type" ) } ) setMethod( "input_type", "MethodDescriptor", function(object){ .Call(MethodDescriptor__input_type, object@pointer ) } ) setMethod( "output_type", "MethodDescriptor", function(object){ .Call(MethodDescriptor__output_type, object@pointer ) } ) RProtoBuf/R/wrapper_CodedOutputStream.R0000644000176200001440000000615714535123416017650 0ustar liggesuserssetGeneric( "WriteRaw", function(object, payload){ standardGeneric("WriteRaw") } ) setMethod( "WriteRaw", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteRaw, object@pointer, payload) } ) setGeneric( "WriteString", function(object, payload){ standardGeneric("WriteString") } ) setMethod( "WriteString", c(object="ZeroCopyOutputStream", payload = "character" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteString, object@pointer, payload) } ) setGeneric( "WriteLittleEndian32", function(object, payload){ standardGeneric("WriteLittleEndian32") } ) setMethod( "WriteLittleEndian32", c(object="ZeroCopyOutputStream", payload = "integer" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteLittleEndian32, object@pointer, payload) } ) setMethod( "WriteLittleEndian32", c(object="ZeroCopyOutputStream", payload = "numeric" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteLittleEndian32, object@pointer, payload) } ) setMethod( "WriteLittleEndian32", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteLittleEndian32, object@pointer, payload) } ) setGeneric( "WriteLittleEndian64", function(object, payload){ standardGeneric("WriteLittleEndian64") } ) setMethod( "WriteLittleEndian64", c(object="ZeroCopyOutputStream", payload = "integer" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteLittleEndian64, object@pointer, payload) } ) setMethod( "WriteLittleEndian64", c(object="ZeroCopyOutputStream", payload = "numeric" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteLittleEndian64, object@pointer, payload) } ) setMethod( "WriteLittleEndian64", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteLittleEndian64, object@pointer, payload) } ) setGeneric( "WriteVarint32", function(object, payload){ standardGeneric("WriteVarint32") } ) setMethod( "WriteVarint32", c(object="ZeroCopyOutputStream", payload = "integer" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteVarint32, object@pointer, payload) } ) setMethod( "WriteVarint32", c(object="ZeroCopyOutputStream", payload = "numeric" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteVarint32, object@pointer, payload) } ) setMethod( "WriteVarint32", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteVarint32, object@pointer, payload) } ) setGeneric( "WriteVarint64", function(object, payload){ standardGeneric("WriteVarint64") } ) setMethod( "WriteVarint64", c(object="ZeroCopyOutputStream", payload = "integer" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteVarint64, object@pointer, payload) } ) setMethod( "WriteVarint64", c(object="ZeroCopyOutputStream", payload = "numeric" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteVarint64, object@pointer, payload) } ) setMethod( "WriteVarint64", c(object="ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call(ZeroCopyOutputStream_WriteVarint64, object@pointer, payload) } ) RProtoBuf/R/wrapper_EnumDescriptor.R0000644000176200001440000000202614535123416017167 0ustar liggesusers setGeneric( "value_count", function(object ){ standardGeneric( "value_count" ) } ) setMethod( "value_count", "EnumDescriptor", function(object){ .Call(EnumDescriptor__value_count, object@pointer) } ) setGeneric( "value", function(object, index, name, number ){ standardGeneric( "value" ) } ) setMethod( "value", "EnumDescriptor", function(object, index, name, number){ has_index <- !missing(index) has_number <- !missing(number) has_name <- !missing(name) if( as.integer(has_index) + as.integer(has_number) + as.integer(has_name) != 1L ){ stop( "need exactly one of `index`, `number` or `name`" ) } if( has_index ){ stopifnot(is.numeric(index)) return( .Call(EnumDescriptor__getValueByIndex, object@pointer, as.integer(index)-1L) ) } if( has_number ){ stopifnot(is.numeric(number)) return( .Call(EnumDescriptor__getValueByNumber, object@pointer, as.integer(number)) ) } if( has_name ){ stopifnot(is.character(name)) return( .Call(EnumDescriptor__getValueByName, object@pointer, as.character(name)) ) } } ) RProtoBuf/R/with.R0000644000176200001440000000141314535123416013436 0ustar liggesusers# S3 dispatch does not work for some reason generateActiveBindings <- function(data){ env <- new.env( parent = environment() ) xp <- data@pointer names <- .Call(Message__fieldNames, xp) if( !is.null(names) && length(names) ){ lapply( names, function(x ){ makeActiveBinding( x, function(v){ if( missing(v) ){ # get .Call(getMessageField, xp, x) } else { # set .Call(setMessageField, xp, x, v) } }, env ) } ) } env } with.Message <- function( data, expr, ...){ envir <- generateActiveBindings(data) eval( substitute( expr ), envir = envir ) } within.Message <- function(data, expr, ... ){ envir <- generateActiveBindings(data) eval( substitute( expr ), envir = envir ) data } RProtoBuf/R/has.R0000644000176200001440000000074114535123416013241 0ustar liggesusers setGeneric( "has", function( object, name, ... ){ standardGeneric( "has" ) } ) ._has_message <- function( object, name, ...){ if (!.Call(Message__field_exists, object@pointer, name)) { return(NULL) } else { return(.Call(Message__has_field, object@pointer, name)) } } ._has_enum_name <- function( object, name, ...){ return(.Call(has_enum_name, object@pointer, name)) } setMethod( "has", "Message", ._has_message ) setMethod( "has", "EnumDescriptor", ._has_enum_name) RProtoBuf/R/clone.R0000644000176200001440000000040114535123416013557 0ustar liggesusers setGeneric( "clone", function( object, ... ){ standardGeneric( "clone" ) } ) ._clone.message <- function( object, ... ){ message <- .Call(Message__clone, object@pointer) update( message, ... ) message } setMethod( "clone", "Message", ._clone.message ) RProtoBuf/R/internals.R0000644000176200001440000000730614535123416014471 0ustar liggesusers# set of functions not supposed to be called by the end user # these are thin wrappers around C functions, to help with # the error trapping on R side #' thin wrapper around the C function of the same name #' #' @param files list of proto files to import #' @param dir directory in which to look for proto files (ignored if files is given) #' @param package if specified, proto files are imported from the "proto" directory #' of the package #' @return invisible(NULL) readProtoFiles <- function(files, dir, package = "RProtoBuf", pattern = "\\.proto$", lib.loc = NULL ){ if( missing( files ) ){ if( missing( dir ) ){ if( missing(package) ){ dir <- getwd() } else { dir <- system.file( "proto", package = package, lib.loc = lib.loc ) if( !file.exists( dir ) ){ stop( sprintf("package '%s' does not have a 'proto' directory", package) ) } } } files <- list.files( dir, pattern = pattern, full.names = TRUE ) } else { if( !is.character( files ) ){ stop( "'file' should be a character vector" ) } ex <- sapply( files, file.exists ) if( ! any( ex ) ){ stop( "none of the files exist" ) } # TODO: we need to pass the full path of the file # or create a mapping from the current working directory # in the DiskSourceTree files <- sapply(files[ex], function(x) file_path_as_absolute(x) ) } directories <- unique( c( getwd(), dirname(files) ) ) .Call( readProtoFiles_cpp, files, directories ) invisible(NULL) } readProtoFiles2 <- function(files, dir = ".", pattern = "\\.proto$", recursive = FALSE, protoPath = getwd() ){ if( !is.character( protoPath ) || length( protoPath ) < 1 ){ stop( "'protoPath' should be a character vector with at least one element" ) } protoPath <- unique( normalizePath( protoPath ) ) # Search for the base directory in the search path that contains the given filepath. file_search <- function(filepaths) { helper <- function(filepath) { if( file.exists( filepath ) && file_path_as_absolute( filepath ) == filepath ){ return( TRUE ) } for( baseDir in protoPath ){ if( file.exists( file.path( baseDir, filepath ) ) ){ return( baseDir ) } } return( NA_character_ ) } sapply( filepaths, helper ) } if( missing( files ) ) { if( !is.character( dir ) || length( dir ) < 1 ){ stop( "'dir' argument must be non-empty when 'files' is missing" ) } files <- c() # search for dir relative to the search path. baseDirs <- file_search( dir ) for( i in seq_along( dir ) ) { absPaths <- list.files( file.path( baseDirs[i], dir[i] ), pattern = pattern, recursive = recursive, full.names = TRUE ) files <- c( files, substr( absPaths, nchar( baseDirs[i] ) + 2, 10000L ) ) files <- sub( "^\\./", "", files ) } } missing_files <- files[ is.na( file_search( files ) ) ] if( length( missing_files) > 0 ){ warning( "Missing files: ", paste(missing_files, collapse = ", " ) ) } .Call( readProtoFiles_cpp, files, protoPath ) invisible(NULL) } resetDescriptorPool <- function(){ .Call( resetDescriptorPool_cpp ) readProtoFiles2( protoPath=system.file( "proto", package="RProtoBuf", lib.loc=.RProtoBuf_libname) ) invisible(NULL) } getProtobufLibVersion <- function(format = FALSE){ version <- .Call(get_protobuf_library_version) if (format) { major <- version %/% 10^6 minor <- ( tmp <- (version - major * 10^6) ) %/% 10^3 revision <- (tmp - minor * 10^3 ) package_version(sprintf("%d.%d.%d", major, minor, revision)) } else { version } } RProtoBuf/R/identical.R0000644000176200001440000000153514535123416014424 0ustar liggesusers setGeneric( "identical" ) setMethod( "identical", c(x="Message", y = "Message" ), function( x, y, num.eq = TRUE, single.NA = TRUE, attrib.as.set = TRUE){ .Call(identical_messages, x@pointer, y@pointer) } ) setMethod( "==", c( e1 = "Message", e2 = "Message" ), function(e1, e2 ){ .Call(identical_messages, e1@pointer, e2@pointer) } ) setMethod( "!=", c( e1 = "Message", e2 = "Message" ), function(e1, e2 ){ ! .Call(identical_messages, e1@pointer, e2@pointer) } ) setGeneric( "all.equal" ) setMethod( "all.equal", c( target = "Message", current = "Message" ), function(target, current, tolerance = .Machine$double.eps^0.5, ...){ all.equal.Message(target, current, tolerance, ...) } ) all.equal.Message <- function(target, current, tolerance = .Machine$double.eps^0.5, ...){ .Call(all_equal_messages, target@pointer, current@pointer, tolerance) } RProtoBuf/R/wrapper_ZeroCopyInputStream.R0000644000176200001440000001501414535123416020173 0ustar liggesusers# :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: # {{{ generics setGeneric( "flush" ) setGeneric( "close" ) setGeneric( "GetErrno", function(object){ standardGeneric( "GetErrno" ) } ) setGeneric( "SetCloseOnDelete", function(object, close=FALSE){ standardGeneric( "SetCloseOnDelete" ) } ) # }}} # {{{ methods setGeneric( "Next", function(object, payload){ standardGeneric( "Next" ) } ) setGeneric( "BackUp", function(object, count){ standardGeneric( "BackUp" ) } ) setGeneric( "ByteCount", function(object){ standardGeneric( "ByteCount" ) } ) setGeneric( "Skip", function(object, count){ standardGeneric( "Skip" ) } ) # }}} # {{{ zero input stream setMethod( "Next", c( object = "ZeroCopyInputStream", payload = "missing"), function(object, payload){ .Call(ZeroCopyInputStream_Next, object@pointer) } ) setMethod( "BackUp", "ZeroCopyInputStream", function(object, count){ invisible(.Call(ZeroCopyInputStream_BackUp, object@pointer, count)) } ) setMethod( "ByteCount", "ZeroCopyInputStream", function(object){ .Call(ZeroCopyInputStream_ByteCount, object@pointer) } ) setMethod( "Skip", "ZeroCopyInputStream", function(object, count){ invisible( .Call(ZeroCopyInputStream_Skip, object@pointer, count) ) } ) # }}} # {{{ zero copy output stream setMethod( "Next", c( object = "ZeroCopyOutputStream", payload = "raw" ), function(object, payload){ .Call(ZeroCopyOutputStream_Next, object@pointer, payload) } ) setMethod( "BackUp", "ZeroCopyOutputStream", function(object, count){ invisible( .Call(ZeroCopyOutputStream_BackUp, object@pointer, count) ) } ) setMethod( "ByteCount", "ZeroCopyOutputStream", function(object){ .Call(ZeroCopyOutputStream_ByteCount, object@pointer) } ) # }}} # {{{ ArrayInputStream setGeneric( "ArrayInputStream", function(payload, block_size){ standardGeneric( "ArrayInputStream" ) } ) setMethod( "ArrayInputStream", c( payload = "raw", block_size = "missing" ) , function(payload, block_size){ .Call(ArrayInputStream__new, payload, -1L) } ) setMethod( "ArrayInputStream", c( payload = "raw", block_size = "integer" ) , function(payload, block_size){ .Call(ArrayInputStream__new, payload, block_size) } ) setMethod( "ArrayInputStream", c( payload = "raw", block_size = "numeric" ) , function(payload, block_size){ .Call(ArrayInputStream__new, payload, as.integer(block_size)) } ) # }}} # {{{ ArrayOutputStream constructor function setGeneric( "ArrayOutputStream", function(size, block_size){ standardGeneric( "ArrayOutputStream" ) } ) setMethod( "ArrayOutputStream", signature( size = "integer", block_size = "missing" ), function(size, block_size){ .Call(ArrayOutputStream__new, size, -1L) } ) setMethod( "ArrayOutputStream", signature( size = "integer", block_size = "integer" ), function(size, block_size){ .Call(ArrayOutputStream__new, size, block_size) } ) setMethod( "ArrayOutputStream", signature( size = "integer", block_size = "numeric" ), function(size, block_size){ .Call(ArrayOutputStream__new, size, as.integer(block_size) ) } ) setMethod( "ArrayOutputStream", signature( size = "numeric", block_size = "missing" ), function(size, block_size){ .Call(ArrayOutputStream__new, as.integer(size), -1L) } ) setMethod( "ArrayOutputStream", signature( size = "numeric", block_size = "integer" ),function(size, block_size){ .Call(ArrayOutputStream__new, as.integer(size), block_size) } ) setMethod( "ArrayOutputStream", signature( size = "numeric", block_size = "numeric" ), function(size, block_size){ .Call(ArrayOutputStream__new, as.integer(size), as.integer(block_size) ) } ) # }}} # {{{ FileInputStream setGeneric( "FileInputStream", function(filename, block_size = -1L, close.on.delete = FALSE ){ standardGeneric( "FileInputStream" ) } ) setMethod( "FileInputStream", signature( filename = "character", block_size = "integer", close.on.delete = "logical" ), function(filename, block_size = -1L, close.on.delete = FALSE){ full_filename <- file_path_as_absolute(filename) .Call(FileInputStream_new, filename, block_size, close.on.delete) } ) setMethod( "close", "FileInputStream", function(con, ...){ .Call(FileInputStream_Close, con@pointer) } ) setMethod( "GetErrno", "FileInputStream", function(object){ .Call(FileInputStream_GetErrno, object@pointer) } ) setMethod( "SetCloseOnDelete", "FileInputStream", function(object, close=FALSE){ invisible( .Call(FileInputStream_SetCloseOnDelete, object@pointer, isTRUE(close)) ) } ) # }}} # {{{ FileOutputStream setGeneric( "FileOutputStream", function(filename, block_size = -1L, close.on.delete = FALSE ){ standardGeneric( "FileOutputStream" ) } ) setMethod( "FileOutputStream", signature( filename = "character", block_size = "integer", close.on.delete = "logical" ), function(filename, block_size = -1L, close.on.delete = FALSE){ if( !file.exists( filename ) ){ if( !file.exists( dirname(filename) ) ){ stop( "directory does not exist" ) } filename <- normalizePath(filename, mustWork=FALSE) } else{ filename <- file_path_as_absolute(filename) } .Call(FileOutputStream_new, filename, block_size, close.on.delete) } ) setMethod( "flush", "FileOutputStream", function(con){ .Call(FileOutputStream_Flush, con@pointer) } ) setMethod( "close", "FileOutputStream", function(con, ...){ .Call(FileOutputStream_Close, con@pointer) } ) setMethod( "GetErrno", "FileOutputStream", function(object){ .Call(FileOutputStream_GetErrno, object@pointer) } ) setMethod( "SetCloseOnDelete", "FileOutputStream", function(object, close=FALSE){ invisible( .Call(FileOutputStream_SetCloseOnDelete, object@pointer, isTRUE(close)) ) } ) # }}} # {{{ ConnectionInputStream setGeneric( "ConnectionInputStream", function(object, ...){ standardGeneric( "ConnectionInputStream" ) } ) setMethod( "ConnectionInputStream", "connection", function(object, ...){ sc <- summary( object ) if( ! identical( sc[["can read"]], "yes") ){ stop( "cannot read from connection" ) } if( ! identical( sc[["text"]], "binary" ) ){ stop( "not a binary connection" ) } was_open <- isOpen( object ) if( ! was_open ){ open( object ) } .Call(ConnectionInputStream_new, object, was_open) } ) # }}} # {{{ ConnectionOutputStream setGeneric( "ConnectionOutputStream", function(object, ...){ standardGeneric( "ConnectionOutputStream" ) } ) setMethod( "ConnectionOutputStream", "connection", function(object, ...){ sc <- summary( object ) if( ! identical( sc[["can write"]], "yes") ){ stop( "cannot write to connection" ) } if( ! identical( sc[["text"]], "binary" ) ){ stop( "not a binary connection" ) } was_open <- isOpen( object ) if( ! was_open ){ open( object ) } .Call(ConnectionOutputStream_new, object, was_open) } ) # }}} RProtoBuf/R/wrapper_FieldDescriptor.R0000644000176200001440000000704014535123416017307 0ustar liggesusers setGeneric( "is_extension", function(object){ standardGeneric("is_extension") } ) setMethod( "is_extension", "FieldDescriptor", function(object){ .Call(FieldDescriptor__is_extension, object@pointer) }) setMethod( "number", "FieldDescriptor", function(object){ .Call(FieldDescriptor__number, object@pointer) } ) TYPE_DOUBLE <- 1L TYPE_FLOAT <- 2L TYPE_INT64 <- 3L TYPE_UINT64 <- 4L TYPE_INT32 <- 5L TYPE_FIXED64 <- 6L TYPE_FIXED32 <- 7L TYPE_BOOL <- 8L TYPE_STRING <- 9L TYPE_GROUP <- 10L TYPE_MESSAGE <- 11L TYPE_BYTES <- 12L TYPE_UINT32 <- 13L TYPE_ENUM <- 14L TYPE_SFIXED32 <- 15L TYPE_SFIXED64 <- 16L TYPE_SINT32 <- 17L TYPE_SINT64 <- 18L .TYPES <- sapply(ls( pattern="^TYPE_" ), function(x) get(x)) setGeneric( "type", function(object, as.string = FALSE){ standardGeneric( "type" ) } ) setMethod( "type", "FieldDescriptor", function(object, as.string = FALSE){ type <- .Call(FieldDescriptor__type, object@pointer) if( as.string ) { names(which(.TYPES == type)) } else { type } } ) CPPTYPE_INT32 <- 1L CPPTYPE_INT64 <- 2L CPPTYPE_UINT32 <- 3L CPPTYPE_UINT64 <- 4L CPPTYPE_DOUBLE <- 5L CPPTYPE_FLOAT <- 6L CPPTYPE_BOOL <- 7L CPPTYPE_ENUM <- 8L CPPTYPE_STRING <- 9L CPPTYPE_MESSAGE <- 10L .CPPTYPES <- sapply(ls( pattern="^CPPTYPE_" ), function(x) get(x)) setGeneric( "cpp_type", function(object, as.string = FALSE ){ standardGeneric( "cpp_type" ) } ) setMethod( "cpp_type", "FieldDescriptor", function(object, as.string = FALSE){ cpptype <- .Call(FieldDescriptor__cpp_type, object@pointer) if( as.string ) { names(which(.CPPTYPES == cpptype)) } else { cpptype } } ) LABEL_OPTIONAL <- 1L LABEL_REQUIRED <- 2L LABEL_REPEATED <- 3L .LABELS <- sapply(ls( pattern="^LABEL_" ), function(x) get(x)) setGeneric( "label", function(object, as.string = FALSE ){ standardGeneric( "label" ) } ) setMethod( "label", "FieldDescriptor", function(object, as.string = FALSE){ lab <- .Call(FieldDescriptor__label, object@pointer) if( as.string ) { names(which(.LABELS == lab)) } else { lab } } ) setGeneric( "is_repeated", function(object ){ standardGeneric( "is_repeated" ) } ) setMethod( "is_repeated", "FieldDescriptor", function(object){ .Call(FieldDescriptor__is_repeated, object@pointer) } ) setGeneric( "is_optional", function(object){ standardGeneric( "is_optional" ) } ) setMethod( "is_optional", "FieldDescriptor", function(object){ .Call(FieldDescriptor__is_optional, object@pointer) } ) setGeneric( "is_required", function(object ){ standardGeneric( "is_required" ) } ) setMethod( "is_required", "FieldDescriptor", function(object){ .Call(FieldDescriptor__is_required, object@pointer) } ) setGeneric( "has_default_value", function(object ){ standardGeneric( "has_default_value" ) } ) setMethod( "has_default_value", "FieldDescriptor", function(object){ .Call(FieldDescriptor__has_default_value, object@pointer) } ) setGeneric( "default_value", function(object ){ standardGeneric( "default_value" ) } ) setMethod( "default_value", "FieldDescriptor", function(object){ .Call(FieldDescriptor__default_value, object@pointer) } ) setGeneric( "message_type", function(object ){ standardGeneric( "message_type" ) } ) setMethod( "message_type", "FieldDescriptor", function(object){ .Call(FieldDescriptor__message_type, object@pointer) } ) setMethod( "enum_type", c( object = "FieldDescriptor", index = "missing", name = "missing"), function(object){ .Call(FieldDescriptor__enum_type, object@pointer) } ) RProtoBuf/R/text_format.R0000644000176200001440000000031114535123416015013 0ustar liggesuserssetGeneric( "toTextFormat", function( x ) { standardGeneric( "toTextFormat" ) } ) setMethod( "toTextFormat", c( x = "Message"), function(x) { .Call( Message__print_text_format, x@pointer ) } ) RProtoBuf/R/merge.R0000644000176200001440000000051214535123416013561 0ustar liggesuserssetGeneric( "merge" ) setMethod( "merge", c( x = "Message", y = "Message" ), function( x, y , ... ){ if( !identical( x@type, y@type ) ){ stop(sprintf("incompatible message types, cannot merge '%s' and '%s'", x@type, y@type)) } message <- .Call( Message__merge, x@pointer, y@pointer) message } ) RProtoBuf/R/wrapper_EnumValueDescriptor.R0000644000176200001440000000057414535123416020172 0ustar liggesusers setMethod( "enum_type", c( object = "EnumValueDescriptor", index = "missing", name = "missing"), function(object, index, name){ .Call(EnumValueDescriptor__enum_type, object@pointer) } ) setGeneric( "number", function(object){ standardGeneric( "number" ) } ) setMethod( "number", "EnumValueDescriptor", function(object){ .Call(EnumValueDescriptor__number, object@pointer) } ) RProtoBuf/cleanup0000755000176200001440000000071415130744444013521 0ustar liggesusers#!/bin/sh rm -f config.* src/Makedeps src/Makevars \ src/addressbook.pb.cc src/addressbook.pb.h \ src/protobufrpc.pb.cc src/protobufrpc.pb.h \ src/*.o src/*.d src/*.a src/*.dll src/*.so src/*.rc */*~ *~ \ src/symbols.rds \ vignettes/RProtoBuf*.aux vignettes/RProtoBuf*.log \ vignettes/RProtoBuf*.out vignettes/RProtoBuf*.toc \ vignettes/RProtoBuf*.tex \ vignettes/pinp.cls rm -rf inst/doc/auto autom4te.cache RProtoBuf.Rcheck RProtoBuf/demo/0000755000176200001440000000000012440004312013046 5ustar liggesusersRProtoBuf/demo/00Index0000644000176200001440000000015312440004312014177 0ustar liggesusersaddressbook Demonstration of RProtoBuf functionality io Input/Output handling of protocol buffer messages RProtoBuf/demo/addressbook.R0000644000176200001440000000325012440004312015471 0ustar liggesusers# load the package require( RProtoBuf ) # read all the proto files in the proto directory # of the package "RProtoBuf" # (this is also done in the startup of the package, so this call is # actually redundant) readProtoFiles( package = "RProtoBuf" ) # creating three Person messages # create a prototype with a simple call to new on the # descriptor for the Person message type, and then update the message # with fields romain <- update( new( tutorial.Person ), email = "romain@r-enthusiasts.com", id = 1, name = "Romain Francois", phone = new( tutorial.Person.PhoneNumber , number = "+33(0)...", type = "MOBILE" ) ) # directly supply parameters to the constructor dirk <- new( tutorial.Person, email = "edd@debian.org", id = 2, name = "Dirk Eddelbuettel" ) # update the phone repeated field with a list of PhoneNumber messages dirk$phone <- list( new( tutorial.Person.PhoneNumber , number = "+01...", type = "MOBILE" ), new( tutorial.Person.PhoneNumber , number = "+01...", type = "HOME" ) ) # build the address book book <- new( tutorial.AddressBook, person = list( romain, dirk ) ) # debug string. This is not what is transferred in the wire writeLines( as.character( book ) ) # the serialized message # see also the io demo to see how to serialize messages to connections # and files serialize( book, NULL ) # number of bytes taken by the message on the wire bytesize( book ) length( serialize( book, NULL ) ) # swap two persons in the address book # (1-based indexing) book$swap( "person", 1L , 2L ) writeLines( as.character( book ) ) # number of "person" in the book book$size( "person" ) # clear the message book$clear( ) writeLines( as.character( book ) ) RProtoBuf/demo/io.R0000644000176200001440000000164412440004312013605 0ustar liggesusersrequire( RProtoBuf ) ### read messages from files and binary connections # read a message from a file name f <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) m1 <- read( tutorial.AddressBook, f ) writeLines( as.character( m1 ) ) # read the same message from a (binary) file connection con <- file( f, open = "rb" ) m2 <- read( tutorial.AddressBook, con ) # this also works: # m2 <- tutorial.AddressBook$read( con ) writeLines( as.character( m2 ) ) close( con ) # TODO: we need another example from a more fancy connection (pipe, ...) stopifnot( identical( as.character(m1), as.character(m2) ) ) ### write messages to files and binary connections tf1 <- tempfile() serialize( m1, tf1 ) tf2 <- tempfile() con <- file( tf2, open = "wb" ) serialize( m2, con ) close( con ) # test that the two binary files are identical stopifnot( identical( readBin( tf1, raw(0), 1000), readBin( tf2, raw(0), 1000) ) ) RProtoBuf/vignettes/0000755000176200001440000000000015130744444014152 5ustar liggesusersRProtoBuf/vignettes/RProtoBuf-quickref.pdf.asis0000644000176200001440000000026615130725263021276 0ustar liggesusers%\VignetteIndexEntry{RProtoBuf-quickref} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignettePackage{RProtoBuf} %\VignetteEncoding{UTF-8} %\VignetteEngine{Rcpp::asis} RProtoBuf/vignettes/RProtoBuf-intro.pdf.asis0000644000176200001440000000026315130725171020613 0ustar liggesusers%\VignetteIndexEntry{RProtoBuf-intro} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignettePackage{RProtoBuf} %\VignetteEncoding{UTF-8} %\VignetteEngine{Rcpp::asis} RProtoBuf/vignettes/RProtoBuf-paper.pdf.asis0000644000176200001440000000026315130725227020571 0ustar liggesusers%\VignetteIndexEntry{RProtoBuf-paper} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignettePackage{RProtoBuf} %\VignetteEncoding{UTF-8} %\VignetteEngine{Rcpp::asis} RProtoBuf/src/0000755000176200001440000000000015130744444012731 5ustar liggesusersRProtoBuf/src/ConnectionCopyingInputStream.cpp0000644000176200001440000000134712440004312021246 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionCopyingInputStream.h" namespace rprotobuf { ConnectionCopyingInputStream::ConnectionCopyingInputStream(SEXP con) : con(con), readBin("readBin") {} /** * call readBin to read size bytes from R * * @param buffer buffer to fill with at most size bytes * @param size maximum number of bytes * * @return the number of bytes actually read */ int ConnectionCopyingInputStream::Read(void* buffer, int size) { /* TODO: error handling */ Rcpp::RawVector res = readBin(con, Rcpp::RawVector(0), size); memcpy(buffer, res.begin(), res.size()); return res.size(); } } RProtoBuf/src/lookup.cpp0000644000176200001440000001654713003435477014763 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "DescriptorPoolLookup.h" /* This uses the mechanism of the RObjectTables package see: http://www.omegahat.net/RObjectTables/ */ namespace rprotobuf { /** * Returns the R_UnboundValue */ SEXP R_getUnboundValue() { return (R_UnboundValue); } /** * @param name potential message type * @param canCache Can R cache this object * @param tb object table * * @return _TRUE_ if there is a message of the given type in the DescriptorPool */ Rboolean rProtoBufTable_exists(const char *const name, Rboolean *canCache, R_ObjectTable *tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_exists\n"); #endif if (tb->active == _FALSE_) return (_FALSE_); tb->active = _FALSE_; Rboolean val = _FALSE_; if (DescriptorPoolLookup::contains(name)) { /* first check the cache */ val = _TRUE_; } else { /* try the generated pool */ const GPB::DescriptorPool *pool = GPB::DescriptorPool::generated_pool(); if (pool->FindMessageTypeByName(name) || pool->FindEnumTypeByName(name) || pool->FindServiceByName(name) || pool->FindMethodByName(name) || pool->FindExtensionByName(name)) { DescriptorPoolLookup::add(name); val = _TRUE_; } else { /* try the runtime pool */ pool = DescriptorPoolLookup::pool(); if (pool->FindMessageTypeByName(name) || pool->FindEnumTypeByName(name) || pool->FindServiceByName(name) || pool->FindMethodByName(name) || pool->FindExtensionByName(name)) { DescriptorPoolLookup::add(name); val = _TRUE_; } } } tb->active = _TRUE_; return (val); } SEXP findSomething(const GPB::DescriptorPool *pool, const char *const name) { const GPB::Descriptor *desc = pool->FindMessageTypeByName(name); std::string name_string(name); if (desc) { /* message */ DescriptorPoolLookup::add(name_string); return S4_Descriptor(desc); } else { const GPB::EnumDescriptor *enum_desc = pool->FindEnumTypeByName(name_string); if (enum_desc) { /* enum */ DescriptorPoolLookup::add(name_string); return S4_EnumDescriptor(enum_desc); } else { const GPB::FieldDescriptor *extension_desc = pool->FindExtensionByName(name_string); if (extension_desc) { /* extension */ DescriptorPoolLookup::add(name_string); return S4_FieldDescriptor(extension_desc); } else { const GPB::ServiceDescriptor *service_desc = pool->FindServiceByName(name_string); if (service_desc) { DescriptorPoolLookup::add(name_string); return S4_ServiceDescriptor(service_desc); } else { const GPB::MethodDescriptor *method_desc = pool->FindMethodByName(name_string); if (method_desc) { DescriptorPoolLookup::add(name_string); return S4_MethodDescriptor(method_desc); } } } } } return R_NilValue; } /** * Returns a new "Descriptor" if there is such a message type * in the descriptor pool. NULL otherwise * * @param name message type name (without package path) * @param canCache * @param tb lookup table */ SEXP rProtoBufTable_get(const char *const name, Rboolean *canCache, R_ObjectTable *tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_get\n"); #endif if (tb->active == _FALSE_) return (R_UnboundValue); tb->active = _FALSE_; SEXP res_generated; SEXP res_runtime; int np = 0; /* first try the generated pool */ const GPB::DescriptorPool *pool = GPB::DescriptorPool::generated_pool(); res_generated = PROTECT(findSomething(pool, name)); np++; if (res_generated == R_NilValue) { /* try the runtime pool */ pool = DescriptorPoolLookup::pool(); res_runtime = PROTECT(findSomething(pool, name)); np++; } tb->active = _TRUE_; SEXP res = PROTECT((np == 2) ? res_runtime : res_generated); UNPROTECT(np + 1); if (res != R_NilValue) return res; return R_getUnboundValue(); // -Wall } /** * Does nothing. Not applicable */ int rProtoBufTable_remove(const char *const unused_name, R_ObjectTable *unused_tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_remove( %s) \n", unused_name); #endif Rf_error("cannot remove from protobuf descriptor pool"); return (0); // make -Wall happy } /** * Indicates if R can cache the variable name. * Currently allways return _FALSE_ * * @param name message type name * @param tb lookup table * @return allways _FALSE_ (for now) */ Rboolean rProtoBufTable_canCache(const char *const unused_name, R_ObjectTable *unused_tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_canCache\n"); #endif return (_FALSE_); } /** * Previously this function returned a stop() error, but this has side * effects such as preventing users from using '<<-' operator in any * scripts that include RProtoBuf. So instead, we now simply return * NULL to indicate assign is not possible on this lookup table * without giving such a hard error. */ SEXP rProtoBufTable_assign(const char *const unused_name, SEXP unused_value, R_ObjectTable *unused_tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_assign( %s ) \n", unused_name); #endif return (R_NilValue); // make -Wall happy } /** * Returns the list of classes known to be included in the * packages. * * @param tb lookup table */ SEXP rProtoBufTable_objects(R_ObjectTable *tb) { #ifdef LOOKUP_DEBUG Rprintf(" >> rProtoBufTable_objects\n"); #endif tb->active = _FALSE_; SEXP objects = PROTECT(DescriptorPoolLookup::getElements()); tb->active = _TRUE_; UNPROTECT(1); /* objects */ return (objects); } RcppExport SEXP newProtocolBufferLookup(SEXP possexp) { BEGIN_RCPP #ifdef LOOKUP_DEBUG Rprintf("\n"); #endif R_ObjectTable *tb; SEXP val, klass; tb = (R_ObjectTable *)malloc(sizeof(R_ObjectTable)); if (!tb) throw Rcpp::exception("cannot allocate space for an internal R object table"); tb->type = RPROTOBUF_LOOKUP; /* FIXME: not sure what this should be */ tb->cachedNames = NULL; tb->privateData = (void *)0; tb->exists = rProtoBufTable_exists; tb->get = rProtoBufTable_get; tb->remove = rProtoBufTable_remove; tb->assign = rProtoBufTable_assign; tb->objects = rProtoBufTable_objects; tb->canCache = rProtoBufTable_canCache; tb->onAttach = NULL; tb->onDetach = NULL; PROTECT(val = R_MakeExternalPtr(tb, Rf_install("UserDefinedDatabase"), R_NilValue)); PROTECT(klass = Rf_mkString("UserDefinedDatabase")); Rf_setAttrib(val, R_ClassSymbol, klass); UNPROTECT(2); /* val, klass */ #ifdef LOOKUP_DEBUG Rprintf("\n"); #endif Rcpp::Function fun("attach"); int pos = Rcpp::as(possexp); fun(val, Rcpp::Named("pos") = pos, Rcpp::Named("name") = "RProtoBuf:DescriptorPool"); // TODO(mstokely): Somewhere we should deallocate tb? If package is unattached? return (val); END_RCPP } } // namespace rprotobuf RProtoBuf/src/extensions.cpp0000644000176200001440000000356713057365267015657 0ustar liggesusers/* -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- * Copyright 2012 Google Inc. All Rights Reserved. * Author: Murray Stokely * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ #include "rprotobuf.h" #include "Rcppsupport.h" namespace rprotobuf { RcppExport SEXP getExtension_cpp(SEXP pointer, SEXP sfielddesc) { /* grab the Message pointer */ Rcpp::XPtr message(pointer); const GPB::Reflection* ref = message->GetReflection(); const GPB::FieldDescriptor* field_desc = GET_FIELD_DESCRIPTOR_POINTER_FROM_S4(sfielddesc); // extractFieldAsSEXP returns a default (e.g. 0) even when // field doesn't exist, but returning NULL probably makes more // sense. // // TODO(mstokely): move this logic into extractField so that // all fields get this updated behavior, not just extensions. if (field_desc->is_repeated()) { if (ref->FieldSize(*message, field_desc) < 1) { return R_NilValue; } } else { if (!ref->HasField(*message, field_desc)) { return R_NilValue; } } return (extractFieldAsSEXP(message, field_desc)); } } // namespace rprotobuf RProtoBuf/src/rprotobuf.h0000644000176200001440000002271215130443764015131 0ustar liggesusers// rprotobuf.h: R/C++ interface class library // // Copyright (C) 2009-2012 Dirk Eddelbuettel and Romain Francois // Copyright (C) 2012-2013 Dirk Eddelbuettel, Romain Francois and Murray Stokely // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #ifndef RPROTOBUF_H #define RPROTOBUF_H // TODO(mstokely): should we check if this header is available? #include #include // for strerror #include // g++-4.7 wants this #include // for string #include // O_BINARY does not exist on Unix/Linux, since there is no distinction // between text mode and binary mode files there, but if we ever got // this code running on Windows this would be needed. #ifndef O_BINARY #define O_BINARY 0 #endif #include #include #include #include #include #include #include #include #include #if GOOGLE_PROTOBUF_VERSION >= 3000000 #include #define PROTOBUF_JSON_UTIL #endif namespace GPB = google::protobuf; #define R_NO_REMAP /* we need to read and write to connections */ #define NEED_CONNECTION_PSTREAMS #include RCPP_ENUM_TRAITS(GPB::FieldDescriptor::Label) RCPP_ENUM_TRAITS(GPB::FieldDescriptor::CppType) RCPP_ENUM_TRAITS(GPB::FieldDescriptor::Type) // RCPP_TRAITS(GPB::int64,REALSXP) // RCPP_TRAITS(GPB::uint64,REALSXP) #include #include #include #if R_VERSION < R_Version(4,6,0) #include #else #include #endif /* uncomment for debugging */ // #define RPB_DEBUG #ifdef RPB_DEBUG #define RPB_DEBUG_BEGIN(__WHAT__) Rprintf("<" #__WHAT__ ">\n"); #define RPB_DEBUG_END(__WHAT__) Rprintf("\n"); #else #define RPB_DEBUG_BEGIN(__WHAT__) #define RPB_DEBUG_END(__WHAT__) #endif // #define FIN_DBG(ptr, CLAZZ) // #define FIN_DBG(ptr, CLAZZ) Rprintf( "RProtoBuf finalizing %s (%p)\n", CLAZZ, // ptr ) #ifdef RPB_DEBUG #define PRINT_DEBUG_INFO(name, o) \ Rprintf(" %s [%d] = ", name, TYPEOF(o)); \ Rf_PrintValue(o); #else #define PRINT_DEBUG_INFO(name, o) #endif #define RPROTOBUF_LOOKUP 24 // #define LOOKUP_DEBUG /* FIXME : quick hack because just using TRUE and FALSE did not work in * lookup.cpp */ #define _TRUE_ (Rboolean) TRUE #define _FALSE_ (Rboolean) FALSE #define GET_MESSAGE_POINTER_FROM_XP(xp) (GPB::Message*) R_ExternalPtrAddr(xp) #define GET_MESSAGE_POINTER_FROM_S4(m) (GPB::Message*) R_ExternalPtrAddr(GET_SLOT(m, Rf_install("pointer"))) #define GET_DESCRIPTOR_POINTER_FROM_XP(xp) (GPB::Descriptor*) R_ExternalPtrAddr(xp) #define GET_DESCRIPTOR_POINTER_FROM_S4(m) (GPB::Descriptor*) R_ExternalPtrAddr(GET_SLOT(m, Rf_install("pointer"))) #define GET_FIELD_DESCRIPTOR_POINTER_FROM_XP(xp) (GPB::FieldDescriptor*) R_ExternalPtrAddr(xp) #define GET_FIELD_DESCRIPTOR_POINTER_FROM_S4(m) (GPB::FieldDescriptor*) R_ExternalPtrAddr(GET_SLOT(m, Rf_install("pointer"))) #define GET_ENUM_VALUE_DESCRIPTOR_POINTER_FROM_XP(xp) (GPB::EnumValueDescriptor*) R_ExternalPtrAddr(xp) #define GET_ENUM_VALUE_DESCRIPTOR_POINTER_FROM_S4(m) (GPB::EnumValueDescriptor*) R_ExternalPtrAddr(GET_SLOT(m, Rf_install("pointer"))) #define COPYSTRING(s) s #define THROW_SOCKET_ERROR(message) Rf_error("%s : %s", message, strerror(sockerrno)) #define XPP R_ExternalPtrAddr #define NEW_S4_OBJECT(CLAZZ) \ SEXP oo = PROTECT(NEW_OBJECT(MAKE_CLASS(CLAZZ))); \ if (!Rf_inherits(oo, CLAZZ)) Rcpp::stop(CLAZZ); namespace rprotobuf { typedef GPB::int32 int32; typedef GPB::uint32 uint32; typedef GPB::int64 int64; typedef GPB::uint64 uint64; /* in rprotobuf.cpp */ GPB::Message* PROTOTYPE(const GPB::Descriptor*); GPB::Message* CLONE(const GPB::Message*); RcppExport SEXP do_dollar_Descriptor(SEXP, SEXP); RcppExport SEXP newProtoMessage(SEXP); RcppExport SEXP getProtobufDescriptor(SEXP); RcppExport SEXP getExtensionDescriptor(SEXP); RcppExport SEXP readProtoFiles_cpp(SEXP, SEXP); RcppExport Rboolean isMessage(SEXP, std::string_view); RcppExport GPB::FieldDescriptor* getFieldDescriptor(const GPB::Message*, SEXP); /* in extractors.cpp */ RcppExport SEXP getMessageField(SEXP, SEXP); RcppExport SEXP extractFieldAsSEXP(const Rcpp::XPtr&, const GPB::FieldDescriptor*); /* in lookup.cpp */ RcppExport SEXP newProtocolBufferLookup(SEXP); /* in mutators.cpp */ RcppExport SEXP setMessageField(SEXP, SEXP, SEXP); int GET_int(SEXP, int); double GET_double(SEXP, int); float GET_float(SEXP, int); int32 GET_int32(SEXP, R_xlen_t); int64 GET_int64(SEXP, R_xlen_t); uint32 GET_uint32(SEXP, R_xlen_t); uint64 GET_uint64(SEXP, R_xlen_t); bool GET_bool(SEXP, R_xlen_t); std::string GET_stdstring(SEXP, R_xlen_t); std::string GET_bytes(SEXP, R_xlen_t); void CHECK_values_for_enum(const GPB::FieldDescriptor*, SEXP); void CHECK_messages(const GPB::FieldDescriptor*, SEXP); /* in wrapper_ServiceDescriptor.cpp */ RcppExport SEXP ServiceDescriptor_length(SEXP); RcppExport SEXP ServiceDescriptor_method_count(SEXP); RcppExport SEXP ServiceDescriptor_getMethodByIndex(SEXP, SEXP); RcppExport SEXP ServiceDescriptor_getMethodByName(SEXP, SEXP); /* in streams.cpp */ void ZeroCopyInputStreamWrapper_finalizer(SEXP); void ZeroCopyOutputStreamWrapper_finalizer(SEXP); RcppExport SEXP ZeroCopyInputStream_Next(SEXP); RcppExport SEXP ZeroCopyInputStream_BackUp(SEXP, SEXP); RcppExport SEXP ZeroCopyInputStream_ByteCount(SEXP); RcppExport SEXP ZeroCopyInputStream_Skip(SEXP, SEXP); RcppExport SEXP ZeroCopyInputStream_ReadRaw(SEXP, SEXP); RcppExport SEXP ZeroCopyInputStream_ReadString(SEXP, SEXP); RcppExport SEXP ZeroCopyInputStream_ReadVarint32(SEXP); RcppExport SEXP ZeroCopyInputStream_ReadVarint64(SEXP); RcppExport SEXP ZeroCopyInputStream_ReadLittleEndian32(SEXP); RcppExport SEXP ZeroCopyInputStream_ReadLittleEndian64(SEXP); RcppExport SEXP ZeroCopyOutputStream_Next(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_BackUp(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_ByteCount(SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteRaw(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteString(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteLittleEndian32(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteLittleEndian64(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteVarint32(SEXP, SEXP); RcppExport SEXP ZeroCopyOutputStream_WriteVarint64(SEXP, SEXP); RcppExport SEXP FileOutputStream_new(SEXP, SEXP, SEXP); RcppExport SEXP FileOutputStream_Close(SEXP); RcppExport SEXP FileOutputStream_Flush(SEXP); RcppExport SEXP FileOutputStream_GetErrno(SEXP); RcppExport SEXP FileOutputStream_SetCloseOnDelete(SEXP, SEXP); RcppExport SEXP FileInputStream_new(SEXP, SEXP, SEXP); RcppExport SEXP FileInputStream_Close(SEXP); RcppExport SEXP FileInputStream_GetErrno(SEXP); RcppExport SEXP FileInputStream_SetCloseOnDelete(SEXP, SEXP); RcppExport SEXP ConnectionInputStream_new(SEXP, SEXP); RcppExport SEXP ConnectionOutputStream_new(SEXP, SEXP); /** * simple class that wraps together a ZeroCopyOutputStream * and its associated CodedOutputStream. Since we don't expose * CodedOutputStream at the R level, this allows to keep only one such * object with each ZeroCopyOutputStream */ class ZeroCopyOutputStreamWrapper { public: ZeroCopyOutputStreamWrapper(GPB::io::ZeroCopyOutputStream* stream); ~ZeroCopyOutputStreamWrapper(); GPB::io::ZeroCopyOutputStream* get_stream(); GPB::io::CodedOutputStream* get_coded_stream(); private: GPB::io::ZeroCopyOutputStream* stream; GPB::io::CodedOutputStream* coded_stream; }; /** * simple class that wraps together a ZeroCopyInputStream * and its associated CodedInputStream. Since we don't expose * CodedInputStream at the R level, this allows to keep only one such * object with each zero copy input stream */ class ZeroCopyInputStreamWrapper { public: ZeroCopyInputStreamWrapper(GPB::io::ZeroCopyInputStream* stream); ~ZeroCopyInputStreamWrapper(); GPB::io::ZeroCopyInputStream* get_stream(); GPB::io::CodedInputStream* get_coded_stream(); private: GPB::io::ZeroCopyInputStream* stream; GPB::io::CodedInputStream* coded_stream; }; } // namespace rprotobuf #include "S4_classes.h" #include "RconnectionCopyingInputStream.h" #define GET_ZCIS(xp) ((ZeroCopyInputStreamWrapper*)XPP(xp))->get_stream() #define GET_CIS(xp) ((ZeroCopyInputStreamWrapper*)XPP(xp))->get_coded_stream() #define GET_FIS(xp) (GPB::io::FileInputStream*)((ZeroCopyInputStreamWrapper*)XPP(xp))->get_stream() #define GET_ZCOS(xp) ((ZeroCopyOutputStreamWrapper*)XPP(xp))->get_stream() #define GET_COS(xp) ((ZeroCopyOutputStreamWrapper*)XPP(xp))->get_coded_stream() #define GET_FOS(xp) \ (GPB::io::FileOutputStream*)((ZeroCopyOutputStreamWrapper*)XPP(xp))->get_stream() #endif RProtoBuf/src/RWarningErrorCollector.cpp0000644000176200001440000000150014752644073020047 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RWarningErrorCollector.h" namespace rprotobuf { #if GOOGLE_PROTOBUF_VERSION < 5026000 void RWarningErrorCollector::AddError(const std::string& filename, int line, int column, const std::string& message) { Rprintf("%s:%d:%d:%s\n", filename.c_str(), line + 1, column + 1, message.c_str()); } #else void RWarningErrorCollector::RecordError(absl::string_view filename, int line, int column, absl::string_view message) { Rprintf("%s:%d:%d:%s\n", std::string(filename).c_str(), line + 1, column + 1, std::string(message).c_str()); } #endif } // namespace rprotobuf RProtoBuf/src/wrapper_ArrayOutputStream.cpp0000644000176200001440000000051312440004312020627 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { RPB_FUNCTION_2(S4_ArrayOutputStream, ArrayOutputStream__new, int size, int block_size) { return S4_ArrayOutputStream(size, block_size); } } RProtoBuf/src/ConnectionCopyingOutputStream.cpp0000644000176200001440000000107112440004312021441 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionCopyingOutputStream.h" namespace rprotobuf { ConnectionCopyingOutputStream::ConnectionCopyingOutputStream(SEXP con) : con(con), writeBin("writeBin") {} bool ConnectionCopyingOutputStream::Write(const void* buffer, int size) { /* we need to take care of error handling */ Rcpp::RawVector payload(size); memcpy(payload.begin(), buffer, size); writeBin(payload, con); return true; } } RProtoBuf/src/ZeroCopyOutputStreamWrapper.cpp0000644000176200001440000000137312440004312021131 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" namespace rprotobuf { ZeroCopyOutputStreamWrapper::ZeroCopyOutputStreamWrapper(GPB::io::ZeroCopyOutputStream* stream) : stream(stream) { coded_stream = new GPB::io::CodedOutputStream(stream); } ZeroCopyOutputStreamWrapper::~ZeroCopyOutputStreamWrapper() { try { /* first clear the coded stream */ delete coded_stream; /* then the stream itself */ delete stream; } catch (...) { } } GPB::io::ZeroCopyOutputStream* ZeroCopyOutputStreamWrapper::get_stream() { return stream; } GPB::io::CodedOutputStream* ZeroCopyOutputStreamWrapper::get_coded_stream() { return coded_stream; } } // namespace rprotobuf RProtoBuf/src/Makevars.win0000644000176200001440000000055015130725700015213 0ustar liggesusers# ProtoBuf Version VERSION = 3.8.0 RWINLIB = ../windows/protobuf-${VERSION} PKG_CPPFLAGS= -I$(RWINLIB)/include PKG_LIBS= -L$(RWINLIB)/lib${subst gcc,,${COMPILED_BY}}${R_ARCH} \ -L$(RWINLIB)/lib${R_ARCH}${CRT} -lprotobuf all: clean winlibs clean: rm -f $(OBJECTS) $(SHLIB) winlibs: "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" "../tools/winlibs.R" $(VERSION) RProtoBuf/src/wrapper_FieldDescriptor.cpp0000644000176200001440000000726414752644073020276 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "fieldtypes.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(FieldDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::FieldDescriptor, DebugString) RPB_XP_METHOD_0(METHOD(is_extension), GPB::FieldDescriptor, is_extension) RPB_XP_METHOD_0(METHOD(number), GPB::FieldDescriptor, number) RPB_XP_METHOD_0(METHOD(type), GPB::FieldDescriptor, type) RPB_XP_METHOD_0(METHOD(cpp_type), GPB::FieldDescriptor, cpp_type) RPB_XP_METHOD_0(METHOD(label), GPB::FieldDescriptor, label) RPB_XP_METHOD_0(METHOD(is_repeated), GPB::FieldDescriptor, is_repeated) RPB_XP_METHOD_0(METHOD(is_optional), GPB::FieldDescriptor, is_optional) RPB_XP_METHOD_0(METHOD(is_required), GPB::FieldDescriptor, is_required) RPB_XP_METHOD_0(METHOD(has_default_value), GPB::FieldDescriptor, has_default_value) RPB_FUNCTION_1(S4_Descriptor, METHOD(containing_type), Rcpp::XPtr d) { return S4_Descriptor(d->containing_type()); } #define RPB_HANDLE_CASE(__CPP__, __LC__) \ case CPPTYPE_##__CPP__: { \ return Rcpp::wrap(d->default_value_##__LC__()); \ } RPB_FUNCTION_1(SEXP, METHOD(default_value), Rcpp::XPtr d) { switch (d->cpp_type()) { RPB_HANDLE_CASE(INT32, int32) RPB_HANDLE_CASE(UINT32, uint32) #ifdef RCPP_HAS_LONG_LONG_TYPES RPB_HANDLE_CASE(INT64, int64) RPB_HANDLE_CASE(UINT64, uint64) #endif RPB_HANDLE_CASE(DOUBLE, double) RPB_HANDLE_CASE(FLOAT, float) RPB_HANDLE_CASE(BOOL, bool) RPB_HANDLE_CASE(STRING, string) case CPPTYPE_ENUM: { return Rf_ScalarInteger(d->default_value_enum()->number()); } default: break; } return R_NilValue; } RPB_FUNCTION_1(S4_Descriptor, METHOD(message_type), Rcpp::XPtr d) { if (d->cpp_type() != CPPTYPE_MESSAGE) { throw Rcpp::not_compatible("not a message type field"); } return S4_Descriptor(d->message_type()); } RPB_FUNCTION_1(S4_EnumDescriptor, METHOD(enum_type), Rcpp::XPtr d) { if (d->cpp_type() != CPPTYPE_ENUM) { Rcpp::stop("not an enum type field"); } return S4_EnumDescriptor(d->enum_type()); } RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::FieldDescriptorProto* message = new GPB::FieldDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->file()); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return std::string(full ? d->full_name() : d->name()); } #undef RPB_HANDLE_CASE #undef METHOD } // namespace rprotobuf RProtoBuf/src/RWarningErrorCollector.h0000644000176200001440000000105614752644073017522 0ustar liggesusers#include /* For string */ #include "rprotobuf.h" namespace rprotobuf { class RWarningErrorCollector : public GPB::compiler::MultiFileErrorCollector { public: // implements ErrorCollector --------------------------------------- #if GOOGLE_PROTOBUF_VERSION < 5026000 void AddError(const std::string& filename, int line, int column, const std::string& message); #else void RecordError(absl::string_view filename, int line, int column, absl::string_view message); #endif }; } // namespace rprotobuf RProtoBuf/src/DescriptorPoolLookup.h0000644000176200001440000000177314752644073017262 0ustar liggesusers#ifndef RPROTOBUF_DescriptorPoolLookup_H #define RPROTOBUF_DescriptorPoolLookup_H #include /* For less */ #include /* For set */ #include /* For string */ #include /* For string_view */ #include "RSourceTree.h" #include "RWarningErrorCollector.h" namespace rprotobuf { class DescriptorPoolLookup { public: static void add(std::string_view element); static bool contains(std::string_view element); static SEXP getElements(); static void importProtoFiles(SEXP files, SEXP cwd); static void reset(); static const GPB::DescriptorPool* pool(); static const GPB::DynamicMessageFactory* factory(); private: static std::set> elements; static RWarningErrorCollector error_collector; static RSourceTree source_tree; static GPB::compiler::Importer* importer; static GPB::DynamicMessageFactory message_factory; }; } // namespace rprotobuf #endif RProtoBuf/src/wrapper_EnumValueDescriptor.cpp0000644000176200001440000000344714752644073021153 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // wrapper_EnumValueDescriptor.h: R/C++ interface class library // // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(EnumValueDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::EnumValueDescriptor, DebugString) RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::EnumValueDescriptorProto* message = new GPB::EnumValueDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return std::string(full ? d->full_name() : d->name()); } RPB_FUNCTION_1(int, METHOD(number), Rcpp::XPtr d) { return d->number(); } RPB_FUNCTION_1(S4_EnumDescriptor, METHOD(enum_type), Rcpp::XPtr d) { return S4_EnumDescriptor(d->type()); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/Rcppsupport.h0000644000176200001440000001465312440004312015434 0ustar liggesusers// rprotobuf.h: support for using Rcpp // // Copyright (C) 2010 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #ifndef RPROTOBUF__RCPPSUPPORT__H #define RPROTOBUF__RCPPSUPPORT__H #include /* for stringstream, basic_ostream */ #include /* for string */ #include "rprotobuf.h" namespace rprotobuf { /* support for Rcpp::wrap protobuf repeated fields, this essentially uses the same macro trick as in protobuf, but reversed */ struct enum_field{}; struct message_field{}; class Int64AsStringRepeatedFieldImporter { public: // Probably want to convert to strings here. typedef std::string r_import_type; Int64AsStringRepeatedFieldImporter(const GPB::Reflection* ref_ , const GPB::Message& message_, const GPB::FieldDescriptor* field_) : ref(ref_), message(message_), field(field_) {} inline int size() const { return ref->FieldSize(message, field); } inline std::string get(int i) const { std::stringstream stream; int64 val = ref->GetRepeatedInt64(message, field, i); stream << val; return stream.str(); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; }; class UInt64AsStringRepeatedFieldImporter { public: // Probably want to convert to strings here. typedef std::string r_import_type; UInt64AsStringRepeatedFieldImporter(const GPB::Reflection* ref_, const GPB::Message& message_, const GPB::FieldDescriptor* field_) : ref(ref_), message(message_), field(field_) {} inline int size() const { return ref->FieldSize(message, field) ; } inline std::string get(int i) const { std::stringstream stream; uint64 val = ref->GetRepeatedUInt64(message, field, i); stream << val; return stream.str(); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; }; // TODO(mstokely): Rcpp doesn't handle uint32 properly as of 2013/12 // See https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1360&group_id=155&atid=637 class UInt32RepeatedFieldImporter { public: // Represent as doubles, since R doesn't have uint32s. typedef double r_import_type; UInt32RepeatedFieldImporter(const GPB::Reflection* ref_ , const GPB::Message& message_, const GPB::FieldDescriptor* field_) : ref(ref_), message(message_), field(field_) {} inline int size() const { return ref->FieldSize(message, field); } inline double get(int i) const { return double(ref->GetRepeatedUInt32(message, field, i)); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; }; template class RepeatedFieldImporter{} ; #undef GENERATE__FIELD__IMPORTER__DECL #define GENERATE__FIELD__IMPORTER__DECL(__TYPE__, __CAMEL__) \ template<> class RepeatedFieldImporter<__TYPE__> { \ public: \ typedef __TYPE__ r_import_type; \ RepeatedFieldImporter( \ const GPB::Reflection* ref_, \ const GPB::Message& message_, \ const GPB::FieldDescriptor* field_): \ ref(ref_), message(message_), field(field_) {} \ inline int size() const { \ return ref->FieldSize( message, field ); \ } \ inline __TYPE__ get(int i) const { \ return ref->GetRepeated##__CAMEL__(message, field, i); \ } \ private: \ const GPB::Reflection* ref; \ const GPB::Message& message; \ const GPB::FieldDescriptor* field; \ }; GENERATE__FIELD__IMPORTER__DECL(GPB::int32, Int32) GENERATE__FIELD__IMPORTER__DECL(GPB::uint32, UInt32) GENERATE__FIELD__IMPORTER__DECL(GPB::int64, Int64) GENERATE__FIELD__IMPORTER__DECL(GPB::uint64, UInt64) GENERATE__FIELD__IMPORTER__DECL(float, Float) GENERATE__FIELD__IMPORTER__DECL(double, Double) GENERATE__FIELD__IMPORTER__DECL(bool, Bool) GENERATE__FIELD__IMPORTER__DECL(std::string, String) #undef GENERATE__FIELD__IMPORTER__DECL template<> class RepeatedFieldImporter{ public: typedef int r_import_type ; RepeatedFieldImporter( const GPB::Reflection* ref_, const GPB::Message& message_, const GPB::FieldDescriptor* field_): ref(ref_), message(message_), field(field_) {}; inline int size() const { return ref->FieldSize( message, field ); } inline int get(int i) const { return ref->GetRepeatedEnum(message, field, i)->number(); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; } ; template<> class RepeatedFieldImporter{ public: typedef message_field r_import_type ; RepeatedFieldImporter( const GPB::Reflection* ref_ , const GPB::Message& message_, const GPB::FieldDescriptor* field_): ref(ref_), message(message_), field(field_) {}; inline int size() const { return ref->FieldSize( message, field ); } inline SEXP wrap(int i) const { return S4_Message(CLONE(&ref->GetRepeatedMessage(message, field, i))); } private: const GPB::Reflection* ref; const GPB::Message& message; const GPB::FieldDescriptor* field; }; } // namespace rprotobuf #endif RProtoBuf/src/DescriptorPoolLookup.cpp0000644000176200001440000000762114752644073017613 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // DescriptorPoolLookup.cpp: R/C++ interface class library // // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "DescriptorPoolLookup.h" namespace rprotobuf { void DescriptorPoolLookup::add(std::string_view element) { elements.emplace(element); } bool DescriptorPoolLookup::contains(std::string_view element) { return elements.find(element) != elements.end(); } SEXP DescriptorPoolLookup::getElements() { return Rcpp::wrap(elements); } std::set> DescriptorPoolLookup::elements; RWarningErrorCollector DescriptorPoolLookup::error_collector; RSourceTree DescriptorPoolLookup::source_tree; GPB::compiler::Importer* DescriptorPoolLookup::importer = new GPB::compiler::Importer(&source_tree, &error_collector); GPB::DynamicMessageFactory DescriptorPoolLookup::message_factory(importer->pool()); /** * Add descriptors from a proto file to the descriptor pool. * * Specifically, message types, extensions, and enums are added. * Services are not added because they are not really used in RProtoBuf. * * @param files A character vector of .proto files to import. * @param dirs A character vector of directories to import from. * @throws Rcpp::exception if a file can't be loaded (uncaught). */ void DescriptorPoolLookup::importProtoFiles(SEXP files, SEXP dirs) { source_tree.addDirectories(dirs); int n = LENGTH(files); for (int j = 0; j < n; j++) { const GPB::FileDescriptor* file_desc = importer->Import(CHAR(STRING_ELT(files, j))); if (!file_desc) { std::string message = std::string("Could not load proto file '") + CHAR(STRING_ELT(files, j)) + "'\n"; Rcpp_error(message.c_str()); } // add top level messages from the file. int ntypes = file_desc->message_type_count(); for (int i = 0; i < ntypes; i++) { const GPB::Descriptor* desc = file_desc->message_type(i); add(desc->full_name()); /* should we bother recursing ? */ } // add top level extensions int nexts = file_desc->extension_count(); for (int i = 0; i < nexts; i++) { const GPB::FieldDescriptor* field_desc = file_desc->extension(i); add(field_desc->full_name()); } // add top level enums. int nenums = file_desc->enum_type_count(); for (int i = 0; i < nenums; i++) { const GPB::EnumDescriptor* enum_desc = file_desc->enum_type(i); add(enum_desc->full_name()); } } // source_tree.removeDirectories( dirs ) ; } /** * Clears any persisted state for the descriptor pool. */ void DescriptorPoolLookup::reset() { source_tree.removeAllDirectories(); elements.clear(); // TODO: Find out why deleting the old importer crashes the unit test run sometimes. // delete importer; importer = new GPB::compiler::Importer(&source_tree, &error_collector); } const GPB::DescriptorPool* DescriptorPoolLookup::pool() { return importer->pool(); } const GPB::DynamicMessageFactory* DescriptorPoolLookup::factory() { return &message_factory; } } // namespace rprotobuf RProtoBuf/src/Makevars.ucrt0000644000176200001440000000026715130725671015407 0ustar liggesusersifeq (,$(shell pkg-config --version 2>/dev/null)) PKG_LIBS = -lprotobuf else PKG_LIBS = $(shell pkg-config --libs protobuf) endif all: clean clean: rm -f $(OBJECTS) $(SHLIB) RProtoBuf/src/wrapper_Message.cpp0000644000176200001440000012137414752644073016577 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "fieldtypes.h" #include "RcppMacros.h" #define SAME(x, y, tol) ((tol == 0.0 && x == y) || (((x - y) * (x - y) < tol* tol) ? 1 : 0)) namespace rprotobuf { /* helpers */ /* this is only to be called for repeated fields */ int MESSAGE_GET_REPEATED_INT(const GPB::Message* message, const GPB::FieldDescriptor* field_desc, int index) { const GPB::Reflection* ref = message->GetReflection(); switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: return (int)ref->GetRepeatedInt32(*message, field_desc, index); case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: return (int)ref->GetRepeatedInt64(*message, field_desc, index); case TYPE_UINT32: case TYPE_FIXED32: return (int)ref->GetRepeatedUInt32(*message, field_desc, index); case TYPE_UINT64: case TYPE_FIXED64: return (int)ref->GetRepeatedUInt64(*message, field_desc, index); case TYPE_ENUM: return ref->GetRepeatedEnum(*message, field_desc, index)->number(); default: Rcpp_error("cannot cast to int"); } return 0; // Unreachable for -Wall } /* this is only to be called for repeated fields */ double MESSAGE_GET_REPEATED_DOUBLE(const GPB::Message* message, const GPB::FieldDescriptor* field_desc, int index) { const GPB::Reflection* ref = message->GetReflection(); switch (field_desc->type()) { case TYPE_FLOAT: return (double)ref->GetRepeatedFloat(*message, field_desc, index); case TYPE_DOUBLE: return (double)ref->GetRepeatedDouble(*message, field_desc, index); default: Rcpp_error("cannot cast to double"); } return 0; // -Wall } #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(Message__, __NAME__) /** * Clone a message * * @param xp external pointer to a message * @return a new message, clone of the input message */ RPB_FUNCTION_1(S4_Message, METHOD(clone), Rcpp::XPtr message) { /* cloning message as sheep */ GPB::Message* sheep = message->New(); sheep->CopyFrom(*message); return S4_Message(sheep); } /** * TRUE if the message has the specified field name. * FALSE otherwise. * * * @param xp external pointer to the Message * @param name name of the field */ RPB_FUNCTION_2(bool, METHOD(field_exists), Rcpp::XPtr message, std::string name) { const GPB::Descriptor* desc = message->GetDescriptor(); const GPB::FieldDescriptor* field_desc = desc->FindFieldByName(name); return (field_desc != NULL); } /** * TRUE if the message has the field name and it is populated. * FALSE otherwise. * * @param xp external pointer to the Message * @param name name of the field */ RPB_FUNCTION_2(bool, METHOD(has_field), Rcpp::XPtr message, std::string name) { const GPB::Descriptor* desc = message->GetDescriptor(); const GPB::FieldDescriptor* field_desc = desc->FindFieldByName(name); bool res = false; if (field_desc) { const GPB::Reflection* ref = message->GetReflection(); if (field_desc->is_repeated()) { res = ref->FieldSize(*message, field_desc) > 0; } else { res = ref->HasField(*message, field_desc); } } return res; } /** * Check if all required fields are set * * @param xp external pointer to the Message */ RPB_FUNCTION_1(bool, METHOD(is_initialized), Rcpp::XPtr message) { return message->IsInitialized(); } /** * Serialize a message to a file * * @param xp external pointer to a GPB::Message* * @param filename file name where to serialize */ RPB_FUNCTION_VOID_2(METHOD(serialize_to_file), Rcpp::XPtr message, const char* filename) { /* open the file in binary mode to write */ /* we make sure in the R side that filename is the full path of the file */ int file = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); /* using partial to allow partially filled messages */ // TODO(mstokely): Check return value and throw Rcpp::stop if 0? message->SerializePartialToFileDescriptor(file); close(file); } /** * Create a raw vector that contains the content of the serialized message * * @param xp xternal pointer to the message */ RPB_FUNCTION_1(Rcpp::RawVector, METHOD(get_payload), Rcpp::XPtr message) { /* create a raw vector of the appropriate size */ #if GOOGLE_PROTOBUF_VERSION < 3006001 R_xlen_t size = message->ByteSize(); #else R_xlen_t size = message->ByteSizeLong(); #endif Rcpp::RawVector payload(size); /* fill the array */ message->SerializePartialToArray(payload.begin(), size); return (payload); } RPB_XP_METHOD_VOID_0(METHOD(clear), GPB::Message, Clear) /** * Clear a field of a message * * @param xp (GPB::Message*) external pointer * @param field name or tag of the field */ RPB_FUNCTION_VOID_2(METHOD(clear_field), Rcpp::XPtr m, SEXP field) { const GPB::FieldDescriptor* field_desc = getFieldDescriptor(m, field); const GPB::Reflection* ref = m->GetReflection(); ref->ClearField(m, field_desc); } /** * Return a named list representation of the fields set in a message. * * @param xp external pointer to a Message * @return the message as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr message) { const GPB::Descriptor* desc = message->GetDescriptor(); int nf = desc->field_count(); Rcpp::CharacterVector fieldNames(nf); Rcpp::List val(nf); /* TODO: not use getMessageField */ for (int i = 0; i < nf; i++) { const GPB::FieldDescriptor* fd = desc->field(i); val[i] = getMessageField(message, Rcpp::CharacterVector::create(fd->name())); fieldNames[i] = std::string(fd->name()); } val.names() = fieldNames; return val; } /** * The number of fields the message has. A field counts in these two situations: * - it is repeated and the array size is greater than 0 * - it is not repeated and the message has it * * @param xp external pointer to the Message */ RPB_FUNCTION_1(int, METHOD(length), Rcpp::XPtr message) { const GPB::Descriptor* desc = message->GetDescriptor(); const GPB::Reflection* ref = message->GetReflection(); int nfields = desc->field_count(); int res = 0; for (int i = 0; i < nfields; i++) { const GPB::FieldDescriptor* field_desc = desc->field(i); if (field_desc->is_repeated()) { if (ref->FieldSize(*message, field_desc) > 0) { res++; } } else { if (ref->HasField(*message, field_desc)) { res++; } } } return res; } /** * The number of extensions the message has. * * @param xp external pointer to the Message */ RPB_FUNCTION_1(int, METHOD(num_extensions), Rcpp::XPtr message) { const GPB::Reflection* ref = message->GetReflection(); int nexts = 0; std::vector fields; ref->ListFields(*message, &fields); for (unsigned int i = 0; i < fields.size(); i++) { if (fields[i]->is_extension()) { nexts++; } } return nexts; } /** * Get the message descriptor of a Message. * * @param xp (GPB::Message*) external pointer * @return the descriptor, as a Descriptor R S4 object */ RPB_FUNCTION_1(S4_Descriptor, METHOD(descriptor), Rcpp::XPtr message) { return (message->GetDescriptor()); } RPB_XP_METHOD_0(METHOD(as_character), GPB::Message, DebugString) #if GOOGLE_PROTOBUF_VERSION < 3006001 RPB_XP_METHOD_0(METHOD(bytesize), GPB::Message, ByteSize) #else RPB_XP_METHOD_0(METHOD(bytesize), GPB::Message, ByteSizeLong) #endif RPB_FUNCTION_2(int, METHOD(field_size), Rcpp::XPtr message, SEXP field) { const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); int res = 0; if (field_desc->is_repeated()) { res = message->GetReflection()->FieldSize(*message, field_desc); } else { res = message->GetReflection()->HasField(*message, field_desc) ? 1 : 0; } return res; } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr message) { return S4_FileDescriptor(message->GetDescriptor()->file()); } RPB_FUNCTION_VOID_3(METHOD(set_field_size), Rcpp::XPtr message, SEXP field, int target) { const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); const GPB::Reflection* ref = message->GetReflection(); if (field_desc->is_repeated()) { int current = ref->FieldSize(*message, field_desc); if (target == 0) { ref->ClearField(message, field_desc); } else if (current > target) { while (current != target) { ref->RemoveLast(message, field_desc); current--; } } else if (current == target) { /* nothing to do */ } else {/* current < target */ while (current != target) { switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { ref->AddInt32(message, field_desc, (int32)0); break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { ref->AddInt64(message, field_desc, (int64)0); break; } case TYPE_UINT32: case TYPE_FIXED32: { ref->AddUInt32(message, field_desc, (uint32)0); break; } case TYPE_UINT64: case TYPE_FIXED64: { ref->AddUInt32(message, field_desc, (uint64)0); break; } case TYPE_DOUBLE: { ref->AddDouble(message, field_desc, (double)0.0); break; } case TYPE_FLOAT: { ref->AddFloat(message, field_desc, (float)0.0); break; } case TYPE_BOOL: { ref->AddBool(message, field_desc, (bool)0); break; } case TYPE_STRING: case TYPE_BYTES: { ref->AddString(message, field_desc, ""); break; } case TYPE_MESSAGE: case TYPE_GROUP: { /* fill with the prototype for that message type */ Rcpp_error("growing repeated messages not implemented, patches welcome"); break; } case TYPE_ENUM: { /* fill with the prototype for that message type */ Rcpp_error("growing repeated enums not implemented yet, patches welcome"); break; } } /* switch */ current++; } /* while */ } } else { if (target == 0) { if (ref->HasField(*message, field_desc)) { ref->ClearField(message, field_desc); } } else { if (!ref->HasField(*message, field_desc)) { switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { ref->SetInt32(message, field_desc, (int32)0); break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { ref->SetInt64(message, field_desc, (int64)0); break; } case TYPE_UINT32: case TYPE_FIXED32: { ref->SetUInt32(message, field_desc, (uint32)0); break; } case TYPE_UINT64: case TYPE_FIXED64: { ref->SetUInt32(message, field_desc, (uint64)0); break; } case TYPE_DOUBLE: { ref->SetDouble(message, field_desc, (double)0.0); break; } case TYPE_FLOAT: { ref->SetFloat(message, field_desc, (float)0.0); break; } case TYPE_BOOL: { ref->SetBool(message, field_desc, (bool)0); break; } case TYPE_STRING: case TYPE_BYTES: { ref->SetString(message, field_desc, ""); break; } case TYPE_MESSAGE: case TYPE_GROUP: { /* fill with the prototype for that message type */ Rcpp_error("not implemented yet, patches welcome"); break; } case TYPE_ENUM: { /* fill with the prototype for that message type */ Rcpp_error("not implemented yet, patches welcome"); break; } } } } } } /** * Returns the field names of the message. * * @param xp external pointer to a Message * * @return field names, as an R character vector (STRSXP) */ RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(fieldNames), Rcpp::XPtr message) { const GPB::Descriptor* desc = message->GetDescriptor(); int nfields = desc->field_count(); Rcpp::CharacterVector res(nfields); for (int i = 0; i < nfields; i++) { res[i] = std::string(desc->field(i)->name()); } return (res); } /** * Returns the JSON representation of the message. * * @param xp external pointer to a Message * @param preserve_proto_field_names If FALSE (the default) convert field names to camelCase. * @param always_print_primitive_fields Whether to return the default value for missing primitive fields. (default false) * * @return JSON representation of the message as a single element R character vector (STRSXP) */ RPB_FUNCTION_3(Rcpp::CharacterVector, METHOD(as_json), Rcpp::XPtr message, bool preserve_proto_field_names, bool always_print_primitive_fields) { #ifdef PROTOBUF_JSON_UTIL GPB::util::JsonPrintOptions opts; opts.add_whitespace = true; opts.preserve_proto_field_names = preserve_proto_field_names; #if GOOGLE_PROTOBUF_VERSION < 5026000 opts.always_print_primitive_fields = always_print_primitive_fields; #endif std::string buf; #if GOOGLE_PROTOBUF_VERSION < 4022000 GPB::util::Status status = GPB::util::MessageToJsonString(*message, &buf, opts); #else absl::Status status = GPB::util::MessageToJsonString(*message, &buf, opts); #endif if (!status.ok()) { Rcpp::stop(status.ToString().c_str()); } Rcpp::CharacterVector res(1); res[0] = buf; return (res); #else Rcpp::stop( "The protobuf library you are using is too old for using JSON utility functions, " "please upgrade to version 3 or above."); #endif } bool identical_messages_(const GPB::Message* m1, const GPB::Message* m2, double tol) { const GPB::Descriptor* d1 = m1->GetDescriptor(); const GPB::Descriptor* d2 = m2->GetDescriptor(); /* first of all, check if this is the same message type */ if (d1 != d2) { return false; } const GPB::Reflection* ref = m2->GetReflection(); /* iterate field descriptors */ int nf = d1->field_count(); for (int i = 0; i < nf; i++) { const GPB::FieldDescriptor* field_desc = d1->field(i); if (field_desc->is_repeated()) { /* test if the size differs */ int fs1 = ref->FieldSize(*m1, field_desc); int fs2 = ref->FieldSize(*m2, field_desc); if (fs1 != fs2) return false; /* skip the field if it's unset in both messages */ if ((fs1 == 0) & (fs2 == 0)) continue; /* test all items */ switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedInt32(*m1, field_desc, j) != ref->GetRepeatedInt32(*m2, field_desc, j)) return false; } break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedInt64(*m1, field_desc, j) != ref->GetRepeatedInt64(*m2, field_desc, j)) return false; } break; } case TYPE_UINT32: case TYPE_FIXED32: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedUInt32(*m1, field_desc, j) != ref->GetRepeatedUInt32(*m2, field_desc, j)) return false; } break; } case TYPE_UINT64: case TYPE_FIXED64: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedUInt64(*m1, field_desc, j) != ref->GetRepeatedUInt64(*m2, field_desc, j)) return false; } break; } case TYPE_DOUBLE: { for (int j = 0; j < fs1; j++) { if (!SAME(ref->GetRepeatedDouble(*m1, field_desc, j), ref->GetRepeatedDouble(*m2, field_desc, j), tol)) return false; } break; } case TYPE_FLOAT: { for (int j = 0; j < fs1; j++) { if (!SAME(ref->GetRepeatedFloat(*m1, field_desc, j), ref->GetRepeatedFloat(*m2, field_desc, j), tol)) return false; } break; } case TYPE_BOOL: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedBool(*m1, field_desc, j) != ref->GetRepeatedBool(*m2, field_desc, j)) return false; } break; } case TYPE_STRING: case TYPE_BYTES: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedString(*m1, field_desc, j) != ref->GetRepeatedString(*m2, field_desc, j)) return false; } break; } case TYPE_ENUM: { for (int j = 0; j < fs1; j++) { if (ref->GetRepeatedEnum(*m1, field_desc, j) != ref->GetRepeatedEnum(*m2, field_desc, j)) return false; } break; } case TYPE_MESSAGE: case TYPE_GROUP: { for (int j = 0; j < fs1; j++) { const GPB::Message* mm1 = &ref->GetRepeatedMessage(*m1, field_desc, j); const GPB::Message* mm2 = &ref->GetRepeatedMessage(*m2, field_desc, j); if (!identical_messages_(mm1, mm2, tol)) { return false; } } break; } default: Rcpp_error("unknown type"); } } else { /* skip the field if it's unset in both messages */ bool hf1 = ref->HasField(*m1, field_desc); bool hf2 = ref->HasField(*m2, field_desc); if (!hf1 & !hf2) continue; switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { if (ref->GetInt32(*m1, field_desc) != ref->GetInt32(*m2, field_desc)) return false; break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { if (ref->GetInt64(*m1, field_desc) != ref->GetInt64(*m2, field_desc)) return false; break; } case TYPE_UINT32: case TYPE_FIXED32: { if (ref->GetUInt32(*m1, field_desc) != ref->GetUInt32(*m2, field_desc)) return false; break; } case TYPE_UINT64: case TYPE_FIXED64: { if (ref->GetUInt64(*m1, field_desc) != ref->GetUInt64(*m2, field_desc)) return false; break; } case TYPE_DOUBLE: { if (ref->GetDouble(*m1, field_desc) != ref->GetDouble(*m2, field_desc)) return false; break; } case TYPE_FLOAT: { if (ref->GetFloat(*m1, field_desc) != ref->GetFloat(*m2, field_desc)) return false; break; } case TYPE_BOOL: { if (ref->GetBool(*m1, field_desc) != ref->GetBool(*m2, field_desc)) return false; break; } case TYPE_STRING: case TYPE_BYTES: { if (ref->GetString(*m1, field_desc) != ref->GetString(*m2, field_desc)) return false; break; } case TYPE_ENUM: { if (ref->GetEnum(*m1, field_desc) != ref->GetEnum(*m2, field_desc)) return false; break; } case TYPE_MESSAGE: case TYPE_GROUP: { const GPB::Message* mm1 = &ref->GetMessage(*m1, field_desc); const GPB::Message* mm2 = &ref->GetMessage(*m2, field_desc); if (!identical_messages_(mm1, mm2, tol)) { return false; } break; } default: Rcpp_error("unknown type"); } } } /* finally */ return true; } RPB_FUNCTION_2(bool, identical_messages, Rcpp::XPtr m1, Rcpp::XPtr m2) { return identical_messages_(m1, m2, 0.0); } RPB_FUNCTION_3(bool, all_equal_messages, Rcpp::XPtr m1, Rcpp::XPtr m2, double tol) { return identical_messages_(m1, m2, tol); } RPB_FUNCTION_VOID_4(METHOD(swap), Rcpp::XPtr message, SEXP field, Rcpp::IntegerVector left, Rcpp::IntegerVector right) { GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); const GPB::Reflection* ref = message->GetReflection(); if (!field_desc->is_repeated()) { throw std::range_error("swap can only be used with repeated fields"); } int n = LENGTH(left); /* we know that length(left) == length(right) */ for (int i = 0; i < n; i++) { ref->SwapElements(message, field_desc, left[i], right[i]); } } /** * Creates a new message by merging two messages of the same type. * * @param xp1 external pointer to a GPB::Message* * @param xp2 external pointer to a GPB::Message* * * @return a new message, as an R object of "Message" S4 class */ RPB_FUNCTION_2(S4_Message, METHOD(merge), Rcpp::XPtr m1, Rcpp::XPtr m2) { GPB::Message* merged = m1->New(); merged->MergeFrom(*m1); merged->MergeFrom(*m2); return S4_Message(merged); } /** * Add values to a repeated field. * * @param xp (GPB::Message*) external pointer * @param field field tag number or name * @param values values to append */ RPB_FUNCTION_VOID_3(METHOD(add_values), Rcpp::XPtr message, SEXP field, SEXP values) { const Reflection* ref = message->GetReflection(); const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); if (values == R_NilValue || LENGTH(values) == 0) { return; } if (field_desc->is_repeated()) { /* first check */ switch (field_desc->type()) { case TYPE_ENUM: { CHECK_values_for_enum(field_desc, values); break; } case TYPE_MESSAGE: case TYPE_GROUP: { CHECK_messages(field_desc, values); break; } default: { // nothing } } int value_size = LENGTH(values); /* then add the values */ switch (field_desc->type()) { // {{{ int32 case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddInt32(message, field_desc, GET_int32(values, i)); } break; } default: Rcpp::stop("Cannot convert to int32"); } break; } // }}} // {{{ int64 case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: for (int i = 0; i < value_size; i++) { ref->AddInt64(message, field_desc, GET_int64(values, i)); } break; default: Rcpp::stop("Cannot convert to int64"); } break; } // }}} // {{{ uint32 case TYPE_UINT32: case TYPE_FIXED32: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddUInt32(message, field_desc, GET_uint32(values, i)); } break; } default: Rcpp::stop("Cannot convert to uint32"); } break; } // }}} // {{{ uint64 case TYPE_UINT64: case TYPE_FIXED64: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddUInt64(message, field_desc, GET_uint64(values, i)); } break; } default: Rcpp::stop("Cannot convert to int64"); } break; } // }}} // {{{ double case TYPE_DOUBLE: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddDouble(message, field_desc, GET_double(values, i)); } break; } default: Rcpp::stop("Cannot convert to double"); } break; } // }}} // {{{ float case TYPE_FLOAT: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddFloat(message, field_desc, GET_float(values, i)); } break; } default: Rcpp::stop("Cannot convert to float"); } break; } // }}} // {{{ bool case TYPE_BOOL: { switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { ref->AddBool(message, field_desc, GET_bool(values, i)); } break; } default: Rcpp::stop("Cannot convert to bool"); } break; } // }}} // {{{ string case TYPE_STRING: { if (TYPEOF(values) == STRSXP) { for (int i = 0; i < value_size; i++) { ref->AddString(message, field_desc, COPYSTRING(CHAR(STRING_ELT(values, i)))); } } else { Rcpp::stop("Cannot convert to string"); } break; } // }}} // {{{ bytes case TYPE_BYTES: { if (TYPEOF(values) == RAWSXP) { ref->AddString(message, field_desc, GET_bytes(values, 0)); } else if (TYPEOF(values) == VECSXP) { for (int i = 0; i < value_size; i++) { ref->AddString(message, field_desc, GET_bytes(values, i)); } } else { Rcpp::stop("Cannot convert to bytes"); } break; } // }}} // {{{ message case TYPE_MESSAGE: case TYPE_GROUP: { if (TYPEOF(values) == VECSXP) { for (int i = 0; i < value_size; i++) { GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(values, i)); /* we already know it is of the correct type because of premptive check above */ ref->AddMessage(message, field_desc)->CopyFrom(*mess); } } else { Rcpp::stop("type mismatch, expecting a list of 'Message' objects"); } break; } // }}} // {{{ enum case TYPE_ENUM: { const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); switch (TYPEOF(values)) { // {{{ numbers case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < value_size; i++) { int val = GET_int(values, i); ref->AddEnum(message, field_desc, enum_desc->FindValueByNumber(val)); } break; } // }}} // {{{ STRSXP case STRSXP: { for (int i = 0; i < value_size; i++) { std::string val = CHAR(STRING_ELT(values, i)); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); ref->AddEnum(message, field_desc, evd); } break; } // }}} default: Rcpp::stop("cannot set enum value"); } break; } // }}} default: { // nothing } } } else { Rcpp::stop("add can only be used on repeated fields"); } } /** * Fetch a subset of the values of a field. * * @param (GPB::Message*) external pointer * @param field name or tag number of the field * @param index */ RPB_FUNCTION_3(SEXP, METHOD(get_field_values), Rcpp::XPtr message, SEXP field, Rcpp::IntegerVector index) { GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); if (!field_desc->is_repeated()) { Rcpp_error("fetch can only be used on repeated fields"); } int n = index.size(); switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: case TYPE_UINT32: case TYPE_FIXED32: case TYPE_UINT64: case TYPE_FIXED64: case TYPE_ENUM: { Rcpp::IntegerVector res(n); for (int i = 0; i < n; i++) { res[i] = MESSAGE_GET_REPEATED_INT(message, field_desc, index[i]); } return res; } case TYPE_DOUBLE: case TYPE_FLOAT: { Rcpp::NumericVector res(n); for (int i = 0; i < n; i++) { res[i] = MESSAGE_GET_REPEATED_DOUBLE(message, field_desc, index[i]); } return res; } case TYPE_BOOL: { Rcpp::LogicalVector res(n); for (int i = 0; i < n; i++) { res[i] = MESSAGE_GET_REPEATED_DOUBLE(message, field_desc, index[i]); } return res; } case TYPE_STRING: { const GPB::Reflection* ref = message->GetReflection(); Rcpp::CharacterVector res(n); for (int i = 0; i < n; i++) { res[i] = ref->GetRepeatedString(*message, field_desc, index[i]); } return res; } case TYPE_BYTES: { const GPB::Reflection* ref = message->GetReflection(); Rcpp::List res(n); for (int i = 0; i < n; i++) { std::string s = ref->GetRepeatedString(*message, field_desc, index[i]); res[i] = std::vector(s.begin(), s.end()); } return res; } case TYPE_MESSAGE: case TYPE_GROUP: { const GPB::Reflection* ref = message->GetReflection(); Rcpp::List res(n); for (int i = 0; i < n; i++) { res[i] = S4_Message(CLONE(&ref->GetRepeatedMessage(*message, field_desc, index[i]))); } return res; } default: throw std::range_error("unknown type"); } return R_NilValue; // Unreachable. For -Wall } /** * set the values of a repeated field * * @param xp (GPB::Message*) external pointer * @param field field tag number or name * @param index positions (0-based) * @param values new values */ RPB_FUNCTION_VOID_4(METHOD(set_field_values), Rcpp::XPtr message, SEXP field, Rcpp::IntegerVector index, SEXP values) { const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, field); if (!field_desc->is_repeated()) { throw std::range_error("set can only be used on repeated fields"); } const GPB::Reflection* ref = message->GetReflection(); /* we know here that LENGTH(index) == LENGTH(values) */ int n = index.size(); switch (field_desc->type()) { case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { for (int i = 0; i < n; i++) { ref->SetRepeatedInt32(message, field_desc, index[i], GET_int32(values, i)); } break; } case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { for (int i = 0; i < n; i++) { ref->SetRepeatedInt64(message, field_desc, index[i], GET_int64(values, i)); } break; } case TYPE_UINT32: case TYPE_FIXED32: { for (int i = 0; i < n; i++) { ref->SetRepeatedUInt32(message, field_desc, GET_int(index, i), GET_uint32(values, i)); } break; } case TYPE_UINT64: case TYPE_FIXED64: { for (int i = 0; i < n; i++) { ref->SetRepeatedUInt64(message, field_desc, index[i], GET_uint64(values, i)); } break; } case TYPE_DOUBLE: { for (int i = 0; i < n; i++) { ref->SetRepeatedDouble(message, field_desc, index[i], GET_double(values, i)); } break; } case TYPE_FLOAT: { for (int i = 0; i < n; i++) { ref->SetRepeatedFloat(message, field_desc, index[i], GET_float(values, i)); } break; } case TYPE_BOOL: { for (int i = 0; i < n; i++) { ref->SetRepeatedBool(message, field_desc, index[i], GET_bool(values, i)); } break; } case TYPE_STRING: { for (int i = 0; i < n; i++) { ref->SetRepeatedString(message, field_desc, index[i], GET_stdstring(values, i)); } break; } case TYPE_BYTES: { for (int i = 0; i < n; i++) { ref->SetRepeatedString(message, field_desc, index[i], GET_bytes(values, i)); } break; } case TYPE_ENUM: { CHECK_values_for_enum(field_desc, values); const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); switch (TYPEOF(values)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { for (int i = 0; i < n; i++) { int val = GET_int(values, i); ref->SetRepeatedEnum(message, field_desc, i, enum_desc->FindValueByNumber(val)); } break; } case STRSXP: { Rcpp::CharacterVector vals(values); std::string val; for (int i = 0; i < n; i++) { val = vals[i]; const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); ref->SetRepeatedEnum(message, field_desc, i, evd); } break; } default: throw std::range_error("impossible to convert to a enum"); } break; } case TYPE_MESSAGE: case TYPE_GROUP: { CHECK_messages(field_desc, values); Rcpp::List vals(values); for (int i = 0; i < n; i++) { GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(vals[i]); ref->MutableRepeatedMessage(message, field_desc, i)->CopyFrom(*mess); } break; } default: throw std::range_error("unknown type"); } } //#undef METHOD /** * Return the TextFormat of message * @param xp external pointer to the Message */ RPB_FUNCTION_1(std::string, METHOD(print_text_format), Rcpp::XPtr message) { std::string message_text; GPB::TextFormat::PrintToString(*message, &message_text); return message_text; } } RProtoBuf/src/init.c0000644000176200001440000006076614772556253014071 0ustar liggesusers#include #include #include // for NULL #include /* The following name(s) appear with different usages e.g., with different numbers of arguments: Message__clone This needs to be resolved in the tables and any declarations. DE 2017-03-05: Resolved, second entry with two arguments was in error */ /* DE 2017-03-05: - Below several entries were commented out as unresolvable - A few were renamed with suffix _cpp to avoid name clash with R symbols of the same name as we also enable .registration=TRUE in useDynLib in NAMESPACE */ /* FIXME: Check these declarations against the C/Fortran source code. */ /* .Call calls */ extern SEXP all_equal_messages(SEXP, SEXP, SEXP); extern SEXP ArrayInputStream__new(SEXP, SEXP); extern SEXP ArrayOutputStream__new(SEXP, SEXP); extern SEXP ConnectionInputStream_new(SEXP, SEXP); extern SEXP ConnectionOutputStream_new(SEXP, SEXP); extern SEXP Descriptor__as_character(SEXP); extern SEXP Descriptor__as_list(SEXP); extern SEXP Descriptor__as_Message(SEXP); extern SEXP Descriptor__containing_type(SEXP); extern SEXP Descriptor__enum_type(SEXP, SEXP); extern SEXP Descriptor__enum_type_count(SEXP); extern SEXP Descriptor__field(SEXP, SEXP); extern SEXP Descriptor__field_count(SEXP); extern SEXP Descriptor__fileDescriptor(SEXP); extern SEXP Descriptor__FindFieldByName(SEXP, SEXP); extern SEXP Descriptor__FindFieldByNumber(SEXP, SEXP); extern SEXP Descriptor__FindNestedTypeByName(SEXP, SEXP); extern SEXP Descriptor__getMemberNames(SEXP); extern SEXP Descriptor__name(SEXP, SEXP); extern SEXP Descriptor__nested_type(SEXP, SEXP); extern SEXP Descriptor__nested_type_count(SEXP); extern SEXP Descriptor__readASCIIFromConnection(SEXP, SEXP, SEXP); extern SEXP Descriptor__readASCIIFromString(SEXP, SEXP, SEXP); extern SEXP Descriptor__readJSONFromConnection(SEXP, SEXP); extern SEXP Descriptor__readJSONFromString(SEXP, SEXP); extern SEXP Descriptor__readMessageFromConnection(SEXP, SEXP); extern SEXP Descriptor__readMessageFromFile(SEXP, SEXP); extern SEXP Descriptor__readMessageFromRawVector(SEXP, SEXP); extern SEXP Descriptor_getField(SEXP, SEXP); extern SEXP do_dollar_Descriptor(SEXP, SEXP); extern SEXP EnumDescriptor__as_character(SEXP); extern SEXP EnumDescriptor__as_list(SEXP); extern SEXP EnumDescriptor__as_Message(SEXP); extern SEXP EnumDescriptor__containing_type(SEXP); extern SEXP EnumDescriptor__fileDescriptor(SEXP); extern SEXP EnumDescriptor__getConstantNames(SEXP); extern SEXP EnumDescriptor__getValueByIndex(SEXP, SEXP); extern SEXP EnumDescriptor__getValueByName(SEXP, SEXP); extern SEXP EnumDescriptor__getValueByNumber(SEXP, SEXP); extern SEXP EnumDescriptor__length(SEXP); extern SEXP EnumDescriptor__name(SEXP, SEXP); extern SEXP EnumDescriptor__value_count(SEXP); extern SEXP EnumValueDescriptor__as_character(SEXP); extern SEXP EnumValueDescriptor__as_Message(SEXP); extern SEXP EnumValueDescriptor__enum_type(SEXP); extern SEXP EnumValueDescriptor__name(SEXP, SEXP); extern SEXP EnumValueDescriptor__number(SEXP); extern SEXP FieldDescriptor__as_character(SEXP); extern SEXP FieldDescriptor__as_Message(SEXP); extern SEXP FieldDescriptor__containing_type(SEXP); extern SEXP FieldDescriptor__cpp_type(SEXP); extern SEXP FieldDescriptor__default_value(SEXP); extern SEXP FieldDescriptor__enum_type(SEXP); extern SEXP FieldDescriptor__fileDescriptor(SEXP); extern SEXP FieldDescriptor__has_default_value(SEXP); extern SEXP FieldDescriptor__is_extension(SEXP); extern SEXP FieldDescriptor__is_optional(SEXP); extern SEXP FieldDescriptor__is_repeated(SEXP); extern SEXP FieldDescriptor__is_required(SEXP); extern SEXP FieldDescriptor__label(SEXP); extern SEXP FieldDescriptor__message_type(SEXP); extern SEXP FieldDescriptor__name(SEXP, SEXP); extern SEXP FieldDescriptor__number(SEXP); extern SEXP FieldDescriptor__type(SEXP); extern SEXP FileDescriptor__as_character(SEXP); extern SEXP FileDescriptor__as_list(SEXP); extern SEXP FileDescriptor__as_Message(SEXP); extern SEXP FileDescriptor__getMemberNames(SEXP); extern SEXP FileDescriptor__name(SEXP); extern SEXP FileInputStream_Close(SEXP); extern SEXP FileInputStream_GetErrno(SEXP); extern SEXP FileInputStream_new(SEXP, SEXP, SEXP); extern SEXP FileInputStream_SetCloseOnDelete(SEXP, SEXP); extern SEXP FileOutputStream_Close(SEXP); extern SEXP FileOutputStream_Flush(SEXP); extern SEXP FileOutputStream_GetErrno(SEXP); extern SEXP FileOutputStream_new(SEXP, SEXP, SEXP); extern SEXP FileOutputStream_SetCloseOnDelete(SEXP, SEXP); /*extern SEXP get_method_input_type(SEXP);*/ extern SEXP get_method_output_prototype(SEXP); extern SEXP get_protobuf_library_version(void); extern SEXP get_value_of_enum(SEXP, SEXP); extern SEXP getEnumDescriptor(SEXP); extern SEXP getExtension_cpp(SEXP, SEXP); extern SEXP getExtensionDescriptor(SEXP); extern SEXP getMessageField(SEXP, SEXP); extern SEXP getProtobufDescriptor(SEXP); extern SEXP has_enum_name(SEXP, SEXP); extern SEXP identical_messages(SEXP, SEXP); extern SEXP Message__add_values(SEXP, SEXP, SEXP); extern SEXP Message__as_character(SEXP); extern SEXP Message__as_json(SEXP, SEXP, SEXP); extern SEXP Message__as_list(SEXP); extern SEXP Message__bytesize(SEXP); extern SEXP Message__clear(SEXP); extern SEXP Message__clear_field(SEXP, SEXP); extern SEXP Message__clone(SEXP); /*extern SEXP Message__clone(SEXP, SEXP);*/ extern SEXP Message__descriptor(SEXP); extern SEXP Message__field_exists(SEXP, SEXP); extern SEXP Message__field_size(SEXP, SEXP); extern SEXP Message__fieldNames(SEXP); extern SEXP Message__fileDescriptor(SEXP); extern SEXP Message__get_field_values(SEXP, SEXP, SEXP); extern SEXP Message__get_payload(SEXP); extern SEXP Message__has_field(SEXP, SEXP); extern SEXP Message__is_initialized(SEXP); extern SEXP Message__length(SEXP); extern SEXP Message__merge(SEXP, SEXP); extern SEXP Message__num_extensions(SEXP); extern SEXP Message__print_text_format(SEXP); extern SEXP Message__serialize_to_file(SEXP, SEXP); extern SEXP Message__set_field_size(SEXP, SEXP, SEXP); extern SEXP Message__set_field_values(SEXP, SEXP, SEXP, SEXP); extern SEXP Message__swap(SEXP, SEXP, SEXP, SEXP); extern SEXP MethodDescriptor__as_character(SEXP); extern SEXP MethodDescriptor__as_Message(SEXP); extern SEXP MethodDescriptor__fileDescriptor(SEXP); extern SEXP MethodDescriptor__input_type(SEXP); extern SEXP MethodDescriptor__name(SEXP, SEXP); extern SEXP MethodDescriptor__output_type(SEXP); extern SEXP newProtocolBufferLookup(SEXP); extern SEXP newProtoMessage(SEXP); extern SEXP readProtoFiles_cpp(SEXP, SEXP); extern SEXP resetDescriptorPool_cpp(void); extern SEXP ServiceDescriptor__as_character(SEXP); extern SEXP ServiceDescriptor__as_list(SEXP); extern SEXP ServiceDescriptor__as_Message(SEXP); extern SEXP ServiceDescriptor__fileDescriptor(SEXP); extern SEXP ServiceDescriptor__getMethodNames(SEXP); extern SEXP ServiceDescriptor__name(SEXP, SEXP); /*extern SEXP ServiceDescriptor_method_count(SEXP);*/ extern SEXP setMessageField(SEXP, SEXP, SEXP); extern SEXP update_message(SEXP, SEXP); extern SEXP valid_input_message(SEXP, SEXP); extern SEXP valid_output_message(SEXP, SEXP); extern SEXP ZeroCopyInputStream_BackUp(SEXP, SEXP); extern SEXP ZeroCopyInputStream_ByteCount(SEXP); extern SEXP ZeroCopyInputStream_Next(SEXP); extern SEXP ZeroCopyInputStream_ReadLittleEndian32(SEXP); extern SEXP ZeroCopyInputStream_ReadLittleEndian64(SEXP); extern SEXP ZeroCopyInputStream_ReadRaw(SEXP, SEXP); extern SEXP ZeroCopyInputStream_ReadString(SEXP, SEXP); extern SEXP ZeroCopyInputStream_ReadVarint32(SEXP); extern SEXP ZeroCopyInputStream_ReadVarint64(SEXP); extern SEXP ZeroCopyInputStream_Skip(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_BackUp(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_ByteCount(SEXP); extern SEXP ZeroCopyOutputStream_Next(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteLittleEndian32(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteLittleEndian64(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteRaw(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteString(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteVarint32(SEXP, SEXP); extern SEXP ZeroCopyOutputStream_WriteVarint64(SEXP, SEXP); static const R_CallMethodDef CallEntries[] = { {"all_equal_messages", (DL_FUNC) &all_equal_messages, 3}, {"ArrayInputStream__new", (DL_FUNC) &ArrayInputStream__new, 2}, {"ArrayOutputStream__new", (DL_FUNC) &ArrayOutputStream__new, 2}, {"ConnectionInputStream_new", (DL_FUNC) &ConnectionInputStream_new, 2}, {"ConnectionOutputStream_new", (DL_FUNC) &ConnectionOutputStream_new, 2}, {"Descriptor__as_character", (DL_FUNC) &Descriptor__as_character, 1}, {"Descriptor__as_list", (DL_FUNC) &Descriptor__as_list, 1}, {"Descriptor__as_Message", (DL_FUNC) &Descriptor__as_Message, 1}, {"Descriptor__containing_type", (DL_FUNC) &Descriptor__containing_type, 1}, {"Descriptor__enum_type", (DL_FUNC) &Descriptor__enum_type, 2}, {"Descriptor__enum_type_count", (DL_FUNC) &Descriptor__enum_type_count, 1}, {"Descriptor__field", (DL_FUNC) &Descriptor__field, 2}, {"Descriptor__field_count", (DL_FUNC) &Descriptor__field_count, 1}, {"Descriptor__fileDescriptor", (DL_FUNC) &Descriptor__fileDescriptor, 1}, {"Descriptor__FindFieldByName", (DL_FUNC) &Descriptor__FindFieldByName, 2}, {"Descriptor__FindFieldByNumber", (DL_FUNC) &Descriptor__FindFieldByNumber, 2}, {"Descriptor__FindNestedTypeByName", (DL_FUNC) &Descriptor__FindNestedTypeByName, 2}, {"Descriptor__getMemberNames", (DL_FUNC) &Descriptor__getMemberNames, 1}, {"Descriptor__name", (DL_FUNC) &Descriptor__name, 2}, {"Descriptor__nested_type", (DL_FUNC) &Descriptor__nested_type, 2}, {"Descriptor__nested_type_count", (DL_FUNC) &Descriptor__nested_type_count, 1}, {"Descriptor__readASCIIFromConnection", (DL_FUNC) &Descriptor__readASCIIFromConnection, 3}, {"Descriptor__readASCIIFromString", (DL_FUNC) &Descriptor__readASCIIFromString, 3}, {"Descriptor__readJSONFromConnection", (DL_FUNC) &Descriptor__readJSONFromConnection, 2}, {"Descriptor__readJSONFromString", (DL_FUNC) &Descriptor__readJSONFromString, 2}, {"Descriptor__readMessageFromConnection", (DL_FUNC) &Descriptor__readMessageFromConnection, 2}, {"Descriptor__readMessageFromFile", (DL_FUNC) &Descriptor__readMessageFromFile, 2}, {"Descriptor__readMessageFromRawVector", (DL_FUNC) &Descriptor__readMessageFromRawVector, 2}, {"Descriptor_getField", (DL_FUNC) &Descriptor_getField, 2}, {"do_dollar_Descriptor", (DL_FUNC) &do_dollar_Descriptor, 2}, {"EnumDescriptor__as_character", (DL_FUNC) &EnumDescriptor__as_character, 1}, {"EnumDescriptor__as_list", (DL_FUNC) &EnumDescriptor__as_list, 1}, {"EnumDescriptor__as_Message", (DL_FUNC) &EnumDescriptor__as_Message, 1}, {"EnumDescriptor__containing_type", (DL_FUNC) &EnumDescriptor__containing_type, 1}, {"EnumDescriptor__fileDescriptor", (DL_FUNC) &EnumDescriptor__fileDescriptor, 1}, {"EnumDescriptor__getConstantNames", (DL_FUNC) &EnumDescriptor__getConstantNames, 1}, {"EnumDescriptor__getValueByIndex", (DL_FUNC) &EnumDescriptor__getValueByIndex, 2}, {"EnumDescriptor__getValueByName", (DL_FUNC) &EnumDescriptor__getValueByName, 2}, {"EnumDescriptor__getValueByNumber", (DL_FUNC) &EnumDescriptor__getValueByNumber, 2}, {"EnumDescriptor__length", (DL_FUNC) &EnumDescriptor__length, 1}, {"EnumDescriptor__name", (DL_FUNC) &EnumDescriptor__name, 2}, {"EnumDescriptor__value_count", (DL_FUNC) &EnumDescriptor__value_count, 1}, {"EnumValueDescriptor__as_character", (DL_FUNC) &EnumValueDescriptor__as_character, 1}, {"EnumValueDescriptor__as_Message", (DL_FUNC) &EnumValueDescriptor__as_Message, 1}, {"EnumValueDescriptor__enum_type", (DL_FUNC) &EnumValueDescriptor__enum_type, 1}, {"EnumValueDescriptor__name", (DL_FUNC) &EnumValueDescriptor__name, 2}, {"EnumValueDescriptor__number", (DL_FUNC) &EnumValueDescriptor__number, 1}, {"FieldDescriptor__as_character", (DL_FUNC) &FieldDescriptor__as_character, 1}, {"FieldDescriptor__as_Message", (DL_FUNC) &FieldDescriptor__as_Message, 1}, {"FieldDescriptor__containing_type", (DL_FUNC) &FieldDescriptor__containing_type, 1}, {"FieldDescriptor__cpp_type", (DL_FUNC) &FieldDescriptor__cpp_type, 1}, {"FieldDescriptor__default_value", (DL_FUNC) &FieldDescriptor__default_value, 1}, {"FieldDescriptor__enum_type", (DL_FUNC) &FieldDescriptor__enum_type, 1}, {"FieldDescriptor__fileDescriptor", (DL_FUNC) &FieldDescriptor__fileDescriptor, 1}, {"FieldDescriptor__has_default_value", (DL_FUNC) &FieldDescriptor__has_default_value, 1}, {"FieldDescriptor__is_extension", (DL_FUNC) &FieldDescriptor__is_extension, 1}, {"FieldDescriptor__is_optional", (DL_FUNC) &FieldDescriptor__is_optional, 1}, {"FieldDescriptor__is_repeated", (DL_FUNC) &FieldDescriptor__is_repeated, 1}, {"FieldDescriptor__is_required", (DL_FUNC) &FieldDescriptor__is_required, 1}, {"FieldDescriptor__label", (DL_FUNC) &FieldDescriptor__label, 1}, {"FieldDescriptor__message_type", (DL_FUNC) &FieldDescriptor__message_type, 1}, {"FieldDescriptor__name", (DL_FUNC) &FieldDescriptor__name, 2}, {"FieldDescriptor__number", (DL_FUNC) &FieldDescriptor__number, 1}, {"FieldDescriptor__type", (DL_FUNC) &FieldDescriptor__type, 1}, {"FileDescriptor__as_character", (DL_FUNC) &FileDescriptor__as_character, 1}, {"FileDescriptor__as_list", (DL_FUNC) &FileDescriptor__as_list, 1}, {"FileDescriptor__as_Message", (DL_FUNC) &FileDescriptor__as_Message, 1}, {"FileDescriptor__getMemberNames", (DL_FUNC) &FileDescriptor__getMemberNames, 1}, {"FileDescriptor__name", (DL_FUNC) &FileDescriptor__name, 1}, {"FileInputStream_Close", (DL_FUNC) &FileInputStream_Close, 1}, {"FileInputStream_GetErrno", (DL_FUNC) &FileInputStream_GetErrno, 1}, {"FileInputStream_new", (DL_FUNC) &FileInputStream_new, 3}, {"FileInputStream_SetCloseOnDelete", (DL_FUNC) &FileInputStream_SetCloseOnDelete, 2}, {"FileOutputStream_Close", (DL_FUNC) &FileOutputStream_Close, 1}, {"FileOutputStream_Flush", (DL_FUNC) &FileOutputStream_Flush, 1}, {"FileOutputStream_GetErrno", (DL_FUNC) &FileOutputStream_GetErrno, 1}, {"FileOutputStream_new", (DL_FUNC) &FileOutputStream_new, 3}, {"FileOutputStream_SetCloseOnDelete", (DL_FUNC) &FileOutputStream_SetCloseOnDelete, 2}, /* {"get_method_input_type", (DL_FUNC) &get_method_input_type, 1},*/ {"get_method_output_prototype", (DL_FUNC) &get_method_output_prototype, 1}, {"get_protobuf_library_version", (DL_FUNC) &get_protobuf_library_version, 0}, {"get_value_of_enum", (DL_FUNC) &get_value_of_enum, 2}, {"getEnumDescriptor", (DL_FUNC) &getEnumDescriptor, 1}, {"getExtension_cpp", (DL_FUNC) &getExtension_cpp, 2}, {"getExtensionDescriptor", (DL_FUNC) &getExtensionDescriptor, 1}, {"getMessageField", (DL_FUNC) &getMessageField, 2}, {"getProtobufDescriptor", (DL_FUNC) &getProtobufDescriptor, 1}, {"has_enum_name", (DL_FUNC) &has_enum_name, 2}, {"identical_messages", (DL_FUNC) &identical_messages, 2}, {"Message__add_values", (DL_FUNC) &Message__add_values, 3}, {"Message__as_character", (DL_FUNC) &Message__as_character, 1}, {"Message__as_json", (DL_FUNC) &Message__as_json, 3}, {"Message__as_list", (DL_FUNC) &Message__as_list, 1}, {"Message__bytesize", (DL_FUNC) &Message__bytesize, 1}, {"Message__clear", (DL_FUNC) &Message__clear, 1}, {"Message__clear_field", (DL_FUNC) &Message__clear_field, 2}, {"Message__clone", (DL_FUNC) &Message__clone, 1}, /* {"Message__clone", (DL_FUNC) &Message__clone, 2},*/ {"Message__descriptor", (DL_FUNC) &Message__descriptor, 1}, {"Message__field_exists", (DL_FUNC) &Message__field_exists, 2}, {"Message__field_size", (DL_FUNC) &Message__field_size, 2}, {"Message__fieldNames", (DL_FUNC) &Message__fieldNames, 1}, {"Message__fileDescriptor", (DL_FUNC) &Message__fileDescriptor, 1}, {"Message__get_field_values", (DL_FUNC) &Message__get_field_values, 3}, {"Message__get_payload", (DL_FUNC) &Message__get_payload, 1}, {"Message__has_field", (DL_FUNC) &Message__has_field, 2}, {"Message__is_initialized", (DL_FUNC) &Message__is_initialized, 1}, {"Message__length", (DL_FUNC) &Message__length, 1}, {"Message__merge", (DL_FUNC) &Message__merge, 2}, {"Message__num_extensions", (DL_FUNC) &Message__num_extensions, 1}, {"Message__serialize_to_file", (DL_FUNC) &Message__serialize_to_file, 2}, {"Message__print_text_format", (DL_FUNC) &Message__print_text_format, 1}, {"Message__set_field_size", (DL_FUNC) &Message__set_field_size, 3}, {"Message__set_field_values", (DL_FUNC) &Message__set_field_values, 4}, {"Message__swap", (DL_FUNC) &Message__swap, 4}, {"MethodDescriptor__as_character", (DL_FUNC) &MethodDescriptor__as_character, 1}, {"MethodDescriptor__as_Message", (DL_FUNC) &MethodDescriptor__as_Message, 1}, {"MethodDescriptor__fileDescriptor", (DL_FUNC) &MethodDescriptor__fileDescriptor, 1}, {"MethodDescriptor__input_type", (DL_FUNC) &MethodDescriptor__input_type, 1}, {"MethodDescriptor__name", (DL_FUNC) &MethodDescriptor__name, 2}, {"MethodDescriptor__output_type", (DL_FUNC) &MethodDescriptor__output_type, 1}, {"newProtocolBufferLookup", (DL_FUNC) &newProtocolBufferLookup, 1}, {"newProtoMessage", (DL_FUNC) &newProtoMessage, 1}, {"readProtoFiles_cpp", (DL_FUNC) &readProtoFiles_cpp, 2}, {"resetDescriptorPool_cpp", (DL_FUNC) &resetDescriptorPool_cpp, 0}, {"ServiceDescriptor__as_character", (DL_FUNC) &ServiceDescriptor__as_character, 1}, {"ServiceDescriptor__as_list", (DL_FUNC) &ServiceDescriptor__as_list, 1}, {"ServiceDescriptor__as_Message", (DL_FUNC) &ServiceDescriptor__as_Message, 1}, {"ServiceDescriptor__fileDescriptor", (DL_FUNC) &ServiceDescriptor__fileDescriptor, 1}, {"ServiceDescriptor__getMethodNames", (DL_FUNC) &ServiceDescriptor__getMethodNames, 1}, {"ServiceDescriptor__name", (DL_FUNC) &ServiceDescriptor__name, 2}, /* {"ServiceDescriptor_method_count", (DL_FUNC) &ServiceDescriptor_method_count, 1},*/ {"setMessageField", (DL_FUNC) &setMessageField, 3}, {"update_message", (DL_FUNC) &update_message, 2}, {"valid_input_message", (DL_FUNC) &valid_input_message, 2}, {"valid_output_message", (DL_FUNC) &valid_output_message, 2}, {"ZeroCopyInputStream_BackUp", (DL_FUNC) &ZeroCopyInputStream_BackUp, 2}, {"ZeroCopyInputStream_ByteCount", (DL_FUNC) &ZeroCopyInputStream_ByteCount, 1}, {"ZeroCopyInputStream_Next", (DL_FUNC) &ZeroCopyInputStream_Next, 1}, {"ZeroCopyInputStream_ReadLittleEndian32", (DL_FUNC) &ZeroCopyInputStream_ReadLittleEndian32, 1}, {"ZeroCopyInputStream_ReadLittleEndian64", (DL_FUNC) &ZeroCopyInputStream_ReadLittleEndian64, 1}, {"ZeroCopyInputStream_ReadRaw", (DL_FUNC) &ZeroCopyInputStream_ReadRaw, 2}, {"ZeroCopyInputStream_ReadString", (DL_FUNC) &ZeroCopyInputStream_ReadString, 2}, {"ZeroCopyInputStream_ReadVarint32", (DL_FUNC) &ZeroCopyInputStream_ReadVarint32, 1}, {"ZeroCopyInputStream_ReadVarint64", (DL_FUNC) &ZeroCopyInputStream_ReadVarint64, 1}, {"ZeroCopyInputStream_Skip", (DL_FUNC) &ZeroCopyInputStream_Skip, 2}, {"ZeroCopyOutputStream_BackUp", (DL_FUNC) &ZeroCopyOutputStream_BackUp, 2}, {"ZeroCopyOutputStream_ByteCount", (DL_FUNC) &ZeroCopyOutputStream_ByteCount, 1}, {"ZeroCopyOutputStream_Next", (DL_FUNC) &ZeroCopyOutputStream_Next, 2}, {"ZeroCopyOutputStream_WriteLittleEndian32", (DL_FUNC) &ZeroCopyOutputStream_WriteLittleEndian32, 2}, {"ZeroCopyOutputStream_WriteLittleEndian64", (DL_FUNC) &ZeroCopyOutputStream_WriteLittleEndian64, 2}, {"ZeroCopyOutputStream_WriteRaw", (DL_FUNC) &ZeroCopyOutputStream_WriteRaw, 2}, {"ZeroCopyOutputStream_WriteString", (DL_FUNC) &ZeroCopyOutputStream_WriteString, 2}, {"ZeroCopyOutputStream_WriteVarint32", (DL_FUNC) &ZeroCopyOutputStream_WriteVarint32, 2}, {"ZeroCopyOutputStream_WriteVarint64", (DL_FUNC) &ZeroCopyOutputStream_WriteVarint64, 2}, {NULL, NULL, 0} }; void R_init_RProtoBuf(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } void R_unload_RProtoBuf(DllInfo* dll) { resetDescriptorPool_cpp(); } RProtoBuf/src/ConnectionInputStream.h0000644000176200001440000000054712440004312017363 0ustar liggesusers#ifndef RPROTOBUF_ConnectionInputStream_H #define RPROTOBUF_ConnectionInputStream_H namespace rprotobuf { class ConnectionInputStream : public GPB::io::CopyingInputStreamAdaptor { public: ConnectionInputStream(SEXP con, bool was_open); ~ConnectionInputStream(); private: bool was_open; SEXP con; }; } // namespace rprotobuf #endif RProtoBuf/src/RcppMacros.h0000644000176200001440000002007113776225671015165 0ustar liggesusers/* * Copyright 2013 Google Inc. All Rights Reserved. * Author: Murray Stokely * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ /* * This file contains macros for taking C++ functions that expect * native C++ types, automatically generating new stub functions that * take SEXPs and call the appropriate Rcpp conversion functions * before calling the original function. It is based on slightly more * complex macros that were originally in Rcpp but have been * deprecated. * * In the future, Rcpp Modules would likely be a better more modern * way to implement RProtoBuf. */ #ifndef RPROTOBUF_RCPP_MACROS_H #define RPROTOBUF_RCPP_MACROS_H #include // RCPP_DECORATE, BEGIN_RCPP, END_RCPP #define RPB_FUNCTION_0(__OUT__,__NAME__) \ __OUT__ RCPP_DECORATE(__NAME__)(); \ extern "C" SEXP __NAME__(){ \ SEXP res = R_NilValue ; \ BEGIN_RCPP \ res = ::Rcpp::wrap( RCPP_DECORATE(__NAME__)() ) ; \ return res ; \ END_RCPP \ } \ __OUT__ RCPP_DECORATE(__NAME__)() #define RPB_FUNCTION_1(__OUT__,__NAME__, ___0) \ __OUT__ RCPP_DECORATE(__NAME__)(___0); \ extern "C" SEXP __NAME__(SEXP x0){ \ SEXP res = R_NilValue ; \ BEGIN_RCPP \ res = ::Rcpp::wrap( RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 )) ) ; \ return res ; \ END_RCPP \ } \ __OUT__ RCPP_DECORATE(__NAME__)(___0) #define RPB_FUNCTION_2(__OUT__,__NAME__, ___0, ___1) \ __OUT__ RCPP_DECORATE(__NAME__)(___0, ___1); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1){ \ SEXP res = R_NilValue ; \ BEGIN_RCPP \ res = ::Rcpp::wrap( RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 )) ) ; \ return res ; \ END_RCPP \ } \ __OUT__ RCPP_DECORATE(__NAME__)(___0, ___1) #define RPB_FUNCTION_3(__OUT__,__NAME__, ___0, ___1, ___2) \ __OUT__ RCPP_DECORATE(__NAME__)(___0, ___1, ___2); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1, SEXP x2){ \ SEXP res = R_NilValue ; \ BEGIN_RCPP \ res = ::Rcpp::wrap( RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 ), ::Rcpp::internal::converter( x2 )) ) ; \ return res ; \ END_RCPP \ } \ __OUT__ RCPP_DECORATE(__NAME__)(___0, ___1, ___2) #define RPB_FUNCTION_VOID_1(__NAME__, ___0) \ void RCPP_DECORATE(__NAME__)(___0); \ extern "C" SEXP __NAME__(SEXP x0){ \ BEGIN_RCPP \ RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 )); \ END_RCPP \ } \ void RCPP_DECORATE(__NAME__)(___0) #define RPB_FUNCTION_VOID_2(__NAME__, ___0, ___1) \ void RCPP_DECORATE(__NAME__)(___0, ___1); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1){ \ BEGIN_RCPP \ RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 )); \ END_RCPP \ } \ void RCPP_DECORATE(__NAME__)(___0, ___1) #define RPB_FUNCTION_VOID_3(__NAME__, ___0, ___1, ___2) \ void RCPP_DECORATE(__NAME__)(___0, ___1, ___2); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1, SEXP x2){ \ BEGIN_RCPP \ RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 ), ::Rcpp::internal::converter( x2 )); \ END_RCPP \ } \ void RCPP_DECORATE(__NAME__)(___0, ___1, ___2) #define RPB_FUNCTION_VOID_4(__NAME__, ___0, ___1, ___2, ___3) \ void RCPP_DECORATE(__NAME__)(___0, ___1, ___2, ___3); \ extern "C" SEXP __NAME__(SEXP x0, SEXP x1, SEXP x2, SEXP x3){ \ BEGIN_RCPP \ RCPP_DECORATE(__NAME__)(::Rcpp::internal::converter( x0 ), ::Rcpp::internal::converter( x1 ), ::Rcpp::internal::converter( x2 ), ::Rcpp::internal::converter( x3 )); \ END_RCPP \ } \ void RCPP_DECORATE(__NAME__)(___0, ___1, ___2, ___3) #define RPB_XP_METHOD_0(__NAME__,__CLASS__,__METHOD__ ) \ extern "C" SEXP __NAME__( SEXP xp ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ return ::Rcpp::wrap( ptr->__METHOD__( ) ) ; \ END_RCPP \ } #define RPB_XP_METHOD_VOID_0(__NAME__,__CLASS__,__METHOD__) \ extern "C" SEXP __NAME__( SEXP xp ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ ptr->__METHOD__( ) ; \ END_RCPP \ } #define RPB_XP_METHOD_CAST_0(__NAME__,__CLASS__,__METHOD__,__CAST__) \ extern "C" SEXP __NAME__( SEXP xp ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ return ::Rcpp::wrap( __CAST__( ptr->__METHOD__( ) ) ) ; \ END_RCPP \ } #define RPB_XP_METHOD_CAST_1(__NAME__,__CLASS__,__METHOD__,__CAST__) \ extern "C" SEXP __NAME__( SEXP xp , SEXP x0 ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ return ::Rcpp::wrap( __CAST__( ptr->__METHOD__( ::Rcpp::internal::converter( x0 ) ) ) ) ; \ END_RCPP \ } /* We need a special case macro for methods taking a std::string_view, because * Rcpp::internal::converter will not automatically convert to that type. */ #define RPB_XP_METHOD_CAST_1_STRING(__NAME__,__CLASS__,__METHOD__,__CAST__) \ extern "C" SEXP __NAME__( SEXP xp , SEXP x0 ){ \ BEGIN_RCPP \ ::Rcpp::XPtr< __CLASS__ > ptr(xp) ; \ return ::Rcpp::wrap( __CAST__( ptr->__METHOD__( \ static_cast( ::Rcpp::internal::converter( x0 ) ) ) ) ) ; \ END_RCPP \ } #endif RProtoBuf/src/wrapper_ArrayInputStream.cpp0000644000176200001440000000055112440004312020430 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { RPB_FUNCTION_2(S4_ArrayInputStream, ArrayInputStream__new, Rcpp::RawVector payload, int block_size) { return S4_ArrayInputStream(payload, block_size); } } RProtoBuf/src/RSourceTree.cpp0000644000176200001440000000511314535111776015643 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RSourceTree.h" namespace rprotobuf { RSourceTree::RSourceTree() : directories() {} #if GOOGLE_PROTOBUF_VERSION < 4022000 GPB::io::ZeroCopyInputStream* RSourceTree::Open(const std::string& filename) { /* first, try to open the file as it is */ int file_descriptor = open(filename.c_str(), O_RDONLY); if (file_descriptor < 0) { /* then try the directories */ std::set::iterator it; it = directories.begin(); std::string file; while (it != directories.end()) { file = *it; file += "/"; file += filename; file_descriptor = open(file.c_str(), O_RDONLY); if (file_descriptor > 0) break; ++it; } } if (file_descriptor < 0) { return NULL; } GPB::io::FileInputStream* result = new GPB::io::FileInputStream(file_descriptor); result->SetCloseOnDelete(true); return result; } #else GPB::io::ZeroCopyInputStream* RSourceTree::Open(absl::string_view filename) { /* first, try to open the file as it is */ int file_descriptor = open(static_cast(filename).c_str(), O_RDONLY); if (file_descriptor < 0) { /* then try the directories */ std::set::iterator it; it = directories.begin(); std::string file; while (it != directories.end()) { file = *it; file += "/"; file += static_cast(filename); file_descriptor = open(file.c_str(), O_RDONLY); if (file_descriptor > 0) break; ++it; } } if (file_descriptor < 0) { return NULL; } GPB::io::FileInputStream* result = new GPB::io::FileInputStream(file_descriptor); result->SetCloseOnDelete(true); return result; } #endif void RSourceTree::addDirectory(const std::string& directory) { directories.insert(directory); } void RSourceTree::addDirectories(SEXP dirs) { int n = LENGTH(dirs); for (int i = 0; i < n; i++) { directories.insert(std::string(CHAR(STRING_ELT(dirs, i)))); } } void RSourceTree::removeDirectory(const std::string& directory) { directories.erase(directory); } void RSourceTree::removeDirectories(SEXP dirs) { int n = LENGTH(dirs); for (int i = 0; i < n; i++) { directories.erase(std::string(CHAR(STRING_ELT(dirs, i)))); } } void RSourceTree::removeAllDirectories() { directories.clear(); } } // namespace rprotobuf RProtoBuf/src/rprotobuf.cpp0000644000176200001440000002063414765625253015475 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "DescriptorPoolLookup.h" #include "RcppMacros.h" namespace rprotobuf { GPB::Message* PROTOTYPE(const GPB::Descriptor* desc) { RPB_DEBUG_BEGIN("PROTOTYPE") #ifdef RPB_DEBUG Rprintf("desc = %d\n", desc); #endif /* first try the runtime factory */ GPB::Message* m = (GPB::Message*)((GPB::DynamicMessageFactory*)DescriptorPoolLookup::factory()) ->GetPrototype(desc) ->New(); #ifdef RPB_DEBUG Rprintf("generated factory = %d\n", m); #endif if (!m) { /* then the dynamic runtime factory */ m = (GPB::Message*)GPB::MessageFactory::generated_factory()->GetPrototype(desc)->New(); #ifdef RPB_DEBUG Rprintf("runtime factory = %d\n", m); #endif } RPB_DEBUG_END("PROTOTYPE") return m; } GPB::Message* CLONE(const GPB::Message* origin) { RPB_DEBUG_BEGIN("CLONE") const GPB::Descriptor* desc = origin->GetDescriptor(); GPB::Message* sheep = PROTOTYPE(desc); sheep->CopyFrom(*origin); RPB_DEBUG_END("CLONE") return sheep; } /** * read a proto file and cache the message definitions it contains * * @param file proto file name */ RcppExport SEXP readProtoFiles_cpp(SEXP file, SEXP dirs) { BEGIN_RCPP DescriptorPoolLookup::importProtoFiles(file, dirs); return R_NilValue; END_RCPP } /** * reset the descriptor pool, clearing all persisted state */ RcppExport SEXP resetDescriptorPool_cpp() { BEGIN_RCPP DescriptorPoolLookup::reset(); return R_NilValue; END_RCPP } /** * get the descriptor associated with a message type * * @param type message type * * @return an S4 object of class Descriptor, or NULL if the type * is unknown */ RcppExport SEXP getProtobufDescriptor(SEXP type) { #ifdef RPB_DEBUG Rprintf("\n type = "); Rf_PrintValue(type); #endif const char* typeName = CHAR(STRING_ELT(type, 0)); /* first try the generated pool */ const GPB::DescriptorPool* pool = GPB::DescriptorPool::generated_pool(); const GPB::Descriptor* desc = pool->FindMessageTypeByName(typeName); if (!desc) { /* then try the "runtime" pool" */ pool = DescriptorPoolLookup::pool(); desc = pool->FindMessageTypeByName(typeName); if (!desc) { /* unlucky */ return R_NilValue; } } return (S4_Descriptor(desc)); } /** * get the descriptor associated with an extension * * @param type message type * * @return an S4 object of class FieldDescriptor, or NULL if the type * is unknown */ RcppExport SEXP getExtensionDescriptor(SEXP type) { #ifdef RPB_DEBUG Rprintf("\n type = "); Rf_PrintValue(type); #endif const char* typeName = CHAR(STRING_ELT(type, 0)); /* first try the generated pool */ const GPB::DescriptorPool* pool = GPB::DescriptorPool::generated_pool(); const GPB::FieldDescriptor* desc = pool->FindExtensionByName(typeName); if (!desc) { /* then try the "runtime" pool" */ pool = DescriptorPoolLookup::pool(); desc = pool->FindExtensionByName(typeName); if (!desc) { /* unlucky */ return R_NilValue; } } return (S4_FieldDescriptor(desc)); } /** * get the descriptor associated with an enum * * @param type message type * * @return an S4 object of class EnumDescriptor, or NULL if the type * is unknown */ RcppExport SEXP getEnumDescriptor(SEXP type) { #ifdef RPB_DEBUG Rprintf("\n type = "); Rf_PrintValue(type); #endif const char* typeName = CHAR(STRING_ELT(type, 0)); /* first try the generated pool */ const GPB::DescriptorPool* pool = GPB::DescriptorPool::generated_pool(); const GPB::EnumDescriptor* desc = pool->FindEnumTypeByName(typeName); if (!desc) { /* then try the "runtime" pool" */ pool = DescriptorPoolLookup::pool(); desc = pool->FindEnumTypeByName(typeName); if (!desc) { /* unlucky */ return R_NilValue; } } return (S4_EnumDescriptor(desc)); } /** * make a new protobuf message * * @param descriptor a "Descriptor" R object */ SEXP newProtoMessage(SEXP descriptor) { BEGIN_RCPP RPB_DEBUG_BEGIN("newProtoMessage") #ifdef RPB_DEBUG /* FIXME: the message type, we don't really need that*/ SEXP type = GET_SLOT(descriptor, Rf_install("type")); #endif /* the pointer to the c++ descriptor object */ GPB::Descriptor* desc = GET_DESCRIPTOR_POINTER_FROM_S4(descriptor); #ifdef RPB_DEBUG Rprintf("desc = %d\n", desc); PRINT_DEBUG_INFO("type", type); #endif /* grab the Message from the factory */ const GPB::Message* message = PROTOTYPE(desc); if (!message) { Rcpp_error("could not call factory->GetPrototype(desc)->New()"); } RPB_DEBUG_END("newProtoMessage") return (S4_Message(message)); END_RCPP } /** * dollar extractor for Descriptor objects * it may return a Field descriptor or a nested type descriptor * * @param pointer external pointer to a google::protobuf::Descriptor object * @param name name of the thing to extract */ RcppExport SEXP do_dollar_Descriptor(SEXP pointer, SEXP name) { const char* what = CHAR(STRING_ELT(name, 0)); GPB::Descriptor* desc = (GPB::Descriptor*)R_ExternalPtrAddr(pointer); // trying fields first : if (desc->field_count()) { const GPB::FieldDescriptor* fd = desc->FindFieldByName(what); if (fd) { return (S4_FieldDescriptor(fd)); } } // now trying nested types if (desc->nested_type_count()) { const GPB::Descriptor* d = desc->FindNestedTypeByName(what); if (d) { return (S4_Descriptor(d)); } } // now for enum types if (desc->enum_type_count()) { const GPB::EnumDescriptor* ed = desc->FindEnumTypeByName(what); if (ed) { return (S4_EnumDescriptor(ed)); } } // TODO: extensions (later) // give up // TODO: should this be unbound instead return (R_NilValue); } /** * * @param m potentially a message * @param target the expected type * * @return TRUE if m is a a message of the given type */ Rboolean isMessage(SEXP m, std::string_view target) { RPB_DEBUG_BEGIN("isMessage") if (TYPEOF(m) != S4SXP || !Rf_inherits(m, "Message")) return _FALSE_; GPB::Message* message = (GPB::Message*)R_ExternalPtrAddr(GET_SLOT(m, Rf_install("pointer"))); std::string_view type = message->GetDescriptor()->full_name(); RPB_DEBUG_END("isMessage") if (type != target) { return _FALSE_; } return _TRUE_; } RcppExport GPB::FieldDescriptor* getFieldDescriptor(const GPB::Message* message, SEXP name) { GPB::FieldDescriptor* field_desc = (GPB::FieldDescriptor*)0; BEGIN_RCPP const GPB::Descriptor* desc = message->GetDescriptor(); std::string error_message = "could not get FieldDescriptor for field"; switch (TYPEOF(name)) { case S4SXP: { if (Rf_inherits(name, "FieldDescriptor")) { field_desc = GET_FIELD_DESCRIPTOR_POINTER_FROM_S4(name); } else { Rcpp::stop("S4 class is not a FieldDescriptor"); } break; } case CHARSXP: { field_desc = (GPB::FieldDescriptor*)desc->FindFieldByName(CHAR(name)); error_message = error_message + " '" + CHAR(name) + "'"; break; } case STRSXP: { field_desc = (GPB::FieldDescriptor*)desc->FindFieldByName(CHAR(STRING_ELT(name, 0))); error_message = error_message + " '" + CHAR(STRING_ELT(name, 0)) + "'"; break; } case REALSXP: case INTSXP: { field_desc = (GPB::FieldDescriptor*)desc->FindFieldByNumber(Rcpp::as(name)); break; } } if (!field_desc) { Rcpp::stop(error_message.c_str()); } return field_desc; VOID_END_RCPP return field_desc; } RPB_FUNCTION_VOID_1(check_libprotobuf_version, int minversion) { if (GOOGLE_PROTOBUF_VERSION < minversion) { throw std::range_error( "The protobuf library you are using is too old for this package, " "please upgrade"); } } RPB_FUNCTION_0(int, get_protobuf_library_version) { return GOOGLE_PROTOBUF_VERSION; } } // namespace rprotobuf RProtoBuf/src/Makevars.in0000644000176200001440000000032615130725616015033 0ustar liggesusers## -*- mode: makefile; -*- ## Configure tells us about locations for ## both Rcpp (ie libRcpp.so and Rcpp.h) and ## ProtoBuf headers and library via these variables PKG_CPPFLAGS=@PKG_CPPFLAGS@ PKG_LIBS=@PKG_LIBS@ RProtoBuf/src/RSourceTree.h0000644000176200001440000000125714535111776015315 0ustar liggesusers#ifndef RPROTOBUF_RSourceTree_H #define RPROTOBUF_RSourceTree_H namespace rprotobuf { class RSourceTree : public GPB::compiler::SourceTree { public: RSourceTree(); #if GOOGLE_PROTOBUF_VERSION < 4022000 GPB::io::ZeroCopyInputStream* Open(const std::string& filename); #else GPB::io::ZeroCopyInputStream* Open(absl::string_view filename); #endif void addDirectory(const std::string& directory); void addDirectories(SEXP dirs); void removeDirectory(const std::string& directory); void removeDirectories(SEXP dirs); void removeAllDirectories(); private: std::set directories; }; } // namespace rprotobuf #endif RProtoBuf/src/ZeroCopyInputStreamWrapper.cpp0000644000176200001440000000136112440004312020725 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" namespace rprotobuf { ZeroCopyInputStreamWrapper::ZeroCopyInputStreamWrapper(GPB::io::ZeroCopyInputStream* stream) : stream(stream) { coded_stream = new GPB::io::CodedInputStream(stream); } ZeroCopyInputStreamWrapper::~ZeroCopyInputStreamWrapper() { try { /* first clear the coded stream */ delete coded_stream; /* then the stream itself */ delete stream; } catch (...) { } } GPB::io::ZeroCopyInputStream* ZeroCopyInputStreamWrapper::get_stream() { return stream; } GPB::io::CodedInputStream* ZeroCopyInputStreamWrapper::get_coded_stream() { return coded_stream; } } // namespace rprotobuf RProtoBuf/src/wrapper_MethodDescriptor.cpp0000644000176200001440000000367014752644073020470 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(MethodDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::MethodDescriptor, DebugString) RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::MethodDescriptorProto* message = new GPB::MethodDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->service()->file()); } RPB_FUNCTION_1(S4_Descriptor, METHOD(input_type), Rcpp::XPtr method) { return method->input_type(); } RPB_FUNCTION_1(S4_Descriptor, METHOD(output_type), Rcpp::XPtr method) { return method->output_type(); } RPB_FUNCTION_1(S4_Message, get_method_input_prototype, Rcpp::XPtr method) { const GPB::Descriptor* desc = method->input_type(); return S4_Message(PROTOTYPE(desc)); } RPB_FUNCTION_1(S4_Message, get_method_output_prototype, Rcpp::XPtr method) { const GPB::Descriptor* desc = method->output_type(); return S4_Message(PROTOTYPE(desc)); } RPB_FUNCTION_2(bool, valid_input_message, Rcpp::XPtr method, Rcpp::XPtr message) { return message->GetDescriptor() == method->input_type(); } RPB_FUNCTION_2(bool, valid_output_message, Rcpp::XPtr method, Rcpp::XPtr message) { return message->GetDescriptor() == method->output_type(); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return std::string(full ? d->full_name() : d->name()); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/ConnectionCopyingOutputStream.h0000644000176200001440000000124012440004312021104 0ustar liggesusers#ifndef RPROTOBUF_ConnectionCopyingOutputStream_H #define RPROTOBUF_ConnectionCopyingOutputStream_H namespace rprotobuf { class ConnectionCopyingOutputStream : public GPB::io::CopyingOutputStream { public: ConnectionCopyingOutputStream(SEXP con); bool Write(const void* buffer, int size); private: /* the actual connection object from R it is protected by the external pointer that wraps the ConnectionInputStream, which is the only thing that uses this class, so we don't need to take care of GC here */ SEXP con; Rcpp::Function writeBin; }; } // namespace rprotobuf #endif RProtoBuf/src/ConnectionInputStream.cpp0000644000176200001440000000164412440004312017715 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionInputStream.h" #include "ConnectionCopyingInputStream.h" namespace rprotobuf { ConnectionInputStream::ConnectionInputStream(SEXP con, bool was_open) : GPB::io::CopyingInputStreamAdaptor(new ConnectionCopyingInputStream(con)), was_open(was_open), con(con) { /* clean the wrapped stream on delete */ SetOwnsCopyingStream(true); } ConnectionInputStream::~ConnectionInputStream() { if (!was_open) { /* then we need to close it */ SEXP call = PROTECT(Rf_lang2(Rf_install("close"), con)); Rf_eval(call, R_GlobalEnv); UNPROTECT(1); /* call */ } /* con will be disposed by the R GC, it is protected as part of the protection of the external pointer that wraps this */ } } // namespace rprotobuf RProtoBuf/src/RconnectionCopyingInputStream.cpp0000644000176200001440000000217212440004312021425 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RconnectionCopyingInputStream.h" namespace rprotobuf { /* N.B. connection must be opened in binary mode due to call * to readBin below. */ RconnectionCopyingInputStream::RconnectionCopyingInputStream(int id) : connection_id(id), failure(false) {} /** * call readBin to read size bytes from R * * @param buffer buffer to fill with at most size bytes * @param size maximum number of bytes * * @return the number of bytes actually read */ int RconnectionCopyingInputStream::Read(void* buffer, int size) { Rcpp::Language call("readBin", connection_id, Rcpp::RawVector(0), size); Rcpp::RawVector res; try { res = call.eval(); } catch (...) { /* Failed to read anything from the connection, * could have been permissions, or connection opened * in the wrong type, etc. */ failure = true; return -1; } int len = res.size(); memcpy(buffer, reinterpret_cast(res.begin()), len); return len; } } RProtoBuf/src/S4_classes.h0000644000176200001440000001704113144557350015111 0ustar liggesusers// S4_classes.h: R/C++ interface class library // // Copyright (C) 2010 - 2017 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #ifndef RPROTOBUF_S4CLASSES_H #define RPROTOBUF_S4CLASSES_H //1. Place using Rcpp::S4; somewhere in the top of S4_classes.h in the //src directory (so S4 is looked up in the right place), //2. Replace setSEXP with set__, and asSexp with get__. namespace rprotobuf { // deal with Rcpp API changes #if defined(RCPP_VERSION) && RCPP_VERSION <= Rcpp_Version(0,10,6) #define SetSexp setSEXP #define AsSexp asSexp #else #define SetSexp set__ #define AsSexp get__ #endif using Rcpp::S4; class ZeroCopyInputStreamWrapper; class ZeroCopyOutputStreamWrapper; class S4_EnumValueDescriptor : public Rcpp::S4 { public: S4_EnumValueDescriptor(const GPB::EnumValueDescriptor* d) : S4("EnumValueDescriptor") { slot("pointer") = Rcpp::XPtr( const_cast(d), false); if (d) { slot("name") = d->name(); slot("full_name") = d->full_name(); } else { slot("name") = Rcpp::StringVector(0); slot("full_name") = Rcpp::StringVector(0); } } S4_EnumValueDescriptor(const S4_EnumValueDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_EnumValueDescriptor& operator=(const S4_EnumValueDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_Descriptor : public Rcpp::S4 { public: S4_Descriptor(const GPB::Descriptor* d) : S4("Descriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); if (!d) { slot("type") = Rcpp::StringVector(0); } else { slot("type") = d->full_name(); } } S4_Descriptor(const S4_Descriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_Descriptor& operator=(const S4_Descriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_FileDescriptor : public Rcpp::S4 { public: S4_FileDescriptor(const GPB::FileDescriptor* d) : S4("FileDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); if (!d) { slot("package") = Rcpp::StringVector(0); slot("filename") = Rcpp::StringVector(0); } else { slot("package") = d->package(); slot("filename") = d->name(); } } S4_FileDescriptor(const S4_FileDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_FileDescriptor& operator=(const S4_FileDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_FieldDescriptor : public Rcpp::S4 { public: S4_FieldDescriptor(const GPB::FieldDescriptor* d) : S4("FieldDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); slot("name") = d->name(); slot("full_name") = d->full_name(); slot("type") = d->containing_type()->full_name(); } S4_FieldDescriptor(const S4_FieldDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_FieldDescriptor& operator=(const S4_FieldDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_ServiceDescriptor : public Rcpp::S4 { public: S4_ServiceDescriptor(const GPB::ServiceDescriptor* d) : S4("ServiceDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); } S4_ServiceDescriptor(const S4_ServiceDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_ServiceDescriptor& operator=(const S4_ServiceDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_MethodDescriptor : public Rcpp::S4 { public: S4_MethodDescriptor(const GPB::MethodDescriptor* d) : S4("MethodDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); } S4_MethodDescriptor(const S4_MethodDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_MethodDescriptor& operator=(const S4_MethodDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_EnumDescriptor : public Rcpp::S4 { public: S4_EnumDescriptor(const GPB::EnumDescriptor* d) : S4("EnumDescriptor") { slot("pointer") = Rcpp::XPtr(const_cast(d), false); slot("type") = Rcpp::StringVector(0); if (d) { slot("name") = d->name(); slot("full_name") = d->full_name(); const GPB::Descriptor* type_desc = d->containing_type(); if (type_desc) { slot("type") = type_desc->full_name(); } } else { slot("name") = Rcpp::StringVector(0); slot("full_name") = Rcpp::StringVector(0); } } S4_EnumDescriptor(const S4_EnumDescriptor& other) : S4() { SetSexp(other.AsSexp()); } S4_EnumDescriptor& operator=(const S4_EnumDescriptor& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_Message : public Rcpp::S4 { public: S4_Message(const GPB::Message* d) : S4("Message") { slot("pointer") = Rcpp::XPtr(const_cast(d), true); slot("type") = d->GetDescriptor()->full_name(); } S4_Message(const S4_Message& other) : S4() { SetSexp(other.AsSexp()); } S4_Message& operator=(const S4_Message& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_ArrayOutputStream : public Rcpp::S4 { public: S4_ArrayOutputStream(int size, int block_size) : S4("ArrayOutputStream") { Rcpp::RawVector payload(size); GPB::io::ArrayOutputStream* stream = new GPB::io::ArrayOutputStream(payload.begin(), size, block_size); Rcpp::XPtr wrapper(new ZeroCopyOutputStreamWrapper(stream), true, R_NilValue, payload); slot("pointer") = wrapper; } S4_ArrayOutputStream(const S4_ArrayOutputStream& other) : S4(other) { SetSexp(other.AsSexp()); } S4_ArrayOutputStream& operator=(const S4_ArrayOutputStream& other) { SetSexp(other.AsSexp()); return *this; } }; class S4_ArrayInputStream : public Rcpp::S4 { public: S4_ArrayInputStream(Rcpp::RawVector payload, int block_size) : S4("ArrayInputStream") { GPB::io::ArrayInputStream* stream = new GPB::io::ArrayInputStream(payload.begin(), payload.size(), block_size); Rcpp::XPtr wrapper( new ZeroCopyInputStreamWrapper(stream), true, R_NilValue, payload); slot("pointer") = wrapper; } }; #undef SetSexp #undef AsSexp } // namespace rprotobuf #endif RProtoBuf/src/ConnectionOutputStream.h0000644000176200001440000000055512440004312017563 0ustar liggesusers#ifndef RPROTOBUF_ConnectionOutputStream_H #define RPROTOBUF_ConnectionOutputStream_H namespace rprotobuf { class ConnectionOutputStream : public GPB::io::CopyingOutputStreamAdaptor { public: ConnectionOutputStream(SEXP con, bool was_open); ~ConnectionOutputStream(); private: bool was_open; SEXP con; }; } // namespace rprotobuf #endif RProtoBuf/src/fieldtypes.h0000644000176200001440000000307512440004312015237 0ustar liggesusers#ifndef FIELD_TYPES_H #define FIELD_TYPES_H using namespace google::protobuf; #define TYPE_DOUBLE FieldDescriptor::TYPE_DOUBLE #define TYPE_FLOAT FieldDescriptor::TYPE_FLOAT #define TYPE_INT64 FieldDescriptor::TYPE_INT64 #define TYPE_UINT64 FieldDescriptor::TYPE_UINT64 #define TYPE_INT32 FieldDescriptor::TYPE_INT32 #define TYPE_FIXED64 FieldDescriptor::TYPE_FIXED64 #define TYPE_FIXED32 FieldDescriptor::TYPE_FIXED32 #define TYPE_BOOL FieldDescriptor::TYPE_BOOL #define TYPE_STRING FieldDescriptor::TYPE_STRING #define TYPE_GROUP FieldDescriptor::TYPE_GROUP #define TYPE_MESSAGE FieldDescriptor::TYPE_MESSAGE #define TYPE_BYTES FieldDescriptor::TYPE_BYTES #define TYPE_UINT32 FieldDescriptor::TYPE_UINT32 #define TYPE_ENUM FieldDescriptor::TYPE_ENUM #define TYPE_SFIXED32 FieldDescriptor::TYPE_SFIXED32 #define TYPE_SFIXED64 FieldDescriptor::TYPE_SFIXED64 #define TYPE_SINT32 FieldDescriptor::TYPE_SINT32 #define TYPE_SINT64 FieldDescriptor::TYPE_SINT64 #define MAX_TYPE FieldDescriptor::MAX_TYPE #define CPPTYPE_INT32 FieldDescriptor::CPPTYPE_INT32 #define CPPTYPE_INT64 FieldDescriptor::CPPTYPE_INT64 #define CPPTYPE_UINT32 FieldDescriptor::CPPTYPE_UINT32 #define CPPTYPE_UINT64 FieldDescriptor::CPPTYPE_UINT64 #define CPPTYPE_DOUBLE FieldDescriptor::CPPTYPE_DOUBLE #define CPPTYPE_FLOAT FieldDescriptor::CPPTYPE_FLOAT #define CPPTYPE_BOOL FieldDescriptor::CPPTYPE_BOOL #define CPPTYPE_ENUM FieldDescriptor::CPPTYPE_ENUM #define CPPTYPE_STRING FieldDescriptor::CPPTYPE_STRING #define CPPTYPE_MESSAGE FieldDescriptor::CPPTYPE_MESSAGE #define MAX_CPPTYPE FieldDescriptor::MAX_CPPTYPE #endif RProtoBuf/src/mutators.cpp0000644000176200001440000012531114765625364015332 0ustar liggesusers // Copyright (C) 2010 - 2022 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "fieldtypes.h" #include "RcppMacros.h" namespace rprotobuf { // {{{ GETDOUBLE /** * get the index'th value of x, as an double * * @param x some R data * @param index the index * @return x[index], as an double * @throws Rcpp::exception if x[index] cannot be converted to double */ /* FIXME: should we convert the NA's */ double GET_double(SEXP x, int index) { switch (TYPEOF(x)) { case INTSXP: return ((double)INTEGER(x)[index]); case REALSXP: return (REAL(x)[index]); case LGLSXP: return ((double)LOGICAL(x)[index]); case RAWSXP: return ((double)RAW(x)[index]); default: Rcpp::stop("cannot cast SEXP to double"); } return 0.0; // -Wall } // }}} float GET_float(SEXP x, int index) { switch (TYPEOF(x)) { case INTSXP: return ((float)INTEGER(x)[index]); case REALSXP: return ((float)REAL(x)[index]); case LGLSXP: return ((float)LOGICAL(x)[index]); case RAWSXP: return ((float)RAW(x)[index]); default: Rcpp::stop("cannot cast SEXP to double"); } return (float)0.0; // -Wall } int GET_int(SEXP x, int index) { switch (TYPEOF(x)) { case INTSXP: return (INTEGER(x)[index]); case REALSXP: return ((int)REAL(x)[index]); case LGLSXP: return ((int)LOGICAL(x)[index]); case RAWSXP: return ((int)RAW(x)[index]); default: Rcpp::stop("cannot cast SEXP to int"); } return 0; // -Wall, should not happen since we only call this when we know it works } template ValueType Int64FromString(const std::string& value) { std::stringstream ss(value); ValueType ret; if ((ss >> ret).fail() || !(ss >> std::ws).eof()) { std::string message = "Provided character value '" + value + "' cannot be cast to 64-bit integer."; Rcpp::stop(message.c_str()); } return ret; } template ValueType Int32FromString(const std::string& value) { std::stringstream ss(value); ValueType ret; if ((ss >> ret).fail() || !(ss >> std::ws).eof()) { std::string message = "Provided character value '" + value + "' cannot be cast to 32-bit integer."; Rcpp::stop(message.c_str()); } return ret; } int32 GET_int32(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: return ((int32)INTEGER(x)[vec_index]); case REALSXP: return ((int32)REAL(x)[vec_index]); case LGLSXP: return ((int32)LOGICAL(x)[vec_index]); case RAWSXP: return ((int32)RAW(x)[vec_index]); case STRSXP: return Int32FromString(CHAR(STRING_ELT(x, vec_index))); default: Rcpp::stop("cannot cast SEXP to int32"); } return (int32)0; // -Wall, should not happen since we only call this when we know it works } int64 GET_int64(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: return ((int64)INTEGER(x)[vec_index]); case REALSXP: return ((int64)REAL(x)[vec_index]); case LGLSXP: return ((int64)LOGICAL(x)[vec_index]); case RAWSXP: return ((int64)RAW(x)[vec_index]); case STRSXP: return Int64FromString(CHAR(STRING_ELT(x, vec_index))); default: Rcpp::stop("cannot cast SEXP to int64"); } return (int64)0; // -Wall, should not happen since we only call this when we know it works } uint32 GET_uint32(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: return ((uint32)INTEGER(x)[vec_index]); case REALSXP: return ((uint32)REAL(x)[vec_index]); case LGLSXP: return ((uint32)LOGICAL(x)[vec_index]); case RAWSXP: return ((uint32)RAW(x)[vec_index]); case STRSXP: return Int32FromString(CHAR(STRING_ELT(x, vec_index))); default: Rcpp::stop("cannot cast SEXP to uint32"); } return (uint32)0; // -Wall, should not happen since we only call this when we know it works } uint64 GET_uint64(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: return ((uint64)INTEGER(x)[vec_index]); case REALSXP: return ((uint64)REAL(x)[vec_index]); case LGLSXP: return ((uint64)LOGICAL(x)[vec_index]); case RAWSXP: return ((uint64)RAW(x)[vec_index]); case STRSXP: return Int64FromString(CHAR(STRING_ELT(x, vec_index))); default: Rcpp::stop("cannot cast SEXP to uint64"); } return (uint64)0; // -Wall, should not happen since we only call this when we know it works } bool GET_bool(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case INTSXP: if (INTEGER(x)[vec_index] == R_NaInt) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } return ((bool)INTEGER(x)[vec_index]); case REALSXP: if (REAL(x)[vec_index] == R_NaReal) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } return ((bool)REAL(x)[vec_index]); case LGLSXP: if (LOGICAL(x)[vec_index] == NA_LOGICAL) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } return ((bool)LOGICAL(x)[vec_index]); case RAWSXP: return ((bool)RAW(x)[vec_index]); default: Rcpp::stop("cannot cast SEXP to bool"); } return (bool)0; // Unreachable. -Wall } std::string GET_stdstring(SEXP x, R_xlen_t vec_index) { if (TYPEOF(x) == STRSXP) { return (CHAR(STRING_ELT(x, vec_index))); } return ""; // Unreachable. -Wall } std::string GET_bytes(SEXP x, R_xlen_t vec_index) { switch (TYPEOF(x)) { case RAWSXP: if (vec_index == 0) { return (std::string((const char*)RAW(x), (size_t)LENGTH(x))); } else { Rcpp::stop("cannot cast SEXP to bytes"); } case VECSXP: if (TYPEOF(VECTOR_ELT(x, vec_index)) == RAWSXP) { return (std::string((const char*)RAW(VECTOR_ELT(x, vec_index)), (size_t)LENGTH(VECTOR_ELT(x, vec_index)))); } else { Rcpp::stop("cannot cast SEXP to bytes"); } default: Rcpp::stop("cannot cast SEXP to bytes"); } return ""; // Unreachable. -Wall } /** * indicates if this is a list of messages * * @param x a list (VECSXP), not a long vec * @return TRUE if all objects are instances of Message class */ Rboolean allAreMessages(SEXP x) { if (TYPEOF(x) != VECSXP) return _FALSE_; R_xlen_t n = LENGTH(x); // Caller verifies its not a long vec SEXP current; for (R_xlen_t i = 0; i < n; i++) { current = VECTOR_ELT(x, i); /* not an S4 object */ if (TYPEOF(current) != S4SXP) return _FALSE_; /* not a Message object */ if (!Rf_inherits(current, "Message")) return _FALSE_; } return _TRUE_; } /** * indicates if this is a list of raws * * @param x a list (VECSXP) * @return TRUE if all objects are instances of RAWSXP */ Rboolean allAreRaws(SEXP x) { if (TYPEOF(x) != VECSXP) return _FALSE_; R_xlen_t n = LENGTH(x); SEXP current; for (R_xlen_t i = 0; i < n; i++) { current = VECTOR_ELT(x, i); /* not a RAWSXP */ if (TYPEOF(current) != RAWSXP) return _FALSE_; } return _TRUE_; } /** * check that all the values contained in value are suitable for the * enum type * * @param field_desc field descriptor of an enum type * @param value value to potentially fill the enum * */ void CHECK_values_for_enum(const GPB::FieldDescriptor* field_desc, SEXP value) { BEGIN_RCPP const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); // N.B. n undefined if TYPEOF(value) not a vector, but we catch that below. R_xlen_t n = XLENGTH(value); switch (TYPEOF(value)) { // {{{ numbers case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { int nenums = enum_desc->value_count(); // Guaranteed to be > 0. std::vector possibles(nenums); for (int i = 0; i < nenums; i++) { possibles[i] = enum_desc->value(i)->number(); } /* loop around the numbers to see if they are in the possibles */ for (int i = 0; i < n; i++) { int val = GET_int(value, i); int ok = 0; for (int j = 0; j < nenums; j++) { if (val == possibles[j]) { ok = 1; break; } } if (!ok) { Rcpp::stop("wrong value for enum"); } } break; } // }}} // {{{ STRSXP case STRSXP: { int nenums = enum_desc->value_count(); std::vector possibles(nenums); for (int i = 0; i < nenums; i++) { possibles[i] = enum_desc->value(i)->name(); } /* loop around the numbers to see if they are in the possibles */ for (int i = 0; i < n; i++) { const char* val = CHAR(STRING_ELT(value, i)); int ok = 0; /* FIXME: there is probably something more efficient */ for (int j = 0; j < nenums; j++) { if (!possibles[j].compare(val)) { ok = 1; break; } } if (!ok) { Rcpp::stop("wrong value for enum"); } } break; } // }}} default: Rcpp::stop("impossible to convert to a enum"); } VOID_END_RCPP } /** * check that the values are suitable for the field descriptor * * @throws Rcpp::exception on error (uncaught) */ void CHECK_messages(const GPB::FieldDescriptor* field_desc, SEXP values) { if (TYPEOF(values) != VECSXP) { Rcpp::stop("expecting a list of messages"); } std::string_view target = field_desc->message_type()->full_name(); int n = LENGTH(values); for (int i = 0; i < n; i++) { if (!isMessage(VECTOR_ELT(values, i), target)) { // TODO(mstokely): When we have C++11 CXX11, use // std::to_string(i) // {{{ std::string s; std::stringstream out; out << i; s = out.str(); // }}} std::string message = "List element " + s + " is not a message " + "of the appropriate type ('" + std::string(target) + "')"; Rcpp::stop(message.c_str()); } } } /** * check that all repeated values are ok before doing anything, * otherwise this could lead to modifying a few values then failing in * an inconsistent state. */ void CHECK_repeated_vals(const GPB::FieldDescriptor* field_desc, SEXP value, int value_size) { switch (field_desc->type()) { case TYPE_MESSAGE: case TYPE_GROUP: { switch (TYPEOF(value)) { case VECSXP: { /* check that it is a list of Messages of the appropriate type */ CHECK_messages(field_desc, value); break; } case S4SXP: { /* check that this is a message of the appropriate type */ if (!isMessage(value, field_desc->message_type()->full_name())) { std::string message = "Not a message of type '" + std::string(field_desc->message_type()->full_name()) + "'"; Rcpp::stop(message.c_str()); } break; } default: Rcpp::stop("impossible to convert to a message"); } break; } case TYPE_ENUM: { const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); /* check first, it means we have to loop twice, but otherwise this could have some side effects before the exception is thrown */ /* FIXME: the checking should go before the resizing */ switch (TYPEOF(value)) { // {{{ numbers case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { int nenums = enum_desc->value_count(); std::vector possibles(nenums); for (int i = 0; i < nenums; i++) { possibles[i] = enum_desc->value(i)->number(); } /* loop around the numbers to see if they are in the possibles */ for (int i = 0; i < value_size; i++) { int val = GET_int(value, i); int ok = 0; for (int j = 0; j < nenums; j++) { if (val == possibles[j]) { ok = 1; break; } } if (!ok) { Rcpp::stop("wrong value for enum"); } } break; } // }}} // {{{ STRSXP case STRSXP: { int nenums = enum_desc->value_count(); std::vector possibles(nenums); for (int i = 0; i < nenums; i++) { possibles[i] = enum_desc->value(i)->name(); } /* loop around the numbers to see if they are in the possibles */ for (int i = 0; i < value_size; i++) { const char* val = CHAR(STRING_ELT(value, i)); int ok = 0; /* FIXME: there is probably something more efficient */ for (int j = 0; j < nenums; j++) { if (!possibles[j].compare(val)) { ok = 1; break; } } if (!ok) { Rcpp::stop("wrong value for enum"); } } break; } // }}} default: Rcpp::stop("impossible to convert to a enum"); } break; } case TYPE_DOUBLE: case TYPE_FLOAT: case TYPE_INT64: case TYPE_UINT64: case TYPE_INT32: case TYPE_FIXED64: case TYPE_FIXED32: case TYPE_BOOL: case TYPE_STRING: case TYPE_BYTES: case TYPE_UINT32: case TYPE_SFIXED32: case TYPE_SFIXED64: case TYPE_SINT32: case TYPE_SINT64: { ; // nothing, just to satisfy -Wall } } } /** * set a non-repeated message field to a new value * * @param message pointer to a message * @param ref pointer to reflection object for message * @param field_desc pointer to field descriptor to update * @param value new value for the field * @param value_size size of the new value for the field * @throws Rcpp::exception on error (uncaught) * @return void, the message is modified by reference */ void setNonRepeatedMessageField(GPB::Message* message, const Reflection* ref, const GPB::FieldDescriptor* field_desc, SEXP value, int value_size) { if (value_size > 1) { Rcpp::stop("cannot set non-repeated field to vector of length > 1"); } switch (GPB::FieldDescriptor::TypeToCppType(field_desc->type())) { // {{{ simple cases using macro expansion #undef HANDLE_SINGLE_FIELD #define HANDLE_SINGLE_FIELD(CPPTYPE, CAMEL, TYPE) \ case CPPTYPE: { \ ref->Set##CAMEL(message, field_desc, Rcpp::as(value)); \ break; \ } HANDLE_SINGLE_FIELD(CPPTYPE_DOUBLE, Double, double) HANDLE_SINGLE_FIELD(CPPTYPE_FLOAT, Float, float) case CPPTYPE_BOOL: { // TODO(mstokely): Rcpp should handle this! if ((TYPEOF(value) == LGLSXP) && (LOGICAL(value)[0] == NA_LOGICAL)) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } else if ((TYPEOF(value) == INTSXP) && (INTEGER(value)[0] == R_NaInt)) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } else if ((TYPEOF(value) == REALSXP) && (REAL(value)[0] == R_NaReal)) { Rcpp::stop("NA boolean values can not be stored in bool protocol buffer fields"); } ref->SetBool(message, field_desc, Rcpp::as(value)); break; } case CPPTYPE_INT32: { if (TYPEOF(value) == STRSXP) { const std::string int32str = COPYSTRING(CHAR(STRING_ELT(value, 0))); ref->SetInt32(message, field_desc, Int32FromString(int32str)); break; } else { ref->SetInt32(message, field_desc, Rcpp::as(value)); break; } } case CPPTYPE_UINT32: { if (TYPEOF(value) == STRSXP) { const std::string uint32str = COPYSTRING(CHAR(STRING_ELT(value, 0))); ref->SetUInt32(message, field_desc, Int32FromString(uint32str)); break; } else { // Rcpp::as is broken for uint32 types, so we just get Rcpp // to give us a valid double, ref->SetUInt32(message, field_desc, Rcpp::as(value)); break; } } #ifdef RCPP_HAS_LONG_LONG_TYPES case CPPTYPE_INT64: { // TODO(mstokely) Rcpp::as of a STRSEXP should just // work for strings representing int64s. if (TYPEOF(value) == STRSXP) { const std::string int64str = COPYSTRING(CHAR(STRING_ELT(value, 0))); ref->SetInt64(message, field_desc, Int64FromString(int64str)); break; } else { ref->SetInt64(message, field_desc, Rcpp::as(value)); break; } } case CPPTYPE_UINT64: { // TODO(mstokely) Rcpp::as of a STRSEXP should just // work for strings representing int64s. if (TYPEOF(value) == STRSXP) { const std::string int64str = COPYSTRING(CHAR(STRING_ELT(value, 0))); ref->SetUInt64(message, field_desc, Int64FromString(int64str)); break; } else { ref->SetUInt64(message, field_desc, Rcpp::as(value)); break; } } #endif #undef HANDLE_SINGLE_FIELD default: Rcpp::stop("Unsupported type"); // }}} // {{{ string case CPPTYPE_STRING: { switch (TYPEOF(value)) { case STRSXP: { ref->SetString(message, field_desc, COPYSTRING(CHAR(STRING_ELT(value, 0)))); break; } case RAWSXP: { ref->SetString(message, field_desc, GET_bytes(value, 0)); break; } case S4SXP: { /* check if value is a message */ if (!Rf_inherits(value, "Message")) { Rcpp::stop("Can only convert S4 objects of class 'Message'"); } GPB::Message* __mess = GET_MESSAGE_POINTER_FROM_S4(value); ref->SetString(message, field_desc, __mess->SerializeAsString()); break; } default: Rcpp::stop("Cannot convert to string"); } break; } // }}} // {{{ message case CPPTYPE_MESSAGE: { if (TYPEOF(value) == S4SXP && Rf_inherits(value, "Message")) { GPB::Message* mess = (GPB::Message*)R_ExternalPtrAddr(GET_SLOT(value, Rf_install("pointer"))); std::string_view type = mess->GetDescriptor()->full_name(); std::string_view target = field_desc->message_type()->full_name(); if (type != target) { Rcpp::stop("wrong message type"); } GPB::Message* m = ref->MutableMessage(message, field_desc); m->CopyFrom(*mess); } else { Rcpp::stop("type mismatch, expecting a 'Message' object"); } break; } // }}} // {{{ enum case CPPTYPE_ENUM: { const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { int val = Rcpp::as(value); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByNumber(val); if (!evd) { Rcpp::stop("wrong value for enum"); } else { ref->SetEnum(message, field_desc, evd); } break; } case STRSXP: { std::string val = Rcpp::as(value); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); if (!evd) { Rcpp::stop("wrong value for enum"); } else { ref->SetEnum(message, field_desc, evd); } break; } default: Rcpp::stop("cannot set enum value"); } break; } // }}} } } /** * set a repeated message field to a new value * * @param message pointer to a message * @param ref pointer to reflection object for message * @param field_desc pointer to field descriptor to update * @param value new value for the field * @param value_size size of the new value for the field * @throws Rcpp::exception on error (uncaught) * @return void, the message is modified by reference */ void setRepeatedMessageField(GPB::Message* message, const Reflection* ref, const GPB::FieldDescriptor* field_desc, SEXP value, R_xlen_t value_size) { // The number of elements already in the repeated field. int field_size = ref->FieldSize(*message, field_desc); /* in case of messages or enum, we have to check that all values are ok before doing anything, othewise this could leed to modify a few values and then fail which is not good */ CHECK_repeated_vals(field_desc, value, value_size); /* Remove some items if there are too many. */ if (field_size > value_size) { /* we need to remove some */ while (field_size > value_size) { ref->RemoveLast(message, field_desc); field_size--; } } switch (field_desc->type()) { // {{{ int32 case TYPE_INT32: case TYPE_SINT32: case TYPE_SFIXED32: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: case STRSXP: // For int32, we support chars. { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedInt32(message, field_desc, i, GET_int32(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddInt32(message, field_desc, GET_int32(value, i)); } } break; } default: Rcpp::stop("Cannot convert to int32"); } break; } // }}} // {{{ int64 case TYPE_INT64: case TYPE_SINT64: case TYPE_SFIXED64: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: case STRSXP: // For int64, we support chars. { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedInt64(message, field_desc, i, GET_int64(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddInt64(message, field_desc, GET_int64(value, i)); } } break; } default: Rcpp::stop("Cannot convert to int64"); } break; } // }}} // {{{ uint32 case TYPE_UINT32: case TYPE_FIXED32: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: case STRSXP: // For int32, we support chars. { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedUInt32(message, field_desc, i, GET_uint32(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddUInt32(message, field_desc, GET_uint32(value, i)); } } break; } default: Rcpp::stop("Cannot convert to uint32"); } break; } // }}} // {{{ uint64 case TYPE_UINT64: case TYPE_FIXED64: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: case STRSXP: // For int64, we support chars. { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedUInt64(message, field_desc, i, GET_uint64(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddUInt64(message, field_desc, GET_uint64(value, i)); } } break; } default: Rcpp::stop("Cannot convert to int64"); } break; } // }}} // {{{ double case TYPE_DOUBLE: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedDouble(message, field_desc, i, GET_double(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddDouble(message, field_desc, GET_double(value, i)); } } break; } default: Rcpp::stop("Cannot convert to double"); } break; } // }}} // {{{ float case TYPE_FLOAT: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedFloat(message, field_desc, i, GET_float(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddFloat(message, field_desc, GET_float(value, i)); } } break; } default: Rcpp::stop("Cannot convert to float"); } break; } // }}} // {{{ bool case TYPE_BOOL: { switch (TYPEOF(value)) { case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { R_xlen_t i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { ref->SetRepeatedBool(message, field_desc, i, GET_bool(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddBool(message, field_desc, GET_bool(value, i)); } } break; } default: Rcpp::stop("Cannot convert to bool"); } break; } // }}} // {{{ string case TYPE_STRING: case TYPE_BYTES: { switch (TYPEOF(value)) { case STRSXP: { /* in any case, fill the values up to field_size */ R_xlen_t i = 0; for (; i < field_size; i++) { ref->SetRepeatedString(message, field_desc, i, COPYSTRING(CHAR(STRING_ELT(value, i)))); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddString(message, field_desc, COPYSTRING(CHAR(STRING_ELT(value, i)))); } } break; } case RAWSXP: { /* in any case, fill the values up to field_size */ R_xlen_t i = 0; for (; i < field_size; i++) { ref->SetRepeatedString(message, field_desc, i, GET_bytes(value, 0)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddString(message, field_desc, GET_bytes(value, 0)); } } break; } case S4SXP: { /* check if value is a message */ if (!Rf_inherits(value, "Message")) { Rcpp::stop("Can only convert S4 objects of class 'Message'"); } GPB::Message* __mess = GET_MESSAGE_POINTER_FROM_S4(value); ref->SetRepeatedString(message, field_desc, 0, __mess->SerializeAsString()); break; } case VECSXP: { // we know it is a list of messages or raws because it // has been tested above if (LENGTH(value) > 0 && TYPEOF(VECTOR_ELT(value, 0)) == RAWSXP) { /* in any case, fill the values up to field_size */ R_xlen_t i = 0; for (; i < field_size; i++) { ref->SetRepeatedString(message, field_desc, i, GET_bytes(value, i)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { ref->AddString(message, field_desc, GET_bytes(value, i)); } } } else { // FIXME: we should probably use SerializeToString // as indicated in the protobuf api documentation // http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.message_lite.html#MessageLite.SerializeAsString.details GPB::Message* __mess; /* in any case, fill the values up to field_size */ R_xlen_t i = 0; for (; i < field_size; i++) { __mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(value, i)); ref->SetRepeatedString(message, field_desc, i, __mess->SerializeAsString()); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { __mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(value, i)); ref->AddString(message, field_desc, __mess->SerializeAsString()); } } } break; } default: Rcpp::stop("Cannot convert to string"); } break; } // }}} // {{{ message case TYPE_MESSAGE: case TYPE_GROUP: { if (TYPEOF(value) == S4SXP) { /* we know it is a message of the correct type (tested above) */ GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(value); if (field_size == 1) { /* FIXME: we should not __copy__ the message */ ref->MutableRepeatedMessage(message, field_desc, 0)->CopyFrom(*mess); } else { /* FIXME */ ref->ClearField(message, field_desc); /* FIXME: we should not __copy__ the message */ ref->AddMessage(message, field_desc)->CopyFrom(*mess); } } else if (TYPEOF(value) == VECSXP) { /* in any case, fill the values up to field_size */ int i = 0; for (; i < field_size; i++) { GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(value, i)); /* we already know it is of the correct type because of the premptive check above */ ref->MutableRepeatedMessage(message, field_desc, i)->CopyFrom(*mess); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { GPB::Message* mess = GET_MESSAGE_POINTER_FROM_S4(VECTOR_ELT(value, i)); /* we already know it is of the correct type because of the premptive check above */ ref->AddMessage(message, field_desc)->CopyFrom(*mess); } } } else { Rcpp::stop("type mismatch, expecting a 'Message' object or a list of them"); } break; } // }}} // {{{ enum case TYPE_ENUM: { const GPB::EnumDescriptor* enum_desc = field_desc->enum_type(); switch (TYPEOF(value)) { // {{{ numbers case INTSXP: case REALSXP: case LGLSXP: case RAWSXP: { int i = 0; /* in any case, fill the values up to field_size */ for (; i < field_size; i++) { int val = GET_int(value, i); ref->SetRepeatedEnum(message, field_desc, i, enum_desc->FindValueByNumber(val)); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { int val = GET_int(value, i); ref->AddEnum(message, field_desc, enum_desc->FindValueByNumber(val)); } } break; } // }}} // {{{ STRSXP case STRSXP: { /* in any case, fill the values up to field_size */ int i = 0; for (; i < field_size; i++) { std::string val = CHAR(STRING_ELT(value, i)); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); ref->SetRepeatedEnum(message, field_desc, i, evd); } /* then add some if needed */ if (value_size > field_size) { for (; i < value_size; i++) { std::string val = CHAR(STRING_ELT(value, i)); const GPB::EnumValueDescriptor* evd = enum_desc->FindValueByName(val); ref->AddEnum(message, field_desc, evd); } } break; } // }}} default: Rcpp::stop("cannot set enum value"); } } // }}} } } /** * set a message field to a new value * * @param pointer external pointer to a message * @param name name of the field, or an S4 FieldDescriptor object. * @param value new value for the field * * @return allways NULL, the message is modified by reference */ SEXP setMessageField(SEXP pointer, SEXP name, SEXP value) { BEGIN_RCPP RPB_DEBUG_BEGIN("setMessageField") PRINT_DEBUG_INFO("pointer", pointer); PRINT_DEBUG_INFO("name", name); PRINT_DEBUG_INFO("value", value); /* grab the Message pointer */ GPB::Message* message = GET_MESSAGE_POINTER_FROM_XP(pointer); /* check that we can get a file descriptor from name */ const GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, name); const Reflection* ref = message->GetReflection(); if (value == R_NilValue || (Rf_isVector(value) && LENGTH(value) == 0)) { ref->ClearField(message, field_desc); return R_NilValue; } // {{{ preliminary checks R_xlen_t value_size = 1; if (Rf_isVector(value)) { if (IS_LONG_VEC(value)) { // field_size is an int, so presumably it would generate // a CHECK failure in protobuf code on 2^32 element anyway. Rcpp_error("Long vectors not supported for repeated fields."); } else { value_size = LENGTH(value); } } // if the R type is RAWSXP and the cpp type is string or bytes, // then value_size is actually one because the raw vector // is converted to a string GPB::FieldDescriptor::Type field_type = field_desc->type(); if (field_type == TYPE_STRING || field_type == TYPE_BYTES) { if (TYPEOF(value) == RAWSXP) { value_size = 1; } else if (TYPEOF(value) == STRSXP) { value_size = LENGTH(value); } else if (TYPEOF(value) == S4SXP && Rf_inherits(value, "Message")) { value_size = 1; /* we will store the message payload */ } else if (TYPEOF(value) == VECSXP && allAreMessages(value)) { value_size = LENGTH(value); } else if (TYPEOF(value) == VECSXP && allAreRaws(value)) { value_size = LENGTH(value); } else { Rcpp::stop("cannot convert to string"); } } // }}} if (field_desc->is_repeated()) { setRepeatedMessageField(message, ref, field_desc, value, value_size); } else { setNonRepeatedMessageField(message, ref, field_desc, value, value_size); } RPB_DEBUG_END("setMessageField") END_RCPP } RPB_FUNCTION_VOID_2(update_message, Rcpp::XPtr message, Rcpp::List list) { Rcpp::CharacterVector names = list.attr("names"); int n = list.size(); for (int i = 0; i < n; i++) { (void)setMessageField(message, names[i], list[i]); } } } // namespace rprotobuf RProtoBuf/src/ConnectionOutputStream.cpp0000644000176200001440000000172112440004312020112 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionOutputStream.h" #include "ConnectionCopyingOutputStream.h" namespace rprotobuf { ConnectionOutputStream::ConnectionOutputStream(SEXP con, bool was_open) : GPB::io::CopyingOutputStreamAdaptor(new ConnectionCopyingOutputStream(con)), was_open(was_open), con(con) { /* clean the wrapped stream on delete */ SetOwnsCopyingStream(true); } ConnectionOutputStream::~ConnectionOutputStream() { if (!was_open) { /* then we need to close it */ SEXP call = PROTECT(Rf_lang2(Rf_install("close"), con)); (void)Rf_eval(call, R_GlobalEnv); // Ignore SEXP return val of close(). UNPROTECT(1); /* call */ } /* con will be disposed by the R GC, it is protected as part of the protection of the external pointer that wraps this */ } } // namespace rprotobuf RProtoBuf/src/RconnectionCopyingInputStream.h0000644000176200001440000000065712440004312021100 0ustar liggesusers#ifndef RPROTOBUF_RconnectionCopyingInputStream_H #define RPROTOBUF_RconnectionCopyingInputStream_H namespace rprotobuf { class RconnectionCopyingInputStream : public GPB::io::CopyingInputStream { public: RconnectionCopyingInputStream(int id); int Read(void* buffer, int size); bool Failure() const { return (failure); } private: int connection_id; bool failure; }; } // namespace rprotobuf #endif RProtoBuf/src/wrapper_ServiceDescriptor.cpp0000644000176200001440000000644214752644073020650 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(ServiceDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(length), GPB::ServiceDescriptor, method_count) RPB_XP_METHOD_0(METHOD(method_count), GPB::ServiceDescriptor, method_count) RPB_XP_METHOD_0(METHOD(as_character), GPB::ServiceDescriptor, DebugString) RPB_XP_METHOD_CAST_1(METHOD(getMethodByIndex), GPB::ServiceDescriptor, method, S4_MethodDescriptor) RPB_XP_METHOD_CAST_1_STRING(METHOD(getMethodByName), GPB::ServiceDescriptor, FindMethodByName, S4_MethodDescriptor) RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(getMethodNames), Rcpp::XPtr desc) { int nmeths = desc->method_count(); Rcpp::CharacterVector res(nmeths); for (int i = 0; i < nmeths; i++) { res[i] = std::string(desc->method(i)->name()); } return res; } /** * @param xp (GPB::ServiceDescriptor*) external pointer * @return the descriptor as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr desc) { int n = desc->method_count(); Rcpp::CharacterVector names(n); Rcpp::List res(n); for (int i = 0; i < n; i++) { const GPB::MethodDescriptor* met = desc->method(i); res[i] = S4_MethodDescriptor(met); names[i] = std::string(met->name()); } res.names() = names; return res; } RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::ServiceDescriptorProto* message = new GPB::ServiceDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->file()); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return std::string(full ? d->full_name() : d->name()); } /** * extract a method descriptor from a service descriptor using its * name or position * * @param pointer (GPB::ServiceDescriptor*) external pointer * @param name name or position of the method */ SEXP get_service_method(SEXP pointer, SEXP name) { /* grab the Message pointer */ Rcpp::XPtr desc(pointer); GPB::MethodDescriptor* method_desc = static_cast(0); switch (TYPEOF(name)) { case STRSXP: { /* what we are looking for */ const char* what = CHAR(STRING_ELT(name, 0)); /* the method descriptor */ method_desc = (GPB::MethodDescriptor*)desc->FindMethodByName(what); break; } case REALSXP: { /* the method descriptor */ method_desc = (GPB::MethodDescriptor*)desc->method((int)REAL(name)[0]); break; } case INTSXP: { /* the method descriptor */ method_desc = (GPB::MethodDescriptor*)desc->method(INTEGER(name)[0]); break; } } if (!method_desc) { Rcpp::stop("could not get MethodDescriptor"); } return S4_MethodDescriptor(method_desc); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/extractors.cpp0000644000176200001440000001665012440004312015623 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "fieldtypes.h" #include "Rcppsupport.h" namespace rprotobuf { const char* kIntStringOptionName = "RProtoBuf.int64AsString"; bool UseStringsForInt64() { static const SEXP option_name = Rf_install(kIntStringOptionName); return (Rf_asLogical(Rf_GetOption1(option_name))); } // Rcpp::wrap silently coerces 64-bit integers to numerics // which drop precision for values between 2^53 - 2^64. // So, if an option is set, we return as a character string. template SEXP Int64AsSEXP(ValueType value) { BEGIN_RCPP if (UseStringsForInt64()) { std::stringstream ss; if ((ss << value).fail()) { // This should not happen, its a bug in the code. std::string message = std::string("Error converting int64 to string, unset ") + kIntStringOptionName + " option."; Rcpp::stop(message.c_str()); } return Rcpp::CharacterVector(ss.str()); } else { return Rcpp::wrap(value); } END_RCPP } /** * extract a field from a message * * @param pointer external pointer to a message * @param name name of the field * * @return the field called "name" of the message if the * message has the field, otherwise an error is generated */ RcppExport SEXP getMessageField(SEXP pointer, SEXP name) { RPB_DEBUG_BEGIN("getMessageField") PRINT_DEBUG_INFO("pointer", pointer); PRINT_DEBUG_INFO("name", name); /* grab the Message pointer */ Rcpp::XPtr message(pointer); GPB::FieldDescriptor* field_desc = getFieldDescriptor(message, name); RPB_DEBUG_END("getMessageField"); return (extractFieldAsSEXP(message, field_desc)); } RcppExport SEXP extractFieldAsSEXP(const Rcpp::XPtr& message, const GPB::FieldDescriptor* fieldDesc) { BEGIN_RCPP const Reflection* ref = message->GetReflection(); if (fieldDesc->is_repeated()) { switch (GPB::FieldDescriptor::TypeToCppType(fieldDesc->type())) { #undef HANDLE_REPEATED_FIELD #define HANDLE_REPEATED_FIELD(TYPE, DATATYPE) \ case TYPE: \ return Rcpp::wrap(RepeatedFieldImporter(ref, *message, fieldDesc)); HANDLE_REPEATED_FIELD(CPPTYPE_INT32, GPB::int32) HANDLE_REPEATED_FIELD(CPPTYPE_DOUBLE, double) HANDLE_REPEATED_FIELD(CPPTYPE_FLOAT, float) HANDLE_REPEATED_FIELD(CPPTYPE_BOOL, bool) HANDLE_REPEATED_FIELD(CPPTYPE_ENUM, enum_field) HANDLE_REPEATED_FIELD(CPPTYPE_MESSAGE, message_field) // TODO(mstokely): Rcpp doesn't handle uint32 properly as of 2013/12 // See // https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1360&group_id=155&atid=637 case CPPTYPE_UINT32: return Rcpp::wrap(UInt32RepeatedFieldImporter(ref, *message, fieldDesc)); #ifdef RCPP_HAS_LONG_LONG_TYPES // We can't handle these the same way, because Rcpp::wrap silently // casts int64s to doubles which may cause us to lose precision. case CPPTYPE_INT64: if (UseStringsForInt64()) { return Rcpp::wrap(Int64AsStringRepeatedFieldImporter(ref, *message, fieldDesc)); } else { return Rcpp::wrap(RepeatedFieldImporter(ref, *message, fieldDesc)); } case CPPTYPE_UINT64: if (UseStringsForInt64()) { return Rcpp::wrap( UInt64AsStringRepeatedFieldImporter(ref, *message, fieldDesc)); } else { return Rcpp::wrap(RepeatedFieldImporter(ref, *message, fieldDesc)); } #endif #undef HANDLE_REPEATED_FIELD case CPPTYPE_STRING: if (fieldDesc->type() == TYPE_STRING) { return Rcpp::wrap(RepeatedFieldImporter(ref, *message, fieldDesc)); } else if (fieldDesc->type() == TYPE_BYTES) { int field_size = ref->FieldSize(*message, fieldDesc); Rcpp::List res(field_size); for (int i = 0; i < field_size; i++) { std::string s = ref->GetRepeatedString(*message, fieldDesc, i); res[i] = Rcpp::wrap(std::vector(s.begin(), s.end())); } return res; } else { Rcpp::stop("unknown field type with CPP_TYPE STRING"); } default: Rcpp::stop("Unsupported type"); } } else { switch (GPB::FieldDescriptor::TypeToCppType(fieldDesc->type())) { #undef HANDLE_SINGLE_FIELD #define HANDLE_SINGLE_FIELD(CPPTYPE, SUFFIX) \ case CPPTYPE: \ return Rcpp::wrap(ref->Get##SUFFIX(*message, fieldDesc)); HANDLE_SINGLE_FIELD(CPPTYPE_INT32, Int32) HANDLE_SINGLE_FIELD(CPPTYPE_DOUBLE, Double) HANDLE_SINGLE_FIELD(CPPTYPE_FLOAT, Float) HANDLE_SINGLE_FIELD(CPPTYPE_BOOL, Bool) // TODO(mstokely): Rcpp doesn't handle uint32 properly as of 2013/12 // See // https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1360&group_id=155&atid=637 case CPPTYPE_UINT32: return Rcpp::wrap(double(ref->GetUInt32(*message, fieldDesc))); #ifdef RCPP_HAS_LONG_LONG_TYPES // Handle these types separately since Rcpp::wrap doesn't // do the right thing. case CPPTYPE_INT64: return Int64AsSEXP(ref->GetInt64(*message, fieldDesc)); case CPPTYPE_UINT64: return Int64AsSEXP(ref->GetUInt64(*message, fieldDesc)); #endif #undef HANDLE_SINGLE_FIELD case CPPTYPE_STRING: if (fieldDesc->type() == TYPE_STRING) { return Rcpp::wrap(ref->GetString(*message, fieldDesc)); } else if (fieldDesc->type() == TYPE_BYTES) { std::string s = ref->GetString(*message, fieldDesc); return Rcpp::wrap(std::vector(s.begin(), s.end())); } else { Rcpp::stop("unknown field type with CPP_TYPE STRING"); } case CPPTYPE_ENUM: return Rcpp::wrap(ref->GetEnum(*message, fieldDesc)->number()); case CPPTYPE_MESSAGE: return S4_Message(CLONE(&ref->GetMessage(*message, fieldDesc))); default: Rcpp::stop("Unsupported type"); } } END_RCPP } } // namespace rprotobuf RProtoBuf/src/streams.cpp0000644000176200001440000002157312440004312015103 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "ConnectionInputStream.h" #include "ConnectionOutputStream.h" namespace rprotobuf { void ZeroCopyInputStreamWrapper_finalizer(SEXP xp) { delete (ZeroCopyInputStreamWrapper*)XPP(xp); } void ZeroCopyOutputStreamWrapper_finalizer(SEXP xp) { delete (ZeroCopyOutputStreamWrapper*)XPP(xp); } // {{{ input streams // {{{ FileInputStream SEXP FileInputStream_new(SEXP filename, SEXP block_size, SEXP close_on_delete) { BEGIN_RCPP NEW_S4_OBJECT("FileInputStream"); int fd = open(CHAR(STRING_ELT(filename, 0)), O_RDONLY | O_BINARY); GPB::io::FileInputStream* stream = new GPB::io::FileInputStream(fd, INTEGER(block_size)[0]); stream->SetCloseOnDelete(LOGICAL(close_on_delete)[0]); ZeroCopyInputStreamWrapper* wrapper = new ZeroCopyInputStreamWrapper(stream); SEXP ptr = PROTECT(R_MakeExternalPtr((void*)wrapper, R_NilValue, R_NilValue)); R_RegisterCFinalizerEx(ptr, ZeroCopyInputStreamWrapper_finalizer, _FALSE_); SET_SLOT(oo, Rf_install("pointer"), ptr); UNPROTECT(2); /* oo, ptr */ return oo; END_RCPP } SEXP FileInputStream_GetErrno(SEXP xp) { BEGIN_RCPP GPB::io::FileInputStream* stream = GET_FIS(xp); return Rf_ScalarInteger(stream->GetErrno()); END_RCPP } SEXP FileInputStream_SetCloseOnDelete(SEXP xp, SEXP close) { BEGIN_RCPP GPB::io::FileInputStream* stream = GET_FIS(xp); stream->SetCloseOnDelete(LOGICAL(close)); return R_NilValue; END_RCPP } SEXP FileInputStream_Close(SEXP xp) { BEGIN_RCPP GPB::io::FileInputStream* stream = GET_FIS(xp); bool res = stream->Close(); return Rf_ScalarLogical(res ? _TRUE_ : _FALSE_); END_RCPP } // }}} // {{{ ConnectionInputStream SEXP ConnectionInputStream_new(SEXP con, SEXP was_open) { BEGIN_RCPP NEW_S4_OBJECT("ConnectionInputStream"); ConnectionInputStream* stream = new ConnectionInputStream(con, (bool)LOGICAL(was_open)[0]); ZeroCopyInputStreamWrapper* wrapper = new ZeroCopyInputStreamWrapper(stream); SEXP ptr = PROTECT(R_MakeExternalPtr((void*)wrapper, R_NilValue, con)); R_RegisterCFinalizerEx(ptr, ZeroCopyInputStreamWrapper_finalizer, _FALSE_); SET_SLOT(oo, Rf_install("pointer"), ptr); UNPROTECT(2); /* oo, ptr */ return oo; END_RCPP } // }}} // }}} // {{{ output streams // {{{ ZeroCopyOutputStream SEXP ZeroCopyOutputStream_Next(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::ZeroCopyOutputStream* stream = GET_ZCOS(xp); void* out; int s = LENGTH(payload); bool res = stream->Next(&out, &s); if (!res) { Rcpp_error("cannot write to stream"); } memcpy(out, RAW(payload), s); return Rf_ScalarInteger(s); END_RCPP } SEXP ZeroCopyOutputStream_ByteCount(SEXP xp) { BEGIN_RCPP GPB::io::ZeroCopyOutputStream* stream = GET_ZCOS(xp); return (Rf_ScalarReal((double)stream->ByteCount())); END_RCPP } SEXP ZeroCopyOutputStream_BackUp(SEXP xp, SEXP count) { BEGIN_RCPP GPB::io::ZeroCopyOutputStream* stream = GET_ZCOS(xp); int s = GET_int(count, 0); stream->BackUp(s); return R_NilValue; END_RCPP } // }}} // {{{ ArrayOutputStream // }}} // {{{ FileOutputStream SEXP FileOutputStream_new(SEXP filename, SEXP block_size, SEXP close_on_delete) { BEGIN_RCPP NEW_S4_OBJECT("FileOutputStream"); int fd = open(CHAR(STRING_ELT(filename, 0)), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); GPB::io::FileOutputStream* stream = new GPB::io::FileOutputStream(fd, INTEGER(block_size)[0]); stream->SetCloseOnDelete(LOGICAL(close_on_delete)[0]); ZeroCopyOutputStreamWrapper* wrapper = new ZeroCopyOutputStreamWrapper(stream); SEXP ptr = PROTECT(R_MakeExternalPtr((void*)wrapper, R_NilValue, R_NilValue)); R_RegisterCFinalizerEx(ptr, ZeroCopyOutputStreamWrapper_finalizer, _FALSE_); SET_SLOT(oo, Rf_install("pointer"), ptr); UNPROTECT(2); /* oo, ptr */ return oo; END_RCPP } SEXP FileOutputStream_Flush(SEXP xp) { BEGIN_RCPP GPB::io::FileOutputStream* stream = GET_FOS(xp); bool res = stream->Flush(); return Rf_ScalarLogical(res ? _TRUE_ : _FALSE_); END_RCPP } SEXP FileOutputStream_Close(SEXP xp) { BEGIN_RCPP GPB::io::FileOutputStream* stream = GET_FOS(xp); bool res = stream->Close(); return Rf_ScalarLogical(res ? _TRUE_ : _FALSE_); END_RCPP } SEXP FileOutputStream_GetErrno(SEXP xp) { BEGIN_RCPP GPB::io::FileOutputStream* stream = GET_FOS(xp); return Rf_ScalarInteger(stream->GetErrno()); END_RCPP } SEXP FileOutputStream_SetCloseOnDelete(SEXP xp, SEXP close) { BEGIN_RCPP GPB::io::FileOutputStream* stream = GET_FOS(xp); stream->SetCloseOnDelete(LOGICAL(close)); return R_NilValue; END_RCPP } // }}} // {{{ ConnectionOutputStream SEXP ConnectionOutputStream_new(SEXP con, SEXP was_open) { BEGIN_RCPP NEW_S4_OBJECT("ConnectionOutputStream"); ConnectionOutputStream* stream = new ConnectionOutputStream(con, (bool)LOGICAL(was_open)[0]); ZeroCopyOutputStreamWrapper* wrapper = new ZeroCopyOutputStreamWrapper(stream); /* we keep the R connection protected as long as the external pointer is kept out of GC */ SEXP ptr = PROTECT(R_MakeExternalPtr((void*)wrapper, R_NilValue, con)); R_RegisterCFinalizerEx(ptr, ZeroCopyOutputStreamWrapper_finalizer, _FALSE_); SET_SLOT(oo, Rf_install("pointer"), ptr); UNPROTECT(2); /* oo, ptr */ return oo; END_RCPP } // }}} // }}} // {{{ Read*** functions using CodedInputStream SEXP ZeroCopyInputStream_ReadRaw(SEXP xp, SEXP size) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); int s = INTEGER(size)[0]; SEXP payload = PROTECT(Rf_allocVector(RAWSXP, s)); if (!coded_stream->ReadRaw(RAW(payload), s)) Rcpp_error("error reading raw bytes"); UNPROTECT(1); /* payload */ return payload; END_RCPP } SEXP ZeroCopyInputStream_ReadString(SEXP xp, SEXP size) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); int s = INTEGER(size)[0]; std::string buffer(""); if (!coded_stream->ReadString(&buffer, s)) Rcpp_error("error reading string"); return Rf_mkString(buffer.c_str()); END_RCPP } SEXP ZeroCopyInputStream_ReadVarint32(SEXP xp) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); uint32 res = 0; if (!coded_stream->ReadVarint32(&res)) Rcpp_error("error reading varint32"); return Rf_ScalarInteger(res); END_RCPP } SEXP ZeroCopyInputStream_ReadLittleEndian32(SEXP xp) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); uint32 res = 0; if (!coded_stream->ReadVarint32(&res)) Rcpp_error("error reading little endian int32"); return Rf_ScalarInteger(res); END_RCPP } SEXP ZeroCopyInputStream_ReadLittleEndian64(SEXP xp) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); uint64 res = 0; if (!coded_stream->ReadVarint64(&res)) Rcpp_error("error reading little endian int32"); return Rf_ScalarReal((double)res); END_RCPP } SEXP ZeroCopyInputStream_ReadVarint64(SEXP xp) { BEGIN_RCPP GPB::io::CodedInputStream* coded_stream = GET_CIS(xp); uint64 res = 0; if (!coded_stream->ReadVarint64(&res)) Rcpp_error("error reading varint64"); return Rf_ScalarReal((double)res); END_RCPP } // }}} // {{{ Write*** functions using CodedOuputStream SEXP ZeroCopyOutputStream_WriteRaw(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteRaw(RAW(payload), LENGTH(payload)); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteString(SEXP xp, SEXP payload) { BEGIN_RCPP if (LENGTH(payload) > 1) { Rf_warning("only the first element is used"); } if (LENGTH(payload) == 0) { Rcpp_error("need at least one element"); } GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteString(CHAR(STRING_ELT(payload, 0))); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteLittleEndian32(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteLittleEndian32(GET_int32(payload, 0)); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteLittleEndian64(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteLittleEndian64(GET_int64(payload, 0)); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteVarint32(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteVarint32(GET_int32(payload, 0)); return R_NilValue; END_RCPP } SEXP ZeroCopyOutputStream_WriteVarint64(SEXP xp, SEXP payload) { BEGIN_RCPP GPB::io::CodedOutputStream* stream = GET_COS(xp); stream->WriteVarint64(GET_int64(payload, 0)); return R_NilValue; END_RCPP } // }}} } // namespace rprotobuf RProtoBuf/src/wrapper_EnumDescriptor.cpp0000644000176200001440000001050214752644073020144 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- // wrapper_EnumDescriptor.cpp: R/C++ interface class library // // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois // // This file is part of RProtoBuf. // // RProtoBuf is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RProtoBuf is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RProtoBuf. If not, see . #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(EnumDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::EnumDescriptor, DebugString) RPB_XP_METHOD_0(METHOD(length), GPB::EnumDescriptor, value_count) RPB_XP_METHOD_0(METHOD(value_count), GPB::EnumDescriptor, value_count) RPB_FUNCTION_1(S4_Descriptor, METHOD(containing_type), Rcpp::XPtr d) { return S4_Descriptor(d->containing_type()); } RPB_FUNCTION_2(SEXP, METHOD(getValueByIndex), Rcpp::XPtr d, int index) { if ((index >= 0) && (index < d->value_count())) { return S4_EnumValueDescriptor(d->value(index)); } else { return R_NilValue; } } RPB_FUNCTION_2(SEXP, METHOD(getValueByNumber), Rcpp::XPtr d, int i) { const GPB::EnumValueDescriptor* descriptor = d->FindValueByNumber(i); if (descriptor) return S4_EnumValueDescriptor(descriptor); return R_NilValue; } RPB_FUNCTION_2(SEXP, METHOD(getValueByName), Rcpp::XPtr d, std::string name) { const GPB::EnumValueDescriptor* descriptor = d->FindValueByName(name); if (descriptor) return S4_EnumValueDescriptor(descriptor); return R_NilValue; } RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::EnumDescriptorProto* message = new GPB::EnumDescriptorProto(); d->CopyTo(message); return S4_Message(message); } /** * Get the value of the enum called name * * @param xp external pointer to an EnumDescriptor * @param name the name of the enum * * @param the value associated with the name */ RPB_FUNCTION_2(int, get_value_of_enum, Rcpp::XPtr d, std::string name) { const GPB::EnumValueDescriptor* evd = d->FindValueByName(name); if (!evd) { /* or maybe it should just be NA */ Rcpp::stop("cannot get the value"); } return evd->number(); } /** * Does enum have value named 'name'? * * @param xp external pointer to an EnumDescriptor * @param name the name of the enum * @return logical */ RPB_FUNCTION_2(bool, has_enum_name, Rcpp::XPtr d, std::string name) { const GPB::EnumValueDescriptor* evd = d->FindValueByName(name); return (evd != NULL); } /** * @param xp external pointer to a Descriptor * @return the descriptor as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr d) { int n = d->value_count(); Rcpp::CharacterVector names(n); Rcpp::List res(n); for (int i = 0; i < n; i++) { const GPB::EnumValueDescriptor* value_d = d->value(i); res[i] = value_d->number(); names[i] = std::string(value_d->name()); } res.names() = names; return res; } RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(getConstantNames), Rcpp::XPtr d) { int n = d->value_count(); Rcpp::CharacterVector res(n); for (int i = 0; i < n; i++) { res[i] = std::string(d->value(i)->name()); } return res; } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->file()); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return std::string(full ? d->full_name() : d->name()); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/wrapper_FileDescriptor.cpp0000644000176200001440000000551414752644073020126 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(FileDescriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::FileDescriptor, DebugString) RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::FileDescriptorProto* message = new GPB::FileDescriptorProto(); d->CopyTo(message); return S4_Message(message); } RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(getMemberNames), Rcpp::XPtr desc) { int ntypes = desc->message_type_count(); int nenums = desc->enum_type_count(); int nserv = desc->service_count(); int nexts = desc->extension_count(); Rcpp::CharacterVector res(ntypes + nenums + nserv + nexts); int i = 0; int j = 0; while (i < ntypes) { res[j] = std::string(desc->message_type(i)->name()); i++; j++; } i = 0; while (i < nenums) { res[j] = std::string(desc->enum_type(i)->name()); i++; j++; } i = 0; while (i < nserv) { res[j] = std::string(desc->service(i)->name()); i++; j++; } i = 0; while (i < nexts) { res[j] = std::string(desc->extension(i)->name()); i++; j++; } return res; } /** * @param xp (GPB::FileDescriptor*) external pointer * @return the descriptor as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr desc) { int ntypes = desc->message_type_count(); int nenums = desc->enum_type_count(); int nserv = desc->service_count(); int nexts = desc->extension_count(); int n = ntypes + nenums + nserv + nexts; Rcpp::CharacterVector names(n); Rcpp::List res(n); int count = 0; for (int i = 0; i < ntypes; count++, i++) { res[count] = S4_Descriptor(desc->message_type(i)); names[count] = std::string(desc->message_type(i)->name()); } for (int i = 0; i < nenums; count++, i++) { res[count] = S4_EnumDescriptor(desc->enum_type(i)); names[count] = std::string(desc->enum_type(i)->name()); } for (int i = 0; i < nserv; count++, i++) { res[count] = S4_ServiceDescriptor(desc->service(i)); names[count] = std::string(desc->service(i)->name()); } for (int i = 0; i < nexts; count++, i++) { res[count] = S4_FieldDescriptor(desc->extension(i)); // always use full names for extensions names[count] = std::string(desc->extension(i)->full_name()); } res.names() = names; return res; } RPB_FUNCTION_1(std::string, METHOD(name), Rcpp::XPtr desc) { return std::string(desc->name()); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/wrapper_Descriptor.cpp0000644000176200001440000002545014752644073017327 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" #include "RcppMacros.h" namespace rprotobuf { #undef METHOD #define METHOD(__NAME__) RCPP_PP_CAT(Descriptor__, __NAME__) RPB_XP_METHOD_0(METHOD(as_character), GPB::Descriptor, DebugString) RPB_XP_METHOD_0(METHOD(field_count), GPB::Descriptor, field_count) RPB_XP_METHOD_0(METHOD(nested_type_count), GPB::Descriptor, nested_type_count) RPB_XP_METHOD_0(METHOD(enum_type_count), GPB::Descriptor, enum_type_count) RPB_XP_METHOD_CAST_0(METHOD(containing_type), GPB::Descriptor, containing_type, S4_Descriptor) /** * returns the names of the members contained in the descriptor * (nested types, enums, fields) * * @param xp external pointer to a Descriptor * * @return member names, as an R character vector (STRSXP) */ RPB_FUNCTION_1(Rcpp::CharacterVector, METHOD(getMemberNames), Rcpp::XPtr desc) { int nfields = desc->field_count(); int ntypes = desc->nested_type_count(); int nenums = desc->enum_type_count(); Rcpp::CharacterVector res(nfields + ntypes + nenums); int j = 0; for (int i = 0; i < nfields; i++, j++) { res[j] = std::string(desc->field(i)->name()); } for (int i = 0; i < ntypes; i++, j++) { res[j] = std::string(desc->nested_type(i)->name()); } for (int i = 0; i < nenums; i++, j++) { res[j] = std::string(desc->enum_type(i)->name()); } return (res); } /** * @param xp external pointer to a Descriptor * @return the descriptor as an R list */ RPB_FUNCTION_1(Rcpp::List, METHOD(as_list), Rcpp::XPtr desc) { int nfields = desc->field_count(); int ntypes = desc->nested_type_count(); int nenums = desc->enum_type_count(); int n = nfields + ntypes + nenums; Rcpp::CharacterVector names(n); Rcpp::List res(n); int cnt = 0; for (int i = 0; i < nfields; cnt++, i++) { const GPB::FieldDescriptor* fd = desc->field(i); res[cnt] = S4_FieldDescriptor(fd); names[cnt] = std::string(fd->name()); } for (int i = 0; i < ntypes; cnt++, i++) { const GPB::Descriptor* d = desc->nested_type(i); res[cnt] = S4_Descriptor(d); names[cnt] = std::string(d->name()); } for (int i = 0; i < nenums; cnt++, i++) { const GPB::EnumDescriptor* ed = desc->enum_type(i); res[cnt] = S4_EnumDescriptor(ed); names[cnt] = std::string(ed->name()); } res.names() = names; return res; } RPB_FUNCTION_1(S4_Message, METHOD(as_Message), Rcpp::XPtr d) { GPB::DescriptorProto* message = new GPB::DescriptorProto(); d->CopyTo(message); return message; } RPB_FUNCTION_2(S4_FieldDescriptor, METHOD(field), Rcpp::XPtr d, int i) { return d->field(i); } RPB_FUNCTION_2(S4_FieldDescriptor, METHOD(FindFieldByNumber), Rcpp::XPtr d, int num) { return d->FindFieldByNumber(num); } RPB_FUNCTION_2(S4_FieldDescriptor, METHOD(FindFieldByName), Rcpp::XPtr d, std::string nam) { return d->FindFieldByName(nam); } RPB_FUNCTION_2(S4_Descriptor, METHOD(nested_type), Rcpp::XPtr d, int i) { return d->nested_type(i); } RPB_FUNCTION_2(S4_Descriptor, METHOD(FindNestedTypeByName), Rcpp::XPtr d, std::string nam) { return d->FindNestedTypeByName(nam); } RPB_FUNCTION_2(S4_EnumDescriptor, METHOD(enum_type), Rcpp::XPtr d, int i) { return d->enum_type(i); } // FIXME: two methods cant have the same name // RPB_FUNCTION_2( S4_EnumDescriptor, METHOD(enum_type), // Rcpp::XPtr d, std::string name){ // return d->FindEnumTypeByName( i ) ; // } RPB_FUNCTION_1(S4_FileDescriptor, METHOD(fileDescriptor), Rcpp::XPtr desc) { return S4_FileDescriptor(desc->file()); } RPB_FUNCTION_2(std::string, METHOD(name), Rcpp::XPtr d, bool full) { return std::string(full ? d->full_name() : d->name()); } RPB_FUNCTION_2(S4_Message, METHOD(readMessageFromFile), Rcpp::XPtr desc, std::string filename) { /* open the file to read in binary mode */ int file = open(filename.c_str(), O_RDONLY | O_BINARY); /* create a prototype of the message we are going to read */ GPB::Message* message = PROTOTYPE(desc); if (!message) { throw std::range_error("could not call factory->GetPrototype(desc)->New()"); } /* read the message from the file */ // TODO(mstokely): Check return value! message->ParsePartialFromFileDescriptor(file); close(file); return (S4_Message(message)); } RPB_FUNCTION_2(S4_Message, METHOD(readMessageFromConnection), Rcpp::XPtr desc, int conn_id) { RconnectionCopyingInputStream wrapper(conn_id); GPB::io::CopyingInputStreamAdaptor stream(&wrapper); GPB::io::CodedInputStream coded_stream(&stream); /* create a prototype of the message we are going to read */ GPB::Message* message = PROTOTYPE(desc); if (!message) { throw std::range_error("could not call factory->GetPrototype(desc)->New()"); } // TODO(mstokely): Check return value! message->ParsePartialFromCodedStream(&coded_stream); S4_Message res(message); return res; } RPB_FUNCTION_2(S4_Message, METHOD(readMessageFromRawVector), Rcpp::XPtr desc, Rcpp::RawVector raw) { GPB::io::ArrayInputStream ais((void*)raw.begin(), raw.size()); GPB::io::CodedInputStream stream(&ais); GPB::Message* message = PROTOTYPE(desc); if (!message) { throw std::range_error("could not call factory->GetPrototype(desc)->New()"); } message->MergePartialFromCodedStream(&stream); return (S4_Message(message)); } RPB_FUNCTION_3(S4_Message, METHOD(readASCIIFromString), Rcpp::XPtr desc, std::string input, bool partial) { GPB::Message* message = PROTOTYPE(desc); if (partial) { // Allow partial messages where object is not fully initialized GPB::TextFormat::Parser parser; parser.AllowPartialMessage(partial); if (parser.ParseFromString(input, message)) { return (S4_Message(message)); } else { throw std::range_error("Could not parse ASCII protocol buffer from text string."); } } else { // Default parser requires fully initialized ascii messages. if (GPB::TextFormat::ParseFromString(input, message)) { return (S4_Message(message)); } else { throw std::range_error("Could not parse ASCII protocol buffer from text string." " Consider setting partial=TRUE"); } } } RPB_FUNCTION_3(S4_Message, METHOD(readASCIIFromConnection), Rcpp::XPtr desc, int conn_id, bool partial) { RconnectionCopyingInputStream wrapper(conn_id); GPB::io::CopyingInputStreamAdaptor stream(&wrapper); /* create a prototype of the message we are going to read */ GPB::Message* message = PROTOTYPE(desc); if (!message) { throw std::range_error("could not call factory->GetPrototype(desc)->New()"); } if (partial) { // Allow partial messages where object is not fully initialized GPB::TextFormat::Parser parser; parser.AllowPartialMessage(partial); if (!parser.Parse(&stream, message)) { throw std::range_error("Could not parse ASCII protocol buffer."); } } else { // Default parser requires fully initialized ascii messages. if (!GPB::TextFormat::Parse(&stream, message)) { throw std::range_error("Could not parse ASCII protocol buffer."); } } if (wrapper.Failure()) { throw std::range_error("Could not read ASCII protocol buffer."); } return (S4_Message(message)); } RPB_FUNCTION_2(S4_Message, METHOD(readJSONFromString), Rcpp::XPtr desc, std::string input) { #ifdef PROTOBUF_JSON_UTIL GPB::Message* message = PROTOTYPE(desc); if (!message) { Rcpp::stop("could not call factory->GetPrototype(desc)->New()"); } #if GOOGLE_PROTOBUF_VERSION < 4022000 GPB::util::Status status = GPB::util::JsonStringToMessage(input, message); #else absl::Status status = GPB::util::JsonStringToMessage(input, message); #endif if (!status.ok()) { Rcpp::stop(status.ToString().c_str()); } return (S4_Message(message)); #else Rcpp::stop( "The protobuf library you are using is too old for using JSON utility functions, " "please upgrade to version 3 or above."); #endif } RPB_FUNCTION_2(S4_Message, METHOD(readJSONFromConnection), Rcpp::XPtr desc, int conn_id) { #ifdef PROTOBUF_JSON_UTIL std::string json_string; RconnectionCopyingInputStream wrapper(conn_id); GPB::io::CopyingInputStreamAdaptor stream(&wrapper); const void* buffer; int size; while (stream.Next(&buffer, &size)) { json_string.append((char *) buffer, size); } if (wrapper.Failure()) { Rcpp::stop("Could not read JSON protocol buffer."); } /* create a prototype of the message we are going to read */ GPB::Message* message = PROTOTYPE(desc); if (!message) { Rcpp::stop("could not call factory->GetPrototype(desc)->New()"); } #if GOOGLE_PROTOBUF_VERSION < 4022000 GPB::util::Status status = GPB::util::JsonStringToMessage(json_string, message); #else absl::Status status = GPB::util::JsonStringToMessage(json_string, message); #endif if (!status.ok()) { Rcpp::stop(status.ToString().c_str()); } return (S4_Message(message)); #else Rcpp::stop( "The protobuf library you are using is too old for using JSON utility functions, " "please upgrade to version 3 or above."); #endif } RcppExport SEXP Descriptor_getField(SEXP pointer, SEXP name) { GPB::FieldDescriptor* field_desc = (GPB::FieldDescriptor*)0; BEGIN_RCPP std::string error_message = "could not get FieldDescriptor for field"; SEXP retVal = R_NilValue; switch (TYPEOF(name)) { case CHARSXP: case STRSXP: // This tries to get the field by name for various types of descriptors. retVal = do_dollar_Descriptor(pointer, name); if (retVal == R_NilValue) { error_message = "Unknown field"; } else { return retVal; } break; default: { error_message = "Invalid type for get field extractor."; break; } } if (!field_desc) { Rcpp::stop(error_message.c_str()); } return S4_FieldDescriptor(field_desc); VOID_END_RCPP return S4_FieldDescriptor(field_desc); } #undef METHOD } // namespace rprotobuf RProtoBuf/src/wrapper_ZeroCopyInputStream.cpp0000644000176200001440000000251212440004312021123 0ustar liggesusers// -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- #include "rprotobuf.h" namespace rprotobuf { SEXP ZeroCopyInputStream_Next(SEXP xp) { BEGIN_RCPP GPB::io::ZeroCopyInputStream* stream = GET_ZCIS(xp); int s = 0; const void* in; bool res = stream->Next(&in, &s); Rcpp::RawVector result; if (!res) { throw std::range_error("cannot read from stream"); } else { result.assign(reinterpret_cast(in), reinterpret_cast(in) + s); } return result; END_RCPP } SEXP ZeroCopyInputStream_BackUp(SEXP xp, SEXP size) { BEGIN_RCPP GPB::io::ZeroCopyInputStream* stream = GET_ZCIS(xp); int s = GET_int(size, 0); if (s <= 0) { Rf_error("can only BackUp with positive numbers"); } stream->BackUp(s); return R_NilValue; END_RCPP } SEXP ZeroCopyInputStream_Skip(SEXP xp, SEXP size) { BEGIN_RCPP GPB::io::ZeroCopyInputStream* stream = GET_ZCIS(xp); int s = GET_int(size, 0); bool res = stream->Skip(s); return (Rf_ScalarLogical(res ? _TRUE_ : _FALSE_)); END_RCPP } SEXP ZeroCopyInputStream_ByteCount(SEXP xp) { BEGIN_RCPP GPB::io::ZeroCopyInputStream* stream = GET_ZCIS(xp); return (Rf_ScalarReal((double)stream->ByteCount())); END_RCPP } } RProtoBuf/src/ConnectionCopyingInputStream.h0000644000176200001440000000122212440004312020703 0ustar liggesusers#ifndef RPROTOBUF_ConnectionCopyingInputStream_H #define RPROTOBUF_ConnectionCopyingInputStream_H namespace rprotobuf { class ConnectionCopyingInputStream : public GPB::io::CopyingInputStream { public: ConnectionCopyingInputStream(SEXP con); int Read(void* buffer, int size); private: /* the actual connection object from R it is protected by the external pointer that wraps the ConnectionInputStream, which is the only thing that uses this class, so we don't need to take care of GC here */ SEXP con; Rcpp::Function readBin; }; } // namespace rprotobuf #endif RProtoBuf/ChangeLog0000644000176200001440000032476615130732716013735 0ustar liggesusers2026-01-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.25 * configure.ac: Idem * configure: Idem * src/Makevars.*: Remove (explicit) C++17 standard setter * vignettes/*: Re-rerendered, now uses Rcpp::asis as driver * DESCRIPTION: Add 'VignetteBuilder: Rcpp' * vignettes/rmd/RProtoBuf-paper.bib: Refreshed some references * .github/workflows/*.yaml: Switch to actions/checkout@v6 2026-01-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date * src/rprotobuf.h: Include R_ext/ObjectTable.h under R 4.6.0 or later 2025-09-18 Dirk Eddelbuettel * .github/workflows/ci.yaml: Use r-ci with embedded bootstrap * .github/workflows/alpine.yaml: Switch to release 3.22 2025-03-31 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.24 * configure.ac: Idem * configure: Idem * src/init.c: Set EnumValueDescriptor_name declaration to two args 2025-03-16 Dirk Eddelbuettel * src/rprotobuf.h: Replace EXTPTR_PTR with R_ExternalPtrAddr * src/rprotobuf.cpp: Idem * src/mutators.cpp: Idem 2025-02-10 Mike Kruskal * R/00classes.R: Point to EnumValueDescriptor * src/init.c: Add bindings for EnumValueDescriptor::name 2025-01-14 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.23 * configure.ac: Idem * configure: Idem * inst/NEWS.Rd: Update one URL 2025-01-10 Dirk Eddelbuettel * configure.ac: Correct three possible bashisms * configure: Regenerated 2024-11-12 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date 2024-11-11 Lev Kandel * src/DescriptorPoolLookup.cpp: Compatibility with protobuf >= 6.30.0 * src/DescriptorPoolLookup.h: Idem * src/mutators.cpp: Idem * src/rprotobuf.cpp: Idem * src/rprotobuf.h: Idem * src/wrapper_Descriptor.cpp: Idem * src/wrapper_EnumDescriptor.cpp: Idem * src/wrapper_EnumValueDescriptor.cpp: Idem * src/wrapper_FieldDescriptor.cpp: Idem * src/wrapper_FileDescriptor.cpp: Idem * src/wrapper_Message.cpp: Idem * src/wrapper_MethodDescriptor.cpp: Idem * src/wrapper_ServiceDescriptor.cpp: Idem 2024-11-07 Dirk Eddelbuettel * DESCRIPTION (Authors@R): Added 2024-07-03 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date 2024-07-02 Matteo Gianella * src/RWarningErrorCollector.h: Code update also in case of protobuf version >= 26.x * src/RWarningErrorCollector.cpp: Idem * src/wrapper_Message: Idem 2024-05-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date 2024-05-28 Michael Chirico * R/extensions.R: Build error strings with stop(), avoiding paste() * src/init.c: Remove placeholders for unimplemented methods * R/00classes.R: Idem * R/field_count.R: Idem * R/wrapper_ServiceDescriptor.R: Idem 2024-05-24 Dirk Eddelbuettel * README.md: Use tinyverse.netlify.app for dependency badge 2024-04-23 Dirk Eddelbuettel * .github/workflows/ci.yaml (jobs): Update to actions/checkout@v4, add r-ci-setup actions 2024-03-20 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date 2024-03-20 Xufei Tan * inst/tinytest/test_addressbook.R: use `toTextFormat()` in tests 2024-01-20 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.22 * configure.ac: Idem * configure: Idem 2024-01-19 Dirk Eddelbuettel * src/Makevars.ucrt: Apply patch emailed by Tomas Kalibera to support pkg-config if present (as e.g. under upcoming Rtools) 2023-12-13 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.21 * configure.ac: Idem * configure: Idem 2023-12-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date * R/00classes.R: Tweak .Call() update some more * R/field_count.R: Idem * R/wrapper_ServiceDescriptor.R: Idem * README.md: Update / remove stale references to old ProtoBuf doc site * man/ArrayInputStream-class.Rd: Idem * man/ArrayOutputStream-class.Rd: Idem * man/Descriptor-class.Rd: Idem * man/EnumValueDescriptor-class.Rd: Idem * man/FileDescriptor-class.Rd: Idem * man/FileInputStream-class.Rd: Idem * man/FileOutputStream-class.Rd: Idem * man/Message-class.Rd: Idem * man/ZeroCopyInputStream-class.Rd: Idem * man/ZeroCopyOutputStream-class.Rd: Idem * man/swap.Rd: Idem * inst/tinytest/data/encoding.proto: Idem * inst/tinytest/test_serialize.R: Idem * vignettes/rmd/RProtoBuf-intro.Rmd: Idem * vignettes/rmd/RProtoBuf-quickref.Rmd: Idem 2023-12-09 Dirk Eddelbuettel * .github/workflows/alpine.yaml: Add container-based continuous integration test to permit test under newer Protocol Buffers * R/*.R: Update numerous .Call() to switch to unquoted expression given symbol registration of the compiled functions 2023-07-12 Matteo Gianella * src/RSourceTree.h: Code update also in case of protobuf version >= 22.x * src/RSourceTree.cpp: Idem * src/wrapper_Descriptor: Idem * src/wrapper_Message: Idem 2023-03-11 Dirk Eddelbuettel * src/Makevars.ucrt (CXX_STD): Also set C++17 here 2022-11-04 Dirk Eddelbuettel * .github/workflows/docker.yaml (jobs): Update different actions 2022-11-02 Dirk Eddelbuettel * DESCRIPTION (Version, Date): New release 0.4.20 * configure.ac: Idem * configure: Idem * src/init.c: Add two 'void' for proper prototypes pleasing clang-15 * .github/workflows/ci.yaml (jobs): Update to actions/checkout@v3 * .github/workflows/docker.yaml (name): Idem * inst/NEWS.Rd: Update on http:// to https:// * src/Makevars.in (CXX_STD): The compilation standard is now C++17 * src/Makevars.win (CXX_STD): Idem * DESCRIPTION (SystemRequirements): Stated updated requirement 2022-05-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): New release 0.4.19 * configure.ac: Idem * configure: Idem 2022-05-02 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version and date * src/mutators.cpp: Change seven string to std::string 2022-04-06 Michael Chirico * R/00classes.R: Additional tests and updated changes * R/debug_string.R: Idem * R/text_format.R: Idem * man/Message-class.Rd: Idem * inst/tinytest/test_message.R: Idem 2022-04-04 Dirk Eddelbuettel * src/wrapper_Message.cpp: Correct minor issue, reenable compilation * inst/tinytest/test_message.R: Park one test temporarily 2022-04-04 Michael Chirico * R/00classes.R: Expose TextFormat for Message->character conversion * R/debug_string.R: Idem * R/text_format.R: Idem * src/wrapper_Message.cpp: Idem * src/init.c: Idem * man/Message-class.Rd: Idem * inst/tinytest/test_message.R: Idem 2022-03-23 Dirk Eddelbuettel * R/internals.R (getProtobufLibVersion): If formatted result, return as 'package_version()' rather than just string; update .Call() * R/zzz.R (.onAttach): In interactive mode disply package and underlying library version on startup 2022-01-04 Dirk Eddelbuettel * DESCRIPTION (Description, SystemRequirements): Updated to state that version 3.3.0 from March 2017 or later is now needed 2021-12-27 Dirk Eddelbuettel * README.md: Remove unused continuous integration artifact and badge 2021-12-15 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.18 * man/*Rd: Update a number of URLs 2021-12-14 Dirk Eddelbuettel * DESCRIPTION (Version): Roll minor version and date * src/Makevars.ucrt: Applied patch by Tomas Kalibera that is part of his changes for the Windows utf8-enhabced ucrt3 builds of R 4.2.0 2021-10-10 Dirk Eddelbuettel * README.md: Update JSS article url to doi form per JSS request, switch to shorter https://doi.org/ base 2021-10-01 Dirk Eddelbuettel * .github/workflows/docker.yaml (on): Restrict Docker rebuilds to pushes to master branch 2021-09-26 Dirk Eddelbuettel * .github/workflows/docker.yaml: Add action to build and push containers with cron set to monthly schedule 2021-06-27 Jeroen Ooms * src/Makevars.win: Support UCRT build * src/Makevars.ucrt: Idem 2021-06-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * .editorconfig: Added 2021-06-10 Vitalie Spinu * R/debug_string.R: Support extra toJSON format arguments * R/00classes.R: Idem * src/wrapper_Message.cpp: Idem * src/init.c: Idem * man/Message-class.Rd: Document new parameters 2021-06-01 Dirk Eddelbuettel * DESCRIPTION (URL): Add package page to URL field 2021-01-09 Dirk Eddelbuettel * DESCRIPTION (Version): Roll minor version and date * DESCRIPTION (Imports): Remove RCurl used for rpc * NAMESPACE: Remove 'rpc' class and 'invoke' method * R/00classes.R: Comment-out removed class and method * deprecated/R/http.handler.R: Moved from R/ * deprecated/R/rpc.R: Idem * deprecated/man/RpcHTTP-class.Rd: Moved from man/ * deprecated/man/invokeLocally.Rd: Idem * .Rbuildignore: Added deprecated/ * .github/workflows/ci.yaml: Add CI runner using r-ci * README.md: Add new badge 2020-08-16 Dirk Eddelbuettel * README.md: Added JSS badge 2020-06-15 Dirk Eddelbuettel * .travis.yml: Switch to bionic, change to derive package and version 2020-05-28 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version 2020-05-28 Adam Cozzette * src/wrapper_ServiceDescriptor.cpp: Support FindMethodByName() taking std::string_view * src/RcppMacros.h: Idem 2020-03-26 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.17 * README.md: Add a last-commit badge 2020-03-21 Dirk Eddelbuettel * src/wrapper_Message.cpp: Condition use of ByteSizeLong on ProtoBuf version 3.6.0 or later to permit compilation on older systems * inst/tinytest/test_addressbook.R: Skip JSON tests if ProtoBuf 2.* * configure.ac: Extract version from DESCRIPTION via awk * configure: Regenerated 2020-03-19 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.16 * src/wrapper_Message.cpp: Switch to ByteSizeLong() to appease a clang warning on deprecated declarations * man/bytesize.Rd: Relax a comparison from identical() to all.equal() 2020-03-18 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * R/debug_string.R: Correct method argument * man/Message-class.Rd: Alias toJSON 2020-03-16 Siddhartha Bagaria * NAMESPACE: Add JSON parsing and printing support * R/00classes.R: Idem * R/completion.R: Idem * R/debug_string.R: Idem * R/read.R: Idem * inst/tinytest/test_addressbook.R: Idem * man/Message-class.Rd: Idem * man/readJSON.Rd: Idem * src/init.c: Idem * src/rprotobuf.h: Idem * src/wrapper_Descriptor.cpp: Idem * src/wrapper_Message.cpp: Idem 2020-02-08 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.15 2020-02-07 Dirk Eddelbuettel * vignettes/RProtoBuf-intro.Rnw: Wrapper around pre-made vignette * vignettes/RProtoBuf-paper.Rnw: Idem * vignettes/RProtoBuf-quickref.Rnw: Idem * DESCRIPTION (Suggests): Remove Suggests for RUnit, rmarkdown, knitr, pinp; (VignetteBuilder): Removed * docker/ci/Dockerfile: No longer install r-cran-runit * R/read.R: Always close connection in readASCII 2020-02-06 Dirk Eddelbuettel * DESCRIPTION (Suggests): Add tinytest * inst/tinytest/*: Converted from RUnit to tinytest * inst/unitTests/*: Idem * tests/tinytest.R: Idem * tests/doRUnit.R: Idem * docker/ci/Dockerfile: Add tinytest 2020-02-04 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version 2020-02-03 Dirk Eddelbuettel * src/wrapper_Message.cpp: Correct indexing for Message and Group 2019-06-30 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.14 * src/wrapper_Message.cpp: Add extra parens [g++ warning] 2019-06-27 Jeroen Ooms * Windows: Update to protobuf 3.8.0, add support for GCC 8+. 2018-11-30 Jarod G.R. Meng * src/wrapper_Message.cpp: Protect identical() against recursive messages 2018-11-26 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version 2018-11-26 Jarod G.R. Meng * R/identical.R: Add 'add.equal.Message' for Protocol Buffer message types to avoid the default method being called by unit test runners * NAMESPACE: Add S3 registration for new method 2018-11-03 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.13 2018-11-02 Dirk Eddelbuettel * tests/runUnitTests.R: Rewritten matching other packages * man/readASCII.Rd: Set examples to \dontrun{} as occasional error from a remaining open connection seen 2018-09-08 Dirk Eddelbuettel * .travis.yml: Rewritten to use rprotobuf/ci Docker container * docker/run/Dockerfile: Correction to Dockerfile 2018-09-07 Dirk Eddelbuettel * docker/run/Dockerfile: Added Dockerfile for deployment 2018-09-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * .Rbuildignore: Ignore GTAGS, GRTAGS, GPATH from GNU global * .gitignore: Idem * docker/ci/Dockerfile: Added Dockerfile for CI use 2018-09-06 Jeffrey Shen * R/rexp_obj.R: Refinement for POSIXlt treatment 2018-09-05 Jeffrey Shen * R/rexp_obj.R: Unclass POSIXlt before converting them * inst/unitTests/runit.serialize_pb.R: Unit test 2018-09-02 Dirk Eddelbuettel * .travis.yml: Enforce R version 3.4 for now as the PPA we need for the Protocol Buffers library has r-cran-* packages built for R 3.4 2018-07-25 Dirk Eddelbuettel * configure.ac: Set CXX and CXXFLAGS values by calling R to reflect values in Makeconf used by R [CRAN request] * configure: Idem 2018-07-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.12 2018-07-08 Dirk Eddelbuettel * src/wrapper_Message.cpp (rprotobuf): Properly reference std::vector (as noticed by Brian Ripley with protobuf 3.6) 2018-06-25 Jeroen Ooms * src/Makevars.win: update Windows build to protobuf v3.5.1 to support upcoming gcc-8 toolchain. 2018-05-21 Siddhartha Bagaria * src/DescriptorPoolLookup.cpp: New reset() function * src/DescriptorPoolLookup.h: Idem * src/RSourceTree.cpp: New directory removal function * src/RSourceTree.h: Idem * src/init.c: Register new resetDescriptorPool_cpp functions * src/rprotobuf.cpp: callable resetDescriptorPool_cpp() function * man/readProtoFiles.Rd: Added documentation * R/internals.R: Add R-callable resetDescriptorPool() * NAMESPACE: Corresponding export * inst/unitTests/data/cyclical/*: Unit test infrastructure * inst/unitTests/data/recursive/*: Idem * inst/unitTests/data/subdir/*: Idem * inst/unitTests/data/unittest.proto: Added proto definition * inst/unitTests/runit.import.R: New tests 2018-05-20 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * man/readProtoFiles.Rd: One minor correction, and some whitespace and indentation cleanups 2018-04-18 Dirk Eddelbuettel * vignettes/RProtoBuf-paper.Rnw: Two updates for OpenCPU 2018-01-19 Siddhartha Bagaria * R/internals.R: New function readProtoFiles2 to use directory argument along with pattern similar to protoc behavior; also add recursive argument to readProtoFiles * man/readProtoFiles.Rd: Documentation for readProtoFiles2 2017-11-20 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/unitTests/runit.serialize_pb.R: Added unit test 2017-11-20 Jeffrey Shen * R/rexp_obj.R: Added test to avoid infinite recursion if sub indexing list returns the list 2017-10-03 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.11 2017-10-02 Dirk Eddelbuettel * DESCRIPTION: Minor edit to suppress another NOTE from R CMD check * README.md: Idem 2017-10-01 Dirk Eddelbuettel * vignettes/RProtoBuf-intro.Rmd: Renamed, now uses Rmd via pinp * vignettes/RProtoBuf-quickref.Rmd: Idem * DESCRIPTION: Added pinp package, rolled minor version, use doi in Description * cleanup: Adjusted and updated * .travis.yml (install): Add r-cran-pinp 2017-08-26 Dirk Eddelbuettel * .travis.yml (before_install): Use https for curl fetch 2017-08-14 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/S4_classes.h: Initialize S4 base class in copy constructor for S4_ArrayOutputStream class 2017-08-13 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.10 * R/00classes.R: Correct one package= arg in .Call to PACKAGE as requested by CRAN * src/init.c: Corresponding change in Descriptor_getField registration * inst/unitTests/runit.import.R (test.import): Test failing import on package's own DESCRIPTION file rather than /etc/hosts 2017-08-01 Jeffrey Shen * R/rexp_obj.R: Check in deserializer if invalid class is set 2017-03-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.9 2017-03-05 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version and date * src/init.c (R_init_RProtoBuf): Call R_registerRoutines() and R_useDynamicSymbols() * NAMESPACE: Use .registration=TRUE on useDynLib * src/extensions.cpp (rprotobuf): Rename getExtension to getExtension_cpp to disambiguate from R function * src/rprotobuf.cpp (rprotobuf): Idem for readProtoFiles_cpp * R/00classes.R (.icall): Comment-out unused function (setMethod): Remove erroneous extra '...' from Message_clone arguments * R/clone.R (._clone.message): Add missing PACKAGE= argument to .Call * R/extensions.R: Idem * R/has.R (._has_enum_name): Idem * R/internals.R (readProtoFiles): Idem * R/merge.R: Idem * R/with.R (generateActiveBindings): Idem * R/has.R (._has_enum_name): Use PACKAGE= in .Call() 2017-02-26 David Kretch * vignettes/RProtoBuf-intro.Rnw: Several small corrections 2017-01-19 Dirk Eddelbuettel * configure.ac: Renamed from configure.in, minor edit 2017-01-18 Dirk Eddelbuettel * configure.in: Updated and simplified in a few places as we no longer need m4 macros for C++0x or Rscript for Rcpp library query * configure: Re-generated accordingly * src/Makevars.in: Set CXX_STD=CXX11 * m4/m4-ax_cxx_compile_stdcxx_0x.m4: Removed * cleanup: remove autoconf cache 2017-01-17 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Relase 0.4.8 2017-01-16 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version and date * tools/winlibs.R: Use proto3 library from rwinlib repo * src/Makevars.win: Update to proto 3.0.0 paths * inst/unitTests/runit.proto3.R: New test file * inst/unitTests/data/proto3.proto: Support for new test file 2016-10-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.4.7 2016-10-24 Dirk Eddelbuettel * DESCRIPTION (Version): Roll minor version and date * src/lookup.cpp: Replace omegahat.org with omagehat.net * vignettes/RProtoBuf-paper.bib: Ditto 2016-09-09 Dirk Eddelbuettel * DESCRIPTION (Version, Date): New release 0.4.6 * README.md: Expanded, added three short sections 2016-09-08 Dirk Eddelbuettel * inst/NEWS.Rd: Ditto, also replace \cpkg{} with \CRANpkg{} * README.md: Use https for CRAN URL 2016-09-06 Dirk Eddelbuettel * vignettes/RProtoBuf-paper.Rnw: Comment-out the use of the \DOI macro from (updated) jss.cls: cannot ship jss.cls (or R will warn) and cannot use \DOI as (as R-release and older do not know \DOI) 2016-09-01 Dirk Eddelbuettel [ Entry for anonymous PR #18 by 'oliverbock' ] * R/rexp_obj.R (unrexp_string): Ensure zero-length strings can be serialized; special case of native encoding for S4 objects * inst/unitTests/runit.serialize_pb.R: New tests 2016-08-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): New release 0.4.5 2016-08-16 Dirk Eddelbuettel * DESCRIPTION (SystemRequirements): Add explicit note that Protocol Buffers 3.0.0 are supported as well 2016-08-15 Dirk Eddelbuettel * DESCRIPTION (Version): Rolling minor version * inst/proto/addressbook.proto: Added 'syntax = "proto2";' * inst/proto/helloworld.proto: Idem * inst/proto/rexp.proto: Idem * inst/unitTests/data/bytes.proto: Idem * inst/unitTests/data/encoding.proto: Idem * inst/unitTests/data/nested.proto: Idem * inst/unitTests/data/unittest.proto: Idem * inst/unitTests/data/unittest_import.proto: Idem * vignettes/proto/int64.proto: Idem * inst/unitTests/runit.addressbook.R (test.ascii): Comment-out one sub-test concerned with access under bad file modes 2016-08-13 Dirk Eddelbuettel * .travis.yml: Switch to using run.sh for Travis CI, also switch to using a build matrix across ProtoBuf versions 2 and 3 2016-07-19 Craig Radcliffe * configure.in: Make sure that CXXFLAGS is from the environment when writing to src/Makevars 2016-07-10 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.4.4 * vignettes/RProtoBuf-paper.Rnw: Added, based on pending JSS publication * vignettes/RProtoBuf-paper.bib: Ditto * vignettes/figures/*: Ditto * vignettes/proto/*: Ditto * vignettes/jss.cls: Ditto * vignettes/jss.bst: Ditto * inst/CITATION: Update to version provided by JSS * README.md: Updated to use of canonical URLs for CRAN 2016-05-19 Dirk Eddelbuettel * vignettes/RProtoBuf-unitTests.Rnw: Do not write unit test results to /tmp per request from CRAN to not write outside test directories 2016-04-26 Dirk Eddelbuettel * CONTRIBUTING.md: New workflow document 2016-04-25 Jeroen Ooms * R/rexp_obj.R: Fix zero-length edge case * R/serialize_pb.R: Improved documentation * man/serialize_pb.Rd: Ditto 2016-04-21 Jeroen Ooms * src/Makevars.win: Accomodate new Windows toolchain 2016-04-21 Jonathon Love * inst/unitTests/runit.addressbook.R: Set to mode 0644 * inst/unitTests/runit.bytes.R: Ditto 2016-02-11 Dirk Eddelbuettel * DESCRIPTION (License): Set to GPL (>= 2) which is what the code files with actual copyright and license headers had all along * README.md: Idem 2015-08-25 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.4.3 2015-08-24 Dirk Eddelbuettel * README.md: Additional badges * inst/unitTests/runit.FieldDescriptor.R: Added msg field 2015-08-23 Dirk Eddelbuettel * tools/winlibs.R: Actually tests against R 3.3.0 2015-08-23 Jeroen Ooms * tools/winlibs.R: Test for R 3.3.0 on Windows 2015-08-23 Dirk Eddelbuettel * NAMESPACE: Added imports for as and is from methods * DESCRIPTION: Removed several of the (largely redundant) URLs, and minor edits in Description: to update to current standard * man/RProtoBuf-package.Rd: Updated, removed old URLs. * .travis.yml: Accelerate by installing dependencies via apt-get 2015-08-05 Balasubramanian Narasimhan * NAMESPACE: Added import for show from methods package 2015-07-08 Jeroen Ooms * tools/winlibs.R: Update URL to windows build of the required ProtoBuf library 2015-01-16 Dirk Eddelbuettel * DESCRIPTION: Minor edits 2015-01-16 Jeroen Ooms * DESCRIPTION: Make SystemRequirements: more explicit 2014-12-11 Jeroen Ooms * DESCRIPTION: Update URLs 2014-12-10 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.4.2 2014-12-10 Jeroen Ooms * src/Makevars.win: Use new ProtoBuf 2.6.1 builds on Windows * tools/winlibs.R: Helper function used for Windows build * inst/unitTests/runit.int64.R: Fixed a windows bug 2014-12-08 Jeroen Ooms * inst/proto/rexp.proto: Add a new type 'native' * R/rexp_obj.R: Modify (un)serialize_pb to serialize() non-data types as 'native' types 2014-12-04 Dirk Eddelbuettel * .travis.yml: Added after move to GitHub * README.md: Added minimal first version with Travis badge 2014-12-04 Murray Stokely * inst/unitTests/runit.int64.R: restore options on exit from this function to make the test indempotent. 2014-12-01 Dirk Eddelbuettel * man/Message-class.Rd: Completed documentation * man/Descriptor-class.Rd: Ditto * man/EnumDescriptor-class.Rd: Ditto 2014-12-01 Murray Stokely * R/wrapper_ZeroCopyInputStream.R: Avoid file.create for getting absolute path of a temporary file name (JSS reviewer feedback) * R/serialize.R: Idem. 2014-11-26 Murray Stokely Address feedback from anonymous reviewer for JSS to make this package more complete: * inst/unitTests/runit.serialize_pb.R: Add a test to verify that we can serialize all 100+ built-in datasets with R and get an identical object to the original once unserialized. * R/rexp_obj.R: Serialize function, language, and environment objects by just falling back to R's native serialization and using raw bytes to store them. This at least lets us round-trip encode all native R types, even though these three only make sense in the context of R. Greatly simplify the can_serialize_pb function. * inst/proto/rexp.proto: Add support for function, language, and environment objects. 2014-11-25 Dirk Eddelbuettel * vignettes/RProtoBuf-intro.Rnw: Applied a few corrections spotted by Tim Hesterberg and communicated in email. 2014-11-24 Murray Stokely * inst/unitTests/runit.golden.message.R: remove trailing whitespace. * man/P.Rd: Improve output of example. 2014-09-15 Murray Stokely Address feedback from anonymous reviewers for our Journal of Statistical Software submission: * src/wrapper_EnumDescriptor.cpp (rprotobuf): Correct the definition of as.list for EnumDescriptors to return a proper list instead of a named vector. * man/aslist.Rd: clarify order of returned list for descriptor objects. * NAMESPACE: add names as exported method. * R/00classes.R (show): Update the default print methods to use cat() with fill=TRUE instead of show() to eliminate the confusing [1] since the classes in RProtoBuf are not vectorized. * Make Descriptor and EnumDescriptor objects subsettable with "[[". * Add length() method for Descriptor objects. * Add names() method for Message, Descriptor, and EnumDescriptor objects. * inst/unitTests/runit.enums.R (test.enums): Add test of subsetting an EnumDescriptor object. * inst/unitTests/runit.descriptors.R (test.descriptor): Add test for subsetting of descriptor objects. * DESCRIPTION (Version): Increment. 2014-04-02 Murray Stokely Two patches from Karl Millar : * src/S4_classes.h (rprotobuf): Change handling of S4_EnumDescriptor when passed a NULL pointer to just create empty object with empty name and full_name rather than setting to R_NilValue. * src/wrapper_EnumDescriptor.cpp (rprotobuf): Change return value of getValue* functions on EnumDescriptor and return an EnumValueDescriptor or R_NilValue on failure. 2014-04-01 Murray Stokely * tests/runUnitTests.R: Add improved checks to ensure R CMD CHECK fails if there are any errors in the tests, not just failures. 2014-03-25 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.4.1 2014-03-24 Murray Stokely * inst/unitTests/runit.int64.R (test.int64): Check Rcpp:::capabilities() to ensure we have long long support in Rcpp before trying to run the 64-bit integer tests. * inst/unitTests/data/unittest.proto: Comment out TestEnumWithDupValue. This causes problems with the newest libprotobuf-2.5 which now wants an option to be specified to enable enum aliasing like this. * configure.in: if we can't find the libproto headers with the default CPPFLAGS/CXXFLAGS, manually add /usr/local/include and try again. 2014-03-10 Murray Stokely * src/DescriptorPoolLookup.cpp (rprotobuf): Import all top-level enums defined in an imported .proto file. * src/rprotobuf.cpp (rprotobuf): Add a function to get the enum descriptor associated with a named enum. * inst/unitTests/runit.enums.R (test.enums): Test that we import top-level enums from .proto files correctly. * R/00classes.R (P): Correct a bug in the show() method for EnumDescriptor that prevented useful output in some contexts. 2014-02-21 Murray Stokely * inst/unitTests/runit.messages.R (test.message): Add a test for the deprecated group feature which works fine with RProtoBuf. The type is converted to lower case, which users often forget. * vignettes/RProtoBuf-intro.Rnw (subsection{Deprecated Feature: Protocol Buffer Groups}): document groups. * inst/CITATION: Add a manual CITATION file pointing to the preprint on arxiv.org in addition to the normal auto-generated citation(). 2014-01-19 Dirk Eddelbuettel * DESCRIPTION: Finalize release 0.4.0 with initial Windows support * src/S4_classes.h: Adapt to S4 access function renaming in Rcpp 0.10.7 and later, with special thanks to Kevin Ushey 2014-01-13 Murray Stokely * inst/unitTests/runit.int64.R (test.int64): Skip this test with a warning if running on a machine with sizeof(long long) < 8. * vignettes/RProtoBuf-intro.Rnw (subsection{64-bit integer issues}): Hide 64-bit field accesses with if conditional to avoid running code that won't work on platforms without 64-bit long longs. * DESCRIPTION (Version): Increment to 0.4.0 2014-01-09 Murray Stokely * R/read.R: Add a logical argument 'partial' to readASCII that accepts uninitialized message fragments. * src/wrapper_Descriptor.cpp (rprotobuf): Idem * inst/unitTests/runit.addressbook.R (test.ascii): Add tests for above. 2014-01-04 Murray Stokely * R/wrapper_CodedInputStream.R: Accept numeric size arguments for ReadRaw and ReadString to make this more user friendly for interactive use by calling as.integer() as needed. * R/00classes.R (P): Add missing object prameters in ZeroCopyInputStream calls to ReadRaw and ReadString. * inst/unitTests/data/encoding.proto: Add example messages used in the encoding documentation. * inst/unitTests/runit.serialize.R (test.encoding): Add tests verifying the exact byte serialization as described in the encoding documentation. (test.arrayinputstream): Add new test of ArrayInputStreams. * src/wrapper_ZeroCopyInputStream.cpp (rprotobuf): Add BEGIN/END_RCPP macros to gracefully catch exceptions and return them as R language errors. * src/streams.cpp (rprotobuf): Idem. * man/ArrayInputStream-class.Rd: Add some examples of using ArrayInputStream. 2014-01-04 Dirk Eddelbuettel * src: Deprecate files SocketCopyingInputStream.{cpp,h}, sisocks.h as the current RProtoBuf design does not provide networking capabilities 2013-12-31 Murray Stokely * src/wrapper_Message.cpp: Fix type coercion bug in add() method for uint32s and add a missing break statement that erroneously raised an error when setting some int64 fields. Make more function arguments const and remove a superfluous BEGIN_RCPP/END_RCPP. Also add comment about long-vector support. All of these fixes were highlighted by Flexelint. * inst/unitTests/runit.int64.R (test.int64): Add tests for above. * inst/unitTests/runit.extremevalues.R (test.uint32): Idem. * src/wrapper_FieldDescriptor.cpp (RPB_HANDLE_CASE): Remove unreachable statement in a macro. * src/wrapper_Descriptor.cpp (rprotobuf): Remove unused variable, rename another variable for clarity, and add some TODOs. * src/wrapper_FileDescriptor.cpp (rprotobuf): Idem. * src/DescriptorPoolLookup.cpp (rprotobuf): Remove unreachable statement. * src/extensions.cpp: Remove unused header. * src/mutators.cpp (rprotobuf): Update code to check for Long vectors and use the safer R_xlen_t type everywhere. Protocol Buffers repeated fields seem to be limited to int size indices as with normal R vectors. * src/rprotobuf.h: Idem 2013-12-30 Murray Stokely * inst/unitTests/runit.extremevalues.R (test.uint32): Add test verifying that we can store 2^32 - 1 properly in repeated or optional protobuf fields. * src/extractors.cpp (rprotobuf): Correct handling of uint32 for repeated fields. * src/wrapper_Message.cpp (rprotobuf): Remove Rf_error in favor of Rcpp_error so that we throw an exception and unwind the stack to deallocate objects before jumping to R's error. * src/DescriptorPoolLookup.cpp (rprotobuf): Idem. * R/size.R: Correct an incorrect method name that prevented size<- from working. * man/size.Rd: Document the behavior of size<- * (C++): Ran all the C++ files and most of the headers through clang-format as described in the STYLE file on R-Forge. Basically, we now use 4-char indents and 100-char limit for line wrap. 2013-12-28 Murray Stokely * src/extractors.cpp (rprotobuf): Correct handling of uint32 for single values greater than 2^31 by returning as R numeric types to avoid losing precision since R doesn't have unsigned int types but C++ does. Works around an Rcpp bug https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1360&group_id=155&atid=637 2013-12-27 Murray Stokely * src/mutators.cpp: Refactor setMessageField into four separate functions, correct a few minor typos, and wrap everything in a try/catch block so we catch any exceptions generated by Rcpp::as or other functions and forward it along to an R-language stop() error instead of terminating our R instance. * src/mutators.cpp (rprotobuf): Add more helpful error message specifying which element of a list is of the wrong type, and what the expected type is, when setting a list of messages. * inst/unitTests/runit.messages.R (test.message): Add unit tests for our handling of setting repeated message fields. * src/wrapper_Message.cpp: Add const qualifier to field_desc throughout file. * src/exceptions.cpp: Remove ancient exceptions handling code, migrate codebase to use standard exception classes and helper functions from Rcpp. * R/exceptions.R (throw): idem. 2013-12-26 Murray Stokely * src/mutators.cpp: Support setting int32 values with character vectors of a decimal number, as we do by necessity for int64s. Also, refuse to set non-repeated bools to NA, just as we do for repeated bool fields by raising a stop() error since protocol buffer bools are 2-valued and NA is the third-value of R bools. * inst/unitTests/runit.int32.R (test.int32): Add tests for above. * NAMESPACE: Add missing export for .DollarNames EnumValueDescriptor to allow completion on that class. * R/00classes.R: Update FileDescriptor '$' dispatch to work properly for the names of fields defined in the FileDescriptor, instead of just returning NULL even for types returned by $ completion. * vignettes/RProtoBuf-intro.Rnw (subsubsection{Retrieve fields}): Update the type mapping tables to note that characters can be extracted from 64-bit integer types with the RProtoBuf.int64AsString type and note that int32 and int64 types can be set to character values representing decimal numbers. * TODO: Update todo list. * inst/unitTests/runit.bool.R (test.bool): Add more tests about boolean values, NA handling, etc. 2013-12-23 Murray Stokely * DESCRIPTION (Version): increment. * inst/proto/addressbook.proto: Reserved extension fields in tutorial.Person. * vignettes/RProtoBuf-intro.Rnw (subsection{Extensions}): Added a new section documenting protocol buffer extensions. 2013-12-20 Murray Stokely * R/00classes.R: Correct a bug that incorrectly dispatched as.character() when as.list() was called on Descriptor objects. 2013-12-18 Murray Stokely * R/completion.R (.DollarNames.EnumValueDescriptor): Add $-completion for EnumValueDescriptor and FileDescriptor classes as with other S4 RProtoBuf classes here. * R/00classes.R (P): Ensure that the FileDescriptor $name() method accepts a boolean for full paths just like the generic name() method. * R/wrapper_EnumDescriptor.R: Add better error checking. Expect exceptions if wrong types are provided for arguments rather than just returning NULL. 2013-12-18 Dirk Eddelbuettel * vignettes/RProtoBuf-intro.Rnw: Use with vignette builder * vignettes/RProtoBuf-quickref.Rnw: Idem * vignettes/RProtoBuf-unitTests.Rnw: Rewritten / simplified * DESCRIPTION: Increased dependency to R (>= 3.0.0) * configure.in: No longer create vignettes/Makefile 2013-12-17 Murray Stokely * R/completion.R (.DollarNames.Message): Add missing methods to dollar completion list for Message and Descriptor objects * vignettes/RProtoBuf/RProtoBuf.Rnw (subsection{messages}): Add missing methods to Table 2 (Messages) and add a table and new sections of methods for Descriptor objects. 2013-12-16 Dirk Eddelbuettel * src/rprotobuf.h (RCPP_ENUM_TRAITS): Don't use extern "C" on internal functions returning atomistic or C++ types 2013-12-15 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.3.2 * tests/runUnitTests.R: Minor rewrite and cleanup from doRUnit.R with a tip of the hat to Murray's version in his HistogramTools package 2013-12-14 Dirk Eddelbuettel * src/lookup.cpp (rprotobuf): Descrictor pools attached directly * R/lookup.R (attachDescriptorPool): No longer attach them here * src/rprotobuf.h: Updated function declaration 2013-12-14 Murray Stokely * src/mutators.cpp (rprotobuf): Fix a bug which incorrectly prevented users from setting raw non-repeated fields under some circumstances. * inst/unitTests/runit.bytes.R (test.all): Verify raw(10) can be set to required bytes fields to verify correct behavior for use case mentioned on rprotobuf-yada list. 2013-11-13 Murray Stokely * R/extensions.R: Give a user friendly error message if someone tries to set an extension to a message of the wrong type instead of causing a C++ check failure that terminates your R session. * inst/unitTests/runit.extensions.R (test.extension): Add test. 2013-10-23 Murray Stokely * src/lookup.cpp (rprotobuf): Remove stop() error in object table assignment as this was causing errors with the '<<-' operator in any code using RProtoBuf. * inst/unitTests/runit.import.R (test.assign.in.global): Add a test for the above. 2013-09-16 Murray Stokely * DESCRIPTION (Version): Increment to 0.3.1.1. * R/00classes.R: Improve show method for EnumValueDescriptor and add enum_type to '$' dispatch. * man/EnumValueDescriptor-class.Rd: Add examples and document missing methods. * src/wrapper_EnumValueDescriptor.cpp (rprotobuf): Add missing enum_type method. * inst/unitTests/runit.enums.R (test.enums): Add more tests. 2013-09-13 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.3.1 2013-09-13 Murray Stokely * vignettes/Makefile.in: Update configure to output R_HOME to the vignette makefile so we can avoid the use of a non-portable GNU makefile extension here. 2013-09-12 Murray Stokely * src/RcppMacros.h: Add Rcpp compatibility macros which are simplified versions of the now deprecated ones from Rcpp. 2013-09-11 Murray Stokely * configure.in: If pkg-config is not available add -lprotobuf to PKG_LIBS. This makes it easier to install on MacOS X 10.8, for example. 2013-09-06 Murray Stokely * src/rprotobuf.cpp (rprotobuf): Include the name of the field that could not be found in exceptions in getFieldDescriptor (errors from update / new, etc.). 2013-09-03 Murray Stokely * inst/NEWS.Rd: Summarize changes since the last release. * vignettes/RProtoBuf/RProtoBuf.Rnw: Add a new section on 64-bit issues, document the RProtoBuf.int64AsString option, break out the 'other approaches' section from the 'future work', and fix a few typos. 2013-08-30 Dirk Eddelbuettel * NAMESPACE: Import 'file_path_as_absolute' from package tools, and the two functions needed from the RCurl package * R/*R: Updated several files which no longer need 'tools:::' prefix * DESCRIPTION: Updated Depends: and Imports accordingly 2013-08-29 Murray Stokely * R/zzz.R (.onLoad): Rename option controlling int64 handling with package name prefix. * inst/unitTests/runit.int64.R (test.int64): Idem * src/extractors.cpp (rprotobuf): Add templated function to reduce code duplication in last changelist. * src/mutators.cpp (rprotobuf): Idem 2013-08-27 Murray Stokely * src/extractors.cpp (rprotobuf): Add support for a new option("int64AsString") that controls whether extractors for 64-bit integer fields return character strings or use Rcpp's default wrap type which coerces to numeric, possibly losing precision. * R/zzz.R (.onLoad): Initialize options("int64AsString" = FALSE). * src/Rcppsupport.h (rprotobuf): Add RepeatedFieldImporter classes for int64 and uint64 that return strings instead of int64s. * src/mutators.cpp (rprotobuf): Add support for setting int64 fields as R character vectors that are converted to int64 or uint64 C++ types with std::stringstream. This allows the user to get around the lack of 64-bit integer support in R when working interactively with RProtoBufs where a large precision number or identifier needs to be stored. * inst/unitTests/runit.int64.R: Add tests for the above. 2013-08-21 Murray Stokely * inst/unitTests/runit.addressbook.R (test.ascii): Add more tests. * src/wrapper_Descriptor.cpp (rprotobuf): Add better error handling for readASCII of text strings rather than returning an empty proto. * R/extensions.R: Add checks to ensure that a valid extension FieldDescriptor is passed to getExtension and setExtension. * inst/unitTests/runit.int64.R (test.int64): Add a test illustrating how RProtoBuf is broken in handling 64-bit integers (commented out for now). * man/P.Rd: Document behavior for extensions. * inst/unitTests/runit.extensions.R (test.extension): Add more tests. * src/wrapper_Message.cpp (rprotobuf): Add function for returning the number of extensions set in this message, to improve show() output. * src/rprotobuf.cpp (rprotobuf): Add support for looking up extensions by name and returning FieldDescriptors. * R/00classes.R (P): Add support for returning extension descriptors. 2013-07-14 Dirk Eddelbuettel * inst/unitTests/runit.extensions.R (test.extension): Comment-out test for setExtension against enum, at least for now * vignettes/RProtoBuf/RProtoBuf.Rnw: Added Murray to Authors, at last * vignettes/RProtoBuf-unitTests.Rnw: Idem * vignettes/RProtoBuf-quickref/RProtoBuf-quickref.Rnw: Idem 2013-07-13 Murray Stokely * inst/NEWS.Rd: Summarize new features since the last CRAN release last year. * DESCRIPTION: Increment version to 0.3. 2013-07-13 Dirk Eddelbuettel * man/Message-class.Rd: Added \alias entries for getExtension and setExtension * DESCRIPTION: Incremented Version to separate current test builds from previous release * DESCRIPTION: Removed 'MinimumLibProtoVersion: 2002000' which we no longer need as that version of Protocol Buffers was released a rather long time ago * R/zzz.R: Check for minimal version is now commented-out 2013-07-12 Murray Stokely * src/extensions.cpp: Replace custom extractor and mutator with call to existing functions in mutators.cpp and extractors.cpp that can be used for extensions and any other field type. * src/extensions.R: Idem * vignettes/RProtoBuf/RProtoBuf.Rnw: Document getExtension, setExtension methods. * man/Message-class.Rd: Idem * src/rprotobuf.h: Remove unused desc argument to extractFieldAsSEXP. * src/extractors.cpp: Idem * inst/unitTests/runit.extensions.R: Add additional tests for nested enum and message type extensions. 2013-07-11 Murray Stokely * R/extensions.R: Implement getExtension, setExtension methods. * src/extensions.cpp: Implement getExtension, setExtension. * R/set.R: Add a TODO noting these functions are undocumented. * R/00classes.R: Add setExtension, getExtension extractors for message objects. * R/completion.R: Add setExtension, getExtension. * NAMESPACE: Add setExtension, getExtension. * src/DescriptorPoolLookup.cpp: Add top-level extensions to descriptor pool. * src/rprotobuf.h: Add helper function for getting field descriptor objects. * src/wrapper_FileDescriptor.cpp: Add support for extensions to getMemberNames and as_list * src/lookup.cpp: Add support for looking up extensions. * inst/unitTests/runit.extensions.R: Add basic test for the above. 2013-07-10 Murray Stokely * man/aslist.Rd: Document behavior for enum and file descriptors and be more sparing with \dontrun in examples. * man/EnumDescriptor-class.Rd: Be more sparing with \dontrun in examples so we run more test code. * man/add.Rd: Idem * man/clone.Rd: Idem * man/Descriptor-class.Rd: Idem * man/FieldDescriptor-class.Rd: Idem * man/FileDescriptor-class.Rd: Idem * man/is_extension.Rd: Idem * man/label.Rd: Idem * man/Message-class.Rd: Idem * man/number.Rd: Idem * man/P.Rd: Idem * man/readProtoFiles.Rd: Idem * man/type.Rd: Idem * man/with.Rd: Idem * man/RProtoBuf-package.Rd: Idem 2013-07-08 Murray Stokely * R/has.R: add a has method for EnumDescriptor objects to return a logical indicating if the named constant exists or not. * R/00classes.R: fix a typo that prevented the length method from working properly for EnumDescriptor objects. Use this functionality to add the number of constants in the show method for EnumDescriptors. * R/wrapper_EnumValueDescriptor.R: add a number method to return the numeric value of this enum constant. * man/has.Rd: Add example of the above. * man/number.Rd: Add example of the above. * man/EnumDescriptor-class.Rd: Add example of the above. * man/EnumValueDescriptor-class.Rd: Add example of the above. 2013-02-21 Murray Stokely * R/00classes.R: add filename and package slots to FileDescriptor S4 class and provide more user-friendly show() methods for Messages and FileDescriptors that provide more context about the contained data. * src/S4_classes.h: populate package and filename slots when a FileDescriptor is created based on fields from the underlying C++ object. * inst/unitTests/runit.addressbook.R: add a basic test for FileDescriptors. * man/FileDescriptor-class.Rd: document the new slots in FileDescriptor and add examples. 2012-10-03 Murray Stokely * src/mutators.cpp (rprotobuf): Fix bug where LENGTH() is used on non-vectors when setting a repeated message field to a single Message object. This caused non-deterministic behavior after memory was read from a random location. * inst/unitTests/runit.golden.message.R (test.repeatedFields): Add tests for this case. 2012-09-25 Dirk Eddelbuettel * man/is_extension.Rd: Use \dontrun on examples as we cannot reload the same proto file twice * man/label.Rd: Idem * man/number.Rd: Idem * man/type.Rd: Idem 2012-09-24 Murray Stokely * R/has.R: Distinguish between non-existant and not-set fields in a message by returning NULL in the former case. * R/00classes.R: Idem * src/wrapper_Message.cpp (rprotobuf): Idem * inst/unitTests/runit.golden.message.R (test.has): Add test. * man/has.Rd: Add example of the above. 2012-09-21 Murray Stokely * Fix a bug causing segfaults in containing_type(). * R/containing_type.R: Return NULL instead of invalid descriptors when there is no containing type for an object. * src/S4_classes.h: Check for NULL pointers in the contructors for S4_Descriptor and S4_EnumDescriptor as these methods are called on the return value of e.g. containing_type() in the protobuf API without checking the return alue. * man/containing_type-methods.Rd: Add examples section showing cases where there is and is not a containing_type. * inst/unitTests/runit.FieldDescriptor.R (test.FieldDescriptor.class): Add tests for the above. 2012-08-21 Murray Stokely * src/mutators.cpp: Add better input checking when setting an optional field to avoid an uncaught exception that would kill the R session, and add a test. * inst/unitTests/runit.golden.message.R (test.invalidAssignments): Add test for this. 2012-08-18 Dirk Eddelbuettel * Applied two more patches by Murray and Karl: - Make readASCII() more robust to error conditions; adds tests to catch them. - Correct type(), cpp_type(), and label() methods when as.string=TRUE; add unit tests for these methods, add examples to the Rd files for these methods, and adds type and cpp_type to the NAMESPACE file where they were previously absent. 2012-08-09 Dirk Eddelbuettel * Applied two more patches by Murray: - R/wrapper_FieldDescriptor.R: correct more '_' and '__' mismatches - man/*: update manual pages for style, add examples - src/mutators.cpp: fix bug in handling of NA in boolean vectors - inst/unitTests/runit.golden.message.R: add unit test 2012-08-08 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.5 * src/mutators.cpp: Applied patch by Murray to correctly deal with nested protocol buffer definitions * inst/unitTests/runit.nested.R: Added test from Murray * inst/unitTests/data/nested.proto: Nested protbuf def from Murray * R/serialize.R: Added patch by Murray to not serialize uninitalized protocol buffers (with missing required fields) * inst/unitTests/runit.serialize.R: Added tests for this * /man/add.Rd: Add patch by Murray for stylistic improvement and added examples * inst/NEWS.Rd: Converted NEWS file to .Rd format * DESCRIPTION: Changed Maintainer: to single person per CRAN Policy * vignettes/: Moved from inst/doc/ per CRAN Policy 2012-05-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.4 * R/zzz.R (.onLoad): pass lib.loc=libname to readProtoFiles * R/internals.R (readProtoFiles): use lib.loc argument * man/readProtoFiles.Rd: Document new lib.loc argument 2012-05-14 Dirk Eddelbuettel * R/lookup.R: comment-out unlockBinding() which R CMD check does not like as it turns out that we do not need it here anyway * inst/unitTests/runit.addressbook.R (test.ascii): Small correction by converting to character before comparing * DESCRIPTION: Remove Depends: on int64 which is no longer used, lower Depends: on Rcpp to 0.9.6 which should be sufficient 2012-05-13 Dirk Eddelbuettel * src/rprotobuf.h: Added '#include ' to make g++-4.7 happy * src/*: Reversed out SVN revisions 426 to 434 related to int64 2012-04-07 Dirk Eddelbuettel * R/zzz.R: Add 'lib.loc=libname' to packageDescription() call as requested by Brian Ripley 2012-03-20 Dirk Eddelbuettel * Applied another patch by Murray: - src/mutators.cpp: Deal with case of repeated strings - inst/unitTests/runit.golden.message.R: test for this case 2011-07-17 Dirk Eddelbuettel * Applied another patch by Murray: - src/wrapper_Descriptor.cpp: Add missing readASCIIFromConnection C++ function that was called in read.R but not defined. - R/read.R: Remove an _ in the readASCII C++ functions to match the naming convention of the other nearby functions. - man/readASCII.Rd: Add examples of ascii export/import of messages. - inst/unitTests/runit.addressbook.R: Add tests of ascii export/import of messages. 2011-07-07 Dirk Eddelbuettel * src/wrapper_FileDescriptor.cpp (rprotobuf): Applied patch by Murray to correct a cut & paste error in variable name 2011-04-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.3 2011-04-10 Dirk Eddelbuettel * src/extractors.cpp: Protect UINT64 and INT64 inside of #ifdef test for RCPP_HAS_LONG_LONG_TYPES which we now need for g++ 4.5 or later * src/mutators.cpp: Idem * wrapper_FieldDescriptor.cpp: Idem 2011-04-05 Dirk Eddelbuettel * inst/doc/Makefile: Call R and Rscript relative to R_HOME/bin 2011-04-04 Dirk Eddelbuettel * inst/doc/Makefile: Do not call clean in all target 2011-01-12 Dirk Eddelbuettel * R/with.R: Use envir= argument to eval() 2011-01-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.2 * inst/THANKS: Added new file to say Thanks! 2011-01-10 Dirk Eddelbuettel * Applied another patch by Murray Stokely providing: - R/internals.R: generalise readProtoFiles() adding 'pattern' arg - man/readProtoFiles.Rd: documenting new 'pattern' argument - src/DescriptorPoolLookup.cpp: enhanced error message - inst/unitTests/runit.golden.message.R: new unit test for repeated fields fixed (which was issue addressed earlier) - inst/runit.import.R: new unit test for non-existing file 2011-01-07 Dirk Eddelbuettel * Applied patch by Murray Stokely providing all the following: - src/S4_classes.h: new 'name' and 'full_name' slots - R/00classes.R: idem - R/wrapper_EnumDescriptor.R: fix typo now permitting function call - src/wrapper_EnumDescriptor.cpp: add a bounds check - src/wrapper_EnumValueDescriptor.cpp: add a new name method - inst/unitTests/runit.enums.R: add new unit test * man/EnumValueDescriptor-class.Rd: Add documentation for name and full_name 2010-10-20 Dirk Eddelbuettel * inst/doc/Makefile: do not remove the pdf in 'clean' * inst/unitTests/runit.addressbook.R: stick 'book' into global env. 2010-10-18 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.1 * ChangeLog: moved from inst/ * inst/NEWS: moved from top-level to that it gets installed with package 2010-10-13 Dirk Eddelbuettel * src/*: applied patch by Koert Kuipers to support raw bytes * inst/unitTests/runit.bytes.R: also added unit test by Koert 2010-09-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.0 2010-09-10 Romain Francois * man/readASCII.Rd: Rd documentation for readASCII 2010-08-20 Romain Francois * R/read/.R: New readASCII method 2010-08-12 Romain Francois * src/*: restore R CMD check 2010-08-04 Dirk Eddelbuettel * inst/unitTests/runit.addressbook.R: start of new unit tests 2010-07-30 Romain Francois * src/*: correct many small errors so that the vignette builds again 2010-02-02 Dirk Eddelbuettel * configure.in: More rigorous checks for ProtoBuf headers, library, mininal version as well as availability of pkg-config. 2010-02-01 Dirk Eddelbuettel * inst/ChangeLog: added 2010-02-01 Romain Francois * Release 0.1-0 * [r274] /pkg/man/RProtoBuf-package.Rd: tidying up * [r273] /pkg/inst/doc/unitTests-results: * [r272] /pkg/inst/doc/unitTests/RProtoBuf-unitTests.R: minor cleanups for the unit test vignette (same as in Rcpp) * [r271] /pkg/DESCRIPTION, /pkg/inst/doc/unitTests/RProtoBuf-unitTests.R: OS_type: unix (for now) * [r270] /pkg/DESCRIPTION: version bump to 0.1-0 * [r269] /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.R[DEL], /pkg/inst/doc/RProtoBuf-unitTests.Rnw, /pkg/inst/doc/unitTests, /pkg/inst/doc/unitTests/RProtoBuf-unitTests.R: minor cleanups for the unit test vignette (same as in Rcpp) 2010-01-23 Romain Francois * [r268] /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.R, /pkg/inst/doc/RProtoBuf-unitTests.Rnw, /pkg/inst/doc/RProtoBuf-unitTests.Rnw.brew[DEL]: borrow simpler unit test vignette from Rcpp 2010-01-11 Romain Francois * [r267] /pkg/DESCRIPTION, /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/rprotobuf.h: adapt to Rcpp::wrap 2009-12-29 Romain Francois * [r266] /pkg/DESCRIPTION, /pkg/inst/unitTests/runit.golden.message.R, /pkg/src/DescriptorPoolLookup.cpp: adapt to recent changes in Rcpp 2009-12-27 Romain Francois * [r265] /pkg/inst/unitTests/data/unittest.proto, /pkg/inst/unitTests/runit.golden.message.R, /pkg/src/constructors.cpp, /pkg/src/lookup.cpp: enum might not have containing types, which used to bomb new_RS4_EnumDescriptor. fixed and unit tested * [r264] /pkg/inst/doc, /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.Rnw.brew: a bug in .tearDown prevented the unit tests from working properly 2009-12-26 Romain Francois * [r263] /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.Rnw.brew, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/inst/unitTests/runit.golden.message.R[CPY], /pkg/inst/unitTests/runit.golden_message.R[DEL]: force cleaning pdfs before vignette creation * [r262] /pkg/src/lookup.cpp: not sorting manually anymore since std::set does it for free * [r261] /pkg/inst/unitTests/runit.draft.R[DEL], /pkg/inst/unitTests/runit.error.R[DEL], /pkg/inst/unitTests/runit.golden_message.R: started adding some proper tests * [r260] /pkg/DESCRIPTION, /pkg/src/DescriptorPoolLookup.cpp: using Rcpp >= 0.7.0.2 * [r259] /pkg/R/internals.R, /pkg/inst/unitTests/data/unittest.proto, /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/DescriptorPoolLookup.h, /pkg/src/RSourceTree.cpp, /pkg/src/RSourceTree.h, /pkg/src/RWarningErrorCollector.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: fixed importing and use set in DescriptorPoolLookup * [r258] /pkg/inst/doc/Makefile, /pkg/inst/unitTests/data, /pkg/inst/unitTests/data/unittest.proto, /pkg/inst/unitTests/data/unittest_import.proto: added utils as default package in vignette makefile 2009-12-26 Dirk Eddelbuettel * [r257] /pkg/tests/doRUnit.R: wd var no longer needed either 2009-12-26 Romain Francois * [r256] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/cleanup, /pkg/inst/doc/Makefile, /pkg/inst/doc/RProtoBuf-unitTests.Rnw[DEL], /pkg/inst/doc/RProtoBuf-unitTests.Rnw.brew, /pkg/inst/unitTests/runTests.R, /pkg/inst/unitTests/runit.draft.R, /pkg/inst/unitTests/runit.error.R, /pkg/tests/doRUnit.R: revised display of information in unit test vignette * [r255] /pkg/NAMESPACE, /pkg/R/unit_tests.R, /pkg/inst/doc/RProtoBuf-unitTests.Rnw, /pkg/inst/unitTests, /pkg/inst/unitTests/runTests.R, /pkg/inst/unitTests/runit.draft.R, /pkg/tests, /pkg/tests/doRUnit.R: prepare for unit testing * [r254] /pkg/DESCRIPTION, /pkg/src/as.cpp, /pkg/src/rprotobuf.h: remove the external_pointer experiment (now in package CPP) 2009-12-24 Dirk Eddelbuettel * [r253] /pkg/src/ConnectionCopyingOutputStream.cpp, /pkg/src/ConnectionInputStream.cpp, /pkg/src/ConnectionOutputStream.cpp, /pkg/src/as.cpp, /pkg/src/rprotobuf.cpp: as.cpp: comment out unused rcpp namespace to fix odd "does not build on amd64" issue found by Saptarshi other files: minimal tweaks to shut 'g++ -Wall' up 2009-12-22 Romain Francois * [r252] /pkg/src/rprotobuf.h: .3 2009-12-20 Romain Francois * [r251] /pkg/DESCRIPTION, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/as.cpp, /pkg/src/rprotobuf.h: start to use Rcpp 0.7.0 features 2009-12-19 Romain Francois * [r250] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/src/rprotobuf.h: more completion for streams, and removed debugging messages which resulted in vignette crashing 2009-12-18 Romain Francois * [r249] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_CodedOutputStream.R, /pkg/man/ZeroCopyOutputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: added methods for ZeroCopyOutputStream (actually using CodedOutputStream) 2009-12-17 Romain Francois * [r248] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/wrapper_CodedInputStream.R, /pkg/R/wrapper_CodedOutputStream.R, /pkg/man/ZeroCopyOutputStream-class.Rd, /pkg/man/completion.Rd, /pkg/src/streams.cpp: +WriteRaw.ZeroCopyOutoutStream and added completion for ZeroCopy{In,Out}outStream * [r247] /pkg/NAMESPACE, /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ReadVarint64 2009-12-16 Romain Francois * [r246] /pkg/NAMESPACE, /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ReadLittleEndian{32,64} * [r245] /pkg/NAMESPACE, /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ReadVarint32 * [r244] /pkg/NAMESPACE, /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ReadString * [r243] /pkg/src/rprotobuf.h: passing R CMD check again. solved problem related to finalization of Message* * [r242] /pkg/inst/doc/RProtoBuf-unitTests.Rnw[DEL]: * [r241] /pkg/inst/doc/RProtoBuf-unitTests.Rnw: * [r240] /pkg/R/wrapper_CodedInputStream.R, /pkg/man/ArrayInputStream-class.Rd, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/set.cpp, /pkg/src/streams.cpp: passing R CMD check again. solved problem related to finalization of Message* * [r239] /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: finalizer for messages * [r238] /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: also use ZeroCopyOutputStreamWrapper * [r237] /pkg/R/wrapper_CodedInputStream.R, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: using ZeroCopyInputStreamWrapper * [r236] /pkg/src/ZeroCopyOutputStreamWrapper.cpp, /pkg/src/ZeroCopyOutputStreamWrapper.h: + ZeroCopyOutputStreamWrapper C++ class * [r235] /pkg/src/ZeroCopyInputStreamWrapper.cpp, /pkg/src/ZeroCopyInputStreamWrapper.h, /pkg/src/streams.cpp: added ZeroCopyInputStreamWrapper that wraps together a zcis and a cis, so that there is no need to create a cis each time 2009-12-15 Romain Francois * [r234] /pkg/NAMESPACE, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: added ReadRaw.ZeroCopyInputSytream * [r233] /pkg/src/ConnectionCopyingInputStream.cpp, /pkg/src/ConnectionCopyingInputStream.h, /pkg/src/ConnectionCopyingOutputStream.cpp, /pkg/src/ConnectionCopyingOutputStream.h, /pkg/src/ConnectionInputStream.cpp, /pkg/src/ConnectionInputStream.h, /pkg/src/ConnectionOutputStream.cpp, /pkg/src/ConnectionOutputStream.h, /pkg/src/read.cpp, /pkg/src/streams.cpp: rework Connection{In,Out}putStream * [r232] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ConnectionInputStream-class.Rd, /pkg/man/ConnectionInputStream-methods.Rd, /pkg/man/ConnectionOutputStream-class.Rd, /pkg/man/ConnectionOutputStream-methods.Rd, /pkg/src/ConnectionInputStream.cpp, /pkg/src/ConnectionInputStream.h, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: added (R side of and not yet functional, but hey) Connection{In,Out}putStream classes and methods 2009-12-14 Romain Francois * [r231] /pkg/man/Descriptor-class.Rd[CPY], /pkg/man/EnumDescriptor-class.Rd[CPY], /pkg/man/EnumValueDescriptor-class.Rd[CPY], /pkg/man/FieldDescriptor-class.Rd[CPY], /pkg/man/FileDescriptor-class.Rd[CPY], /pkg/man/Message-class.Rd[CPY], /pkg/man/MethodDescriptor-class.Rd[CPY], /pkg/man/ServiceDescriptor-class.Rd[CPY], /pkg/man/protobufDescriptor-class.Rd[DEL], /pkg/man/protobufEnumDescriptor-class.Rd[DEL], /pkg/man/protobufEnumValueDescriptor-class.Rd[DEL], /pkg/man/protobufFieldDescriptor-class.Rd[DEL], /pkg/man/protobufFileDescriptor-class.Rd[DEL], /pkg/man/protobufMessage-class.Rd[DEL], /pkg/man/protobufMethodDescriptor-class.Rd[DEL], /pkg/man/protobufServiceDescriptor-class.Rd[DEL]: remove the 'protobuf' prefix of Rd file names * [r230] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/FileInputStream-class.Rd, /pkg/man/FileInputStream-methods.Rd, /pkg/man/FileOutputStream-class.Rd, /pkg/man/FileOutputStream-methods.Rd, /pkg/man/GetErrno-methods.Rd, /pkg/man/SetCloseOnDelete-methods.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +File{In,Out}putStream classes and methods * [r229] /pkg/NAMESPACE, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ArrayOutputStream-class.Rd, /pkg/man/ArrayOutputStream-methods.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ArrayOutputStream class and constructor method 2009-12-12 Romain Francois * [r228] /pkg/R/wrapper_ZeroCopyInputStream.R: added some invisible's * [r227] /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ArrayInputStream-class.Rd, /pkg/man/ArrayInputStream-methods.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: allow block size for ArrayInputStream * [r226] /java/src/org/rproject/rprotobuf/ProtobufHttpServer.java, /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ArrayInputStream-class.Rd, /pkg/man/ArrayInputStream-methods.Rd, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/man/ZeroCopyOutputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ArrayInputStream class 2009-12-11 Romain Francois * [r225] /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/man/ZeroCopyOutputStream-class.Rd, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ZeroCopyOutputStream S4 class * [r224] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/wrapper_ZeroCopyInputStream.R, /pkg/man/BackUp-methods.Rd, /pkg/man/ByteCount-methods.Rd, /pkg/man/Next-methods.Rd, /pkg/man/Skip-methods.Rd, /pkg/man/ZeroCopyInputStream-class.Rd, /pkg/src/mutators.cpp, /pkg/src/rpc_over_http.cpp, /pkg/src/rprotobuf.h, /pkg/src/streams.cpp: +ZeroCopyInputStream S4 class * [r223] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/man/CodedInputStream-class.Rd[DEL], /pkg/src/CodedInputStream_wrapper.cpp[DEL], /pkg/src/constructors.cpp, /pkg/src/rprotobuf.h: changed my mind, don't want to expose CodedInputStream (yet) * [r222] /pkg/src/CodedInputStream_wrapper.cpp, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.h: added constructor and finalizer for CodedInputStream * [r221] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/rpc.R, /pkg/man/CodedInputStream-class.Rd, /pkg/man/RpcHTTP-class.Rd, /pkg/src/SocketCopyingInputStream.cpp, /pkg/src/rpc_over_http.cpp, /pkg/src/rprotobuf.h: added RpcHTTP@root slot, and CodedInputStream class 2009-12-10 Romain Francois * [r220] /pkg/inst/proto/helloworld.proto, /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/DescriptorPoolLookup.h, /pkg/src/lookup.cpp, /pkg/src/methods.cpp, /pkg/src/read.cpp, /pkg/src/rpc_over_http.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: now using runtime descriptors correctly * [r219] /java/build.xml, /java/proto/helloworld.proto, /java/src/org/rproject/rprotobuf/HelloWorldInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufHandler.java, /java/src/org/rproject/rprotobuf/ProtobufMethodInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java: added hello world example * [r218] /java/src/org/rproject/rprotobuf/EchoInvoker.java, /java/src/org/rproject/rprotobuf/MethodImplementation.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java: added annotation (not used yet) * [r217] /java/build.xml, /java/proto, /java/proto/addressbook.proto, /java/src/org/rproject/rprotobuf/EchoInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java: more generic java code 2009-12-09 Romain Francois * [r216] /java/start.sh: added convenience start script for the java server * [r215] /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java: more flexible java server code * [r214] /java/README, /java/build.xml, /java/lib, /java/lib/protobuf-java-2.2.0.jar, /java/src/org/rproject/rprotobuf/EchoInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufHandler.java, /java/src/org/rproject/rprotobuf/ProtobufMethodInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java, /pkg/inst/proto/addressbook.proto: more flexible java server code * [r213] /java/README, /java/src/org/rproject/rprotobuf/ProtobufHandler.java, /java/src/org/rproject/rprotobuf/ProtobufHttpServer.java, /java/src/org/rproject/rprotobuf/ProtobufMethodInvoker.java, /java/src/org/rproject/rprotobuf/ProtobufMethodPool.java, /pkg/src/rpc_over_http.cpp: functional rpc over http R client and java server 2009-12-08 Romain Francois * [r212] /pkg/src/channel.cpp[DEL], /pkg/src/rpc_over_http.cpp, /pkg/src/rprotobuf.h: started to work on rpc over http * [r211] /java, /java/build.properties, /java/build.xml, /java/src, /java/src/org, /java/src/org/rproject, /java/src/org/rproject/rprotobuf, /java/src/org/rproject/rprotobuf/ProtobufHttpServer.java: added dummy java rpc over http server * [r210] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/rpc.R, /pkg/man/RpcHTTP-class.Rd, /pkg/man/invokeLocally.Rd: added invoke, removed invokeLocally, added RpcHTTP class to represent the rpc over http protocol 2009-12-08 Dirk Eddelbuettel * [r209] /pkg/R/listPeople.R, /pkg/src/clear_person_R.cpp, /pkg/src/list_people_R.cpp: minor robustification against empty addressbook file 2009-12-06 Dirk Eddelbuettel * [r208] /pkg/NAMESPACE, /pkg/R/addPerson.R, /pkg/man/addPerson.Rd, /pkg/src/clear_person_R.cpp: added clearPerson() support with kudos to Romain as usual :) 2009-12-06 Romain Francois * [r207] /pkg/inst/proto/protobufrpc.proto[DEL]: not using protobuf-rpc anymore * [r206] /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/EnumDescriptor_wrapper.cpp, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/Makevars.in, /pkg/src/RSourceTree.cpp, /pkg/src/RSourceTree.h, /pkg/src/RWarningErrorCollector.cpp, /pkg/src/RWarningErrorCollector.h, /pkg/src/RconnectionCopyingInputStream.h, /pkg/src/ServiceDescriptor_wrapper.cpp, /pkg/src/SocketCopyingInputStream.h, /pkg/src/add.cpp, /pkg/src/as.cpp, /pkg/src/ascharacter.cpp, /pkg/src/aslist.cpp, /pkg/src/channel.cpp, /pkg/src/clear.cpp, /pkg/src/clone.cpp, /pkg/src/completion.cpp, /pkg/src/constructors.cpp, /pkg/src/containing_type.cpp, /pkg/src/extractors.cpp, /pkg/src/field_count.cpp, /pkg/src/fileDescriptor.cpp, /pkg/src/has.cpp, /pkg/src/identical.cpp, /pkg/src/initialized.cpp, /pkg/src/length.cpp, /pkg/src/lookup.cpp, /pkg/src/merge.cpp, /pkg/src/methods.cpp, /pkg/src/mutators.cpp, /pkg/src/name.cpp, /pkg/src/read.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp, /pkg/src/set.cpp, /pkg/src/size.cpp, /pkg/src/swap.cpp: not using using * [r205] /pkg/src/RTcpChannel.cpp[DEL]: removing * [r204] /pkg/src/RTcpChannel.h[DEL]: removing * [r203] /pkg/src/RTcpChannel.cpp: ıı * [r202] /pkg/src/RTcpChannel.h: ıı * [r201] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/EnumDescriptor_wrapper.R, /pkg/R/EnumValueDescriptor_wrapper.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/MethodDescriptor_wrapper.R, /pkg/R/ServiceDescriptor_wrapper.R, /pkg/R/add.R, /pkg/R/aslist.R, /pkg/R/clear.R, /pkg/R/clone.R, /pkg/R/completion.R, /pkg/R/containing_type.R, /pkg/R/debug_string.R, /pkg/R/descriptor.R, /pkg/R/exceptions.R, /pkg/R/field_count.R, /pkg/R/has.R, /pkg/R/identical.R, /pkg/R/initialized.R, /pkg/R/merge.R, /pkg/R/read.R, /pkg/R/rpc.R, /pkg/R/serialize.R, /pkg/R/set.R, /pkg/R/size.R, /pkg/R/swap.R, /pkg/R/with.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/P.Rd, /pkg/man/RProtoBuf-package.Rd, /pkg/man/add.Rd, /pkg/man/asMessage.Rd, /pkg/man/aslist.Rd, /pkg/man/bytesize.Rd, /pkg/man/clear.Rd, /pkg/man/clone.Rd, /pkg/man/completion.Rd, /pkg/man/containing_type-methods.Rd, /pkg/man/descriptor.Rd, /pkg/man/enum_type.Rd, /pkg/man/enum_type_count.Rd, /pkg/man/fetch.Rd, /pkg/man/field.Rd, /pkg/man/field_count.Rd, /pkg/man/fileDescriptor.Rd, /pkg/man/has.Rd, /pkg/man/invokeLocally.Rd, /pkg/man/isInitialized.Rd, /pkg/man/is_extension.Rd, /pkg/man/label.Rd, /pkg/man/merge.Rd, /pkg/man/name.Rd, /pkg/man/nested_type.Rd, /pkg/man/nested_type_count.Rd, /pkg/man/number.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufEnumValueDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/man/protobufFileDescriptor-class.Rd, /pkg/man/protobufMessage-class.Rd, /pkg/man/protobufMethodDescriptor-class.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/man/read.Rd, /pkg/man/set.Rd, /pkg/man/size.Rd, /pkg/man/sizegets.Rd, /pkg/man/swap.Rd, /pkg/man/type.Rd, /pkg/man/with.Rd, /pkg/src/add.cpp, /pkg/src/constructors.cpp, /pkg/src/extractors.cpp, /pkg/src/lookup.cpp, /pkg/src/merge.cpp, /pkg/src/mutators.cpp, /pkg/src/read.cpp, /pkg/src/rprotobuf.cpp: removing the protobuf prefix of the S4 classes 2009-12-05 Romain Francois * [r200] /pkg/NAMESPACE, /pkg/R/MethodDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/R/rpc.R, /pkg/man/protobufMethodDescriptor-class.Rd: + {in,out}put_type.MethodDescriptor * [r199] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/ServiceDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/protobufServiceDescriptor-class.Rd: + method.ServiceDescriptor * [r198] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/EnumValueDescriptor_wrapper.R, /pkg/R/ServiceDescriptor_wrapper.R, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/ServiceDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: added some methods for ServiceDescriptor * [r197] /pkg/R/EnumDescriptor_wrapper.R, /pkg/man/protobufEnumValueDescriptor-class.Rd: added EnumValueDescriptor class * [r196] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/EnumDescriptor_wrapper.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/R/debug_string.R, /pkg/R/field_count.R, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufEnumValueDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/EnumDescriptor_wrapper.cpp, /pkg/src/as.cpp, /pkg/src/ascharacter.cpp, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.h: added EnumValueDescriptor class 2009-12-05 Dirk Eddelbuettel * [r195] /pkg/inst/doc/RProtoBuf.Rnw: added some stuff near the beginning about 'static' use which motivates the dynamic use nicely some spit and polish for intro as well 2009-12-04 Romain Francois * [r194] /pkg/R/00classes.R, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/src/EnumDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +length.protobufEnumDescriptor * [r193] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +{message,enum}_type.FieldDescriptor * [r192] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: + {has_default_value,default_value}.FieldDescriptor~ * [r191] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/label.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +{label,is_repeated,is_required,is_optional}.FieldDescriptor * [r190] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/man/type.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +{type.cpp_type}.FieldDescriptor * [r189] /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: +number.FieldDescriptor * [r188] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/completion.R, /pkg/man/number.Rd, /pkg/man/protobufFieldDescriptor-class.Rd: +number.FieldDescriptor * [r187] /pkg/TODO: updated TODO * [r186] /pkg/R/field_count.R: minor fix * [r185] /pkg/NAMESPACE, /pkg/R/FieldDescriptor_wrapper.R, /pkg/R/field_count.R, /pkg/man/is_extension.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/FieldDescriptor_wrapper.cpp, /pkg/src/rprotobuf.h: + is_extension.FieldDescriptor * [r184] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/enum_type.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: + enum_type.Descriptor method 2009-12-03 Romain Francois * [r183] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/nested_type.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: +nested_type.Descriptor method * [r182] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/enum_type_count.Rd, /pkg/man/field.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: added field.Descriptor method * [r181] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/nested_type_count.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: nested_type_count.protobufDescriptor * [r180] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/field_count.R, /pkg/man/field_count.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/src/field_count.cpp, /pkg/src/rprotobuf.h: + field_count.protobufDescriptor method * [r179] /pkg/DESCRIPTION: added BugReports description field * [r178] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/containing_type.R, /pkg/man/containing_type-methods.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/containing_type.cpp, /pkg/src/rprotobuf.h: added containing_type.protobuf{Descriptor,FieldDescriptor,EnumDescriptor} 2009-12-03 Dirk Eddelbuettel * [r177] /pkg/NAMESPACE, /pkg/R/addPerson.R, /pkg/man/addPerson.Rd, /pkg/man/listPeople.Rd, /pkg/src/add_person_R.cpp: added simple addPerson() R function, manual page and C++ implementation 2009-12-02 Romain Francois * [r176] /pkg/src/initialized.cpp: isInitialized gains the names of the fields that are not initialized * [r175] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/asMessage.Rd, /pkg/src/as.cpp, /pkg/src/rprotobuf.h: added asMessage function * [r174] /pkg/NAMESPACE, /pkg/man/throw.Rd[DEL], /pkg/src/exceptions.cpp: throw not exported anymore * [r173] /pkg/man/protobufFileDescriptor-class.Rd: added name.protobufFileDescriptor * [r172] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/src/name.cpp, /pkg/src/rprotobuf.h: added more fileDescriptor methods * [r171] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/descriptor.R, /pkg/R/rpc.R, /pkg/man/fileDescriptor.Rd, /pkg/src/fileDescriptor.cpp, /pkg/src/rprotobuf.h: added more fileDescriptor methods * [r170] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/aslist.R, /pkg/man/aslist.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/aslist.cpp, /pkg/src/completion.cpp, /pkg/src/rprotobuf.h: added as.list.protobufServiceDescriptor * [r169] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/rpc.R, /pkg/man/completion.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.h: misc * [r168] /pkg/R/00classes.R, /pkg/man/name.Rd, /pkg/src/name.cpp, /pkg/src/rprotobuf.h: more name methods * [r167] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/name.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/name.cpp, /pkg/src/rprotobuf.h: added name method and implementations for Decriptor and FieldDescriptor 2009-12-01 Romain Francois * [r166] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/aslist.R, /pkg/R/completion.R, /pkg/man/aslist.Rd, /pkg/man/completion.Rd, /pkg/man/protobufFileDescriptor-class.Rd, /pkg/src/aslist.cpp, /pkg/src/completion.cpp, /pkg/src/rprotobuf.h: added as.list.protobufFileDescriptor * [r165] /pkg/R/debug_string.R, /pkg/src/ascharacter.cpp, /pkg/src/rprotobuf.h: completion, toString, as.character for protobufFileDescriptor * [r164] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/man/completion.Rd, /pkg/man/protobufFileDescriptor-class.Rd: completion, toString, as.character for protobufFileDescriptor * [r163] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/descriptor.R, /pkg/R/rpc.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/fileDescriptor.Rd, /pkg/man/protobufFileDescriptor-class.Rd, /pkg/src/constructors.cpp, /pkg/src/fileDescriptor.cpp, /pkg/src/rprotobuf.h: added protobufFileDescriptor S4 class + fileDescriptor method 2009-11-30 Romain Francois * [r162] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/rpc.R, /pkg/src/RTcpChannel.cpp, /pkg/src/RTcpChannel.h, /pkg/src/SocketCopyingInputStream.cpp, /pkg/src/SocketCopyingInputStream.h, /pkg/src/channel.cpp, /pkg/src/rprotobuf.h: playing with sockets 2009-11-23 Romain Francois * [r161] /www/index.php: update the page 2009-11-22 Romain Francois * [r160] /pkg/src/RTcpChannel.cpp, /pkg/src/RTcpChannel.h: * [r159] /pkg/src/sisocks.h: added sisocks.h header from Rserve * [r158] /pkg/src/Makevars.in, /pkg/src/RTcpChannel.cpp, /pkg/src/RTcpChannel.h: slowly putting things in place for rpc (inspired from the protobuf-rpc project) * [r157] /pkg/src/serialize.cpp: discovered the SerializeToArray method, simplify code * [r156] /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: allow messages as input of string and bytes fields * [r155] /pkg/inst/proto/protobufrpc.proto, /pkg/src: added proto file from protobufrpc project * [r154] /pkg/R/set.R, /pkg/src/Makevars.in, /pkg/src/mutators.cpp: allow raw vector as input of string or bytes fields 2009-11-21 Romain Francois * [r153] /www/index.php: start to make the project page * [r152] /pkg/DESCRIPTION: suggesting svUnit (unit tests) * [r151] /pkg/inst/doc, /pkg/inst/doc/RProtoBuf-unitTests.Rnw: added (empty) unit test vignette * [r150] /pkg/inst/doc/RProtoBuf.Rnw: update the main vignette to show reading from payload * [r149] /pkg/R/read.R, /pkg/R/serialize.R, /pkg/man/read.Rd, /pkg/src/read.cpp, /pkg/src/rprotobuf.h: reading messages from raw vector (payload) * [r148] /pkg/NEWS, /pkg/R/read.R: open the connection at start on read 2009-11-18 Romain Francois * [r147] /pkg/inst/proto/addressbook.proto: for the quickref vignette in one page 2009-11-18 Dirk Eddelbuettel * [r146] /pkg/cleanup: also remove temp files for quickref vignette 2009-11-17 Romain Francois * [r145] /pkg/src/mutators.cpp, /pkg/src/size.cpp, /pkg/src/swap.cpp: removed the conditional compiling for protobuf 2.1 * [r144] /pkg/man/invokeLocally.Rd, /pkg/man/protobufMethodDescriptor-class.Rd, /pkg/man/protobufServiceDescriptor-class.Rd: pleasing R CMD check 2009-11-16 Dirk Eddelbuettel * [r143] /pkg/configure, /pkg/configure.in: further improvements to configure via pkg-config * [r142] /pkg/cleanup: let cleanup nuke a few LaTeX files 2009-11-16 Romain Francois * [r141] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/debug_string.R, /pkg/R/rpc.R, /pkg/TODO, /pkg/inst/proto/addressbook.proto, /pkg/man/protobufMethodDescriptor-class.Rd, /pkg/man/protobufServiceDescriptor-class.Rd, /pkg/src/ascharacter.cpp, /pkg/src/constructors.cpp, /pkg/src/lookup.cpp, /pkg/src/methods.cpp, /pkg/src/read.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: starting to play with (local) rpc services 2009-11-16 Dirk Eddelbuettel * [r140] /pkg/configure: updated configure * [r139] /pkg/DESCRIPTION, /pkg/configure.in: updated configure.in to use pkg-config updated DESCRIPTON 2009-11-16 Romain Francois * [r138] /pkg/inst/doc: * [r137] /pkg/inst/doc/RProtoBuf-quickref.Rnw: added quick ref vignette * [r136] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/add.R, /pkg/R/completion.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/add.Rd, /pkg/src/add.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h: added add method to add values to a repeated field 2009-11-14 Romain Francois * [r135] /pkg/NAMESPACE, /pkg/R/identical.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufMessage-class.Rd, /pkg/src/identical.cpp, /pkg/src/rprotobuf.h: added all.equal * [r134] /pkg/DESCRIPTION, /pkg/man/RProtoBuf-package.Rd: updated DESCRIPTION and package help page * [r133] /pkg/R/identical.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufMessage-class.Rd: added == and != * [r132] /pkg/NAMESPACE, /pkg/R/identical.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufMessage-class.Rd, /pkg/src/identical.cpp, /pkg/src/rprotobuf.h: added identical method to compare two messages * [r131] /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content 2009-11-13 Romain Francois * [r130] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/debug_string.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/man/protobufMessage-class.Rd: added toString as an alias to as.character * [r129] /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content * [r128] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/set.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/fetch.Rd, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.h, /pkg/src/set.cpp: added fetch method * [r127] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/set.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/completion.Rd, /pkg/man/set.Rd, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h: added set method 2009-11-13 Dirk Eddelbuettel * [r126] /pkg/inst/doc/RProtoBuf.Rnw: a few more updates * [r125] /pkg/inst/doc/RProtoBuf.Rnw: few small updates and tweaks * [r124] /pkg/DESCRIPTION: updated DESCRIPTION 2009-11-12 Romain Francois * [r123] /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content * [r122] /pkg/R/00classes.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/src/rprotobuf.h: added $ for protobufFieldDescriptor (for completeness) * [r121] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/descriptor.R, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/man/descriptor.Rd, /pkg/src/extractors.cpp: added descriptor method * [r120] /pkg/R/internals.R, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added (unexported) function getProtobufLibVersion * [r119] /pkg/src/mutators.cpp: use the correct version for the test #if GOOGLE_PROTOBUF_VERSION < 200200 * [r118] /pkg/src/mutators.cpp: use the correct version for the test #if GOOGLE_PROTOBUF_VERSION < 200200 * [r117] /pkg/inst/doc/RProtoBuf.Rnw: no hardcoding Sweave location * [r116] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content 2009-11-12 Dirk Eddelbuettel * [r115] /pkg/src/mutators.cpp: make -Wall happy by commenting out one var, and providing more switch targets 2009-11-12 Romain Francois * [r114] /pkg/inst/doc/RProtoBuf.Rnw: some more vignette content * [r113] /pkg/inst/doc/RProtoBuf.Rnw, /pkg/src/size.cpp, /pkg/src/swap.cpp: correct swaping messages with 2.1 libproto * [r112] /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/swap.R, /pkg/demo/addressbook.R, /pkg/inst/doc/RProtoBuf.Rnw: make swap use 1-based indexing * [r111] /pkg/R/00classes.R, /pkg/inst/doc/RProtoBuf.Rnw: some more content on the vignette * [r110] /pkg/src/rprotobuf.cpp: added some code to control which version of the libprotobuf we require (currently 2.1, but will be 2.2 soon) * [r109] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R/zzz.R, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added some code to control which version of the libprotobuf we require (currently 2.1, but will be 2.2 soon) * [r108] /pkg/inst/doc, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/src/mutators.cpp, /pkg/src/size.cpp, /pkg/src/swap.cpp: added some conditional compiling to make it work with libprotobuf < 2.2 2009-11-11 Romain Francois * [r107] /pkg/inst/doc/RProtoBuf.Rnw, /pkg/inst/proto/addressbook.proto: some more content for the vignette * [r106] /pkg/inst/doc/RProtoBuf.tex[DEL]: removed tex file * [r105] /pkg/inst/doc, /pkg/inst/doc/RProtoBuf.Rnw, /pkg/inst/doc/RProtoBuf.tex, /pkg/inst/proto/addressbook.proto: started vignette * [r104] /pkg/DESCRIPTION: Rcpp >= 0.6.8 2009-11-10 Romain Francois * [r103] /pkg/R/swap.R, /pkg/demo/addressbook.R: some more code in demo * [r102] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/swap.R, /pkg/man/swap.Rd, /pkg/src/clear.cpp, /pkg/src/rprotobuf.h, /pkg/src/swap.cpp: added swap * [r101] /pkg/R/00classes.R, /pkg/R/clear.R, /pkg/R/completion.R, /pkg/man/clear.Rd, /pkg/src/clear.cpp, /pkg/src/rprotobuf.h, /pkg/src/size.cpp: added field argument to clear * [r100] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/size.R, /pkg/man/size.Rd, /pkg/man/sizegets.Rd, /pkg/src/rprotobuf.h, /pkg/src/size.cpp: + size<- * [r99] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/size.R, /pkg/man/size.Rd, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/size.cpp: added size method * [r98] /pkg/src/mutators.cpp: minot tweaks * [r97] /pkg/src/mutators.cpp: fail mutation before resizing * [r96] /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h: nicer and more efficient mutator code (discovered Reflection->RemoveLast method) * [r95] /pkg/R/00classes.R: using a switch in $ * [r94] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/clear.R, /pkg/man/clear.Rd, /pkg/src/aslist.cpp, /pkg/src/clear.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.h: added clear method * [r93] /pkg/src/RWarningErrorCollector.cpp, /pkg/src/RWarningErrorCollector.h, /pkg/src/rprotobuf.cpp: properly implement MultiFileErrorCollector to send an R warning instead of printing stuff to cout * [r92] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/man/protobufMessage-class.Rd, /pkg/src/extractors.cpp, /pkg/src/mutators.cpp: added [[ and [[<- methods for messages using the declared tag number 2009-11-09 Romain Francois * [r91] /pkg/src/DescriptorPoolLookup.cpp, /pkg/src/DescriptorPoolLookup.h, /pkg/src/lookup.cpp, /pkg/src/rprotobuf.cpp: maintain list of currently known types in attached DescriptorPool 2009-11-09 Dirk Eddelbuettel * [r90] /pkg/src/list_people_R.cpp: remove RcppList implementation which we now get from Rcpp (>= 0.6.7) 2009-11-09 Romain Francois * [r89] /pkg/src/rprotobuf.cpp: using RSourceTree instead of DiskSourceTree * [r88] /pkg/src/RSourceTree.cpp, /pkg/src/RSourceTree.h: adding a simple SourceTree implementation * [r87] /pkg/DESCRIPTION, /pkg/man/RProtoBuf-package.Rd: required Rcpp >= 0.6.7 * [r86] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/initialized.R, /pkg/man/isInitialized.Rd, /pkg/man/protobufMessage-class.Rd, /pkg/src/initialized.cpp, /pkg/src/rprotobuf.h: added isInitialized method * [r85] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/man/protobufMessage-class.Rd, /pkg/src/length.cpp, /pkg/src/rprotobuf.h: added length method for messages * [r84] /pkg/R/internals.R: minor * [r83] /pkg/NAMESPACE, /pkg/R/size.R, /pkg/demo/io.R, /pkg/man/RProtoBuf-package.Rd, /pkg/man/bytesize.Rd, /pkg/src/rprotobuf.h, /pkg/src/size.cpp: added bytesize method * [r82] /pkg/TODO, /pkg/demo/00Index, /pkg/demo/addressbook.R, /pkg/demo/io.R, /pkg/src/RconnectionCopyingInputStream.cpp: added io demo showing how to use binary connections to read and write messages 2009-11-08 Romain Francois * [r81] /pkg/src/RconnectionCopyingInputStream.cpp: minor doc tweaks * [r80] /pkg/src/RconnectionCopyingInputStream.cpp, /pkg/src/RconnectionCopyingInputStream.h: factoring out getReadBinCall * [r79] /pkg/src/RconnectionCopyingInputStream.cpp: minor doc tweaks * [r78] /pkg/R/read.R, /pkg/src/RconnectionCopyingInputStream.cpp, /pkg/src/RconnectionCopyingInputStream.h, /pkg/src/read.cpp, /pkg/src/rprotobuf.h: reading from binary connections * [r77] /pkg/R/read.R, /pkg/R/serialize.R, /pkg/man/read.Rd, /pkg/src/read.cpp, /pkg/src/serialize.cpp: silence R CMD check 2009-11-08 Dirk Eddelbuettel * [r76] /pkg/man/protobufMessage-class.Rd: small correction to tail of example * [r75] /pkg/src/rprotobuf.h: make it work with version 2.1 of ProtoBuf 2009-11-08 Romain Francois * [r74] /pkg/man/protobufMessage-class.Rd: minor doc tweaks * [r73] /pkg/R/serialize.R, /pkg/man/protobufMessage-class.Rd: minor doc tweaks * [r72] /pkg/R/serialize.R, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: workaround for serializing to binary connections * [r71] /pkg/R/serialize.R, /pkg/src/connections.h, /pkg/src/read.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: use partial on serialize and parse to allow message lacking required fields 2009-11-07 Dirk Eddelbuettel * [r70] /pkg/DESCRIPTION: finally set Date svn property on this to have the Date filled in automatically 2009-11-06 Romain Francois * [r69] /pkg/R/serialize.R, /pkg/man/protobufMessage-class.Rd, /pkg/src/read.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: serialize message to a file * [r68] /pkg/man/read.Rd: mention the read pseudi method * [r67] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/completion.R, /pkg/R/read.R, /pkg/man/read.Rd, /pkg/src/read.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: reading messages from files 2009-11-05 Dirk Eddelbuettel * [r66] /pkg/src/Makevars.in: simplification in that we no longer need to list all .cpp files as dependants 2009-11-05 Romain Francois * [r65] /pkg/TODO: added services to the TODO list * [r64] /pkg/DESCRIPTION: added more urls and a MailingList field 2009-11-05 Dirk Eddelbuettel * [r63] /pkg/demo/00Index: make 'R CMD check' happy * [r62] /pkg/src/Makevars.in: adjusted Makevars.in for addressbook.proto in inst/proto/ * [r61] /pkg/inst/proto/addressbook.proto[CPY], /pkg/src/addressbook.proto[DEL]: moved addressbook.proto from src/ to inst/proto/ * [r60] /pkg/inst/examples/addressbook.proto[DEL], /pkg/inst/proto/addressbook.proto[DEL]: removed two extra addressbook.proto files 2009-11-05 Romain Francois * [r59] /pkg/NAMESPACE, /pkg/R/merge.R, /pkg/demo/00Index, /pkg/man/merge.Rd, /pkg/src/Makevars.in, /pkg/src/merge.cpp, /pkg/src/rprotobuf.h: + merge * [r58] /pkg/R/clone.R: added clone 2009-11-04 Romain Francois * [r57] /pkg/demo, /pkg/demo/addressbook.R: added demo file 2009-11-04 Dirk Eddelbuettel * [r56] /pkg/src/aslist.cpp, /pkg/src/mutators.cpp, /pkg/src/update.cpp: commented-out two unused variables and init'ed another, all to make 'g++ -Wall' 2009-11-04 Romain Francois * [r55] /pkg/TODO: added TODO * [r54] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/aslist.R, /pkg/R/completion.R, /pkg/R/debug_string.R, /pkg/R/has.R, /pkg/R/with.R, /pkg/man/P.Rd, /pkg/man/RProtoBuf-package.Rd, /pkg/man/aslist.Rd, /pkg/man/clone.Rd, /pkg/man/completion.Rd, /pkg/man/has.Rd, /pkg/man/protobufDescriptor-class.Rd, /pkg/man/protobufEnumDescriptor-class.Rd, /pkg/man/protobufFieldDescriptor-class.Rd, /pkg/man/protobufMessage-class.Rd, /pkg/man/with.Rd, /pkg/src/Makevars.in, /pkg/src/ascharacter.cpp, /pkg/src/aslist.cpp, /pkg/src/clone.cpp, /pkg/src/completion.cpp, /pkg/src/connections.h, /pkg/src/constructors.cpp, /pkg/src/exceptions.cpp, /pkg/src/extractors.cpp, /pkg/src/has.cpp, /pkg/src/lookup.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp, /pkg/src/update.cpp: lots of updates. fully working mutators 2009-11-02 Dirk Eddelbuettel * [r53] /pkg/src/completion.cpp, /pkg/src/constructors.cpp, /pkg/src/exceptions.cpp, /pkg/src/extractors.cpp, /pkg/src/lookup.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: switch from four namespace to just one * [r52] /pkg/src/extractors.cpp: add default initialisation for SEXP to keep g++ -Wall happy 2009-11-02 Romain Francois * [r51] /pkg/src/Makevars.in, /pkg/src/constructors.cpp, /pkg/src/mutators.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: minimal implementation of mutators (only non-repeated fields atm) * [r50] /pkg/R/zzz.R, /pkg/src/lookup.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: enable lookup mechanism (using full path for now) 2009-11-01 Romain Francois * [r49] /pkg/R/zzz.R: added readProtoFiles to simplify importing of proto definitions from package * [r48] /pkg/NAMESPACE, /pkg/R/internals.R, /pkg/R/zzz.R, /pkg/inst/proto, /pkg/inst/proto/addressbook.proto, /pkg/man/readProtoFiles.Rd: added readProtoFiles to simplify importing of proto definitions from packages 2009-10-31 Romain Francois * [r47] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/man/throw.Rd: +Rd.throw * [r46] /pkg/man/protobufFieldDescriptor-class.Rd: +Rd.protobufFieldDescriptor * [r45] /pkg/man/protobufEnumDescriptor-class.Rd: added Rd for protobufEnumDescriptor * [r44] /pkg/R/00classes.R, /pkg/man/protobufDescriptor-class.Rd: added protobufDescriptor type * [r43] /pkg/man/protobufMessage-class.Rd: added Rd for protobufMessage class * [r42] /pkg/NAMESPACE, /pkg/R/debug_string.R, /pkg/man/P.Rd, /pkg/man/listPeople.Rd, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added Rd for P, implement as.character for protobufMessage and protobufDescriptor * [r41] /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp: minor fixes * [r40] /pkg/NAMESPACE, /pkg/R/serialize.R, /pkg/src/Makevars.in, /pkg/src/rprotobuf.h, /pkg/src/serialize.cpp: hooks for serialize method for protobufMessage * [r39] /pkg/NAMESPACE, /pkg/R/exceptions.R, /pkg/src/Makevars.in, /pkg/src/exceptions.cpp, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: start playing with Exception handling, we need to call throwException instead of Rf_error in the c code 2009-10-30 Romain Francois * [r38] /pkg/R/exceptions.R, /pkg/src/extractors.cpp: extracting repeated fields, for now repeated messages are just returned as list of 'protobufMessage' objects * [r37] /pkg/NAMESPACE, /pkg/R/completion.R, /pkg/src/Makevars.in, /pkg/src/completion.cpp, /pkg/src/constructors.cpp, /pkg/src/extractors.cpp, /pkg/src/rprotobuf.h: implemented completions for Messages (giving field names) and Descriptors (fields, enums and nested types) * [r36] /pkg/src/constructors.cpp, /pkg/src/extractors.cpp, /pkg/src/fieldtypes.h, /pkg/src/rprotobuf.h: implement extraction of (almost) all types from messages with $ (missing ENUM type) * [r35] /pkg/R/00classes.R, /pkg/src/Makevars.in, /pkg/src/extractors.cpp, /pkg/src/fieldtypes.h, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: prepare the field extraction * [r34] /pkg/R/00classes.R, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: implement new.protobufMessage that generates a new mutable Message using the generated Message factory * [r33] /pkg/src/constructors.cpp: some more doc in constructors.cpp * [r32] /pkg/R/internals.R, /pkg/src/constructors.cpp, /pkg/src/lookup.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: use R_NO_REMAP and Rf_ prefixes to avoid name clashes (install, error, ...) 2009-10-29 Romain Francois * [r31] /pkg/R/00classes.R, /pkg/R/internals.R, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: removed hard coded path * [r30] /pkg/R/00classes.R, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added enum types to $.Descriptor * [r29] /pkg/R/00classes.R: added $ extraction of nested types or fields by name * [r28] /pkg/R/00classes.R, /pkg/src/constructors.cpp: added $ extraction of nested types or fields by name * [r27] /pkg/src/Makevars.in, /pkg/src/constructors.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added $ extraction of nested types or fields by name * [r26] /pkg/R/00classes.R, /pkg/src/rprotobuf.cpp: grab the descriptor from the pool in getProtobufDescriptor 2009-10-29 Dirk Eddelbuettel * [r25] /pkg/src/lookup.cpp: add two simple return() statements to make 'g++ -Wall' happy 2009-10-29 Romain Francois * [r24] /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/R/internals.R, /pkg/src/rprotobuf.cpp: grab the descriptor from the pool in getProtobufDescriptor * [r23] /pkg/R/00classes.R, /pkg/R/internals.R, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: collect information about a proto file * [r22] /pkg/src/lookup.cpp, /pkg/src/rprotobuf.h: objects returns character(0) instead of NULL, more consistent with attach( new.env() ) * [r21] /pkg/R/lookup.R, /pkg/src/Makevars.in, /pkg/src/lookup.cpp, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: added skeleton for lookup mechanism * [r20] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R/00classes.R, /pkg/src/Makevars.in, /pkg/src/rprotobuf.cpp, /pkg/src/rprotobuf.h: skeleton for R S4 classes representing proto messages as external pointers 2009-10-27 Dirk Eddelbuettel * [r19] /pkg/src/Makevars.in: add CXXPICFLAGS which is needed on amd64 * [r18] /pkg/src/list_people_R.cpp: corrected listPeopleAsList() for special case of person 3 with no phones * [r17] /pkg/src/Makevars.in: support configure and automated build of all pieces incl conversion from proto file to header and source and then object * [r16] /pkg/src/list_people_R.cpp: suppress one more set of g++ warning, align function names * [r15] /pkg/cleanup: add more cleanup targets * [r14] /pkg/R/listPeople.R: align function names with C++ source * [r13] /pkg/configure, /pkg/configure.in: added configure support * [r12] /pkg/src/Makevars[DEL], /pkg/src/Makevars.in[CPY]: moved to Makevars.in and configure, also re-create header and source from proto * [r11] /pkg/src/addressbook.pb.cc[DEL], /pkg/src/addressbook.pb.h[DEL]: removed as they are now recreated * [r10] /pkg/configure.in: beginnings of a configure script, not yet ready * [r9] /pkg/NAMESPACE: added (nested) list support * [r8] /pkg/man/listPeople.Rd: documented (nested) list support * [r7] /pkg/R/listPeople.R: added (nested) list support * [r6] /pkg/src/list_people_R.cpp: add support for R lists, possibly nested this was a good test for Rcpp and should get folded into Rcpp * [r5] /pkg/src/addressbook.pb.cc, /pkg/src/addressbook.pb.h: rebuild with Ubuntu protoc -- probably need to farm this out to a proper Makefile or Makevar target 2009-10-22 Dirk Eddelbuettel * [r4] /pkg/src/list_people_R.cpp: add support for case of no phone entry * [r3] /pkg/src/Makevars: add -lpthread to PKG_LIBS * [r2] /pkg/DESCRIPTION, /pkg/NAMESPACE, /pkg/R, /pkg/R/listPeople.R, /pkg/README, /pkg/cleanup, /pkg/inst, /pkg/inst/examples, /pkg/inst/examples/AddressBookFile, /pkg/inst/examples/addressbook.proto, /pkg/man, /pkg/man/listPeople.Rd, /pkg/src, /pkg/src/Makevars, /pkg/src/addressbook.pb.cc, /pkg/src/addressbook.pb.h, /pkg/src/addressbook.proto, /pkg/src/list_people_R.cpp: A very basic first proof of concept package reading a binary protobuf file 2009-05-28 Stefan Theussl * [r1] /README, /pkg, /www, /www/index.php: R-Forge: updated repository structure RProtoBuf/NAMESPACE0000644000176200001440000000621014235225224013353 0ustar liggesusers ## Package has dynamic library useDynLib("RProtoBuf", .registration=TRUE) importFrom("methods", "new", "show", "as", "is") importFrom("utils", "str", "packageDescription", "packageVersion") importFrom("stats", "update") importFrom("tools", "file_path_as_absolute") #importFrom("RCurl", "basicTextGatherer", "curlPerform") importFrom("Rcpp", "evalCpp") exportClasses( # descriptors "Descriptor", "FieldDescriptor", "EnumDescriptor", "ServiceDescriptor", "MethodDescriptor", "FileDescriptor", "EnumValueDescriptor", # message "Message", # rpc #"RpcHTTP", # virtual streams "ZeroCopyInputStream", "ZeroCopyOutputStream", # concrete implementations "ArrayInputStream", "ArrayOutputStream", "FileInputStream", "FileOutputStream", "ConnectionInputStream", "ConnectionOutputStream" ) exportMethods( "new", "[[", "[[<-", "$", "$<-", "show", "serialize", "as.character", "update", "has", "clone", "merge", "read", "readASCII", "readJSON", "bytesize", "length", "str", "isInitialized", "clear", "size", "size<-", "swap", "descriptor", "set", "fetch", "toString", "toJSON", "identical", "==", "!=", "all.equal", "add", "fileDescriptor", "name", "names", "flush", "close", "setExtension", "getExtension", "containing_type", "field_count", "nested_type_count", "enum_type_count", "field", "nested_type", "enum_type", # FieldDescriptor "is_extension", "number", "label", "is_required", "is_repeated", "is_optional", "has_default_value", "default_value", "message_type", "enum_type", "type", "cpp_type", # EnumDescriptor "value_count", "value", # ServiceDescriptor "method_count", "method", # MethodDescriptor "input_type", "output_type", # rpc # "invoke", # streams "Next", "ByteCount", "BackUp", "Skip", "ArrayInputStream", "ArrayOutputStream", "FileInputStream", "FileOutputStream", "GetErrno", "SetCloseOnDelete", "ConnectionInputStream", "ConnectionOutputStream", "ReadRaw", "ReadString", "ReadVarint32", "ReadLittleEndian32", "ReadLittleEndian64", "ReadVarint64", "WriteRaw", "WriteString", "WriteLittleEndian32", "WriteLittleEndian64", "WriteVarint32", "WriteVarint64" ) export( "P", "readProtoFiles", "readProtoFiles2", "resetDescriptorPool", "asMessage" ) if( exists( ".DollarNames", asNamespace("utils") ) ) importFrom( utils, .DollarNames ) S3method(.DollarNames, Message ) S3method(.DollarNames, Descriptor ) S3method(.DollarNames, EnumDescriptor ) S3method(.DollarNames, EnumValueDescriptor ) S3method(.DollarNames, FileDescriptor ) S3method(.DollarNames, FieldDescriptor ) S3method(.DollarNames, ServiceDescriptor ) S3method(.DollarNames, MethodDescriptor ) S3method(.DollarNames, ZeroCopyInputStream ) S3method(.DollarNames, ZeroCopyOutputStream ) S3method( with, Message ) S3method( within, Message) S3method( as.list, Message ) S3method( as.list, Descriptor ) S3method( as.list, EnumDescriptor ) S3method( as.list, FileDescriptor ) S3method( as.list, ServiceDescriptor ) S3method( all.equal, Message ) # constants exportPattern( "^TYPE_" ) exportPattern( "^CPPTYPE_" ) exportPattern( "^LABEL_" ) # copied from RProtoBufUtils export( "serialize_pb", "unserialize_pb", "can_serialize_pb" ) # export( run_unit_tests ) RProtoBuf/TODO0000644000176200001440000000673512440004312012625 0ustar liggesusersCurrent TODO list: o Finish improved vignette / R Journal writeup. o Push some type coercion hacks done in RProtoBuf upstream to Rcpp (Rcpp:as types should work on character strings representing numbers, especially for int64s since we don't otherwise have a way to represent 64-bit integers in base R). o Add more packages that depend on or enhance RProtoBuf. o Improve exception handling to prevent cases where an Rcpp exception crashes the interactive R instance. o Investigate Rcpp Modules support for some classes. Murray is not personally super enthusiastic about this one, as I think it may require non trivial changes to Rcpp and/or result in losing some of the user-friendliness we've crafted in the explicit RcppExported function entry points. Still, it could be explored and may result in significantly fewer lines of code if successful. o Add a FAQ and other documentation / examples. o Add more unit tests. o Explore removing the CLONE() in extractors.cpp. This makes for unusual semantics for any mutable methods of sub-messages. For example, clear(), setExtension(), and probably also update() ( but "$<-" on sub-messages is not a problem, it seems). More details below. o What should we do when we unload the package? Any additional resources to free that is not currently done? o finalizers [murray: what is needed here?] o Clean up formatting / whitespace of R code. The C++ code is now kept consistent through clang-format and a new emacs directory level config in pkg/src, and the style guide notes in the STYLE file on R-Forge. o Thoroughly audit extensions support and other deeply nested types support to ensure everything is implemented as expected. Stuff I think belongs in additional packages that depend on RProtoBuf, rather than inside RProtoBuf directly: o http-powered rpc implementation o More as.Message methods --- Detailed Notes ---- 8. CLONE() --[ examples from Murray illustrating the problem ]-- library(RProtoBuf) InitGoogle() if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("unitTests", "data", "unittest.proto",package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } test <- new(protobuf_unittest.TestAllTypes) test$optional_foreign_message <- new(protobuf_unittest.ForeignMessage, c=3) # Example 1: test$optional_foreign_message$c test$optional_foreign_message$clear() test$optional_foreign_message$c # didn't clear test$optional_foreign_message$c # Example 2: foo <- new(protobuf_unittest.ForeignMessage, c=3) foo$c foo$clear() foo$c # did clear foo$c # Example 3: baz <- test$optional_foreign_message baz$c baz$c <- 4 test$optional_foreign_message$c # still 3, but would be 4 if we removed the CLONE(). Example 1 is currently I think very confusing semantically for users of RProtoBuf with nested messages and I would like to fix that case. Example 2 works correctly now and would not be affected by this change. Example 3 would change behavior and could cause problems for users. Would need to be clearly announced in the NEWS file and to our user list. --[ Romain's thoughts ]-- `$<-` is the task of setMessageField: https://github.com/RProtoBuf/RProtoBuf/blob/master/R/00classes.R#L197 https://github.com/RProtoBuf/RProtoBuf/blob/master/src/mutators.cpp#L377 For "$" we could perhaps move to some sort of copy on change semantics (similar to what R does), instead of what we use currently which is more like copy on access. RProtoBuf/configure.ac0000644000176200001440000001057515130720364014433 0ustar liggesusers ## RProtoBuf configure.ac ## ## Copyright (C) 2009 - 2026 Dirk Eddelbuettel ## Portions Copyright (C) 2010 Romain Francois ## Portions Copyright (C) 2013 Murray Stokely ## Portions Copyright (C) 2016 Craig Radcliffe # require at least autoconf 2.61 AC_PREREQ(2.61) # Process this file with autoconf to produce a configure script. AC_INIT([RProtoBuf], [0.4.25],[edd@debian.org]) # Ensure C++ is set up as R expects : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then AC_MSG_ERROR([Could not determine R_HOME.]) fi CXX=`"${R_HOME}/bin/R" CMD config CXX` CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` AC_LANG(C++) AC_REQUIRE_CPP AC_PROG_CC AC_PROG_CXX ## simpler alternative to test below: AC_PATH_PROG(PROTOC, protoc) AC_DEFUN([AC_PROG_PKGCONFIG], [AC_CHECK_PROG(PKGCONFIG,pkg-config,yes)]) AC_PROG_PKGCONFIG ## use pkg-config for ProtoBuf settings ## if test x"${PKGCONFIG}" = x"yes"; then if pkg-config --exists protobuf; then protobuf_cxxflags=`pkg-config --cflags protobuf` protobuf_libs=`pkg-config --libs protobuf` else protobuf_cxxflags="" protobuf_libs="-lprotobuf" fi else # Add a reasonable default of -lprotobuf if we don't have pkg-config protobuf_cxxflags="" protobuf_libs="-lprotobuf" fi ## And make sure these flags are used for the tests below. CPPFLAGS="${protobuf_cxxflags} ${CPPFLAGS}" CXXFLAGS="${protobuf_cxxflags} ${CXXFLAGS}" ## look for protoc, the ProtoBuf compiler AC_DEFUN([AC_PROG_PROTOC], [AC_CHECK_PROG(PROTOC,protoc,yes)]) AC_PROG_PROTOC if test x"${PROTOC}" = x"no" ; then echo " Your installation does not appear to have protoc installed. Please make sure that you have a working and complete ProtoBuf installation. " exit 1 fi ## look for protobuf headers -- now use pkg-config which even does minimum version ## ## next two lines break witha autoconf 2.65 :-/ #PROTOBUF_VERSION="2.2.0" #PKG_CHECK_MODULES(ProtoBuf, protobuf >= 2.2.0, , AC_MSG_ERROR(Protobuf version 2.2.0 required)) ## check for header and ability to link ## first for headers Debian has in libprotobuf-dev protobuf_common_header=google/protobuf/stubs/common.h protobuf_common_header_cache_var=AS_TR_SH([ac_cv_header_$protobuf_common_header]) AC_CHECK_HEADER([$protobuf_common_header],, [ # If it didn't work, try adding /usr/local directly then trying again AC_MSG_WARN([Protobuf headers not found with default CXXFLAGS and CPPFLAGS, manually trying /usr/local/include]) CPPFLAGS="${protobuf_cxxflags} ${CPPFLAGS} -I/usr/local/include" CXXFLAGS="${protobuf_cxxflags} ${CXXFLAGS} -I/usr/local/include -L/usr/local/lib" # unset the cache variable for this particular header # check, so we can check again with different defaults # specified. AC_MSG_WARN([Unsetting $protobuf_common_header_cache_var]) AS_UNSET([$protobuf_common_header_cache_var]) AC_CHECK_HEADER([$protobuf_common_header],, [AC_MSG_ERROR([ERROR: ProtoBuf headers required; use '-Iincludedir' in CXXFLAGS for unusual locations.])]) ]) ## second for headers Debian has in libprotoc-dev AC_CHECK_HEADER(google/protobuf/compiler/code_generator.h,, [AC_MSG_ERROR([ERROR: ProtoBuf compiler headers required; use '-Iincludedir' in CXXFLAGS for unusual locations.])]) ## third check the lib itself #pb_savedlibs="$LIBS" # LIBS="$LIBS -lprotoc -lprotobuf -lpthread" LIBS="$LIBS $protobuf_libs" ## also check for minimum version AC_MSG_CHECKING([if ProtoBuf version >= 2.2.0]) AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include int main() { if (GOOGLE_PROTOBUF_VERSION >= 2001000) { exit (0); } else { exit(1); } } ]])], [pb_version_ok=yes], [pb_version_ok=no], [pb_version_ok=yes]) if test x"${pb_version_ok}" = x"no"; then AC_MSG_ERROR([Need ProtoBuf version >= 2.2.0]) else AC_MSG_RESULT([yes]) fi AC_DEFUN([AC_PROG_R], [AC_CHECK_PROG(R,R,yes)]) AC_PROG_R ## With thanks to Kurt (now set above) #: ${R_HOME=`R RHOME`} #if test -z "${R_HOME}"; then # AC_MSG_ERROR([Could not determine R_HOME.]) #fi #R_CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` #CXXFLAGS="${CXXFLAGS} ${R_CXXFLAGS}" ## now use all these AC_SUBST([PKG_CPPFLAGS],["${PKG_CPPFLAGS} ${CXXFLAGS} ${protobuf_cxxflags}"]) AC_SUBST([PKG_LIBS],["${PKG_LIBS} ${protobuf_libs}"]) AC_CONFIG_FILES([src/Makevars]) AC_OUTPUT echo " ${PACKAGE_NAME} $PACKAGE_VERSION ================ cflags: ${PKG_CPPFLAGS} libs: ${PKG_LIBS} " RProtoBuf/inst/0000755000176200001440000000000015130744443013116 5ustar liggesusersRProtoBuf/inst/CITATION0000644000176200001440000000513512740556466014271 0ustar liggesusers## JSS publication bibentry(bibtype = "Article", title = "{RProtoBuf}: Efficient Cross-Language Data Serialization in {R}", author = c(person(given = "Dirk", family = "Eddelbuettel", email = "edd@debian.org"), person(given = "Murray", family = "Stokely", email = "murray@stokely.org"), person(given = "Jeroen", family = "Ooms", email = "jeroen.ooms@stat.ucla.edu")), journal = "Journal of Statistical Software", year = "2016", volume = "71", number = "2", pages = "1--24", doi = "10.18637/jss.v071.i02", header = "To cite RProtoBuf in publications use:", textVersion = paste("Dirk Eddelbuettel, Murray Stokely, Jeroen Ooms (2016).", "RProtoBuf: Efficient Cross-Language Data Serialization in R.", "Journal of Statistical Software, 71(2), 1-24.", "doi:10.18637/jss.v071.i02") ) # Also include the normal auto-generated RProtoBuf citation() # citation(auto=meta) RProtoBuf/inst/THANKS0000644000176200001440000000021212440004312014005 0ustar liggesusers In alphabetical order: Koert Kuipers for a patch adding raw byte support Murray Stokely for several patches and helpful discussions RProtoBuf/inst/examples/0000755000176200001440000000000012440004312014715 5ustar liggesusersRProtoBuf/inst/examples/addressbook.pb0000644000176200001440000000017512440004312017543 0ustar liggesusers < Romain Francoisromain@r-enthusiasts.com" +33(0)... = Dirk Eddelbuetteledd@debian.org" +01..." +01...RProtoBuf/inst/doc/0000755000176200001440000000000015130744443013663 5ustar liggesusersRProtoBuf/inst/doc/RProtoBuf-quickref.pdf.asis0000644000176200001440000000026615130725263021010 0ustar liggesusers%\VignetteIndexEntry{RProtoBuf-quickref} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignettePackage{RProtoBuf} %\VignetteEncoding{UTF-8} %\VignetteEngine{Rcpp::asis} RProtoBuf/inst/doc/RProtoBuf-intro.pdf.asis0000644000176200001440000000026315130725171020325 0ustar liggesusers%\VignetteIndexEntry{RProtoBuf-intro} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignettePackage{RProtoBuf} %\VignetteEncoding{UTF-8} %\VignetteEngine{Rcpp::asis} RProtoBuf/inst/doc/RProtoBuf-paper.pdf0000644000176200001440000076236115130744443017364 0ustar liggesusers%PDF-1.5 %ż÷˘ŝ 1 0 obj << /Type /ObjStm /Length 4461 /Filter /FlateDecode /N 78 /First 653 >> stream xœĠ\YsÛ8ĥ~żż‚o“İ`_ˆİİrì¤;{ĈNzÒ}+´DÙLdÉ-ÑNÒóÛïwP‹·ÈŒìš)…7œspvQ…(t!eY˜"¸²°t WH£Eá éœ)ÊBI4ĦPDİJĵXh/ŞÂŻ İ £5ž›Â”×ĥ°J£u…Ġ%Ŝó…uAˆ#„Âi+ % g……+‚R…—ÖJžà)Sx‹A•-ĵ ĥPe d|Q /  R*‹ëP”Ĉşx—Î9Y”AĞŠ Gë"(È`€œĥ jWˆ)B\ T…ôeĦN402'CšŜ‚@%zbži„Kp‡Xh˜+ñÈSKt'f ‡G€ĴhùRÀR9bY•ĵd@/†“ZUX@֐A¤Ô,İ}0…d#„gq˘@dcÀÈĈaȘâ:ĉFOšLĞè [†9@ĥœq€lÁ~L NxîÙIĦd§iü5ö8j2k‰s֑ŭ~ ¨k@P‘¨úFGz;ŭLœT\<ˆöİA \Ä ‡FԄ°&Š X˘6ÁAVt< ‘‡ ĊGııêg(ĥÁ[êaM8á:RB×0tN|ĦûŬs@À1tHwèM—Z:òDžtÏ$J0œŝZ7GÇ-P,q‰Ù#ÙyÀwĝcË÷ĝŝ ˙•?ÏùKŝŠżáoù>?àïĝ{^ñC>àƒéx:Áߓ“ŠyÍ#0>â#ú×ĝïĵĉ#ˆ+?âÇ~÷¸ž†âŸù˜Ÿ Ÿ láS>ĊßSŻÜL‡üϳzNÏĝœÏëst™7_yËÛY]óö˔Ÿñsŝ…ċßĝ_üŻz6…"‘$Ò*AB:Žĉ0sQÀ'Ŭzˆ°0> °DāéñÓf\c2eXڎ×ĠI}Q-ž!Œj;“#8;\jĉs(IŬ8ü ­O~ƒµtн˘)üCf·Á,]ÒÁ§{Ż_ìĵÇ`ûë:Xn ƒÙŻ*ĦżQ ³şY é¸Z Mô5Ä‘U×û$” ÑqQ)7UÉN-“júĝ·SMŠÏËĴš½SpsŠ·ñLŻZ™0qH¨‚tİ]LjÛë¤z‚Má6ŭâĠ²mX żŞ³ho£³6jĴLZ ĉ\§µC.é°]ÓaúÔá§ -~ġĝġš&˙Ĉ˙Ċ?ßùéê8Ż&Ch÷áĴ|ĜÚî|Ġjw5WÔĜÔ³zŜÌv ž Ğù1Ż˙<ĞĈW…ñ-ìùżˆImĞÄá쏰)çv2ldĜÈ\²‘ıf#sÑFvU›\‘9 “ÙEÉ\ħ—ı'sU^–^™á•])0+3ĵ2+3ĵá…Ĥ—Eşaé6-ŝ@_ċ”ïa|`t-o…ÉôZRÑÒŻb=tşÄĈ3Ö·Ó³Öç|z^ÏΛúKV!.“µŒ–ĊvR/­G²Mfoë, RkFˇ$Ü&FÍüÖÓXŠĉmĠ²Ó³ÙĴfġĴO*ë B\—@ ¸ÂÑ:Èö ġ‘Áŝóƒ7ݟ½éaàµbĈ•ËúÒLŜQùà&Ù˙EA!H¨ĤŽ&_ÉXbV—÷–—ŒG+Ŭ{P€ħ RŸcôII;Dˆœ‚óÛVĜ yy´³Ĉ:óâ–yı£xgĞYÉ÷ĝîpCôÉÎ-%   ÇħŒ•ˆ= Ĥ÷ ŝâùŜmòA´ïÁZ|éhm ì ÂĤ>  ‹,7Ê2 2? oiŻRɔßvvƒ‹úµ™·Ó£Yuòn:í#ü²Ä, 0C°Àh‡—A ŻĴŠ›ş‡TÁ7&m)ûÌ\mZ`ú‹C[Ö('Üv>EÚ;=ݏŞcj“şċûoâ~”wĠḞŻ_ħÓá¨G¤ŒĵžÖ° ŻeŠ6˘uù!°Ĝjyö~èé’,M?RvÄF™è0„Ŝv}˙´œRä9lÎOĉìĴ™~İb ŭïñÙçšïóy=kŞqóW½> stream GPL Ghostscript 10.05.0 R, Rcpp, Protocol Buffers, serialization, cross-platform 2026-01-11T10:00:15-06:00 2026-01-11T10:00:15-06:00 2026-01-11T10:00:15-06:00 LaTeX with hyperref RProtoBuf: Efficient Cross-Language Data Serialization in RDirk Eddelbuettel, Murray Stokely, Jeroen Ooms endstream endobj 81 0 obj << /Type /ObjStm /Length 2838 /Filter /FlateDecode /N 76 /First 672 >> stream xœÍ[ْ۸}ÏWà1yû2ċrÍL&“LĠ$qµ“Ş,ċYÍö(n·\;ĥ˙>ç‚R¤Zê–c?¸ıàÁıç.䠘`A3‡ż†ÉhX°LÛȂcÎX<‹"°˜”ÇȤ–÷˜4V°(™tGĊ¤GQ£úQÂ]˔‘–EǔÓxè ]i-<2í:‚é =N$32(f´Ħ͌!pÂ0ñ\ ËLĝ¤pÌ I'žY¨q`VcÓ˘(Ĥé`?4¤ôüdĝy¸RëuwO5ıŭH8}´*ß‹DU„È!Nin„<I¨E+‘DqD$S,Zğ7f‘ħ*#{–ÒùÍŜG‹`,XÑE:RVlNħŒİú7ÓBò"£äQ†ħŻÇáàŭ”jŽ |ü]0Ĉš¨ŻySß=ßI²:t…fñìı!$ÊJQ×ê˜Êê)ĥ,Y#£ì•P‚aV‹+áe2J1ƒQîY.ް˘âpV˜}İ(jÂrfZ\ÜË8ŝžün"¤8é.}LġYÒĥ’u•ÖÒ}/Ĥ2Ä P£7ĈHlˆm*j—]‘$^äuĤƒĴ…zs€Îkͅ ’³µäl-97/ıi3yÚ:·N„vĞŞ $s™˜ŜuAá‹lëÀT³“ö…ꀵµC‹•'ıÍTÈîÓŜV{şê˜Ü{gÜż—ħ<ŸĈ£ E el$÷ÑĊ×BñµPÂĦL²"sôûÑ9}œ“ï×âHí²!{÷0óŒÔ"èAµšÙó{7¤ ××#ğUûï‘:{(=äÖjiÂ4›Ħİ7d]2­ö!½–EÑ?ğÎIZfhĦjWÒÑr›‰“_Üì ‹äW%şj˙S#ΉùÀÜG¨12"xnìAùs='ŞS(M—çu:g€GétĴğQïso!żÏÛ÷:´ÎǤzWaVAßßŬmÚĠ_ş5͊ğ£Ïǐ]–E¤ßµ fÇ´Î!ïÏÍġzùĉ#ú!^m´œ&é(ĜöêÍĤıjv›ûí “NBӆ&ĞĤÏ}›Ġˆ,ıxñOà™,ò h˄ġĊòM3rž8Ĵ?œ2¨Ĉ³DZ(“%ܔäÈùа:ċü½Şó½>”œ\‚DèŠŻô/‡ôİú²Yjĕñ1ü+=ÉUò€Ŝu†ÌF“Pù.ħÙz2Qòršm%ъŬÂÄ ŬtwË:,Wñ —Ĥş˜4ċIĞrƒàAN”~C†§êÒ)†éhn:íÔ,›2í) ìf]ÖP3•ì&F.dN]2G^Z; úbÖpOħĈ098ıĊ˜Çê?VN… ˘?QW%Óä~qì~n8×4–kmçšj †ÉIŭhòŜ×ğĦKCǖ+ʵĵ_ ŸÒÓë‡ÍöşÙfkŠdót!ğ‹Q£ñ´RêœäVWĊŸĜâg²ĝ*eqoy@"˘£‚žTŒÜÏTâĤö/ï_·ÉÎżĴïŜ›'qž‡MN€CàBÇ9pÑA­´D­¸¤B_á5Z Ö†Gż,8­0ënÎh-ú3€ó‡àĴ1<?.›<­ñ­ĜK%ù…z64i"—´‘Q°yĊcÚ~¸8ĥ)oPŽkĉ'"ŜöĜŒÜıĝU`3ÀäӎRĈĤ·iGçÒĜĤ Ċ€ĝŭ€ÚbD 1;È á‹Sàʈ=2PĤÒŜéÈhÛÈui˘ÜBŝͲż‚Ğœ†qX.úÒS9§ˆUw0=ZY.NÍĦp$1Ĥh’{!St҆ö@ŭŭ‰C­ÇġPWÚsŭì ´èJO´Éçb=ü}a£ş~i‹­;ĉG™‰ÂĈ<½°ùÇö/ÛeÛ¤]ÏÔ ĞuÔcjÇGHċ,·nΔ iN ŽCġÍU„l1³&ûÓra”Ÿ;z?€-D1µ)Ĝ´ÔÂv U­ċFßI_:­­ĵĉÊ{fQû+ Ï ¤Íu|R|#{p•y䘖Óĥµ‹´ËB3yig?À1‚ñ£Ê ñŠ\H•)9*áŠĥñ ËÀ(UZ>ìòCÏ>pĉÊAíÓ4{c?G;Żèw2ž3ÌGG°jîRƒÖY—9:h‰*TÙ§™÷Ä8R§ŞH$N0QžóUá­(—Ċĥ¤`G5> sÉ(÷t†C.èȉ]"÷ t“^;´×kÖSšH)-˙Oİù E?í\4ˆÂ%— 49rô“(¤Ĝ½˙ü3’£à-$b= iúmM@ aU¤ÍìŽŞWË1Ħi¨Ož˘9IÇ œġİš”of˔ŬŽĵĠJd\”›Ĉò ,Šé×u_›6(lĜcó”qyĜulgsËY³ƒïÉ)í„Ï~€›Gaf‹5QûTAzTt´˜×jTSV}öpœ–Ž Ğ÷à4Ċs¸ïSvÉżúıo°jכğîÖomÛ÷ğo‹>û]s·ŝÈ7Û7‹Ŭ§]Ûĵ[ÜĴo›ŬbµığiP;ĴšĊ²]IŬŭŭfyûzÛĴ~mùûë›ßâ`ž yŽJE1­% J8†Ìy<5´|½CÀ¤Ÿ"èkäKG^‡Yż>5ל]&ŸÖÊSAŝUfö‰h{ÜSŒô4½ĦsÁIÒOx™ĊmÚĜ<•lD0UŠ/AÏ~MÂĉ5 ›×$l^“°yÓĊĉŬ[ÛQ5\£ÈxúlÀö?‚;c6 G[oÛÍ·Íġġw×ÍëġòŽò|˙’¨Ŭ-ŭÔ]a‹)#*'ƒrĈú+Ĥ“¢Çġzû–qsûúiÛĉ–Ż6²ÎŸÖQQí)O?W0Ş?DĝË`Îżğßn—ŸÛµ›·Íí§§‘L›ĈIòÄlEól8œğpŒ~³n½¨íÀgìO Z Zñ`!¸–´$Iò?1$œÊôšíĤŒ7ïv {ÙòûĠírı<ኖNiî‡z‘•FŜ'ԜLxœpóÌŭz󲕔œŝG‘uš¨şwĦĉ–GĉÓĜ˙¨U.Cendstream endobj 158 0 obj << /Type /ObjStm /Length 3910 /Filter /FlateDecode /N 78 /First 725 >> stream xœÍ[[sÛĥ~?żédBÜog:q|O$Çv.'gú Ë´­V–\‰N“ŝúó-HJ")Érb'µ†& €ĜĜĊbħğ”62Á¤LY‡³dF*œsŽÊ5sQlX gˤRĝç¨1Ŭ9Ïd´Ô$0%•DôċÑĜ ĤEˆ¸L§îĵb:H<ê5ÓĊí@0àÂ2£÷Žc€Á{fl¤Ç3ŜRUd&ĵ ˜ #ƒdV)t³:k huèİ x‚cNzÊ3—Ŝ ĉ´˘#sŬË(â%Q2ç OT4@i,¨h˜†J,óRP‰c^QT{kèİÀĵ'˘x ñÊJ´‘¸,XKŠ˘Jhh4”À0+t¨„eÑ9şJ?FĊRh Œ -œ2¸báABI—˙•ĨJ…QT4RÒ**À€SԐ0FT ”@Gµ  ô'ACiCe Ħ ŜBIPŻ˘À:@CyJƒ§W Ħu v Ħ#^3IŠA‡,ñÈĜTĉéŠPۍ³x#&àm” ƒW'YbÒ @*\i°†£Oim¤Z°â£P.­·ê_?˙ÌĝÖh4.Ĥìi;NƒPžMuĥĠÙUg_C:˙ĈĝöxTä#ô‚÷Je|2½I2‘nòóAïùĝ3Èül´^*™A Á›Ŝϳ’ ?ΧÛI?Ÿ2¸ûıĜ?)zEž†85Ĝ½4¸éîÍdÜ?É ôÍßìì1~š.¨ÓŻÏ~ÏûEâ5üċÔ}ıɉÜeŽÛôŝ Ĝƒ‚UÖŻğۜ7ŞW€tÖ˘:Ëê\ñNWĵ³Uı­Êm]nş<3âAßÛÚĊ÷ĥî+Ŝûd‹]ô†Óĵ›÷^5xŜ›ĉİġëË­ŬçO·ž8y‰iÍwGŭñù`tÉĝûÁhk4Ì ö“iħ}Ġ›@u•ĝvòi2¸)Ĉ“¤şҗ½Ş‘„ ó“Û³"a $§ñÛÑĉŒtTz ÄXÂy?8/ˆc!͎U?hX‚SkÚ,ŝtâgó‡œÎĈoĈìûm&;Ó>qËC%òíŜÍA>¸ĵ*˜aNoGĵxŸó7ü˜_1Ÿ‚ßŝÄ8=÷ ê‘ï {—Sè(hLSáóZ>¨>x“ú˙­ĴÛ s,WFÍù˙Şw/áÑaÑú[£ËaŽĥüh0‚Aiì°^Ħä¤ÈŻßáĊÑ]`˙P½`wdâôôôs˘×’R%´™ ¤·l ‚k 4ÍZAkÁ½!“W˙”÷÷Şġ‚„Ï“QF–HbRäOĠµÖÚ5ŭG¨ĴÙY ğ@ÛBğÑU:µ '’ĜÂ8°4쇒†WŞjßTğ(¨ċ킠î]ŝ‚ñ×ÙŜgĵÏûáx„˙××=~ÎsòĊ?ĝ_óQ’ê)É5˙‹Y”m2*ánÊġ3]VF,˜„ %ÙĤ-Ù-IÛTaŬ%×hґë½×ğ;;ûDíäpcUáìJx¸Ż„Û5î×J粟KKíügĵjÔ<šëċÒ$é5‰+µ„“Ċ÷Iz“Ä— [;úo\İPéܑDé’(*sRHJ“d°ÏŻ n$h7üfx;MZôÓJY"ŬR˘TéI‹‚FKÖĴ‡RÖÚÜßTĜŝ†AèÛŝÇûŻv@îôtcYÓĤ+k^tdÍ­—5żFÖĴ²IÔrAWó²o=ĉ=?\o›·>ġÇœZ{8èmġİ(ĠÎۍ…9ħŭĵ4ôßçüsäWŝÚúUÒ×4[Nù[ŝŽżçĝ1szÓŝ`P †ç9ïċg½ŝÓaozĊÏ&½~>Ì/ŠòjBôÒċy1+ĈuYÑ^ÎÇao‚ áäùŸ·½!- ƒOX`ŻòKLÙĞ/7Wù3÷÷ÙR1ŒrL1ŝc*“Ħ›hĞ’Ò  ŒÏËiŝ'˙óv\äçg´ÂLóëA cšBÇÓÁg^LÁ‹ĞIžóâŻ1VĦÛÑy>™öǓJâ/ŝ™áóżóɸĦ/`â×úÂ6'SÖZíwZ #´Fk·ġEïók›ÚƒJ*íA—w-UjĤ=ĈĵaµHvávş‘ċ žĤ @µäŝûï’ylaÇıLE'Ĝèv8¤ĥL›Œ>=D&`ş`2²vħmÏl°Ÿ)O |O^FԈÓöéħħI PaŽM4ŝ^ˆŞup94g3ZFy‰Z ,µNÚ,zûcÁİà2 ‹´§EÌ"ÔÊc€sK˜ê<ÈÚàŒ™— ë¨ÌĴ ÌDz SÌÖÖŭ`p#‡Ŭj ÎʘFì1À-aĞא*ıŠ­ĠT5!däBTVb:x2H² üĊĤLÀҝó. Z}/pÎx÷+ç¸IÜ œ–ÛÈ­§Ħqœœ&§wnÉ|Nez%[ħyÉ Ĝˆ]Jĉ ıĥe&°vj Vß\ÀÈѸ§„Ë,&ÈwwDŽˆ`*p¤ö”s˙ pFK,ó‘3çïÇVc†íÙÊU_Au0­UFñeMhM†ĤĴÏRĜ\Ĥvћ´öĜ"ZOa´ĥŸERĵ! P^J5ŭĉ–²~ĉ0rĉNtÖşôHĦDÙF’o?=ğà&PU İá&X–РtP,qı+ ë;<Ĝzña÷éÉŜñ‘İĊLíCŸ; NWb6wêġN*ÎıÜiHAŝû9¨˙y?—…Lb3drgPŒyQzŞÈ·3ÌÜLbAˆŒhıEòéPwMSD^t1µ½Î)­)œWʒ[ċ“îˆÒ£×'O·ŽĤÌĴœ°{2KqŞvu=ž ‡Mï”jH)°ĠÑÑ-V°uômÇùЏ9Eħó‹ÁżċOlÒO;Ú-]À\<:Şföê ")˜ıÀîAPKÑ@ Ğ {CԚa35 ›éŽEU&‘oJ˜ë˜MUÌß-oûŽĵ½xw°˙âM o*oA-‘·ĥíôzq[g:Sê2éžûċHó“&oÖŻ„ĜNaµéĉ@¸Ž½Ù˘ ç\ÂìpàĠîëŭŬmâŭáĈ]ÈĥµyçŒ_gnşx÷ğĵš§ÒhY–İÄ`ëŭĴ9ˍL^ü´Ħí†ŝ›ó24‚ŭ4+çsrÉTÜ sCQşĜÎŻr3µÉíÔğÓïŠYŻuĜ)#3­ ĤR™4Ğ#6x'ím,e‡ĞÌJÊì÷™Ġñħ2ŠÌR²ŭrYä?cZÉLX9ó)j­³`~0¸*ˆ¨ FÀiÖJdú!‘Ŭ;&S"3°ĜgÈ´ÊLí{ ÛJùÒ'Œż=>œ5èƒñ¨,zrU7Ós~3³Û‹ì<˙D7—“Ŝġ5äŭÙċíà<Ÿ–ġü§”B½úuċŞÁÀT)şb0e4ï²óñ•ÊdŽnœÂĴ+ç ĊäXĤ¤C(ΌÒ]¤ıĠËA†ÌO >úĠsB˘gĜ0ï3AsÜÛħMCV~PQ†ž“Ži­Î·ZèôMŬ"¤ïfŞ;úBDˆÙJßËÔw&}+SßıôL}Ò2ĠéۘòÎĉëËÀŞq:ĥôÁL}M™.Ġµ/żwŞnBú°iŭÂòş÷qëŬğ”-ûmI…ô M{ÛİÖŻ°k·’TĜ´šï—xwĞnmñÓÜäxÈ´ÁċIƒïëtÁŝ`Òż½ò$r’÷Š|²˜H;Ŝa>nĵí]šĝÉÑ7wÊJ”Ġ‘ìf˙ıÎNı3Ù­§grÍL\ċġ_jL̓@û˙98ĝX&ŞoĜ=ЃIĴéuñò™.çÉâß·œžMn 3ĞŸ·²ÉuۜQÖ6fTӁœ*ç3*oî’ ŝù^{d\êħ)[2j2wċ&™°6ċŠJŞMòr%Ö.›ô!Ĥš-uêîž ˜J.[Í\úpwċÒv˙ġÌÒ2ĈjUš„-Ôöí`dBXݰÚ=7R~‰FYsô92%pBŽ´ XÇL Yԏžü²œ0ÎÂ8Êĝ€ċô½ÀYOù,ĞÀş” à >¨¸!3l†ò+˘ü^ĜÈ8ğ2ŭÉ,ÂVM)a”ÎbFOc2Ż7M€ÁÚ´fÚ\\䔞‘§ Š7—Tê½ìnÖĝĞzÄ2uqñ°Á˜YŜá˙endstream endobj 237 0 obj << /Type /ObjStm /Length 2896 /Filter /FlateDecode /N 78 /First 710 >> stream xœÍZ[o7~ß_ÁÇ]Ë!yxŠqçÒ¤5l7M[äAuĤްŠlHò"ŭ÷ûÎE#iF–-)ÙñùñÜ EĦ„Ħ$t´ÂX%ÈG<µp6áiDpOZi ´Vh=NhÊ /´w€9’F(˳aı%ĝ—ÓÜ!ü2ÂxÏA'jƒRàWN&ĵwüEd&s•E^SXñ•×Âê€WŜ 1Ĝ“°¸a…u<ĦwÂzFè½°·ƒ°QcĜ´M‘çIÂFˆıa@ §ħV0Âyô Pşh€9Xáñ+'ĵâσž4‚6Ğ(ĵçĠĊ• dP`L™M~E"Âç8Œdh8* E :ĝd¨Ÿħ~֛‰}ÌzÑt!hkÜ~Öû‹ġŝb½żXï/Ġ‡•êJĤ~ÖL˜êùR=_ò=ô‡:ÌöÙ<+‘MpᐇĊÚiyXĴĦöÁĞ+b³R§&]?û$&rš¨³Möû8ÍËüyñîċùÏżĵúîéۋ‹“÷ Pñ|zuóq<½ĊŻé“é|ĵüéx6_<ŭ4š ˆV^ŝY9żšo7³ìEd oFġ ({Q\ÜŭıÈË3ô/o~™Ž1!Σ–Ó^ç×ñÇĊ'&pPLÈê÷?.ëònÏıeß*ğ|cĝĦ=Ôù“‡6ş}YŽŻ?5]색úÏâĴ8/>ÓâĤX˙Kĵsŝêßf²8ŒqĤÚĈIsĈù‡ē}¨^žŽ'% _ì0O£ÏeÏIĵZŒ&Ğ'ÓëI‰ħĊÛñ|ŽcÈÊ(.ċçw‚×!açDŠ÷ġVĜ‰iŝföħœĠ ¨2›˘£›fbg2£{˙ÛïpPàħéŒôn2áq/Ž9ôŠG“÷Ò²‹İĴTPV°tŝ G'ܳ.x3žŝ§›…éÀĴ^ˆ¤bEßLké KRÒÁK&dvñ”‘NÒA™`B’Ĥ]’j^{’–wP0{tpÎÒaÙ`:>Ĵ!` ”g°–˘TLehK`Ú/q9’}x­Ò‚³IƒJ -ñÓ Çüş[ke {Ppaœ21 @Ž–£à/Sò2Ç_!Sôۂ]mX‚³pl›š#.Áééä8Á“TjHLPHâUG ²qàÒ!à!%”àc]{ï͟0spmNµƒ)Ġö ëĥgY}µ=›ï @Ħi"¨Ş›,şi#°İmòy`áqMë×ġ†á½<9=˙é Ôŭċ+ĝğ™]̵av]\7ğàmf7ê-fq.N+Ŝchƒñŭ8“׺Şe[KŞzr!˘íêġxìߢEĈ!pw÷fhŽa~^œïŠQqU|,Êb\LŠÏÙLß³bc}×5֚§2Öü2ö뎛_ëµÓÛÑTs{Ÿ­†…{ĵÄ ]`IP Ĥ× œS$=Ìù(´şÓJZ;XC&xMÔşŽà+}`Ĵôœ ²'gzá!ê—ÁN²Òħ”ú Y WĜQYVxô|ÓĴ˜iG²Ru­z¸WS žÖ_UpùşGoìhì;Ôf/ÄÀ3³~[‰Ó6àb÷ê:i YL’ Ö,¤U6ˆ‰ÙNĵò!³*äĴ›ôœ˘Ô>s+â]ÀÛÇ,Ĵá1­UöŻÏ^yñ”}ûßVb,ÎUšĠñ=‘•_Wñfğ‚§- >䠚ŻĞY¸W]5[u[5ûy<½›Ÿï&‹ñí¤İFĦzçĴZÓİ9Mš§ZS¨v]ĦQhW… )íW¨ûû˘hbNcà(;NŸbTNL£âÌşKï%:Àĉ-·ÄáÄC`60|=3¤s–llħYLžŝ/°ÙôB‡žéş]Yµ\Hñ°ğú’/ž\žœ@xžż_S/œµêFpCż4IÑ ™zLŻ6AĈ˙7t‰ZQ%ŞĞIn9Ë5)˙Zü9z3ĈŬ•Ä 4jŬb7+ü2°“İÖUK'/^İ–5êìĴZÜħT‹6Ž$ÛÄá”GÌMœ×•ä8܍0Ï{yg§,%ӂ#ŽĠà8\O˜k T™òkfŻ—\-9ۍĜHZ. "8Véè1ĝ=ààĠ*c ŜVôáà6ĵ­Ĝɒ!˜•P:"Ġ`ĉG`‰KIĤl,Àuœ/²NF³cĉ§“ÎŻêI‡ÇÔ:i}ĠM‡“zL:|‡pa‹"çàÀ4Uħµ^ÙwÏ6:Ĝɓ[˘²ˆä!í !7".¸SöÈĦw%ß)8ĥ—³[€š6ĜRŻ…Íß i›FĴ şıà%—%Ĉ‚ŽPá1ížÑ:¸È>ŽA°µ‚‚Ÿà‚C¸}tÂYÂùĝ!lÄ.—Á#!֏ #°E<9a|şmÇfĦ!-—AħrtóuÀ,/ÙÁR@ñ"V˘]“’É,"µWclMŜÁÖä폀­Ç*ÛÄü=XS`IU|!(@dB%͗m”„AúĈàĴ—žïù4à‚’–]ˆ#€ë‹– ½ĴògHCpÖŜôJçCä* lÚßœ…°l¤kpրAùRÖŝà6snÔqĥàĝH*Ë FšĈ.ŒŬès]ĈYĥŝ4ÜŜƒÉG•)^–“˙–‹ñĠhk‰bK°¸1ÏŻŸœž=C8ööĠÎ÷ 8Ş^¨‰²wpP_¤ée]|j›Ħ,ÎËĉnÌ~ĵ  IçìÔĉ…ĥ²<ÍZÜ—nl·jǸ5¤ûK ĉš _CnrŞŻ€vùhXGŻŝĉĞ~ϐğëï³mäÂ{UŽSQ/ˆ#–1f½ŒÉĝ6{­—­Ë÷Ĝ•ıÏoz´ÉâÚğqCŝlœ 8Ŭ‰1D.ÑĤì߆°#iŽŽcMNğÖàŒf;ú@lK[<Ágżŝ*gċ”ÓäĈJAĴ•xÍj‘vŠÇĴiÉeO·6•Ïŝİ˙t§endstream endobj 316 0 obj << /Filter /FlateDecode /Length 7140 >> stream xœ½\[s·‘~gRŝ |œ³%Îî@^ĥ˘l*ÛÙ8ĥ6û°Ù‡#’˘¸&y$‘”MċÏo_piàÌHJ”lùÁ‡# èë׍Ĉĵ=]fuşàù˙ç·'ËéĠÉÛEOOó˙ÎoOŸż8ù×ï­=UaÖÊÙÓŻNĝuÓOƒV³²éôĊíÉOßï–Y§”LšÛĠßïàħJ:ú4Äósüc?B Ó#Œ2É8ĤWĝÜCœ~µ;³ÖÌqÑÓoa„]Œġvú G˜eñ6Nçğ:ĝĝmât‰óÁèèĤğĤr,oŒÁçÓopĴ‚ĊS¨e`Š=>‡Áı‡ç~ħ{:˄k3}ğ§Waġ˜`n$;%•ĤĞG|î-°=<Éë §ĞK^5,qúwÜ$gyh³ïy’âôC››wCûì”ûĊÓ˘’uӍx|M££³jú@ğñ ^ÜgÎë°^à{zfĝ%fžsKŜy\B%†D’ž~Dĉé9€Y[‚]ÜtÁrYLô/ÚâİN^Át7bş—Äuĝ³N.‹ĊÁH0üD%Â_ÖWY§’É"²:„"€hƒÎğ‹`V ž¤ÈˆÔĴpR™ÙÙÛĉ–´x/’·Éħ R`$µÒc5ñ°½ïh„]´"V˜Ċûé°;snU4Ó˙ĉŬǤˆF­Z<˜M[ƒĥû ÁŻIĉž6§½`ĉh˜–íÙ´G#HÓS“ˍ§’{‡ÑHµ2öH.ÌHœ£,²ÊTj™FŝçŠŜşˆ,€%j:\Ŭ°Î8 ³á?=c:ÑÛü>›'ZmÑídœ·áĞĵ2qVnàĠ×,C†ŒÒ€-Ċ’ÁÁĜBܢòî£rjşcjpĝ‡[vôÙGĦŻħâLk GĴĝOvU´Ïì8brÓ{âûÂ.&ïñ]&R[M>%¨Tż”ì‚ĉİp tîUĤĵyWpİVùi³ĞżĊŻS¤¸*„ìQa(XHħr"hü3ĤÙEFœ‚‰y“Ió&żE˙†a×ż;’baŠ‘Dìú—ìo_œü Xë 8ŜŸ€rĊӟ Pŝî$B€D7:{sz{â´nŜœüħ8šf^†Qġl|8›œ½(úk$dòeq\‰ĊÁ } ,Œ]áÄÓlÛ1şŞJ£Lıê LL³ gË&mĊ°\mìá"‹Ky—ŬH2>Ğ ĝĊè êĞ 8¨½G‡İ@oş˘fŒĊçY‰=èÂ!KĄéĤxsÓÜ 5ċ£ó1˙Š@~~xᎧö yGöMàò.òc°tùx_\K„ DĞĉ@!_Aˆ1ĠHpÄ=ÏbÀ Ŝà$1¨$WŒò@` ĠĵŻ­‘ƒïšXYŭxħ-áȒÊfàŸÙN:p×vĠM DİXµ2™µ°‡dĊÓK~ŸÌ³‰ä^~hû|Í Úێ RŠ0óµË€#ŒÊ— Ŭ´óĵ‘Î간¨ó*OqÑäwKÖPžìš…égÖ/t…C‚|f`çÁƒ"“+VLÀŝMĝĦ‘ÌV‚{R!÷‚í½’Ġ Q^à{ ŝÒ½œ(í_t°½Ĵ³“üy)VD‰*tžiP|ê°^If1> VBÁ7ZíÉëÒĞà>…Ê>Ö_ĊǤö¤\ò£ŽL*%GçYÀ-lY´¨=›ĵRÖÉ è–ŻoŠ%ß4Ûàí‚Hî+ú~·÷·ĠéMâ'ƒ[càç]ċÏ 9Ğ{Ó;Vh ‘Ä}f€Ÿ auı+Ĝ™Âĵ;óù³'\öÙ6!Ċxj\ÈŞK‹dĠMĵÖ+"‹ħħİY†;Ğv΃TQ£*öJ̘–Ë6eŒ@öÍ’°p0LĦ&÷ƒ<ĵ βħÂX•tÇ|Šĵì' $yґ€68ĉ6 А N‡{-Ż"|ßÏbê˘ıélÌwQ·":=mp ²kû}%iÀşá˜Q˙ï½5Ò{ħ˘×MÁєµ&Ğ;ì|{ñâĜ.àê9ÖtĈyôӞËlÇħP8:à>*$ YMϙteÙïƒĦ)P¨OğĴ{ž1ñ‘ġˆF‘…•÷)1†€emà|ĝ"èέ¤CN,—8´oQäÓç+H…cĴˆ“Á†pÖĤü3ş`%jŬáwzüAĵ(ÔêN¸è"àˆK²Sv³MJĠ–:ġ¸Ĥ™“§ÄoÀXËĦèBDöÛĵ.k´Í•´£ H‘˜§!7Lŝ(&fϞc"di?ĦŠşÀ5ÀYœÌĞ„—uo„a0ƒġi%O@Ê$˜Èœ˙=/‚u½żòÏ\ùO"J.XnñC’‰/Z³ ) Ò§‰xĥ—”B֓ğĞLÓ7\´ä‚ĊTüèì‘yÉ[%ä· hċ˜"i?KBuŽĴnŭX3Ŝ=9/ èmĊo/lÑ-îPtѝEWÑ<³ ÑoÄpÒKĦ‘LGï§ŝÉLH*R/†âkÁZ—HÔ hò$T”#;്zZàsï€ğàĴ­q`*fzqĴ—­š‚u-KĠ´%QÎvĝESğz­>Zò0ávó M&RWßîjàQêÓdž[Âaİ/@ 4ۖz0RĤ Żx—â´d²½ž  '3BJe(ĠÚ@/B DMċ "wĈÌ –CQlR\<IħóÄL(whkğ·Iµ/ÊÎ;óÙsĵŠ‹Öq’– †­R+ıbĤ“ߛ# ŝZÊ2ۈUqİĠRgy;>‚÷êK/ÊŻêtL)–Zċzàœ·é$ĴĠ9‰Á˜yŞ@F"ËjíĤŒíUġ¸Û•OD˜•Ó](굂§VAÈŬÇÀIËÙö ‹£VNĤ|„ *ÖsˆğFÄ^Ô4Ĝë‰]ÓÒ¸DA·żÚ Ç´Œüd߅žâÏċš?/™g3CİĊ— q×ıŽê|7ĴF1ĊƒœM33ibWkžQ#žÙòë•ÁHqƒ÷í.›C=ÎiġqĞĉˆ(ġÔiŭgäí…¤ôÚrÀŸówÉ3´ċQġäH\İÉ;5û°˜²Ĥ°Àó]İuü¸sħLàÔÀ8OÉêFi _Kè$ߏp–8&ô·/G´&Çĝ™(£ÉȜä¨Òb$ëê˘€×["Ĵü´ZğŜ0ÚΕ—0²ï½sċĐ:ÂS0áż#]Ê3SşäċÔÏÛĥYĤÊnèÒ!Żà `ehÈô“³ê2Ê[˘cDŽĉÒĊÌĴ8€|ÄaN‚tGeŻß7½˘m bt2ñ á Nú µé(g gŒ ]$a‡?ġXĠ vKÈ*5UGŽœÀÌ3×ŭŬñp ´ÇĊŭ‚7nx¨Ž€O§ÑĴb"Ceœ²èà× 9èo‚‚´5ğİGŻWAÔ=—À%H/ġQ£%ĉİ;°ş#rè\­ Ÿ(1Ġ•{%N€ŝŬ€Óĵ€G‚ñĝ]$q^|-è0‡ù ]ڑˆ{‚Ôòà}áoż(™ËvqżËĊ€YGIÀFÁší}q=bÙ·sÇñ â“AgĈ'ôn!ä ï­Xçħ™GgA…Ĥ­Dâ²áĥU˙H%ò%Òĉ“Ú´Œœ!áJ!~ž!mìêCBÍ îÂ됨¸žìŜ7Ùʏ4-Š´}*Q¸Çç—:¸9úšŜö65!V²Q•U¨ıXGRgµ2I~]×Ì1³Êg Mñr] ı™Ñ˘ƒ6ge³c´ĝ‚8•?âTó@ĊŠNİz]ŜPµaŭtKêğ(W7/Êá\o$@ Ÿ-ú8’%+#z˙Œƒ½êKE?ïj^żgƒŠŞŞXèdüh–ÉÖÁx:Rsb)ŝѽ@b2ÜàßL!ͅ#p?{Ĥx`p‡ĈĜû‚]*ñ™m)y„Hyğ¤¸ëjğsäĜ5m”G‡€ž‰¸ç+‚ê2ŭıàç~ñiġË<@ُ‡M2„÷›ڝw -Í£ŝžy3ĜR›aĞéÛĠ ;ĉôLƒCb!|CÂ2|ĉ #a%é° 6 î ĥGü Ñœßb–äYĝù)Óġ7vŭrlÂ)]4èWy£ÉU-ƒ :“úFVÔâÓÚԐK€šĠˆòl˜{ûİŬÒg›Ê9'Žn‚Ëı5„–ž–°Ŝg üÔF‹µİbòwí½"á~Œ!HV4Â6Ñ.)Z9†?ÀjÏwµKQ̘SĦT2@>)֛*úìjek>˘ÇY}hèŞ4'+ Ş7ŸO`rKá1WÜ"ì%§-y y*  ö3ĥÍÚC^{y½}£^RwFûVNG)ì"BÊâÌÉWÙhñ¸^Ì΅ö°€xçN-¨ñğ ä³+M†ùŻOô*;ëu×dè4DŜxj îq—Ħšıħ>µżÏÑ'ŞœóaÛpiIw*ƒ*ú÷Ò§t-Şh⽕ä”ğžŸ3:0jÖ Ó—ŽüëdşÖàeвVƒiÌŞR Ô5‹zC-;OÊI!ŭŜp#’‰bFF/y_}˙sA/‹ħ˜…! t€ĉ3ÊpĜT|hZ(59[òR‘)Cn&5¨Š –ú|óIŠĠisÏïx´|1óçÀ”—YM[Z$xï!‚ehE­ĝ}—z™˜;.ÀĜŜœ¨8 Ë`-Cс|2€¤rÖ²$jÄû :”&È×5·38*Ԉ0QRÜË)Iòx`sÓô›8=Ŝ@úıÙ²0>ċY {b2c­\Ò^_7+“Q‰C‚WŻùElmMû—Íà;U­?÷/;ŸA–âA‹M*–"Ĵ£ïüGn¤9´9> ‹ ˆT‘,ĥ†HTxh;yl?3Èċö~öô⧗+Żħ%dşûëÙÙ°#g› Rd,Ŝ?F~˓`4@’ä¤Ĵ˜uŠî­ħ ĦÂMFF·Ÿî†™ŝ2ġ“â;ßÀs§ï>różß’£9`ñyħ§:Dˆ‘ùâŬí˘žU)ßG¨ÓĠu#²wŝD²\cL/żR½wĈè*l·Sò. ĝÂ)°ğf\vbĞëu㇔Ûä_vÍ2ĵ€ Ç d|“Cĉëĥ! {`IŞ€•Ĉ7MĊŜŠ£tÒÓtĤ°ż$‡ï™ÔL!ÌĥĴĵ”‹„çîù|€/,ĥ9ŜÖÈ&ÌEÈ"¨>5ڙÓS³¤Ħç:dìLúFš‰=‚bá ĝ!@ÀgÔÏ3­b’@]ö ÙÒDŭ K²FĠd£sÄtŽCx:ÓÖ¨ĵÎ,dî‰[_{é§9 êWä™5‚hè.„àŠÀmċŽg‰.tĵžŸšXwĜï#ħµrôë—üjĊĊŞ>öÉÔ'Ħ–Ô‹Ì&-5ŭµPÀj·vT`|³\DÁßu–ñĞb7{‚çk_eq&ur‘ |ApÌĤÂn"¸61Çi§“ĉħ…ß œhg(öžw޲˘äËv·èVÑóĠQ€Ê ³pĵ İ–%Pj'mEj˙d݃qM›,¸uŬ‹P5 !WO[Ž#?˞`15JÜ :éT´ġvt-#Ŝ·”£˜kŬj½áoêvMÙ.%ôĈĵ˘[ħR—C½²"…ˆm×Z”ĵó&AşMŻĝsĦ.²ÎğIĜŭt¨r,è şĠü4Që6'5q6Bµ=]žUѤGzĊï/cŜc5]gĊƒ¤”ϘÙ6(ˆr)ñ ڐŜinċT„İéĜcÓNiıt(Êe|ìĜÁ)§êë^Ĝ–ĉ3]½”eĠ³ƒ‚Ô÷Èb‚¸BN×U?Ez4^ƒċ˜"ò)EiĊÙ3P+yuFϘħQ™IĝŜUÈ1¤~H´W^í·T¨Ë…×ÜÙáMóҜ8ċœá6 ¨mލS)Ë!Éëċ+ñÌÜ%Kğ46[Ô¤}#SΎ‰bœùgKĜCٗ"3Ç7P—àóË qŸŽœ9Qöχ8šÚw×ĵ‹0§•AĝÛn;4_ğ;út_FÇ}­ ŸşhW@İÀÇPQċ.û·ĝ‹|âG5Ş×ĵkpÉŬ{²ŽK~ ‰1Igp˘çÜ­T_ÚÂlj°7žœ7ħ矋RsÁ2ä 1Ħ‹K[ıĞşŸuhÇW›YG†öw-{Ḛ̀ĠMÀĖû½ŬèÇ4é4ÂŞŭ".KoÒ҄h-ï½>ßħ¤¤?×ìLu"ʖú ¨C-ĵĤIUßY:GŸI'Ĉ ǝ#Uùċ½#µklI-aPëXŭĊÓ×ÍĥİĞéJ‚‘Ëu‘;qx+p ċŽ5ĞÔ½¸á¨z–˘rÂBVħĦ½½Ë;úc$ÈĊ]û|ñíɋé„"lt‘€wwb¤ÚĠşlxÉï__7Ĉ·Í{ p(L{Prż°ŝż5‚É@•%xm*ú“‹m,òßé)šLS+ÚY8*#ï,Ü[Oü&ŜzêmĝK’Â>;•ž÷ş1NŒ–X…°mħ´$úu C™›…×îúD ĥÚĉêjë`yT2“Ö¤zwŽq×-–k!b£‰¤íĜĦÓĦI³Ùû<›²ƒŻĜ‚\ˆċ’·5›î\˜ZîDgŝüӑ *!˜"µì0"ŝDœ70SñR‚ô'İPWqŒVc=Ŭk‘‡F|„ñşċÜyı.ÔBlìPš›6² ñv'"Ôk…™úş–Ŭ1?ü2ž]–§Ĉˆ£PĉżŞ×ĤÏŞ˘˙ġa_b*êWS§BwĈ‚x£¨UJı„Y\_ĥ6˜>’­‚d´(éʸqWÑŜVA‹gŞèĦ°Zı`Ù(â{kÊû´Âj:ßÙduuı½—xÑˏœoè•òp¤}aU6šÙG×İ~ _֓e"˘¤ Krĝża3}ĝŽ+òúT-}ÌKXçÖ1˘ômÜı@ÚŝçóÑôĜŝl,ƒ£1­TÁI@ŸYÁ;ĥ mMYîŝän-‘Ŝ_7Şò—ùĵ˘žc" oü8É1›ü |ĤĈ¨CAàό­u•`U „ü6QŜù=sMhğHñy£¨¸YŬĴ…é òrxğŽ2XTÄ|­”7",vß7ÔÌ ;9ŬhRèŽg`G_;9Îx9òĉžH {ñş v/ĴŽ_2Ĉ›âÄÁ“tŭ—éš´,‡Ĵ½! „éÔÜAµKSñ uH1†ž|’ğSóÔ˘Ž•Ğĝ7HKNށzQ[!š=m$yn–0d<îż>glšMÚöX742ô‹ZcĉäG¨ĝ÷jË@Jùà5ġRşJÏĈıòÁkR‘ä–Ġĉoĝıˆ›ĵċëU:Ġ:U\òÄF<ïzħ£/Çġ@ċ‰0êéEğ/Q4j­ß)Zöc‡úÀ JëŽ;zl&{³Ğ{×íçϟšĠíĴmù?ĜÔñÜ!ô›~ŜU•*RëZÈĊY×=È%x€Gt(Ĥñcèàúİ.NÖU6zs…ÊݤĝypáĊ?´×dԍOϸèGicŞ"5rˆÓ—#Dáú¸2O‰3şœ› a%ŭ%zhš^×CŒûÇ È‘ĥÒÔ× ùÓg3FxßrƒOéì\\ĵ(,L…#Mx8l½nñÀOccıWZ@îY÷qKœÍĜYġµrqʟ&üfƒË]wFdñm;›·}/Û'„!2}k\"[~ïżM ?bÛß<ùXݝĊ=żˆ…fü$ϵbÁ^Û~Ó ˆ°pv­QŒöF§¨°ˆDë²tF:y.ĈŠ5nÔ`Kö×t`$3°;6’Œç’‚‰²ħQfm££™ƒ²ÓF—Ĝzkè^fĤ׍1êîÒNY8’I0Agà_ĝ˜lċ`ò ŒÉˆláġ*Ï{IÔ ĵjN|/ÜÀŠyŭéä˙ùž(”endstream endobj 317 0 obj << /Filter /FlateDecode /Length 3375 >> stream xœĠZmsÇŝü‰Ğ|ÚKqËĵżâƒ &`ˇ¸\‡B é„tƒ+˙=ÏÌìíôZŠ„ÔµÌÎôôËót÷Ŝû‰hċD¤Ŭߝ 1ÙÛxż!óÓI÷gçproq{ÛêĉÙvÍê­éġs@i d@h­*ĥ}SmĊŠÇUgĠĊGpƒ[żÉê¤~“h·ž]dÊäœ9ĥìŜÙÎ+tÁ0Ŝl}.NP{9§›ċÀ½ËìlêÖŭsáEĦ#•M™ïtĥ:™:m˜šH۝­ë°è엗{¸É4?T× ]˘½#rçA“^7.‘+˘“‘şĠž²}\PğZĤ}Ü£l+@N-Wë&"t!Şü´²Ity‚‹…ÖıĴC¤JcÓ0bHšċĊÒÁZ!llUšVhÚ"ĉ˜ŒBž3&@$aüZ˙[™Â`’â[äóz–Ò[†>#8ÌâzżŒ"ċ; I†ÍÙĤ½KÙÔ9~SFtS £ 5 €f‚Ë`²Š‚%(ɊĤŠ–r`I(fˆVIV*Š•ŠtU]ğ ­˘dגÈiĤŠž.¸z¤Ĥ…ĵK‡¨mQ}Œé0·H䒓1èÉ]$Ĝ ôß݉´fPË.RìtN›o’hĈs*}•9‚6ĉ:ßš|UM´Êuœrg&1C”P)·ûRĝ]ZĴĥ oHR’D?ȨíEä˘<ŽÈ \FRdíIY´È$3L:ÊêJÑw ΁:7ÜSĉ ­32)ŠW™öQ–f7è€[<#8ĥ]İŠBıÉ nFœH¤ÍÀŜm÷ Ùn^‰vŜ³İŭ9xSİ%³n0Ğ]ÙuKç0s”ÉI_ctUŬeÈCJîûU$ñy3°`ÌGÏ t:”ZÔßİâğ*’{UÜeQê Í%N<ı9xWĜ ިAĈ3ŝBü÷ċT7ŝÂEOû÷‹żhêe%Éá܋|‰ ]xzŠ2‰–,İ/NX$O7ġJµ˘İ˘OuĴ È%wÍbîôš˙/ÒM’ùI·U$³"2ô%gËî@ö%C*’Š7:W[rUİĜZµnnCXsUŸĞ_#§$?œò xYb/u£iµq*Kóħü) h Ş)jnftԖa°‡×´;Œ*Îíä\Ÿ;ôZ–@ôÚèTOħı÷ ¸­/o"½K˙š JĤŝĴ>néŝĊ²bYWĴ{ ı{ût]ßÏİÖ£’OòE/-]ÏV¨ıȟä ĴD„Ÿw™ŽŒ´Ê3é8/˜”Ë‚|yì' ßŝ-;ô‚‹ï‘í´oœ^wˆ˘ärÏşVĞÍûòï–Ŭ íWċqW{Ӝ(İM-]ü² ¨zûgJ°ôÛi*DôBĝ!_ŬÉ÷µvÁgv³ŸY„{ɘW­RĦґaF?š6h2CúÍġ¤#ĥnĵèĥÒ頊dÁgĥ ú™-ÔĝÛ‘•ô·=ó=Ŭ~ˆƒ_zi(Ö֝ÓPeq§Š_PÍlúĝ.ܕ˜ëŻùN}s·µ1˙ËóüŬĞ;w·Š§cñË´ÙOTñŸUüĥŭ­h“ú ­F€C49Ş/¨â!{ĉŭ*°ZŸR‘ÓDşQ÷û}}c^Erĉ£*>İâşûŬ*Šħ/’È^›Uü‘Ŭ@rδkWòÖ'›nħ›*6B’+ÊĥÄŞOĞĝ˜:•œÀwĉĴÁ›sÎnû}şÍf¸ĥX7\Îíe/Ùë)Ğ"9áŝĵ.t9ħÑ3Ö [Ĵ˙Ċ:ïĞ€ç áħĊ^ĉ kƒgìڇ—İ8ƒ?`û5ĝ6ëòÚcށœb‘Sìoì}É^÷YŸ<:GÇKpà ĤÌ8 kŝĜ$íŝKh½ÇjGD>ó7ٛ0€Û}e$ĥğ{ÁÓEĉìÒ39ʒMö­382bájē1iĉWß³öÜŻ"OÖŻn’ËÈ;ì0.úB ³@hÉ`o„cöŽDïĠeFxUŸ.Y‹d/viQ´ż–/öCùr™ĤğĴ•TŸ×µWù™)mÉ/iïV‘ÌNÎÑĴâœFúkıÄ# ù#v‡Á7Î~‡K_ğŻô˙¸ŻĤƒš“t$£Ż%ë ]ÖÒ¤áğ‹ÍïiÓë·§ìiÁöY;íŬ¤É,g2òCıcVG’§XC°áòé2KóÄFöŭ8‡1Ç]Ċ nl†ß…îÑ_ÚS‘Fj‡µŝ!ĞŸ€żŜdù?ˆu2q¸ÊĴäúÑĈɳäï6ŝlF¤Ôendstream endobj 318 0 obj << /Filter /FlateDecode /Length 519 >> stream xœ]”1nÛPD{‚7%ퟕ7v"Aäùe¨0Er‘Ûgfd§HħFoùµ}zy~™/·nûc½ŽżÚ­;_ĉimï׏ulŬݽ^ĉÍnßM—ñö™|߆e³}ú6,ż˙,­ÚùžżomûópìŭÑî~ÓxÚû2Œmĉ×ĥyìûúx>×M›§˙*yżtŝüé~Ĵžç•qŞĈIħUcc> stream xœ­XtWş![34lBFĤş)Ħ’€cŠéĤY¸wcËE÷"é—ä† n’ğħ… ĈÈĤ7C ” $°@(K ›°osÇ{½ğïJ†$/ὓ³ç£#[3wŝòŭß÷ŭPf(@ ²wZn7Ûĝi˙€3€Oè„wŝcrïzs"„!fıcĈLÎÛX!%òF ‚¸D½446<ÀÏ_f+™=ĥy³³µ[´hÁtÛ9³g/²]ìàċbëä!ó÷ ö‘?vÙn’zĝÈbM·,ñ—ÉBϚ=Ó#8bĤ4Üï#)Óm£dŝĥ}"|£|ĵm!2ÛµÁ>ĥĤ@gšŜíÁĦ‘2Ÿp['İ·OxEQK–…,—Ú‡~êħBöYäʨUÑ1žkb½œâĵ}Öù÷óß°)psóà!Óg̜m7gîĵù,X¸hñǃ-(jµŽO­§&P¨‰Ô$jµ™šB9SïS[¨İÔVjµZNm§ìİÔêSj&ċB9PŽÔljeG}F­¤ĉRШyÔjj>µ†ú€r˘ÖRÁÔPʂ²¤Ĵ¨áÔj$ĊRïP£(kʆM½KÙ  SKI(3*žz$Ĝ*è0w@³P Ü&l1[möùûĉ•ĉH4_”/zB§1˜<ĉ_?xv”AÇ,ü`Èú!MC͆v[ĵoqÙÒÚòô°÷‡ĊZYZ)ĴŽß1üŝˆ1#ìFlÑ9 ùov-ûìèwîŒÚ<êıġk­Íg£Çòr‹ŜL0 w ĵ³VÀÏíÇĤT'Ğb!’ % û÷½´ÎˆWÊCäÑ Ä#ĦëUmêƒpŽ+Ş”G‡Œ7İP¨Rİ5{Ċ­Hhޤ"~×|ĦD¤×|m 7A/7^ĝOñÙ'¸ÔŻYÇÁÀ ġ‚'H„ ‘AĜ›—ħ~›çşNùƒ’j.Ħ/䂷_p”uŞóêrâ9EéюȇFÂŻ GK´s9\ğJBëU]êVè„ó m˙%´EŻ I°SJ 4BQhœ@ïrVò´ïá ?…F“Ż>|ñíĈxPħĝyùñ pƒyè žÈáĝs•"[şì `ĞeÒU‹Ċx ˘N4ÖB#TJt^°RÀ=eWBd¨ĞÄcÁËÓÛĝzAyŜ:4RÈ!)‹ĈÎ}‚GcvÖ<Oxş@֏î![‡a'Ö|*’§6A4ƒşö6ĉ·Ĵ<²7ho ¸ÀNÀÖä€do_™yHŻo’˙‡ApÍöÎèµcËaolŠB‘–ÊmĜ²³m[ĊJ°ÁÛ,<Gá4 B;т§hÔOÚ4U\B Ä)ĊiĜzêšù)84ĝöĝŸKżásxn¸tôê×EpuÒáIêŬıP LJ]#&m[ hĴžÖ&¸GZ·•ä‡tx2ëˆDû#š[€Aƒ~ĵ…ĤĦÉ3˙ŒÍ\=ö„ĝŠ;hì`ìe9hĦ@Q.‡Tˆfúr~ßSG“­n8PŬ ÌħĥĠĜÛnŬ²mWŭŝħEo.AÌCSÇ hòŻğÈèCô˘Q8ŠÇĥh ^(Ĉŝ9‚ċŝ•CšÖVıçm,„qİ›"܂69…Ĝ‹8ž`£Ù€òOO‡„½4Şe%˘(üNôTĵ˜ ¨ıBô8ËmıĜ€HDË3Ŭfs‘(˙͂˘EĊĜŒ1ˆvĦtóÊ7$”Û÷cû˘î! !rFQìÍbdŝS*cwCÙ]_ߨk;½Ĉe§GÄg‘œòħ/ŝŸpoVuޏ@ éH˙Í£-x.]ÏżÛ(hşŽœ Ñ~İİíİÑIi \\4ÏûıácwԆ&ŠƒZR¤´ö$‚³Ŝ5ŜĠ>Äp9ŽËܧÔÄé211R–ІÂ2.;kßŜlM›ô“&Zĥ\ğynWž"q`“_gž$ß9ş™žkŞòÙĞ£Ôœ*^İĤ ²+Isj“ ÈÙÀ2!]!CÖ;Ċ²W "_ı=xO7 ÉC‚Ĵ&ÑKV&„¸,,½éÂy_T| Wà$|ßváÄŬğp Àï˙v(ˆŝ5ĵğ6îÛJà-ÁÓñ;X†£9Úŝ]ç!]ħ¸>ĵ'4˜}PTLà::½ YjQ¨}ĴÜE˘G!ÚĈeÑPŠ6IDÊR,š”Éĝ]ĵ4ĤîD]úŞŝÊyî”Ä™vŜí⠗Ê9‹Ŝ*‚“V*4ô$˜Ŝ¸ŜìSƒÈ_nGÒó;7÷â TĝÔ@˙î#TéfÍ#‹mšMmZQn}Û7¤áÇI§~fIt’_ˉ3mïżvġeĊ }OĠżÀ'žü…ôEÍI¸ÒÂİVˆCŽıvJƒV1O‘CǤ$ TAÒxiùÉg‚'yÍ?S°/ûN!|Şyíäġä5§ğĞ2uü0ƒ€_ÁfsJ49=ÀèpEˆ2‚ÀM½GeĵÎ=ĴLR‚23Y<GMCó3Qˆrµ"Â`Ğ:Àtэï˜V (›jÈ*È)!ìY”¤/Eïó› @3^˘1BŜš„xŬ$RMW˜ žŭ@²ìK˘íĵƒ<ÒUĊ!\AVĞ–ô¤{e ŻWĝÖċ_n}…,yEÚçÛrŻ?ˆ„ĴÎ=k 9‚„!àŽèı tP‘œo½'ÏBĊĉç ˘`³B ÁĴ VŻ9B—şäFƒ”òÂϲ^ˆ’ÍDRċ˘RĜĦ1v–F£úċÄe%W™RËÏ.‹­ïâ„ĵSş%ŻÉĞ$éĈë‘[šaԋhŽQ ç£ì³egħe °skŽİmhÔjŒ,UŞ8]Vžz?0çk\Vˆŭh¤*çE Êy¤< Ҁ‰–ˆŞ j=„.…ŜÔŜh: ˘ÔiŞp ¨ ‚á¨h$ë𗝐•¨-de˘8ŝkUßíQ³ĉ.1­Í:ä>5`orñĤá¤ëĦ7#c“òżËObó A9ŒnÄrĝ²(ۛD9‹şÌ ŜÓG&‘ÙMħ‰,‚r}%*CĉQ괔•Ĝ˜Í˘_ÏXÏ­FÊ=b´݉u=íÚì݉žü!ž‚§˙1ĥ·Ġ{Òhġ/4û_4ġ½`e~RW‚¸ê„–¤pޏğ68QĜ\ÜÖTŬ  Żġ!™ĝ•ZӄżöŒÏ„üTÂVçŞêú33 ³vsIï&ŝu>1°£;ԕĊ@Fœ"cO†8bí†(/ Ğsâ&3Ġ1 ˘ó xÑċ”¤C½˘6“(k´Š+Ñ_X”Œ'˘Ħxŝ ‹ñĵïF`´­"j8’qĝ:îaׁK{ĜÙ]ה·á1!7ë.5Ŭ8Sc€3pÒŻnEÍĠjXK”+BìÖlñÚDì:kbŞ1LùQ„ŜVh²@™Ċ%§í‰ƒ0Ĉ½9Ĥf£ŭ§ŭĴ žXÄMÚ 9‹_½ŬúôO…òÚQ÷k v#É JtŠEÖ"dù54 ÜÇï‹1îQÑïċ4È>ĦĦ°vŜ|pÂCĊsIÇċx§M~]d킢‰ ‘Ŭ7l˜:Ĵ‚ ·2Ż@*JÓǞ#ĤÈâìġŻ…6'ˆ ó ²öe)ċŠ HfÂKckjJËĞ*›=ŭä>œWŬö,)iËġKŬ˽êeâ]^r_²B%İ··íNß,ƒÌŽ#!d÷EÏU4Ìpı?ħŽpáè1èızœĥoƒµŽâNìĈ~Ŭçê¸müdŸ#GΆRñ›ŭɈÔ߯PŸşxm“rJô@ôkŜ<úŸïP¤7 =j0 7ùï`4cԈx>Š éEġİKpy5ġü‡ï˙\ŭïLĠ˙îg›Ó@è/ÒÂ~¨òÑA8ÁÈ̍Ĵ_Œ„ɤ¸ßç=-¨$”›™ĥ[)Ît‹—!I;“zQ^™ŜÔ0#â“zĵġ[*ÌU°˘†ğ"ô.ĴĝÔ{b ´Ÿä‡SÑlÁ3D Q˙Oö°ßww÷f˙ŽCú‡9ĵۓa>÷³ÉnPuĞ‘Ž½ĉ('~²Q„ÈnġŻÁéHŭBÈïz³])•‘2.4ÔğigéÂzVsħÙz[m ¸ÍEŸú ²2£59GÑYş<™Ñ+ЇÔ#Û4NYّo,÷*“ċŜĞRUTruugŬµ{ç‹çhù˜#áÄgĵ÷~ “ĉä%e…´SÓUuĉ&šĴĊc}²9M|61Ż}7:kĦÓĤ´Ġucĉ$ó˙f÷7™w47wĵÉĵ* XQ‘ Ċô§=S—lܓ¨Q§sU%D‹÷2Íaµ~>áĦ~ë/]ûĉÁİWœQêz0J‡– z£÷Öğ€íûŠlIé„b÷˘ıߢ‘Àt÷Ŭ£%˘.Íßàyŭ şL­Ç£ù[]Ä@î½XHö7ĥm5Ş<‰¸5²?½,*ÌËŭÜh>dò`XóF>ËŞ3Óäéé ˜ÖHs~#ŭ[\˙Vk‘5­o*Š}„GAşM² öpĈf_RW”PTô;’X@’=FĦI)"Û`>iû__ó˵ÂŜ‘üO,İ—ŞJSĦÑY*´Ä„*% ?Âè.j?SlZZ:E²ZJˆdú†ÑxÚT÷E˜Ävrü²·î3i<ĉÇñ„pgŜŭ âLĜċžêÛoìŽ1½F2“G^;%LŜ 5üwۛé71@ŻúŜÊĊ<ĝPö°Í3dó˙ô‹Ê" #;‘ß@lİi FK™ĝÍĴ’, `Ĉ}}ì=6#ħœ‹ÎĈ€]Ĥon¨è4x_™‚E˜ġ"„8ù$üèÓU9à/ĈWŜö=?&uĊ[jÉlô …hS›1ŬyCxd2Ù$!I)HÊ+~ùıtfÎ]ŝî^µ>ÇŞËóóòHKî£ċ/¨LHżœ}ËĤÏÓY³…(ĝÖïgŒˆI’žĴ´-2ŝòŽŝÄ>”Ž}ħàÔİÓ' _ähÏ ŽüÓÀĈ€sAú³Ìc€hh‚Jӑ÷ĵG“5`ˆËYœċ xĝJ˜é’6o۞hÓL.é†Zq(ƒ…è‹^!ۘÜÊĠȵŒ„&7‰RĤŻ›IèÍc0–ĉ)´ôÏ#C@VÄġ×GѲypBŜ…,Hۑ¸;#ġÒ(ĠV}~ħĥJ[~ü°ĥĵû¨ÎÇ4Àî6ĥğxĊ‚ġ]ñUmGÛŞŭs¸Úŭ-ÙdgżW0ÉsSŒ²Yb<ïHN$ž+Ĉ&–73>6İ£‘Xó–/‘Xß*8D> ŒJ†aog-ûÄĤè]¤ ïÏiŞÓÔàĉáşmñmGdŽ&Üŝîo炿Ċ–uÜ1í͓˜ıCö¤!œ–;Hš"ôĠu)‡6çp M­Y„$/¨œÒ`sĵ§8Ö5BáĞW¤)!މÍ£s&eDï@êxÀ¨Ÿb4›ŭÊ1żHT­Ì•î΀ĝdŸï[e.!ş`ŞqC7ZÒv¸­ĤJ~L\ż‘ĊĜ½?·Ï‘ 𠄆jN …Ĉ{<ŻbK2s”dkCcn#³š\EA˘\İâ1;S=a-¸•H ÓĠrµ˜xHĜ-Ĉít4$Tdir³ı‚’†CWıËgIÀ-)Xœàí·{é³GyD‡A]ħš™îĊñ[SÖ.é™MêùÎËÛh4²ZtŽñPğ™€Ù^éğUµħèï!1 ‘#oÎB6ôäv•!‹[Ud˙­J+Ž •ïŠ!P)mĠ×V:tmêüÉFÜĵ>ä‡Ï£‰hòŒË“\aG(÷%~ÄBT]r]ŞzȖràŻêBweqš0]áòòà ßp™Ż I:>Y‘ĦyĈu"”Ĉî-51ïµ8„NwU˜Ĉ-[‘'/f$"œKD&û@vkQIvŜ-ĜGê8Zä8Kž‰­À[m>=ı%†ìËÜ nĉ ıŬ—Méàïdï£ÌûBô‚§ÙÓ-û Ġ1Ï>:1]ğhúĤލg}¸ÁëÜ`6ƒÍŻC4â?&.íöŻàÜWlRnp9´0'şĞO}ĠàĵyC _L<‡La˙ŝYKĝHĜj³r‹˙g‹<ÏܸÛĠVşŻżÒ•Ȳ[ŝnĴô4˘¨žU†A˜",s]zX|hRĴÔßR @%ÓĠgWVĠyû…ÊJĵnNúRd<éHȨĴ‚œ*î$v|›ŝùçuÂ(!Kġ'd)äÈJñÔ0™ĴÌ-uÑ[WŠĥ@'ÁÒC½8Ż&Wˆ!4&ÂVž˜˙Ÿr²äÙ=p3yâKúZûħÇùZej9—’!Û —U–ÈŒ}-ĊżQ;“âñWŝ¸âı;dĝ;qmnĤxé?ïÒ˙XûÎ$“„ ·4èëşUù …²Lm‚WbJDC’&d³ˆĥà™-HQ˙ Iĝôendstream endobj 320 0 obj << /Filter /FlateDecode /Length 647 >> stream xœ]Ô=nÛ@àž§à Drߏ Û8‹A’ Pä*PaJċ"·ÏÌÈN‘âS$߇1v÷üòċe;ßûŬ÷ÛeùÙîŭéĵ­·övyż-­?ĥßç­§~=/÷¤ëò:_ğŬó×ùúëϵġĝA;=ò·ùµí~”½ëOĦċ²ĥ·ëĵ´ÛĵŭnŬaêátŞ]ÛÖ˙ní§ÇÇÓÇOÇ}Ġ q_ğ4ĠÇ ÊèU3 ¸"FĠ cÖÇ #^3éU“^ġT5ˆşğT â¸V ˘>ÔŞħ1žŞŒC‡3 ¸"ŽUƒ82b_âÄXŞħ0ZĠ #4E˘BQĤHT(*p“š"QĦ¨@S$*•ıjgĈcĠ + 4E˘B‘a}ÁH0Ĵo" †ġM#Á°‰`$Ö7Œú&‚‘`XßD0 ë›F‚a}ÁH0Ĵo" †ġM#ÁP—İ2ceIdê2UfĴ̀3@G]ʜ•9p. èÀı€N ç:œ è:p. èÀı€N ç:œ è:p. èÀı€N ÇÁ?0œ èÖçà.ߨ+TY°²€&$ Šš(( hB˘ (  ‰‚˘€&$ Šš(( hB˘wĦ ‰‚˘€&$ Šš(( hB•EMHĦPeÁÊu…* V–°Ĥ*KV–°ĤĵIošò&½ kʛô&Ĵ)oқ°ĤĵIošò&½ kʛô&Ĵ)oқ°ĤĵIošò&½ +èğX?E˜÷:ï>6}> stream xœµyx×ĥġaÍ@À V&Ĝ”-tĤ×Ħw0Ġ¸7ܛp·ċ"ĞlIî½Ê– ²ħ ĥ)`: „Bè5ÚM$$äŒ9NŜ;’m’û^îÍŭï÷~ĝ>}ĥ53çì½×^{­3ŞgJ ˆZo;ÉôÓH~ €ԃ,tş×òöD è#„>=3{bĊ{ġC­o#×w(Ħ@Ż[²ÓË;lˆ¤i“ÜȇíÛY³fŒ2yÒ¤YCìü=Bvşı YċĉíáïF~ñ²!m§GX¤ù–ıŜaaA³?ĝ <<|˘‹èÄÀŻMO?$|g˜÷ġĦ!ğ<܇, ²ÚĊßcˆy£͟ ŭƒ¤a!CVş{„PµÉ.`˂À­ ƒĥ- ŝ8dq蒰Òeğ–‡ğĴˆp]éĥ*Ê}µÇϵ^ŜëwnÙèkï·Éó˜íñ}Ĉ÷Ŭ1Á:zâΓl'O™:mĜô3g͞óŝÈy£FÏ˒˘†Qk¨YÔpj-5›A­£ĉPïSëİ‘Ôjµ‘MÙSc¨MÔXj35ŽÚB- ĈS[İ…ÔjµˆšHm§>Ĥ> S“¨%”-µ”ZFMĦ–SSİÔ4j%5ZEÍ VS3İŜÔ\*‰ò§úRԇ”%%§İ·İw(;ŞeE‰İw)–z §úS֔ 5€H ˘DMqCí¤zQC½oQ›IEݞ”F0@´‡wÏ…Û„×zîìyÒbœE½h¸(›Ñ-ÌfĤ¸×‚^½~éíßûÂ[Ş>£ûÜí[j9Ĉ2ñm›·eï |'Ĵ_~Ú~ĵĠ Ğñ°wû›Éckßsïl˙9ŭïXo³ÎµyÛĉú€œ? ´¸hàóAÓ]ôr0=ĜnĤÁaƒ÷ ~ÍíâŽKĤK ħò`¨ïP<ÌyĜ·‡·Œxwĝ÷÷ĵ˙bäܑgF U2Ú}Œ+Ż´lO#Új䗕 jÛí„ü°ö•lJž*#˘A)O‰ĊnßZGnq‹ħW3~tıfżĥŒĤŞUé3ÜHo 1Tê4Ù­äêo@t O(´rPĜĝo€ Ώn} {a?R·¨L·DÒk 6CVÇ`=ŸÍ" |KE–|y‹İŜ ġ¸ˆ<.öD=3—ÑŽ2XJTŻ9Ş­‚J²öžÎµ—Êà ­¤ştòüıûġŽŭ§×n†PïfîƒÑŻ!ĥȧt,çÀUŒĝúÏ4*³£ĊżÌLŜ&1g]`T´Żò#ù÷X4í×îİ}¨ħ1ÒîjU¸Ávpӑ§ûÑMj½ AJ–ažgYdŻÒdBŞ äê‹ök#í­\àĞ4žZÓ]%ô (I. D+ħÑÏÄ)ħáŝ;F‚ I™ĤE[p”ĉŬïDUA1déR3r0äi&$­B§ ÄK£œMµİ×]&‰ny“èô´]FĈ²} İñ=Úg´B’ğèô³/ú‹yÂ÷`‘šÓf´rèѳúé›Vl›…’lj쳒‹çá óàƒ;ĝ=£‡_…èşVĉ%騠Ċ?{İdrĦ~ü ²yôïf]ĊÂ\É*|“ĊŭDŞŒ: ŞDkéç-—.ÚÄ_üô$ú–Ċnh:ĥEĞьï‘1ِ'y‚šK‡ÌÂ`V-{Q‰ĝԆ6ïù NÂ#K9m,(ó)]™%E!S( >‰ÛjçÙ°ċÈ8°?Ċk4<;“t·áMF4^ÏÛ´„Ĵ^]D…wû‹ŸĦĝ>ì0áüR†ÜI"ŬáŬŬ0{4mÚJ¨‚£Şú?6×\:‹N‹nħż zë§ï‹ÄcŸžñ³yàâ.et¸€EĦtÍÑ5Gıüélû~<ÎÍ£´9H[(e,y{ĝߌ‚‹~•AÈhÄf䐯2˜B9„sE2,µ0ˆ2ĊîÛh&YÌVÔaӁ“e †$›¨4(xQ*µ%aIÄĵ /~!ĴoŸÏúUŬXíFjš‹84­Eëñ@d‹çKğżaÍ`ċ÷vĥÀ ÑgpQztÑŝµYÓ``aÄŻmáAë׍$â+şr:Ö^jµç.*$ u›çS/ù×9äOIiIâgĠqçĉ Ä̰ħĝ=ÜïÙHĐ | Íûġ5Œùħx( ‘Ò¸Xß `Ĵ~ˆhô֗wŻÜj™ş‰pÒ\ÒĊg¨n zˆĥ8ƒÎ Dƒn°Ŭq^µ ’˘<1lŝˆ¤ÈĤĞ!KÑÏr|§K ¨8D4Mĉ7–³EɢÎÖgEhTm,ÄĈ DR‹Ž³ŬŭnÉìĤċW^Ŭï/Žĉ ŻYԃĈŽÌl)>ĝ;IïÓ´jĞĦ ZĦÉÜğh;UNƒM$tZ†ÔZNݏ‡`&°,F_lÈ­­ġĞqĉÄ×€×ÒXgÒÈCH˜­Ft¨3̍4œ@ĉfû\ĥ*{ӄġş¤›áqWú!Ż^‚Ô÷éï²ğž‘à3Ž›†Òğî#BcÁ°Ħs$`Kž“éùé%Vu†OP¤!ì“ŝâ‡ÈmbġŠ;ѰÙâí6o†×İŻ#8ež:5˜8HŽ”`k: ’sÒ4š’NĞmqÉ—ƒê2‚]úß:ĉż;>WâSëžé’Iĉˆœy§ÔW6ßG=Òlŭ´œ&1‹P“i%’Ì ˘‚ĝ8NİHHT(=Ş]!†TÏÒcéïÂÀ*İDü°6¸ZŝU,ɏAjL,E!Fŝ}3żLè]ß_?:ÇĉI›Ür€É‚Ì Z@ïKMûœ™§z£ÊŸLĞéàežVµô#ÌS²‚·âžXœ¸oĞGG l­;ûËc[<ê_Žo­ŭñÑ`ƒWéx2vÁ.h*ž‚ÖKÄ1—áVċž3¤WĴe4ŞÑÌRÁOтR;~‹†ñp´2D¤žċ?dŒ‚‘~khüöÓĝ†KĠ—Îs§B6ÒDız.…ÇE\§0ù̈öÍ8h{(äÛùÙmÎuÂ(òVڑà·9ŞĤÇq¸ ĊÑqĠïÔ@s…LͽpêÍĝ ?4ĥµá‚żşŠP­L/m! òFµDo²ĥ4‘ca¤?NÊ8LÚ!zÓ.x1=uû’3­múşë› œ,Ácéy0 çÄ'á@uÍgŒ%úµ‹ß="İ)~]ÎMÒÙ\—;ÌíŠĴ’İëŠL)›Ë›ö|“ìxÜìÚs0=WiŜs…ĴŒ`”ħB~*şÏf•íż`R(aŞu„ÂmTç¤lTç„A$Ş Ùû8Ó÷Dµò<\­Mċ>(&àòWoP…A¸iüͳ’>İòċ>YâI‹÷Û˘üXıÒ˙£!›Á‰™ŭ,äGı‡šJZ™d4“E_¸Óq›kŭ‘-wÑĴtҊĊżƒÁÏ`ÑRd—™yìèm“VúxÁzĜÙ­†Ó ˘’’ñÜf.ŭ4äB1Ä,eé‰YqoïN¤ƒIöšüE=ì풽´=ìJġ?`ÙĤÑeäò!jBñìî½{WTš ZM°VùЃI‘7i:aQĤʌ#':!.EjžġĵM²0Ŭ ²JÍw¨—İ˘a8h‚:‹ü%hÔ­kžcÖz~kûşµŞ]&ù^İ5j*ĦZT:@ŞK΃×Ô}úĠµQ֙²ĵhÄĘ “nß­9İĠÙ°O½ğ;€HmX c&‚éázäÙÒ-bˆŒëˢ/ğtœ™P:žh&3żŞ•+hÙze`·Xó‹3Ïg‡èH"Ö YäJC hr ÷<‘YĦ!¸Â£ÒU·\ÁSµ&Àq—Ÿ‡=8‚WEh#Ño:(&3ǂpħ[)Ïurñ×ĤŒrĜ‘ìŭX"ßÜuê ~7½òżċêŒ"/ċ$òHw˘¤ŝIùb‘IVıè‹ïñRBG÷„üÒĥ•çŽj á E‚ƒVÚY£ş0ŠĜ¸µ*%~$V[c!Ò+²Uݤ +Ħ„ë,PÔÙèk7Û!°N‰‹ġ‘ÇI7.^)ÄĴES3ġPÈTF†…Kü[ĵŽœk>uŞ‚³äג V÷¤Ñ`Rz›ŸÄLvİ `ь;-DzÎݽê9WÜâ˜àâêÊÒ˘Ŭ_Ìß÷!î÷Ĥ;œĝgüîóÑjQŸììP•舉Ë=ó›ĤìGÓ$–ŻGwġĠjâĥÉÛǰ‰z%Ùƒç½Ñ:J:F˜Míab ëàp·­UAC#ùŻ=ÒâÒ^mr@—™šƒÔí}­5—DŬ]Ġ¨ûÂìUŝì*˘ğ3ñ(öôKQ"zD"\ÛÑ7Q*Hħ‰Í ċ@w‰`_CÔh"î½Ë 3$¨Ŝ˘î‰icu—ŽŽáß9Á.£Ñ¨ßgĉaŝ§?BûÑ ΕöĤg ƒY,ŝ~42!û<Üc¨ePYOìB°¨dQŝÛÎ&W†î nVž"â°Q{ĥĉ`™qoŬqB-1Fǜ(²ÏÈ?¸ĈAĠüĴj!ŠiŸÌ&ĉŞ5dĦŭjDPŞ.P—+5jˆ`:Jŝ˘EtZŠF*çÇw<³ÎŠ×¨3€É‡Œ ˜‚Ö—ĦŜêm*mZïNPż‡ IÇ|şsŝehŜŠĝäÄ !fġDil:sϰ˜—Ùx ğ'îbQ­H݃²çöÏH÷1ŒÀŭ$s~K ƒċA$,ÉNÒĤ$ŞäI*Î{„-$ÀVpÛÖè˙ \€uħ´²}F€¨G§—Âvô„EÎx1§Ëñ<OĊDÖMēb´CS#‡żĈß°€oP>ÊE#ż¸û _„³p1<‰%:m&[4ġ^Ĥ^€z^xò@ˆò YÄß|òÉ]$pñŠÈ8a Ğj J+=ë6}<}ÓPÓsŭnâëċ!"‘‘î´A{+Ñ9“é{ˆZ_ Q8şÈ˘y"ÔQ·_|?úĦ)0t›Fžb:ıÀċhŭé{ċÊ­ŞÛÂŻ˘WëۜN÷˙"C!è#v*ĵ(ŻÒÔ$™ıċĠMÀ<€QaAjߘIR|X ÎB*”•î lV–óôâĊëÑ!ċ’†= iĊĤ£İeŠÄ3Qyñ…Ù%ċEñµîáNrWÎÎE'fââĊ:é= ğ$q1‘>à͈Û)Ëó0†Ż‰òu7fáóÈġŝéèúĜ£[ŞıMĠë`5áKgHÖĝĤî2i“ĝ";rñÑc‡ö6IΈ0Í~ÑÖ1’Î8s[ :µĴġ¸Ĉŝ˙;{›Nk˘<ôò}nÙ&Ġ“úÓ£6£1ġH,ĉżü²żĝ5 CŻX”KC9äêuÙÚ(ĉêİÀï/GK^ÄħÏ*n| 7˜ï°èĊáżŭ ŝçİM·HG4-ŝµ¨İú{½À–Ârpköhö:!ß Ì˘;Ġé'ƒÄdµDÈ;2ĥAÒÑĜ§q·Ĵ#ÏoĞÛXBÔún³[F}_Y]}ġñ…ŝâ§èc~5‹‡˜üİÚêdeyôĊùM$!—яĵ5‹ß5*p?§m<ŝé 4Gg:Ĥs9Èsşì%ÚaöoÉju|2ç½ŜżĈµy2ñoÂS†Î<ĥàF$Gq4ŝË(Fü´*ywrµgYp6a(fÑօ3ĉ§ŜÄ­;<ŻnPg'²Ûü:˜Ío†F›“ÁF§Ğ;fÜyŜë!™½n}zHėáĊ²;3JIJN“ _ĝ jΊۓĥŸ—_0ÓӔ—ñĤĵ\Ï2i˜!´câ´)aÌ¤–ĉCSYĵùdàİĞŸLĉjûĞ5ĦĦĦĦ555Džz’ĴÏ*Cv‚Ê|ˆ2 Âö‰í³Ĝ$Š0Ÿ+ċ£iuhXfĞÊ ƒ0†`b'ÄÜüDÍşáù˙šÍ˜p£‡AŝÓt$Ë/NÍ!€.ò€Ÿ|<Í|h).Qp‹àĠáĞ7RG¸ĞvC“şIġ{£ĵ¤ÏŸ¸>´eDÚDD)"ÈuĠš3Ú2˘kÔ5×y‚<Ža1Zb­ÖĤ¤Ŭ•zélvĉı£-Ú2“ö PĈA QÙĞ´ħƒ£D-ƒ8'*{(ĥ´ĉŝħ“ búw ĥv£I°E³xĜĜ9poZÏñŭŝR”÷ñPÄ`òD?zŠDEœ² ‰A—é:8hšg^êíŞà Ûµ^˜gĉFh&^˘Û—³”ĞEô›dÓÀ@ĈhXĊ´ó²öĦDĥoĥ ĝ;l~cUÍš£\“ds”ÛĤ. &r)I)WÉñŠŽ]ÖxŻ•ç›jÍ)0˜Os“ĥƒs÷?7iBÓñÚ:#"M™E MKË'cñÊ?‚0ûù˙—o!ŝŻX3ö]Ž›··ßĵ½8ÜYú×ı ,~*|=”$°ĝÔŝì}&MíŻòS[ +şĝ7uİqĝreIàĜWk<•S§ŞÒ‰Ŝ}*Í \bF‡³ÖµóžSPı^ú­ħ¤OejQ:şzŭUHMÉġDíÖşD]Búd¤ĉĦY|š5šŬ‘ŜùG›ÎżšŽ°ìġ†RŠ>-D-HÇ êğYĴAoOû<ıB!W‚Ş$RòŭèSx `Àó=ñ"üĥŠ‹'ÊNÉÈSéُ@â3ÜQÔ# ញžħéġĝ&êŬ$D™XÇ6}=ŝYü[ `Jŝ ÁËO_‘˙_lEx T¨—Vï.­Ĵàŭ{ĠR} xphhiîj½šëzoeôÛè‡ ĤSR´ò‰‰áŽ ğüöPFœĞ—˙kÀóB[%FĞÉ?°ßUĞT;÷F˘ç÷›>ÛŬVÊıŞäÍĝTĈ•”—î>³ħĊn"~k pXôâéϗ@×iSôöeğPÛ2Ğû¨—To’—Nö|h³›wdPppQPCanzf6§ĠZh4êĜĞ$r9ٕ‚INS¤ċŜĵ‰è7#EİÌŻ‰ö/&ÑŝĠ.ĝßh/ı…ĝĥÔ…Ö7ߕ03 6 —üğQ /#‹}Hjž^;t%Ğ ĞıDEtCdfL‘ü5~‹ÔxJ{"‹ğ=ûmüX74Xd‰î£5§9¨Xˆjö4.^gRŜĜI„ŸïĊ|"{ìâm˘êš0c<œ£&r~Ò˘TâZsš³êЉxĜïYĥ#tnƒˆÜ^!ä(“Ġw(¤Ĥ<+ÁŭWB´ñûż‡Q”è>É÷òËÛĜ´“䚎¨tLFJjŠlĉ|Ü{M…ŝúâŞJÓ.¤úvk½`ß]”yWÈ;£Ë,ÜJıċ}eÇw³ ]` ,vèğ8éRm›çïŸ}9ü0‡ke­½˜vn2Ĝ _fŬa­!ò;ÙYxgà<\È<^‚Ŝşše ĉèBdÉèì 0V’Á²Dĥ"füzGÓĞ%ÁO£ñi +BÔÚŝ.[Ú0nĠŠ)à Œ]JĠVÉt*‰·ċ|MÂŭñM K¸ûÒĥʜF“<‡ëèçŸ0Zù9=î´LâëìĞ—hâ·6Hd{ [b ğ&o8ş˘úÜĉÊÈJï$¨•\ùçÇOóx˙ìYsĥÎŬ¸J‚7b™É†ÚˆĉiQ5Z@ lвSBLrÒ22£Mû—V_"ĉ~D9êŭgĞÔsúhΓù/û‹1…ö£ŸÙ;U§ż$ş3ċ丑ó×Ì÷ÑGÔKġ5G †3×Ló İmĵj]°“ÄûNeˆ:IŞJ†$u²q‡L–EÜѝĈ%c ĊNΝñ–Ô§ġ°—i* ġušôt ËǏäÈÒpgċáe FŒĵ Épëu’a4‹jÒżvÜ.“Öi#·Žui.wġà…qżä>=:Qi:éÇg;v’™‚ ¤á”"¤ä{Y˜CG=G+ġ¨˙]Ğ#Ï·QÄCb…x{´ƒEoÍzİíÎÑŜ^ÚL—Êë’k‰ |ûËÇyéÊ´d5ĦċIxâĥà;2ʒt*’i&’˘%ĝ0 IùZ]z*—SĜxü6´aGfdĦ§Öĥ2â×DdĴ u u÷ ŜA&ßúcQgtdî‘[Wd¨¨ˆ2ĝÄz'ï˜vq,ê)˙‚˜żCb@x‰™ó^YĠĦ>RŭÓGñohŸ=zı›ùJó³Ó‰lÖj4`´ĞM^¸r•$sš˜Ĝ/çî5ԛC›ŜûOn3gŽV~÷qÌ#äŝdù£ŝâdn³4ñï4­h‘ïÔs1nàèW£/ܝµïĴÓ'3ñğx fq°Dü—"fÑS$üöïä>ñäﰐw,Ï-áÛôÊ˙³ò‚ÈV¸Ċ̍ڏ Á*#Wì [ˆWÙ[£ĵü×ì Û â2ŝó낓†oŸù ŝ›e"‹2+DĜTyŠ&Däƒ]‰zÖfËËÍHży¤žn"Yô\,úĜâ>Xï“::³ı£4œÈ<žZž˙Àg‚ŝv ‘˜„@•ޘŜDÏàw°;v+ö@óéç-—.Ÿßĵp½ûö5Ŝœ>†ŭŞñp\`žL>5iÔlğ‰‘ZÇ.'1Ä@ÊËuÓ6Œ0ôÇ?#‹oïŝÒ ;èÑÂE”EgŻhbFı°èíyĠ­ŝ°ÚĈî£Í³Ĥ-üìîéÚó_·vĤżáɽr~„)ŭ˟ ÷G&Ĝ Ñ%֗ĈqwĴ‹²×î âdÖC ¤Ñŝ‰îKğ~Xbİ!_’}¤Çô“7n‹ttĉ\\à#÷ûf êɉùš[ÊO3ĝÙhĜ~ç"á˜ĝ²µĴħêÈŜĵzb.êv9ĉúĤ„Ì̝c§pĉAğfoùż‡ñ'nÇ<ĈÑGĤ;­îżŠ hŝáÏï?è²Ä4Ì[a—œô; żş…˜Ġûn §iA£á249ÚÌ “Ŝ GXz¤Ó? N~†ÖlÓ§°ŬŽLĞô,­ÒÍÓ*!%9YÎm]²4h| Ğ Û"Šv Ÿżhî…û~5ûêċSQÏ|hŬĠ&ùÜóHJ\ƒ£ĈôTÚşŝWÛÄ8H1 ıìÄìlmjN&gà'²áËòl4çóĵ²cGí†ajóÂÍ~MǨ?ŭ‚Ôg ‹èµŭ5M/-¤F~ ê-w÷žC èlµ°}%êË*çq{Ĝ|ÔwïĦcM_şıïBYŭC“TÙĞċD–Ìè>â?dˆ!Ş•’c—8oŠ+ ~h°˘ŸŭâêĦèğ‹VÙm꒰~27iĴŽà °·™zgċóŻÏìŻkä.9ŭ ‰ûÜ)í}Ĥ5³A·”§ÁÈÜkŞ­? UËfO ĉœç°z‡˙ŭĞJ67zXż*9˜™aώßŜÓpĵ¸˘bdӄ&6 NĥOĥ/D·Ĝ‚(-€XIÇw˘Ĝ/ ˙-ŜÄĉw~#éĝğ(Ĥó›|“){C†÷;yG˙!š˜µ[Ž ñ&=rS”ü† ˙Ħ(!ÔúŸi™nżœĜ…{8™5Éݨ"ÜYù˘u€&Z°-@o£~y]Qèä ĥK°x-·÷ˆÇBbĞĉċà'°ĊYüöŭċÙÀ¤§ê2ÈĝƒW·ËĊÇ_è­N>){µÜì.ò(iY@VÏ.ĠWV•–5@ sÚí:ƒİUK–ï,-7½};èħœñĜé‚BšXâ6:22R²lĦôXÍ8’q'Ï̓ĴbNükžögJñV§ÎNÓ ˆÊöĵôßhz‹N‰9`D?i=ĝ§çŞ Ŝ{6ĴuòP¤p҂€™Í˜úw56òüË£X\k:г ŸŬiùüpuh85 7PÈ5!U‰Ê8H„xÓt—İ6û£'u]~ĦË"•ñ?ŭ?x$wċ6ElWĜˆïQ˙Gš²Ŝ-&’ Ğw)Ŭ Ì܋Ĥ; ^˙†YÖċF^<ĜwĤ˘>%°ŠsW%†B8Hs£‹SKwÏ}zQÔE-˜endstream endobj 322 0 obj << /Filter /FlateDecode /Length 274 >> stream xœ]‘Anƒ0E÷>…o€!€ƒ„f“l²hUµ½€1CÄ"9dÑÛ÷ϐtÑĊé1ë)N—ó%͛->òżx³ÓœĈÌ÷ċ‘#ہŻs2eeÇ9nOÓoa5Ċé-Ĵß?+[ài÷÷pâó•úİ܇â2ò} ‘sHW6½sÔONżVÙíô> stream xœe“kPSWÇÏċ†›ˆQz-iéMĴLĦ>x‰  ʀ‚A-¨C„‘@0ŒXE‘SĈêèHj5(>jEE) _X”ħ3;Ǩ1(˘ġİCBÈ5KŻÌ6sr£Ôù)ŞôÚ8Ŭ „–#ò@ħ(­D hšĦDŽüP$š˘PŠFÎè=A $BsQjĦäÔjUKŭĉàĉPèBKéz'ŬN‰ÒDfQ3_"ċËq?™êħA˘ĉ#àÛşċ)‘ú%Fl/ĉ:” 6Ĝ-n=ŝèÁ‹/38RoKù’˘hĤNÛàĵ£…l>|KĈ“‰Ó‰yŸ¸ zÁ8px S8’Mĉ³K”·`Lxpݽsq"NŞ…rİŬµèßÛBµŝJóŬÀ°ŞTm–?˜àŝü`VǂôFıċarĊ‚òXF˘ÉÇėl ŝ0žÄCê³ ‡jîɅ6HB6óêĦ vÚh¸Ì~—UŻżƒ%/û_;8/ьċħıİkċ a#“mbRTyîâħ:,ypç3ĊaİÙ֓&ùĥŻq>,‘ÂsA+ġ°‹@6²x ³óU™äĜż4>Q·VòtñpB—X #‚}Mo­ÔP' J~ S›ÈTp]B\b{‰•YnYÜÖ~íxùqöĤ܌­XĥÁ|úĈ(uQ#ïbŭW|^Ċ†’:&,.}iĝŽuô†’~ħòXÒ£‡ê¸$Ħݍ<­”…§ùBFBRsuÁÛ×ÈJ™âó›ÚĥœŬBV9ö3R^—ÓlŸh ħĉŬìQìœá‹LžAœÔĞ_rĉ°Ê­w3{ħl¨³ ,cQ3xܟÛT}'¨²iPË.j÷‰ZW˜½†Ûy½újy–ŭP“²Pž,&ÓwW5ž-I>üĜòĵìR—Ö%7çaƒ6/+_SZ„%IëŽĠĥCàş2Ħ„š¨äÛĴÔß-)¤c÷ÚR£Dèàŝ|ˆÙµ%Lr a aXµUgú|ײMħĜŒ qĈžÌƒ{£ÜŽîV·ğ‡ĉƒ ›:}ż÷Hŝ Ôc2#Ċ#Q}ŝ ¨Hğf8‚—²Pb´ŞÂ—ވ“\ _Œy<Ÿ4ÙCX˙'ÌâÉ VèŻç´ñ­Ô­n¸Móğ7_˙͢Q>ġJĥ¨kÔòÚuġ[o›É=PrÊ`-8ş'K"#}×ûèâĥ÷Ç˙l‹eàöì58ÜÓ]Éİ”ŻışqżÏħXKážÌ;öêżĊġ’Û7ï<ë½²QW͍QÙ§Zǐ|÷ *(ös+àR \<àXC󳠀…3ŒċĥZó°YNÎ@cÁGL&œgĉHİ›ó°Ét[ä DŒçY­ĝˆ…“rN˘ Ğó8„ŝA6àÈendstream endobj 324 0 obj << /Filter /FlateDecode /Length 530 >> stream xœ]”1nÛPD{‚7%íÎڀñğq‘ HrŠú2T˜dıÈí33ĥS¤X#‘;|OĝZ?>?=/§Û°ŝq=Ïżúm8ž–µżßŻsöŭċ´Ĵ6ÛápšoŸÉ×ùuşĴ֏ßĤËï?—>†~üÈß§×ŝığ/´ùxh>úÛešûuZ^úêaÛñĜV}9ü÷Ĉ'öÇÏ[·sóŒ#݌‡ĉa<(öĉaìŒ;îĠŒ#݌›ĉaÜ(n›‡qиkĈb4c(˘yĦ85ÄÜŜÚÜŜÚÜŜÚÜŜÚÙ<ŒİȒpQ¨(ŞyKñyïñ^‘o~Ğ[훇qŻHmau!uAmau!uAmau!uqlFŝ0I‹i“)“IÖ4oŠ7ɚĉMñ&YÓĵ)Ŝ$kš7Ċ›dMóĤx“ĴiŜo’5͛âM²ĤySĵ`'Ü ġ‚p/Ô v½P/Ĝ ÷B½`'Ü ġ‚p/Ô v½P/Ĝ ÷½t {†<ƒŽaϐg1ìò :†=CžAǰgÈ3èö yž!ÏEÇeÏ%ÏEÖ2o‰·ÈZĉ-ñYËĵ%Ŝ"k™·Ä[d-ó–x‹ĴeŜo‘µÌ[â-²–yKĵEÖ2o‰·ÈZĉċU§ôë8êÀêèôa~ż^ûró˙ƒÏżŽŭié˙ŝB.狞8Ğż&"wendstream endobj 325 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7915 >> stream xœµZ x“UşNŒ ?‚U(Fœ˙gEAT”U„²—ÍÒ}ß·´M³5{$ÍŜ}IÛtIZZhˎX(‹‚˘€‚ğ8ν3.sROïóܓ´(3ÌĠ{ç>y P8ç˙Ï÷½ßûßwÊf=ü‹ÍfXµqûk ĉ{˙83‘íyò!Ï8ħ8ì'Ï@¨ŒĉÀè‡-OÎ.ë™>Ġ?†˘gqĜlĦÌ´*%57=.&6sÒùÏ͏ ż-˜´`éÒ%s&-œ?é¤IQéqaɓ6†eĈF%…e’ż$Nږ•™ë[òRlffê Ï<#ĉ…%eÌKIyÙğ˜I‚¸ÌĜI[£2˘Ò³£"'½š’œ9iSXRÔ¤Ħ77ôeUJRjVfTú¤)‘QéÉ,ë•ÉğVĤĴJ]ĥ&ŭĠŒµ™ë²^Ë^/ېŝznÄĈĵÈMQAћcĥÄnÛż=aGâΤàÑsĉΛż`á˘gż0ʟĊšÂ b-eMemfMcmaMgmeÍ`mcÍdmgÍbí`=ĊÚÉšÍ f=ÍÚĊZɚÚÍZĊšËÚZ͚ÇÚËZz†ġ*k>k-kkk!ë5Ö"ÖzÖ³Ĵ ĴçXݳ³6²–°6ħžg%ħeù³cae°ĈħxĴ Ĵ‰ìGĜ£XËI>X³œìm…sâìâ\X÷ _WÂĊ#ú¨µ#G”>’6êÉQĥяŽÖ=şéÑ?ûŭ˜ëñEŸ“6ĉúĜĥ€¨qwƒ÷ Żrü³û&DN üßŭÄë'Nt=˙‡Uĝ–Ħże>ôÎäúÉ÷ĤLš²|JÔiS?ŸĤŝúôgüaĉÜYrĈ@n´ÇíYWĊ>;(mG~ĵWBĠħZİN—:J£/puhtš5Mp|ôTS1T:ä ×3J}Œ|ßf*²•_CcQׁ_dHBȑ‘n‡Nc´ÁMĞwħı*Šċ ÖX]Z&t€ĞsêŒBà A­PJİDÌáĠà[~8Šëï9+uzĉ:Ù(Ĥmìç <´ŠgršĞMÎâ /o,İíy˙PŬ†ìûñ(Q#ŽÓ@6µż!ĉè×­è)“] 1hóĠ´<5ġİ-@eëJKêì.k-SuŞ = }ÔG۝{–î ÊӊcqMĦ‚LaRN„x3h)™LĊz½ÓDW\­<ĉÊÉRĦ&G-d–SZNԚ_UTnİ´p°ŬìÔÀCKPP‘½ÖĠŜuÄwèí”MaTÒ)¤I†8ˆ6Ĉ{£˘$ђÚtFĈ˘kÔB*È5ÒÜl< ż¸í½Úz>XŞ*ۍ”ÉĦ/w( & "4‘d‹Ĝá-Ä$àv(9](˲2ßáf‰e›×nÓÄkùÉTävşÜĈFh%ùhñ%³ŞìR½–I2ŞÊÁ…zğĊn0è}Ÿ@ˆ”ϰ\Ż6xO ²ìÜ­BW |ʗÜ_rŜì~rw¨• Ĉ`A×ÛNt=Ös÷óÄÏ&|íáyyĥh =½c_›¸ĝċé˜Ëà@.J(à!˙ú÷>¨k›/b6/r…Rr,+Tşë!OZµˆÁ;ŭŝ'WÊ×Nôŭ³ Êô1MA#ˆï?^×ğÊĈàIĝ&?ÎM£Ċl´ëÍÌUÔꇖsż6?—6ûĊİĝ!ĈßcĜCWQÑUŽÇŒÜĵo6_y?Žyx ž1íÂĈÑˆG6žIc3âEFğŻw!NóiĤ½˙hÓA Ž5ìßš5-!ˆIŜ+dPŝû³ÜsŬl4ûSÎÀ‰e<}ĦŜ …”Ag•iU - __zeKÙnàpœ€³°?˙×iˆFÁˆâÚe R*˜]x³áy –,:ƒĤœŻC nĦ‡˜Ë_}ĠûP?xúÙ4Uh/JF}y!MN„wşÑßİ1l@$ Ë•Óı{#–o*êÊ,Pfi`†ĵ×y7ju³Ï¸9B‡gmĥZ/UmƒŠa'áĈȟ5ŝo8oÖúázî9¤ZÊ˙íK½:ú÷˜ë€.Aè„.ÍAï"‹WÏ ĜV›p%Ì;¨ÎĠs_Użcİ,>Ĵĥ Ëí3ŭhA?Çc÷Lä̤ތ”C^*HR$˵ôJÜ£Êm˜Ÿ“’œ´¨‚î–ŝ–/ê.3ÖjbV*İñîyħx–r¨ê %…´Ġ]˙MP‡&-C–*ŠdÒÖ¤­€`êÙäÓ§Z›šj銇••Ġu˘>RÜètYJZ´-çġ8 Ò d87Ŝ"½ċÙÌñL ’³í IŒŬGëj&Â4áĦĈpïiI’}ŬÚH˘Ğ%üÀà'ğäñòuÀÏ.€\İEkñUttÁaM§/D^ƒ`#Xz0ûB:˘ùŭ%g‚cÌ3š×&q'gĤgfŠ- ³‚M3&“›²â;¤Ç[úš?­żF›ÊÌż1:‰‹A°š1ù,zİŭ—‹g–óҟ<"7ûŜwO+1i–‹µ¨RR6QÎÊĠÄAì3î÷ĵ×Nĝp_Ä-RçZ§·†ó½5Ĵaj0:0gùÖ5ÛIˆbëä]Ġál­s г5›áċµ§#.Ŝûêŭ/¤ĉ ŸzA?š×ÈħG/ñ)şlQÒÄçw÷ŠOğŜsD[*Mżġ˜ğñ“FÌtœ5Εќң)'§­¸éDitgêY8‡şšŜmş|̓SÔŻĊ"Ĥä…g'„żÔna×!›ÖÑÍB/™öNB6^Ĝ&+R l‡ĵäÄ*­s,ñè•ŝ  żœċ9ö´g·ŭfÜ]FuL‚"N£zç$”%L|…0€îêÎcÔidáí[ä _Ĝü0Tw]p˜V§Ò*I”mC˜>?ÁñhˆßAŻ£ı5•—ßzÛÌ·êíz(§,j“‚ΆtM&ÄB”1î>qÖÄĔèŠT„¤sóò…büî ĵ‰ŭ“ŽÙÚlŞ`Ú4Äg›Íù %Rž{KÎ[Uô8hl‡&ҝ6útÒZXJXğ€‰ÑK,71RgÉ-”vĞÄÉ>użñ${fó"dMz˘ûŝâĖ˘äíñ{rdtÖı=Öt fîÀ2}è}™‰İ˙ääÁN +3#2${ ˘i¸N-}C¸>ûĊ @ä•4YmuPJı²ÍâôôìĝÈC™½G[:šÊ骭Ǥ. ;ž¨ÎPĊ¤>·;2 (AjÑÉZÇak+8TzŜÚRr²ŝÍ#`„:(Q÷ Eb£oĦÔw8èÌÀ‚Ÿ­*)LL§Ó³äT9|)i2F :zÖ £ÓÈÂ!ŠżäÚëèa4ÍF3½v>*.;!ŽÖ úóÒĞßïĥµ5".cİCiUcgGkÇŻYv˙òœċxĈ{çÙÚÌöÛ@ه´RJˆ‘„ĉ RġaĈˆß†Ÿ-\Îu[h.żA_è &—8SD§ÉQ C1…ç{½éƒ>‡•žşĠëôLĞ’:ÇŝÇŬäŝÒ3~D.^^şb˙n öŠ:Lzb7ġŒÛTTeTµ‘+‰Tn îŠ{óû/żû:úOZo6 â?¨AGüŝ˜ĴˆÚ<ñ˙*?ÄTġ‚ğĥ¸x(—¨fÏPv—Yëy”·[I˘„aM}­³Xhû†ûŭçĴ³Ż}†Ĉ}üŸ&ıCÖédrzĊ܅ê< v¤÷ôŞ˙Áu”9péx[!àmi8ċ˙Ó¸Ħ½ŭÓKœŸĈü­Ħ yƒÇq³\ıĝëÁóÛ<}Z§–€—ùżÖi,m‹’„hùrİ.××ç4AĞÑíċÑáî‘k‘B/aĥ´.(%¸5–!§!PÏíüΐŠRàƒÉbvxF°É·ñäÁ Oí¤†;€ĤŭŸ™‡9ҋ'*r:.ĝÍà tˆwĥïè °yUIjJ˘¤·ŠUBÈ™=Ç%)ËĞIjEè\AEk-ÒŠLŒĠÙX×UP!wÊZò‰…üĵİPˆŸÇK·mßğ‚¸]™ôIzƒ.İïé'Xée‚ÒÒY|{ŻµaSĴfrwï -[Rħ¤P*ƒJgħV×54P÷G úġéÇsúwÔï,Îw§Ö‡‘=@˙şĞu2ż]ZJ͵ÌĉÚß×} ï‹qĤ™žÛĵ²‹gŒzÊX¤/ĥôñÄÒ'@œ1ћ1ĠJĜ˜“ZĞ€(gVĦ•‡7â Oı²L§'­ó3È,§A­FĈàÀÁzÑöhñżd³sn^N¨ĊaÎÊ[ž7šûaµ“~'mréL>â–Û‡Ëy·ä=cEéUkğÔ’Èjmħ0I%Ê•U!+ĞĞĞj;^ŝT:G”?ä÷š7‚²Rĉ¸çôĝ;‰÷:u'ġò„€—§xÙK$ğ•Ù)qüˆ}ėŠ!RUÖ˘jâsŠ *ÓrE‘íıw~¸ñöJħ=ë K‰ġ*ôY/IĤĴC9=u,w?w˘AbAtfZz =Š‚­~ 8mmVK5-Ö&ĵ½:şQ]h›Á˘2)ċZBKgٝ qQŞŭ’ÂĞlĵĠ-™Á5¸X‡ž~è˙úî›ïġĠÙ¨Eûħ?7Ñ6+ß[Ôö°­{…F…AĊ ^†$AJˆRšštŸ†7Òä ÑəżaŻğg*úŸùÀ³?Ġiu ċKmù•ĠĊċ#]XڌĈ[†ĉĝĥzCEsUóá W˙süuħħI‰¤IYNÓSNtÒÍöä"vë^·BZš&ĞÁB>ÍP ÔĊ?Á\zŜŽLRòî̵@Íà˘ M9pùS¸NŬ|ċ Còߌeï üà?Çò%Tĉ‡XÜC'…ĞDšÑ6FşO-‚jE…;M?Z-Z³XĴSI4tŜĥ¤„D ’4ġÍ.c­ÑĊkLŬP gbíŞPNĝ·Ç˘qgŽĵöфşƒĤòˆRrêÓ$Jr‘ŜUÜRÜÎ\DŻĜIÖ*ùoFĠEύOİ~ħ/ĥ××>û˘Ê̐&+r˜¤çĊñòዢԄ,¨Èړ÷ZìB:às•'“W'°Š²S)éUò’ކÊFÒŭœÍrÌo`£½—Ñŝ˜Gŝvì­Òé¤tÈĥÈwVëDlòkD°sg_*cÖ8•êc˘À“ùVMyCäȂjŝ²™ —/?}İŜè Á 7È9 ˆk½' ĈQZ…NCzImĥè v+í(r5ۋÛw\Ì? Ħ$zmTt53én‰qNCŽ)ÑĤ2ĕĉ5CġÑŸß½×°vEšNĦ΢u"żĈè>òµŬò8|a޽ƒbÏíûxBÀ ş‚ĝ–A u$éĥY;ñLĊŭÁL×]èÎ#Ŝıl#sAdĠêÛĈf0ŭL?ÑíÙŬ7n]ş[M|‡žXÊkÈ2KÒ322ÄvAmm³Ž`y?¸=¸= mçxŽyV½ĠPċ@}_#ÚHúpÙfF+%‘–{ßĊ`Ĵ0ÒMh­L„Ïĵ#,zÎß§ÌŬŒ×ħöŝgi Áh¤ ½Ŝî:‚&7T#P­ÜP+ÚÒ6â'[ b d‹Ĝ‡†]E`bNÀ) 8 §5'†g“Uä3ù\!$4bTB jŭaINżzğxˆJŽ\<{÷˙D%M–›>ö·Ğ.f>(@­ĠVûĥêHz{·³ÒA;;JúÁĝ€+ïÊYğ¨TmMUAobLĠ ‡b¸ĵĤŝu[MIuu½ûäك½Ç ?X¤z]˜B r_‹èl¨èpċĥ†ì ‹ˆ£·&Ĉĉy]ŭ7…ĵ˙ë.)‰¸¤Dâ’â˙…KZˆ= ˜7yŝ\ ‚··~é45›œÌzfüîĉúéÁñòȏ³ö %0=TOMˆ|€wˆ}ïÜïŒû˜AbUÈçï<}´£Ş˜.o+ı8V•TZ‘ž·&',ĝżĜMohŞ&“D Ìä dy.ó:ßis´­z.Ê µIé HĠ¤‰‘1ùçKP+XuL™VAşħT VàCƒ‚À]žjżĤSz{ÉP›İĦ£!BġËċ§jĝòó¸Ħ ŬÀœ4äèUeÀ'XĠ;iôŭr•ĵİíüÛÛäc`(Şn<~¸ï P½°+?U‘Ĵ- VĴĝnx;ѳCkĝ˙°è/]wĥTí[³{˙ŝ$Z~%¸2‚`O|Ü˙†ëèŸò†sùÓ,ÎORÏ;ĵÖóµeG íúBĜ)=Ĝ%t&¤i2Bc L{,LıUI,“DU ”bó`t`–GŞÓû ”›+/é)+)z›Ü d˘!RíÛÂrŻĴM´*Tĉ½Ú¸t¤'Ò*eX4¸œì#ÒUëêŜÑóï'óW7 Éìy†žiü/}ĥAMşHbüMÖRÔà@ç JŸÊràĵ€dĜ3䗯ûĉĝSo5úó×çNÏÜH<3Ú÷ÀxŜ ċöê:w)ŭ?än ·|óßĦ€<Ëı_Wŭħĝò~ÑÔï/€ÈáA’—%ŜǏ@:ĤVDâÉİtî\żġż\œçŠd{¤{${ĝŠ4ñÎöŜ⊿3ÜûşsÚèF3ôŸí¨ÎF''WE~ˆ“ĉòŞŭžR^ŝËğ7싐·51*,è1â&Gµˆ\ éħÉ 5²êŞ2GĦ‰l1€‚ΰ?Afz ñ*‰*‹ f³“¨³Op0-¨ĊZ*Ç{çf… ï“áG6y&›ƒÒ/œÂꔄĝ¤ĝ´Šŭò< …F,;½ ÏZŠCÖ ÌĦ=7ĦÑmbJ$bĞ×ÒfIĦ$TrôäM™İáÒûh3òï:’ú<žŝì’Y›éÔ°Œ°à5K¤kšĵ^d0lm¨8DzáA]ž+םĠIĵ͈^´Òq’¨fDá‘ëÖA DZ……1ÖH["H‰´hu÷w~ MtŸ'ÊëdŜôİóê5ç9/ċŞ’YĦœiàVöi_È-˜ĤĽ‘ğaw“ö½êâv(ʤe™ğ´AıkŬ%Ĉjìhtúú+mô÷m}_ êîúc˨SÇV&··÷ĥŻ”ş%Ŝ“kôZ£’Öë,bȧâR’Êʊ›_Ŝûĥŭhî*Ħ oĈK‡~hĦ-jŞnòܨbw{Vr< P0Ï׎)W†^“¤LËSÓYž­Stu‰“íю<˘t[ħĠ cşzÊÛğ%+3St<³^İ—¸…kÔ…&!„”Ú"ĥšK‹ĴÚfµYÎBTA›´XU+sÊ£ñSjï€YMe—Ğì•ĊŽ3ŬŽf˜uV0“jżT\fR‘À‚ZĈä*Ò}~C *½/Î ž)Îonu’oô%dĵÖÂA63o³ä|Í^”ƒĝ%NÈ(gl›€êħĝIAdÚ°m@e Ox5_ÔŬ{Ö}ÔÑ~pB‹ÚCíU…+DÖ\WkECÇñèĈ  ĥN_Ċ,Ĉ£³"XCžë5¸Dċ§ ÙÇSÄ~›ö‡ñ.JùÑËlÌF;1ù:!àÏżZĊŭ·Ñ‡ĵaUJ\bBbf™ ĦĠŬì&9ĝeüÓGĤOßA³ï ¤w}—êíĦ‘Ż·t^ĉ–ßQI+îĜğ':‰çsAYnĤ*'Ò}CˆZWċûkB’˘sèìpEL:Oa·­ĥ•YË,%ÍMÇĦ5•ùRMr>$ú–Ġ×8›WmO&<µRD Ĥù½ĉ½8żÏ¤+ŻĞE|e†(8öŸ3éŬ^4=ÓD÷£k~HÄ]‹ż­ÈÛ ÍàĞd1›v…ù%5ĤÊJ¨ó­KÍÌJĜĠ'ì¸ÒwĥËI×-=e?Eù˙äGâQq{X^>Ğ‘ĠwRŻÈxn{E&öß$2…Ü6´Ûö&šH˜è¸R t÷%ĤÒ]Öġ~’7Ĵ“oÚK'E*˘Òñ8 Ğı­h)l5UǎwQ<u9i qé1ï‡óÌJÇ^<1ìċé:wÎP8sĊŜò?Ï]=È*)‘„ bĊ{bIА˘żç‡>ëA“ÌÎwŭšûŝ£$H“›·/OWdĤĈÇgx§HnÎ/Ş,tV@ŭ/A=+> stream xœí]Ks7’k÷̑áSuX]ÂûĦˆ9Ȳ=;ZÙcK´×ĉZ|‰–ĝ°(Êöĝ°}3U@f“&5á†BÑ •ùċ—À?ïˆQîüoúw˙ôĜ9~óIOwĤöOw>Û}è… dŒ"ʝŬ£é'r'ÈoŭµŬÙ=}0(ħĜŭ :{Uu6n ÖÀvü8ĵXˆÑJe˘Y,Ċ(b0~x‡M£÷j8_ÈQˆ¨ĠŸÊéİÔ>ŸÁQjìp…BŒÎúáÛ:mŬ?wŸá2 _†£²ó"/–Ĉè1¤%LóƒqU1ÀŜC[Ż‚Àġ,•‡ı•öËùÛĊRk5iiI~hTZÒ4â`[Ċ‚ħ‹Ô64‘Î —8‚u N.…va8+#L/âŞŭr„™Ê~BoC´İsŭ–°McTagİíœKżyrħÈŻħÚ_(+ƒ·~ Oôvû6(xX™^–§çGԆ[ĝ63aYÀöaô°˘Ïè…0ÓŽŜíËE£°Oç|wÎpA‡ƒ2NJoŭI~ıáü, è„öè#…" 8îŜ‚~£hbé=ˆœŜĵi™_Ġ*ÂĞ–ÇÓJ.¸×´<ċĜ÷bË9˘Ä·{_Ö2–ĝ T#†i²qÚ@Ĝ5pAŞb4¸¸^é·l òÓRìÚ°:%a„Wvôù‹ĤïA:CM‚ù&çAiñ!a¨ mkŝÒ´P.èĞ·ĝ†Qg†ĠĞŠ™İ•:Î2ĝĥĵ÷a­…K£Ô¨ôÎRêњ¨R˙§¤>ÄüFéü2ŭ8oA7ÁG–L‹žŻHj˘‰ GÇ\šVLJI5|—ĠçeŠ—w÷.Yİıĉí³ùi~J?\²ÍxX”ŝûEP#<ĠĠî§÷Q€pé‚ÓĈ´‚ŒCX 1ÒÖ:‚XšúaÂ\Ŭwˆ—3ÔÏç´÷_ì>ĝö Lün3dû.dk‰w@\GĞĥ$I‡B$a^o^”ĉei>.ÍGŬ&Mñ4OJó¨û³ħ4WŬċ¤§A‚jì—ĉëÒ<,Íħ4ÏKó]i—ĉ#ĥĠ·6‹Ĉ†ÑBó=ÉR )C ½Ĝg úœ‘·f‹`+!?g*= (t,¨CFÙeCÜ™™Š%¨ƒa×BfÛEf×"³# ™qÀ„°ŝŞ„Ayax‚ê*ƒ½Ì`|Îĥᇂ0|N3˘ĈÈژĴÒx`äe5KOwÙûMĝ‡šÉžŝ‹#dšFXçÌĤaSŝĈÎ0‚!6Ä×ÄQŝaÂjąMàCè 2Ò2£3‡Ż“ċç ÏX)GċLÂj›~+ *…Ô„·ŒƒÌf„2Âé{A(iÀFkµ<ĵ…p˘şgxh›yYšKóQ·ı*Í]ˆ:ż5Qsż }‡ŬÁÎğsH½İ`ˆ.VÛ9V¤qİ„Ĥ> ‘ˆ!„6 îhE<é ³k 4@Ġ->U>½~ò0µ<€QâÈQ; oĴH‘ú&pÊì<˜yúĦCċ_H|/âÊhhÀ´‹h” ¤'4ĝ£°¤ò0sÀ|3eP}ÓzƒŻÈ_aê‚äâ:€Á>Ÿ”+­ßs‚X£.ËÀ˙‘uŒ݃4PF˙V' :^ ]‘|`f 8Ĥżß× Y`÷mEזĉe0PZ‡GB˘Šé&Çj.~FĜÑÍô„mäEqú.8`c.Żô„/Ï*ġd…èGÉxF˘$'VBšċċDŜÁN&Ïq’ĞM4ŒʓBñ}AĈĵOòZ;ìstÉ.gÏáŻRZ›™ñÖ;Ğ}ÒÑY3áô còž5Ĥĉ<I=’e@=‰|’½‰—zx_mŭïÚÙZÇï†ÉJF`ñqǁé˘N r…0ĈéA”)ş ¨JSwûú.Ċì˙ÌtĈ:„Ò´wWž–iöWŒ@Ÿ\?kB6ZŬÀ!—\h[ÒÈen“!a3’§t’!‰]ŭwÖdÎû.“!‚ÌnOä’Ïò†zİ"Çù|¨Їé1:Ú 5ıg½z=­½%ŝĈù§aĝ‚ġ? ö+İZBE2ŻÖlŽĝ‚Ż.¤i ¨Z³ 1ôۛaKò î>ĵH˜ġí‹+\œÔZ&˜žvŭ¤4WmÜĤ–ìJxáñ°Ólġ_"ĞĜ‚˜äPğ5˘íèvħ=Ş˘‘Éĝ cU`|o?Möbö˘ù>"1SAÏN4ġjƒs!É4X./]Àğ¸zÚè$ÑÁY=µò܋9ë‹"÷żW^‹XŞâ`•a)Á xU.Ñôy"P”Ù0HöùÉ1£²ŸÜeUàèv`)`ı>:2@Ğ Ğ×d#0 dܔ‘Ìş+û][¤êÎğ?³ŬÌâžĜÁÎWí<ş™Gϧ%ÈL>µx\˜ŒTbŠÂ_Ĵ4e0€jşáÇE&"lâÎŭ6xäߐĴKd—Ï˙Y†|˜ĈžñŬ‹ÂƒîkŠ’x‚ vôšûLȏç3½+Í_Kó¤4?”ĉXšçŬŽ·ÍöŞ C=ê ĜŸGDѤHÀJŝiŠN]6S„d˜Ž›Jñl „Ĵ5 ,r_½څI…%G̀'èÁn|E4l¤­,nâ*™şä/ ˙‹BŽċُÉɓ£`’—ôlZ½ô§ÖÒż•žİZ†=Bmöï^1;…›6ĦÜ{Ş@Pv&iĤ Aµ˜;à äŻ€Äƒ1·ċĦËâÛPF½Ëôëú:h£Psç‹ÂÄXnôÍÂZtíxħúX5÷ÏĊLsÑĤì€İIS’|Ž'UĊ‰i” Ì…òŜ}WUċêͽaQ‰<³ÚL=u›OKóEi>)ÍŻı*ġúÎ|Â(VGÀ÷§Òd•ĴTáŭšâވΠobkçEu·şÌ÷Şmmµ­uñY@!ɝ´M†ˆlvÇDàIÖô}f¨Ïfš”芖ÄÔ3MâTV"”(‘fAôb‰k\6ĉçê¨ô:ż¨í9şC̞?E"5˜ÁO³Š}š4LğL=ğ&ŝr üBtċíµnĉŝCÌnLj•ŽÉ¸oµU ^Ù@ıÑÄۗm­úe[sìŽÛu²§,xÄÖ{›b$–ŜgÎÎi÷-XßOğM†'G XeÓÏ5ö ŝ¤:=`xÂçnċLNÑ¨ê;Ż9-X}6kyJ3ĝà<óĝ@*ÀµZÇÊA+ä…à`ÔY³Ò%é·²š\†9Çó$5ħ³Ñie …í.Úâ=H°P ¸³re#û{‹ËEIË3Ĉ{֍U(Àzç³Ŭ§ĴPù;Y@^2†ûÚ#XıCĥÂÁìf_E UZœ‰ëù‰0oŽ*÷—[žÂT@G§ÜǍ&°°°ëŽÀ˘L‡Ÿ–ĉ‹Ò|Rš_ß”˜ġÓĠwV‡Ĝ/_d\ƒ Ĉ‚9ğ›êY]›F÷[Ŝ‹µÄà{VrĊ{×3Ċ1Z…_iJx ƒ8‚‘oèÒ ü‚žOċqSF=é+˜c]0-ĤˆbĦĊj.Î,Ħ*?(#l*U³{)‹X‹hkóÛËßZIğM…î”k֗×Ĝút,ÎĈ˘oÌ>öí ên¤qÔ|ÓípÜ]Ù_ğŻE Ù"ïA°ÒĈéúóŻY[¨S²ĥvŠşSm@€ş’úUĦ˘}RE3VbÀ£Éĉˆ8ħ\'T”CĊ(ßŜ,ÁúèÚèİPJâ§T huĠƒPĝnxN~jÀ(zċž6E.l\3Ö+·i Ê7N…#4H*ì×ÎVE÷(N8l*+–TɗJĵtJĜœN=À[Ĝp°‡%MnVħ2Ġ"ò³ÇÓ˘LUàÁ’SU™pI†ħŠ<ÖùU™/šêA†bàĥ/Sġ0–„ŒßTè#FnUĞœ’Ztìbkħ Ğ(@\8•1Iġë,sóÛ"Gż7enxT}<°xŞ‹>wŞày·°”¸JŠ l j‹î—$GQU@îŞâĊÏi`)äwĥ³Œ ġƒ;à“9Ŭ'OKxCô–:_§ÌÚĉĜy‹KĉĠġ)§ü=Ş"*:, ­ċ‡Ŝ§9UÊÓÀ6Ú0B›ŝM'êööJr­ĵ *UùSs?™Ĥ%ĵ*‚Ëk,¸ˆCĥ”EÑU-S7ŝvD'Òq+Ĥ§LUŝ³żCó[ğkĞ}ħôîċ…7d~kÈǂtù$ Gü$˜%Ž‚Qy E²PSPŝ Ñ°'U‘*ŜEÚJ q\¸\TħÖ eÖÊ]R4q£ZË1:Ŭ¨ġSk–8;+$R§‹\pxZB$$“SÈĠŭ¤Pıŭœ˜XħáŜ·AÀ|5!O`–φYu9J]ŒĤĵfXs˜ş*TWXmߖ§cş6\#uD­ży–8ç+o—%–³ÄÂ˙Ž(tŻ9b ŞaüŽvÏŬŜżS'ğÍŞh§Gû)bĉúv0âtĥ4Ui2—Œċbt·Ż/M6nä}ïBİè!TÛ½£‰Ô§f_âü%1**§Ĵ²ı7ħ Jö^ġQ”…yX³ÍïbRäñóÔÌùŬşÎˆ( @œßjSĝx*Ä*Ħ:Ħ@J`Â~´èiÍä&cÁè…sĤÜòeŠÉ Á_p„°ŠcSDY(4·çÎlI—êƒkÙc‰çĵ²óœ˘Í€ÓëÑfĉĴ_m6İ:ħİ:Ğ:ĠÒÀCê|s}Ôñ×ZĞêˆÑ-ÀüTVÄìßtÄy sÙN´y}íjï-VĈéCĉŸ|€êäI=XB÷£Ñ%›ÏBèœr\äÍb‡²ûÇĝÑ2³(gIhShS‚eŠ×ž&&ÓËÌêxM·1TbCC"˙]ş]â§é=a¤ÛÄ?**ûp~XJĘ4ıw¤‚Y ŸŸ­*aIĦ É [(4,^ĦĤá¨"z'÷ĈŸ™5ü”m4vœÔ&hŜè“£,ıœĈħJ?VƒŜ•%;*À5àµâèo8ƒş:%™Èó’ÄâÀnp™{ħ8p|\¸áUÜO€É HµĞŬ”Ȇ˘ġ·BĦf“9CĦÂR (ŠIŸš§Rµ™ÙyòGĝA9^I¸ĠĊ„û`ϊfuU4žĠ’pdHˆŠ[û×TÀÌ^R¤ÔóéÛϙ6‚rç*Úüvbĵ00·Üğ>*[Îçŝ…ÀÁhôúĜ€äikĜqĝnŬ04• „qğsa#ŝ]† QµQ÷‘Ó€wvĈí€TÑЏKى–Ó`ìĥtÇĵìÎöĦğ³m‘'ŬáN>"–3™zg›ˆŠ–ŠúüıŒ!žÄy9œÓÑ/0mìş™U‰n²†Ù>\Ĥ‘žĜô çĦ­”\ğŽá:~ ž ˙ĴG_°¨ÊŻg‘¨Gİ-Ç6Vk˜¨…'8</şÚ ÖŜ‰Ïz“ó”_.ĵ‚IëĜ§[¤uk|u:5TóU/Px½OíL4ÌÏ[cŒûifŠÌĊX+Íô¸—Ì„ċrĊi2<ž~QÎç-%ÊRÓ QNr5ÙˋöT2ß2ċzğa,ò÷˘²bé=Ü,ĊƒáVóm£Hx/€UÛŞ1uM>0½îàby5¸…UÉ÷‰1Jm,f&ġ"DıŬOdµ-ïĠÎïŝ ½D[Éj.şÍeiž–&;uPšWùĥ4YŠa÷'][̈áôyÍœ•ŭlÌç¸ZLhÎĊĤ İÛ0n—ŸúQ){c~*™Wv£ɚ×\€ĉğ)¸ĤŻ8‘ÑxÙ `óÇŞ—îrŝż^òOZ/y ¸S‘$8ż¨fÀÛ7ÔH*ìRó îy#{i)ħşÌxˆdàm/ĠìsV&·ĈĞ™<ùŜĈMÜNĥċë*Ğà#:SL˙É"ç‡ÎŠyhÏeL[fÀîè’{˙ۙˆš³cƒÁòÓbŒşĵO4˙`ŒĴ:z–2€ ğxşÂHpĥXV³PŞ* ل[p„Í5žYFi~Xï“TUGcÓY|[]Dşİš)¸Ž˘oڅpĴ²òĈî£ö7ÂıÚ ií´8!o’›j*Ŭq ”vk*ŒJıtuĈG:—­(à>îÁì?x8ƒġĦœ ĥ Œ™üÔċ ÷ZÍsÙíğßíÛ/É=ë.§áĞî¸Oĥ­Ħ_BÌ<ĉî¸'Û™N޸TâÚUyâÜh –A×rıĉFêS›V^°bGYıŬ}#(ŜOCösÜ:H[렜˘ƒ~xz—Ħµµí=­8Ŝ˜ġĠ41^&–ĵloµá7mħ¨ru’†QVĦ|ŞqANa*IñDĊn4ĦŜ§éġ(,v”tÒWa˃jÙy}gˆqFҕ.ıoUż€•/¤ı^6:V yÊlQ?5ÁK$Ré4ĠKq'`UöÌu?tqO  Ż.ÓìĴĉw|Ûêâ"ìâêkVSœöˆ÷98ÍäŠgH’›f” éš6xÇ.5/݊ JÔ7m1yĠĞ“Œġí‡xQ–ĥò§¸ è…Š0òb£N8G5qµ݁Ŭ5ZñŬL5.tò}kI}(Ìg|Ë’/c.[;Êbòˆ!h0Ô6´!hşŞTê ™ĥT+çéFğéüIş/ÊG´ÛôĞ”ÄL.›,ħŝämĉ.Lqœ2­Ç޽oêvÖ½)Kq<ğş!¸§ #ĞMùN‚YŝÎŭmÁjݨÌċ{ëJIʔĊİİĴpb™ïJ aœ½\BêA!–³4œġ[%S·EÇLĦ›`”ħx ‰b[Ċ—+ĈiK³·{„tm^,:Ĥ͝UÚ§òÀñìĵíÍ×7ˆĉ7ÖŸìûÁ¨żËîó‚Ô ĈîHN§Ğ³ş-/bGcc'kE—…ħışÛ×·œŻ­\ayÓíàşOŭÎĊ ÖÖĠûÒzĦħĜg#`7ڜÓċ˘Á8-+d…/o½ ş?ŽuÜji•&§´ñDĠµžh[—QĊ¤İ ášPĴ>Ož›ġĴ&­?”&Ž…ïk޸+Ïé%tžİ|öSqıÈ9ĥ\¤ änHóIĵ DÇà€×‹Ç‰ïŭ†sĴ_Ĉt40ÑğMçÛ`ÒŒŽm h½ï>}UšWÉN˙ħHğ€…Ä>ċLtd6}cŒŬĊĊâUÌıcNş}át—0*¨ĦÁÑïçÀxj]ĴĈ@ƒÇ£éB””Ş\§K—Z‰Né²\ó=½1MŒİÏÉMĦİ˙Zşk5R҅o"|‘÷°ĈHşöĞÄĤ4ĈŬ"Ŭ ~8LĤÚMn>bÈñ'ĠS ›Q‰WE™òGĴbʌâÌĊ<ÇÀ‡ LlŽRĥ!avZœ01MĤžÏe¤›[I°Ä.´t7t.”ÇÄĞ˘K-îĈŞŒ iż1QşĴ³i—iêl:/.->š¸,ÖX„*H›˘Q*Ù$´BQŠ$:‹ĥAH–7dğpšœ'aĈì:]T&†9žó‡úµNĞÑMïx괆Š$jgŬTG͟rÍ'Ğ4ÙvO2,Sñxe{J=Ŝہ:ĴèÁ0híŭŜ'ßFunsdE·XĜgĠ}Ú?TzUš,6uíż{ŝpÛÏîe"ZWï|‡•ûà˙¸ÈGdendstream endobj 327 0 obj << /Filter /FlateDecode /Length 7093 >> stream xœċ][sG’~'ûó°Û'µë~!bd†Ċàá˚y8!’–=ûÛ7/Ŭ]Y}Ş……Ä#6ĉÁ9­:uÍÊüòVü²£z½£Noݝ£[żÜÒôugĝÏÁéÎû·>|é³Êzg˙Ċ-ŝ‰ŜÑÉġÖċècŸ­ßÙ?½ġs÷·•êUVÁFŬm´²!uçĞ]ĠG\ê^Żv­5}Ìıû 8í”ÑŬslàsŽÑ­z›mJŬ!~µ9YşìMù”M÷Œ~ŒÏŬ;ñğCĝ´Ġó[ µRQ%I.tw{œQì-ó|W&wŽR!ÈeĴW&ô9Áo~Ÿ'ċşÇebbĜÍ땉½N)/Íà·U²@ğÌsħ}êîÑFcy]Ċ6Ğ]èF²ÁOĈgŬ=ÄĥIi¸ÛœB“¨uığ(sĝÇŝ=8^—äñZûàñ÷ŸßêŒ^íżşµëœŜÙµO!àçŸğûÇĞ]—a˘Êv?Ŭé}‰ lÌ#3ëàœéö`×íŻí”ĉœ‚·Ŭú”~”sJ7À(S5Ĥ)g}‡+ Y{“ş7âq7uŠ™ı§ca ÷×gxv)ÂÊğ#šCŻ4p)µÈ*vOğrPF˙t…Ÿ ÛÓv){Ŝ)Ğ­2V÷Ú$ŜŞŸa½ċpñĝĵ6Ι"gĵ#AÒ#'<ÀĈ*'ğğĞiġW<·ràDÔ4ÎĜ"ċà8 ôMÛ­é`ÙÖĤ} ~:<–;ˆ›ċT´°fĵ¤V[Ğ]÷;­ş6¸<‘މ¸ŜGU fkM[:Cë‡4+ï4Ŭ_šÇ+ì ädrı×5Ĉî`ü3ŜĦ˜ĴI™Ö+O'&nĝĞfıG[›´‰ĠĤ )8ŸxÇ —·ÖıkĊƒÚÙĠ֐ Żàŝ ÄK´vsÚÂ÷ô™YH|~,¸ó ˆĤs‚%¤JÑ ·ż!!c °Ŭ[>)`”Üdż7ĤŜ×àˆycÈNŜZ>ĝagᔿ—N6eƒW&à†Ž#ó,†ĞĵŜŝNÛK">9cĈ_âħ•-0Qı5ġûj˙ÖßoÁĥ‘Ž9żD%–J2 9\;p½7Ĵ‘ž—;·)äq!ïRR²/¤-¤)dhöà ùy!ż,ä£BîIÁĝM!ׅ<(äëfƒ£B6ûs¸WÈDž|8Ÿ]ħğ…d‘Ċçv †pÍ΁›Şë·¤ŠžI“´]”A³ —&f{Sôú5xÉÀŜyO Û­Py„LÊ=Şm¸zK"ë‚>ƒ²PgsVî=ÎÔĤëaÄA–À\h&AçJQ1™ÌJ„û<œ” İîŝêú·C;ìÖìÀ˜}Žšwû%$ †,Ûä›B^òN!?o’_ò*|.ÚîÂIxhÁIî?o^çWM>×ms´M³_qiÄĊ½Ñĝ×ëÜ@"ïÊ׸³sc͵LŜµ*R›]Z1Ëü`CVÛh|8 @"Ŝ'[Ù·ùs½ŬÄ~úñċœí Œ 4=8èxDsp%Ħ9ĝ à° lEĉ´½ÍÍJµjŭ()~ûvB.÷Q:èƒ+żn*<4d\00Ĥë~Úŭ°hŜgÈ×&`K˘Ç%£„­4 /Ħ£_ĥ‡ U°!–÷iL›•q‘œcž.ĵS¸àed˜Ĝ‹Ò@¨sn06W÷#ĥ™ŝ.1ÀšÛŞ\݃ nMaĥœZ:´-ç×ŭZïħĵÙ ö¨äŒOŞâT`NYŸ]…LJë]‡öVÈ3AÎ6@ÂÚ! žÀ”ÉR9Ŭ‘½ŞTÊZÚuğ„ĈÀÒHŬ÷xc`ĊĤ2€Ĝ5`\° É=ŻF3öµw 4Šƒ=$˘a˜Ÿ¸C`œ Û¸ž—Nĵ›_|Ŝ›áŜë\ĤÎÑolèúZ7ÎĦY0KnŜC:ÜYş‘rÄ_ӕÔ`ÚÍD 36ŬÓ§ûn$ ¸2ʕGV;#8$?ÙĞĠdí]ˆ-Ĝ+Pˆ>˜ˆ œ8JÁl/EÓ<Ž}rúĝ!‚C´ '€9 NL³ğ͙ŒŒ zö ­ĠïVÂÏPŒµƒ [OÂq™;Y @?ÈŜî-Á\‡[˘?ƒŽ`³Ĵo†S^Eé  ÍÙ¸àŞÏo…­ü e²!c…–˘F9I"s-ï™6ƒ7‹wFA'_Ĵ„I(灷/N˙ŠCµŒr>²éÙ°îì/ Ši=,“x°bF·Ĝ0Íì=İÈÖo…4‘gzl·.ğ)|X-àêâĤ<“E°äÜhäĈÉÔ~8ĦEPÀ^>Áf n—‚YdÛÊċ“÷§ġÉvı` ·%ÂN ÖLŝv—°R!}“=ĝ& ™€z?6gö9‡ĥi'F³ÍŸ™ĉԕœúuà[VöŜzĞ.ò@ȔéŠÛâ}‘ùwÊm1dû"€×ŭÈéİûı´ÛÊĝÁpIĜ…Ô—ö_Î=2LŝCx(Q{9 <ŻGğÇ£,½ ğ'kÒb -áĥHĞ'8wVÏşç…üg! ù}!7ÍŽ>4Ú³ÂOMŝ˙SrŻK[ëPÍ‚€}‚MjÛ Œ1‡X iÈ- Bñe:6ĝO0²Ötúx8ú=ù´ ˘Ĵ€]QR/Çë `÷¤ë–rĦ×~Ò$"ê[äœHnïRDÚ^€MÀ É=\żb§m8ĈšĤèܵŽ2hsÁۍ;żĉC[£{BÀĞŒA žcĞù`+ Âì:€½+-"˜’ÍòĝۂŸ†l (Ĵ*rżĝŭ…´£Îù{H‹>\ħ”xàAÀY:t^Œ{Ël òĉ:³†ƒÑŽ 5Ğ€3úĴt7h‡HĞ ­P<'¤¨ĵİĴŽw´ÒUŞŝeëÁ–_ĥ˜Íğ‰i^ò¤|Şa•ˆżÉ9­§Y…Ħf.³ħÍ ĤƒK¨µ>CǛJ”îĴbˉ,‚ċF@ '¸zÇ´@ŝW@ù[}“T…üĵëBžòÇBò}!ûBêBşĉhĦù3Ñ6-üìjè‚Toŭ³Öñv˜İÎs ‡ÑĝˆàRFDĦ8j]Rlĵ3s<4`ki0U ż‡è*Wxhj1Ċo 0C’ó;Œ[ù€ç~RA ß§@‚—?o’mÌŭÏĉĊhcîĞ8hĊh×GCĦ9öĵ)ĥv @ WGó``fOżİáÑ#uÙĞĥmİÑf˜CXĝ~P4T›MTz;{labíâ*ĈkrŝQ@—hÛÇ-lí­Ëħ5í ıvĜÎĵuè]ËŠ gI €>:EcVnÉ_{´Ò¤5‡ ħhuDŽÏL Ÿ#í%^_Éë‹I-Qıì}Ġâ}Ëz޳ƒ‘S>…Uk´g„6şÁU?ŭy}ċQ Ĵsٍ n\é›}+ôêšÄK$§jù*Ò.V£ğNŜĊßĤ¸}•`@£B˙r_bb_†l7ċ+Ħ•‡§ë 3ıßëƒkħĥ‰ïNۃ;ż=€Ġô†?JĴoÍל³—~#“ĜÓH9tÊ ¨œi¤çĞÉòETšš}>TQVPF -°ÜàZÒW˘Éĵç'<>~ÉN…ÉBÑîòŬŞ•%$“rn#ŜSäŝ^ĝ ëœĤz{ʋî½+fĈ’ór‚‡b‘ëƒ\jD„:ÂĴ>"ĵ,ŭà¸&á£&\;mBĈ³Bk68)äĊµܤ”fGÖ¸ò &qƒŝ ÌĦ2îÓúƒ~ŭ)·–ıiÎW´mğZO yÒü™Ŝż(äA!…µ'lÀÊIyÍŒ5ÓÌŭíÍħ͢Xħ.,ˆ ½NĦJw„°+ }Ì)°‚AĠ0n‰ÚËJuş…òÑH” UJ&ñ}TÙkB0_D’Tn0ÌĤûè3A—FK¤v*ü*û+31SPĵbD€ƒŸġ˘8H[Ö Ó4Rş|Lj‘ʸ? €H2%0ĈÎ„@pE<ç¤;´ÎÓ=˜ zÁ¸@pİtgÑKY%ÜĠNa­bïB]s´œÄ £Vg,u4²n@çì’ áôÙ ŠC¤Ï²ĝĦ>ċÉyıut3à ·ĝE­AÄÚíÉèôbpÜ'ËqC–!T ï²d3˜v2zıRОgîSófç*U3SÀöpifşsĉlyVçTè$ŭìû£œ´Í`eŞâ+B¸fHwMp/?–t=éŽÍ)bü´Zò#+‚ŝ˙UJ|ÓÔêÍİoŠĉ;*¤P£Â)ĵŸû…Ü4Ésy¸K>ÔĥR ħÑà"Ó×ĠİXÇ҇\œ/u{ĝĉ‘ĝ*!*ċ>iƒĊ€z6“T£ğèŒğ pö¨k0’ëö‰“__ŝ”Ŭ=ÎÔéğ,A"ĵĴsŒÁLÓşŠ?L³×Ŭ}œI*íĞŜD•u Âñ—„Ù×ĞISÍvc2Zċ×4KPu ì%„“™:ĝ½aú°ĤYŠ™¨PÂÄÛÓ§˜^%F‘´Ħì_AŽš™NC²—ÌŽáPž¤\U6‚ žŭYôGtaŸ(íyH9˜†Ž_‡ ­ŸTıZۚ!àáA3xö i ’ ÄŜÉwÏyÂ3Ĥ‘Ċ9KQĴÈñ¸$˘ĊÜIeĉä ËòxÙçĝ.Wá§ò4Áw`I‰ÀϚ$×@¤:é¤\ŽŠ\}\•Ż"nz_Ĉ¨žUnäFX˙3^d§agÊF”ĞÍN[sW@Y)mañhô’‡Ĝ‹í ¤Ë €¨A ×5N498Ü0ÀT€ä@_ †ßÑ36ĝoUlşf(‡áŜd›‡ùÑW<gM˙}^z;.rb–U0,˙b€)˜ÚV~ö˘¸…§ïä<=°Ĝ£ï\‰>À–ÎV‘Xħ,îĜ¸ĈğÓ>ž‰ŜdÏĴl·cŒ”t€l½,ħ ö³ÛÀQ‹˜ñ„§’F–Ċµ}˙Ż H´.ÊáÄïŜ kEve€W8—ÇĞ)aBÔÖ 3é°èô:ı˘•ñÙjŠ™ Ç0j%ñĊXwT&$rĤÓİ~ĥ›Ì!*Lş$=bÛ;pDħ“Xq˙ĠĥaÌì”Ë ^@ÙŞÛ!ŜéKƒ`˙Ġ€TÏÇR^ƒ½XzİÔ1ĴpSŜWĠ k*ÑpΈT ôD(ÂàÀŸĴ_% Š×Žı-֚>ĉ.|Žs݁ƒ˜ò‚ 7gOŸîñϕŝC9rêÇBˆĴkR[!úr1Ğ•h8ܢ^UE˜7Í’[Tä0Lê`}"w`’ĉżK­ĵÁ3Do³Ao³"AĴ>1ßFzpİ­ƒ”žĞħyHˆß²Ŝ­’KòlÇɎİ]Ŝ“§V$ ŬFiĤË>áıû´Çñmá)òí³tÈó£I ³ĞË&çè(şDiáu™ż8kà°[¤'ü?ı&#éîrƒM‚OÇK+“sÎ2|—Q•ÛœëËÁÜfêÜçŒtÉÉÍç64†Qeâü‡Dg{ܘ8ŬĦXÑŜÎrş&ÙϞ·@“àrÌħÉġk5­gA†§ #f¤ÜÜ ÄŞ÷=w>ö¸âÚ{îÀè‹ÚÎ Gœ1=_wÈżŬĥ-ëô9÷XoÉ1[—İ ıħçíù^Vĵ4ċħ|Ĝuî(`ŒŬé‚Ú˘í<`BŞ#àħ‹UñĠbÀ—Şë$ԙósw<áù‹€àëàwà!m6ĥŜ~fè…ñcaô 'z½ıÂOB1zzÓ~+x_{ÀѸ0ĥ4,9Í.‰“½àaxËù#Kĝ[1ê_ßFËvV_7‹‰lyهIpÏԟF°ƒ½ˆ2Ży) ĝĵ¨òĉżœô‹c%ÇbO{qYşt€“iĈêYw /ÙS­‡†­ĤèË`ŞÙìĵÍĈ0ä§òĉh‡ÙżJoÎh<*†ÁMUF_âĜıÊ |͟ ׋ĉ>@ûĴÍmÎß )^ YĊ¸gôXi’ġvaĦmñ]Ó´hğ6IáÂ9nĝha™×zS÷>‚ŜĥĦ·fÁŬ“µİŬ=cehCħ0´2yÓĵ^Ċ¸ĞÔĞä€^¨ %O8œŝ Ż”Nµ´~żš™KĞıXlW™ô@Œ/ċ!˙а*ÈïÏB·´RYÔż‹ŻÂƒßrE·l ÌP4ĥċMÜşz£^ôÜĊ/ŒżğWİŒúŸqáeŻç“žċ=úŜúòÊÌVŠŬÖ#;"t!Ó İaÔĝ€ÄŠ-uƒıĈ mscñEÌ ĥÑïh rx³uÍ$ċm!M!Żò~ɗ…O™ìRü#%bàĥ—KÔϽn6Xrƒ ˘tĠB> stream xœ½]Y“·‘~§7ü&üÔ³Áé-܀ŭ$ğk…,É2cc#¤}h^CI›ĉ²è_ży €LTUOfä[5U8óü2‘ĝûĊ´7ŝW˙}ö£éâúÑßzzQ˙yöĊïŸ<úŻ|†'û2sñäċ#ŝÄ\ds‘BÚ.žühg/Ÿ|ï&ĞŜġfïJ÷Ÿ<ôġîĞËĞi&&ğûò_3ı„Ŭ;z\JJvwÄÇ9—wïñħ)Ċ¤ ÍKe÷{z:MiÊğ—ĝ3˜ìw/ñħ+مĝO>Ċx98ím0vÈo/Żĵwû £è]żƒÖl6%(Ŝï)'›'ҕMğ5ğg½—Ŭñġċ•svŸM€AMûz cê-ŝ 'ğâKì–ÀXżğÁ6ÜŜċĵûğ7“‹y÷Ĥ·Q'ĠŞNfŸ­SĞš Ĵ$żĴ·ëÊMnï“ğ¸raŸcäo^â2´ó ċğûç‘Óìî —  ³ì´LĊÛbpRĝĜC[áMr°W7ĜžŸĤPò*Ĥ’vŻû Ŝ‡aJğkı˘‡ë8D3•hvWĝ[JΑ;­ëû6,Â.Şev‰Í[˘\ë­?ħ8-íAœìdvÏùq€ÙżżlÄ÷J|ȃr@ĴLÌiš|ĉ§“·óé%ŒÈëĉùĉÉËù*£Á‡ĵûżŞúĊ•Ž–ħ­]~z(W‚Ç•b"&w4Ĥ( şġĈĞ™ıߒîŜ\"y9Wö&6Žŝ–öÔúè%ÑîĊÔ^p~Êj7jÏSĜŭˆïN *p_à…<ü@\bR‚U?25ĜìDħÉğhWڛ"Md*Ù§Ŭ·†CżšÇ~eá+àUžÂéŭ)şd4ÑÜ-Ìü-Èñ h·Qô WÖ–[–2YZçqĵl9·ĉYNħQjñ)PcÑÄôcf½\PâT*YjzĜ28`ÏŬñe'kŜñ™Lê홇VĥiŞN)Rƒ¨ĥ–™ĵĥÂmTs4ÊMAÓÍ[ê t‚ÇžŻÑÎ "§ĤóĵOG¸xá'">Ž&V`ë_JÄ„èœñL|u|#3DĜ›f†k- ײ‰ĦhônÈ@U7âÂMˆÊà/šŬ~ħĤ¤Mqñ:Œ'ކݐu™€w4~ÁƒƒµŜşıöЍÄĈşŠ¤Ù”Œ¸™ż[ZˆàŬŠQĈĠÍPżŭíçüvùZ\Ö,'á+À> ŭۘ^ ŬšV×íêHAwó ›Ĥ"ĉOy|:3żz˘5f”,!V†(U÷ĵê q ż`!Π֙ú–ĴósUÀ>MĥÚ79§ö97‘Ô­˜ú=żܢ_i] нÁwÁœ­ĊAŝŞà&˘uVġr$òRO}H~$ lĝE6­hË“²7Ĝé[)ٛèW|#< {u9l…EG!dpÀĝ³p<ê‚ċ²ş2fĦĠi]nş1&$t·ċ³÷u/iŬänż`޳À ]ċˆĠ”ïñħÙ7Ħ†ÑáİĜÒI ÀĜ—–÷;žFÌvEŜ°ö>€ˆ`DĦm&?e™ †Á÷‚—„d+ĴŽ^І÷$µ`ȨŞûö–ĴbĜ€RU6÷ÂìŸ ÒMLô’jÓ›†½´Xğ0›AEċ0Úe F§ĝò†˘ˆğ3ÑUNä“Mžlż· çÓ[-ÌÖ]iXI˜†O ùw&²‡“0ö…i'G?*[ĝ˘çgóZ ”ŠSğHîŜŞO$ĵGÒñäÔüċ²ġ,ž+3œĈM˙T&0 Ž™ ´ŝj{ûʎd`YŸö)‹ )çR<ï,#jfĤm%§œ–7ü8тvëgiÍĈ$gG:8ÁÌ7”Ô˜ħlċù ´ñµ·yĉ‚'ÑWÎÙGeH}- èŭ@Z5ú@ÊÖ;ì/²œ (É[ĈŻŞuMp³ •,ÁşN&ÓğĊµxĦöÀÊháo:İ‹óż>+ƒ˙ŭK—ôŸĦç‰$QìhG´ú ~ö†Ħĝ gîu§5!h……ÄÌĝʃÉġB°ÇÒ6E r¨"vBŸTÈĜÑİûĠ”ŬÒqÖ":úU›ŭŞÉ–YŬşdCµ>IèËĉĔ…ݸe²nŻğT%BÀlX†ÁÓ‘;4ŝxêîÊ{žLĴ!9ßvšċnrÈĞıi³ÛD–é Ä[Bá}Û7cŬ(­F/ĴÀÇ:žŞ–Ĉ 킎–Vœ6ğĈ´½‘o°ñUB˜éûğÁАÊĵ) îA…§Ÿ<~èúl^8”•Í5°–†è6İôcíú·]RKÂ™˜\[&)óÓfÖ3Á0GÜòdŠ´1PL³"Èeù !•B–$N‚Aƒ$épHZ "ñ f>:Œ0ßŝ‹o]ıZÂíaLìóëîŒb,‡Šİq‘Žâóä2ÛY<µżktЉr żàÀÁûŒdCµ@ŻëdÍöÊŬññġì@î6F@c0 ?b:KUĵbEšc.šRA}&ÄĜ ż >ˆĤ•_ħĉÑÜÒĦU(@„£ô*Ŝ^ ŭħ zŭÔıD˔}{fJ˘ç°qµ1-äd4óÊÂ"â–hmtsmZkbÒOÜP5ìÑÜëm…EÄTÚŜ-˜Ğ™ħ£G3y[n7+b oJñÉqÏPÀ\Rωà1cÄ:Šf\>ÜĥĤßèċĴÍĈJ2DĜL2Ĥ֑½öĥ€Ċ7µt’ +HXȎ6ĉE‹eB’*û ŭ‰fyÏ@,xnĈÌ IĊ"ıçR|ö˘ó^Ñ*/ Ċ4DßÂhÛĤDd|L{&uhšÜ•G{5Çߏ„RLÙÛ´²U%€ô Bêl Ëco”²9j’kşIZ_ŒÛƒÂ#ŝ˘VíÛaU İd`Q_{Mè²T êcíd ' žclı•NûO>In£İ„bÍëARƒMЁRn£~gŒ°ĞÊeUĝ­ŝ´…>]ŭL†M…ħ(rĉ|G·™^£>ĉ1ğs8gİH;HZ&E9ûöˆÜ™€â$œéġĴ İŸg[pGŽôە„>?íú¨ä2|˜£†YÁĠÀ*AXW¨WĤìŒUğpà&Ħì<g.ì|ƒbU)Òb>òÓÉdùô„úêÁì£!²µà#@‘ ĵËyÜA8ü›˜o ³o…"Ú8¤8_€ôA*ĥAĦk„Â*"—TY9ğÌĥY‚j0Ŝ0Mdo †ÒĈÔÂq şÁĝħĝyı (öYF’’Ž˘ë%rí[ğ ƒ5Ríĉ6g½JZ†‚ĝ ħ%Ĥš2¸|£ükNôÉfŒ4ŭ0È3@1’•Z †de÷d_‘$ĈPÛÚ wˤ$İx†Ñ™äĤ&uċÊĦĜöèoŻ*ġĥ5!{/äĤÒûaNŻ2*bĤfŽ38}U`M‰8˘hïAÛ´³„Zġ’I:ni‰°×ë­V6zg İkşŽ›S­\5z>Á+xˆÉq0]2ITġF͎3[А\o¸\ò3É_Ï+6ĤùĠLk÷65xïSsh}8)œĜRŭİLDxĥ:ƒoİżíz™ÑT˘Ĝ5L6 xlħ÷ŭ”×öŬeĴ^\‹Iì$ö„[t—MÉ m!U¤I”˧WÊĝw&„`ċw˘ı5¸4a„Ŭ—VŜüô²%ȕû˘ïĠçì͛ E]h;'+SiO ´HgbѤ )ô702a6-uxRâyïBşö]˘}Žo ~"xn)…‚Çĥ ojs^„%Ĥ°7\k[ϸ–Ì ŞĜEĤ âzF"ƒ3,àşàĉ“V›âáɗĜBJ¤@Ż™,höğ)Ûùü†‡†`¨ˆŜÊ0NtòÓżÒê@’BÁEÔJTžlÓ-87ÍÎr§ŒÎ­€“tíÉĥtVw{:ĞÄW~ËI.`gÌ@JTGë(1kZˆ)Û‡d>ġ£ÂDS˘Œ·-˘i0Ħè%SËaÎÍ”ßĈ!ΰğa,GÇRb2£X¸e&˜cş=Yñ!œğbnŝĜI£mfà‰ÈîD!aF‘&K)‰ùÖÒ+“<Öż?"ÙSKöÁŸxT˘32Ĉ‹ K5ùô²GoŽkĠ‘…ĉÉKĝŭŽgCie8гœ'i6­†“j` ùE8 bÔô,r~]ĝ q`ò#*‡ ˘YùJÀ•]*ÈÈçAğrħEö"ñçÄOğìÒ98(tƒNgŽFΘMˆ­²÷VŽgžu 0ùÎ(Iáür>½áÇ|†™8*àLrĈ"ż&z*vsşë§Eßso9ûeìĞn#İá W{á‘Ġ1kLD èÑ #Ğj:^fċHÚDs;ÚbÄAwìñ“Vè\ÁŸµè3)‘§TóğË:Ò(YäBœÒB×áğ2ž^ĉŽ #âú…XfHp?<ŻĉJ?HÛĵ;\éKŻœYÒÇÚ8ÈŞ [´}-BÏĵ}A…($ÏS˜‹İÀ˙Ž›`­yG3‘šÎCcÄÓİĴ$ŝµ8ìGnÓÏ<ÂÎ7ü)ÚĦ+AÌ1Êşùu€Úl˘ĝa°”˙]-΄ö·N{_ş˙œß†5V)Ⰶƒ=,U ĜŭĵÀ>AÄĝ2†é7 ´£8×?ĤĠ¨dj&lDx(à8q•Úžwy/l IƒóĵŠÓ}(¤ßÀÂ:ß ´3´ ÁÛñ[ôĴ4“Ŝ4Oœì+ʵ sûö¤µŞ xÄZlœáé$Êl˙‘.80yú”TûŸërž² 'ŠÏ@Ĵ@މĤ'?2ä_ò‡êòŠËqŻşœ7=1PíFâ‡İ(Oİ’žŽlžE·3@‡m£Ĵĝ·u>lŜ&Ğ­ûĈ‘ëy°6òĝ—H}ӊjn[y.2½½ħ‘*t£:ïñë=I­×–‰2êiÇ7U%ĵCÓF&4­²GĉĞ\p›–Á-ÄĤÄÑċž fò‰Í°h‘qŠWÎtI9%$ .)ĤàŠ·ì_é„Hz#tßùGËÙO>{ôäßg3yÊGëD$â;”·³È£-‡.Iċ´LÇIè Ç7ÁĦħ3¤ĈaƒaÉVuİCЛ̤J§Żç8IŽáC ü{LġXS9$a–£È°?œJÌĞmo€vâ”÷¤[×>Œ‰Ùˆîğ2ís¨5‚V"ĠÙ0ĔSyŭŞÏ˙q5òò>˜m¤BĴ×î"­™ïƒş×ݧ´=eŽ'#Ïĉ°m% gÜê(%ŸŠ€Ş<^P:0IĵŒ¨˘iUòôÍÔHíFÜQV{ÏmdŞH·„ÙĦ‡wŠáŠLZ\ÔT{QÛȜŒocĝ] §kùA¤ftM$sžÁW2×GÙDlĊ0gİQ슠g—èİu€Y…p‹ĞcÎIHò§È=òŸœ1Ó|Ìş§İìzWçavYĵjšÎžfŒO_÷ž?ôÖäğ×}ög<Át²Ħ\ù¨&âqÂü\==kÀ_Cŝ܌‹?Ò"açŸġ-Yíşìml ıŻt NàŸûrüñ²ÀùìĤRLÙJ˙^ı{*FâżìB²G‘M4×tÁÄ]yĜh,~ƒÙ€İŒ'~d9“:eŸüjaqó !1ÁEĝ(ž´´ùÂù²÷ħ–‡úŻîô<Ä5KÛ0ÔyÌC 5u/ˆÁGġJDÄ?żm1˘hï)Â>LeDñqïë•’ħċuëx°ŻK„^ÖiM£żl„üž?.`„=lĥS{àZ=ËOÄy6‘‹3ÖIDÄ=ÊďËËÖî™íŬ(<¨œJrŞd„8ĵŞĦèy!ĥ’{Ù( :!°ñ÷ ‘ûĵċübğ1"hr‰°ú…3 B{ŽÉQż?ùäGb šFş‹ž{Ĵàú ½gwğ z=ÌĜŠŽµߔ‹LfŠF„4éç&~AĴ†d°=LŠˆ÷:NE/ ƒ–Ž+ĵ]¨ÒY”sAN Nˆ!jğ'o(*8’‰gêA҈Šq*>ğ–” Ĵo:Â5ue/Ş‹ M¤~œi2e´ƒğşt}^7&éĈV\”žĦèÖaĤ}?"5s0€ĝ D,íÚöİX‘s[1àı@][R d#—“ÒOTÓ%ŒA‰Sîw›`JÓÂb]œZá–u Qr£î\Yžh †ÊEùµ˜ï> +v¸µ–ÁÈ^Ż @Q…?3Cµĉ•şĝçzĊT1ÏyGċ‰Où lGÔç1·Ü7›˙o·Nu€p9nâì•tòŭ@L #Mї¤äihU³q‚–OĠCƒ§¤ĜaGò*†ÂFĈYçO€öhı˜S^ĦĊ Ŝ…žñ…ĴŞuh6}Ìɲİ_mÄP=­É­ß£qÌ7uyĴ Žĥĉ„#Û †d´şpg‘fó<Ĉ-âye‹€Wu¨ŠÈûĜ§/İT„²$³ˆ‰·˙yݸî P#˘k•ı>‡Ò{zB²D7TĊ„ ¢‘§KÀı‰S36=câ&Ož4ŜÇ1´Şòĝ&ĥR6ëúhàƒ_ŜЇž•…jP pü7ß,‹Ğ` ì)]‹ĞŒŠ³ Žee’r°żáŝAĝÜY•Lž–ŝ˘ŞdâzZ•0DĈ`Ĝ\ñÈhÊg+7:OĝĜ™Â@iċÖœ8ô´¨Ċ%°VONkžÌXbAç,ͨ•Ì ï1?]w°Vvk”íġ¸e"żê™“ġÊ·QQ·˜5#³ŬZùd£èħġ™*¸í¨°”7ÒöĞzÚ0:xw‹c½B•tx°ôlĴ ğ.Ù';W&żöŭ,ŽÔE`Yĉ·“Ö—;ˆz¤‡ïğp—ĊlEŜÛ}|v˜V€ùÈi=ħ ‹‡ ċÂ1ÂôäğŸ3 ŝĈ|Ùô×âpšèu}×ÂĦD­Óc2aĉì5aàjêt‰³ħ1c‚ĝr,qË7)H6bTĉXÏÏĉe•p¸v¸Çĵ @îéÁıĊÊ2…IDŝÌL;á91èĉöpÙ¤Ĉ ÁPô §‚è=/ÁĥqğîsñLĝ°x‰#@…£Ey6ʅÎAÔ¨4ëz…bCËxâJPpnûP[Äl áGA=@-ËÁsĊR R}c,/U¤żµ}4—ğ“WŞ‘wBğŸ0x@Óğ ÑŻŒŭşĤŸ) ²ı°à’Û³xPOì†Ğ™Ó<µ,=lҝŽ˙½ĠٍÓ5ì›vĉç2§›·¤ÌvÙ7Nq'ˌ…ítÛġ…/˙ƒ[Ċ#/ùg¤H̽˜ËÀcŭijì­-nMÉs•~>ċ²Ûµu}c.ŸüìJ[¸~è_χÑè•hĝ:££°HÔıœv÷ ÏKœċö67u,YßüĴħ|c55…+ĝŽwŒEҗ•Žç´O5\ĵ¨ċ rRFĠĉ!Ŭ!&‚uş ïĞÁ 'Šw~ÔŜZĠŜ×'$‚pêĥ*fTÙHħ˜ìdwĦğ'nżkƒG6ï::Uœpö`––ÈW.Î;& -ıd~1C‚WÎĴĉéKéw3dV˘UÇV† ÏĤ3“aÔë.ġ5›ĉLú/…„{×y’ŭĠ9µ^,h‹ÂŻXTħKO×È´•ż[Q€ÇƒÉŒ˘rZAݘߴhÉĠ6K+Ú|‘U#Ğç4ÓàXnĉ;ì!Ğm6‚^úÉ‘TÇžH\÷úÈu è(&KŬzFñ^ÛÑċTeó ͖›! ÑQ6 gŒÈ–^s3#T‹üġa{yµú^&Ô ™'_×2JLO·ìy$ƒVy7DZ͘wcbN&ÛTÁAGòoĜqEv•EüŜğô<ĠÛMX"w£ÇV ƒ_Ì<ö‘Îr\`Uûä é6O9aċŝ ÛÛ̚“\/eYıÓE60 +´˙ÂÚ"M6œÀ#Ŝ<Ë-ÚͅDM)̨Áç{ L §ż~‹¨ÄċÖ£/Êßb G]Gßs¤EËô}ĦXĊíµA) lì ̛$íŸđґ½i ^^dżŠJ£X U%ŝRáw}i ĴÏg,„([%tžŝ60ŒżVà.¨ıs8Âz·Üf1Š-Än^ÂE}?Zü²YlUM†N“‡0°żŬ^XŜß’jöçÛ¨ç\é ôëB×ITĉĤ3ƒRî×òD2色Hˆ yŠÄ%ÖÙòVëğßnŻ˙T¨¸|xNZ­5³uË\[ÇíÈr3•×ïfy`Ÿ"µó˙'*b¸+÷ò)Ҁı*ÚûZ+N1@½úµÉQù x@_qIEħħw]ħŝĴ„G÷Ó ç&Ú¨EĥŞö•ğ*U—˜p{ÙK’İ,l3áĤÒĤ6Ÿ´ÍFkfĊL£Ú°Ç|ZJä&{Ŭ<Ԅ–ñµáÀĞß×t*bT€Î·(+”J/r÷%%Ha鞂’µ%Á×ö™zûuŒa˘6İ:Eİ.^Œo ïä”ĞÊÔ¤`63y„ž‡„·Aŝíî·´g@;ú}ŠùâÜxpŒŬPż{çoïŬ‹nс+pòRh££³Z'µŝ|ßVŸŠwŭç›ŝ“jâĠßżé?żê?żì?ß­ĥö~ġéïûÏŭçËħ7ş’ĝ›ËġÓà 6À˙Ì1TÉ{âÏÑ.6ó1ñpÚF­Ù8Žä0ù˜0[ş3Û*?Ö^*xKÌı–`[u”ĉQş<(“UË g=ŝ‹,s<=Ѱä;•E‡úb†Ŭ´żœaßZŝÍIƒßö˔FGÊJHày“évύĥÖsZHÚjöSkDâ4`KµG>hÑĦ]B/Žċ ñCîĈP~Ĥ£ÄXµ86Y{}ô˙5#8endstream endobj 329 0 obj << /Filter /FlateDecode /Length 337 >> stream xœ]’MnÂP „÷9EnÇOl7t˘UĠöáĊݲ ‰BXôöEcéƒXšOÏĠñôrúĴŜç1úRvŭÎ~osöòìßŭPĴÖeÛçċAœùÒLEu|mĤݟÉK|àŬßš‹WÛ´OĞûR[żNMöı½8¤d‡³Â‡öß_ëŭ}Ü=>ŬlI (Ĉ¸­I ¸3¸ ÜÜ6Ĉ›@7聝1@4;Ô¨I ¸6¸Üܢ`͒u””•1)aħ'ܕĜì w%vġ…  ˘Ĉ56B# #HÂH`#4’0’l 0ĥĈÛ@¸ }%|B_ _…ĞÒWWÑWÙY£³˘Ż²³Fg…ĞÒWWñ ÊGÁŒG}^ĵo\Êó0Ê|›gžÏ%¤üïâĤqŠ­)~9endstream endobj 330 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3623 >> stream xœ­W T“gšŝc ŝŜÒÉ­ŭ]í8^{ħ£­ġVİ,( U!r ! —ŝ7 B¸ß × jŠ ‚mµL·ĠÓ:3ÛµKíÌèîh·ú?vğ_€nϞíÙéœir’“œóï÷½Ïû<Ïû~<ÊkĊñĉí:¸3üHà–Íž?kÜOñÜ+ĉ¸Ÿĉ‹qäüÉoXȇ…^ĉË\ËĠˆ[Œ’–P|/W[+5M.Iˆ‹Ïô?ù…Í1äk‹˙–mÛ^\ï˙ìĉÍÛü_KIb˘Ċŝ£3E)љäO²HjL‚(S>½$ >33mûĤM2™lctJĈĈTIÜ+ž(ëŭe ™ñŝÁ˘ ‘D*Šġߛ*Îô?"ò˙öĴżŭħ+5%-+S$ñ?˜+’ˆ)ŠzZœšĥG’‘ı/PúFôݘC˘ qñÁ !‰G’SžßJQAÔaêMj BĦŽR?§ÖQaÔ/¨Ô.j7µ‰ÚKmĤĥPû¨@ê9ê êyj?ġu:D İċC˘ĵ¨vêŜÀœŝBŬk™÷Ŝ6Á~ßÜ6ú'ôµyóZĉï˜˙ŝ‚ĝ…Ħ o/êòyÑçÓĊ{–ĴXrii [ï3É:ŬNž›{ÀGW‘KhvŒŭéC Ê:Ë#Ù‰^ 9tÈHâċ˙FO5Ĝó 'ğòtLazÚú` ‹  ĥÁÚZÙÚûΣù0Nß>Ü „½Œl<ȖÇA’'KÎ [ UÍC‹™ħt×~Ò´Í\˜™]\¨S²ğñ]C‘_rs~ƒyÈ8ZÉĝ¸˙0sÄGˆ‡šïŝġ żÚ=àˆµĝ%ĵtġ7tì>ڎ–1x— ߪıÑߊĵZ.ħŽëcŬ#@÷­Ĝ›Ž½$ĦĴĝ@Hb8$.u!v&ŭÜGü/ñrĦ.‡R€ÎQ€8ߪ-gÛĦËä€^pê{àâÂUĉzpÔ( ê\%òĜAôJWŞS×~(àŻdó'тÏzèxRv›ŬYûƒóŝJ)4šÁd° VuŬԓ|4/V² ëŽä¤C<¤6ŞhŸI=¸PŻ Y/ñ&ġ¨Ph,5•A]+upéùL(^|òü"k á#Ô;"¸bW§hô2œ-ÖpEPLËkÁZc†ĉ2f Ifƒ L~ÓQôúì"FG. :ZpYìĈ³FRô™€•Ù ×§³œ8ä“MB´ÌuFĤ E×(!üĤ* ‚ĵìl£À ŬĊe€WN]÷ĠċrœœËç”\>Y…|úĦ*Öí4@)˜kH=Š P#˘kI9 >zŬ–5˙ä#¨€f^yBÊE“}%uÒÎ3=]ç/uîW<É(:cš"ŝA’) 䅖Ŭkvò>G‹ŝ[|÷V÷ ĦHq '›*[Zúê‡Ż„tĵŸ–#gSeĦ [§èԎŞ/İáÍÁzÌĉ‡ĥDĈlĴƒ ô™$‹âtĵ8âÀDܽö÷ g.3£}ġ×Ħ5=§â&Ii¨5ì”úhüúĦĠ Mä0BÂxoz½ž‡Ŭç£+î•ÂÔԀ£VıìnuÈTYÖdn­8şIQ—š'ÒÏgâïíıbۛ‚=¸K§$4úOxÍŭbk<òÍâ8e!ŭL„<è‚|CGÑRRÍú<ŝ ĦWż Ù\ĵÇs')aI•ÁPgĵfġì]İ*Uħ?áj:ĉ„:{vŻFA´r6n?ĥúâÁ;H3³ÖïšÁû/ĈĞĤ>ü>ĤäUU°0jş#pIѳ¸ĵn,Z¸ú|р`n˜‰à÷÷‡ L—û.ž;j6ûzƒÍPc°Ŭ"¨İ‡‰Ğ’²$}„ÂQS˜'Œê[.7 JĦ·¸ÏfӐиlP1]”oùcm)İ€z,ĵûèŞü”Ô#‚şR¨,a,­mş´äÒüdm.+Z#}Âiì}Oq íCÚ=R8›Ñ?ı\ĵ›h=ß}wrŽTi0ĜŒ+A-)ı¨"‡= ‘ú(†ĤOùòYÑ÷ úÁMzĵhJé+ ˆ?Zˆ…ôĉ{íh£;3ÛbâBĊûö~s­ûôöǵßüG|÷˜›&¸“%ÓĵV( óò˜¤îĜRBT°oÇO⟝şġžĞĞ™­‹?Żì´ôTÖ·VŽ‘UzgpœD&Êw$Żħ4Í{uµ°XzdptN2™ öñ˽hqE;ÛsïJU+ñùöĴŠ˜˙İ !ŻğHòˆîL>#4”ˈWĠÉı\/ÖúŞ8€ĜcċĥZ޳1Чž+ˆƒtPûáEŸ‰^ŭ7€|§ğBäiıZÉLù „½§Ĵµú=Öâ4·˜;Í­`´V´v ´œù_Ĉ·úpA6Ì™‘WLjCbáğ(ónˆó5ü™–˜ú`ZÚùŽİn„ŭ^lrwżÓbî/ïa˝BûEk‡£Ğ½ç\5é!ƒMiIĞIs=ÄúLŜU N.àĦçÑÓî}ȗ?ù}Lˆöá%aŸĊ›p+>_AôĞèäDÏ"ŠcĤvMí†AB‹ĵ1_ p³íşüĊģߵ^ùÔ Ùs ‡ĜÄîß°Sü&İŝd;qdËY4ìâMîñ˜ÁtEˆ6 6´”dş-Âs;žcñ7ßŭ£¸)MÒş1í€m@_|z vʕĞŜbĠÊ8Ñ˘Ċı;Žt˘íN÷5)x½…%ĠPĈiñĤİTŒ¸-ÉGĵ²o•7èê´Ôġ°ŠŬƒĊGÁ/ 2MùĤ†"„Jş%ğ!9>Ny·…£EwG~ßÈDÂ‚ĝ'Ŝ:´h¸ñJ/ZdïeğoĊv@—ÒEk!Ċşƒü@ıâĠSżž$uò6ۙҷmÌ5d4·ŭùĝŭ#pxŒ2ŝ$3ùW…3ۅ:¨ÓµÌŬ‡V›³ü‰œI>úRˆĉ9>żwh4/ïùƒo˙u|FLpFġß[Ç‘÷‰á‡‚Şáeea‚FÂĉ…€’Ĉ<´Jß}żûĞJòĵ*[2-£ŒH‹Ž+îh­Kċż²ĉ(!ċ90  jñSÂg¨ŠX´ĵà7ŸÁËҜ5§âĜ˜Ä°ÏXL)–˘y<ä{·-äğéÉ'…­Ù)§âÓꎞž^+§š„Zo"[in1Ù/PAYµÉU~˙ƒËÓH¸b˘PF᚜?ÄC˘G(ô!2hòYO73‚‰Ê­¸B5Ċt&żĝî¨ê ÂÒ=ۆ qÖ¤1Û= ÎïĦĞ żÀ•{éhLaï}żhŝşÚH0`ÈĜ\BÈN›Y dp>†sEžÛ/×%VƒÁRÎtĥÄ&_íJşšù["Ğ= f0§Ο>Ï&÷%›÷Wż^Ğ( Ğ„ëô…³AĵOĈb×Ju grlPŬd„úR†€J¤fúÚ-žÁUìPïóŬ[m²ħ×ôşĴŽ\µ˙(Ì Š:|h È ÊJÙêJk3™ <ú:t*Ĉ™<ŝÇWżlbŝìö!š5C™ßġàž LbVáÁµÑ`¨ĥ0.4çŠıèr—23>ûLö‘ñ›Ğ<÷7n·Ç! Ê@÷ î5É$kc‹ĠlħôÀÑÙ5PQkÖĤ+HK7úĠ)AÉL]d1ÜìcxµŻF–ŸÚéëH½ÉPo&hïCBh& Ş=ÜżéĞÄş #g¤Q%ìû0a"ĝ@?áa½½fvˆŠħÈ 3˘1Ŝû?Ô „SĠ³³òŝwÇ\-=ġ•Ìߞ)|ïž^&ûŝïZ˘S¨N²Ñ8@›ĦŽÍô}Ö_:RÉĵ‡8³cüO_ü.ó҉è„&ëÖf’w îŭQ.Ŭ8´­s•¸Ü×ëyîLôêÌXVF·KíŞ“b £:Ċéċ;×§X ÓdtŜFgÁL÷ǗSEɋ^†½Â_~ŻĜt¨P§Ñ'炜ÖÚ¤ĥR“Ñjgìċĉ&öUSt#CÓW›ž :ĞZĉĥĞ&²î²_.mĦ{?­h,U5ĉé82?°İé\Ŝô^1„ŝË9†ĉĥġĞù5 Ċ|tM H2èpô\…hÔZe1…ÒDRL{Ĥ³÷LÛ5§ll1ĤžgÖàe ĵŸ\ß0xš‡öŭ;Qèò‹İŠìc°?œħàß óεġö rä{F’‹WİÄlNlJÄëä Ì|/yêÂyġßP6>rendstream endobj 331 0 obj << /Filter /FlateDecode /Length 6971 >> stream xœí]ëo\7v˙ĉ:SDË7i’Ôm²Ho˘ĊȋюK#[rċŻïy^rHIĥƒöKħ½ĉqxżó ġf5mĠjÂ˙ċ˙ž]MĞ—GoŽ}]ċ˙œ]>?9zò]°e›Ĥ¤V'/Žĝ'j˘Ŭ›VÁ…m2nuryôúß7ÓvJ“7A­_A[ĞÉĝ¸~ğ9žĥašl\˙ĵ96FoCJëgÁ*;iµ>Ç.4´§­I&Ĉġ~5)çׯq´ÉĊ¤×§ô;Ż]Zżżğ€Ï^#ßBSMS˜˘l†ût^QXSÖù,î-.hò^nc·Ñ~›"üĉŽ'ğŝ,LLğ˙y£VĊ˜F+¸ÛDm›x-f×"Bzmx_y‹bûÍ1Œ 3xÙኒZ‹}¤`âġŝşĵO뛲†˙>ùŻòx [ïOΏÖ*lN~::ĥV­ŽÛFïñóë/÷š]ûġŻH ˜'äuDïÌúü'Q}\èğ´F›,ILXŽ'Ùà€|8<0~ż×ÉjĜp‘Ġpf°·ë2‚$Ï-PçĠL+Öge5{<•|²HĞÍÖNaŭ’Ö½ħ‰Ùc.É|ˆ Ï“ÙŭĴîĵ°Äžg™–]ó×[I>yùn#x§ĥsëoé°?Ža€2‚ñ~,³\´‡îŒd'ÜÖú8ËĊrLżĴmO`@·–ÙäڙAÔäÄżo7ÇqŠ ‘ÌúŻÄâÚz;’Á§ÌäyYÌä1òêÎÍ G5™ċ¨H‹3ËEĝÍú%İĵÉMe¤DĵӅê”À8ú;ÇÙrċÏ|ÈpĈÖH#ċà†´“ŸĊvÒݧĵs•mżÈ?>ŭe{GİXïĜú*ÚN˜’³Ë„p ġyħñ5i B²öLɏN/ó4l· ñf³(w…³ûkÙ[~“b‚ ĤݵĠ ĥÓh"—}˘fÂĥW•Œâ6=ê4S-ôŒıŠ5iĉòWĊ„ ı<ËsÀ:¤œì K︜uĞĝßiÓ>E j›”Tŭ\ŸŒ4Ħ‚rLä́NJ•ĦTj•‘=ž7Z‡ñdı‘mĜħIĥd*žßjybzŜèŬT™PĝbN³ä …ìݏájb½|Ӆ…x²˘hSò.d`AĜĝ‚;C/ j.*"“…ħéʑ0ŭÌs˜úZĴžzD°ËÊe…>C9­j{Í£Ä˙TŒÀ„^Ë£’VĜjĞ“>#<¨3љ… ìEû…ĵ( ċ$Œ+p#‰èIàż= Pn²uP[·€Ĥ‹2ŝ˙ûÏf]èluŝeîŭ&Û Z0ħżUÏÄ ŒYm"Ì*@’tĝœtšôá9ĝ^ ÇE9§+$2ĴÓIĥòrÎ3jll‘µúMI‚s€[ĤŞİ„şdÀ›#äƒ[€ó[^ĝĴ˙@ĤÁ+ë*Z3A´Ò5ôùۆ׈Â>Żâˆç/¸œÒÀ“ɢY!³}ċĞ£aħDH Q×ó"üù[zv¸hb”Q\àìρ™óÀxY FC÷…Ä˙[ğ8)‚B„W—}àfB˜8r^w“‰6ݎ:òNxZ,·ô„'"KB^z NÙÔÁÉ+ Œı³ìÀ˙R`ş`^ĈĈÊ:ÀJEàLH›àı½qD\˜YŻĊñ\“JÖ;/Jİï/yz}àµ4Š ĈCZ)υ­Îyôëi˜Ž“–<1,A¨ĴİÙ9Yl|v0&/êüÓ9 ża1˘‚<Ùçe}ÂĦ·JŞv9"ç§0Âiµç…á?0% ĴÀŻVĠ}ÑÒï.ô‡ZÏA­èĝx +ıFrñ+;ˆÒ½ä}vĦšü˜d³Şgf•½]TIŽٕRÛäœĤ$ÈÀÄĠÉ×G'˙ò:n‰>€İ-Şmƒœ¸ŝ*"„™{dùUʜŠËc§’›€½w²>ñ–WaÜk`48“L™UfT#,”żŠİ3üN3vÎcü˜£=&ÎáW/÷¨€Ġâ}Çôl{Qzk‚™;׳qjĊ[DfQĜż+“Ż_ŝ8sĤ])~zB'cµ‡ …È˙\ôĝ~ĉôšhWeÎÌd84…™Ö¤c'ˆ-@ zµ¨ġ)#ú@‡Ħ³:´ö ÖWŞ éïżäÍFƒ>Ìr„¸¨g'G>âÜĦ[½ç ëÏ9Cc nş|ÓÄ9oġż—‘Ò&Ou ŭĥĈ¸ĝÓĴĠ@ÂÄßwmjŠÛèÊ·U9 ×"IhaˆS“XñÏ3•ƒ)µĈ¨èà':4› !”môž…·¨CĴ,ˆ€­ j›Z2 [î ³L”Ÿáñf|›żĞZ.QP<şŜ§½dÀùÚsŬÓ”m"ġ’ Ŭŝì*Zí5S ‘šER‡ĵï*V8˜t0?†wkĦÙ4ħħğŞvMß½r£€ÉuŽÚ A÷³ÔʰŒHáŠ4áË ŻD:"÷pÁ+‡œEĵ„Ç8:ƒy×àh ˜ETe'ÒŻêĠ!ë-—µù-i¤Îçî”Ĉ¸W9†°5Ŝ7şmaO7BS{[2'%Û@3’[½áŸ*=­@ɉsŸ¨VŒ^Ĵ Zà³xuƒŬ˘ó!@Xİ$<ŭvr!*[c]îóĴŜ0ö10žìò_¤eÀƒĤŭ*£b şĊ×ŭ°ŭuqöa1ÀM‘|MĦ:Ĉ0hġġ—bċ„ŭacL]*+dôÀwQ€á(ZLú™ì˙τYÌĈ"çIwgÎH&g|5…|²|Y˜IW)ĥŬĠFH4‡èÀ%  “ž›SoRĉ{j‡?ÒvhŸ3Ŝ +”Ï jŭS vÈ"—u`'!j³˜É^:'I¨”Äß6"ƒ_>³J‡‘ĤĵàñL5EĠ£œŽuä^ôéÑ3·éħò0`Ìä(‘wùœÙN›D_m9z°UOÜİhè¸dŸ(zÑürJNLAüÊ`ȏ…° =is aq`—+ĥş)ëžâ• ³êi”x  U İ£Û8ܚ'JKĊ_ÉŜŽğ€—9Ñ/A^¨„Ş;@òÒŭĠ°@J÷dpÏjÇÈÀ›pPeÒŬÎÙkd€Pe,zecL~CecÄ' D³#³pÒÜW@$ġëÏ7"^ĥŜF—ÓĥˆNcéı8ž7Uƒ/?ü˜ĝ€–’tBì ïîl•ĞC=ƒÄf.ԑ%ĴUMŞĝ¨42óEiŝVš×ımż:Ĵs~[šûÒĵ•_{ĉÖŬ HBpP†“iÀĊġèÉğHRJ3òɅ}ĥʒœógŻ*8Ö$Ôçİ{dŒñYÉO/ğ½èRĉUiîJóu·ïŬÁŝ^š‚ĝ§]ÚEaċĈCžíVíˆ×ÛҏnŠRrA^”ĉ²˘Üĵ)͋Ò|[šŻJsWšŻğ~ïö÷Òĵ.Íŝn#ĈÚ?ȞßChĦµ… B gÚêGQâˑ™„_Ĉ4È.}PÂ6@m3 Ş1‹9Û4'żïRáèìKÀîa3!`k3ùĠ`R‚u+›Ì6: Ż=Ŝ-ĝÀh­V Ö–ŭú49]ÙŻíaoóSè‡@{Ċ3r(Ëx ҅[HĥMú•$hIèêû# TH>€Â7Ì"Èŝ2˜oH{ĖWĝġx˜jeúŜy\V…Ì.ƒ Mık* ĉċĊÁ? CÚĜì6‡zĴ ĦùĠ1—A]erY‹är)eq 'ì 9oÏy€O×˙™Cx˜¸|Ĉ4Ĉş™X}šos}Ç ƒËďç´)gJ­3s*ƒ09EıÔ ĉY ~aD?Y›Óπ<ò=–9ëˋ#ü/'şt³ÒÖ`ÚĜ LŝpV:3¨G]ŭ“X'lħšJûŠ$v?c šT\“ħ•δ¨Ó^J×°iŒ¨/r÷e2'Ŭ&Ĵ£ <vùúLöí‹ÓñBA™Ê g;gM=W+Kĝ¤I)K)£A=‡Ĵ`œÇhUB¨ċ°ğü+ŞuÄĤŝ闢ß+6è/Ái‘˘ıàħ0 -<’=Ì˙ŠµÎ¸uÊmÛ¤f—Ȥĉ–wİĉ˙à wšËñk˜Şˆoâ„;[.nËàĉ9>J¸Ş‚İLµÔ’Âĉˆ8Wŝñ§%Ö,kG7ĵ(èƒ_Ú8p,³ıĴ} é\/(Ħ'LV=.ÂôY‘ŠĞÒ|Uš—ı+Í×yÓ&èĥh—ŠoŜ%΁íèhGru‘ÁYŞ+5vċúÏ :2ouİ‹ûŬVa"(Żé›Ċ?+Íïe³·3ĵ­&RâVêeD‘Ŭ#âË ˜é^îZ„É /áĤöb ю6·¸"C†dˆ°„ádEüRŒ pofAëZëKÎU!f=?|^ÊÛiÙ7Ë*ŜuGŠ_‘´§-Š­]Ò[°k„"4䈛 omc&;òcùzÛm^KXšOKóI·y^šÂ…2·/Ím÷ëYğbŬwı-Mᨠw˙Ii>B$z?;/Má!ßvż>éNqĠ]äewáyßtÇ}Ç>dA42¸ĝ:ÑŜQĠŽíıF•Êȅî’E²˘äĴNj<­İÜŻzÒ$5ûW°c}5kq(qħ.ŬbÒŜS)Ĝ_È˘ğíÍúkŝ]JzœÙÖ Aû ˙̤:#ċ•i§‡PGÄ GŒaé^çAšĊğŭÍâ~I9‹sî핍êğyW„ŠuTĵ¨HA—Úkc"*ß=˙0‘:j=’^‘âĞ|ĜöT@ï|ċP/i³”nPŸÇtIx˙‹ÇsÔ6'ğ‘Tġ•˘)ûFÇË@ ¨Ú"³5RBcĉbˑ´tŸÜ#2vŬĝ [şzz˃j‹ú(İ9,ÖlĦdŽ6 ĦdùŒV™Ëc÷˜}hèBʽq+Ħï1ˆˆÄAêÊWĦ“…"Qßı@tùö„N¸}SĞ9"'&Žâ÷~X眧£œöûtƒ!ËPO Ĵ2;Ú%…LŬsċ.öyî˘jfa1ĊZU[çÎëìVí9ÌÔİ“ÊzXÜâU@0vĝ4ߋ݊ħĞW÷ĉÂħKïnĉÁż\àŠġĝ{Èç ŬvXÖd:·ƒŞƒyöžUœú%üE˙ì! ËĊCŽKó¤4ïş0D UM6Ùí+šŭÙChĞóÄ.j´‘˙ëî×}iŜvżž–ĤH9ĵàĵ@ĵœÑLĞ sħvëŝ—!ö€É×ê\ްH€ċĥéàm‘ ĝŒ˘ ‘3¨fJñZLŸÏ‘ê4xL§{ɵ.o˜Ž2˘Œ…~ëOĈE™ ʨüüŒ{{%B܃ÇAòÊG„.]+Òcr,³ö@Ğ6ÏéòuópN·(ċ §Ş¨1‚9 ĦñÀƒ2YáéĞOĞ—Jò7Ğü!…~T“_î 0\ŠĝÂEŻD”>µ×ĞĞ{—ùÇOŜd<ê‰yŭCä¸=Ót7óıBü˜“ĵŻZ4ÚëÀtI?îı&~ ,çò‰Y/SÀšÒ9ú~&öÀYË×É$4F^Ú½\+Už¤)a2,Dµ\½µ´6/?(û@ñĥ€™+Ĵ?2!ƒċëA%Ä#˘X`^UŬäĜäÔ¨+@Z!ÈBJO‹”Ê›°½'VÚf^Án‰ŭ²ê^m:Ĥ]{]{•ÏŒœ#YĉÂÔNmIqNŜċ’g…ıkĉÂÄşÌĞ‹p•¨ŭTEĊdš|îuŞĊr!ŻnŒċpÁ:&BħuŠżÚú~J{§ó‹ŜĠd]JĴŽÙàu†"Żç<µK­³‹a,á/Š´nısâÀ661ß%-Hŝş!ÄĞkFíVyĠİ{˘Ŝ²y1/ĜÔ"—%ÑûQ) âòċ7ĦÒğ\PJq>ĵÊ*ÄdY‘´Nâ†@œ¨]¨ŻùĠ7Hĝۍ£+`µ$žë-Í?kŻiĵèÈ WĦƒîÇa„d*²ġp½iôĥ2“¸§ŽhÜIĞ“SiK íaĴ¤MŞôq‹ËÄĠŠ­ĴS߃êÁùÖ:΀:l÷@AŻ ùñ×iBıMS'ŠM£ĵˆYœ_[ [еsO=b²ĉZ"ï'0çĵa²7<6] ÁÏüÁàê `èĝŜĉ‘VácfÑ3;žTii‰GïÍc%Ĝ…ûƒ.vnç]ĉp×ò°#KDżb@qy”î!DHŠ–ĝ43]›½“ea†ˆ/ŒŽŞëi°CÈbˆĈHĠ{ƒ ³DIBÌ>RMš.zÓ/DŬst¸NeĈŝ†¤ÂA„|yµÜSĝħ됋ĉÛ_ŒÖ\-.ù"UŬR,ïçòĈŬ˙şI˙Á7A.@HüJ;|iÔp½Ö_‹ğWŬ* e§éŭĦìuV€sĤ-ĜMD››¸ġkB°ġşèÚo>1´ÑÁ–qŝ|ĊKyM†ċËÙS`À<­j1š?V…zùT‰bÄŭ†ŭîĵ~2“&Ô^vü„ ĉwŸš€…BéÒ3sù>ׄ<|Ueˉ˘úT IñНĉ'CÙ6 ñ[fĵ=÷5NÑ\äñ”“ïtí:•£Û€X–äƒZ=„Om“ġ=$UÁ9ştŒOŠUŻ-[ĴJCĊíácƒ—K{‡!ÂEĝ–jHtÛTĦU=ïĥù‘M˘‘i@îîŠİ‹OÓĥqŞş²@^Ċ|Q¸üކQ‹Ŭr–j× —À”îäĠ¨êW žÈ”Üòž"×pĉîZJħO>}ġĈï|œSüžwċ Íċ½Rlĝ7gu›ésµz!é}–İ:<Àö˘Ż¨§L'dHH– ŭ*ËcTôĠş´ßv‡xSš˙ÔeáOš éîW™‚"ŭ"ı+y*=Bž=DSİH?˜–ĉ§… ŜGPŸv›¨e˘ü‘Ún‹ûGó­…ÉóDa2:™-•o‰2ĴRx²JÊż•½h$0ĉÛż]Ġ/ }ûhzgL`X.³‡‚kßcnŜh˘1 ĠáWIÒ*¤ÖܤĠ+·<@j_è¤Żü_÷İ,=‹U{)9îğşŜ-î `Ĥ·ó•6QÑĥß-ŝpȇ'0òÔtŞ–žŻ]]˘~UYžŻk^ˆb> stream xœĊ\ëoGr˙Î îo Œ™½hGŭ~q€XPâ.1OGÈĈФ(ùHćlĉŻOUWÏtuoÏ.eË ôA…aO?ŞëùĞšŭp,Fy,_ŝ˙ìúH_}8’ééqŝïìúĝëÓ£çŻL€'cQŸ9˘WäqÇŜú1j{|z}4Ȱ:ŭ{U 6n ÖÀ §çG˙5ĵZ‰ÑJe˘NVk1ŠŒn‘´1z݆íJŽBD­†{|*c”>Sİ}†˘Ô"Ĝᄝġ¤u Úş˙>ŭ=nm81*;mâËĠÚ=ÚB^÷ĉUAĈ[¸ZŻ‚ÀŭĴ•‡µ•ÎÊöjµÖZAÚ´%/E[Ê3ŝicn¸À!RiÒBZ87Üá zÔ! ïpq)´ M™!ÄUür„• ?a´!Ú<¸şİµŠ~4ÑݵƒsôÎ{ä`tĈ^`)à7œs&ïğOáôVi¸Ç_ğ(äO…|_Èħûô ÏĞ­ËS"mÓd‰|,ä}!ßr[țB~ߝìĞBŽ+bu­k)Gq <‰Ó§I„€kHÛÑÁD•o$_”Rd¤./Hĵ˘ñ6mÓa£ĝc’ 4l¸ò1wHÓğ´Q+ùF=˘r œ%âĞĝˆ '„‡Ŭ“v‘‰“ ´L£’xÂ]˜ˆ™ôržüšiê‘#hĜpއ“NYâv&ŻfQĈ(-]ħÒıÍĠ ‚2Î WEc.Ĝs¤PBöôÁùQJ§íŬ–K½(äO]ûûôu!—”ö8ĉÀ„ĝ0oéœÜ‚†‹ĈÚÜĴÀi£{fó6ï?Œ ¸)Œì“á’˜ ğm]8ÙÚş·$Nú$ûYŜ–İ/hìŠ_"ż€ğdèĵAä Á5Ú)½÷l{iA)L½½­ú£ĵIÚĦ8‰m²Ûтĝ&iˋlh:§½á“lë ËĜуa\K=ZPNş… šf@í#r>ÀĴ•’%ñ  ċVƒ``ï:9šR½˜Ĝ­_ëuòoäe$Ip>çM­Á[Ò{I·´Î|;k#yPlPÒÍ9ÀÁ››ÂĞsšÎIYif˘#¤ÑQ­’ ċ-Œo.Ù!@ÍaÑï†?Ż‚MԞĝg\óeN™ìï(j•H3|“=ˆ„yțÈè`êğ­Ĉ¤’ =WÏdG€!–Ò gLքˆ³oHĵr$k.F˜| lÓÁZ.˜Lž™È÷ ħħ¨³Ġ{èW]ò]!_RuĞ1#ˆĠÓÜQÚöC!kw”NÛ@ Ÿ&|(JvK!Ĵ˙ÓjŽe7É4e½Ğ,`òn– ӊFXM¨ĝ­D(A$ mĥ Ċ5ôí-ßG”}\XĴĥúӀZ–pœÈÔ*›2ç–|ÄyĉHïI™#ËW £³W;šĵä W4 FQ_³‹}(3ĥĝéçrYĵ£Íò“|#SQ°´@ žém÷\IŒFêĈĦux9½DhS $s€”[ ‰`Ñ\N"’oe†?]¤RştH˜Â {XC“(`›Ĵ~È m;š}¤á:y—)ŜJ·Š“ä¨'ó‡m”Ñc&3db²ĊV•³ż§Ôôx²@(N³oşD¸ÏĊ—lî= w)Äġ΄ƒ!.ÄGpßÓ܁L‡ÑWeïJŝu]H–•ħŒˆ™û’}.{‰2 ›úÑéïÈÔWi!ÛKŜìÏJżï>­ö2ÏË6{Ŭ}í k^•€ûe!˙RȓùäÉÉÑÙف/ ùašÖCŝ÷Y™ßˎ_uyúĦŬwœ 3ù×!;D0(Uà¤0Ŝ%áŝ!6µ|ƒ5˘2uğé0#Y†sWÈ/ ùĵKž’ċ^ׅd)ùĜ}zÖŬC÷µwŬĜvŝ£˙RÈ?uÉŝ)6]îlşŻħ%nş›$>İ|ž!‘W…ĵ+äóB/äëŝŭ+mFíŜÈÓ×ށ` ލŻĥĞ5w˙§Zsp^f1˜a tSiÍ|}pàC!5Èb4×üô3yÙeSó—…üK!OvöCôáċfrìÎĥé²ê˔íŽeĵdĉùO] Ä^{×eöe˙œ;5-L­ûwÄtŽé'ż[àe{•+ÜAHÉüöM÷Èü×]ó3Żş)KŽh ĝ! !{A‡R£„<ĵd=ŭtWGtŜȝĵŽüEz”ËN^ħ5ı#ċĠ ĵ‚p?…\4RŸŒ^Ùq=).EÌC`=}˜^ÑÓ Ş¤˘Â@74ÖĴcĈ9ŝLQ=ŒP0b1Ñiеó´atJOÜy˘oeòŠKu7kĠ`˘£Ÿ–yÂyïÒ}8mL•gQà;VĤĴH Ş4•òKĵé3„§”ùŽ‚Dx s0éù ´½!İpÒUÓm8&ÂBì>ĉK—–§oefD¤à'<{ÛP–(‚ê€ftÖ5 Gp{M‚„9ˆI˜\7mâ9Qf áyn^Ĉž—ëïú³1ĤĊS.¨Ĉ•Up›<w^˘Š–Ġ:îĤ€ÛóĊ‡jġ –JüĜ[­Ş1‰(¤·żZ"f„ZJČ9–lİU”ˆ {ĈJŒš#˜0&Ĥ;ĴÓc. B.û AÉB‚Í:Íw¤4BpxÎJ• 8`‡"4.e£¸ô-zC¸,£2`òĦĴǚcâo°‹lĠTğBùÔFKœH“´ ‚C,´§~xŒ-RÚ Ğo2÷„3CNDžžòbH‚€y+Œ•VìñLBŠïgk—0wH$É-2Ġİ„gì´(o.ŭŒ(Äl&¸À¨î•—XĦt˽1î-£Ħ@ÂvuĴ@ &ġ\ğ>fü×¸³Â'=ž¨ŝ·+pMBÇê:lÙb Ä çœVt ġzŽÈm9Ûhğ´Ñ׀”{}—7 -³g˙Ĥ8ĦÓ.y2EĴaĝ·òô%Ûġ]q”*tWŻ/T2&ƒçĵiP0Ç;Uγq}‰ùèµàZŭ,DĦ³şĥL Ĝ+ċüŞ+Ê@mžV H—Ŭ(`Sx­B9£qÉ]ĥkÙa#¸mç…ħfĴ°Km@ût[˜¤Ë œ!͏َ7á>ƒµÁÙ¤QÚĈäÄ HžcÀbu˜ „zgġí{ŞUŠI/đ.GŒIq_0ëpÂäíğĥħ#İ:ĜÙ}@8[„pŞİ×QdŞ"p·Ši3&mí>ĉ³àŸSYŽġÛ =†`wŸX ä§ƒß“j`ŭ ìĴ‡pŭߙĦİ0ĵİĤ(ŜP\†‹×qĞ“Ġa:{NâL[–Î÷e˙WEżÙ6ċÀRhWÛĥ„‚œvÉÙĥÙlÛÒӗ|ì‚Ä8SŠV|ßÄ`Ğ"IM[Ż,HĊnSĥĠh*q•2Ż5l$ħ6Î"6Èŭ–]ċE1&¸Nq(K}Âçç;EŽÏ€mâ#ݳİÌSŸž°ÚœbÜœˆ×ż·•ÁĤH[sv]k*GWŝ-oşŞRÍüpd‰ó'*ñ‚€ àâ÷˜Â>íĴİJ³¤yŠWû'Š“hYŒ7Ф›0ĝ‘XPßëùj Nfë,tKO1‘Z蛨’'ÚݰÎ΃šİr~?ĜY7XĜ²iz=u‘%û7S[O@]ÎĞ`‚ġl8îè5mÓĝCO}Ğ蒠;*[Œ> û|ÂëƒÚ4µ ;ġc› 4éL€N=ıßʉRô^œŸÀ~ĉÚµÌ(dĞġpX„™×Ú°!bŒËQö#ÉR‚Yŝ׏ÌG§- £]~òíIBŬ×P–^—HPFĈÎÇĈë]2ÛäàQb ʍ6íĈ8]aâˆö™’q&‡›˘=—üR—šIUAxR$ç$ĦİxÇjĜŸàìéâÙÓZ!ì‹zOóíHW˘}ùP"5 ‚ğÔħ6O}G ÁĥéĤ# #hıŻ‘I¤àrÁ~(qáCµû9’ĞĊ4]”şĥċS—ÊS9Ż—?#Hîr(_Îï ’$&”Ì8ĈÁ3Ëx-ށÍeK·ĞR•‹%G—÷Y§0ĵé)#j Ĝ:á˜ÓHX[1cPZP‘ˆKÜ4˜çó{;'wR˘µ‰ÛîGĤÒD™Áì™b~òÉĠ¤çRkY·‰ŬÑâf_›-ˆŬ£mĴ›s”2iU¨tŜéb=á“Í;Lgs£F1ïĴ˘·§qJİÈ?bċß~s{ÚïBa$•tS˘SÈm!Ùֈ‘Ğğù½AĝސĤ P…|V°Ù. ıY˜—| v*Ú֗ÈĠ\Š]rİşĴFÈĉxóš1äIù¤ŜħÛ QqUUŸXż+sSu-¸ôı7rĦ•J™Ç5. ż€ß -]×­P¤^„+ĉöWú‘ŠĦó‚O`ïÓlÁ=Ùê˘ìĜÖ*§ŝšêŻİŻ ŽJÁĈĉ<ĤîÏo>ŭŞ/"€RKcĊċ~ïÍS$ Áž0qsħı›.ÛĠeŬşÒQzPĝĦÊôžš;Úû~è@ÔŬÖe†a²Á“Ü@ qİú"nNşĞ%˜o“Ġ”àŠÚ“™j0ĵ-+,çĜNaWğ·YòB›ƒŞ+C„$a!Ĥ”À½FR¤„nZ|Q…9jR½k|êELy6è¸Ÿà˘‡ƒ½ĵˆb€ì‚›ÜhĥIñÍ ûŞë ™_ë[çOâÒ§U2߄›pCb1î*Ò4ŻŞíǐ‹QfNÛxëô˘Àı?ÊüéH† ÒÀÏċ¸1ŻçcĴĦÌ9v{‘ELVΑv M5lĤ1vOžNΌ éċD?úì[ıĠà이ÀQŒH_s앀<êdîâo¤İJónŒŞ™ĦrUu¤Ĝ|ûĴ•JamWkœ;+$kœĞšwx‘`o(• î§ĊRİĠ˘ĉ­öW+ÁDê°ĝ™p½g[5ûjóYnUˆígIsÊÁ•ñlĊQîÜ!ÒtnċÙ~AĉW:÷`ÚĵöÒw“³5ˍg¸ı¸ŝœ&ClìÇqµ£éĵQގ%Ş\4OħɽÁ.Hùn ‚€ŭħEpd­ÜkéíèƒŻ.xU‚À. ¨ğkoğâΞ>’÷9~QÈ·…ĵŬ×X&ëÈ˙˙;k=éNqKùŻ Éړߴе]Äŭ#÷ÁIïJoñ?•§ëò´Ï´Ċïfš5ı~UHSH֑ŭĴ,÷„Àt&Ùgġ²˘KäkïfLcŜï gcÏħ²ß,Ŭouî{ 6àşŒ:ĝĦ9odf\e½—…dɳÒÑóŸċéw…üC—<Èöŝ·@ħ’éÖ·…d½ä§elŝšêÑŝGˆd Á…Zü`~ŸµßнbĊ.ŝËB>ï’g|3û?1ÁÔû_ı0`BÂTèS>ƒaóöĊċywìÁ%ĜkìÄĴúuwáô>vçŭ™s ´•ÁğòĦÙŭxĉgÂBKŸßÌä…|–1ÒĵÓaÍ3T,d}ìÊöç0€Ì˘wĵ2Ûc˙-F²ïŝ˜Ĥ]Z·oWï*c0?fÚü˘{6Ĥ(L@úšÄ°ß™a=‘L2ûjùE1ħ_’yûMwFöĠçĴ;}wl˙·nžwWğívß}ÊT˜iŝ~ĝžÏ‰‘ 0~Ĝ“°{c&½oĞ\ ËbšÏċËӉ?ƒ/?ĝÁÙßw˘ߟ"ì½/ FX?ïZ*ö—Ù–?œJ€Ü/j[£vñ×o>µÒÁòŸö‘?‡öÒ÷ċ‚üMFá§k OYĤN?ÊŝˆâŻŬĝıZÔËŞU8!6E,—ĞhDè$Ái>Ħġ‚İœ˜~“bêùÁ™ħ°˙”?ÖzzG|m~Ëf[ĉÛépnİÀË:Cë•IK´?S˙RHUĵ ŭZLÂÏ˙1)L;–ĥ öÒ2‚Ô éî´9Q'Ü. Ŝƒ79*óe Uĵ<=ú#üû_<%óendstream endobj 333 0 obj << /Filter /FlateDecode /Length 7183 >> stream xœ½=Ûr$·uïk}@YyIOĴ5wW*U’"GVdI–¨ĜUŜ”k–ä’+r9+rıíŸÏı 4š¤.ċÒ[½hàààÜ/˜ïĈ:ñżô÷äġ³ñèüÙ÷Ͻ=JN^}tüìƒŻ½7ğ8Futüò˘ŽT0;m⑷~µ=:~ŭìŻmĈŬG§½^Áó¤FíÂp³ÙŽ;?Ž& —›­ÖÓÎÇ8|Œ2¤†S`cô~‚çq§£a8·:mŬp…³6ÄixAßıÉĈáN|wŻÒ f~ jŭäÊtïÏùáÎğÜ 4:'·ħßLn|sϟ‡Ñ ßÀIJ‡ËÍäw*„¸Áŭ&hx6‘aÑğ0|Fˆt“ĉ}- ›-Ì +89àšħQ _âĜ0*Xx8ĵ†!^)çâp[`ĝżÏàxMÇеß9‹‡||úlPqsüŒQĤ˘­1êhĞí.8‡ŝ:| Äè ìá?7[;imxIoàċÇ}yĵ)çċñvžÁ ˙QŜnËÛğîĵ·ċñĴğÄĞ. Wí‹Gġ÷òxV˙VߔÇċñùPžĊl×ŬïîÊÛòĝş<Ŝ–ÇsħĈfƒ'§ôΚ8ŝìĝß×NàŬʖAiy{(ğòxò*ĊcÂI{FoğSĵíîŝwŬǛ.‚ŬĞïÏû ‰@ÛöŬÎğX?żğîĉß<6àu}珝á/b‡–€vx×EĠ• ‘@Ĝ rq)œ vfôG[v°7–7q·!¤w¤Û7(Ñàzbħ­ƒÓ _ë ĉVšPèG ,½EÉü¨'BĈ¤ ù{­äbW,n3ˆ]"ƒñ%ŠùèMÄí<žĈI³”78jƒ[µs ċߒH‡­Ĉá‚…מ” IŜ”·û$£ñ>¤!Ŭİü…~pV/–ħ{2Žĥz&Ŝ£bAtEC¸pȸF5f@I3€XċPŞR~JkU‚ö¤à(zƒâá3c$~ÒÁƒ˘Á/éµ'i \#š@ħ"…£‚†ħ>íĈ[ÂXÒĥ‡7¤â`“fEîɽN*Kd”ÚÊĜ ĵç!È&R'˙HÇà÷d3Ż}!ç¸Ĥ ŽĈNùYÙw5†L °™$F%AzADĈ1Ĵf˙ZqB{µSt¨·ñŭh´›ĉ9 s²>ˆwka 8ŭ+ŜÁ _ ĠÏ8R°%Óà(/ĝ~Ž mgĜĥYdUï ;N9 ž§á˘qœ€–ùĵŸlM÷[£J3’$Ā[žÍŒĦ2íëÑ„òğïn8Ęĝ~rdcáˆê—I0„¨˜‚Ĵžhw .€4ċ2$‚™Ĥ =(GòŽıÈL¸ÈI3Š7`:£ ùÊ)ËœK²ż(̚wî‘Èn8V$`F/`ÎNÉKfĜ_Š£ĤUF;ú5%Ìgŭ× V7ğ †c4Jèâ‡ĵe‹œ%W–@Dë€25ı™Öç-%ġĞC4 ŠHLÑ5H˘oä RIz‚˜7Ĥ:ÀD–*²Ô~riĝ˜IT°d­ëô†˙Ŭ0á'@™C`x÷ŒWcé4´ħ3 ŭ›"•ż$ùFI †=oÎL‘EÌaF'ex%ïùK_+ ;¤€ğ²bnIİzBPĤŝ)èİl =á?[ç4é,"Dä„R„ĦPRpˆħ—,Ŝ˘$H1òž×âì3ë!e˙ûWÓşm RÁ˘.È{¸+ÄvU€Ùß$pqÇRS³h8gˆFeWÙ7É;šIKY³¨ĞÄĜ‰òŠ ߂¸žÉ^-P5,@Ż}²ù\ÔpĈJ&Ž3a n…fÉĞ&2£6­›·eXj‘ž˘bwÒ¨i‡–ÀIĦʃD$S—5Ú³”ˆH>§‡ ùĦzŞ$T!fR‚`#EIîB‰£LĠ#ıߕ™(¤ĉuğ Û%ÌĉJÁUċĝç(ż&XÁ’_ Í*ĜŭK~ĥÉèÍ@dJ“‡ËÔ<İÉÔĜ—ĴȳLntr–óĞĴ£ïyE¤+çNžşŽ#ڃۊŻTRov“'‘JcU¤ô}Ù°š‚‹oyPr#=OşŜÁA­^&ŞÖ0ıšézŝ^M †ĈI'ì-¸÷M½‰é_QĞ(³áFuIé _-ĊiĜÑH&¨C3Ê ›ŭPNĉ]ÁXM,# N“y+-%t1ö…˜ĝĜ9‚ê%7òÒNUV˘;N˘žCi‚ÄÙ_s÷äG"b\,ô%?·qĞ+èoé{]!ġŭVˆĦÓb#0ïè]Ǖ.+×t×+XqD+ĥc}DšÖ/A[Áyµoȁ‡‘î™âKDg ¸Ğ”;U‰rE³°kÙi.dfĴïÚf‚r‹A*EħˋM ’/݉’˜ PLÖ{_“É`-‰ŻnnŠd=ĵBû@Ú+ÙNÂòQË^&†˜ùɒċ¤§FaaíĜd6!RÜx%s.˜@°Ž ëÛ4ÉlÙ/OüÒhyKZ~™C?Hy@Ċ*û*ž…Î"ÏmUUĈÒ͌Ĉ7 ŝmĝífv[N{SÜMĤÈ÷J£w½ğ^ŜÖ¨d·<é݆ Ÿnt"ŽA&VဓNŽ·ŒYM&ŬĥD/ À.Ŝ€ĉÁ )4˙ Žĥ$ĜäĜUä­ÜĠµÂŜT&T.À9pÙJĝ’?sü… êŽ á\hù'Cçâì„Ĉá·Mj7İ+ĝh›0-N["i-a 3ÒMJfrz=vşç"™2ÖPE@ŠXPĝŽ+Ġ0b9áï+nÊÇʇ Í"0r[g³ß%âcbE)”„n4‘zQ¨óÇŭ@,n+.öžžìNà4 ùh“ŭ Éo6hO;elc52E3Ôişœ“V¨|F™Œˆ€ƒ×möáĤşìfĈ€ôܳÖQ=­2í×Ñ:€:›5tĤ)qèfïÒĞŠi#0ŜSXw)˙°š¨E_-ÚŞT—žûÑAéL7Ùú^MAÚìµÔ‰{é4‡†éŝğ˜2Äa˜Cċјj"Œ…ĝĈMËHĵ™ß+C*$Ìk?)µ@ë4((”:é‚/³FNİÊ!k/ÒڀD?ĊġìŜD¤ìˆ(]‡:UÑ‹b0rÂu÷§d-‰IòxI€Ê˘/i] Ŝ3žÂ(éàTöm?Ġ Oˆ¤F¤Ûˆ* kiÀšA ò!², ĊĈғ+d£Z‰.sÑÍäUcq÷ĝŒ5Šŭ‰›Hm”œ ê‚Äö ċ–4³€˘Ç².S Ğ%V·´’ċ™Ħ‡£aOÌ*š·'J3zŒt;—˜‚ííOz\#sÂGÌĞ wl%ıß½-Iìkš´ÁÚnû'é ""ÛĠ+z‚EĥA/R3~ÚĊ:0´ì5‰żĈRó\¤·0Ï@ÓF´²h„Óş—C ™{"> u_ó$zi"yM˘Ħr‰§FÉ‚÷ëó§É1ŝ³JŻö'µîÀÉ"Uĝ£[bW8„§\ …‡ı&èyñôŞ˙Tg³–.Ïéĵ62ŒĤÌ\z_tí’6Ŭm:Â0×8‘%R+Ĝ`8њQC̷ّĠÓCˆ[[ŸlgAŽÔ,ğpeQ³u]Y:ŜœÒ}? àŜjngĠXÌÏDädżÉù‡wDıÚ6ġê#VœOO^}„‰ĉÁ_ ߋ%ß ÉsAĤ‹ŭGñ‹Ä˜Ŭâw àO x<¤÷¸ê4Ġ§`YJÍıÒ$“ùîrq G6eê.ÏMÑQ†j0sHEë@i?ca–ŠÊrtŜ‘+?ÔaîyȊġH-`ŽUJë²°Ëz&˙Ŝ-{R¤§•ˆ3{Ò&)çñ+VFsŞ|.Ğ,Ñ#֒Fùĥ4Ì.M˘µÂB DTÖX³1ŞÄ_ÖŞ^o8Êݤŝ\Ĥ~˘}Ñ£„ìĜ•bÎ&´Žƒƒ­Ħ 5£Él,’PœV%Ŭğ?×üéÄ5ù6jİ)(‘kĄ€}ĵ˙ç†çuħö¤£r&z˘,„HnV)™ßZÉ&¨ŸO83ì%†˜H ÖŻqfŒx‘SI͕ éĠÏÔ˙ İİ0‡5ì3 ġulK\sZf{ :&bÚħö­S˜m+c[UèwŜÇ*ÂQUóħ€ñ֓îǰ\önİ%‡ÛL].C Ô0e)3Ÿ‡s „İ!bĜ]­p¨“,Ò3•kn | €ۂQ)VĠ]Ìċ,Òužó7kċ,ĴTÀúİE,´Hœ ½z o_Ô‡Ú ĵÉ:] <Ħïky,¨mħ6víàŞUdа>ĜÙ# £]ÔÎóG2Íz .Á`ó%m™z?ÒqP ³ĉ!q›Ü2G‚éùŒĝ—şJĜ'ÑU8—Ŭ&gL£nT,tpìë: \•]50áûAs?;Mê5‰úħ•U7żWD}6ċQ ğĞ?½šLĤ3@˜zˆœq.,³̙ Ħôĝİi²äî°™iëD•ÖcÙx–qŬêù:̂Ûá²7hè9%Ğ—kžÎħıĜ‘½JÀFˆâݎ@-päñ *FĴşuˆJ,Xàä­×L˘{ äÈS+4Î[c ½áÁ*U+µ:ÍLmɉ³s&c" ħ˘ġ·ĊábËJB K8H‡e OT?‘y)‚Ó‡ĈcE#ßµQ#ŞŸ/UZ\ĴXĠ†yq´QĊ>Ŝ6}[•LmâĥÛıbO a\ce•ZxĉŒw…µş/r0à~nÜÁ¨€àm]ú½ŻbŒ 3nĝ=÷-O˘ÔMŞĥÙc¨Ĥ§",żċıt•ıŞ\AĵĝÇŻ:ÈıŬÊÇ:¤´PqùĵZJÈà<żÉ ĵ2‡È%ëÂ+޸=oÂd=ÂaM•ŽWÔ?²Vż"„V&ükıÒӂr$$ş$ßôϧíFX´^1ÔáWĞCC”b£Ġ¸Ñ­şâg<‚ 9áĦ—^Äˍ5;*ñ?ŸG]ÉÙT‰C6p&ĝç7ŭĜ„Dġ[ž/Ž2ĵVG#™:ŒŒ…tšÉ¸u!΅°á\•ñ­½^‹ƒ2Ż%ĊGì³~FÂIOfnœÄ‰ßeLó˘‚iJâóiĠ6JSmù‹ÜgpÏ/ƒl,Ö´+ÑX4eŝkµ³”]¨ò.Ó2pDχ˘âp[Ÿ?ûÓ3óŬĴßġÑÒ]¤Ô¸f"ßġñ³ ›(£ :lX?­”B Ïóêh+Kñ²caÏħŬ<·‰*Mä,ÛäĈ^ĝ½­êëÈQ7}ŬgĵS^ -B!)éċÔ kÓœG³ˆ@ħğÖĵ’k•ĤÈĞóŠıs#Ñ,qatI²eĈ …ˆxDSşƒ )Lvq½r@µTšqގ—lr‘¨üéE.ûżç—ˆ`yLêʏ•§~Í_Z˘‹^ƒëbSThŞéu !ŭùn ÁğSàËeú^cSßCs8Â4-_gA4D’°ċ )D×SRœŬŠĈhv£¨îBÓJZù8ór Ö†ï$Ġ窀F—d$šßn–´°D-0DBÌ÷È=5Ŝçq/ ‚cÀçMÙ‰1ԝC’*”–S>‹ĥ¨Ö_ÉtÀŝ:ŝIçokµV˙¤(D/Œħ{‹jJkĠÙʆ´Ò†°4‡Ş Q[WÂÒşâïMĴˆBċ²ĝ%RNÉÄI™‰HGü@¨9è†D)Ĉ‰ˆsx³2*3<6FÙdşżç†*mÂî“Ĵ&jeĝAô”Ŭ²‡…Œ§ĥpEôŞz…ÊXžĜ(kcğ‰D½˙YZ9Lsż0Ĝ"_y]VqˆÚšƒ„9@ÒîjMČZَT( ñtòg€kßn˜ÇŞf÷mżÉ´-³cLÚT}³’´žÎ#µuJ!§äƒ“b™ ħĴ²A/òálÖ£uË8 ʕŸ\·ŒxrÑ µÇÛĠKs0fĴ8jRJâa—îŻ xu&Ym”6€Ï?n*A³Ĵ‰WìoÒwËÛ+¸ŝ)TVXmúâĈˆ†Og×Ċàş½¸Êê,³ŝ"èµÒŬ&Fˆ  ~wĞ{Ĉc `y­”G†ÛêZ³´‰Z/ôİu¤ŝI¤ bZK˘ĊÒxì‰mèßÚtc•ĴNMĝ=äË,ûR/v>cÖ<ԐvÎKŒÊ=-”€ƒñ—ö62{mî_ëĉu“Wħ*ħpîŞJCİœÎÏÏÊ?ĴŬô°l3ˆ·Ċ4%,·È7LÍ6ġ›bSË…úĊÒRÑżJî`P”ƒJÀ/²VŬ˙[ĉÏTË:4Ó2ž-.NıdÌൠm”ݵóŒĤ"§:&ïQ‰*ÎċÌ´ĊW›bĝd1ue™ĝĵŜ›üeċŭ› œíġñOñ0šĤĊ Ö¨ŽħÁgŠŞñcsùʊnê û£*GŽĈ{²ÚŽŞ6°2F§eä•Q^dĞĊu! —îÉ\ÙÍĠi 3gž–ĞÛ4\ħ_žXî‚`aŭ€.6Fƒaú]6§››NZ^ĉ xnÓ$ Vϋ÷¤ŝé|ݨœ§-Şç0B ò@iċ)ÔjĝĴvg|ó› ¨ÏÉ6MùùBÁ³òxSŸxĦ%=ŝ½<Šë˙VĊ=„/6]— ŒôRyUWDĠĦŜš—ÂUûE—w>p}àÏ­°·×€Ê+Sr{ N*ÊZñçÄut\ÓC‡ċ"aYŜï]ö4r˘3G–“B_éÜnT#̃Ğ<İ•mħœì6ϟŬ7ÌŜÁFİA* ¨#ĈyĴNj{Éê\ä'¸ZuS8uÄÂJŭKݍM;PÄÎûĈ´[šûÔö¸4÷—İvèy„§ŬŸW‡›`İDċ-OB`EUġ,ÌA#]ĊĠ¤ '³,WĊóv 2” v)7ÑŻúĈúݐ_-nj0Y[]×½IvžÊUc`Ġù¨è…’żĴğ%äsAĞĵNF˜òzù7°è×˙!Wa›èÀWï8·i³e­ĝ~²e*Ȟ"Ä+ñħt6÷œžnü{÷J°×–Ûy}Í]vpŞœYsC\ş:ğß6²ÌZ`żY÷Ú¸Ú˘‡²ŝXí;şšżŞd(—=NÙ+Ŭ°×Cv'‡iâNĝyJ‡ ŽĊ•*g¸zĠ_0Úµ^˙Ġ°ñë)0ûàĠl³#Ïq/8—ġZŠrÁëŬIYĉáĴO`> ˙ft:!èÔ°>âsÓJ™‰ıAEƒwÉÁì ÓͳìŒ*ÈZŻGËşlÌh Ô½›h²ÄñΎe·8Ñ{%ĥ˅Fâ$Ĝ˜Ö>Ŝä&ġ¤sñö° íĉ&„tGRĤe6MÚ&yD+Í+€ġrŝ4/J<鋚Ŭ§\xϰ^†™2ÄĈx0}/ÌyÁ,"ñŞÚeQg×çûYĴ×>ÖıÄ$2Óï‹ĵÍp},bXóŭûMC´h¤oêˆ?9_düé ĊġÏ[úK5”MܟP]wÚNÛjZtäċŒüz„ùĤnĉ6Ĝĥ~ٔ˜Ċ x‹ÓÔúíϟӝ¨`gLZËĞW:¸~6 ]Íòe>7}‚ZI•s­hĝ´Èr’^§,—ıàÁ–bŭŻèÈ.ôJÚT1ÉèÑʵĵtœŻ$–İA„4i]•IwUŒ7ëš(JM^ú– D•G—–‘ƒ°ï/Ë.%­²[[˘a)ò ˆ`ĝW°4,vÎMPâp;MJş*¤0v§µhÜ)y³ħ BÍnİ 3Z½l`ú/'Şĵx†k6‰]Ïħŭ ĝk–#ZşR&€ċĉj|ëĉÜğĵİLj%ş0=ú:ŭŭ­ûaŻBF )Š/Ş5U+eaÍ ÛÄ&[ £ƒáĤ)ä3YusÉÊ6Û't_Ž˘ZĊÇrUê'ÌLš”!8lŭş c‰˜ç–ób]@aĵ“üŬ 窘g‰t(¨‘ˆ~Y¨íĴĴ̇bġR~Ĉë˘`8ëşŜ pvħ”ÜĵÏweá%“‹ŭ9 Ŝ8ŬĠ?°]_pTşeŭ.èt‰q“7kRÒiÍtW ` —ˆžÊKŭş`çsQÔ²³TĴò@­ïÖĥpġœ,Ĝ1égu4ajòéw!ÚÇ7ċñĥ<ŝ<~}üáħÇ]yĵë.qVŻËĞòĝ£œ,Ŭż¤v&´÷³òÏdˆWû£0”G+şï?ž!‚IŻğ“‰ß¨ѲĞî ·ŬÄoĦˆûż'"~eD„£nşoĊg'Ŭ”G{ÛŭL•GŭkΰEùİ ³‹{ñĜ6Ċ]vċQëN‰„fu’€Ŭï~v!&]Á[ˆ˜´µİĴî1Ħ™˙ôì˙äƒÛĵendstream endobj 334 0 obj << /Filter /FlateDecode /Length 6244 >> stream xœ­\[s\7r~çúG°Ty˜Iy&¸_ĥ²İĜñn’­ġÚğ֛ä‡o–ErhR´ÂŸà38#JvùÁá9@£Ż_7óËİÚêS…˙•˙ŸŬœ¨ÓĞ“_N4==-˙;ğ9ŭúċÉżŭ3:x²Í*ëӗ—'ü‰>ĠÉm­Ë§ÑÇmĥŝôċÍÉĞĠ7kµUYġê-ŒV6¤Ġŭz£ĥQ)—VïÖkÍ6ĉĵú3ĵà´SFŻÎñŸsŒĈjk³MiuOmNևĠ5ÎĤ|Êfġ† ĈçĠ£ĝîm5Ìü†Zݨ’.L÷ċDQ\}Ûè|lÄŬ#A*ıŬڄmNÍž”[ŭËîß­MÜê”òOëdaì2Ób·iġWbd0–÷Uĥ(ĜŻ70+Ĵä ·LŒÏzġ›”†…Wûx%jB^=4~|ùWŻKRĵÖĈm(ä—ç'+ż~ùóÉĈ9}şħ~›BÀ§ŻVw´Ñh#0â 9tŒ Zïa6ĴvW°SÜÖİ z€DŻ<O-ìù‹6Eċ/‘ĉ”òÙéĠĴ4sŠiżcí01艛ÙEOJ´ÉŠċQžNŞàm[ïl,…Ç&=ݎ8‡N@˙4½qUÈ˘ŝݽp1gsìĜĴcŜ†l™ÍŻhŽœ=êÈcЧû6ĵo·m¸kë6Üĥá÷mx1œìa¸Úíz¤%)o£Ñı‘ş’UV¤Ŝ’ †úäWElrШ- •Q>ĕ} ÖıÉĵ7áï O:ôb¤Ż‚²Ä•“‹3ĥO³^ Ĝ=sˆThVJ^.,MS*­şĞ“‘tìI”I` ÛġĈÛ V_!ïu6.të# 7&d ÒŸn´Ŭz— ³nÏ D“@ujJzQlAY‡fô%MœNvÄi›‹/HÁ[26° ïŜfem…ıµE/0ûœŒÖuÀlħġüÎd0ˆ@+x"|KFGOF*;„o_˘§¨Éİëߋ‰Ç&r…GEç„jß ġY(qgHCŻ—ĥÖÛŞÏ_4…şnŜ‹Œ .ùĈÛÎm×Ênƒaĉ6à;ŭçı ‘›ˆ[-üÀùĝq(iËSŝ ßĥáu^´áĜQ8PnW…ĈrÏ‚ Ŭ·5ä˜^FŻ—L}}ÒÛŝäiÒÀHb(¸€lGŸâÎx‚Š^¨‹“mÚaúXl3%ĤöLĜà<¨SUšlLĊÔ7³œ]˘’{ž!*÷İĉß2ÎO‘Sì̗•Í‚ÑÊ8wĊÎ()Ö+üi ÊŬ¨ğnÁM:@`ĞKĜŞW;éFŻ™tUϘċ×ÁÎ<8>E²wec°ó…ˆ[CïžñUo2Ş—sY†Œq=˘yəxJIş_Ñ9jŒäÒ* ?UûÙ£Ġ‹üs\ÒÜ´:ƒş¤ĵ5)§%—T$2É$r×Ŝ`êS²ˆ§€úĞĝLÈ|è|P ,Ĥ Á ĉ3Ÿĝ!2s·fñv›Ŭ,ĤIxHzr€%‚ àLÀ¸ÇêÛ5c`N>œò¸YU9ġOŜ§R!ĝ C€Ázz{eÁİÏ loÛi&À´°7Ĝ~ĜBTÜĈW—䠜ד“×î  ; HWĠSDô˘ÖÎd-}LoQUoŻpfyÜY‹ħÁLïj‰ĈßċÎ@ÏŜÁԂö•Nögsx+àèr[ĥôiì ƒ2Ħóĝςĉ¸8úH‘ÏħmGo]ĤċŠ$jĤ;q&K¸OÏHĴ@Rn·c´qR˘w ĉȄ%j5láe`1rߓIYi…­úyÁ/€Qlü+ЧšÙġ‡<ğœ#ëH8X tšĴ3j|ûLÜQX²ÊÙ Äİ!€o:i²‡èĵo³[(›èŭ‚°†1ÒÂ>@Ö:ëFż 2@ ïÛp߆ï‡OżnÇ6ĵl?ĥá7mxцmx6¤ámŜ!gŽÇJÛ‡×HĦè[ÌBcŞZŜ²”••İé¸0SŒ,BÜè0 Ž…g ¨<–òQ5$gÌıèĥwäÀ"˜KçÈEè=ôĤ&ÒĤ/š‰î„İ‘wÜ@j˘óNèónL4ĝ|ç¸>ôr cV`b`0ϳ}Yfb‹&èÄâµôĉBĥqĉ&›TĞòs Y,zÓ§ZàiŬVû4ż"‚\· Zò ŸÁ3* À<í×zħúrÍĈ‚a£×-¸]™ µ!ùœü /›eMo`ĵYHp…Nß`Ä–RWf—0·e)3 ÄÔuµFvÀ²#êz˜hÓ§­ĈHâOQyÓ}H5PGÛE’w<]Lħ”]ßF4ÀŠNuÎët]á×$żĠÖ5ë%ükVß½Yo ŸÛÒ Ž÷YŬĤ†Ê—Ó=Ö%vĝTƒ8Ş@tİEİωù>RŒnklƒÎB<]â>òĈ)½deT)ú¸ F)Ç9H.BŠĤȜ12‰ ˜buŻë2ZÒßAŬĞĦż7ĤġWğ˙ÙĦ‹Hf;%%ÊJ2lÔ6ġÒ[J¸pytüŻWMpŸ~yò>V§÷ËÇ 37^ŽŒAçïNŝ2q:N ŭHìs9}ĈŒ›ġ*ÎÀ<ŠĞżíȟŒÙ^1+0߄šµ úSɵXŞ}OîëusX„x†ç˙ËşM9Ȓp:£@´ixçnĞğs&Ùż÷—ĵ-,ĵapŒz,_Ûts–~Ċz£íĜӄ†éŒUL¸c=XyÛΙŞ0+Á°+wÉıP[ßŬñòĥ#”Áġ+&ŒĠŒĠ$ ²/ÏÖ%,f7ĊÌĵK0@ÚW1dV£Y½ÏÛù\ " V9 Ş“e˘—`Ĝä£2Ήŝ°™”´ÌâEaXÎ6!ú’£Tıž5QÎj=â| Öñ°{³úħ瑜¤ı=y]&´ĝ€l· ñϖ îuµÛĉšx‘9ó’‹(Y§NòN€càÔÇ@Ñ8󊨽SĜŜ}×KĤ&!›´˜Ĥ†ù1ygjê ĉMĥBo›%ĵñ0sğ³]–%"ÛÑM›éÈÀd]%’eĦçMİ”áB,/k8&ğ§r )T4KĈ0…Y,µˆ·…ä—sYœÂİdQŽE5@Šŭ;Ħ͏ĠÀÏÀG²À*Œ,9bˆ*ŝŻg“Gò[Ò-–GWu²ú™íĴQˆü3ß(·T‹{NÍĦ’!37¸cĉE‡i+²,1‰÷á…L!ö Q ż"’—…,ìœgöÏÌkAo1"ôuVޝŜµágÖY7Nt!3xÖUĆıÏŸĠSéĉĥŞ×9?…ŒyEgĠÓÓÜ!Ò :ï˘ÑžŸ˘-Éwà ‹OĴŭ›uC×/Aëy@OÀ–—tĴ“òġú\觍: ‹Ş‡~ˆ×{ÔI“KÖ³{Lƒ\Eo³÷FNôİ÷€2‚áY˙Ğ$›ÚpáE'kj‚ÎS"ÂvSŞ4ü¤D˘ ü‹ĞĞÒŻ ¤ü˜aÙÚz†d|œ–ÑŞúùl,³áu*ŝ&9ĝrUpвà/ŻjJż“’Œö“ŜAÈ)¸ÁY S—Hé°)ӕšĦNjmĵ&ĜPNÎ×Ġ¤\gË0òFpweµÂ3½ħYŜUĠ‘|ĊL0ÊôŻoۚ#+5G`ĝ·“—˙újġwYM ޤ“!Önĵ?¨ĝÖêW!pSı‹DüXÔ²Ét…ó•½ë‘|E€çĥµÜˆN'qıĈ“ù;`|œçm$ĵ˙ٙÓ[ı¸Ë0j'N†‚y*ŬgŠš§$^èӜ{Är‰ħQ|ĵûúu ‹ğ™eRäµ˙S‹R6|µà÷WI€ózĵ³ċT5N§9ÚĦ .v•]e­ç5nŠïGÓ ˙Z-Fڙ_"(çŒċy^!pÎJqZ1ħ3ä#‘à\^ŭÇz-ÇeV˙›öôĥ=gÚġj=:ğx>,ƒ]^·áĥ ?ğA­żœ6—äSÑs#—¨ïŝİ _´mÇ!9÷%žÚĊ2ѳw>¤A·^݇N…ÎĊżèrîàŬY³RDìŜ Ga¤Ĥ ôB!˙PW)£ċŠ)!ڇĤîğ³ûDòÈÙ"üÚÉĈ· ^ŭԗ<_G1•uA+$ÚlEvġPÈOĞÜòt˜Ÿżéş‰~ġËş–VÇË}ĵúqÎÓQ‚ğyzœzSêrÉJêĊÌ_Œŭ£˜MzPîÑ*zŠñ²¸ÍUêÏ*h]ìb§ea‹ĴeìE¸˜µp(5†ŞÍtwÈ::žê*{Eı´QèïKûË áZ=:\„—hñ+‡‹ÙĞa—u­‰ñŽñŽñz°óÑĠ^­%Ĝñŭú°ĵk˙œŠşCšûšÉıĠ×bqÑĦŝ‡9ì­,e²•˙-Á¨ Öğfe°Ùñšü‚üĦpĞ—µŝ·"TÁƒ ı|mÚ; •€Ìët1ÓÊ.‚YƒÑż´Ħˆ“"†ŬÈè9á½Gž‚ôĞĥ˘nÛâ/ڄ߃íŭp(Hzjë!3ŽĦ…ÑÖEĝ>nòY;Óż1Cĉï†Ô^ üĵNö™ÜŝÏ!Fwïż˘Ѳ/Äv8ƒÀWl Óı(~…–ĴV†#/Lî2AŽ[z­°h˙ \ÏE ùQ”§^WŞıÚ_yÓ÷qmÈŸ_]ísҍ™+(ÏÑIĞ NşsÀ{&Ÿ<ċPeÙù𙕔•γƒ-²DDçÑĦĊφ Ġ 0qN•AZşñCı8$çKÊbîAÉCà …7%ôÎ 9Ú#ù ĵàŠçëúÁDŝĤ5öò͂”ÓRüûÂĊ<;³œÖ¸j lżr`P}Ŭ-O0E™ƒŽšrvùyħašQoÍñëW&΃ÉĈiĴ‡ÏK ˆ:VDGúĜ ÀM_ |ĠĵÇĞqS¨Ĵnó4Ù*ċyŞÓLMĜ•íÀA\SÚŻEéĝĦ=w!i3‘Á|xĤ i‰ΧUrnœÎ'!é§²—d.m\ ˘Mí“Óĝğċé„ĈžKĵ8TróR+4ŠÒtĝ%s!Ĥž}tœ*jYL‰Ĵnˆ6{>·‘Íq'H Ó96YVW´í,„7ï;‰ŒÎ˗F¸=ċ?íâ¸p:˘VÎyY$ÚO8VÛ>•ŞôPy^u')ğZȇéĦğĠKMġ’ĠŭñxĉY çĠp( Ê3 èè³ċù€èüî²ñMíż“—Td>^ĞY”ŽÇ@wώÏŬĈOb痔‡•<‰e5‡ŻBͽ/8+b8ÄÍ'[eŜ´×ğkküşžÒà•¸?ߢ‹ ö÷ê—XÓ³NÖ§ŸÇ8¸^XŽiÛÉĈ‡ĝq‹$´eıì­d'GG ³L”ĝDpb,ĵ?CĦ°zgıtŸ }–´~y٘ϽħàS,wo O? şX҅CtĈ?=ċRo‘ÂñìÚdo(²˜ \ϕ²x ü5ĴâĵRá< ƒa?­ŭN˜äŬLĤ‰÷/y/üÛ¨TàY·ġ˘=‰ùnȽÁtċœžÜݘëzĴK޳+z;ôÒş/Šb [~#x³R+šÏJ!.ËYşSz<%í˙úàŭ¤“çgġ 3Û$”C·…3NR^]ŬàµÊM\.–ëD‡÷LŻÑ-ġ& S•"g–6…Îî=,°ÎÑO!TĈrµĉ6:È Ïċç½Gİñ˙ĵ‘%ĽçeR>ĉ °Ë0½ ˙–W^YPžkžĊù۞îVùĠÏҘÈĈĝ5`ѐÊùÀ;Û¤ĊsgÔ·%âu§WÉcLK2úêù´éòišcó+ĴĠ6‹=ĉAĵhAİ Z.# Ün=BDŻ{úÙé4ñ)6Sȝ˙ŸX§LžĤ[şċ•[²N´ÓÒÓK+dȔ½mŞ`:GÂn.áYÏĦ›3xv×è[r5÷{ (ÀLÏ­Ğ6çOmžA’·Q*XÓ.Ëw:,/\›?mI÷{l ħş¨&€ĤyŻAŭäO0îSñRËżMS$H8<ıüÄ,€š!ô„P“RĤMğÄ⁗wÊ,ş§Bጭ¨…<¨]}/ÈíÚ{œ)( “îcÎç!^$ĜnCŻ <Ë=Œ/Ä&S½à<Ĵ!Ÿw1hÇ?D >öĊ§x qĥ*qü•ÄP½JċsXàJ,ĝrŞE{ĴĊv°âĥÍ ŭË%ÖG„àÄÖ¸ˆ :„…ç?Êq³kÙ/œë ]FĜ÷L^;œA³@—6܅AÊSá-µÛ£}G‹Ğ“ZöàA„ĝ"ƒÎĈ;ˆ- ^2•D@#{½ĉr-ž]ŜŻ5ċ–ħhÊs0şş[Hĉ˜ á$Fë£A–žŽä·ù6ف/IĜÍ=÷%ÍMÜï[â3ó%UÜ}È WÒg`t­§ÔĞżĴÄc:íĵN’MY™hLšÁq"'WżnĤ˙´NĜÇïbˆÏĞĞPw>èîŸNN“ÓA–ŞDÒQA%ñ1Èllߘ`Ĝ†ĵ”JU²âîÀ@‡qdIC~‹„cSñ‘ü‰HTĥçË@½[{l¤^ŝY_Á…ċĵŜċƒ^òòYP‰œŝĵĠÂL ‡{§¤˘î=Ëú€^Ò;oZÊ>Ö;F’  <á6ÌMŒ´ÍK~ŞTZ4ġYíÍş…sı—ùt™E˧¸âÓËĉ I²’Ĉœç)KóK,úLçô“vÁô˘Ż`™hèàĥI–b˙qò˙[wXĞendstream endobj 335 0 obj << /Filter /FlateDecode /Length 3909 >> stream xœí[Ko$·ˋüÁ—ô;‹ ˆm䰁8ĥrr|èi7ÖËzX‘}ŞŠìfħ‡-iµNìB>ŞŠġüÈŝñPôòPà_ŝż9;‡'?Hê=Ì˙6g‡Ÿüñ §"Ê£ƒ4Eyè­ï£ĥ‡Gg[ŭĈzU5²×1Âĝ£íÁwŬ7е譐Z¨îë“!Úcô^uĜ\ÔĦğÁn£ôşeó|ì>§^!ĵŬí ›VÓc·ŽA[÷ŭÑߐ q˘WVŞ‘Wе1ş@EÙú VSAĈTÜ@[Ż‚@’ÖÊîJv›²KwqşZk­ú -%zšÊŠŸ@·—NÛíĜLÜD •éq Ŭëşw¸½څîĵĴ‘™q•T…ìƒÒ•T}IĤÁ8—}´Váàµş7^µíƒsiñ­…Q9ÀµžhÁj`ÚH`QĊ ‘N\wò2ɨHb”R;àZÑIğ!ŸšpĤÛ²‰Ä´°$Ĵ‡ÂĝiıgÌgò-·iˆğKŠ£}b&HoâÈLĤÁ‚BĠ,¤“Òt_%Âá`%Ž0@Ô5ĈiÖWDè œ,“Ï˘2M- ùċÁÑ#0Ҁ&$p1ĈQ÷@뭓“îĦêĦJguÒ<²ĉ­‘Ö€…Û²Ŝ'Ĵ;Ğ^4žL gzXŒt¸7Ġˆ‘ 1ŸUy8™ ÂePnC˘’Îş-Ĝô–hqÊĈJġIœÒ;XcÓĥf—Ì”P(Ü ¨ĠiXÔş‰ËTk|SRÑPєFKĞêîl"@ˆÑ§êëSµĤWf´Fä0FBìŜ–ĉEiŜ­šŞázçĊdÓgĠù!ZĜ¤|ßÛÊia>Œö\îL6IhñÛòûp“ĠŒâ²tgU$gvħÂux†ŸÈPát}ʸxö¸fMM0·m]{àQ Áx!i]$ƒr\ƒ‹îA„kİ{k˘ÚߐTÇi_íuq>:Pî7df6:ĜŒĴHXáñÜqD! 0V‚ß(â³ıĊ1BèdeZ ;ÖW3.MĵTÄ £Ûĝ†tÉpq^­­§Ä^Zş)cAjÔ³2uWš×óĤä²§ĉIiîĈ]Öiê=.½7÷4/ù ™IYQeoœÈİB÷ûœMTC;Û÷ĜN·ÉzWù˜âPš§Ù—ĉ×ı+ÍĞÒdÖÎLüĵÍb°½!?Ä"¸f-‚Yĵ+k2²o¸‹É‚.Íĉ´]“Û-gfZáş9íĤéşÖ2H7ÔášĠûDûĘĵŽ`ža² ĦMә˘½é)cdJÈT³/ÍMimêîU³wÓT˜ŸÖbĠCŠ£ü²“†ü".ùŠÑI§ Hû€yEíx1:7z]ĞÀ뎎aÙë²ĜJĞthİ óX˜ü(°gèp„ßż)Qŝ‚³tI ™%}™èĜQBäL°<ËA&ŝÙ·Œé/X˙šAÜcrù^ž9#I&0Ċ´ç~”È‘@˘ĠÁòFBîZÂŬy+ŒÒ{Ŝ@úîâx<Ž”ğD­†ÊeEûI‘Íڕß99¨Kj!áUÉŞ‚em´ë1¨Ñ“ó!‡#ü‡›ŝ6wxÖŒêËĉĜóĉXfî˙êš6üK9rm›Ĥ{m;ŭLµ/Y÷Şj?!Ÿáı¤‰ÖW%Ä~ZzżjĈÀи͑yZìÛÇBçÍ9m†ùO‰kÒà˘Bï ?ÛÒ|U´IÓ,şkJÉĉ]“‚ĥlΞ+›İù—Ĥ²}˜ĉ˘†”ĉ§írĦĥÒÏÀ5X÷ÁWOB4ĴÖħŽXrœ†xë=*…ĥŠnŬ½!W ÎQVµá9ùD…Şş_”î›´FÙ­ZĴġ,‹]Ù(v)H4ŠŬÎb#Ċ'& ֋e,ĥpÏ×ĝŬj*9U ·€ŻşĊš1 ˘*‡ja s÷™ÙÓ À™f)„:ŞNȄ‚&Љ(÷ƒ¨5.÷” Ŝ2i!Ĝœċh [é)é|0‡ ~0ÎíçİÖë“){Pšœ@RÍ9O +¤ŻÎFGnê@Êjĉdšž…9fżlÀÏÜÖ[ĉi Ô¤îÉ%ÔÁϵV&eÁŞÓ݁>Yb ¨1I  AÍNmÊí&Úĥik` éYÒ Ct"ŞôĦ–Ëİ–ĠšìĴly˜°ŸUÀSɌr÷˜‰ Š\ĞÌö"ġ ŞN@3Œw„ H™C7œÁÎéçj˘Û$€tÜĉ,•ŞĴ^ZŞ‘9îñBëAÒ^{š}Sd\ ´ĊZcuF³Á2핪5ÎòÄšvÖTÇSÙéŜ”î½" 1>(/)“HԖ˘d^™ÙÇ {Äià•R"–‡0g7Pŭ„°Í]ÚNÂï?ĦkVBéĴτ¤nĜşi;§à4!ŒÉÑ!hüVáhHQö ġLË/(VÓŻ9F„r&ÛÄğW?%|Áیĉ~àÁ³ÎĦ(ùaċŞm&Ĥ“*i /dÁ0Ĥ3x“£‰ù˜Éµóâİ˘‘Ĝ”U}ŠQğmT‹ ĈYż\—ñ½`Ùx)ŞLi`FĵpÛúRf=²YǙì=ԓŬ°Y$ÊCr¸Ö ݊Lrİ”ĤlĞJĤéidŒùÒ"Âùz—Y´’R+M^*ĞİQàŽ™½Ÿ¤ŽçXg§™ ñô²r-¸-ÄeşNÈ%Ž ĝŸô\ĵĉAç>Í pˆc-—àÑ˙$şòhEΑYtÉ1‰bŽNµní*'{›ĜARn œùžK0&³Lâ”ĝgU>/ŠX0œ;–Ĉœ§ip ¨ÊÛÛd7>`¨í†íVTíğŒMmĉx9„Îpx?ħàÀ'UϔĠħ!ċÀxíV1cvM€Çµ–äÙ L#ÙÉ#ì^]Îä$—{û>ET(íbXĈ(XĊVáz­„îŭ2&0Áî—ŭ{éŭgi~Ùl.`ݐ…á#x ³ż+<ËÒüì,8w­^†ä›Òğ-½ôÚfŻz¸7tn5•ħ²ôúÒKŻ*½˘ôÚÒĞ›+˜ĉnÇÍŜ7Í^ÛìŬҍá˜;·8ƒ[›^èOwŬĵ‡f›a—ÍuÛóBÌÏ{†w˙†Ó‘%YÎ9ZfŞı3#x[šŸ7i?oü(iŒ6p×^XTÜMŽúeqß,ÉÍĉÇÌìcföÜÌltn3³ßpfö„ÔĴ~´2ğ3‡Ĝï{ĉ µV%8<'&×ĵpq“ú$NŬ]keüçv5=şÈĜ Ä]Ùĵc½òqz uıÚž X˙PjpLzŒ˘›:ŽeqöëN ‚{™­!–ÀGngbèñ…ïHô?àİÉċ·íCó½ħfb½†R*”ñĵHZġÛOÍÏJóÛÒü˘4_ófóÀ\ú3îÍîOn›bßËż6½œ~%éñO…òŒMÑWĝCž‡m:P'ìŜa~uB òÀĠɸ{â+˘†0Lġ‚-žŸmĵwž•Ż/ŠŸà'l£rĠ…÷÷!,˘˙ÚĊ^FùTô?ĠMWċX9ۏÒ|XÛ 5&ì4œ#Zéŭy”9‡Íĥ2Ïóİ:¸ÏĞÍ^cħ§Ġ¤#^|6Z]…‘Ĥr ħû ½Ÿgè33ÁÂûĜÉ›ĉP§û?ĞéFá2W›A-sĈ/?PNfŻTópzĠk²‚zoÓ;żżYWu¤ ôtù6(Žcİ„ŝ²‹ŽyT9PŽÊbŠ•î›Œ}vùÂá3™¤/1^Ÿ÷‰U÷Lżî³Ú%¨‚Ï\ò´Êd²n‘iœWâœdµda³—xÓÔiOû>N]Z ñW˙J^ŬöĈ…: ³2<ù$Ĥ>s܀O=A5ßN—g<^`AëE4 Tŝ%Ĉğ%—¸pċ8lËàtˆžĵ×noÛ÷Ÿtf•~M°~$ô:–h·ċä¸Wb×  LşIG4¤ŭ• ˆ"Î.`Şç“J€³ÑrO6,Z$砕İbÀÀ)L/!TúŽb‚ɰ Â:§÷Ħ+òkݧCÉ˙ŞOšóû²–ŝ:|Îá&Hİ~ Ҕ buċħċ$Ù8כÚ%=ôà‰Rƒ{œ5STûŞŞŠK/Úê7h_ÎÚúòhü†Íñց?EaŠŽ vémòbósfž‹`£gܲ§™ü=‰™§Û(ÒÙŬâM˘sœ¨‡ÊħÊ7òŬ›KNWƒXûG7D2ñÄÏiHbĜ1!˜Aġ˘”Jœüa¤oB SN0ÊùIt}EŸ7Ğ#fŽ4”:ğ`ž:)-ğ”6tBôfSB&=ùÙżçĵOğ$}{@îÒK]éïUšè…ĉ Ì`ŭ]`„Χ4—|ä |"ô%VX1ÍgbĵÌK_hs•°okĴMĜÈ:­^!] bÎ?“˜¨f³]MV{hS²Nß^§Á: ż'9LžÙá1›OĉĈâC]H=d.‚\ÜĴ^Ër|ìuK³¸†µµuDÈÔ4‡ÒlgípÀǵ…Ò\ŻzĠŞW ŻàÁvħ`ıĞŜÁ¤oÂj>^C͞–÷­´„Ê;…îX>™0˙ŻRù”oXg7,-8yìš}ĝ¸ŭŭ?žc{ü/>žkaôì£ öuƒzßç.ĉç+cûĴy'•Xç"ŝëÑÁ?àïżkendstream endobj 336 0 obj << /Filter /FlateDecode /Length 2492 >> stream xœíZ[o[G~7ú#„ @Šj2÷ °ğA\ìv[4ë Ŭ§ÀÊĥœxmK%ğż_Îċòdğ›4`ä!ÌÉ ‡Cò#9"q&F<ŝ)_îñÑû½ßöDú:*_Ž^O÷^8 _XàAŒĤ§{y‹ Ż™ÒaäŒcA™Ñôrï°y3ĉŒn•ÍRpe}s=žpĉ8×9O”’Ì…ì-4—˘9‰ LÎI 9SAyßÌWĵ2ĥıˆÜ¸ñA6GiŸ•&47dß>[Ħp^)8wÜSr ğo[‰\ó#ÊyƒÂ]G¸µô³ħ´,xĜs—·{›ŸQ0rìò|,Ŝ‡m܍½Z‡,‹bù>)ÒJ•ïUHXŽ'ÀN°tÁ" c‚h~Šk=pp³ĵ„%NkC³B~~ĉĠžšW)ÇĴ‰Fžžì5a<ŭ/,.Œ„`Á×L´£‰2Ì[—‚)Óà´k7— … ×Ì'ċÁ&ƒ8Yë¸è—ħ3pÇ šÙĊ hFŜœÌWÇ钆s%esvµ^FġëàÑkKÁ¤j4ŭaoúÍa3Û%çló!ZÎë ‹ñ5ĥ:3q}& 4í}öa’ny•vä ’—HArŽä Éc$Ż‘Ú">;;#Ŝ³Hn-œ×Ñy”ĥ SKá½@ż?Mwài͒xkT—ġŽÙÌ։5ĝƒq‰‰ÚqċHòYq”Ċpä2!‘KPXç%›ĉ÷Ȱb3KpîYYáA ·c£A Ü+bƒ.¨N’R,òsfċ`P ĦìŽh#jÔB ñ2kԂp>­ ŻPu‹­GwtDżö‰òí@vĜ@˜èü‚ˆT,ÛÚ|@Gß§Ħq€ùóO›5š•a@@`µnAÈ$ ~Ar†äE;%Ÿ ;nޤhħ“Íç”ó›Ĉ aÀuŽSz1Z9L %ҀiŽŠ[3䠕HĤ™-2m…샧–úȂ[<„|%G“ ĝz:$Ĥ£^^ᴐŠ"à2/d BĠ;“kA†ïĜnğÎ\‚¨žFZ„Ž´ŠFˆ€Añ²êžž¸*ıäÁC½x¤—Ħ^úí¸ħñÄİÀ$i]† ĝ ĥÄÛĉeN}·Á (T$™Ŭk™e7’4GR2j4Ğׁ~e RǐZ@4Ʌâweçppùyŝ A˘ç Ğñf‰ÉIá͋IC€"$Ġ:ÚË {Ó]k,Hˆûwv£šMġNpS4ı TWhˆèŻMJ[ŭ€]]=-_"<Ä͎nž£IYşL¸³<&ˆ¤(ï£ViLÜàN½jnU€îsĞĴu÷XôîÑޝ-!!şŸÒ’É`1½o‰ì­Nöiİë!ÚM++sî ×°¤˘h΂Á)³ĊÓN"&vş5À3ĝ&l2-bBkao4iŻ”a 6Kŭ-:'ı_c@˘lUÂÉÇ$ñKyë¨AùŞ2ïÛêX¨ğS.’bN£y€Ĉ~ÖI‚ş˜÷j+̐OŒTħL§Ù‰äÂm9Ğ–êꉕ!ùĥšM ³Uġ4RáĴ2û0ÜfâcfäÉ)’wH^ѵĠú[0€hUx‚*œ#ıBòcÔĊ46­;ÌĞÊê=ŠcˆA•odéJĈĝ:gŒAR{1-Ê7´žtöñ´>Ĥµ ğ„zv†~GžgH‘üŞÍ7 É[\0Còɛê½Úßpáàu G“ì6"‹öŒğŬ‘/‘ü7’?!y€ä?Ğp=Du $EÍËşñĥ‡ÈŞ˘gU=ò]SµëgĥöàŭżÀù¨xïÈwW´÷^kÀ >ı_G:òEşj÷ŠÍW›á}ÖU’0 ô-ċ[gV½ĊyuÁûŞßbĤR=Ŝ(U½jĴÇ×U[žµğè'=‡áLJá?˜‹·&Z<ñ]E Ğm?ïtí}fèŭĵÓm;ù3ÀߝĥŞ‹|%ÖğFòì>Ŭ³j¸žW™Ŭû ³‘$ı÷5’˙@ò$÷ŸQĝtQ¸¨²¸Ĵîû+’/ü{Ġ+ˆŻìW·=cŝ‹ÀüĴûÈ˘ùÒ¤Ébé£û„ŭĦYZ<#ö Gì ò>żx7óİ^ĵŸ²°~$|?Ġ³úéô[w`öĊĉ‹ö‹{‹“ßžêkĵ?œ£5ÊtqçğÒĈqÚâ"Ù€‡Ş2j˙ç=·ĦLÚàäÍ˙9k£ĵŠÍ£^÷’L<ÍVäû*/ƒ)˙4ZúĜ2’qçÚ_˘żĞúçEĠĥŸöW¨â÷ĠPvl ™żÎWMhÒeí:Q´£–şh^Ë~›4èèç܎Ü Z•IŻB4_ĈİıêAÉÄPnÛË#& ĈŬè~ËŬ@%RCş¨×ÓkħYFôZ(Ú2iğöÁÀAúÚvàúVu͆ڎésc­ÚìĝçëU;ŝp ˎ`4ÙÙuúMż'N:¨ÓŸ›Żİûeä²×q~ċ$ŸmÊ0”7Ô^¤ħK‡4ĉè'y1ü‹ôŽ—Üˆ•†ië?YH'Z(S ­˙´"5‚)V&0÷š˙m?6Ï>ĥêĴߛí%ĆŻşLMÑiœaüè÷i1ʇÊOڗÙÉÀċŽ6|äĵ?™ÓSnŸ^ˆ+ìÛı„Ó oÛ]ş–T%¤ySŭJ*jî%|I‘´-e?(tuŠ!³ı{ŝ+zóƒ]÷Ŝôš˘”Že€4ïÓħqS§£³ F:ÁÄឈ€2 +Ò$qĴ?‰°ÙQ”,Ìh%P|gKñ_3Á\0qžBMqMŞäÓ§ĉĠBĵ^•m3Ñĥâ\ò|9Ċ­gH^ ùÙÉ÷N$lTCĠŸ#Iĵ§ĈëšóùIŜñ}÷.YAJĉ­&ZŬżŞâeUĠ(Y{QĠÒñP5µuÄRGĠµŻCÇŻÏCLŞĜ"ێŞzžUż’W0‡tîßV·-ĞB’ݤ˙@œá´zÚĠ;âUġn'U2ç&3Ş+ŭë'“^HW™Èe•> stream xœĠYKo7ëß #UD)ÔMÓ óV‚A²e+Š-ɖäFÑ˙Ŝ!ığœ]QRRĊ† <Ĥ‡á ù}œÙË.-X—úŸò÷ñ´CğÎe‡…ÑnùëxÚŭcı˙ĈH)uĴ;8íÄ)ĴËĴ,„t]£Lá„êĤäÏ-¨£ZF& sF…ĥdÑëÓÂP*-9ëġ…à…qŽ<É$ċŒŒĵ‚rÎ2-„֒?*œJ“so*ë89 ó4WŽ\Ħy'0Ĵ™``y"£ÔP‹Ċ ĉîUò<ùy•œ[x‡¨Öxׅ³0ç:N·T’·É1´ìüĴÇMÁĴu›<¸îY²tÑQXò,Rs÷Un90ïġÁ*Ĵ ħÂ,:£#/½ &ó)¨Ĉ´vd™|ĝ4xé•§WShċ“<u½Á:}É]Ħ´éö…*ĴÖ^ġc“sZJ<‡(uä"‰ht˜ÄUV„âö§Ááœî"‰“$Β8NòĞ­S>E/’8Lâ4‰'•]K&‘%$ŝÖó!f˘PÒñîà°3ĝġĉâô&>Nâ‡$úáˆñ}۝°µó$^ŭ@px;8>"ó‘‹Ĵ7(ól²Ñ~ÎÓ.Òèġ@.Ó´óĴŬĈÑŞE´wœ1ŽH-ÏêŝÇ@Š˙A O²K|Íşƒà<‰³ W0§°şĦHËÜ}VĠmc!?mÍöjÇmcac“]Ñ˙İUíˆö+$W·°ÒÚ@>˙xîiç´ žA\ĥĊv`Ç8nu°ŜĤÑAŽ>Mâ‹$>IŝŽ"ŭ͝Œŭùp§…ݲ½#Ż· DóĴˆtÑËl’.ÚOâÇ´µQ}N³qşÂ!ËÁÓ]´eváOÛoJ÷ç§_šGiôy_%ñ0‰ĥß­oòĤŒ²Ó.áiıÍ.èÖĠZwâ6ÏŬr.6?8/³Ycä-Îŭ‹V›n8‚ı="·Ô7P²Â)Ċ}í˘yĦĦJĴĝä ç‹!¨Ĝù%F”2'‚ğÌYjMj]Ë8ÖUĠR‘´C •–"ó™֔ ĞɃXQĊTÒbPh1É*OÖJgê׏%ŸvÊÄï-5Ô|Uİé¤Qëµ³ĤŞpƒˆ•WÁĊ ’.eˆ´kً£ÚĠġùúFÂ, šB–K İ9n għäĠTi×ÜPç*UPĈùRĈÖ:k^+˘†ó}`jŒ^{ݽ)³Ç z.“J!f_}uÎ)ĜÇÎ.ÊXCU˙WĴÎ}vQŭ‹njy,¨ašr2ÌrKÀ}…§^ äa=.ÉğJŜ$eİwŻ`µ>Ó>R N\Ó0ŒËXŸ7z Ë8:™ŸV-KĤ^‡;g­.Û'Nn3ÄLI+ex9–{™ĵ£3ÙGvñw§aëçé„{bœuáš<t^w`fZléJÙlWŠTÊş’+߉]İ|ċÄß³£hB2„Yùê°ÈÂ"BÓq/ísKÛMf7hao픍{{‡ġáO %Œi+šË}Îò3?HâŭĴ8ÊFEê,ĠéD ˆ<²ìŠ˜x•‘2V$ñ8‰¨vBċêŭ=ó-,+¨Ñ1Ï0BU£ùéƒĈ-†KYö(Ĵ=Ê4)@PU“²ó¨Eı òŸ„Ġ5œ’Ş/Èp|aV Ö°{Żr‡7ƒa-ÁLÑ8Ó~9$M8 èŠ]dZòpTK~›Ô&J¸Ô‚ Ĵ€½b݃y!.ìP2nÈ0„ŬIŒt–"Dy ‹r ÊÖÛh0Êéü ‘Ü,.d&„C- ™%Fx‡_Uc7ßzu¸n.? cJkAŞ\0½•2-ôQE$zÓĦjñQ­RёïLoĤ£´RH‚Iür8FwŸœk\ĵÄèħ‹žË‹ĴˆH5‚cċĞyD=Eאħmá3Ԝۗĵ …·Ċ]xµĦ.ӝ,†ÊäIÖîçlĥÚA7­öÜ&2ɍ^es…DTZ^'5VÙğíâÁkìÙ~'ƒ[ÀsY3Êï_Ĉ1Ġz—{¨ 1 ĵú˜"/ëË=Ǘ=Ĝ3¨ñîQP”ŭ âŬŞkêWùÂatÏZa1dŻáZY-D|‡fUB1 šï‚UˆèË^£ـ™­0„½Ïzġż'ˆÏÊİQ "Á#Ĝ§Ħ+O}PI6>‘âíá@[6¨ħSĆóH ùÜ^çöaŭ°äpŒÌlXé]½pâR'ÛCSÚó/íĠşö‹‰9ĦĴÀĦÂbÍ·²ħ˙ÄâîV…ċSEܕĤZZ…(XŬIĉÜFħ/_²”ˆXwžUĜYċ!q> stream xœµ\ÉrIr½C4}C³ÌXÙħ/}ÓL·d“4œnÈĉ­C ŠŠeHê ĉ³ċKd†GTf[ĈƒÉÌXŬŸ?_˘~Û¨Qoŝ)_ܞİÍÛ³ßÎ4=Ŭ”ż.n78?ûî§èàɘU֛ó7gü‰ŜèäFëò&ú8fë7ç·gż ?lĠ¨² 6êᴍV6¤á~ğScTÊáŭvg­cΏ‚ÓN=\â >ç ´Ġh³Mi¸Â§6'ëpƒ½)Ÿ²^ÓwÁĝ<<‰ïàqVCϏÔJE•dsğ—ÓŒâïužOur÷8!‚\Ĉ~k˜|ó™?OÊ ?׉‰aï·&Ž:ĵ6ƒÏÛdĦí2ÏĊŽiĝmd0–×U–(&pĜî W!Èîx2>ëáÏĝnR·JÔ:„<<Ô9ü×ùŸàx]’ÇkmƒÇC>ż<ìöüżÏ~û†6á6˙ŜàZËĤoĝ;òµï~òĥyú‰IO§ôJ`êÛ³Rác0ŬHA45îµY€‘yç ëġtÀ(yҒmv°’hÓ4*2à‰15„ĴÙÍפÊ6 ñıB³èñƒ˘Ét>r3ŻŞ” ÀïvĜq~šSlX’è˘2|; Ñ@\£ì.#ÊE×uAjĦèCŸÀ¨ÌËsÈY´SŜ–¤ï5ħÀCi’Q#ëÒ;GÄ6!ÛweA(Ôê‚"ÁÚ S0R€²rÚÚ"Ŝ¨mħ?|dÀ÷ċÄy‚ùŠrò’=ÜB‘uÂwŒ/°î8K@g$-îÙ1€v `“@r½<…ˆĵĜwRZ•âGyeBCpžŞ˙ ĴÔ ‚ë²Ċ’ï‰$úñ?ްöeJëf{WŞp„ĴsˆÁÓİŠ§+ħ$…Ï ç>ñh7ÁÌɈ ϤĊx˙HÎRô1’Ì/BJkµ o𕽷à/¤§ŝ/ĈêÀÏ=“:•Ĉ”bG˙Ċ\9şœŒî Ë~Ŭ8 ċ‚MŝC/I­}àŜzH›}x,œÖëÚǢK·Ÿè‰B… ^.ç=O.˘“Ĉ÷ĉ]‹Âx*8ôxZÒ1żrñ“ÇӔžL?/›{8,dqÁ‚väàĤِ%¸1iÌNK´Á€ñW…nuËoŞW·>lµu!rËÜ05A GomˆÂħ§Ó²Wħ~L‡N‘qĴİ3¸óNż C–ş§´Tí è1jı t~Œíĝ: 6X}ápŻ„B%Vì—3F î<¸üÚéĈa>N0ĥ¨š`P)÷†é¸ħOʌp&Íoî×3h+ páUuòrÎoÏ='\NeäVú3`)L–ŭŭ"üfħı’ÚXŽĥíÍbi£È9ÊmĈĜW${j³+òXµƒ3RXͽHŻ;„S=6 à-eèċ)dӈ¤„UÁ_q‘ Ğcm<ñ(LÁADÈŜó¤ŭz_ÇĴ‚ŭ‘_Ô˘JµÑ@yÇiÌñÊ{2]Ŭ`úòĞ)Â̅¸8Ş>˜ËÖHƒ›Y/Ÿ0R€N–Œ:›[ @uçX—­¨U‰B³ĥY‡³?ŠèŸÚ–Lş ÖD7ìcÒ~vêkNéсEiˆŝħŻ'“+áŸ#+Éç€1d&üh³”Á­O“"/ÂPytñ^KöGÓ%îJĞ%öħ|n²‘žƒ·4£ N ­X ƒ`â;™—bÁƒZ›Ç[î™òEµıH‡~Ш"†[q1Kgş~¸+Î2Hû£mtM‡;„ e˘N np>µŞÊn#ä6Ÿ4ùú]ÉÎK,†?ÓR™Ÿˆ ħ z ×qÛ_‡Şm$úŭŠü™„É£? Nġë†ĊDÈÊWx/GÙTì#Â2‘‰ú[Ŭ•˜}òZ˜kIÁµÉ£r~ ùH½ƒO³ĞÙ ²ÌÑ4r›ı@52ħ]ŝĴc^´ÖÂÍżO¸ˆĈ°ğ'Oµ<Ö2ä· ċÓĥÏaiÓÑĴfĥè Ìtß-ïÊ#öĴ²Y°³èŸäĈˆÈ́w]!¨ÍFQĉ%š-àJŜĉ·Şw+•eWFò’q^'p-œ$Jm^Üğ\1>²oNĴ9´™'ÎÂ1Ĝù‘L£Î‰3•Ŭë2|ĉÈ6ìjŬŠ‚ŠŝĜĤ”uµ6ċ[ÊlLôTĝ, uŒ>œP*œP1žÚ°M# Ĝ2^Qy°€R.Żz³°ŒŒH“9ĵŸ y4,€\‚ĠÏ<áÔi³paNħĝ#A–‚wQWLCF*AÍ âUnepOTĵ-P¤W9éĤ…“F“fköTT2v!"×14œ`Êı…~hd˙]S˜êPı€ĝÌ`BöĤ·XŒûŞ)ѧ4D וGÂäÀc›Zµ“9Äo ¸„ucacQ–b)İŭO‘——Ù™=×C)çÛ`ÏûŽ”R§ÒÈ `‘ì·DFıÒĈ2Ĥ”jl×7†FT&Q 0`·ÌÙbTnçŒ<—#Żi…iĥ1‘öĞbl뤛:Ċċ´í8”ó=F†]M=lϘXCpKıĥĈsl9Oùj…ž"}\É:h°}"F.C‘s|RìCĝ)ñĤèvŽ<·ÌĦç­ÊĈµöċ—âû҅öuòA†ŸËŬWOœı<3[ú>ÖÂn&ۅÑ[W ĉ_‰b)4×G ŸÀ°ö0ĴÊm3µî’£Ê“o2ïoH°ŞlMïîİÄ5ĊŝWüôû}˜Ħ{àmŽ€Ä Ħ/ÇÒk2yÖâLÄÄnĞÓÜB?}FòyQlx×wábSràyŞġ{])„D…³çÂÍjù&Ĵ0Í­ġ–dXáëÒċş@öG0dôú"éJQDœ¨œ<’ö•ŻQzĞMf8Ô0Ù Ħç³ïĥÀZOž•ĴhY~y²N’÷İ'^te_Ôħï–c^ĝGdG!ĥÙċ/*A ÄK`jó6µù(Ÿ.:!Xċ9/_ĴhÏÌ£$ĜLwE¨4CJsGG²qĦÈ)Ĵ›ätÚiw äÀâî'Ŭ81-›ŝíkñÖ]íV†9Ž4JÑġ˘Îv DU˜iE¸ÖàĉÇq(·”VR8|³+ŞBÙ),×QrÖh Ñè6tÍÎlŒ‹’ç=Ŭó £k"è<´÷$?êf‡ĦŬ:ıynıİñœĤĈuLüfnBÛs3ž_Žbs36÷Ċ²n‰$’ZÄ{OŭOÜ]NúYŬÍ[×i;ÎHÛµ`ZaïĈñĞŞ%څ½ĜÎĠ„=- ™˜êjÜmáBCñ xàÖ4 Ŭ°jñ…SÙYƒ(51J¸Â.ĥD ëw•'·ĝ8k%Ú6wÔ ï‡ 9á F1"ĵ7ï-•qRKHmˆÄY°Ñ\]Eu#ĵYÓ.5Vĥgg7 Ó+ TâKLé1.­£żŜz3*.F(?UD—À¤Íx5ßKĝu[-†›ƒ!ĉ#ŽDÖı¤"P_òw£fà'yÌÄiZos”|bÑáùp[–ÎsLGloî⅒:…ĠúÈ*äӑ)#~{ĠG^b—m6ëúµHQZ½İÊçm§> ċìœİIMNS4[”o!µ2ó,q ìşÑ(ĥÖSŝr`ĉŠ_€=ŻÚ_î˜9ԁQġ쉋áş"”>ËKúñ’ğĈTȗá=pÄĠüùee?b„CٖÂògċBêê`›Òš•aFÖnŒ Ÿoç*ˆ.4O[Z){ڊág5Í]ĥ•ÀĦ?€Ċ9P zêIéÖ•% LWmœ—’ğ˘¨üYqP§ÜĤèĴô‹Á¸¨)ċÔĠ"wá"_Żk½í²ĈÖHŬ(fÂ4Ì ßxtyġÊá(hš˘ –Ä*˙$íNM „M‘zY°­Ÿhİ7ĵž‹ż+Ġ% ŭĊö*WŭuĴèŠĞ·`ŝÓy ”nMĤĉĈM3N…SJ§ÔşK+^ ½žœVuMêd5ŠCŞ>žş’‰­[SXf¤,ît/ëîgÏ£S‚£è]Oô"ú-İs£wK^÷’GċíèBr­G•´‰Ċ£˘ĉ}mjóQ>]ô¨ìnÎk.ĠNkŬ‡B|Ş|à3Ħo@˜ĴĴLÔ½í?FCô·óíñ1ĴV֔KŭàšĴŒL_Š€+g‡¨°ùTÔTCµž Ċ7lnc^Íg3 ­‹H- ñ“o4×~pMXÈD×£q}ÀĴż%”€sĈ"‹Ż%—*ŸŠ%–ġîNÛĥî̊>Ĉ¨ueڔg·g-QĵäáM,ÔÀÒ•49ëş!m4}~Üßb*ÎÉ)Ŭ|×ül mRÒÍĠĴšü=ŜN$˙âbĤ.Ꮰ8ıÄIşkÒŜàÜé›Ĵ˙tÉèĦ6żŻÍï›â³ûÚ<ÔĉâSqéİ6ßÔĉX›—µyU›;1qĦ·‹/ìkóvħù6ï;Û!#(Ž“OŸ{¸ĴÍĞÚ|¨Íïjóë]˘‘?ŝÚ,Żunt•ŸöŬ1Ĥ[”šcU;ß&7§é:¸ü^wŭ zşüŭ¤¸Ñ!1¸ßĦîŸ0Vö÷‹dGé[Ï iŞ3ôĞT×í Ŭk~ċ~M:ÍaûSV˙ÔFċ0jĉĠ˘f.kŭ˘ê  ¸İMqŻu[0އEru·xx΢܄8˘^#Í^Ŭq ßÏĠÄTğˆˆá Ğ(^žĦòíµ(ÏàŒÌœyŸÊ˙f—ŻP"­QŜË)| Œi̳sĥƒZúe˜/\@j`:qX€ùĤt¸ĈéVC '~£ևĦAîo—bâĉ(ƒÑ“Nú†Ĥ|ïí´ÍżH„cĠeuçAû¤™Ì.ôj;]ħš(2°<ÖQĠ+>F“"â$‡£Ïà:6Y#k dĝŠÊ—àà4“Ö"-äXb½XöĴŽrGż7Óò Bh“‡3ü™–ÍG–9K(€Of4as{f|ğ2™ŸÜœŭ|ĠÌĈË1HèÉÀZ 0\dtÔ4Ĥ£\ıkkÜ”Ħé͙Áî™RNÑaLħäžA‚µÍ\'–#]]ğ SÈş­\2%%íqӏğ°µĝ²xƒ”Yie\*÷›§\rçʘöù~ıûĞ˘ĜàßNË bY`Z0BÖYF@”É2êRßZšlĞl²Ħ3jĞÍ}mŜÔĉX›Żjójħ³‡Ú£M–ħ=•耤9 ‚ó d–./Ò+L_%ñU-ĤöúZ† KC€Â_@]ƒ-Wċž_ ì,‘².{žëp/?'0ÑÏ56Ż\r7E›û<ú):x^rġ› ĴB7v²0Ë Ïr`]à˙ó Ï%ż˜ÓH?`Z_xSĈ.%ÈÔu·ši˜[ħ–²‚ Ü”Lk0_^à DTÒ!ŭ[Çrr,‚üĉéœĴ’ç{ž÷ŝz&öbÂl‡A„½eRU&…Ğ,/ßĠı.0J²s ŽÊX3µÜËfg´§öMJ—ċBŜàŭìË}é%ŭĠ.O­,‡zĴÓXL&áá 3bJu°6Ĵ;!ù.ÔËÏ+Ġq˜A' …ÀâAžò~ëħ:ÊĉQŜÖfaúh:/eo^È€axöíÒäK—eĉ˜sĞŬ?òdO‹!ä+B]>pXJÙ ĝĵO' uq Ñû V·>!҇Eôġ(Ÿ.IVQûúӘ/ä´n*”‰µK8ı++NxgBmfmòu:k£,—J8ÓügÙ ’ ŭÙ´Žp|è6›iu„UÔ!Eä3/êNHĥ¨íĝ+?]>ÀÒq"żhyLmRñduıá2H^ÓÏ!ì+05Àuê97g¸ċòFĤ²‹¸Œu£f’ò—³˙÷Á€áendstream endobj 339 0 obj << /Filter /FlateDecode /Length 5499 >> stream xœÍ\Ys\Çu~‡Uù (U."Íuï‹JŒ”DŽè2Ryü0† Ma@ɌË˙=çœîÛ}ş§ -ĤRzPW³o/gŭÎ2ĝñXÌòXàù˙gWGâĝâèÇ#I³ÇùgWÇÏN~ŭ 03GċñéĞ£ô‰<òĜ[?GmOŻŽ&srú'XëU³ÖÈYÇëOϏŸ;Y‰Ù İ…š^œà2˘ni:FïĠ´Ċéà˘ÓNË0-gĝÎÇéÍ áE˜ŜàÊ`ĤW8­cÖŭñô·x/âÄĴĴTËE~s²2FÏnQ…ŬT1À-î`,‚WAà•VÊéJNgġ”i{y²ÒZÍAZ¸”˜|hÜİîĝ+˜öÒIc§ ûHeĤîĦgÂô—Bğ0]×=òc\CU!ç tCU’¸ĝëÓ£ßş; ³×Ç?s˙í(S½VvŽêĝêÈ*à„2syô‡§²ßÍÑ£ È8;PŸŝo0ÒkàĜىrp‚ñÓë:™İ³vş˘ħVÚiH ˙€Ĵa݁§7§?[#——ŻQX˘"Nçámnêp7Ĵípĝĥç:ĵĦĦ a9†Û:ĵ³éME‘+²ù5‘Ë€|L.´˜ÖW(bAYïàÈ*b—¨Ö.bé+ÒÙY9%ÇR³w'8ÌĊ²xǤ é¤wÀB>”tÂ(ƒ’\½%QvB Y„SÏʃP’@Jmgéı@ĉ™ûÒß+.q´I™¸Œ‰YXhx6d*“Ĥ .7+¸Û,„Ëœ¤Ùwux7&yo†G\Öá?’XH ˘Âñé·G§˙ŭtUŻğİħè>xóC=¸nĈq]wĝKş£œVÇ+ş+˜ Žħ’ŭ8$֛áéì³ózänH1aŻ9Ê×C]U…,$ Óu(ë‚Êğ0ĉc=wüör]‡jĝی½F^ñûfx.;a;ĵc#Ġż û6=ÏĜiôž7ux9ä¤îߎŜ Ï}Ç)Îë‡ÈÀö=­÷CònĈš²j!wPµž×/ŝ³ŸĠá7uĝm~=7‰Ŝâ 1ŝ}xÂó‡ö’#ëUT俇›~W‡˙1ÜTġ›FT™ŝŠH³X n-çèŸb-ŸÂôßĤÂhĴp×ûDá˙ğ•%%{W‡ÌÊä· og{?Ĥ‰úÚŬğ†ŝŜ×áxí}FğS…èŞ*vJ7Ùġ„céĝ?S…^$…^×!ƒĠב áÀ˜üú;išpâ°Ù}Ĵ„›— b.ŝs=ĉrèŽ^òG•áz8Ëäâ‡İŽ?­Cvò‹á‡Â2|ÖëhÊC\†ŸÖá'EñĈOİŞ VuĥáMŝ<~ç]µ{žq;$6#ëe}Ĉ\‡/êpS‡·u¸Ğm^×áçËl>˜fÏë‹:”ü³…’ŸÁŜÁ’S‡ŬüjH³/†òUO†ŝ=o?”ħeövè£P]BĝŻ}\<ô÷u=³ñĴ‡ß÷žùo9YÒᝄG> ôìŝχ"};²ÓŜs úĝ=g½˜ŝpec+vu8×!Ûíġ³ñĠφ'o†Ÿċû;oéì%u(RA/ôxŠ"ŭĉ—gżŽQLhχWcĦíTfÌïŬCô½Ï2ö ŝg¸—Ĥ.Ÿ×KüÎŝW~ÛïcĤ½ô2‚;^¸ŠNöA3!ĝëF³nÎëĴݳv8ĞúYz†Ş.Àqc_fÙÚXg™7uV†²°jéƒRq„œ ùÀ°§ZñçCÙ߄]ġbĝÙ§ûQĉĜÚħáÍÉb<òİ7Ë0Â}Òm{bvñêSèĝ _ġÔìl.`vÖ8ç`Xvv™ù€r<6ö)/{zÔ„ÑÓĦ²ĈJŬ\oЍ†y5I,ÖròQÁg+X"„ŠİĴ ´Y2eƒUÊ>½aÔƒÉċ—òO6gu“rOu"ĞulŞ:”Oyq>}}˘<G orájMµ­£³žÌħ„ aİé:]FKìÑÁKçR ‚%ĤíUZĦ„;Ôc'ì’şgŭo/U€]ËŸ]²U/9˙Ma”İ*·TönÓĵ3Rĵ{ì0:‡Ħg­d)&>=n sËóşá¸aDğglı>/%’à @Â×ݎĵÒTDħ–&Ù/Òé;-){ĵŞêpWւñ)rF!00e6ĥÏàŻŻ‹ž§‚¤šĞĞè ĵQġ2 êPQ ÏUlT‡²v–Öĥ5á „pñ…¨3ĤK]ÖZBYUÁñFJA$|ZKĠÍĴË-:ĠY¨Ĥ0[„ġ"—,ƒEòљż} 6ÜUĵœŝTÏçœâœżËğH¸âĞ4‹ÓêG%2YŠTìÛĊ:Ĝ{$i…\`—ċ(JëZ’K܆#ѧħċgdËbjµ&Žï¸l2.\'%gĈVTÙdofG6ǜ×ì;Ĥ‰‘!èĉ´‹×è`;4 (^Z…9갈Ċiƒ9ÉĦ”!dM13ìÇ+d,"}Ż'A¤Íĉ́DIÏÙğωë:ˆĜˆÔyZŽ–)Ö É° :rosàğĴĤVĝ4ëIMÙwGîĴPpÄBeԑk/o…CÔ*ñ[3!ĥĦ‚ûÚ"MÂcíuĞè€^Q%Z˙ ĥpD£Ŭô9<BôYKô^ù EYK֟w%ëö8ÀDÎŝ–5Ĵ‰lÄcú §×}“Ew6PIJ“µä#\Ż>íí@ÖP[—M^Ĵ![%Pı܎5´ qÛ8tô×Ċé=ħ›Ş= /+W·ŻĞ:hÁĊ. ܏)é6M‚xÑġÁŞzBHĞÒï’[e˘•Ħk•İž˙2íÀ&?c"úîĝ+6½ß*B£Ĥċ~°bÍ/IáJ?cŸC[>yW=ÄbĊ„6½Ĥgg7ŭÌPf2&Ú+›İ-F`İC¸‡b„% ˚¸½bBܕßhŸü8p]qÍ;ƒÍkÎ+·Gèˆ+"“İe­ÙH¨ UӟA:*ÌâŬRwSgߑä%pHĴ̌§†”rÊc¤pğ ôÓٞX‘<óœpŽ“î7ĠxqŞ/Œ‘ïı³²uÙ¤q%ä4µ2àIì SĉtPsñd4Ù Bĉ¸  Ş1ÖF …FÜ·0B‘$‚ñŝ&²Ĉ€Ĵ–W­rP]ƒê4a3·uÈ*?MßËD`wµ+ñ_]{KpFêF½ĥyiPœjë]ĵĞF}}ÁĠx…UZĦZĵ‚žydĈpKĞb£›ŸTğx†w\ôğÀŬċZÎj ú°7AÛ5v¨Ġ¸"ž+Çà“qâ90ñĝ'É^”;½k€Ñ¨Ië<-ĥÙ˘ä³ ‰u£³ûx˜Ĥ<ĵİ÷ûw‰³šGÍìğójúĜÚl`%\<}'µ›3„‰›ŒÛP]¸?т½l+çéU6Ä%¸'×A6‘[à9¸&3:^²éáÙi÷žF;tBş ĤsIn*ĈĊMħNƒ)—ĉÒzÔı¤ŭĉ2G1éKpGW͒÷‘;u굚.|Jşd(•’.Ê= ŝlqì6DKdKäy€`˜É.@–Ħh)€M,³İħ &°%Ŝv†İçDĞ [ÊÜèèÇn–+-ÈĝĞ&ú[ŝ–|\ŜÔgŸè•?iĉîÚH² jçŒÊ§d…‰@kR­L Hœ6­ÖŸ/„ñӗĵQú›4/…czÊ=rJoEv]§Ê;„Zô˜ĴñÖo‘Ú`ÜíH ÒSZÖÄĈĠ ġžšaküU~ˆüÍç­JÔÀ3yüƒİ¸ġeMQÉQF88ÈËíŞħŸħŒ€ÑjœLR+µÁ€<–DjRÏEvsjšgğTϞ—Àm̽X³sÈztëyôħDĥ$Mù GÍċ&ßâLá;Aħ*··ojà1óe#Y´‰~,ÄK‹us GHĊ†3-Ŭ·ĠNiĊW0_ĥİ.S.ljÔżŠÖ]z7 ÁXĦĊ #çÉl4Š*[8;:XŭƒÓ…òd@/ˆÖLĥİÀ{ìDĥdÌáÒÏŝġ#fUv€Ì@Ŝç }çoT€b‘VĤI 5u™„ßUşœáy”Ĥq‘óıŜ;7xDts^¸—IwÈŜ¸ŭ\ ,·`İR„he‹óĉ(¨L×ŬùE—7 zr>ß SÛù‡†t£èInĴQë Í:Ĵ’HcĈížä5ÙĥD&dÜCD°•ïOJ€r“ÜŽk­K*’oŒê*cÖdW7{jÒĦf´’°˜8Ħ úFŻ=l…W˝y„ŸğwUÑhrŬÌÑûóIKÍB„†Ĥ|5{ĜX X:÷ŝÀK3kúˆçŒñˆ<ƒVgè9ŭ‚ÏĦ—_šTĈ%[â….è x–"¨¨r ˜Ôà` @wşŬäb“ ŭlâ,xÖó4½*A?P'd7ìµ2‡·É C½¸lMŠRi›ó˘$³ İR‰@Ki”kÎ<ĞWO&”[ç, „2%sòwYŭ-ÄC Ёٗškä”W… Ë!"£•ġĝ|rH˘ÈĈ' ç° Z×x8 ñ½ûú^Ġ3é[´ÊËŝ]1:"EÈ˙ ÂÔ>‹BNŞuğn„• Ùş|PE£{t‹@-Cyñ—/H ­ŒÙ î˙ô,Pbl°MÊùïÒŜò×gı{òf¸ÚP¨·ĝ„ê—tĠRˆT™ĉĊİÏrĝÈıžÀ=%Ò¤ÚÎÓĈNö-‰F*ÑÂÏˏġ÷“ğğ\7—3\İù;.<Ğż<ôĞì'ĞŬHVŬÔ·°2³6@ìjnŬEGÌ,bpÑáÂĠò2žÜúŠNN/}VÌ4˙2"s³B^P/u­Ċ¸ĊT–äm“ĤUHSpħeqŸz=Ħ—GBdïĴĴ–ö—mù/ÁċĦ~˙ÒSZcz'†ÓNÄCYÑOjäqŬŞ"í'É@ëżħ ·uß˙UÛË´BXĦı$³*°Û‹ë5ëlkšHòŽ2ñ H¤?Èe#ı¤ı·U5&I]²ÙMX:÷Ĵ –è)󈑽ĵ­Ä0‰òĥšÂŠòcF=“ÑsĝX™³·XŠü†.#(7™½­À…(€i”ĤĴéËĵ$Wö°ëz ïàIK9˜5ÊÒŞèeİĠEb—–päw˘°X/T|2ˆ`µLĈRxŠ•ċùÊúœv5ıùY“³Œ2@tk’!Éwâ×Ĥçä5/? e^ÍöÛ2š,żtœÌJQ€u­Š×Íù·$™ ʕ[ fGĵ4 ËVnt‚~’dÀdÍËodtĤ“•2ƒñV0·¤’—_„•žcËcƒ½bFqè[Yħ)kÁĵ;Ÿô5b]>:5?'3ï[ıòO°F­\£ŽgO5Ħ§ŝmÀtoÀ8{…ş&Í$€É5\_$]Ĉ†bÖşÏcB ĥğcĜĤt—{ĥ#·ú ĝ_Ë+£{Èni¤äÒXÚ!ŭ!Ĝ&ÔÚ~“°ĠAĴòR€µjĞ~èÁ „ r›z“Ĉ™ÖĊr/6€à'4'wĤ;µv÷‡İ˘ĴQ0gfÁ&-/ı:)µ•½hNƒÓÍ8‡ „Ìy ‚­\~g2 ïkTP3g›Ħ˙EĦŝċLJ|iRÀ¤.&+D™£Iµİ÷]k;ccüEQkpĊ+ŭ_ĴùPĵâÁjé˘X ı˘Hùħ/óÓbÛÁ ˆTúË´ Om™`ÊT5ì@÷6màeœëԃĝjOäÖDŻ”à÷f|ü.‰úĠ˙ž‚ĉCÓ§Íá%‰vAĊ-:êħ =L6]żíwY °Ĵ>hx@żXŝŭÑ˙•œrˆendstream endobj 340 0 obj << /Filter /FlateDecode /Length 7170 >> stream xœĊ][sıu~§÷äqʕޝÉîtwÀyIö’T\ÙllÉOëTe$R”vEMR’é_ŸsAèn’e§ü`ìËÁ9ßıúÓfÔfÄ˙ċ˙yq2nÎOŝt˘è×Mŝż—›ožŸü_†4&µyŝê„?Qí`lÚ†dÜĉùĊÉOÛïv0Ĥћ ĥo ­Ġh|Ü^ïöĈÑĈí/ğ½1z)mż‡VÙQĞí)vp)… Ħ=&™·gĝĞIÑ8ż}‹£.&½}AßyíÒöĝî ~öÊ(ùšjese¸Ż§…íuïêâqA£÷r‡öCŠÍGğ}V&Ĥ=ŝ²ÓaP1ĤµÜí˘ĥMĵ3Äío‰^ŜWŜ˘XÀq·‡Qa/;\òb\RÛħoLĵ=^@— ”÷i{S×ßÏ Çk£<^cÂàòóӓmĜ=˙9 é²·VmöĈ Ñ{ìġL MŜµyQ›gԄ•§íov{§ ĴÜo]ŭĦ6ßĠĉġbóP›wu°gġ×ÛÚ<Öĉ/µ)–óVVšżŜ!m”œMzóü?Nž˙OÄy?§µYöĥ†Âg‹T´y³¸‚eÚ\|*mJóŸkóĉ3‘É!?µyĴÍëÚ<ŻM&éŒŬ€uƒ›(üyS£ızRüYpí8ŽĈò-?j=$cd^”½ĴÍĞEŜ.Ż À êiĵnG'ĞAĤÎ%ŜàħĝµĠ“\'L riAÖ`ô=l`ÚĵŞŸ-mÀëÁ;M(ÈwV›‡Ú<]\5˘Ècä@š%/ďj{ÀƒTÉ'+Ñ„–š ë ÍĞHÛ2Ñċ LOÍQ żâ/e1ïxܐ$¤­F%ä÷£ĈµÑÈ£Iz[>ëñ ÀIŞ# ûÖċ´~O³0ğ%)5hÒ‘Ž—ğÒĴ;”ˆ-ğ£ìŒ0 ’IPF ë•€•BCêw;1 PÚÁĦ³\Jß0İ ÑĠ+²ÓŞc² }2£:АìS$ŜŒ>v›}A4Üŝ4d0!½éÚ2êĜĊ´câëĵµÑÁş.—ĠìNúÀ_„g\tŬñ:k`Ċ|ÍmUğY×zğŭÀŸ€ŞÜG1Ó£6ŬẜNÑÀ×ü]Pd‘UdlŽ…·<,]p*ŻÜFkäˆŭü"O~Ê"­^0XN _9ğf•Üd ï†ž“Á C‹Ëkää4Ò*ŽC 1ñ‰ZĝÈZĜ(pĈòa$5qIŒ.l³ĵA³êòD…¨…lGg2V†‰+|Â_ë“b„EÂ&œU£Ò¤ÒhE`ĉ<ßÙ|Îô/‰òc2‰ÙLh<žöwÓ9ÑV2‰@hùt…"›xö€Ĉh43jžò4ïv{!öH£(eµŸo=˜Ú1Ú‹•,A͜ĈŬ{Ċ'ôX gm§á€Cb9\²sNo˙+/9FO“ù똷‡ ,˙ “€&eĝñ ÛW™81İ8“d½Şhq à"ñËÎ9št{8Ï,+ÍÖ3ĦU+d•żË‘5˘úzz—€èk+”?ë5lğ?ŒÎ…€™ûFĠb ¨!qÍŻ ġ |#Mí‹ĵ[¨™Ë‘ċ˘7ÖöXTġ tVŒé$íYXëpB)ż#ËÎ˙ÀĞŝµäxÉcĦ^EvŞÇwUAŬrp×˙Kş$ƒÔ~ÄiÈ.J,ĵ’îê°uqŽĴ—@ÀËĦƒT£URVrZŬĥŞL~ŽŒı½§6KŜ^y:fíbBg|SEŠx÷§d: 6’Žŝ^0/wD0™×=cµ\èA¸½ùÁztĊŝ!Şİ÷ĈYÔiûsFĉ²ê;•ş·Ĉè1²ž‹Ŝg‹ÄÈ /„_İQŬĵ·86ÑÉs°jÜh;(ëZ,%²ħX'GŽ·ĠÀM–Ñ ´€@àgDˏ`r& aìL½ow  Jú+:`A¸żşŸWuPOKıyıHg@ĤÏt·¤&CíkĥfÑhȏÒü—ÎÄ%Eġşêá^-í9$|FŭxT˜ÉàCÌTâ27ĵl“Š9Jĝ£=šŬ§àÑÎòÊÌöV˜ï"T‡kĵ*”mÄët ôL C÷z‡j%I²+ı„Dsż…?ï=а‹&B1 èfB™ŝŞġ3`ĦWĠW‘~4;^ï›}É ­qô…oĦĴˆt˛DH½š1*iŻ#ğ Wïé$|*§;]qX¤Ĉwj'|†Žƒ?àk·=g?"޳%uÁHtgÛSİlS÷£eĠMÊĥ }u‹<ô0à1Áá„B£à0Z@í€cyġ‰Â§48<Ò˙&1Ñ ˜r¸Ĵq€ówĊG$£’ö!’_J}Ŝ{t|žHœB´CovŜÍş ʄ6Ò˘mħk)X-4¤Xé]5Ï/Ÿ/ËaË(ĝ§È!R I)ĝs¸İ:pf³+Ĵl|è§lné'ÛĉHs´{=YÖk!OĵĈEf"qşS–t8 =clŭ‚œžèlĉ’!3MĝŞœ4[Îx x膈r3ŭ§áŒÁ'Ë>ƒÓÚħäs\ıÌ1à;XI³Naê ˙‘B|;dT™5Mš4Z–ğ†7Ş'cT—Ç!Ó/˘ôcîxˆ˜üĊ²Ó!$ĉ”iàa‡ïĞ£Y1ïvKŜbÙ È5†{°Ĉèa˘h\ —)hĝ^ P@ÇeŠKĊhZ™çX2X?˜ š˜Y,ôs6î.§ç5':şµ Ú^µ*V?ár#L*EċnWTâ\‡ñrI\g§ÏÎ8;óJŒ/ZBŒo&h·ÂĵK˜á"rûc})à8™zYıíËÇ/$Už'+>Ú·ÜğaÒıyB“CpĊ<)#ƒJ[=9$ÄäŻ[MŝúD ‡¤ BJm UrÈLċ'öòrY,~òğÎ ğÍġzĉXéq†Ĉ&sl<†ŻôĈiôDsĉĜ°S?Şf†ġĦ;˘ í†Ñâ°\íyh ŠEç)ákJ˜¨8%È`À” àäóÚÏ$%#SyöydÊ8BS£óŜöĦ)ČMÔZúl÷‚ƒR‹?ÂĤʍzœ“ ½a§­ĵ(;³ "¤aB q‚BğÀëIĦá+!Â2–s*ĵrYsŸz\Ğ“zôöÓĠc6:ŒŞzÚ¤˘ûı0iVô@I‡ˆ(ßËI+Ċ.Ç·÷rp瞃µ·ƒvŝ#8Ĝv7Uɀ˚ ħ7×ëáN–’Bb2…ç’S=d›)—m–Ŭ]WÎ GCβRórjˆ¨‹ŭÜy÷%váC\>}y³8çumİÍCm]ì9Ĝbü^ ÖVê ö½5ˆÌ(ÂŞzj~Â7Q’Ÿ–ƒN W÷³”N@²òÇe0]‚üÇ-€çƒ˙UµĴOı¨76‚ä²>‘‘bö˙tj-†.ÌÙYHoĉ8 Ğbµp ĥŠA´Ĉe>exċ·˙ÊĊD™ħ8*zŝŬÎZKî~“ŭĉ8­ĥžcôŽ˘N[ĝ@힢Žñ SGjBO;c<)ġçó×Ğ+ۗ´FU‘BóeÚaŝhgžB; Be“i·öÇO ĊÉu g]n8³Š‹r GŝÍ`Fq+1YuÀ< Ú­YG.kdĤ˜Y°mì1q³7Ġ là/]|#ô>§­Yìóx ĵž‹HôA3ĵ #ÛŜ8²Cè·b>16‚aÒĉqNL•ްS-B˜i–NEÒ0í˙„ pŒŽËµ0Ùë^@gL †IÁÀ³9EĞ~]°!ċ: 1 ùœŽ†Ÿ³x4—vH íü1‘/ @¨Œ×ÓÙêµÀc&eŒV‰7G?ıÁI&VĈ u"#WM•M;Ĵĝ&+>àħëŞm‡  M @ı4XÓg‘¤‡/Œ/kĴoċë"â-"cÙ1Ş÷A\„‘{ß}úµuWĴŽ:œJÁÁ_Ájœy˙K>YEî?HîfĝÀŻ$íŠ9+„EìóŽ)/XAj™ĉıàèèւËeùTᄓÌó<%s(ùámež/“u3ž~Ê&Lj Ĥ–…q˜×‘qއi0Ҋ'1ß&ñìySġñQzB´lâg•tÚaM¨Ä<"u”á8§°Quyaħ›™}µ:l%pÌö+“k ¸‰ŭÇĜ”²•N PĠ5b7z)˜ĠwTáG:{HꞨ1vÀHfSŜ'ë<Ié+n£r<`ӂÀÙ{2Ĝîïq ½)`Ï ;ċ­hâbcœċŒMÎoFË1ard!usş1%ş™TI´Ġ32ŒW f*q4TßOÎQx]{<”û§‚żiœ£Ê{Ħx‹ùŝVüÎĊ[ 0×z³2€Î÷÷¸V‹rƒırx žÌJM/3}jé&XĵQôŒyCŸG*žŞuœw­Yg(XĤZ9™÷;`@*–„Üœòp.Ŝ—61AQdĊe[d]Ħ-Wġ熙(2qOÓ%è{|U[ô˘G‹ÀîE#_U}ó° \SB‹?ì*S-‡•+{-×_Og…;ö³ÙÖû ~œ×X‡ĥĦÊ—ŝú~ÜäİH/u²ƒ˘²ġy caïfS>Hj&t´ v¸×Ñ&j˘£­ŭSœE§@UŸú³8mîëYÇP˙§ÙwT²·PZA5@Ç"íïĞĠ°^ZÁ•£V€KÑâ"Â\ÈȆâÔkê+E‘äAD‰ÄĦTƒˆK]²`üƒPòĜ\Ŭ´_½ħœä×XFQ+?-ÉïÛb›•lÖrħÍ}ÉĴ&y}á&×ı7Ġ5Tpߊ.Ĉni6 ]x˘)Ş]£o‹]\cܛì5Ŭĥd>ÉoPÓĠ<ó>~ŞÑP!PĈOŸícSŝTħëRgħ„N!Dâúo_öíF_ĝh%ƒ*Љ„S ‰+“d y#ùoRÇw&'~™Fş.UŒĵ•(è%÷öc›C@G2D ‰$ ĴÎyރ–¤û<`Â$Yw%JH q‰MM•ĠbMĴ·zSġĞc‹<9ìRĠÚwA%"+$p­ZŞK"_hUh!*΋³&ùäd86Ö>ÖÂÜÊí£f7×3„ÙKIK‰ %lbAĝµ$ÚİÂâÏWÌNÈäÙ5÷ÇNÌ5Ĉ˘°­f‚´ŸptûŒħTŜŠ|Ğċ3XñG…Ħ²‚`ÂPĦ’Y5Dàá1ÉŬĵĊDé'ö²ÚÚT?ÙàÀžŸGo! ™Ŝ)‹ĵÔï6Ğ™ĊğœáÉ%=WXn¨)ıĥpW=ĈUúžgêŭX´ëĵ¸8ö—?°xNıÌc[żœ¸çUµV•ü ƒÈá76Ğ„…Ġ/Ô*Z.ĝ_Œd×47ËWŠĉM3¸Î–(H“ìpUĠ‰(ö9ïÜ>­ÎËoŠ0³‚ħËkd,^pù†éÉöù6úĴĤ4Š;ë LmÙÁúo+°Ĵü4BĤá^\Ż)Á:MW܌Ĝ6:üĜş Šù%ߒ‚Ô²kuìEȂ§Ö~lïÍ\dLeq–+ëÖk°‡½·8ÖZ2ÚÛ{J… Äú³–ÚÓÉñ5÷ŝŜómmMqÛü´6Á']êñ˘6îç üùËÚĵ­ÍݧËĝN&Eĥŝĵ6ßĠĉEmŠ).§àĴ-VL[_D´CvéŻRĵï°o‰ú ôĦÊĈ´¸œnFĤ6ĵXĜx”ÇéĞ—ċïêŭŭÖNŝ1d½Ĉû“Ż!Äρ!Ñeğ•r ĥĵ^Q?Ÿ>McşL×RíäÚäoÙJ 'ñ²v?ÇA‖ÁjĥK˘’•YŠ,hÔ^MMTğnŽiMèÚv•I ‘"QĵÊU§‘ôŭ=`= l¸Ë–ÙC`€}UqK)ŜÔ\ïżHdEß×µyĴÍS!½ÛÚŝ NUŻWĴVüJµÙ<ùާMü°Tw·jG,ÏM^Qĵl3ğÎ.jÈ<ĉÇŝ֞nDiV• ñBƒˆœ?hçP&‘>”òó‚Ĉ2D™ë“yÉ+×uC{ğğ*L?-ÏĤŝœG`sϐ³Áħ’żÇ̈Ĉ·Rìö[Ĉ\2ĥV'ZÛÚÒEݲ7áI×,ŭqzħ+Y>1ŜòŭĊ•ĝ@â¨pžÓ€Ĥ½L‚Ĵ˜ïŠĥ4£OëÁ—$jï}TµjÉı7²9~‰ĴzÇ=ĝ31o=ôk2Û'Ŭ*?O ĉ¤¤”‰Û y;%Ĥ͜`œĦ˜§ h%Ŭ‘ıÌt4™GµÇÍHO|°O‰LòˆQ['9ڛŞrovġU€Ğ£·*œ÷VĊI ÏGG=– lµXoj‘aĉXħʛÖŭyV™ÏS5‡(ƒ™…+Á‰2Dë9äŜàÂ)BxhD€Ç“)—Rĥ]&ŞxïLÔózwĵ{ì%;ÓHÏa†I_§sôòIËħÔĦ̃S:NÉ5P÷Jäu‘ž)^[6b˜˘jġMUç[òŠͰš2_„à>°´.^>çÊS÷‰á}ĥÖàÔùħEé½è…qSìğïjS˜…o›â-ñÎÖ.vX6ÎnM/Ì ıïŜ6†7Ï[ÓĵĊÇ)}ĥ/E)âéĦ—<ş.Ÿéuù2Wd&<ħ.nĠ^8.RÇŻFá;DkA˒2³|% ×óò÷%C|ȨÙñĉfe_žÈ֘Ħ3ġÑÎì cͳ<òŒ&•Ĝ]=GT‰ÍÓ.ӛ7j5{ĠÛ sU¸œŝ./¨ĝÇÉâ}µÊÁÌŜèö^_úÔŞ€nşĴKë6ڀj8İŭQËùVâĜ\ÎıßçèŸÄüêY 7_p,䭞VĈ­pœf"1ßûhĈŽÔ³Šc˜BQçdlZóItžxçAÑ= +w#Ġl5Ĉ]>‘ |„è“oí9‘6!X ,t­ĵì}5mĝ÷1.b Ŝ†ŭ3öéîġJ½ÂŠö<ˆĵÛO/\?|˜–8K‰àŻĴŝĥÒzq~üÊuÍ L͓S4KÒ÷x~ë—˙ĞM£ ğ°^#6KacĜ&=Îħ˙lĊo˜˙+@^*V…ë)2Hpäù†75[ܕÊu)Ÿ8(חÒċYžpM*ˆŬ†ú˜ZÏûâqˆYÈJBĠ aQŽSBĥR]öê6ı4GÉҜ.ĝĵ/IĊĞrHG2* Żò~‰5ôŻÍs˜òèˆùᘍŸ“H‰¸ŞÇÌc–r!yu˘ĉD–ŻwÏMˆw͊I?iċ˜Ö£™› ĤÓ|s<Ġ0UÌt5ÍüŽfëÔMFŒU[êc‘`öŜÊıˆ2ż;•׍ÁEÖú %Žìñ97•§Ä˘Î&üšJz’Şıö¤MvѲi €ëKpĜgіSxñH?ü˘°—÷üö:ƒ"ô·dÜhJŽJ×gÜYĞD§.F‰Yċá^É˙¸nW‚ğÚ!Š$! QsċÄ^.gùĜċ>ùÄhû,:ÚÇúr °u³„r¨j:t­ċŽä. 8HËıñiËQċ,GáÚ^³E§Ĥó?Ñ@HĴ 콓gÓîŠ y´ĥ°AëħIó?Ï<ıŝÉz.òµ`€ğvˆëé”"—şr9ïœ\v˙ÀŬÒrMoëfuĈlSgìDRß%pÚ·.µo0#ÙïHħè˜bóó-Ù 0ğoÄ#pcPJ>Á§3ô°q˘eT­ıĥĉ‚œv µIÒC ‘~!ğt‚³k„”Ĥğ£Ëqû³\+’M|ú$ç™ìݘĝfşu°½ŭwaCUR`xŽĠëëa/óùC°{§Ç‚“ñ~‚=Ĥl ö@Z;Ô[|ĥ3Wİfž Ù§gżNGyüçß´ˆSúwˆƒQ}ġˆ3Ĥ"܁ċ ̳ŠÄÄĠ”Jü‡Wîĝ+ ÏVè1U)vĝ(èÉ2s6 Xà£ ğí+QOù8°·Kı Ħ ŽË’{ËS‡ü.Ŭ ]' ŽğœFêtmÀáĥöè>Ü9ĵÂPŒĉğ ,>Ġb[|(j„EÎjâ3D-Ğ(wÒv('@£WUıÇ5Ŝíµ5B˙ĥ 2WŒùEĝi<r ‚„ԔûKmĈˆŞIR£Ä´˘j(¸ü ëח„Úáƒ8!Ÿ‰éZxïĜ–žgxœĈ¤ü°2†CB> stream xœ]P1Â0 ÜóŠü .4-HU–²0€:(CÓ(´żÇq tı³âsÑÇà'Y\Òho8IçCŸ5Îɢ|àÓQndïí´*f;˜(ŠîdâŭQRŬ˘ÏfÀâşŬ?•ː{|Ec1™DÑèÖ9-0ôÖnx¸5Ym4€X´Š3ˆI’£ĜUÙ­kÍ &é4ƒ$ŭĠ6l8ÜäpSiÉ*K$/ö]!ï˜Û~ËI;§„aâ“pċÜÔü]-Ž1OI‚ĝq~iWendstream endobj 342 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1064 >> stream xœ}RkLEŸ½e—ĊïlZ,Ŝ.%4Š\)mhˆVPêëäš“xÂñ†ğ‹Ç³ Ìĥ´–ĤPèD À…~Ħİ‘¤QÔVhO“ŞÁ’˙^†¨ ‘˜ÔÄL23˙dĉ÷ʏB>*DQ”_Ş.%?û5müö%ï§äp•ü›ĵz3ĴĤħÚçt¸ÏXĜƒA „ò DS”Í~&Ġd·”•”J˘>>1PÙ´˘6)éhŒx(>>I|Êh)+4T‹:ƒTjĴ2HÊP)f› ˌRŭΗäRI2‹‹³Z­ħ†ŞšX“äÙm”ÑZ&•ŠYĈ£ċ]c‘˜fŞ–Ä× UFqWjìî%ĠTe•ŒQg*2ZŞB\ŠÉ"Ġgd!‰2P6ÊAıèÒ˘ä§ĝE>¨Ŭ¨ *•MuŸŜÛĜ s.èsSŜ8ˆ áo ߢgħOm­3„b[ġŒ\ÄBΏàçY}é&ĦÏ Àı‚׸͈YâĞ!äs~úx™½¸Š£“²ŽF %ä;~ĉÈe‡Ö1aòµd ŻĜ§äPµ 0jZŝÎó°7ĉ &úh­Ü' òƒŭ°OCfˆ•?€ï Ïöƒo˙”0ş¸0z s›8ıĥÒFü̙‚”—S“ııJħÒ ‘” 4|u|×à'lwKkCä Żœĵzmìú7‡ġŻĵñVz…Ĥo“$·(vçħµw´7 yä.óâĥéqçRç$žÂKĝSÇ uä7s˜ ³íS—ž À\rÙ7C²—!›Ñ³q:ñ€;츃[e È%GnÇ„ûBZY:sĥG3z­ó\ï÷œžmаżÓlm,—,˜+À“ç?Ĉ]}B€7Äî’İE öŠöRr.Otğ:ŽŽVĦœè›ÓóRqXê;íìužn<úĴˆ4ŭ~èŜ{k—Ĉ_-jœìÉH;hÖ×ÁNg—³G€?”ô6Ü`vQrÓ0ğíÌwǙ?{˜swÜóŸá°ìÄŬíĤzG9nċŠÇG.OŽÎğLÓÇI°V—`Ó4D0ÇYEÂ7l&ÙĝŸ$½c _Ï4,(Ċ‹‚'iÀ"/°pB=ި[$LĜJd-d×|]Yä6Úĥ>Äzäugš1l‡Í•‚Ñ ³0GÂĤ&—Ċ .˜p‡xEˆŜZ'˙÷ù‡#žeìá‘=7I´f+è?\_ñ4žQ¸\˙rÍ:jv­?ğÔÖfnĞZ pĞÇÓ­żŭùBĥÛìۇšĈWßn²bNoŸ›î^ÂBhòŝRÒ8G˘†xâğƒ~,¨G ùġ­ñĊBQY^sĤÒgÍc>GÔ~ŭ Šuüendstream endobj 343 0 obj << /Filter /FlateDecode /Length 333 >> stream xœ]’Anƒ@ E÷œ‚0!`7ò&ŬdÑŞj{†ˆE²èíûŭ“tÑĊ·ô`,=ϸ8ž^OÓ¸ċĊÇ:ÇŻ´ċ8ġkşÎ·5ĤĵKçqÊveŜq{kĵ´KVßÚċûgI9¤áÎïí%ŸûCÍOğ{Sœût]ژÖv:§Ĵ Áša°,Mŭż_ċ˽£GËhL¨Y³o 5kŞÒ˜P•1ÀÊħ6X;˘ŻboĊŜŜ`ï8„YSCÑ*po p”1! Ħ Ô׆‘JÜJ`$´·1(Žc€ÇÎ`爛Ŝ†ĝmô…#ˆ É`rÄ4‰Ä'R*%Ġ%‚JIuI… RR]R!¨”T—T5¨ŽTJ˘ú+>ŸËÔWı yĵ­kš6î÷×bœÒߊ-óâ]9’ŭ> stream xœ½Wypg²!{ ˜À[‰Ĉ„…BÀ$ìrÄ90÷íĊˆ—Ë€ Ĉ’OɲċSĥŽ™éÑaI°ħ-ߖ/L` 7,aÉ&„ •l’ċÈBR!ËËıäċó{ġ>ÙŜ,•"İ}˙ĵRFŞšîéŻû׿ŝµŒ FÉd²á‹×Ĉ­™ü9Mš$“&=!çpâú@|(Œ’¨÷cÛĈĦ³c‘y R?FÉe²<“kqZznfòŜ}şÈ­Qż‰ÚMĉDÎY°`ŜÌÈ碢D.ÒŞ3“w'ĤFMÔíSkuä&2.mw²Z—;`½O§K_8{ĥÁ`˜•¨Íš•–ı÷ —™‘†dŬÈ ê,ufĥzOä²´T]äşD­:r0ÒYƒ·ĊiÚt½Nı6m:3•˘¨'RcҖ,ÍÌÒéWwċî^ğG½>)69.E£ıp$E­§ĤPħÔTjGm¤âİMÔ3Ô*†ZL%PK¨YÔRjE-§ĉPШıÔj-µŽMM’…Q*’)*„ê–ĊÈ?ĴS>K~'deÈ­Xz2}qĝŞáŸ3ËF„h–ö?#ad˙¨£u£/‡0f옏EK\¸tü’Ò'“bŻÈ‘ŭ]Qû%žRlĠ„QmM/ً5V-ËċZ’ŜœĤƒÍ`ĠDt‹çì-gùnáô¨).èĞ:hv¸ûġĴû˜û˜ç˜ĞË{òԉŽÖš.`×ĥĉóĊ%żc“ñV‹:ւ’ĝ´WÍŽöÀ]gKY/Ô*?LhY6+~QF*<°üè:ì—I7”£—VM5´C ôq5<èÁ̗Ï÷û"lY\‘Öš%ƒ!ħ4‰FO!ك/ïFŸŸëeżûü]¸ËÜ|ù Wa#Ş8ŠìvÑs”h}żĉ½ –Dá,žŽ?Q¤ċ@ƒìŽìqÔŠÖÒßÔ>·{vÌl†K\q³ċ“]şŽŽ$—ÜÈ­@ò?Ĉ~‡c+§|8… %R QhŞ W`³"m^9u¨ óŸaO]żêĴĤóF>ѕbjßJV³a£f30á'ĝ2ż,›/äèé˙Ëa)ĊĦeh5JEÏ?…Ĉà(Ż]<sŸ˙÷xĥцWĵ8™ŬµqñĤiÀÌ ˙uÈ@4Iô%?êê–uĉËĞQ…"“Ŝ„%Ä9Ààñ=ü:Ş ½C_é(Údàò9#ÛLCC3é‚gÒ²çó<ŭ²ş:]e'HbÇÒHĠžˆe…+‘'½HÚ‰&PÑoWš³9àùöıŝvk _´”zš7 Ċĵ‰‘ŝJ‡K“aŠîŬ‘#úLQû/É^°*³€g‚ˆÀÌċ²ÛqƒEm³.ô˙šxÜŜe‰É¨ÙËĊ {9“CŻ+*óUw˘zĥö‘{Ÿ# Ï3炁Ñ6›Ğš›ê;:Ó÷ĴNĜ´9K.İŠ}Òoëd·ÏĦ¸sri†ô‚Âî;8˜2ÎUjĦ0_UTB°ìoÛ…$SS’ĉü>ıFWod[u–%ÇJ.Á:&9sÉä„ĜZ4Ú˘jÀU&8.W‡'F%Àƒ1;mn—(Ö7¨Ê\ĠU.WKrŸé00hZ߃³}yÍıµljG†+|ğ7N3"ÜF˙Qw ˘ ùBàT%^ÁQ!–Ġ:HÌŸŭh~½ …“7KżV )ôPş­!ċÊ{vÓ3³9NñŸôvÜÂċ’ •3n”vœûğŞúíUU3™tQ _P˜QšŻÛ£&Ñt¸½BtŠnÒgIj”GeèW—ċR›´N&òAPrĵ-¸Ú˜-É\6›ÇY4›wîPĤ¤hL`b„:—X':ًèËGšôxĵMÏZÔĤ8ÈaÖùw~{÷ġÊËT˘P0+·Q•ğ³™#ĥÈĠj· Ğ\ïğˆB¤lżì".— ïp\ŝˆ|˘°Ò ]Lƒ,H](á „RĤ›>w´6àı<öċŝ-Ĉék@™ qnŬY§à0‡ZŭŬ-†möŽüĜĠâoßûĉokIç$7Hŭ²[òÀĉċ§çM[*ÎX÷·76µµäVe‰*ÏùŠ`ŜèĜúŞÉoX^àA'à<2f1/ŬÏ;y÷ÄĠjjÙL íê߯T9ŞDOÙ!/t)ĴZĞF”•µÏ¸˜)mGD@O£üò!ì=ëCIGe’ŝš ĴRàq@Ñ 5Lï˙ĴDÑéPŠv—ğïtŭž}&­ĈŠŝ51y1›w Ĵ9Vá8öšƒíŬ'ÛÎsô­ô'ÖÈÄlRl\ú6`ĉğœ˘—7\j‰>éş_ĈŬ–KRùĤ#í §ìfR!ĥÙ †Şîîĥ–ZKX<ÛV˘ÁÉğÁİì8 u*Ѩ½ŒVˆu …ŬbĈ`ŬŜ—Ġ£QŜĈ_ÛKD‚MÂy›gçféR’÷ï‚"ÈqèqVĥBÓbäéӌIğzR_żqñ+Ò&áRlq3êúĵ·YvċJż'—^”Ĉ+6óÖ]`b‚UjnĞ{íò⎕ĝ < O c‹ùÊWhâ4Úë1Û­_dQí_a˙ï€IXۃ(4é=4áğê‹üv6ü‡éƒƒêħrô]à)…µQÓ ŭ½@ ¤£J˜úrsöÀĵbçġsĥĴÒíSA9Äî=â){ĝà-ŜÔeŝĴepÎm÷ŠöSİ3T¤Ñ˙-sÙM ,‡2ŻËƒŝéŭï˙8*Ë÷:Ŝ…äsqđè%™ô0ÙôšÂ2ŸC,#îîJNgĊ5PúhÒ8šÎÛŭŠxHWÉ?˙2ŽöâSMò‰Pâñ8‡áixä­÷nœífMĞ‘âgiiU›‚ËÁ˜­Iښú*0{V6!ŞÎ…BO]eûΞk<̍ĈKp³ƒµÓ6 ŸìÍëÈMĝġ”§h Ν:‡j ŒAaѽ‹ñ$J 8äĉ 1o!ş–Àޤ”·™ĴŞßώ.&Ùĥ˘Qe=dp;=èù/4sž6è³-ĜA}K`~³ìû݌˙’š¤§h9F(ĵo$—ż‚Âch.ڎĥ ”ĞêWġOU<µ.šŬíFÏ^Eû—on÷–úĝëġ8faž;›]=…]ˈ¨AÉġ#œ#?‘#>8èbŒ |ê9éêhíU6´´ùüà…œ‡K+-ÖA.“çÍîhjí9şĞ~ÏKżeT•î°Ĥ˜·1ÑÁÒ˙ŽÇ×Ì;‹`ċ€´üÉĵwùÓ ĉڕFğQ„FJ—jfPçôµ ·ˆ |•uĦwèMDżú ğıè:žÄâï…a"ş^è#À{zxw¤ŜêŻÛôġKé/pÉĤ=löüû˘H£Ŭħ­ß8áô ĞçϨ³ÚÏúêòƒkż×lß_­é†3ÌGW?şƒä§^žl*!Oe‚ÒJ‡K´ġLI-²6İMŽnĦj…`·–ƒŽOßİ\9qLĴ íj95 ÖÚġC´[]YRhÈ)HĠħĝÉÈëRÖ/ôöÜŝڇsÙE6•&ÂP—ĝ–Ħ\7ħöÉċû<Ù³Şi›²Üè2Ac((ÍP›Vñ’½ZĦShċlĥBAYĈ ċ@Ħ²NYŞ’£żÌ1ˆ#8ôOó½Ċá$s‘Öŭë @$]‘Zхàìr@ Ü ˘7íÈPÙî,)ß³ ~Q~† F=oÌÏù'hÜĠšá<ßù›˙ŭoŬ˙‹ŸĦL ߀^y ğ‡Bähu­Âô\Âú­ğ8žˆ´ĥ¸ĴeĠhĜ·hL%ĵıE­KIÍİÌèİĞñzÜŞ`q 4bI:+)ĵ&Íŝ4­V_“ċïjëèPmÄStfVg'§kµşZ]Gğż› òúĴ˜ĝ‰\Ş ²ÚUv]ÂŞo]8u”µàâ½ĥl‹1²H­ħŜlWŬî­;tJ×çJ‡™€ÇlɍÌÁLDô?— г¨­Ö˜ D7C‘ú§ż´ p"‹·IIŠš{w^<„ÒZrR,EYdʨ/U‚ÍVÌsˆœL‡ĞÂBĉĠAQ˙ ͍”?endstream endobj 345 0 obj << /Filter /FlateDecode /Length 265 >> stream xœ]‘Anƒ0E÷>…o€!€ƒ„f“l²hUµ½€1ˆE "dÑÛ÷ϐtÑĊé1 ‹Óċ|ÉÓf‹uŽ_ĵÙ4ċqċûüX#ہŻS6eeÇ)nOÓoa1Ċé-,ß? [ĵÀi÷÷pâóuú¨Ü‡â<ò} ‘אŻlzç¨O‰ çñ_ĞôûОŻV)ÎĦš>â*4 ßœC…V¤@+QÌ5:ÛÈl[’â*Vğ­v¤@˘)N”I²h"Šżê=Vş†—5eŝğ½e^dÊó P´†úendstream endobj 346 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1489 >> stream xœ}SyPWßeÙ×ĠÁ 0Ğf´IĵZ•S´ jEQäjñl€” ÄˆE-I‡ rİëí´˘V­èT‚x•z;Ş­ÛúmĉᴋÚ˙:ŭgwßì|ßû4ċìDÑ4ͅFDG/óġŝž"Œ§… NÂû &JG­3ğ0ĜĊı|Šu‡:70ı‚z4ĊôւòP­.[Ÿ’Ĵ6(Öùĝ$Š_…ïÜısf(ü||ĉ*‚ÓUú”DFĦ4¨UéJƒxHSDkST†ì7#AjƒA7ÏÛÛh4z)Ó3ĵ´úä[f(Œ)µ"J•ĦÒgİ’K´ƒb2]xĠëŬ;T›Ë4¨ôŠm’JŻĦ(ÊM£ Ġé YáÊìÄHuTJôtŠZEER“¨ĠT4K}BM§B¨5TċK-£üİpjċBı‹BPÎTUAŬ§şƒv8y;Ù†YÊ1wœ§;Ç8wħž‚Y"TzaD'- 0B!\âˎà=¸–ëL?•ĥA)ĞícCÑôĦ8ö6: ĈCàÔrİK[Ž™âÍĥÈI‡ĝK"˜óşáE'ŬwÎŝÈup„˙ŭ„"žDJ> žSzƒ^Áx8’‘˘ç×­°?‡‘w˙|yi}Ô0âA\âÈëîwÓ0ö)Hrĝó+í1ċ˜#Kt$ƒLû¸×`ceӀĵâÚüuësa)q_ġXˆ„)°.Ÿ4%_”‹ÔH\=Ìî„ÁnZX3ÀÀ‚f6§!ħs0Ü@ó¨úƒ"–êĠëä{Ïħ‹˙Ú]ä´PÁ—î/*ŞŞ:Óxr· s]§?]DĜ“½—në*-*İÄĊr ŠÊùÙèŸàFÖòd¤%ĜÏbáĴ¨î1ğĝd·apµ=+­=só!8•px-Êô°í•I?{…1QU+Ĥm–¨˘?‘ú´ùÁ{ÚjŽ˙ ßs%I­ ÁÒĊŞó}:Ċ(î°çmj#ëŽëĦ Î|O ‰1³Â·<!1_2@àöó›d”œ#2íu8ûÔá>ìùÓċ˘Àà™D&­˙·‡ µŭgĈlm–ġ@7üvÏ˙—Ñ!!ë„jÒßâĥ­pGĵòDß îçžĝ_#2²ë힇è ô²àÀ…ôŠèHë0:OlS\ÌÒ°9d˘œLFÈ“1˜ú„€,:AĵÚâ7<‘8ô˜ż……HħAĦ5óšâ2 ³ïCê=FĝáÍÇ[[ğXĠ‡pĕ8i*J•7¨Žìl7ŬĜr f°e”éq‡*—ïÇ×ıëŭWŸġ´dŻ?#“8|TM'ĦYlí˜É ‡‡TS‡mĥ-x›œĜQ4³•;*v˜ÌÛ·še+É –4 mFl4Úpì(ŠĈ–B“œ­•ğ*öWW—È$²‘Îsl.#(ê!ùŠendstream endobj 347 0 obj << /Filter /FlateDecode /Length 631 >> stream xœ]Ô=nÛ@à^§à Diߏ ÛĜ‹A’ PäÒPaŠ ċ"·ÏÌÈN‘â [ĉğzy~Y.·n˙cğŽżÚ­›/Ë´µ÷ëÇ6ĥîÜ^/ËîpìĤËxûLú߆u·ú6Ĵż˙Ĵ­Ú|Ï߇·ĥ˙iŭA:Ü4^§öcۆċµíû>ÎsŬµeúï_§ŝŝ‹óüùĠħêúŸˆVuˆĈxŞ:ÄCĠ!>0žĞñÌ8VâÈ8UâÄĜŞħ1ÎU‡ˆ˘y}OÄCĠ!Q°¨daÉRŞħ0˘oQçÂÎĊĞÑ£êƒ1Ğ1+ pEÀB`Şq`„µÈ[è-À †ú&‚‘`¨o" †ú&‚‘`¨o" †ú&‚‘`¨o" †ú&‚‘`¨o" †ú&‚‘`¨o" †ú&‚‘`¨o" †ıL“'3hL"“s™&3Nf˜Ë4™q2‡Ġċuz8 tà\@'s@Ît8 tà\@'s@Ît—È)rh\"§ÈĦq‰œ"G}ÁIìÚ(¸Q ~ˆ$ê‡AB ~ˆ$ê‡AB ~ˆ$ê‡AB ~ˆ$ê‡AB`ŸFÁš(( hB˘ (  ‰‚˘À>Ħ‚p!`˜Ĝ'µQr£„5ċMz֔7éMXSŜ¤7aMy“Ŝ„5ċMz֔7éMXSŜ¤7aMy“Ŝ„5ċMz֔7éMXSŜ¤7K“À.Ä'_´Ż§‹ŸÉŻWħ?ĥ­-7½z+ùD^–öïı]Ż+ĠávĝìVendstream endobj 348 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6772 >> stream xœY\SWÛż1psŬ•xÔ÷^Ü­{ÑŞ¸*(ցâ@Ù+ {ĉ°‡ÈLĜKëVœ8‚Ú6ηĥZ[Ċj[ëhíûÄú½ß ßú ~ù'÷äœçüŸñ˙?'ʤ%D‹§MĠŭû‘v˜@;ĵ—öÂdĤŬ˙ÖŜ4­Ÿġ˘~&9G3Ón'‚Ç”P ˆˆÍZì&ñt÷Z9O5u'ù5Íjڜ9O´š>uê+[_7‰çNW?+W݇›ŻĞ” |ĴÖùïôt“†u~dž‡T`3eŠL&›ìê4Ù_â>_·ÊD+™§Ôj­[›$Äm—Ġ2?İĠ*W_7+½ħ“ġûûKŬ$VŝğÜ$~E­ĥġÛ¸ÈÓâ€%K%˂>•.ĥ ħ—ıŬħ2l§CĝUnŸí^íîħÖs—£÷zŸ N-Ü2ÁyâÖI“·M™1mş|FÔÌY³?ĥ9ÇfôÜO>¤¨‘ÔgÔjµš²ĦFSk¨1ÔZj,µŽG9RRëݏ¨ Ôxʉš@m¤QİMÔbjµ™ZBMĤĥPKİ)Ô2j*ġ)5ZNÙQ3({j&µ‚šE­¤fSÔÇÔ*ʚêC ĉQŭ¨O¨ŝÔ|j5ZH}@ ˘œ)3JLıPƒİmK ĦÌ) ʒRCİa”)5œâ¨ŜÔâEʄ £ŝDŜôú¸W…p 0QxÏdħÉyÓqĤô4ú¨H,*dú0ë˜Ï{ {ö×§İïìU}˙èÓïNY˙X9àôÀ!~÷ÁÜAĉƒÒÍfše‹ç‰ î;8{kv›?dÁÇĉÓÌ™ż´°ħXĥxi9Ĝr–ċFË,ËCw=:lİŞá֕˙èŭ7‚“qÏù%ü ĞVm#ĴF¸ŽhҖ–#ġïjÜÔh½„ ÑŜgÊÓ|Š@qn¸‡ÊBޤ(15&11E1Ġ¨„{M—V˘úrç+~7…ÙtĊ(Swòñ­Dükş¤ĠïMʏÎâ3‚Q$bbm0›F_ÇSlAwn mjGµÙs 8jÌĊ_ƒv0ۈŠvr‹è Y¨òÇqÛ6f…dŬ Šà·ÁRZ|üċƒgÎúĈaÙ.QçĵŬĵIĈó"éWÎÄ_/G.žĦĦLçŜZıZpPë"„c Ĥ 5-§‹tŸ D‘ü(:R‚|}*PżcM•¨Ħ^˘HU£"‚†~8[âÓ`:"ˆì]EŜŭ]żL’òOa ĵÁTüî#ŬÒ.BÔà˘6ûQ‘š--ÌԞdaŭ}ıƒ×oğñühÖû³×ʏEmÌíU°!´\gC*ĉk:ä´ĝM€D LŻ´ßÓlınSĈÛá‹!8úûúE.›w­žÉ“ĠµZpQUĦÖ|Ȏ“_`l2ùC<‹ž½ ×Ïż€‡]ñ,ÖÖáî³Ż_żyëšŭÔÉ mù!”,°š˜Ĵ˘‹Ş:OÑ ^9ŞäGâù°ŽUYV–Ô=$ĈĞhĝ_6Ċ+$˘ž÷ Ża% ĴÁ£Öĉއ4ĠĦ6T{-FUaIħ I\j2J’xĠnUn$Ĉ’# Ċöxż0˜ڟì B1qRä—Ê'|d´1Sgŭá£G´_ı°ĠĤÏO¨GLR)uçÂ5LQW]‘™Mœrl „½|éÜĠ;—͜°Ô~é'OqxĴÉa×£qˆÁóŸA §˙:b‹K˜'/~^—ZèöNwÔŝOqL÷ ù@á-°]3‹ĝòy0Ŭ3‚4˜?+˜3gÁxlÉcQÇIV+˙EĤ­$Ü{ ˆ…F'ıÓ ]ñ“£ÖŠ-Cċž(܍ ¨ÛQ½–`f2f"~½:Ñ\Ħâħ÷f#oÌ5xc3½ €]ğyÎ[ûOžŜ|{÷ĝ|;NÇÁjĜÖ ˜ıĉ¸Ĉ™€öçs5ëk°\ËÓûròùv‘Ŝ‚· +EâsÑÑ´•—qÏşGìà°9lƒÔ t( ŜŻsw[Ԑ˜ïÉuô6d`½qIXöÈ\|$°Šŭéò/ŸK *‘U!Ĥ\Y\£Œ>b½qEĜJG^üġ~ŭR¸—!ï6 İŠ…]ğxé^‚×NÎ(„PËÂpú½ĥ/Èxíƒ ˆìë{yv²h'ş;EÍnİ!Zí£6ż‚3ËJ3e’,żÌO çLucÏßúfpiáéá ]!Ĵé²#(YžÊmSmCĦÄÇssܧĵ *çĊÏZ⿍Ú0t÷nŻİÎëöܓpIÉ{£ó?^$ġyĊiÍ\‹ûıÔZÚÓż;Ċ‹_Ħß1ĞòÎb:Óf¨á)Ÿ¨&aµÜĜJ]yìĞŻÄ#t46Ùìĵ16 €‚q0éÛßî5]•bŞ„Oώî2ĝN›C’b<#9úEÄĉ~£ñ0l‡WŝŽ-ĦïĊ#ġJ>ÉôHëáùJŭ›R sút⠉–fÁڀ!ĥ~@÷Dڜ™zjĠàÇ8…ž•ûí;÷ĥ—"•‡—"$œS8Ĵ•"f>:[ĊĠeÁ# xڑWe´ĥÑа ö—wŸöpAU‡\b½[ÚBÀ‡Hè÷>}8ê"ğ›CáÏF6Í[…Js›.ê\ÎğÀş3ĥŜ!MOBÓl˘½çĦ}Tˆŝ>#ž  şÍ‰C£ù͵Ì;%NëXˆ2ʁƒ†¤ŞCŽ)£ñA£y”Îòä³pW-¨Ôµ‹ˆ_êÀém8p-ĝ.À]ÓÚwfôVOƒ?+T"²,ChÏ>}jSԂ›í°Œĝfħ´b€Á°“éÙs’B· j?.3+3 3•ĦJ‰48Ò{ċÎ/ÛïŸ˙QLÉ*°Ġ€P-(ÖĈµ[u&ĞÈzA(ŒÔW:,¨S ”ñ-ô&|ĈTA'WGˆ>v5eŠ% œ’°sÉ2FA;ÁÓ½2’˘žĞP=·gJ3"!ËC(#ŻT]ġ8­0£œI£³œšqïÌĝ‚RT€šQFqf9Óí˙iê—j³ šííà@b DÛĞ‘-÷98ˆ˜Ú.BuÍʈçÁGtsŭCğÙŝˍë7µĴs4Äé³V!˜ŻĠŜb£÷Ef ĉS#ÂÔQbÏè#ÎÓú§Ñ°²#eŻGħ˘YÖdäµÙU˘ž#Œ‰Ġ_ђ†_ÁjÁ T çÁ:VU†š^ñ+‚ûNGԀWc‹“OŞtĦŸšÀo\珢…§#~`Ò°…·/_¸H%ÉÍôô­¨!ĞzÀ%Ž„Ôb쀏â#Şp€•ċ5p„;p.;ITѧ£Ï GèjC_í9ħ÷rCÁt5Ċ98“V!´$f}ÌşÀé¨'`É땚珄­“0ŒRkÀIúŜ—¨žKÎÛĠ¤Ĵ(½2E̝żu&·aœAÏĵÂmc¸¸ÒÀĊcğdëJ5ş$U*•ÔHĠµ—ÀÜ~òì™í,âħÔHOwȍ4;°†Ċ|i­Üäú—£Ë6lĜlñ…Š„]ۋÀÖ+fu—Bu:ċóKkn™‹˙rXÂw=yîâħcgÏqŜ°vÛ6'~š›‘zPڂ˜§·oµ×ÇĠ…×òŞ‚Ê̽iÙ ùˆ)İ(¨ĞmX³Yáı•ĜQĥ1“–,œ½½ÄĞ(”c*&".Ĝw(ò(”äEÛş OQ 3ëÍ* ƒß´}ßvzc •Z> 1Kéx…âÓ#Q"Š.Œ)T(Q:ÊL/ÌÌg /ʎ[xôXi^c£’Ż*ÎC·ÓĤhÖĥ…ÛÇuUÎìtÊ/Ħvœ`u×ËuWĴzO™—˙/7˙{ }ĞğİĞÏ0#ÚÓNŞQ’̍€İ¤äߢŸ[½e³Ëšİüb½Ù/šËÔè0󂸇—ŝ˙d§->}HzÔè_‚‚‘+²GeŜ%µûsµò‹ƒ¤e&rĜWÁǧî÷G'Î]Eıq\tT%ßÓş÷_šÛËeÄgĤÊê[Ş‘FÁhŠÛp£x:eˆ§‘´ĝ•6Ġ¤6¸Üß?8Ĝßż<¸ĥĥĵĵ–ëN=³³×ĦĝşÛuŬâ-PÖ&~'C3§íĞçùoÎĴÙÉıÖ$Q”*JŜ]Ŭ ĥèl_ʳ ó¸Cêˆk¤}an=nżĉ~$z/żP@Î'Œĝ•Mİk[:iyĤċÔMèS4É'›ËŜ“¨ìnG,ô-TR¸o<·£i} iG„ çÍ^~Âîğ ÒBe*žK S˜%@œjóN(ŜhMz ˜N÷d) é˜D£päèàĉCd–ŠNL'?ċ0µÒ’ip¸ß‚_Ñasú]ÄÏ´ż½}‰­Ö€,ş•şĊ{ZÍaz Yd s`Ù!w2jîm˙£çÔW¤¤"ġjĠéĞ\‚È´ÉHßO6Ò4ž'šÂŭ†ö†ŞŜÒ!ßlÔĜµĥ›ïÓßŜ!Ù7EUĜ Mò>tĵżĞ3ŝ‡ĵgŠŝ‰ĥ²srÚ`ö_üTŻ“œï›ġ‚ĈMyùòÑSÈŭg›óċğêLŬ!¤żaĈŒjò…ñ*x*ĠFêíëÔÁş}Çè·UĦ&~>µ!tAÂvpjJ.‰kݵ´húÛÌ$Ü:JòŬŠQ²ĴAe(Żı'ÁĠfçZĦŻîğ„hǰİġ2†oÇq›È=¤Ğœ<Ö#‚ÜyĝT$ni?|òpEa¸=‡ċ˘îšs÷I˙ç”$˘žîğ#j—?ıßżÔ 1âûŜÈWÌtb5°B-Ĝ£UµŝŽ=ŬÂtžQE˘·áâW%8)ü ‰×œa³";BŠâH%Cħ¤ƒrĈÎIDĦ,EYÂy'­•ħ̜§—éµ(O£ou(³<*IŻd™GÄO2#çrOBV ÖXP„g‘z8n7ĉñ°İ‘ħñI(’‰Ï–UĠÁv°€<½`=£&ÒòŒZpĴġÇVXÚ*Ԏֆħ)éĜ̵Ÿ…Mqß6wZ~9ĥ×Dà%x8i6Ìñrü) À–`ġäáĊşZž‚bcyo·ORc¨ñ@ÁHĝèĠëßjÇŞàWà›Ĵ³ë•{O\8rüĜ—µÛuÜd­~;ŠD°„äÇgoû³†è´£½âĵùżVˆ|²c÷s`gıߎÒĊî}|rĉ8d7H@% #é‚&ÔÔ䁢y<FѨÉyDsx)Š&˙z4ĦžˆûQt4òh"“ t@XĞŜJ•‚KډBüv ›”_ŒYdxX|flF"˙ú4+67ĵY*‹JJs“óS²;/&yU”àA*3p†ħ+齛2ĜHçˆèäĜ”°$$c"‹ÂK_Ÿ‡^ê]ŸoÛ)ġġvĞ“ìËÎIKÏá ȉC/ĵѕÂvF%gâ_£D£ħ"…Ê‚VíTĦv9şáÜ7éžsêÒ ˆmƒ„pŻmö­öv“ĝĝìl1 ÉŬ½OġÎîê‰Bŭ9G_>óËŬ£‡ĥž¸†e ßĜğxî3oÎìŬµ1%ŞŠ’Ú‚¤½q9\щ“ óàë­3–n^cçĝ> IİEǝêĥTŻÌô@L8İšeɄ'¸T‚›ƒÉéwy•óNuFÉ ^&"tïŽÇ¤vBIl,yô³ò~Ÿ–N£Zĉ‰ˆ€Vt ĝ@Ñİ´J½OêƒÒbù 4Ü+=µµëÊ5ŭŠî‹˘cퟵC€f'QϵBxÄĥ¨½ˆÎ3w}‰E¸ßÒ-ËĵŞäJŬy óS2¸††›şĞŸŻNğğĝFzóŜ’T÷Եɑù1âßtÙÁ _œYfĠş•SwÎßs2ÏÊÊ!]eÏMÙôçkˆ 0˙ŝé3NüŬtlWݳI ŭìŻ›=‚ßÌĊßkí´˙d‹#‹#b“8_˙À9İìñyQQ{e*O€ü#¤á²Hż`ĈDEïÉÎÊÎáêkĞ‹ Q>‘—{£÷F)Cö£T[\Q˘,Ş+G]LHݵ½•‚ş i„6. ’ᕗÀAĤŒ´îrCœ8uÏ0úŜûr=9:%)˘d žÛÁ° ×Ĥĝµ¨äևÀİaŸí4  ˙ 굖Ĵږ°#˜µ`èFqıĜâ2Q’6–ffċçr5‡K/‚üóÁñEös—|öħ˙ŠÜ ŝÑÜ‚h´8$Ò7n—ġ`ƒ^<!'ŝ×Ğùżŭ÷rsÌ!Ĵ˙ È۝:żü~d aÄO£ŭ¨8&+‰ü$ƒJeĠUʒú÷óIYŠûcNüǂɢ ĝġ!ôzF;îĊ‰µNÈ)ÜeVĝ0kvµÈÔİيìÔl!E&"?iyî7J‘“ZBÔhەÓ˙ĵnıí,ğµ‹;ÍRi› ×i.’zԟ;ĥĊ+=q½9òj*)ÙSÇeA3L‚EêËÊÒôtTÈè"ŽN,Ó]%z˘àPŜµK‰–uİ|HWVÒGŬ×Sş+îçPì"‡­g[O}sïâ§µÛñßĝ°ßÖoA™³ïá¸ßÇól֞ĜôM 'ŝmaȊĠ ‡Ž6ÙÓÇÏïÚ_ĥUqóp#kmתQ_şúӋ+W-³[gŬYüïIÁżİ¨+ÔÏ~ŝ›ş÷oJ{Í8é™…B‘_LĈĥ½x›EZdFH-İ“Yi%:§o˙ßgè3§ š‰ç4NíuO—£ĦšĊ|òá"rÜÓBŠ3³²²Q SĤ ”ÈÂ}½K—Ġ‚¤Ö ĜL\‰X¨™ˆ…c­‰/éÇӁ¸îùYtĥäĝaÎdm6|yçÑÍÖ[Gk²bÚĞ`#ékSİ( %eF 8ĈqŭZkNO^`g 0­Éß _6yĞYĞ.Ğï<LJmđf—­h˙^ŭ⎎ ˙RÁ ¨cżˆ:ê‚6˘.Î+b˜UÁâH‘KöŽòÈ3ٙùı¨‚İ *‘Ċı'oµ4˜n·#k¨GUĊÜA (;óşZü_à15ŒĝżÎÁ.ÑäÓòâDgE£(†´A5ŞÊ‚ĉŻoá>ù\sgĉƒ$œ›÷ŠZħÙ˘ lLÁ<ĉ†ÉÚü têÔĦĥ|F/+ vž]',­ĴûÚì½ç?[ŬaÂF­w ŒOL‘' ˆNÁQŝËy0ù·ÑÍ=ßÓżÄ£E 8ŬxpCpPë(Ô:ÀKĥ`ĦûŬHΓB›ŭ>4zƒ'²…Í䉗NüIG{‘'ÍDJÔ§­î‹¤ġ,*JÈ +À<Ü –L˃À‹÷äd˘"&7I臷c œ‡ûž˜Ö´‰;·èî: ĠYÊ\~×Ç$Ìż_oŠúoîÇÛÒendstream endobj 349 0 obj << /Filter /FlateDecode /Length 360 >> stream xœ]“Anƒ0E÷œ‚€'R4›d“EĞŞíÀ˜ˆE²èí óİT$žäm> stream xœĞ˙˙˙˙ syendstream endobj 351 0 obj << /Filter /FlateDecode /Length 7122 >> stream xœĠzy|Uĥ˙½÷Ô­µ·êt'dï,M’I@i#;ÊY4@ˆ€ ›0Q„ ‹m ƒ¨cdpßğ AžÏˆŒ·ÜĵSŬ‰àĵùmŭ>żTuĠ­ċž{î÷|Ï÷TšPBˆFÊ×ä'Ÿ‘iñyĜ²‰*Šg>üĜĴîON'„á1Ùó£ ŠIè£Ŝ $öüÔ)‹nž;µ– 6ö˜Š ĥ <ŒÇİS{b~ĝzÜĴtĈä‰áÔS¸ŝĜÄù35ò,ĵŝQ<ö͜=efċï¸ Ë áSi. ’3¸ĵIv“MtYŭÏ–jv,&sħċ-z†V°Ĝĥƒ\'á•ċä ì–Jr°•‹œ‘t9„ÏÈ£š§È‘†K‡¤û¤ tU:GzJs¤sRĦ4‡ĉÀV>†ïÀ5Ŝfnrš$’ ŭŒÌ!Gàkȁ:İżä ŸÁ9ĜM`/>˙ YIĥ‘´ĊCgRVÂüÙˆË <ŽnĤĦuGèsäYL6Ó 83äGòŒb8ĉVŒöŸÄgû7’9á¨NËÀĥC֜IĦm{£u\LàĜ­Äz:›'ÒŬäkİP™„Ï~ÛöyˆŬ‡#*&u¸Î“]8Ĥ>t1T ÖÙxrN*eâŭĝeŽšKĤ^ ÙG’PEVâ“B•{òñÎMÒ8ĉ•tû‘œƒŝ$K××ÄCH!Ż)2—€QÒĊçŞaŝ!E5c}§Ĉ%uíò‡>—âĞ!5ö`kkÁX)–Ğáq5àWk$Ê˙³“_tí2Ĵ`ĴŻĤe@˙ĥ§(ìm#Çâu„ÍĜ> èœĠi ÷ߐÂßäİç]ϧô~Ŝ5wW ÷c"žû—?}Ü4Â>Ûjùͧc¨#Œ"d*ħF\dQ ‘ĵ,ż + ´Ŝä_üs6üT?:à7ü§wÀßĞàş{ŝ.ŝ€kUm46Á7Mî ˙žW|• WFò+U€6Œ„Ë_fòËMe&|!àsŸe˙À§UpIÀ'nĝ·Epñ(üMÀÇxùNjàÂùAüÂ"8?>ú0–$àXĝ@ÀûŜ€sUpöL?+àLĵ“ §œXlòqv$Ô xKÀ_ĵ)à Ż 8.à˜€:G1Ħv‰Ÿ× v”ĵvxí(ĵV&ŝ‹Ÿžh…é/~8$àĠ*8(à€€ûì+‚?;`ï?ß[{vğù?ìv.4zW슀ĥğa›€?mu?eVüħŞñ’ê*Ĝ"`óË6YÀË6ĜôR4ßT/mtñ—˘a£ 6è°^Àş*;_' Ê•xSeĴ]àk;ÁĴn‚Wċ/ Xµr_uV•I+_ó•`e@zÁ+,_֍/°Ĵ<|ŝ.¨Xj ,5 ʋ` zj‰›/ž{ÖäÏ xքg” (h}zÑ"ŝ´€E‹`a”Œòò?<%`€ù˜gƒ'u˜+à‰&˜Ó³›`VÌ0CÀM‚GL7óùô‘0MÀÔE0 ˜" HÀd“Lì …M  &x@ÀxĈê|\ŒĠáŝÈh~6Œ0{£ĵ0’şĝÈpŸF à#{ïuñáîuÁ=†á™a†qñĦ0$Ŝ·¸`° XŞ ż€ğYW~wä…ğ†A@@?wŜáĉwzàŽN~‡úöħóV'ôħCoyzġô^M³‡‹÷ô@\ƒ÷pAŬ ÇÙż3xĥ€ß•i,;d­ĞĈğı Ğ]²!£³ŸgAçt7ïì‡t7tJóóNwAš:ú ŜÑ ~R¤HvBŽ3É "Hl‚BBÄÛ!=' ĥ bò!˘t(‚(ôT”€Hĵ)2ĵ<"¸ñ·Çjĉƒk8‹À!Àn‹äv6ĵÚ †Ŭš/S(‹@“"À Ĝ ™ÏĊYW . h-^A3ŝĝ˙×ü/?ñÈĵĊ˘J*ĉÛPġ($&`“nù&Uy)“HfŭùĈß×ùĈóYf’éO2“Š%Ò<b›Żˆ*Ċñó÷³ċtäòòÖËÒVÌÀiäé@_ğ9 –˜ jLÑYbbBn$$J^JĵôĴíPiJ•d­˙Esy§ŬHŒUHrl´£ĞíIîäşTßĜÜĜ`şóƒ]7Ühht]ûñšë„•—…ÉHq9ĊŬĥŻqɝé”N8œ˜ž™ŝût˜@½ŬhJ²ìġD&ÒêġHIÉÓrhNvÜî3i7šÛ=5';R<çìCÛ_·İ/˙U|*N˙Ĵ¤qöŸëÊ7–|ùúaÚżñmo÷ìQöää)‰Ñ_ü<+óŭ—>ŭĝÂÄ]ßĜs˘Ħ#Ê2 Ç]ŠZÁCbÉÌ@*ñRm‰ş”{wQ^k£G;Ôşƒĥċqħ^ĤzU2Œıâ\͍7ëq€ĦÑ56¸ár6dÒûĊÏŒŻŽ?ŝz<ïGúÑ~ĴŸ·_,ï˘dŞ™Z}™Ag°ŜħڄYǚXO݃Ĥĝˆé"9ÙD _‘J›Úν6ŭä¤Éï?"nˆ“4½ùKŞÙökìÁñÇOvïŻsڋê4‚Ŝ->­_whßf+wÁ,\„cŠ =Ñ pPıÜamu:e*n×Tc ‡‘}Á‘Ù·áF}£éĈÙ9Tè}ÏË.3ĊìŜњÜÉñŜI-.ĴÜ[[›˙êÜ7O°m-`›·l>­\*Ü7èğ6_Ž—=¨âHŻ@tL-qxjışÜ¤ë J"*dşñ!fgc׍V×úkY‡ ÊŞÀê;ÇLÉE$³?"İ'2<÷hl {XxĤ•´žYx ċä+ĞWïÜızġ+p˜=ĝK΢‰´?Uqé?QxÏ\½zWônjÖËpŭ‘Fĥa{d´GŜ‚6YB+$ÏoE‡ZSŞġoaûXĠĦ¨žä\ÍġH·cğÑ%~¸ĉúášû·Ĝn‡6ICh‹ÓŒ8[7@£‹­ÖGïcôħ>â£İĴ“ŜÉè‘éÉôvŽì”)1Ŭ—ž”šĥD_b,ħ-ħğQeQĈd]6Àvp€\ 1 qRĵ––™Ŝ/ŭĦôÒô²ôUéĠé×Ó;L ­"9ċżQô-,s|EĊ¤µŭê·˙ô·ño=Z|bâ³Ë§ì ìY˙ùğĊ‡¤~û:u5*0$ÉÑyCĊĤ))ÇssǍVàwĤV>ğyo‚CxƒĦè_“d<²Ħ‚#¨Ġ)şĴu Ûò›5ŬèŻúóg­@9Tħ%ÂBZĜÎ[0‹‚Ħ‰Cşlzĥĥ÷‘ĊŬâàÛĈ˘Ëí°8 o=ŝe[hÎlĵѧÉÌËË:¸ßK­HLò&Ħ}¨;ÎE rL:–ˆĊĉ;vaky9ŞÏżlİqˇĴp%½3Œ‡Lìûgä2.Ç]ÔĤî’i9YçëtĦEŞŬi܃ŬĞÑG­Ċ™ ô7ĴĈÚo}£×¸Yġî] Ù͘A²ñ ‹x ĵĠ^+MàŒĊSËÂË2 ÏìçšÉ÷ÒLñAmMÍc²gCÁÔÉ+›3ვîi§ı!ÜD‘ĦıÖMjmA÷òšÛ9ÜŜBxi lDJJżèR"—*jİVŞ—%ĥR{İ£ÔYê*5KÜĠÑ×£MôS(Â0JËĥX<%ÙÚ²9k÷îİ\³wïšëÔ-]˙ğĝŽšÙĠÓ§Żŝûİ“_o§D£ĝ‰=ùÛC{…°S‚6vEuâ'u´èD#Js]Qr­ô-I<W›‚Ôe#QÁâñDP=:˘ŬgÏ#͐ên4ß°°îşfĉ™yV^z<+>+!+1˗•”•Ü/-H$|¤@rA|ABAbŻ İ ı mfÚâĝò„òÄr_yÒâäUiĠi×ÓÚomżİŭ†Â„ÂÄB_aÒ̄™‰3}3“ÊÊË|eI&Üĉ•;hÏvZ“”6%7îìĝg{Ÿ™ħĦ6ìW·t›”½²¨)ÇÇ˙çu–S\2iÎĊCé÷´<³ğxâ›[½á.]Ö­Ûî´´f gsZ/óe¨YâI^ÀGx,­„ĜJĠŭGsŸ·Òñ˘ş<‘8³ğ”Ó!Úp% ‹ššë“kñöùkÔŭfRn’)Káô›”-EYÔÙvCzKfîıâĞjħUÌËèƒĞİ2cfó2qM|‹³ĉ~dçú⎖ґ£éú}œn<_*ïŠćâ]?ù5‡âĦûoóñşžۉà`a8oÏĈĉ˙&˞–ÍV:Ĉ~ßÄÍìHòkd£H8öb…zVÀîâ^À ùL~ËH6H1oƒ²ç—ĈPŭߚÏò xo׀‡ÄPFY Èg[È3#2ëC)Fc8ïño­u\2ÍĦ)LŬŬòón~á—ÇHÓGŻ·!Ĥ]an×AÇrz êâQ ݃_gg‡#°Ħ]ü†Żŭżf œ!fñaĜ3!¤Ñ9˜5”œ%­­gK°^ÈŜŻXëΖ}²ğh˘¨?R7‘~Ó.ÂöaÌmC?aŬҞO–;ƒħë˘1 e”ÛĴkÓ-'~£[n7ä6Óĵh1\i·ċ…[ö­ŭ5“°ûn³Żh'Zn›?…dòqéİcœŞ¨"u‡óF3NĤáÒZV¨ÍÔxx*ÑKÖtƒRáÍjÙóµ5§§q³&4§Ŭ^#û#’dQ°Ë˘]bQp4`ÏjÇJ…ËĦž~ç~Ħ)zò(\ĊùŒ&ŭħ¨›–JŽ%öş›˘œb· ö ˆq57d·³İ¸aÉ$´ÔëŠ-‹][Ëémbż]'‡#/ıàĠ'^-xyĝ½Û'´ˆiW*Ŝ*ċîÍȸ|îÜċŒŒŬİİèhuÓŜ)Ħ8ğĴT*$2ıHSâ3)Ö0™ÈÔ$DÎg@^ç2ǂ”KDqoKA$œ‚<£†ĠxG=`5Xy¨>*”³ónĦ\m[Chĵ0˜Mg%Ĵ”-aeìEĥİVGh¨(½4b¤Ž¤#M‡tɧĉ’\ÚzKYê@2!Ò@>X¨cÈ:ĈIj1)ĤÓ`šô0Ÿ*ŞsÉ´J¤ıü)y1YL+ BŞàKä*RE×ħ°^ZÏ×É;ù+rú†ú™ÚŞŜ‰â/"G³‚Ž·èƒôÁ·Äš¤ÂĉQ°÷fuëˆ> 1X?ÈĠTtÙ ¸)I/KÄ ’·RóTڟ1$.ƒİ‘¸H×££%³ŸG³IĦ8@E‡× éàÌ7PğóĴċv6kà@‚óŸŠ œpʙ JÈ7‰EŸĝİŸu„4ı£ÒQí¨ùzl ÈĤòı8òyKċÊzy½’ˆcC1‘Ŭh†EŠIH”ĥX0„Ĵ¸ĞäÎs_şlŝwè)JšŸkİĞ++W³şÈUO‹İ´´jRKżñßVażoıVŝÜs‹Û}Rƒ>QQÁv xIö ­tİÌmÏ&qšä)3ĴûQ)5"7G„¸9'œ+üIĦo,e×Ü ı4Q|!Έ|ş…¤UbŞ(yĉÍy´ Ŝ.4j‡X'ÊÄÓ˘*„Ûŝ„(;°- á12×tMŠÑ5ˆÑ !÷Α˘*8G\U Î6ĵálË×9È~CµşĤ†_2£·ğΟ i";êŸâ÷×ïUŻ8Ĵıú^f2g:jŬ­wâİşOż“ŬÉğëYú=ì^žŻôqˆúGĝzĦna!/ċezĞäñ ј D’q²1 E#š¤ë6âˆŻäU£m.‡OJâ>Ù§ĝÔ-U÷>‡Ïїġ†\)‡gİ=´<£Ÿ-ËaĊÉP ċËùJPZŭ^[ÀpŒecÔqĥG1{&J“xĦ\¨ŞEZ‘^dÌ#OÒ6ĉIOòež:So+µ•:–°rXŠq´X{ŜXéX'mqìw<7ĦÑhJ˙³´7ÍğlmΉ !ŜüÂM·tÍZ›2¸Ğéz(ž\Ö˙vpîz믁ğPc“ï ëPS˜ŒèŠÉ%ÙjÔLUëD>’Â3Ç”C˙¸n¸Î‡)§oƒQżÎż}˘ÚĞmÒ|ĥP€9İ“9§ê$cɓd&YN4…ŞnšI£Ù:–ĜĤSÙ|ú$[³yÊ|µœ.eeĥġlTIQè&Y€$Hauâó‹’+,ï--½À-ѰŻ)ƒ–ŠgB¸ƒtš‹|k£ß nG‡q;q;ÚÂíè˙#ÜŝOpk1ò°sÔjÜÖ&ÂÚaRĥXšĞħávĞÙu‹Ğ˙ŻáN­œE²HžĴçêCĜ>‘ŭ{€Ö ôÇÙĵX_€è^€è.gĜzVŻcuü]vŜñœi K×UC/›—EC¤cĠXÍcxm³°4H’üD˙½>Ü>^ŻO×Ëíeö5v7ĉSMFĤ0†3Šz™Krñ(Ŭcxl1ŽgIİÌ'ùxşÚIóëİFŞ-ÍŜÙÑÙé3{˘rÌeYRï÷0zĜzÙóyÎ,ó. €€hc|m€>È>Ä1Ä0G‘t R#VĈ¨÷k÷#‹ŒĥsŒs˜Ċ´˜MĠ§9Ĥ9 Íuc³‚<Ż-6Û*ìŽ ç­Ò¨´mtltn3ĥÙö8ö8kÌ÷ÌÏÌVs òw  ËE8÷£ĦĵÉÖ _ğpÍ£÷ŒÊI}Ââsêݧ6^2JŜĵ6ô£ˆp-ĴÄ#$“ñŽ²[ëà$rĵⵕÇû [íRˆéTUıÀTq°ìJ ĊT3F•;Äï}ÂïİĴ9‘•Z:3uUj5.ݧ~–ÚšŞa”…jdïíuó{>àg÷Ż=wċŽÚÙóV쨭íW³àİ=PħÉ´Êé?n²ÊiĥyëKŻ˙)ô’ûáI cK|‚xÔÈˁĠdÀÀÊrùê.R𸠨¨Ĵğ.YYËÊUÌd ZV.³ö-ÈĠgכżŞÉßց|+/udƒĜ…ŞÓèħj†ê3z@žšeXs> 4çwĞ÷8ġ!£²b(” ù$µÔ(3öħS'y­dı4iLoı‡j^ĵL‘ w6²f'ĝÛjBžƒħĴ‘Ċ´ê|SVPja™´_ċ¨àXœÔCÁRQLĜdL²ymQ!}k­(C K†dġ`½”Ál2+eLÁZHĈ:HĈzGŸŽ•§iòy1}^¤ċ-†+d§ġÒ7)§‘ŞêĊġ–éġ¨ĥ/š2¤/n&ĥ½Cلµ°Nê骉œbÊXĊ™íj+_EAud&s*ÉŞġĥ° sŬ2ı!ê6“ÛTÈtWHA=$1]di,g¨cŞJu›ÇŸeüu ĞâëÔ?17ê5™¨è:AšÔ‰gÈJÀ6 m°Uċ y²Ö)ğá~Xy[ùXù OÒu)fÂ,+yšV°¤àXÔ2˙7-ûĜ#×[NÖʞĉiôrˍ–½,ċSDY2Ùl½TĤĞĈ7›ÏNƒa-|%-”Ŝç6ŜËójŜ({ä^òż(‘Jµòız\ëĞ×êß½Œ™ĥ1ĥ =Á>Ûŝèıs¤˜{HıÔHfq79‚û³¤ 2ƒ-³Ŝ܇ħ}¤žì’)]ÁóWI‰œCĉX׳<ò&;ˆHñ„ ˙œ–Šñş:r_INËéä´ò5éÏ—ĵŒŒ ġñĥßCĉH—[oZ×)gÈ)‡ŒċÍxïVœSë7$lÔSjöyÈÙ÷’¨†~\rf×Úíß?}ÜĵÏ>[mŭPĞŭÇ'˙ê8„endstream endobj 352 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1 EwNÁ t(CĒ.Um/@ÀD DÈÛ78I‡ߒí˙­gÖġ·>ĝBÙ#Gó‚B6×l€Ž0ù@A­7ċ谚Y'ÂşğNïOşÀíŭ g`ϋ”8jö‰–¤ d& -çŞuNöo%öÀ觸*ç[%­” %¸?ġRe:¨Ys†PÁ*û-ĊTStù‰¤V[endstream endobj 353 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 243 >> stream xœcd`ab`ddä v ò54°4qä~H3ŭaîîŝá÷3’µ›‡ı›‡eÒ÷zĦςïĝ_ 0012Šİ:çç”–¤)ĝĉ§¤ċ)ċç&ĉĦ 2000u¨30”0d0032²ÛÔŝgôîcàûÏĝQ“áFÙ‰òċBÂ×ŭĠ¨³qèVâ½˘öûóÓÇ_ä„ĵpŝô›ONĝ@[{W›4P“H4–²ï˙ʅŜŜŠ\ .|áğ÷÷˘ Ĝ„Ly1íù”=ÓûfvÏàXXż(ğ°ŞĴ¸Żĥ§^Nĝ½iúSô8ĝ丘§Ùóp20Ÿ Yçendstream endobj 354 0 obj << /Filter /FlateDecode /Length 189 >> stream xœ]1 EwNÁ BB:TŠXÒCĞŞí˜ˆ!€H2ôö5NÒĦ˙ÒlSġ×Ë5ĝ…WÍ î|°ĉ¸f|€ÑV7Üz³ìDn&XĠßtzp,·ñ]OP=ċYÒQ½…L´0'm ë0ë„PsŠA°W§-0¸½R֊$:b£HˆMAİHˆ²`ĞHˆ-b‹ı–²è×ñji[8ĉċfÍÂB[Òexà÷)Ĥ’â(öqÎ_Rendstream endobj 355 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 776 >> stream xœQmHSa~Żsğ7[ÖĴ•RŬŬ²¨Ĥj‰ZV¤–чk^›Óy×ĵmİĴ%ëcYfĞPSwQ‹¤¨$ó "¨VŠ’¨?*‚Ëxï¸ŝhÎùñ<ç9Ï!Px"Bž‘u8)ĜlWâš0q­ l~Ÿ–ƒRÊz˙ƒ(ÌİpŝR|j’D™£:ƒ³”Y Ïyĉ¤nğ΀x&>99QË$ètÉÌ.3k-4èK˜,=odÍz>03G8C!˗…()Fž·ìĜ²Ċn·ÇéÍqœġ\jPEËĜ y#s˜-e­66ŸÙǕLĥŜÌ2A—qAÈà̖ m"§kk`Äáİœ<• N%ġŠjĵTš”K ˆƒ ú„ç^;'dĝƒ_nĞŞĥg 9Úàò6x mÔÂ-²ÀíÔÒF“âYí ĵÔ,< )I­ğħG”úŠÏ˙ˆŝyÌ˙”á.œ§nÛ+47½€o^ĵi\RIÊ]‰§WštŜ}ò&œtû§-݁úñ*%1vwš!-ÑHQÒJçe¨kŒ¨Q´LyħÂmwċ:/^uAPÒ y[Ç',Oŝ ·ŸçÙż2|ÏŞ'ú­—T{ rŽĤ{ûšî–G‚TdáÊ Úı,ĴÀ1?˙ž:0ĥñĦfâñÈG˜¤&‡b™‡Ò Z*Z;½Û{Šš.TÓ½µ÷jsmĜ[˘wThÌĊ|Uöġ‹—.QޏG‡ÄĞñt ÁÑ/2‘öŻV{áĤí’Ǩ¤ÑƒÜ„ğ’é]Ny“"ĝ—Ħ@ĠÀt(=žLußîÑLŭ֑é˘\½ —êÉH:"<ÑĞ\„ Q\Nendstream endobj 356 0 obj << /Filter /FlateDecode /Length 192 >> stream xœ]=ƒ F{NÁ ÄżĜ84ĤħH&“䈋C!0¨EnŸeĠ)ŜÎ<`g÷#ëúkïìʳGôú+7֍żE |€É:–|´z=ŒŞžU`YwSáŭ Àñ˜Ŭïj†ìY AGùŜ¤ŭKP˘r°VÙ#¸ñïê²7 ĉxYĉ’+j! Ô"i) Ô2i% Ô*i- Ô:i# ԆFŸCÒ)Ïı>×[ŒàV MĦRëà÷/Á‡ÔĊörWbgendstream endobj 357 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 928 >> stream xœQmLSg~oKï½l ´ÛÜĉí͆›qȗ“ÛL&ƒ É@üÀQ鵀ŭJ[J*Ö~dĜÒSڀ|ĊAŠha…‚³!#sŠçp6˖Í2³EuÑ85Ñċ½î5ÙZr’'çü8ÏyžçP(M‚(Š’•UĠšlñuJ|C"‘‚MĵŝĴXr)ÈÓz˙-ÊÂĉL,dà†—”˘ìŽ@™Ñd7·h›­üŜüMùMI(à JJT9|a~~ ˙‘^0·4İ |•ÚÚ,èĠÖä kM-‚ĠĵòA³Ġj*ÍËkooÏUë-ıF³vsŠ%‡ooħ6ó5‚E0Û _n4Xùj½À§TĉĤ Ì¨7µY3_eÔfBˆ.(ÜĝŜ&BYh%Z…èeô*b’ĉPŞF Ô§Ô¤äI\ô­1ÄĊp|.LáÈ-)&Ï2Q/èıŠÊµ VDàGXœ`Ÿw3­p$›kÔ Ħ%¸”Ĵ%Xž—żod²a(ĤLQŬÁat;NŭŠî,gpµâŬċpWv}ŜY `I5W=™ż˜ŒŽFgçágÙ5òQm¨˙şsàԗ#§O™úŒ›żrĉg`Ÿ^ú°tëŜ-W*‰›èŬnżtĞĊmtò¤íôUÌ`e SO/Ĉ¨û˙`'–JñY|SqóğšµDRħg‹)ğçò>e<ôEĈÙiËXĞIH½KjñJĵîáŭ‡×jŻ“£Üo‘D~golX$r’^XWÒs†##3“m#ĤwöÂ]èv>a)Ŝİ{÷NŬoêò€Ûïòaĥc†ıċ0qf\ĴS"úC*^ÁĊŠ8Iw0ckĥwùœŽżÈà^HS…ċéŭŞ–ŞŜendstream endobj 358 0 obj << /Filter /FlateDecode /Length 396 >> stream xœ]’1N@E{ŸÂ7È&YπM pÖkä"ŽeBÁíù˙((ŝJ/ìzĉ ³ı{¸˜§Kğy^Ïċµ^Úqš‡µ~œ?×RÛc}Ÿĉfğk‡İ\~Hg9ġK³ı{엷Żĥ¸PÇ+?ġ§şyÉÉôÓöú¨œ‡úħôŭü^›CJqÇhê<üûÓŝĉúâ8ŝ\ŬŬ„’Nàm(À[b Xˆ5`î·Ħ¤„˜Cf`Ŝ…’Nà>àžhĦˆšYu3ëfÉ*”Y¨ƒ“N ÚéËżÜĦf§şë:2ueìÊpÑtÙxÙ‚İ c†wĤ·Ĥ·](ÀŽˆMM›4èDŒÍ4:è 훌 ևì‰ÇP€G"†jĴq°6„ˆP7éġm ˆêÁ1 ×4œÓpÈı‚9— S!çt :ä\‚NA‡œK)ès :r.A§ CÎ%ˆ“ğġğD\3.ìï~ĥċs]ë|ÑVkkıĴÓ\˙9/|Ġ"Í7ˆ`ʙendstream endobj 359 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4183 >> stream xœX XS×ĥ>!šsŞE<;$\ÁyÖk[ÔZ•Vœçy@ a A&0'Y “@”1LÁ*P@X[ÛjĞġV­·­Vû´ZеuŜĉ½ïî„ÚÚ÷ġġö=ß/kí½×˙Żŭ3ÀމD=—Żñ°ŝ2ZxI$ĵl'ĵ"ö#†Ŝ˽)Á^ öò^öîPĵĉ„ZGÜñ<#‰bôžaáħÊ €@•ëĥİ3§úÒ×4×iŻMt>uއëüı2È×'Ôuı*Pâ£˘(\׆ùÉUħĥ9*UĝĴ)S˘££'û„DNS̵f™è¤ t]#”+÷Èŭ\†…Ş\Wĝ„È]­ûœl}y†…„GİäJ×ċa~re(0cC„y†+FŞ˘ï‰ö‰Ùëë·Bîż* pMîuÁАqö'OûûĜÁ ³’qcV1îÌjf-3†YÇĴg60™Ì&f³™ñdĥ0o1o3S˜…Œ3YÄ,ff0K˜ÌLf³œYÁ bB˜!Œ#3”á™çDƒ˜q´ˆÌ&[ä(RŠħ ´ğ$ž/;`ҀÜ·n•ĵ"ig381gä?óܓAuž0íĠC<‡”;Ĝ9D9::.{Ŝùù§!N^NN-C%Cw:ğ á<˜…ĉÓPpŭ/wîÀhäŝÇğçŜ+Ú²RJâÙíjX,U°]†2ŭQ8 EşÚönfv(Agĉp _B}X“ŞN^´&΅ aœNâ|ċ>KFİ*Ĝ ùi[d¤üM´X 2‡Ŝ`0G&l1E·Żâ½· w0Z@ŜbÈë’â ’ï[ßX9wÑÂI22M‚Z5˙ üÓsp™ûfÂuâ"íU’+µżĴŻ’ġתçJU ‰óO‚ğ_ş{ëÎíżFÄFÙDñÛ´yVjıVÌ]ùĤğÌA(P× M˘úĜ|C,Ä`ŬGâ<ڕ #NÇ˘#:?|ˆŽRM6ñ›ÁǤ:ÑĤ;=Ĥֆî%Í­ÁċAU>úMàŝ°Zı#lûöhàz˘Ì½“Ì˘žGBF­Xx$ü7l^sz4pdyÌ$ŜdÎ"ÓqÎú_Áç ?!ÒRt²T2‘ĜÏwîU²ĝÄF\râË?Í#ŻVË ‰úŒ"àJ!§B†‰ì~ÈOJÓhRÒ^²ÁŒM ĉ¸şĦO.cċáÎÛp1Ŝâ-gN•·wġì4‰׌YŜòšĤHYb9 ŒóPaÙŭ1p8íîáp:î2hŭĉ¨]r™óÁs,köbnúNY_àżVŭ”cO.>ùĈʰ…Ë·â”HuĴVŸ‘\xE\UEUICcHƒ÷JŸċ*İ•BY2ò(tÂP¤ï†#P­;g[)š] )lĦšN9ÔeĈN‹]o–:ħpŻwßwĉWj”ŭJŽĴ(nGà[hÒXs³S3-2ÔŜfïż*Ğa’WĠÁÓ0GÒOÁĦœĤµDÊĠI„qj“0µRdéĈÄn1ŜfñÖÚgh!)QŞĠĤ¤¤g(*ıA^—Ŭ 6GTEÉ,ŠCiŬ)ŬÉû5•qİĤs3FC¨ˆŻO&I5şÜ$à 5VF†ħqbÌĠëËH³s ‹rrÚvujLÇöKç;˘k£ŞdAòĉGä,(‚ħŞí[dò^W¤ú$H§”(†ĵ2 €eĥ³_/ŭ|_ĴUÁ7“Q¸,ŒĠ½è>^)o’z– ¸:qé‹Òž°ġì|E@À"ĝĉ€XÊ$µ)ÂĜö›P8›Ÿyİçëí'ĝK&XĦşšé22ž…%àÓXŬšvŜ…cUġg9çŭë[8Ìzä“!ŝcƒ×A€ıWdĥB'Ĉ8á!ßl0~!5™%ğ4^°“>^°+‹B0ħ_’Ĵ} Mš-U*$­Y > ĠĤ’­56Ӕ‡Ġ‹fQı "D^“Ğͅ<Ĥʤfv§Vہ ĥÄl”A‰?Ž&è’żO“ù°Ï·_Ĉë.ŬMĈ&=gfC4Ŝ …0Pè ĥ¨zíŝ½É:mĤڍä¸F˙eÙŜĠâ^'ĵÉWߚ]aġĠha7È!|ûWlׇC4$kÓ5iSH–ËhĴ͜Y#j̆şÇíš] şÇàŝˆF(×&äĞ‹|AÚ 5è5; Ğ ĥoˆ ŜĜŜ ŻŽlI¨ (RÖñĉÇNŝĤÚNc{Żmá‘2*ûç‘m[·ġŬİ£]}˜ĝ˜JżT”Ş_‹q ş̂C¸ TPmÑFë|(Í~­J”iá8½uQŠÚêµF(!HcĜ§ŻÛ&ĤTŒ÷nó÷£ö3§Ş¸X˜]Xs ġC3ĴQ@â³½Óİ…Èufrfêh’ââ lS×aó·ġu"Ë ÜqG,0Â+üžÌèċ"Ê£kj*ö›?xû 2l‚+q"üq8e8$ߨ´qéRĠµ›€[êñ.ŽĊİ_t-:İUÒù‹Š½`+6MoşH‹-Œ@{ž2E³wÂ{{Œ/ßêˆĥˆví{ċÜ5G*[Í'  Žìİ•A1\Öû|F÷‰7¨¸;şŽ#z2ŒsÀ~G‰“^ĵsKŒ'lf0dż=ÖÑ^P Í,&gÒĦŻä"ÊbMµÊjÉ{cĠ)aç(‘Ï˙͜ÇËĴCïJ:ê›ë-äÈÛxö‘Xpó<ş>şyïûM"“ò†°#ë4úp:l}¨bçj­“X ï7š÷$èÄÎۛÈ,q§“€ìŞĊeç¨Ċ´ZQŭiÜ{ĊrZŒNèĊ›âÍ{;ûî҅kÇÂ,‰Ċ²#Í]`„ MjÄrêĵ˜Şâ҂в³o¨·: P^éWL½àDOŻ9›J÷Ê´Ú°@ĜAµħ›â}ŭa÷փ58 :q5ĉ˙jéÚĤĠ0‘ŞW0¤Bscj)-KsJò‹¸G™ütĝ²Ö`Ù_-+)Ż-İî6ŒWİ`ü4Y'™Ë7˘£n֚ıŜ“ĈÍï:UZñ Yżċ·u€¨”‹qiïŝYi(ŭsG‡KĜ˙˙ŭ`l TĴ÷‡^M”IcĈnvSË?ò&ŝ°üÑ÷ĉáÎq‹Ox,`ĦĈ_–oh„ àn 3q3w,#/ËP´—˙öê{p•{@†\'”8—ŝìĴ`Ŭ}˙ì,Öقö’K(ÏÎl‡½Ŭ׎£ò.˙³PÜW%7ĞsÁH­wJŞN–ħLİ µW—§îOİLıŜ‘úAÊy"n˘d?d%{Ú#3ô2óİœÜÁe ž¸[Ğùa~:u­O+Ôa¨żTGŽġπ%™9‡eγ„C|CduˆB ­RšŞĞ¤´‘¨6 Wú“ûŬ9Ì[4ŭOjM?ĠšŝsX264sŒ—&Œ‘ÒĈ¨ƒ\ŞÁċáĦħÑáτġ\;÷ÑHïôN`]"$22$¤:²Ħ‰Ŝ8ş}Ò"j1cám,0‹{çġz˙ĊJ˘IÔÀ:I1z”×x:‡êĦ@{ SŸL[––7öŽ”ú)$ÍYhgs]ôG³íD~ìH(ħȄJ >ż<ğÀP €Ĥ(-&6ÏlߒŒh=ı(Ĥ7^ˆ`˙|ïLú6h“ò=d?a’Ŝóm~ f–{ĥsÎ×ußKŝ/wpÁ*ŝsMı“Ήħ³yĝgÚmDñ*tœü½š$kS5M^šìÌF´#/9Ä-‚l%£ÈKZMf&dpCjñö%”½Wŭ# =÷ô èt·ÁD‘ÇŬ´È7„…|ĵŽ~V§Ž˜#h'y|·İ§êPz¤Iꗙ€$.¤:Şĥ˘Ĵg]Çì1Ä~½Ğ” üŬ”ĝcLsœÉvċ&Ê?˙¤`ÇRôÉú œ‡Œ—˜¨*ċİuöxÓ33ƒš—‘›–Wxŭ ú$˘Ċ/0&<<ĵ,ĵÉTR˘—ZyC£AFŒ›Nòġ‘&ÚdÊߚL( 'oĦS*úŠ{zy“Π”._:…zzj Ëà}8Yġ³ŝš¤ÉÒ`k[Ŭ˘Ĵo…Ûż4U0;Yc´šš_4 >ž÷/‹ëqŻÀš™4N=OœËúò¨¸çlqQì<ë°ĵñÈ> stream xœ]‘1n0 EwB70íĜ \’%C‹˘í™ ó²Ùĉ£ñ‹6›–> stream xœmTkPWŜ%aÙ …¨]Ĉĥv7mÇVy´>@,ĥV>VQ'†Ċ„„lL6„GG‹—˘âĞ ò…X‚h•Nql:[ÙR|dPj§££bݵjgzwĉò£›¤;³sgÏî½ßwïœsqL€á8N$§\çy›&Ž‹“Ä7d™ĊzQ ĴÁAˆ „ÈĞ&½àÁñ0? ² L†E%•ÉœİĴÛ¤ċ•YŞY*´Ä*câĉD)g¨TqÊÄ<ÖĴÓ¨ÊT5ŻeóÔĵ”+8Žċ ½GĉkyŜ?}şÍf‹QçYb8óĤJ”ÒĤµÊċĴ…5ç³ÙÊÎÈ+ÓÔyĴқkŒwMĉòLVž5+SılÖlÄ0,ÌșÌ)ŜŞÎf3t† KÇ2°eĜ ì]l%–‰­Â’°÷ħ,[‚ba˜BҏÉ1;‹OËvܗÉ.ÈUòrù½À„Àm bC¨ĜĜ+àżğa†[&&Ánêášî¸ĴuEı,íÜ}t#½€ĜÂ}n3¨aÎ"×gĠNÚfvfL$ŝ<ÑÓSmÉ ‘E´Ċ(írzvEŒÙEH|eìïܰVâÓAÑQ ŒžŠH1ċP>ò*h¤A**)ŭÚŬ;}?\”:#6=)‰‘ Y€QOÓpË ™İ1ıd-y]…g eFà<ë’gİ‹ŒZĤcë^s’FëĈJ'R½½=? ô.~oĈ’’eßÂQQlızç­£V½?‚ħ~ŭ¸*Àƒ‚LLߤj@³ž/+)ŭ”fk׀"@˘dğŠ[uÊrxӞï,{RÜ´kh+ĝ„4µ‘išú^]Z·ëÈÀÛU˜ZkŞĞœûésÚ  N2>q¸ĞÇbİa4_˜÷Fר÷}xt’M­Î{÷*uÖ ú3ì¤GËİWxR‡H·×eĞ@Á™ŝÖA3o>x=onW§dż!;ñöUí•[Ŭ'6ƒmĊĥrŭnş|­ĈŞd"p5>CÖâДײç:;‡˜“P˘KÇ[hĜôâ˙=Dt˙ĉë'Níŭò ½'Żäà‹+ ĝ·nh•x`u#ŭR{,466iÙ÷ íĴ<rèëÜ4Í+G“²À4rÁ@ꃃ ËE7ê\  ÎFÖjĊö|PUÀ$P€ùÛĤ˘ġ` 36ĥêyÔ˙‰ë`€€·{‡AÒ÷Ó˙è‹"ĴµÇ*İĥ²ÈH4…Ŭ€X÷™£Œ}E?'&†S™ëĤdü|ûŽíâıĠ™´Šêƒ/KoÀƒƒ21.£êÀIH.ùQ(4j FŠż§ÂWàkŬwëíĴ[ĥëvĈ²ü#° ,sÚm#dEUûëïÁepz]ĠBÒ7‹Xê­ÑvİüóáN †0ĝÊŭááE÷Q0ƒĴŝ:>j5ލID/ġbĈHˆVùcbäôâĠĞ7.ŽbĤO‡wè1îEÄ ”“wpÏsœƒw:'ÒQ8ċ D.:ĉVpùè-xšëĊ­Ò Ġžê9šMĜMÒı&Nĝ¨…‰o5ÍÎf)QéğNÄáZ8Q‡.Q†f}ŽÉ Ïi1µv6·´ÒĦô8y!ò†ŭ ÷7endstream endobj 362 0 obj << /Filter /FlateDecode /Length 169 >> stream xœ]; D{NÁ Àĥ"°hœĈEĴ(É0,…„q‘Û‡"ĊĴ4ì zˆñ6˘”=‚S/ˆÔXÔ6·t†Ċ"iZŞ­Š‡+S­Ò6Ü<Sŭ$W`ÏîZŸšZRNĉ‚ qÒs.zcÔĞĥfs$/­(â<Íd;Q”lWêg0˙”™NŞöc/`™Ç"ünóÎçM"_~ĴVAendstream endobj 363 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 418 >> stream xœcd`ab`dddsö ĥħT~H3ŝaú!ËÜ]úSàgk7s7ˤZBß3ż§O``fdĴŞïsÎ/¨,ÊLÏ(Qˆ105H† †––ĉ: F– ŽıİE™É‰y ‰%İı‰%@NŽBp~rfjI%X‹MFII•~yyı^bnħ^~QşÈ…ò̒ … ÔâÔ˘²Ô·üĵżÄÜT°3ġÀ¤s~nAiIj‘‚o~JjQSP0ƒ1ƒ Èy,ŝğtŭÔí^}י1yñŭŝ#ĉnßoŠ~\~ùr÷]ŽOż9î˙V–û=áŻ×‹ï翛°}ú}žġ5۟ ˘ß'Wg˙Îq>ĜÙËÏ÷7ż<ߏsW<½ÄxäÁ÷M˜żwü°˜ħıû(ǑCGŸ]Ŝ[ż_nö£È%ы ş%+j¨MH^+żÓ˙L͖Ĉ™í'k&wîĴŬßíËáäkdeżjŸ\µÉ[żgÍğş%żËüĝù;ĞŜU‡ıò|r\,ĉóy8M:¨*endstream endobj 364 0 obj << /Filter /FlateDecode /Length 225 >> stream xœ]AnÂ0E÷>…o‡$HÑl`˘¨j{Œ‘8– ‹Ŝž?Cè˘‹÷—ÌÈöoöÇ1§Ċ6ŸußĵĜ˜òTù6ßk`{ĉKÊĤŬĜ)…e5ÍpġĊ4û_~~ [ p|úÉ_ıùêŜ{ŭÔ>—Â<ñ­ĝÀĠç ›Ñ9c$yú÷Ğ]7Îq0*8‡4[KŠsHè@ tŬ‘Ŭ‰R A”I²h$ŠĞŒÛ )Î!Ħ)N´'ڋâÌ­ž‹”gĵî+/’n^UĜpŻ•ó˘jAÒKÊü×q™‹lY`èŞsŝendstream endobj 365 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1498 >> stream xœTkLSWżċbwuˆSW•éî­QtxlnDŬL&>ĉk>€ıù VŠP mĦ´@iKKĦ-”BK_@‘ˆ PĞ >P'è|étKĉ\6ŭ°a²e–œKvÍb²d~ù眜œó˙ŭÁ"#0‡MŜ™şuÍĝ*–žÏĦDïâ SmŸQ8DEÖ.à^˜… 3Qŝ $x 9UEM²¤@)ÍÉÉù>LÈbK"?q͚¤•ü÷Ö? 9Y‚|ŝN\$ äì&Ÿ"ÉÊʕW>Éċk Eœ@,‹“H³×ż²’ŻÈ‘‹ĝ{…2Ħ´Xx„żY’/ç. ù8&j²D\P$Jù;%G„Ò| Ŝ̗Heò"pwN†íÂvc)X*–†}mÀ6c‰Ĝ6l'Ċ΋Eb}œéc7˘§îÈù‘]S6L9M›˘é‡š ½4ÈRpuGózyĈr0CĦtiŬ§lŝk¤ÍçşRŞëôŜ³Ÿ°6ĥĥĥşŬWèuËŬs˜™ĤJ§*Ž™ PL¤ġJÂÏzÒÚ5Ë-Ĥbİ͖ĴM˘R}üDkİşfÊ{!Œp¸NŒd…6%ÈÈ-$u—Žĥ àHJaݨ<Œ„Ú v7Xŭ6Ò˙È×ÓDS½.ŻĜPh1RÑt`2 Ϝö˘vŜ³]ßĊ3³™ıÌBfI܆Q4½bÑB’q2.ž(£ġ§˙ïŞóúċSgè;½ETÂpÓ7Sıûĉ €ˆĤ7jô –ˆĠ?¨ áU×öĦOÀí(kĞdPA(Üĥ–ĉ޳[ÒveeçÈHMż(˜ùÚĜ“™$½1ôş|öŽ:2šNÒŻ>Bqw/²3ĊĦı8½€ĉòŽê!̄Î^ÒÚôôg…“™İqİŸŒ”ŸÔ“Ú~-ì#òeëNaJí@)9`ƒ0'NÈíC†iwʕÌÇhUE÷·kÛ²°MnKwˆk³káámş˙ädw…¨žŒF£,s:P²Ÿƒ˘nÈK/ĉŭÊġ8ÁÛ¨…Rj—ĠÓê‚j°ĈxÔÎÒM‘ÊHaĤ|ÄUi@݇&êGîF&–*%”Ċ¤wŝ늭wŞÁ¤ĥ˜Ê ¤d“ íUuÈQÓló³ĵ0ñŽ&NûéYĵ‰6Â[^_–[™§3“™3ú‚Ìğ ĉK`JË·]żSŽĞüÄĊœÎô•G™X]EĜ\Çm V²ĥíÄ@Ô;ͅRX_Bbfh3!ƒXv_qŝl/ÜEş3şK;á<ÎÔyĵ=×Ħ†÷i™ĊXb$U[•ûŽQ˘o ÄĝÒg÷pş’ž6‰JŒ³ .Ş”°ŜövÉLgb™ħİwoô]ĝ(gĈiiĝµ;m÷ñt9;Ö³)I5=t_>‰"ܽTÛ­ ƒ}@Üt$éĞÀbÒ²xò4A”DI,$â>²„qT†”ĵïa°ÛuŻŬñ5ˆ~axK,³|³•‰ĵµġ—ßž^úĤ—46ê쨳YŻÛğamÑ! ĥh8]§šnSö ğ:€ċŽ mĴÔ/۟JiÔé‡X‚c¸ÑhdB ôÎ#šs#|GÇp^S…§X&+–JZ Î`sK+Ù\ÎûÏÏÇcoqvP¨öœíçhqžß˙IĤW¨R˘8ƒ²T`ÒĊTëd ĝ÷“c³ÖÇfŒ²ı[ÎĞi<^ 5¨ĞV™éĉ•Y´PlD<Pݳ€ÁXF23Ÿ_Dċ@×ákŭŝŸƒôv7żby|IĦô;’Ó"“üQS1ìÖ2Ëendstream endobj 366 0 obj << /BBox [ 419.9 1232.66 5610.09 7949.37 ] /Filter /FlateDecode /FormType 1 /Group 193 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R50 162 0 R >> /Font << /R113 195 0 R >> >> /Subtype /Form /Type /XObject /Length 1087 >> stream xœŬVIo\E~ž`?,ì³'$ ÍCšĤĞ—Şk$„Ä-ÉH€ä[Š9÷İêîyËL„DÈ äñT×^_-ŻzpÁÙƒë² ŒÙ2pŽ­só‡ùÉ\÷`ôsóĵÀ6s6àƒ·ˆ&; l-)˙Ĵ˙îIrĉùŸ= goŝêÑϓÔÚLF+j’e01FcômßĜĊÜ+(˙·ŻßÌ£­è&[ŜħÙ>÷ pbÑ`Fr2ÛĞŝçuw4Àş[u·ôëaĴsÈä8­ğÁ[‰yŬèóí$z&Żï^ˆ1'Zw§ÈKTİ•È ó/×Uè=ċœ9àş;+jäA{—Ô˘*ñ )ˆÈM11Ğx‘#dċ~ŬŝĜK='2‰ä{ûğ†~Q"ɊQÍï,Ë÷y nç=KpÁ.ž7ä÷Ee6 AKɟcjĤùfФШUŸĈœhVŬÜĠdĴğôOQ|9TµMîDSqŭcôcțhˆÉDo#áΏUĠ­ĉJܘ’\û¨½ë—by™bKˆ84_Ÿ4ŸF$îѳfH}ù~Û?žÀ|JVP‰‰À @–REkÈ˙­²Í $Cƒë§âyİ™D錜˜ŻuE–c–~6`acjÇV0çCXÏ'ú™”mRX ï€,C-ƒ4 ˆ;{xĝĵğ[Š^;‡&­û¤ê²Vcĉlġ†µYJĤ§³ˆèÈùV]q¤•ç^íË½°Żçŭ}ŽKóšôr Üê˘Ñ/–ŜáêdšAw& úöPçÇÑĵ‡šd—@^u 8ú˘^$eŞò’R‡’› ëG.Ħ€îFÉàSÉâ$CġYıô5Pċ’I˙²Ê)!­µ&ŝPL!ô/3îµŭƒèMsO–ċhşlëx1 –ƒàáA˘·bŒŒ (ĝ,6ê„÷ËbÈÌ.ĦıA]˘‰á5óŝáT0WˆÜvœÌ&’,H›ÉŻëÍro~Ċ´Cé›9@ç¤rt폜|“nw¤6ĥö6NeH.ù”çΎ@@Ñzı;#ëƒ6ĥ`Ş\˘˘@˜hËÊ%›ĈœqM<lÂĦĜAjÒK\˘ĉŭkàíW‹\=·‰äğûï-`Żäüq˙7pE/¸endstream endobj 367 0 obj << /BBox [ 1030.51 6321.08 4999.48 7330.28 ] /Filter /FlateDecode /FormType 1 /Group 193 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /R116 366 0 R >> >> /Subtype /Form /Type /XObject /Length 60 >> stream xœ+ä240635T0362Ô3°P0ĥ4³³4S040°Ô32T(JUWÈÒ244SpÉç ä‹ żendstream endobj 368 0 obj << /Filter /FlateDecode /Length 582 >> stream xœ]”=nÛ@D{‚7ŭ~$@ĜĈn\$’\€"W† S-ı}fFvŠC`$xo°ĜíÓËóË|½wÛëmüĠîŬċ:Ok{ż}ĴcëÎíġ:ovûnşŽ÷ÏĤçĝ6,›íÓ·aùŭgi^h—G˙>ĵµíÏrHŭ´{|4ŜĤö c[‡ùµmN}_O—KŬ´yúïŻ8>8_>_ŬïĞÒ÷x˘ZUPġPÔëħ*¨GÖsUPÏĴcUPGÖİ*¨kĞ jc½T §bĤïñDŬUuÇ À"ÈBÈRŞ‚ZXÁ[Ä\È\ĵ*¨Î:Tu``d!d`d!d`d!¤ÈDe¤2™¨ŒT"•‘Ê@d˘2RˆLTF*‘‰ÊHeQÔ`ÍŞ &+&7ÍnœŬ€oR0*&7ÍnœŬ`c22lLFF#ƒÉÈd„ÉM³gwÈı‚—‘ÓÈa2r9l\FN#‡ËÈiäÀw)8€.H'¤ƒÈEċ¤rı¨œT"•“*°qhçà΢U*@˘ RˆBTAŞQˆ*HĜ8´spç`2Ĝ8´spçÀÑïàñà‡‚ C;wĜ„Œ‚F›Q(`2 %6NíœÜ9!—L &äR‚IÁ„\J0)˜K &r)Á¤`B.%˜LÈ“‚ ı”`R0!—L &ÎTê\áÉËâëVà½ÁèëÂéĈumó]ה!Ŝ>×ıŭğɖÛÂŻ:dó-j2Yendstream endobj 369 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6016 >> stream xœ•Y XS×ĥ>1ĉxœ§…jÏAyUë<ÔĦ­Z§**Jël@@@F !!2ĴL@ 0„yPp¨ÖŜÖ!ĥĥŠÚj[ĞmŻVÛW;Ü>ğOßö~ßÛIÔÄ{í½ï‚ gŸ½×Z˙Zë˙×FDġìA‰D˘Ŝ‹W­ _·nÚTÏÏ#DÂÈÂSâlœ#üŭc?ôCżž#Cj‡ £#QÊ J,)4ĥĊİi9҄¸ĝŒ­SgN&ßĤ…L{îıÙCĤOú\ÈÂäXiBtTJÈŞ¨ŒĝĜä¨ òCRÈÚÔè„ĜŒï+s32ҞŸ2%;;{rTrúäTiÜ|Ï.C²2âCÖÄĤÇJ³bcB–ĤĤd„ĴŽJŽ y`îä˙Yœšœ–™+ Y•+MĦ(ê…)‹R§-Ùó’tiú²Œ°ÌĴÙQ+e;s˘WċĈĴŽĜġr\üš„µë×'%o|fÁ– ·MÚ>yǔİÓĤÏxvĉèç˙kîĵù(j4A…R/S˙E½B=M­ĦĈPkİħÔ:jµžz†Ú@m¤&P›¨EÔDj3µ˜šD½J-Ħ&S[¨—¨)ÔRj*µŒšF…QËİÔ êYj&N͢VQĞİ9Tj5—êGġ§ĉS¨݁Ôj5˜B ž Xj%ĤFPê)Š£xŞ7µ”@Eġ¤rDQ†èÍzKÄŞž\O¤Ż¤^D鵤W73žQôÛğħÏĜ>í}'öU÷ëĠ/²ŻŝÒŝż Hà8e`ŭ Ñ ƒ7 é3$ehÈPÛcž¨|âkĥzXî°S7 Ż.=$ Ş şÌOŽî|²Ç“ÙOŜħ{葋FʞZô”éİO¸áÜNĦ~€PîßÜB˙:‘0MĝŠĠ7ëìħÀ¨é\H‡üŬx×½ĉ tZv§ĥB%—j½méÊŝM‚fÒĦ’,Zž‰)-PE;ša_k:$ñĝIĦ[µßy¤Ĵ…1&Ґ9Fe%Vá`Ú{(:ç “Ï‹…žnv‡ç„Ä”f²šD;›È{@ÁÇûöÒ׌%P|eëŜewdîâÀd*+YÁ-òœí3í½ Ÿ‘ĵ°ÓôÀšŒ’ö–Ĉ·ß?êĉġ2YJ‘!ß á}ĥdıÑvbNÄy1š) öáĤġôó÷’Ä€M54ôĊï_ğ£ß]áàêÚwŜa>yġqĉW³h0}Í‘½yëâ1üÓôü{eISômëyĝşS=ÇiÜèŠ[t³uœ fdcQÏù'áÁ¸„yÌ|öˆ (”Jĵ ÛáôûġkW?ysŬ’IóC§y6Qı…2·èkυ+ĴÑb,(¨ÊÎ-.TqĊUĥ(aodġV`d< ŻĈ1wÓdëÑß nğĈ™˘–A††Oâ ıIÀÌÚtW4—;ġ8ôaf¨‰W3÷ı*Jš-9KŬhеí$L‹Ŝfë)§€AŭQ?ԍB=\šşfÛÙ ŞbĊfĈ½V‚MžôħĜ P”ÄĈĴVU-Ż/j0UŭRZĠüŜ‰CsĉĈĊ˜š6}–+AA,Hê£i@U{J j;Ĉ£!hZóûЈĊƒyu‹.‘x– Y³Œ`aeVy˘^ħ£ˆS:Ž,&‘|À½ Hâ+/Ŝıxì°£†Çq’ ŝ @/ĝ*$8IyÄħUŻğr÷öï.×.ĜYĴÓ(ĝ´•/Ż Ĉ—z™n´-BğÑ! £ Ċş(f¤.meе²ÖÌU˙j*'Ĉ˜‚mşÚÄ$½"²ˆèN´C‚t´.³(´Lzmħ£ŬTÙ`áìç‰éf²Ú[÷zû#Ŝä Pĵ?@Oï£ĠvÌTiï†Ĉ“Ézı´˜S½$Áµ÷‹ô 1mĥ›àa•§È}˘­Î;f{ŭÍ/Żßct›ĥ˜ĉZWóÉy œPĤ*KƒjĊ=üÇ_ÀnÏ?JF­,Ak³A&JÛMN'q˙S…×}y‰úÜèb ğn 2ŭ[÷û3°Ġë~l@~LñġŞTÈç·ÑË v£|·Xfħħġ@N@Ÿ5oÓs7ó~Ì_/:[‘Œ^Àcĥm¸ â´.½#’A_¨Ŝ ÏW.…"&×Ĵİ1—ìĞŜŒ9.R /ĝñ­ƒÙ-Éu|b}Şuž}³m ö2 ­G}Ŭ˜$7r†buÌë&{É~KSÙ[`fʋj224ò"ç-w4ŽşE×H†@ lŽv+mù˙ĥyÊ|`–mıŒ(´Ñhïum_dä3!ğ³Ô.+g4·˘Ydo‡¨ ‹9ƒA‘Ó&µïrî .ŽÂ#q8ŜÇ^÷ۛ‡kÛğx]/0uƒ^i]`ƒZ(İ3ZëѰ²÷™ÖF/ŝy÷ğÙ9÷ßêDhi šEsŭùgU_äo²>OòĤHĤú‘ùŠŽÁ*].Á]üü‡İŝí§ç=`gh¤ZNħ`‰6˜pĜç(“ıúÑ~Ŭ,ĵĊĥю–û8â´"í>uônĵ]‚<"ùÓ5ž¤HĦóêëO ííŬqô.œġçkD@„h‚ŒRü wü3=eaV>Q“'Û³˜zWuiٛ–fŜÚjiµĥÚ/àßxì›;ħÑ U3ż@kçë%mG8sJ=8ıĜG‰1ZşK£"@túœN%{û)ĵĈ³ñgëg’½ŝw} |QiĤOâ[%ñµÁuPÎĈG8:·èۛbAK‚ŜċërŜWWĝ›ÌzÙ½ÉŞ•Ğöl…`5D´Ŝb)+…zĤIĉÌÈNUîX~.ŝë;ŸŸı\É=´ N½ è-z,~Gb ‰•êKê‹[<$€ĥ iĊf, "ż/7VB€ĝKżP8'ôû™ÜëZ¸xS†ác†)–A8Cjġ° Î*ĵü$bm]Œ1—†È.Ħtƒħà8 음âÙîŸŬ˘ÏĈ)è$Û,G"<' ‹a^šKá*;d9ĈĠ[;Ħ ˜˙ħĵ,×ê³ Zŝ%ĥÏĴ|í÷ïœĥ7żĈĠ¤í+~˜–FŻm • Ĵ™üš/YM‚./.{OŝÎÂx`6Ĉ5î?‹tĦÁf?Ħż˘˙e ™­“¸ü3çY Ĝx\†k˘ZI‹żĝĈΎżĝĦÏëQ0ê‰zßÁfIĥôa{öî“üC"˘ JGiçƒìnjšĦ–Ÿ:ĉċ_$í I§ŭôm<OÀ3%ÛŭIˆ@iÍßEρ’ĝĴı·Ç8ϳ|>ŽƒfJ||êF’ûâ£R8éİ3i“˙\-sîiuy¤Z´Ábp¸àm÷çRċ|ó?’¨¤˙iġ> ,_²z¨ħĉ´"ġŝ/„r,)FM²^ħÇÇħE^ñ!CC„$·¨ĉ†8°j½ñííßşžĈ}qaò*]#˜4­Áë<ÒÔV6Ó_adV‘‚A9[­ĜKŸk°–ZĞÀĈ8Ôu)ı Şm;ÛR_=óÍñVî!÷Ŭ=Ĵ 2$bĞÔUÒL­&OÍeÄFfnĉù-§ÏwŸBƒgo]9o4ġF`r!ŝ°³£âµs“a ^ŝ,ž8z܅i$ĈÁïïâür-VP²ĥš’Jk%c¤çŬK‘äú{ĈĠ™Ċ_’joò!ŠÔÙxnPĈ֔WñŒÖDeÚRum.äñ ëyOèżíçBŞÄH›“ÊËĥĜ_,I°ì)ÙmÎj%BĦ Œ?ż+е———AӘ yC§@ĦV“dPĞ7U–Ò%íĤ²S6Žˆ{ >Ħ,(ÌYpz=88AD°6ÙĴ{- eGI÷] ÖúBE2¸Läó¤—Ôĝòĝñ|‘†gĉĠîj‹€`2ô½p(îùÙ˘[ouuà Ċ¨ĞÜ#€7kĜWĥż}‰ûëġKµË²´ĊɅ[xĊs/-{ 9½Ô=J£Yq.AÈ@´Eûäĉ4^ü/(ón ~!¤H˙|ŻĜ*µ*Bp)M"Ö½÷{èÈÓè ·èĈyÔA|DkÙv|FNì\‚ƒp"­ƒ°äÛıH‚†}x£Ù›‚şâÜ~ÏÎ-²(`VÍ?_yšmìî>y ˜;0'] zC‘ş~ }rA,tìŬN"iz†Ğ''pħĦ X aLèÁÄĦaİúµ‹ë¸µÉáƒïm`GĞÛŬŸíCaŽ|ÓíÖêùĤ]ıpĊnĵ´ ’ŒG”,‰tú‡yB$˘ó(!J§7mqË-u%]­‡.ƒ9²,À8Úíû?XıswD+U<‘ïŞĵ)L¨äĵ3k@ìQ“Ë ÷r¸ĉddä‰Fz ˘Ñ[¨çϗ7~Ž{Xö/4>(Ĥ†”&ċĊŝŭ}ËÊèˆùcĝÑŜö“s-ĝÚX`óYƒTÌ^şxoŜùú§Pj²ó§]ÉżzÁsÛò`ÜÒÒoĝ&˘~tÄ}Ä?”3žîŻgÒ=Ŝá'Òñj€$äżÁĥ} Fj7+MTŬf@*oí •_ÖÜpöHg0ċU†8µAGH% Û%[_qİò˘ŭRé('CèkÁڝÑ*5§|-ħB RH(HËĥdzî îß6@+ïéòYŝrżñï'ĥş„NbûG$äĠŸëßÄE×˘q¨„ ?@>,Ĉ6(÷L@uîâ+şÓ†Š8Ò#dŸS¨zÇäo"âÉXVò›ùĤé ˗Ĉ/ÈÔTf´3íŝÍġœY­qĝœ^Џ5Äb`§>FżŬàŭÔmƒŒ rşluàŞäĴĥïĵâcÌĦ!ÏĵÎgÚeö|m2ĉï‡N(ݳ:œó:kìCχÁàÒˆwÏıŝH'½ĉ6IŞIB?^×|ûÊ_ÓE¸S‘j² eğš˙u~-îKà…Tĵ§àá­şLĦ5ğùr yèˆOFíä›èĉ·N+¤³Ê ݃p¤9D:ġŸvlمON¸O·{/ZP°3·naž†§à…x#w; µ½ MïsŽÒd `H@Ôı:Pċs9ò¨´ ÀŒğN†¤Yh8 EƒÎVn”Zy<Ÿe÷žğóñïuµíZ5.lîFrsÜ„äFŭџES’?ÌÓ ĊI˜ùûÊ 2£H3ñ*8¸c<‰{Ġ…ĉu£ùu˘Â:1úoÔÈ˘ħ´½ şşâ=óüHş6Z ġ˜‚Ğ5YÉĊ)zNŠ'HXZññ]`çÑH:&RQúàÜŞWğµ­Üä½Ìċ]¨,Bğh1ÚgdSWoQäj4™²eEĥëMÔóó_ßH=´=rO\b\sVG™ ŒfÎïŬ”?BXc‰ÑJÚ·Ż6:È‹ŝ*ÁSŠ3,@ ˘ĈnÑïÂTħD<óğuÁo;Y$$şŽu‹È{E, ~b6=‘ZÏEˆ?ıMì½é1gÊÄ?µfŽëŒ:Ñ_„ħÑYkİʙÚ<§LV¤,(âî­ûûŠ"N…Á9ŽÜşÚ2{y ÷ôż€Ŝ='ڄ'XÄD˘§‰:‰×à(ôñ¨ŸÑShZ‡vpĜże—Ç\˙ ˙ ùö⁙ÓĝÉxĠ˜ûè÷Żu"a˘‡9}ĦŻR;²r‹T-'—n[¸X#7dé!™Q•ä68TSßÎ-½7K21 kšŭóû,_‡ôôv4ô&²w‹…h‹˜ëÇŻÁ×Ì/^$’|ô\Üsµ´.·ĊĠTħk­\ác?ĉ“OŒĊ½gċ’œ­ÁäŞâBPûòù] 5PÒh*/9eŜ‹tE&lĠsXé#d:íıÁûĝ&:DdÛyô.{{ߚmKΛ;ô”·˜ĞìÀ4g;2·ÀĤ‚ wwŭ€B~ğûó;İïGìċnż[ŭ543§ÖŸ½ñ„ġK6ĊwU44ÖĥًKÁÈíïì6:€9}8-&%+26…ß•–ĴOżĴUHlĵú¸r ½I<Ç£ylu,˘Ï}cäBp* ¤äà7îQAùĊ Èğ_²@ç`J²<@,óoħ–n*Y#ŭ ŝY‚÷]îp£™nÑgßĦFâ²É#)t„‹–‚Ò ‰Ä•>ġ eä6EƒÓlĥÙ¸·Ŝ>cmĤğcŭş “MÚì<ŞàËK˝„„j )[`cÁŒk›n£ah/è‰ïW\ MÛĦÍÜâñ‘^RBZív$ùIÄèĴàff“ ĴLu~cr¤6Jeà²ñĞz…DiMf§ÓÂĦ ùïWùJ -'ċ% úüsim§[os\îӂú´›˜tċŸ „wÙw5í™%ħ uașœÊŒĥ·MïÔto=9Ĥœ³ĥ™kÀìŠişÜ=ZNŻÒÉ zòiÈ×^ً_€ıñÚrDÉb°"èÙr8 &‰&³İŞÒRE*µ9әġ*ĵ"ŸŝÑĞ×Ô\q*QZ&ÇŞiĥÔٌœÎTnC=*n wàËĠ§fW1UìZ[lĵ'ÎqĤ‚qâ6vŻĉTĴ‚—×Ĵ_˘t²\Â’B­B[^RU5L}NeĤP_”Ïá{8JĤ*R‘²€œJµU‹ŽáĜ Gç/LMuU]MAiá;ZéıBğżê]RĂ ŭÌVt’Fëa„ŸèÑ LSI]?€ëÓ3'µ_oŠú?L³á´endstream endobj 370 0 obj << /Filter /FlateDecode /Length 202 >> stream xœ]Aƒ E÷œ‚ˆÖV›6v˘MÓöˆCB ¨‹Ŝ¨]tñò€ĉOÖv—Îٙg÷èġfnĴ"L~‰xoëX^Áêy#r=ŞÀ²öŞÂë€0+ßÔÙp^òµHûĤ 4DċŜÀ!dcŒdà†żĞj-èÍö²I5§£$ Žh$ ğ5ĥMħ$Ä"a)IˆeÂZ’kšd˙3 •âíi¸^b7Ó(cŠfüÖ|HUĊƒàfêendstream endobj 371 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 772 >> stream xœ]‘[HQĈÏì¸K47†Ş™Ħ˘Œuµòe֖f´•—$-V›ÜĠ½Œ˜ZJċ‰Ô É,SÍÂ$"z r›]“ ħ*ƒBS²ô?4=´ëV½œs>Î9żïûÎ!P˜ Ħ5[rrââËy9!ŻPÉ+IĴòIù‰úR#Hvċ‡Z§£‚˘%ˆ$ˆSµf7_%Ĝ‹l"›gÚl*ôql\rrâ6ŜdJfw89Á^huħĞhœVÑ/lĥğΉU WĥÚD‘ßQa´:ˌnĦ(%@ÙÀVĜE›Ċ•q î›ĉv‰ì~Ğ“cƒYÁÉìvòċ"'°÷1Np!„´n^+9#BQ&ÊF‡P.JCQHçoŠÂnôXFˆ„ĴÊT rs¤Ü\'Á;‰|î#ċ(ŭĠәîï·pGq .?A×ÈŞħnî÷0Ħü} P ƒşï. ċÁ&uMÊĴşÓóßNÀ¤O‹ƒ˙o’Ôv͂uw „*È1Ï|ŭ'EŻÊŝ$CĥßÙX.Ŝh&ċMCµ·áûžñÙÖ×)‘ŠŝÛzˆêñÇĤ‹ŽÊşsĠuŒı÷|%Nƒg^ë. P×Ĉ}ŭƒĝ+nOhÈĠʁš€|P“ÜKġòW‰ ”8ğJïôzş{èHzQX•;"Ħ_ÌŬ‹+endstream endobj 372 0 obj << /Filter /FlateDecode /Length 4130 >> stream xœí[ëo·˙ú8şWä6|?Z´@S'ŠubĦŭÍY[ġI§èdğŝï;CrÉ!{’ì4ÂLíqÉá<3ŭiÁF`ĝ/ŭryÄ/~:âáé"ŭwrıĝâĝèóo•ƒ'£gž/ŽÏâ+|áĝÂj;zİǗGƒ[˙ ĉZQÍU|”ŜüÓ£ï†o—+6jĈ%³%NÎëá&<öŜZ1lñħ3^şásïıu˜žġá)c–ıá͇š;5œcéÔĉ‡ż !ŠbĜ(4!ż]”’£*ÊÖ7°špÜ; âĈÌYá’´v|8)ğ ÛÍr%×@ ĵ¨TVü<ĥÜp‡3ò&n,àB ;\CŽÒıá·çL7\•5ÒaLĊUĈG'dĊU끓8ùË£oà ŬIàċâ÷ÏGNiĝ-Ĵn~qy„|ËnŽž?PŝH´va…ဨß BRcÂÛaÎ#ıÑzOï•Ġxd/ıƒ?‡ç0Eq#´‡ÙÓ!ó=Nç8›3ŻG5ü×ópS13N6BŠáUG+aF˜n‡Ó²KYí)ÎMú÷ĠÈ ep>Ï]_†Ä/Â&„A@‘mda"ĵ!îz™‡kŞR'K N{í(ÍYzYTÜ9PŻ,Şô燋Šy8„˘ú7vŒ1“ŽUŻÊhH:†Ì÷Ŝ(ċù8´Œ!;{u,³eÜĤĤPOÀILÛüzışĝ €ÍÂsx} „İœ’@V`‹‚ Y)Á.š"¨Ô÷2ğ‡'DjÚè}RÌ ĞÓ(Kíç%_ÔJÚJ²ß/˙€'ÚâÁVàN˜Ô~ħⰞ΅=ŒËOïâòIŜ”áE^—ámnék=1€çFJ"cÀD•7O ŸL ıBòD†Ê_&ò€3èϽċpŽ 2ÖĦǀc‹ĉP¸³5àıÒnœÛU˙PğÖ19Ĥ ¸şài\E{S‚~,Á:쨝 §=öUÏ3Ċ ŞÁ;->Jġ*ŞwA67exZ†Oğsuz´JS…x+ETÖ•%šµ +À›‚X'ĥyqoĥ a§}ż,lğ*$ż)ËÇÀ+PDá<á•ÒôĜUĵâfŜ÷ĥ;á]Ÿ–téĈn L*9ĴŠ ìû6âYm|ë˽¤5Ĥ%vŜ`HÑàƒ ĉ%˙÷npÜt_;{ ™FôĦD 2°^ )tlŠs>ù6u§+Ú<.›ò²cS-“bLmÈÓ^2]CÊ0VŒa´\żŒħ/>Ö0#1$…Q?ÌäJ‰zC* à×8w m;e)⠖ĴÀĊȁŞ·FZÈbìn§?nıô’X”vŬ/(lp!/qšYʋ³ Äœ’A.†ż˜o€CoĦCH·IÎh™74oKĥrAÍ,{×L Ûó86ŒmL31k*Óĵa.¨´vF*5›*x˘aL=8WJà„£ïÍRíĞÎÇ$=Ó.!÷;S.)­£İ˜s[”(a(Ÿ9{U6'ä]“ÓîŠ Ĉ˙‚÷Ҁ`ġĊJb"9ŻÛhž\ı°¸âVÚ @ À$Ž„§Ġy×q ŻÓêĊœ G{>“½§¸†MSˆÏ˘8Ħ~†²}5Hx†´”uèMŠ‚6 @À Ÿ¸£µ,Ġu˘œ¨À JòRĉCÊ7ž‚û‹ö½‰ Ù`IáäÀŻĞ˘GQ„ۓ˘Ž(ÚıÉó‡áYnÊ´ Ÿvçîʤ oş[ÄàžĊĤà†Û2<nlÔΐ ħXñš,8ñÈxê˘_U^~zŻ_g ç–)D½]ĉ´ä‚¤Jaó ôêMÙc½iÌI*7ÂÚ xÒh:è“*š<;ĵ M|U(p“#…_ĉUòêUßèN -“ĈF·¸Şj‰BZH4_˙Ëoüaı‚_F0j˜ĵ+ö÷Ç›îÓ ŽôPLVŽeĝĴKYl×ŬíŞè2DóžİqY.Ÿ¸qY¸qV†ğvx°P”˜h(!çċ)áËû.Ž›JM ˆ”RÈs”aÉŞÀ¨b½şE˘\—ÊêGÉ%0mŬġ1c>ëúâMˆğٖáU˙ˆ•èBœdÎLG|×ġ[·eĝjbĵXž˜GŬ•vŬ×n'iİÖi^aċÓc…°³2’Ĉà2 Ĥ~bL @ÖÓ RÄ("°ƒA‚ÒżmÀé¨ÈiÁıÌC ŒDìBHˆ˙^˘›Ċ–·Éz=.À·€"%ĞxÜC[9=‰Oˆ" ‚@ ĝe ;ċäñH”RèĉUċDÛ Uòz'ewâŽÊÒ|‘Jb‘j\mí{é&qS] ĥˆu-i´ŞêZi-|:Ž Ĝġ‡ k“"XÇGÌaŽI)àB'L‹Z#ğä\T"œëZç'ĥìòßĞĉ–ìù&Üzq·· F02%%Áö²;Lm6ˆaÄĦ=›~*qŞçÙyïúV³½Ò¸:żëÌÊİGg~Ĥ–ucò+á!ӇÄv•oLùí˙šéçá§Ŭ „ġ˙ìʆHì§Ş\ÜġItÓ–ğ‡àíÌä–+"eĝC‘ŜW…,ŻËy~Ù˙ĞQĦ§÷p<‘ĉ½Dè˙/–ğÄBĉ‹%>–Ü,|Ġ}íĤû”ĵ6×ĊùÙĊŭI—s}ôpq—+Afô°ë.ÖW²Ĝ˲ @ŽÛż/CY&üŽ0îû2&-´Oj'ôÜ=nôKMóá~äïÙÀDòsĞêW]<ŽïŬò0ŞQ.ĦÄJj•·Ŭ!Y€êÇgtŬ9ëî)^w'ĵìòĴ›Ä„´ë{òŝ·]­ğGa4żèÚyËŬĝQ ÇÄĜ‹Ñà)İJ,¤NO}“Â…XhĵċlŞċ¨„†ıĜRÓ$3çxż#uhıP 7zcT€ú#L\á FçSıì8ċòÎŞX9`xSÑÇ£ĉ+]XhQñ~ôYşëÀ…Euíĥ>VҐ˘\jjkĝ+|ŸôÀŠİ/šĵ˘ÓÉêxQÔxx ¤@Vİeö>ŭ,b=G8gO¤ĤÎâ1Oß:•áĜÁh°hË3ÙÎóĜĥIôċӍÍt,ë(>úpír ĴK{Ĝ`ï™ĦmÖ:vÀV’Ħ›ä. ‡|Ñ.KTĤ}<ÏTÜĞ"3·²…ġÊäA˜LŞĜĠÁ>Ĥr`ğ!.ÁĊS†R%pqGß ĠĎ%i£ĉ(8Üt‘&] %o£dlġ{Ĝĥašb)Óé’iÒ§mĊ?dĦ b|"çßÑCH'§˜†ë2<-geH^ۖámûÔh=…Ž0ĵ(Mž•aaUB5óÚ\ ;³‚|sôUpÇùendstream endobj 373 0 obj << /Filter /FlateDecode /Length 4875 >> stream xœí\YsǑ~‡ġ#ĉÁ=œŜşÙħĉlŻCŜ•DĝIr8AÈĈ!™˙Ŝ™•ud5şqH‚E*|`E£ş*+Ï/³²ç+1ʕÀù˙ó=ħ:ÙûǞLOWùżóĠëŭ½˙üÊx2Fċj˙í½"WAĵġcÔvµ7HħŜ˙&{ĠM6n ÖÀ ûG{__­Ċh2Q_Ĵ7b1?\áĈè½vk9 µnİŒQú@Oöqx +DİE°-N1:뇷8Ö1hëŝş˙'$p2œ•-D|şŜ£Ç@$ä}Ż`]d @ ŒE*¤g£<ì­äpĜövgëÖj Ò&’ĵh‘”WüŽUŒ!¸á§H §IiáÜp+èQ‡0œâĉRh†‹ĥB>ˆëĝ)ä;5~ÂlC´8ù³ŭ½/á ²ĵŜ £×ĞïAĜ“RÄQê•×ʎQ­Î÷LhOÎöŜÜ'ŭ8F§” W É+Ĝ_Ô€Ż‡ß1dĈĊt"@`Î4GY›qDǷс¤ĊRF5ĵOwÊèáïF „òˆ'V2’Ĵ~úħ$!ef`G½Ñڕɋ;wD¸3J$û̀„ŠÊŒœ:ğ šá„)*¤#ŠuŒ†Äéîñµ ˆôŞŸ~„ú˘3rĝfÏ£€%gÎ-A‡áİ*€ş-œÛH39wxÒħ“™‚˘İ“BÛ •vŭ{ġ)ä˘ì#—´WÊƒÖJçXÄÊK+Î¤ħ ,ÒÖ'?\c(&…%bĵ9˕ÎëdçJ…êqĥ̰Ĵ…GäĈœ) F·utPGgutĵž›6£3B•UżCħ)!{M:L\·,ċĤIkÇÄ5C/(ŭ(Œ˙péŬ(‹ApÙH9F ŞŸ–üĉŞÉl{C $`µ‘ü;E^ßĜH+ŜVœ6× >ö1ÂċġÀ÷ÄAĞġ‹˜~6Ëù¤ÊéŸLNä²£v #ru/˘úY,*’ =ӃŠO6¤ÓzŠ‹:şa'+£“™gW³çŽcpÏ$'€Ê?3ċñ'’,fŬĸÙB„ĉ@ġâ•~‘ŜÇ"=r“Jô“ó$&ĦĈ(äp/˘üDÉÁÈCžÓ™@` A2YfÖµßĠіíw÷Ùá½TÏRhħ(ñٚÖMâÏ­Q*kċo ¤żÑdŜİgxëĝÒy àµz÷ġxŝ˘ŝ/ê˙s°V„gT˙§`Żx1€_œ<)³˙h,@ûŸÁô‹ |\&d÷b/ĉ‹0ž´ğÓrWÙgÓĞÑûtAw3289ÉÙOSµ(·ƒOĴZ<ċÏXµàŜ+5Dx7”Ĥac_×hÁüäÎëHrTIJ`„ûHÑ0Ĝ!6ĝ b;¨ıÉ{†Ĝ¨#@(ïĝM:SŽ%aġ"ìgòĈOòKYÚëĉÈ£eZÍĉQĤ‰] İéj@5­Œ0V&VäHT ÌÀd5ĥjŒrĝïÔN)À€=ÚoŠŞÎ„ÖOYÍ>1íÒY[ÚÓ –Ĥf=ÜÏ _+"Ĝ¨Éš3Y÷erù1#‰ 5¨ƒ*Ĥ~ÔP'˘‰÷xí{ґ²E›zA‹ëJ™Ş‘NÙĜÍHÌ6ÄTıÑ•N•-@oŜçV?K—9D¤ĥtP‚Ÿ´62))mGÓòĵĦôŽHAàŬş.ÂLRĴ5•ß–Â(§‡’µ˜@ÜmĥáE਄k‚1S’—ÑGÎ×£ÂK›!ÖxßÓ CÓĜcücuaß Ġ ˘‹†½EÊ‚ö°7v ëœ)Êh,Î3M ĜIÂß% ï;ĥóÉ3|g™Yµ ވ˙ïIÎÈÉHÑÍH?FƒêтAÓ2IG¤×>P³féx.wHÂĊT‰g!À|98³IĤHÍıWOÌş˜ohz„é]os‘“E_ .¸# é ·aJ~"vXg‰^KÀ&èÉ]ڑĞÔğÎÄëÌêRğ.uH-B`—zŒàŜE^µá ofŸnÛ6|ۆcžĥáĊìş Mŝ ŻÛÍì Wív²žU; 5 ï.›Wa|>mŜ(uCƒÜèä~MOQ>[Ô×ĴĠ²6)ì°=­–ÇUû€Éo’&23Ŭeu [ìñÔ`#j–LɀÍÎ¤Û )bw˙Éñİ”Çt6Ĵ¨ZĜLzdÚÂ0™= ÁY}ŸÂkˆ’,o›Ĉ2ıÑC4 ½î”{;҂dĠ*ĊZĥ)óµym#Tİ;Ĝ¤Èiw˜ÑÉ+ıHYwM^Gô“Á›PĝµÑü§  péĊ!îr*×ûċᣅ´ŠĞZÂKQC”ä[ìrk>èĠtƒfx-X–>à̟—½Ó ,,&ú8Gˆ3Ĝ^i+´­…ı‚[\VÚdRbS½}§½‰".¨7ıĈ”"ñÓÒûPk‰iYEÌE8–#ŬSYÜrĤµËĞGTًŞŝĝÄŜR^)ĜÓÛôkĴîûCsU8Ú¨ƒ²ġ^ 0܌"† VŽŜáŭž‘Ĥ‡uĠ7ç  OĠÁ<ĤĵÈĤp@j>^—üZÈn;!͂Lkµ„^G„‹³%màvGĤ“żĤßf™ıUĠÍmgoÇĉÖV˜ħĈ ^c=Œ#ÂpĥŽ vᣞ$ÀÉĈèÒ%Af›5V,–3w,Zs+ß,Ĥâ|šż‰B”áUv*_0/S¸ì>…€ÏâĥĞ-ìCĵw¸f³ˀżì‘@ .íeà9àqïB¸Fálüm–ĜñµÉ–’×*ÒŜ"N‹Ċ’–Ğ.ô÷iŜç Ħ°h}ÛmŬDBĥŒwŝ­Ż“ȉùŝ#ofKWÄîT;bNÍ ۋn„ĵi'xÖR­`ĝd-ë=“ĊUhet§ñĴ@À•›È…ĠԋwêsŠüçĤ^ž‘ĴĴ4Ӏ>½o f´ĴcâĞİ÷¸œ Ĵ£ò^¨ž]ëA;Ìżħ„ŭŠ,’ħTyGecû[Ŝ-ĠŠuĠñĞV£c:ÂiınòfĥxBN-ZsÇ4ˆ›çqçġ“Ħ\*içċG${Żo–(„żR^Ċ TàoPÖğ.=m–ΐĉ"}Ċè&ä1T;CŜlİ/µ&Rİ/âœZm`sĊ*}h4΃÷ıê‡-ŻsÑE¤VÛ ]x-LW6˙ôş[‹Á·Î�°im8RÚÍö'€#UÊŻö?ßÛ˙ÚŸ­˜×[@Âĝ#?‚÷A§]Q=™Û I=ˆyéiÛ+ÓÔz4w ù€Ñ·‡Íċ,Xñ%[‹rX¨+’vĈ†İ3Ç÷0ùŭnm͘J`ÍpzoÉìĤy?­GÇ ¤…[ûëzÌnÀ˙҆ŸÍFw@ÁUˆġêŜŝÛïÛÊì2ûó6|óàÖ ŒÖŞġЏ…ĦtÛ!ûÁ ɆMŝÓ´¤a͍ŽmË?îp‡ßAó&ŜÀ2[ĦyEjÂ3Ŭ¤Ÿ6ÄL’á{b6hĴ îžêj_méŬoŝK–Şóôċ˜@nOáÑÎÜzoX쭙ÚY›Á1}Œ×Ȗ/‹UÄ;ıœÀiĞĝ'ŭĤŸìÓ½3Ú&̔k Ŝg,½Ò{.ö @é²ŜÉÔĵ<›ıv „lW"`ê=mƒîkóÄa`N_Sĵl)&ƒ›³ #$òÇşDLuv‹7ëy ´Aû\ž`lĴ곀êĜeÊ5)‘ı Ğŭ¤a‚Iòdž@vy')Ĵs¤Ÿn˜œsvxž0¤B`Ïŝï§Up&ˆZhşxN5 ɛ½v7ô8Šƒj)½zX:ĵ]ħO–Ĵٞ9Ŭ Áëmuψ\`Bw1ŬfÌ7iì&m.ıPPĝÜfĤLnTY’Ċ“vÍbp_ Ş;²€ĤWÊs ÙèT÷üäşU¸ßaŞ}ˆë@­liÂÂßkä°bÖ]%&úT%Û^—%tmi°‹è1ù^'CH2K˜Ì5WP§…éÄÏü…–ĈÖ4QŬ ÙÁn&Xµm]šSK2ĝ `“JKnwIŭĈ´ĵ–ÚOA …&Ċœíࠜ‹·Ós×C)íӍcß}…Ëb•žxĝ·ğ-˜tHôĈÙûYìŬfx˜MŞÔ܇nŞy^)Ĝ÷Ü×7İ…ÈòE‹Ž•;^ŬÈiATĵşħ˜ R>îj´µÈsវWĤ|\Óġœ¸^a…/tĠ_&vÄċĤ‹IÒHY™‹÷x’¨äÒ7™aQ-x§ğ·ŒÔœÜñà¨ò µ ƒÏìŠ=œ‹úñ5#L‡'ĝ“Û*Y(ŝ(l-!°Km2:”˘š†Ż'´XÛ˙ÖGQ9Lx6#£tJ Ñıx²­ßeHŜÙċX÷Ċy.ÄH“ğÔèžIÈûÛ<ÎóÖqS-ğÊ%3 ~Ÿĥ|[ŽxƒĠÒ3ż"ż§„ĵPœmÉĴdĜ…ûá%Š­áÁİÔÁ0Ÿµ\ìĤûYMyw£ üxÏÛż1qĝŻġĈ*d6ĉĦ~ÛÜèĤ=½hOÛû6L›Çj7³/Úpۆ—³{\µáĜ†Ÿ5ÌüÏ6Üĥáy^ĥáY·ĦlC^df –03Ï´JÎŻÛp7{ ›6<{1˒³6ü[̰Ż= ÎGĤAżÈ³?=K½_îŭ j;Šùendstream endobj 374 0 obj << /Filter /FlateDecode /Length 4743 >> stream xœĠ\Ks$Gĉ,ĝ‡ìiêŭp`"ĵ`"p`Że.kCŒfµÚe%ÍF²ÙÌÊêĴšj=vá€}pıU]Ĵ||_fġĵ=£<ĝoŝïöòHŸ½=’ééqŝÏöòĝÉÉÑoŸzOĈ(˘<>yqDŻÈc̨M<ö֏QۓˣgWbQ8íċ ÚJ íÂp½Z‹Ñ aÂzµÖZ>Ĉásè`¤JÏħƒÑ{m1ê¨CÎݎA[7\àh†¨†ÓôžS6·ì½3x줖0ò 4^Ŝ\îiE~ĝ²Ĵóĥ,î$œÛĜĴ”c€wŜÑëA˜áÛ²06íîġJùQ†—Vn4´M¤µè1 _$A:i_y‹lğĠF…ïpE‹ħQ_cß $L<ì.Ħ‹—Òı8ìË~8ùŽ×~ĵZûÑY<ä“çGƒ”Ğ“Bi*X#×ڎÁ9ì÷lx Äè ìá÷еU—R§°à8üş4wùĤ4oJóU·ïUi²q/JóyÚaÇ_ˋtïÊÓuyúUzjñÔ>[‘ |%(Úĉ£>>ùËÑÉož%eθî6Ùä×ùI;czúYyú€Ìͳ„Ê`?Ŝ'ÂÛ²ë³ÒÜO#„a[žnJóŞt¸*OwyS:œò)ĉ§{Ŝ·7ÂuweÏËŻşË9íĈšï_ğ³íî[Ùĥ}¤òe\;<)Oo“*ikÀOx²ħg‹òwÖ<+Íë2ëŞÛ÷˘4Ÿ—ĉ>Ğ0šħ£µ*™ñ´µ6£‡h=vLÉypyj\ħkt$wä9˘Ò.³‘Új99”ô8ù|ĝĊó+|\”ŠV€/z^\ö†0¤†ñÀŸ‚WrIÈ.=ıKtwv8?KNX*iÒá()a:65í7Q9JŻf}š†ƒ£ħçù@0ÂĊ8 ùç@16[\“AAĝ§ÚYƒ“kA La­=8l²ĥÙo( À{žG1(Ħ4nß39ÚxíC–ljĤí8öhHVgƒFÉâc+üP˘ñ6 Öcƒá“%Á “-DÂsŠ›ŜÁ×4„CUÇèc|Cİ…hÁ[Ż'9°˜bA‚PßVAATÔzĜ\¤ġşh–bô>ï˙”[V–×ó'ܨ çóòWÓŜí ²ŞK%Ž™xAŞà`…ÑkPŝ è„u@ ‹”Ĝµ…µuuCƒ°W7t*h•äîq[qinĜÊâÜŞtżQLgc½€Ÿ•è Ëí9ë²Ìú9a™t­›IybH.FƒĴ„!ĵábPF!†H]´TĠ‘^Íp!‹ĴÊ83İk’Ÿ“a>Üx…0kŽ×RÖÒÂ_#̊Ĵí¤È҄ĴÁYz\lá:c:‰^}Í m‡£ˆàêmS`ÉÛ2àî"ƒ1Ĝ0şp ÚÉjï?O°Êƒr ½ÙÁ_˙˘ŻüĊ¨Ü °Y2 xOƒ_&U=ßh˙ ġàNÓêQ÷ÏèĦġaVa§v•dµô§An”aO7BĤĠeHğğ%‡àñiZ´r²ĞáM[A07oġj ë­8`í&}:ż×Sp8- nqê<6[ĵŞB…W`CÖĴċa u_šcž2LÊ+açŬ§ ~?”ĥ*Íż—Ĥ.MÉĦjïé÷ĞEĴQ |Vö-Kó‡"ĠܔĤï> ŬEğ…ş'•Puˆ%d˙ߝ ĥ™" ̀ó£Òd`šAáħ4+xÛC¤ ŸwŸ2L›·”ÚġÚzÚó •İĜËâÑ2%ìíĵHĈŠÚö=şÎä£Ò?`ëÛ2 cd}]gÍ÷u w¸ŠÇHòW]Sğ-ÍËûì‹+ÁŻşŒĊĜÑD3 ’3͘Š3ë_i VhIFµ´S…P=BÔ݃N¤uƒè‡QŜ`V@[ĵ$‘ñTÈÎŬ˜ĉ”`‡€Ìlħ9L'ÒP° ‡${êkDE0v(gÇjäDG¨ù†ÁŒ˙…rŒ0 hÜ =ù#Ŝ$/ r8£:ûütC ™ċ×ìˆü1¨:0'2ˆ)‹6ípŭügŜÁĈĵÙkÂEûTÀ2 £(Êá+×.j”VĠĜˆ0¸’Ş"jÛ"¤Š ÎŻm]´¸’|ÖÈrÊ (SÊ4?=$šÎcòIá hÓÂMvr†Ù‚d]ï䍠0Ĥ˜Ĵ…µMŻ( ×y*r ìv4Î01SsĤjÓa m&ŭ!XÛÂïÄb Ê&1„âĵËÛ´´(}àÔ{sA½Ñ…0MŜvß'xˆ“êà)`Nı$²×'—èICMĥlµ›‰Ŝ8ߝħ·Â“{—÷ JZ³i|Şc|/>ŻÚà‰¤a†ïŻËIîrz#:W\1€sDİ(ĵ–Évˆì^͊‘”ÌH“œm} ċÓı§"˘çŒ  aĞbµâŜŠ’N"ˆ•VsNLŜGÂb‡MŞJË]ĉD•Ë€!=èôIÒċeÚ#¨~¨lħ5)İÉPQċ-3/ÖC_’MdvA I&Ü=Ĝ✧ëœîv5óÙÛÙ[­“Ò—X;ĤȰ‰X—‰g‡@ĈaĵóîEžœŭáħ>èTçsúfÛĊĝÓ$txb⠔ hÎ<Œ§ÂAÁ V9ĊyçEîɕ g‚-RP<`ĠÁ; Ĉsc”f×—GP¸>VSìĤŠU5Žr´00ċèáDt=ê1gŽÎo›Íš<ŸĠKšĠ= @ċ1èGîèÓߛ iL}ò;ŠÁÉZÏ+R2}7!1(5ÁBáb^¸¨ÁóOU~Şk7”K‰²1£ä÷\g¸ĥц Öì‡onXTdoNÙ2X|¨ħ í,ˆç“ğó&sĥäñ”Írŝ1áOËÓOËÓû)L´Z†ŭß́œ”Ÿ–ĉwùùŞgÈLŽVbéfĥxô7 ]Ŝ— Ùî’!Ä #×Ï}Ec Ê3Dzİ0™Ħטb8oŒŜ–›{bXWÖÜçäj·Uu8ÁžFTށ‚7Ğ)3Ìb?ƒYôšrÎ) А {€„ŭÓ(‡fâ°\ö¨p?Žá‚ĉöĈ<ÄGYpVë]œA s[\lIR>ÂXeqİH¨!tè)tlk§–Ñ] ĉß”Ğ’ĝ§EPJr˜ ĜDÖ¨Ĝ #z(˜mÛ¸ÑiĦŒüD˜F`!aߙšĤÏÌ5€„b ²0†Ĥ(ŸŸ5")Uv7pƒËvO²[½Mjè ü€š% ĉÔ­òX°/t͖&0Ħ ’3ż”o+qÛFÛXm,–Ç*y˙ĞP‘Tf„·Şxża€•–Öa8J˜ô†ş`)ġ§†/‹„i-É#Šz9-4żFĞjŭ.…›£Ĉŭ1.‚Ë´SAÎ[8ÑËĵ¸şyĦFY„ċwYŝÍ·ċDı  Y¨`M'eEmg5pû˘ï[t]ÂË9|ÚzŒ<5à8„• ¨ç¤EË9([u‚US"ci€µqŜ7<¸Ayòċ5ħwoĝġ ÒzÀĠž'|žQwßR5òÔ:;ȏ[[Ùj€ċû cÍÚÒkċ ZcuÀa;92޲çÀĊò”&áy ô5öšDşÏé¨CĞvM8ə¨gÛŠ“ЈYŜœŽK‘ŭ°²>CKĝ„SœŞ7ĊVHD 5s`n"BŭÓÙnŜċ4P|ƒoX`cıfg9˜³Úó;ĥˆj{󑝓µH°Cï\HgêÍ%Áj8š\ñT‰Te'<{Ê ñĞ„a ½³ҋ’w™/.NH‚Ŝ€óЛңûžĉ×Ií=XşügS Rí(!Ô¨O”É@wÌDWû˘ô¨âJÑ&i\ÒËÖaàZ|p„v Dè:0?ÙÉB8ÍĠÇ4`.~t" ˜0тìi À?Eü\İß]ïG§'Ñ5ıs5:í § ŻÑÑhä—RÁ,E\ Ù0€f­NN§` í\i8íÙ*{REÉ[ħÄ2ÛU^bâ&)‰§ ë}Lu çêıg-ÙVÂŻ3•°$', Üğ.\OÛmï˜dúwUš7Y°ğœL=¨Î˜ÛB^ìŬçBÄc÷\’":yAGn#W MlyÖƒĞüQëcÔ(YŸòEVM—j’Z^Şk‡6TÁ‹B•Êš1E7Ììi¨kŭ€Şd‚Żi.ç< VWvמÀ“[ŠëÛ]WU87ÀÈxhŬdÏh`d‹;·“a—‰Ĝ²9È[…Bmž šc´“FjŒÍg^J9s•H9lħ#rùEĴ=½dZB~gRĠƒ aíƒ'U)óÖÍŞĤ;Däƒ+9kvġ*…´” Hµc Í”ŽïPWܕŽÍhŒ ÂU. ö>eV€—Nóà:Tqb!Îï‡Çş8ÇĠžíċâżójŠ+ÍE*uÁòï)áZÛPÀ.ß?pQû&Öóʎ•‹ò·ÊsxÂĵ#ijyHNµ_öÚÀĉFœĠÀÖ /l‹Öràş/kŻ2ĈQġŽċ<ÈYGÀÚ:çhO]ƒ”È>j ŻNËN™îl¤qdıÀOŞÚ`Ä­˘Ù‚ÔßÑ$€O+HŞ’25^ĦβÁ+ĝT‡; Ss~vğ‛0ŽçD\Ê>Lğ£s„SZDqsuñŠË;f‰[JıS¤êĠtSvèî˘Çk1÷uç­àĊ7ÜKqé’ŬX€Àĉ[  ÙÖħ„Qʘ¨0ícúsN, Ä`1Ú.3Cü;2@n1ĴŒĠ[èŒD·zaşcmûM™ñ€bhİbU÷gĘ8UÊòM%jÜUhKŸĝżLèòœƒÛmàè³^'@#”x7ÚĠFĜ³Ĝ~5Ĉ€yÊ(Gˆ÷ü çIi²˜^”ĉcîRVkn~VšìŽĉ·Ŭï˜-}‘sŜ „钜ŬîîMQ?nKL1fHö]è5{Üp/@ƒx³ûŽTt)wu?›2à†} ,O sbïJ³_8o$Í šë7àڜĴ„şZ ^‚_ĉ™û ÏzĈƒ"ĈÌÜquĝ!l Ä2˜˜°ĝáj²\şyÏò-óVÒ7w-,'û—L2" ‰…ƒM•ŸÜ“D5ĤŭsïôË ˆŜ‘§İyZ¤O/š ÙI0çÂÒMžfž<½S*Ħ0öy-UÓ¤LĠ4œÜĠâ^J&cSé{ ˙y'‹·Ú–Ïê [ZQv„ż41‹i0Żs…ANAyĊ{#xQ*!Ó./Ğn”ħž †ÄAŒÈħ;‘y—ehá!´RN†4ƒ~GÀˆTİ ‡N,É?Ğv•k\üN:íC¨żyÁ‡z Ö½t~YĈóĵŸX[mÎ78ϖÄÓïjcè´@§ĞÂĊÒö•KÂm‰pßç_´~žšcPm A5KÎJĠÜĊZĵV˘/Ğ̕ü>˙Âsö×í… ítşŸËÀĜ²#‚6IàŬÚ€(ë;™Œú{7/€ĉ#Ú\ŠħËÛWìŭó“£oŽè÷ìñġòï<4ÂÊżó püzh˜òġ‘màQVċŠîM`|…é²—hjĉ™f-A@‘˙›3ĝgú‚mñŒÏòk&=ÏmaµChċ •pzı¸äb 1(¤ DÜâ³5éŞÏ|I*c èÛEßÒŭgüÁ‰ïM ”ʳgĊs@H‹Ĉ_ ´˘:&¸Q™ê¨¤:ĵĈÁ3 ìBiNâ‚0^6Í›FŻá1ıs/'Ž”<9#mÜ\o‰Qqb¸Îän"LJs÷EŻ3—6—²Ċ´òŽšĵ“]~ÇşI‹_|z9X]Mç˙ÍÑğİ ñendstream endobj 375 0 obj << /Filter /FlateDecode /Length 6766 >> stream xœĊ]K“7röyĴ“ŭĉĜí`×âŭP8|X‡v×…B+Qჴħќµ²)ÎP"ù ü³T!Fġ̐\;tPħˆF%ùü2ŝr&}żò˙‹—gêüúì—3MoÏË˙.^ž˙ŝéÙïs ŜLYe}ŝôù˙DŸ'}}œ²ġçO_žm´Ù>ŭ ŽĤì”ĵƒ<½<ûqóŬVM^—ġĉÛíNM*'7oÑç£ÙĥzR*[³ı·:gżĠ6ĉÍïa†Ĵ­J~󤜃›çĝls²>üċé"N’ÔdüLė۝svJLBùî˜×$pÏ*E“Ò³3môĉ˘~cs¸ÙîĴ5SҞH Cg˜¤2?â³É9°ıÂ!ÚÂjèCV…°ıĊìdSÚüŒ×ʆ´yUg( ?•žàK•Ÿ0:ĉ”=v°j7Y ŜŸ€2{³~J!oÂÄëá/<Î>oŻĥ°R›•Ŝüş5aÒ)ŬVkgÑ­³SÊòÎÀÊĵĥLş2°İ@şšhòĉz[è ’žl&mG;3Œˆ‡G8Ĵ“ï‹äD5KIĦeÏU)sáʸ–XÚd’ĉ JÁ&ÇS„e6ƒßâÚSŽŞ(“J,19&­yÍä@L~#ˆݐÓxpÎäĈŞœif&ı‹Êy|fħúħ3ZˆìÂï%Ŝ{t²‹Ĝá7™Ö¤ÊïÜâ³S: kĠ{§AİAÄÏwdÄ*ÍüJÓ*Kßĵ θ ĵğb–§7Ż´É[›q’Ÿ]ô W‹F ‘?ñÊ£‰£ ÙúäñÍLĵòw  £ş™ïU;êXŞäá`²ĉË|¤1Dß(2Q2?VpUG_ògpŽçâ‡ĵ.šZ¨uù \†]Vi– PċyÙğ°ÙßÏÌ!–x‡"ĤP–Ŝó§“ ™ şVòI ÈОyZ Ĥk &˜èɸĈn[í½7l4-La\Ñ'ĵCá­ï$›ea¤G(„I2g$z>L|ô5Q ĜĤŭZ¤ Á:˙÷Ö{úèf=K˜,É÷~23{ÊŬb¨ió”3.mölî=üÉò.$Ä&²g 9NıÍġ“ÂfPŞ—ĵPgƒÙìi ˃`żT…]ŽkŜYċ'Ŝi§a@‡x­ĴżÑ‚fÜ0 J…\hËÎ{ëÛŭ]†3ihrá½ŜÓŜdg²ndœD|6X )“<‹,‹bŭıäı}^SGöf´é‚ĵŭ`#{Ÿ`ĉ[Ħ‚‹¸3Ÿ£ŸxÍßS:‘‘,²ÊĈK)ĜĴƒÔùĈ7×Ŭ_\³^wÍ0ŸÚyİ›7…Şlòâĵëò+l·nlŠ"Β™½‚…ċœgô°Ê}]š4E"2ĝBĵfıÂĜ@~ŭržÎ6_ż ok÷šgíy1ŝH#½K$`fûAá¤}›*Ö5~ûĥê늝<6Ž&óÒÂ*RVÂ*’/è·UD­,YY°R §Í^ C1{üûŠè˘ÑfħŜˆ×B³„4²ħ”ìz)úöJ˵֋%6=Vqâĉ5ÓpĜ÷äĊ<,E•ÓIÙyIŞ ½á=uAìú›²ù&¨ ŭÒ  ş_b0"IÎüÇ1µnNŬe£•[Pß ƒ;)Ĵ…İû™j6ï°ÍQ…f:6mĈÁ|ׯ8†×¤‚O½8´/êRdXż/1pDùÁŻee‹é •¤ Ħ䄵S>Ç÷­“)|ní“TAèĜ0Ş>ôÌ[LÁ9Œ-ñfLbÙĴ1eu­S‘Cҕ×ĊQÁ<*ÍûĴ]*“gÔFK€(ˆ Â>K1Ù[ŬfK+ûĝ†'‰ p7ÂKT?s-­3Ó "QĊ_Ú6V’ŸI´dŬèŒ΄ċ°'bÂC™#‡Í3r*(ŞWü҂ĞÜ˰ó˘™)ġÎ6{RÒ /Ž>ŽÌÌ` §·d„(´Z†)f‚;$^Ë äżżš@68W +žOÌœ§‚ĵvÓiFd2ړŞ{Ŭ9~cLñ×aîV\ÉȏÀáÇùEp·Ô#CdBÙEñ`BTWœíħé ĉ›5¨äÊm€ó@ì”ÚÈĊH™Aˆ\1•ä/nƒ!0û?PvH=ĜŠÁû¨ĉ 5OVĠœ!fásk[>M/ĵSáTX ù ˜&H·öl,8B´‰,?³†ïD•+í3d‹ĉarKè6·ç@_Ĥ+{Ĥ_İ´êáJEqяÍÁĜ6dùqĤ1´´QÙò³yírg/˜³ŝT€ä9—/röĥşÓB$2‹téٞRHuÉŻ9B-jXNY(Úm hŽd ò“£oż‡LNÉĥû°g~aXòÛçġ!´s,"Ÿ_´fi§#î@ì<L ıLdF$DZ¤ E=òŠv°×Î8ÀéÈŞèzŬ@b#şœ eW£B-ôÚäfÚyó7ĦŜDTrÌòHîôè`²$3*ÊnaŠ9C§ĥÁ›„À ƒ .fxá{g…goU@ÄNŭ(ŭ²`$bV–Ç7ġñçú¸Ż7†“ŭµ>ÏĥC§cIuŽ6żv.áÛúWġñïğÚ¤M,ĞÇ×ġqĵÚÂò2ÓÌaaÒ^ĠtĜ¸Ħd/âĜ-+Ĉ0"Œm“Ŝ%m3ĝ ;U…ŝÖ˘ŜĤ%m§ŭNòmà)ŭÎ˘È§ŭŽĊħQ?TyüPıŭhċEJ½†B"‹ÇÎ"hıŞùƒŻísI÷ßoe­-. GÌöñe:a˜ë#  fü§@'_v[­[Prç‘!ÁœCL8eol'1è‚Mü7ĜOtIRĵ¤· B³ÊÓġ< lŝµŬĠ·bìU}|Sûúx3a8Ù_ëëúĝĴš’Ÿ6Cc3ĥQž=™—‘6ßÔ·?ÔÇŻ‡?mÉ2-zûġÙÓYŞXÜċpqŻêŬ'÷ñŻĴ˙Ŭx Äv=İ›ĝvHÏ˙£ŸníËá&^7ÓoґË#tIϛöcŬ4]˙R÷ïieÇwġñ‡úĝĠKħÍ_ù‚îcŝƒH@ 3šĊÖŻd]oxtÔ½Ä·”§H{+ê1iU^oëQ#ğb:#C°KhġçNˆÒÉ/Š0ĞGċÊÄOZL²Żh„r£ù?x2 2â­޸eÎ"Ò× &AöĜäd|°ïl8ÍĦL •É4Ĵ°™[B˘OVôÑxœjĴĠGY:ÖÔC}ĵ“oG\CÀ\‰`÷ħĝ –§r_PñÌŬûÓâUÉ­4ĊKú“à!ĞĊdßVçüĠi™Ù9ċŸşK´ ü İíÎG@„HŜĠHjSћyĊÊÓ5ƒŻ‹äĥ´m°\mŭ#2LnÑ.rɐsGħyä(eÑf£,"lóĉO{iĞf{x̓<˜30Û ,$~ġôìÏgÜAÏß<ĥsĈĜ›Ï½ÊS²Ûg~ÜüħFĵ˘nܛéA3 ùĵÚ BKH \Cı›b" nj0&ĉ¸–c äè–ÈiiC†&a5§}‚•¨ß ò9DÉİéËè}*Ċ/Ċ/¸À]rN‚7EĝS0‡¤óyĦ‹xI„Š b\ŝÀ³Ħ§ŬwcoçvĈڃ6azSŬöU}|WEÈ8 I(†ÁĜĜLBl­…–a=8"Cc_í ı´{ˆŠXIۚ˘.RR\Ğ+ @…~YÇ6*o͉a1Vx]‹<Ž˘Û”ƒ#‚ÒŽÛ?HtßU·"ï=VÀ]‡nö›ùәäŞŭfôŝĦmcħŭxÌ?r)äAĤêéy >½ÚI8€¸—ôĉşgÔ X"°ĤK˘ŻIӖ‚p`ġ’çYîñ|yŠ1d?p}ß Fp EUÔCßP|›ĵ)µ/ÏÓ܉ß.Á–^Lkr&J0~%lKj{":‡ÛvÎè LŒD†Gĵ”ĉîÌldó Q]­:#†˙ğg§ƒˆĵ-²SĤrۊ2ĴD·ċıvIQ,‡áˆZ4~X¨³D|nŞÒ-´zŞĥ•Ĉ)TżÉĦ+7h&u”ÊŠ.MT^qçŻĠĥİ:íWŠżÇ×zdœx˟Ĥ•Ċ5Qôۅ‰] Dş·ÈH\5”ÒĜxŞc!éŽUÔbáz‰żĈš•Ë"Kuç¤ĉöìıĜ£=‚ĜQ{ŜĜ€Ġڇ‚Ûä DgbÛŜĦ܅°³Ŝ\ĉ'sĈĠFÙQñ˘ĈO:\S /ż:˙° z5ϜׂÚRk”bÙ˘`‚ Ğç<ş²•fÂġ¨ÀĊ˜*çĝ)ËUÉ ìÙvñ{É,îa .ŸŒUŭVFäxż”tíŞ {=VúŭŬâlMœŜ}e­—e‡¨³om<&‡& І8<Ğ[|ğ•ŒĞ1ĵÊ>FÛÍÔµÉR_â 9g3.ñéĤ–ğÀİĤÀİÙ=€S! [íM’Ÿ;×u×ìIYĤġmĴ5*ŠX˜=ƒÜ-Ŝ A-]*v!ş>^,=î ùµ,BÒCĜ·Î1K++şlÒħĜ´Û'Ŝ^5NsDÉ{—žRÔm˜‹Lâj ;ZĠâ„DÚk|X>fo-Hm-ûÒ×Ûm‹%D<@–|Ĥ6àÚÍD찝 k÷ôsϖ}7ZĴ0Ì뙆@€ß ³’ÏšĞÓÖ/+ßgA‚êĜ+™ŬJ­ılŭò×ïħÊ–İ [dÀRÏkĴôzé/j%m‘Ü[˘ŠúEDîĤ~˘Yˀ2&Ü×ùŽw²vŭèH ˜Iy›G¨™Œä(Ó@ʝnì’`½‡C·ĵ2lğhši„j‰‘µíg²mıĉġĥ"Gğ9Qß×Ç;Ô×C>çjéëäµîÙn™£‹£,'ú(Kôé­¸İ#¤°]nDY8•‘>cXs•oŞŜ‰ŠÀ×òqÈC‡‹*ppŬ dÒµ s\6ğ•Ĥ`ĝĊ0i„ÇÉX4rî•%Gé Wzƒ¤SËaš(Ŝx^Ĥ££Aéѳ˘bğîÊQiş¨MUj-Azß^X'ZĊw^ ?ùfĝVüL@ñMm7AvBŝ(J/‡ÜíÏ$ŸM<ßÁĈ§G‘–]äM˘ĉŽWġñ>ŠžëáÛ1oŽwğ6}L3 ¨v-£\ÔoêËú(Un†¤{İ}ìáÀÀd Kb3]ġQC,ĝ—a Ĉ•…ĉÔÓŜ–âĵkÀ6†×ž;kÉ>,~ÏdDÊI͓íĠ}6gĦˑöËJÚ÷ÑPxĝ} Üèg‘j {~TmóoA-ŬĈ—ġ‡+=wLQĈ(ê9?Ó9âHxaÜôĴ’"] ­6Ŝ6 eW@Ċ­ÀÜÓ,$ğ¸Ûä€ŜĤ9qI F0cĝ÷Nù„K4“İġsİĵ/ş NĈD ü^ÇpŜ˘VyO;4K{€˙/P%ĥéÒK‰ĤĉXljêéÜ+#…I÷Ëè"ä"64,DĠ3CÏĞ·PˆĉqwÇAŝlh0ü­ĥµ·:Š‚·ˆ„½} o°{"OI·dReyA&Bµ‰WCRúúq‰[üì\ÀhÀ8`"l$Ĥ8Ĥp‡ä*uĊğš¤í–vMêkÒ”ıš^é‘ĉ²]TÖ)³Ù~ Ğ°!êLoJMµ_-Öô ıàŠ”2ĉÌxM•u”½Ŭšr´f­xyûalÚâŠÒkµxéúOšĠŬĵĜÖ{rĴOñ}}ĵ­šúrĝĝ÷kù6|ç 4\ËbíêżÁöÚÜY̓Îi%CWĴÔ˚â˙‚€ŽÎ*óOÇ,½^”#E…È ž-'p„nèÊ 8·~IŽEN+M=ĉÎñ ‡÷|‘ŠFĉFùċœ)D [—“ÔX×˙Şä1XŠ->ÂiF–4î·Ÿè Y§. °·ħQš•Îó +ZûrB´L]jß÷u’ùĈ•—+?Ü|ê?›[%„G8ìüŝPbFcy Q+=ôy½KċŜġ}L+݇<ŽÚheJĉÛ]ĉË]œ+Ċ7tWl÷éòż½Ĉaĵöi‚UŸï Ŝ*”óID\ pˆ %KG4îĵX;-žÎ Y|jÚí~­×Z`Yô…4!Ln‰*CxĠêĦwü M |Ŭö™Tŭ`˙îAˆÚÛIäı„W+'îġÑ·3–q5 9hŬùĦ…“"Îâ‘nHž ÇïÁj›£%\ꂀ?ġ0rr[\=Dö÷I”mèä½G!Á'İ£ZvŸĥ=şĠoJW˙ĥ îÚIĦ£6£Ž·EÎû2£8ıôğ!YßV1Sdˉ†¨ĥZÜd\…÷JQ´zÜ+uâ ĥdK0Úmà†[#Ÿù[톆ºĤ\Ê{7Z%ŝ·“4›5ƒ?âj†ı°·LJċ%OáS<%Hv2VèO[PÂÁĜ´7_BnˆpÇ%…Ñ}$¤Ĉŭċüĥ‹0޵¨D×B•ġäíxpWĥ™kÖġ53Žn]U–Ŝmċċ-NßÀU³¸“WÍGĜI€ú[Üîgî2bċĴÄ%ό’>^ۛ$şUËûĥIn€Íе2Ċ`$Úf½Ħ³âĈ.,‹cפnï"w†úÙdSgxsËSQIïqBlċĵ\N]B h‡¸e­UsˆI^•%¨pR³<ĥƒ­ö÷wšċç à>‡fálĝĝêš $ޗ☨üQÎşX4Ĵ'x\JfL7Ĝè—"ÜŻh`X+m.“§\.—°8ĵÜâıñËĈäÚW‚ĊħHàö%:‘zDF 5Vo%[[DuùÄRZׄġwÓ矢ۆŠCLWŸ/îB;2ÈÏfšèŬ‰Nrĵl>4ñ̈́µ?´òŬĥŜ¨ıÒ²y1_è7Ò>v`5o7Â4íeŭnú”|jµrΝÀ‹ü³QĤí·Ú,Ĵ‹9Á|İ÷+ó|Ċ[{’ 0£k‚EPËb[PsÉIN•_ÊF$‘Ŭ’:„4Ş:ì– L½ˆhiĴ ú³@)Uĵò`ĵâèF˘ĥß­PF[ƒHċµoß·fıFçĝ¤óÚ W‡gı\9>›'œ8ġ3úd³Ċ‰+=³°µ²™Ĵz9u¨l„~Şììj·Ŭ*^<÷­Ĥf@zIš Dl ³IRĝżl­ÚĈíc˙Ëók”ˆÍ˙Ġƒĝ Y½––ˆŭQBúžk8,è°òNòŻìŭÉ,’B’4’äğ9ŬĜ‡'¸ç°KŸùP˜Jüßzˆ@ùD– nD›Š,­äà˘3ӀÊħ1ÌĦ!jhüi+Ü|_Îëdk§“ŸÀ˙Ġ²ŜG)[ÖÙÊÖg’utJİKu1ڏ—ÓŜëÄ=ÏoD–ŬĦ˘}p˘A ²î\vîúƒX·8<°)ŭÏёċžûÒ*‡ú1û?ƒjϝÎ>¸Ĵ^Ûéžî/G£0RP >²˘$ğt­TŜûdy#vı}—‘éBaòcwSŞuۍ\îñ1vöZ÷3ÛÜìËÊMtċZ=—!jvñÍÉתÜĴ\Ûw6aU òj0²%ĝvAE.pŭV˜‡cÈmîÍü4÷ĦµŸ²uçìüt!˙GZzmüäCÓŭĜŬŞ êçĤA(¸Éœˆê ĉ&Ċ‰°~ln\{û]nç{˙¨*´rêQŒQá›`0ϓòtûĵIìċ?‘ïĊŠ„÷P żŝh£Y}uŽíPPßêžŝĦ7ÓŬDĵĜԞƒ£tF—ÚÄ|O?enŭĵ´a‰{ċT¨ĵ#B„òߣXô‰Nuù ĝnŻÛ3 xŝÈÚÏLŽZX–5iŠéü%wX4°Ë››³ï{D EWdÉÄÁĠœS\a‘ÌVgó½b>‚/Nh—qÔÜÊŞŒ,OÑ îŸO‹žoĠtPEÍ58PJò†**w"U.ˆ,K£òÓz×kç}f,˙aèórSí >ݜNçùšŠ ›Ùì&‹ sÔԙ玪š”î›°ıCÑ*U½~ŝ\C,8‡U>­UYDp3*#.B³7Użŭ³ÏÜ4ùÇLˆÜÈUCKıċßÍ·ĴğÄıEċnµo˙>w ŻÉŞBZPèƒ4ğ, Ëŭ·Û-dw˙şİr,7qgs½óUŭéĦoŸeŭQŒp^+‡+òZşK498užDÍğŽŻp]Á{}Íßò.éF¤Ż ¨fâò lħ bœ_‡&İá×xNQ+ÇÀğROÀÚ ŝ“ZàĊY:L¨3›oLĦ×|:š)Ô­œ5§èˆ&e?íŝVœût—ƒÜRĝÁÓĞŸÒ†5Üî_³h"j¤Ö§´öa´'gQÀÀ â?˙#ûo—yMúo‹İî*Ä&˙ĦPáÏg˙ ׍Ĵ‚endstream endobj 376 0 obj << /Filter /FlateDecode /Length 8645 >> stream xœĊ]Y“ıqŽ#µáß0oêvhڅĞĝM²dĊ*ĵşLÛáXùĦÉ!g(’Ó\ı+îŻw( UèiŠáĜÖÖ pĉùe&úğĞé`&üŻüûüí“éêöÉwO ½½*˙<{ġЧOŝùÏћCž²ızúò bLòçóU ñ]¸zúöÉ·ğ_倫§ÙE³{ÏÖLnNğ÷ûëé§É§ŬëŭµsösŜŭx'kv7Ĝ 䣅çéà²Ki÷ßşœ\˜wo°·)¤lwÏèğنĵû({Żg ôüÍ4Ċ)ÉÇAwżXfwß´y~l“{šĉY.¸·ó!'ĝĉž&żû611ìéġŜĈƒI)fiŸ<ûÌsq‡´ûmälŻĞ,QLà´ż†^a„Y6¸çɄlvÀĥi20îôšDcĉ9ïÚŝ÷éïàx}’Çë\<Ìùé͓qû§}rí½ışváĉ_˝ĝišœ§…˜ì&ëùȧœ`Ġ·w¸jĜż™öbÊ– mq°oö ĈMĈÖŜBöğ·ĝlsNiŜß4e³wÄs˜S²ÀÍl kœ†›ƒ—cżàĤ.Ğñ¨A²p|´áH3‚ċXàCéş{Ŝvŭ$'ŭŸçÉNfwÄ-ĵÌênʜ‰:ñržCÄĊ×ÓDÇX[) –úWk'ë$QñÂ鉵Î7‘ôÛŬŸë l>+Ŝt1ÍEGıעÍéžWÒ,_ß·m’û{zÀ‰LŜzÚ>lB§!Ĉ-$ǕóSÜŭeGt‘|,‹IÉéĈË!Gݰġ‰— s§vç/{úĉÙ›pˆ0Żgâ$?VÁ&ŽOáÚzLgŻ;Ÿ-ï~9x˸£)DïyÖc^Fv9$(n˘IÙÀB&vŽI0Ía@é÷4ˆÍ@€ÏĊë,“`ÊN”iԃ’ìt|‡='8䀜4’ËrhfŠì-ȨîÙIô÷’ßàiAûwíêŒVë(ç\)Uê’S ¨U)…²…ĉ{âġĊ²³Q‘ÖI ƒwġ<›†ĉ£ĥ[7<ÊlÌî| şËÔ½µó4ë ¨²ŭöGÑ 6œÛğ=’‰Uğ0‘zéBhN!OµċíX$cai9YoËÜ|òpÖD0“M ¤nY Ì]ÇršE 補v‡ĤœˆʔŻÍ|HnŽ<ó§Dğ AËŜYk¤ş {X„E%ÂĴsd2ËòQLÒĤ)Ó)•ÇWíñm{üíñÙ~KRzw0sŞ’RpFsäœEY¤8Ièk (v§—ĝœá,î)İM7˘}i ƒÍH^Ğ ĠÁS'MÁ0•z7£ĊA££Í£?ì¤hÈ1€Š˙¸9ŝ‹&fGlĉ—‹ĵĠ–îvżÚW"ƒzÛV„’ÄîxY3ħµ0›P {kGߝî;ò*ïĊމIG)ñŭ›§Oŝô„íépġ~lGwŞĥĜÑpJ@ióĠœÑŒqlG˙–f<ûyĵé§Ì;—ìÎäiڋ™|ö2X’ ~Ô€]i3QHNІXè‚>Dw=Âş&Ħ͛ž:nòĞàâïÚÇMÖ}³Ùƒ`óO›ĵ=Ümv_ÄۑÌ˘ïˆf0ÔĞ*"ߗ· tkf“”ÒôDûù ìYO ]Ä4f>ÍÁ[ì [ż%ö3Ħcĉ`3…žƒ#hG͉÷ËZíî÷²‹¸µ-÷?ûdÁmrnwb²v&ôş­…Ĥœfì~'Ĥ|"w+ƒEP:-"”ĥ ïLÒÛĈ9Âú>Jn¤ĞÊ ĉjóPßb­?ìı/X{80[ġ„´ìŸïĞÚÙ×Ŝ†ƒ 0¨úX¸W·hGÍjJ“c oŒ2Ŝ훭ÖYyÔ:ä3ֆĊÍ›ö{avò>À€ħĜŒÄ·ˈ3[3Uu÷>úˆ°Ê ´ò°Wfl#­úú?œpVğ?¨Ú€YĴtĉÒâ(pä•%÷†Çà› Í#§ò³=:ͳñaˆw7Í^b%Éwí¸6ĜoysnÊ…Ŝtê‚m´W)Y1Á+·2/ô€Ĥù Üĥ ›%xŜd_IûUˀ `âì ħëé[ğ½Z—\;‹Ÿwj‰­ÁÙûEĞöĝ÷[ƒaŽöK4†³ŝ@!Ÿ}˜èH;oË&G9> ÙVÍùÚĵ^х=€IVMdkħsâFùÇgí84ú‚ШŬp‚¨Ŭ³’ÊyŬöTÄĤ³ŝ”’ƒ>bòE-Í=˙nÇì˜ÈĈڔ[› YŒ6uZ†Ǥ³thuÓXĠœ£@kâaöQ[3ÉĜXèß·ÇïÚÇö(>{³Ù‡ö8´f@ŠiÒ\ ÊGmŞûòĈ9VMÓ|Žù*Ĵô’ìœÈ28ò#žÜZ“— ›M)³Wo³-èŒp£`҃g$=tĝ2Òä³^™S%;’àßïƒ?V'ç5Jbqmü¸3Ë*‚ }I~R°Ó¸Mí9wKpÄ}CoÊh@ŠĦĤynĈqšçšÒ”Òĉ=÷qġĝEa|œġĝXlÁ ´AÔîġ5 í4|îy¨Ŭž‘ż:VÑd֑_ˆóµÒi[ŝ@/5^• ~Ñ#edma Ŭ79Ĝ‡ 7AY·K˜Mq›İ‹·x>s#dلhV@ödĦ ; ĝ4RÍ~@Dŭ(ptmÚ1^ÒMÖ8 €t2˜Ç–üÔ¸ŝ{8uBäÌiôġô6İÁo=tŭ=îX½Q‡6 3|↑ŝÜşŭG!ž7ĥ~µM”›^K| A”k00΅)QÖbß;sS¸‰W>:àßg•%?-G¤ñĤ0ƒZná;e^vV…ŭ_ûP)ÎÈ Ç.nŠy ĈÓ=âÄÌb„#Ŭ ü€ù1·8ÁPĥh+ÑREk5 ‹ĥH‡sg†  XÌ&£òzÙô¨sçXd“‰Šcž#€†>l§\°W ž”ŬIv½Á֞0êrΎ¨ ğˆ@—ÜŻ‡—ş%ÔŒ÷%n öá¨|×´ ÖÏe‹)ag­yä-;”ˆî,ŒİôGġmÄ!ŸµQYtŞ-zjÄ%Ȕ–Ädyµ2YGpx lÁ%Ċ{‚ŝġ*1F›E6˘€OïK_ZB€Ëĵ4ħ_eŒ×Rs“äVÈwYÚ·›1^Òù¸ò~ÏÍ;Mó·} ]áşÎĜƒàıƒQémž]ĴX’QâQ!ŜÇè`ìy K×gĥ2ioúr³<ĞCó™_’u0xlŻÚ‡öx×Ċgۛmß1•E·m 7mQ<7u›‡ŽlÉb£Ô*ôjB‰(pG…  [ Dʌ‚;È*ü#NğX²ß*ô0Żĵ&œl.IƒĤĈÁĦ.4,DQ!5fu…B[)Ê}! m“‰˙Ħn0ìPĥ'DĤÌîß83„KÙĊ4…,ÙFrŜKÚ0ìœÔ o¸7ʉlˆ‚ɤ9ÍıS2Ò,/£1=ÊZf×ÔAb‰X#¨)X„ƒ$ŭbáyĵàáP~ŝ¤"“zÜĤ6?ÒryAtŽ„pM„XÀŜê˘ƒMĈ3ùŬ˙Mğ;Y‹àbRÚʜlˆ}b@Óü˘˙Äü›² ż¤3ŝİC5œżœŻ,d3ÇI~ùc;1…r½iZv0ùWĵW‘~í}%@+m€î‹RSù2ċ 0$ÇÊĊEš°trv°µfġüÁ"ĉm2é*Ìp¸Ħ‹*K tGàMİ1­>ĵMċ‚f2ù8Y;Âü½’#÷2píMV‚›¤˘üI Êo› ̞iY"û˘:jB¤“y\|5ï Áŝ.D”Ŝ§ŒSžÀ•9ìH>FCݽ7ûNwÜÈQĉßH´ÜͧtF˜o„´‹ ­²FË9˙ì\ÖԜ)„Ĥ ŞĦĤsqd,Œĥ²Ĵ2ıħçh&{gF´ĞiĈEZ¤èGMċž•ÂÄñċätV˜6-ù04ôi‡óĠ!>tğkmî ĦJaéĴ½jšVÛ­ì³Äƒ‰•›9…hsL CUE69é{­×—0p³Í*m;ŽÜ—[Ŝñİ·p_(]˙.*äÜş-™œ‹ΊĥŸV /\"Ä2_TXÍŝŞGÌ[À"¸3˘Gö ÑE  Äż6Y-M*yŞ8‘ #¸"ž9à1‘âĈi”İÖu6êéύƒ7%mMÛÙ§2ĈîHIfGñ8O1XŽHâ{éŻ+†Ĥäħ/šR²3Äż›ĉ.!Yë„%s™’Ĵ'-/ÛWST N`¤T½ï+0ċKÙÎ6ğß Ô-{b;ä³ŝĥlĜ8“]!IŽä@‰r{âc7ÉĈ^|c‡³RDüxŞĦwL/ÓhpFñB¤˘Ù¤żÓ˙O ˆpÙjPÎ^ŻkïÚaó­èá´ßò›O$œÔòĝ„Ûx?˘”Œè“Öygh‡(苓Ĥ§†T9 È)­ĜBêœKÑqÊ”ó+8“eş‚q1’§¤}ŭNŽ'ĵCIÛE7<ııS3Êġ†Ŭġ!ÖbŞ˙Œ›ˆ1Ħ? ÑMôAêq+àcd?‹„é—Ğ1ğ`Â(•#܉Eš™tGETYZħœÄ‰ôÉM3ôʍżßoâ‚ìÈ%ށJ^ŜµqT-e7MH[Iô:ê@Qö-…áSĉ\0@Ґ€yo@#:ŝJt,˘kEžU=Ğ+ú}SÛÛ´wËû6ĉĵ/„ŞĉĞÖVÙÔ Ôë%I_[´ŝ˘<œ% Ä×ìĥkYĦAkħgRÏf Š 85ßH˘g*tĉY/ğDH§iŝ–`ÓĜ’`,ŻÛ@à5 ƒBё_1MäWˆä mgQÚñä”âa “Rs]iv û>Dĥq&—şsċùڒÀä Ò# bċAgŸÔqJ9vħJaSlé ĠÒë˜`Â?€’üü-!™ #ﴌ !X–‘…bß7aÀ2²ĵ_d$ É2r6ĉQ! †J9BÊzŜ| êÊp'{Àİ÷şh+çŬ:ь­Êí$TċHŻğ‹ıGÏp˜ p”è1WL>ĜŬvâĴŠPóÏ2Á+&°ç1B§}*óêÚ˘qïûh‹p)¨¸rĦ0î„ĜĊ5:“ÈqçúċVœ“ʨa_ÌĈ´ anıo”B:WÜ~lŞċ¨ÒLĝ[ßÀuşƒ–fǝelw7màU{ ûUÂ3ċR " ˜ıçéÌc-‹ ç¨|™ĵÒ4÷Í= §a2Û÷S…Òğ3°yhÉ1^†…#Ġâ&sžÄ1Ih£%Ú-°PÚ`BQ?ïh|™Ö/Òé˙ĴPüħĝÌ ¤‚)ĠbHOƒ$^´\ 먰DX‚²1݇ÊŬî·ç$í.%Ŝ;%”Ĵ4…ĴbgéNj­ü[áÇ5š@R[=Ttĥ†mÖ¸Â&‚pŻ^ÖCT_ŜÚ)vYùA;'µ ıG‡Q8È “|µŸĥ ŠğÙßÇ⤚ĉĴÊ.EÜi)Ìih’ ˘ÌeÇFLĴ²ŝG „œ#X;é°6°j~ĥäµ ‚ÒışĈ Šjˆ•Ô†ħˆ–Pt1`á8Š €Ġ.Ô-!23hƒk51s†Œ'T„)0W,i°:lÓ{8ÊżàX–ŭkRjpšĊÍÎ!ĥĴğĵ ¤–l‰‰L$°¸âpBú#‹ß „>œÁ0YjP@T#”|ӎöĤ}¸$9ĊÉYµ†#TŞħgĜ— ¤ŞS)EŸĤT`;cĵ­"şĦLċ•ĝTJéÑEİJ¤Ôğ”ċTî–JN·ûF͗Ċ;PR€(^‹sq˜´[tXrĠ<šlMqCuV6ÄÉĤÍ Tt( , Ĵ½1LE*‰w8/ H‚0›ĉ+!l)|§!& 9ÉĦĝĵÈÙQa„L“|Á}ğt.Ǩöw­ç.ë£Ë_ÙÈ joàpÍ'&ÓGNe%+/pá#÷ĉó2‰ħiÁ97ğ;š]-ëœx^¸P™ŜÛQ3Äż\<„•²•óq„ĴNm™]\yĜ9&ñóL9³G~͈ĉ#éu:ˆJ9 ;ĝ)ÄÑ f÷nÛÁ¤‚YÖ§ĈÁH•9ÛRDi¨ŒäB´—Ì)›!v:İI>ֈTp/-€‡ÖŬË^À); áé –µ%ÁÑË­.ĉD­ô… ĈYDl5ƒ˘Üx´iƒ\’á{&{î(›şím•İ|êöܳ\ë·*êßÈÇëšâEl Ž˜÷FgwmĜV:ñHÉ\Vבuġe%­˙]ĥdÀ"RûŠħÙ"|+żç•W à-ÇÏyXäùaı@òŸŸÜÑjxiR.éR§żÎ%Ô FĴVŠRö›X¤Èt_ĠF2$âU²ËB<€iŜ¨à#µ4q9 ŬA·‹ÒÁ›(jtj áQ™]}Î:ċĞ&͟-{äÄü>£ ?“Ôʃ*“”ÁqAìʁ+`ŝŒ×k°iùnĴàÊ.Ÿ'íĉó³î½ÜGA8qGŸÌÄv‰ĵZ‚;ÄsU"‘ŻYIá3ä Ĥ·˜Ù\–ÙħO¤{JĴş]Q0ˆ¸ĜeY\c'¸íçQ’Zż„ċ˙ˆ<í›Ó) *áJù`tB£o%YîRù‰İŒ/Èd˜ÌÎì]Yҧɗûf~+ĜŠ´ÒZap"w&<ħ%ÒW[uıñeŠèħ/ñĜ‚ñ‡èğĠ ­/EĈüclŻ}"}…Ê´‘’VÂlÁ:,0ʖ€I²ġ7……l6BüV'5&Ĉ5;ıSŜŽ5Zb ċ-;n”£[¤ìÌë5|ÈÁ˘ıiÂüŻfĵĴŻ$â#†îÎq—q~Ĵ˘Jkú.Nf4 6²çö~Ùò¤6y[çv%Ĝç)ìe^Š´ÏÛĉ‰£BVJ`j†Ş”šuÔß|Ä'dĜQ$òWÎoÊĉ%/ûZò´JD)sÓV˜Ĵû-!ĵèfeo—?M5ċ™Ĵ3İĉD[_ÂBGˆêNq/Ĥh}îrŠÒdxAÑġvÈ\wŬhq!Ÿ8ö­Û žI]ğx"˙x|7mĠ7rI P‚™@O]’Ş\ÂM[…‚Ž]ÀŒRt#ÈÖòôŸUF)‹A& (` ĉtĤ„hiFċċ–“)F£™JŬyĜĤ |ä\5]Änˆyd²ŞUúéúf‰ċd;8ğÄH†%Ë Ñ–Bw-Üî>aU³–>Ĝê+lÁꌛQ~ŸÂĝ)ċ¨`cÊĉĊ{%ħÄOu€LFO–!›z€ƒçeUáf{ïı5zÇZ·ÒĜ[Ġê‹#&‹ĦSEssKÍ: \‡|(qtWñ›Ÿ}ĉe4üS‡D°ÂZĠ€qg´sE B…ŭ÷$lûâèւÍVÏAGGĉٔë4¤ŬÛۙÈnǕž_U”ğƒ Ş­˜" Q%%‚D¨!#ĞŞIHÜk_+%î[ì"Ô ĉƒMçÎcĴÊ)ÀĥڟıµÈòàl…,4™VPœşoIZéOçsÜäé&œŜ„³ya\ğh”ûÇ;uÁ%B8‘˜³@çşDœèä´>ÜôDâ´şkµlû}•¤Şpß3‹ušÇµ{Ááu‹Ö¸¨i˘ïPŒ÷:û¨×ppk|+:W­WfĦUŠ4½ËÏW„%½ŽœÈmH’âċt§¤²ŠÂÛĤ˜b•d'2B˙À˘K7²À—ħġU}ö—÷ÛŞ@$ámÛÖ:—A·¨Ž,ĵÇżš|Ž]xyŭ}²g߆SŝSĜÖúïF|ƒ”l{ÉvŜ°HċH?½/˘Ġa‘£.³Xò÷àÚŜÎÉîoprXĉ:낏>cdIF­ó“Jߓ µ15—ÔĊŜ,ċÙêüĈZâżuy!/\‚­_c›RhQS'ëċ˜ë{{e´ I9_àé­zVÄ\X~ĜİşèAÜü‚‡ARŝ†èß §4k;LĞ·BËÎSŒNìö€Jš”=§:ʝêú}‰hżĤ>ofƒRŠ~4LKÏËrdòħMì‚ûËÍÑî`CċĦQ>×v ‹jÏ$m‹Ì‰3•eĤ£0ˆP¸ïÚrğ˳¨lÙ=óEYŒ6™$ĈÉ{ëÌĴ.|Ğg#ìgħ(IÓX˜Ûҁ•İ%8cä_2$C8¨Şĵèŭ_‘ĦVAŻi‚R_Ë)ÄÍÜ­Mğ]LïĞĈ]Ï+ħJ.)‚ĠÑfpžùüSúĝûE1^YT0Ö³5.ínI(Â%›5$ĥ56jxKñxX‹ĵDäcpŸcĦë 6ÖNĈ}‘Ïa&ïêUjŸCëoİŭuĊ³.ûu“Bñ0µŜP AŸPëqŸİÂ+œs ĞżöOùĝŠpIÀ§U ”œáDplTĦŞâ™Ç³5úğhzn• ëђ³%ÔÀZx Rċm<2Š=Vž 0İU…u³Oˆ€c£Yŭa8ĉ{ôSı™ĠSİœ*‡zßÈïĥ‰Ÿ6là‚·)|Ác1ĵZ1_Ÿ $15Bvü(°-šrPQE´ê¸^8Ż8Á<öE]Û:ĝk?xiß7 ze§ı°,żÚVm­56CHĥŝƒZtà"0ÌàŝZôwχ¤ôB—†-pe}t+XÔ¸ŭtQ ŭU‰ĉİĤÊÜQ—ÊÖ·â—TT•OñöuW h³¨ë=MP`U1ġg}ĵ.MRw]ôşÄ}•Ħ5şGèaÙK*ġ0H^*9|r#ĞÈĠ’!Ŝ‰ô3|“ĵ×ÀS#ïW²Ë ÄñISġYµ-‡8‡Ò”×ËlµçL""…ChIp·I§ıˆqè)aÑ|G¤²5>_—…KoğÊì~ZbÇħ ”ß/ Êĵàfqi&ĵY9ÚÙ³wcù! mäâŽĦ¸ê×]YšÂ3Ĝ*bàş*¤Rm˘Bè„Â* ÷/ù‘x€’”iK"+nğĵlëtûê ĵÊ î;)†‹œë[xFŠġš‹E ËpF—4ijÒ}§ÍgMW8?…azDĉUò€Ê)ċ;"Àˆd°5ÒîıŒˆĊJ—à§%)l²c=ù0J£tä£ö[ĝİû]šó×îwQúۂ[l"Żxèäİ÷3eéù2j• İ´Î%¤â¨V˙šFHı ïµeIEĤ ŝĴÙӒŝZI2Ŝŝ—¸ŝìë†5ÜóhíŒ =—M0H'9uN›3³LRSŝ if€áœHÊâOÊHUS‘)¸OàXòÇ·wapùçb$Y´˘Ĉĝ·}gŞQYÏŻS ˆ/ó-ŜG™ò• HaµÙı/¸“ïX˜İßúûVn÷Ĝ–â½È*sT$ -ıDŭ½,´ŻQ‚§í+†S0ĠH˜vMÄùû|F.-dDû…nhĴÖ ċëÖÏàG³[òÁk¨De5Öî½şChiİÀ8„îpC^]­Ú&X:8 —ž˜1Ž&ĜKÂ_Âĝ¤fğe•ÍÑÂÖǒs†9~˘šA .úcD”ı=X ÊF×yÖä3?0>•Dİĵ0(Îs3 ùùÒ:­SÜÁܢı½ÂeÉܛÂnϸUòŜ´³şToÚoo¤ĝ€È”éhÉöS>Ĵàß1íX)“râÖGîżÜÛ~²šĠ,9ñ½#’8KöŒcUġĤ'ħŽœÑ¸ùß“YmĵA”Ġĥ‰  ³‡ĈŒL1•­U!‚ġßmÒr—Ñĝg™Ġĥ6~)Cd9]á#ܤêċ‰ÛF(`Ĵ5ı$VÖµHÛîòÄşx‹7Qŭú–VHY{ÇMÂÖoá*µ+}x}Ż\gĈ×GTA.‘-3ppŒl¸óĠŠÚĴÛ/ğ—£´^+[ciVġFÒŭ¨kÊN ³Û…*YŻkQ6ù ?gÓr]ĜôĤĴ5ÍZ‰T“órYşË-îs–NÁÓÀ„4 €h—"n_pŬ Ŝà•µeҁ2˜ëXâŜlĦ şÒ\ê,éĝħĠQ‚§ÛCp"4>’ĵ€İ‚Ĉċµdp~‹żq¨°bŝu³şaßžÙĜ^ˆ&ÑBċc o£ ½)PÉħ¤¨ÀÈêL¨ïß|-µê´\pv{W֓Gż2=Ü!­²y5ë Vİ³Ä ÄoèüĜ횪Ġİ|$ĥ:WnÓ_‰¸"yÊĵm· Ĵ˘Szòm1½"endstream endobj 377 0 obj << /Filter /FlateDecode /Length 6150 >> stream xœí][sd·q~§ŭ#Ĥü4L‰ÇwÀ)=D‰E‰bYËT$—k–×Ġ’œ5‡”ĵúġùşs8ƒÙ´^•krı„âÒè{7³]ƒZôżòß³Û£quuô×#Ċ½ĞòŸ³ÛĠ'§Gż˙*Xô iLjuzy”§¨•Šv06­‚ C2nuz{ôġúߎÇaL£7A­_ ­Ġh|\ߟŒCG×/OŒÑCHiŭ)XeG­Öç4À‚F{L21/¨×¤hœ_ßj£‹Iݟó<Ż]Z?ŠyèöÊ(Ĵü€ĤÇ0FÙ<°ÜGDaŭE…óħwOŜËcl޵RĜ×yzíúYLlğ}yĴ bL‡ x} Ú6eXÌן3"½6ù\ċˆ€íñ VĊ^¸ËÀ¸¤Ö¤ħqTĜx½½Ċ ”÷i½Ğ0üùôs×FI^cÂàùôüh­Üñé·GŸžŭ‰ı`#µrJëA•I>IŻ´#8éŝbġĞ;ÇF:ìaVÖüE­ĴrÄkF{5h <ÙQ ĈŻpD?Œju+zĵ£m”Ià,EßiPßTÂgŠĝíìˆ;ĴÉ=ŜŻnc“¸òFc_‡)ÖQ‹o œ¨ùkèèA›:BéôÍ߯ĉžQù!8Úetż§ĉĉèşsÀK ÛAvGàbÓïĴÏñ˙o!~˙ñ‹ÂHœéÇ$\ -ßtÂĥçĉHœ( ħ{BàDĤî"Ä9FÓ­è‰1c6ŽÄÚ@¤ Ĉ9È-’À§ċ5>`ˆż½›Óhà'Úú9𠆉|iŝ; Ċ5}~KÇh żİíu”0v÷uùĦԏĨŬCYR;ġğÀYé`mÏÍQs×9!ŽFLäô(-A¸ı­Fċ)Ŝ ‰VPv°´"ta %Ĵ†e c}îI,5FÜ“çAàéù›d“ĦÊ߄b§]Œ ş~ÇSÏèġ0ĉM œû=ù(ɋÓ]ŝrĴ‰‰{ǃ×ġs‚Tfo;nŽš³(Û;[de=ŸíÙŬ0ħĊpH7 בÄjC˘Ĉ^Ĝ’óAŜÁ! /ctJ­_Ġĉcm>ÔħĞıIŽ ¸òvôШôWˆòNĉıÑ~è÷ÓJì>[ É·Ñq̔!k ïQ­<]ùò6 VdîΖ O#1ùq$ĥÁ‘ĠUù†Żc‡˜Ä àrŒa^sú.;N&ˆ°EY2èä‰jӖó÷â gŒó\oFp23†oĜ1‘ĵbÒì6d~üŠĝAE7úì°ĞĵñäĴÎmĉ½è#­èŝŽ=f­áGÚġŭê˜ĜéΎ”Ğ8Cp|fÌŬ£ú<Ż‘Ĵ1ë\Ħîs`ËËîˆĵ†r°L ÜŻD[ž­Ù‡ †Ar :Żú\ÀY¤Fi“…iżû£Ú\‰½ĥµğaî> eğ 7ǐŝ°öğ@ä@È£÷B,ż[q˜)²íÓŭıèh†D~Ħ ˆ6bs1ċĵžëbÙ=ŻÚb;7·ŬŒ³q0o-×É#ğ‡ztıè•hßÒڈo‡Ş+g·XÁ²EÜ]ĜŠ˜ĜĤŜ°tBI#vP6’ì.bfÈ\w´ äĠ`EÄĉ¤.n÷fјHž&!VäHg{Ö4V Š…f£²Ġ ö,ĴĉoċĜŞÏ3F„‡:@“  \‚mġ+B"3}F@BÊoŻC2`”çï²<£À„eIo½´YM;ÎߋSÖžbŻġ„?Ik8OÎFrƒ` |Öß_d! ž² ÷W‚k÷ċôVžMêKêžŜ?ïë‚gEfFëÖ÷Ĵ:B˘äEŜüéBTfħ‡T Ż…êùŻ‹şĜëŬq’ĜÑÀnjĜÍ4ñ­R”GB\SgWÓ·‘‚íi‚Ñ”ˆöÉİ&ĈY :­L%Hz§ï`1ÑËž²òӒÓç´4a‚ ʒ0Ζ°l9}/OAìŭĦžì'ħ5EıÑħ{D ‘ıúÙ˙ ŝbâ,µĠKßB²ıää³ka ˙“߃hġ ĵ)-ÙKıöž×€˜<í/öÍÌÒ™×ż9î35ŝ˜í•ôïFSIŻ({›*íÇÈ Ĵ´w  ˜5O´Ż3&ڗ5çï²ç<£@U‰ï-Ĵ“ĥ3ñ§ïċ9$[xg{'ĈöQħMżÎvŜZÂ{C× *ġÍñÌ<8@YR_ĊÖ}˘ŝô]h)fjOkÎßeÏyFŞRß͞Ĝĵgù^žCrö‡wĥwâlçÒBü9{N Xô^Ġ$Û;sñÈ0Öx:+ œĴ"zƒ£ĵĠñOßSN Î˜“eÍùğl9§ L5‹àĝɚ9‹0/N!³#ÚÉŜ)?â-³ñŻù‘_ó#żĉG~t~DèKXM’}şĠUĞhN*ş›öħ*•ò=+•i¤CĤçï²á<Ħ@TuŠ‹ÖÓĞ+ߋ3Hmùaëtóa£ûUWŝŞ+?H]İÂϟKĤ䤃'“b'—Œ?|-ŜÌibí<݇Ûċ¤’m6¨’˙œKÎÙÖ<Ĉ ‰nïI[ìÁ£(cŠżHjw4÷DĊnèvá[.ŻG·„ħCŝĵöÁD:PU%AĦ"£o Ò1†ħİNŬÁ:ކC{ Ŭß.'aH€ŒàñžĵÉ.<½eñgJO ÏèéRûM£kÒ/¨%Çà/Ö, 2T["Ÿ9ñ]8ĜƒÜC!|(_6ۍÛܓ 7n÷f1s‡ò‘J/$@†ÒäŒĦ”Y@Œ‡ráCñ ËEGw°ñVñĉt;’"i'ÑÄڔëœBİ6Ou †…4íŝ†Áµg˘×b’²O8Žo đ˘Ħ}ôĝ"½Ħ;šÏnuy5£§N*(t:‹|Q*œ°qFS%àTfG*/Ô+ާ @y,€?a3 ‰#%çĴ&‚ Ë ›W| Ĵdc&ûH†Z *°=aO)Û°ڋˆŠÁ—ìĈù˘CÛXÌ Ĥ´F.aĠFG§³ñ-Ŭ†Ĵjó›b£Rc(&%żí]I[À;L!,Ê=ŠU,µ$lb0*MĉŻÔÌŭlŬÜG5×th{úĊ!5ċ’í‰fDnE˙āJy,òÒk1Enħ{è/{%ÚÙŒßÊ$Iq(R)ŠÔû-XËqĦŒ@È5’U,­…ÔĴ8Ŭm­OT÷ Uà²è.gÑÈ£sı€.şFOÌÍjÔZ˜@^QħCż€B:Hß`4÷pYÌ­Íglgñĥ“\Rħ ‘³tq=šo^a\ꠈmzÌZr4?dËSTç$‚쟭Š bkıâÏ€Â÷ĞC€& i`Ÿ‘•Oı`µ†Żĉ]â²-–û"§Ċ{{RŞñ£ndĦÄàÂ{'`65’Ż ĥëğ)ùŝĥĴ1ş%ÜÁ3ŒŜÁŝqHÖ*y^ÓuŜ{?џ‚ÙVÏá+AâŠX.¸ċżçÊ;‚|q%ß1äç1VjJ[ÖĉÇ'àf }è•ĊĉЧ*˜i½ŜÜĉıÖÛË܆]]ASŠÑŻ7ThGxİ:‡ĠcŠ6dMjÇJ~‹ƒò<ˆàÇ g4˘ó|ñyíËj%H> ÖXo„iÊ´ ĥ^hÛ<|$U3+é‰5tċŽ9 Ż›×~Eai-+ÁüVğ[lCñsz_?e4HŜ"^ıQ‘Y+ĈÂ4(OÎ)½2ú£rä×ߓ ĊD63LGàoĞiöµ• Ÿ=†ĈŜnËÁÙ@ñÁùݤ8ìMT˘:çÑ3X).ÇJzÒhŒ3ec1áÁ„8ğàžD^Ï,pŭŝEr¨ÍWŬiÛğu‘Ùëqʝ·ç.*j'„LşċAè¤i“+<È2 ß~ŜW#&ßt36M°è›Ú|Ġ²kž/f §+ğ<äV„â@@“Ûé¨Z<³}œyGÈéìÍIwOr%[Ÿ¤­·Ò;şŞ6 IçmĈd›àµCÖÜDŽL_GOfïk3Óp(ôċĤè=ë’ÚP&Ż*Ğ…0Íïb“˜m,p½DNÏKüR1´Gf ò.`IyyBoí“8xnxG ˙8ÇÄyt*@Fö0KŻh òîp½$:7ïjó/ŬŬĊ>ÍĦË ”°²àߖB§Ċ]$Wšß…Y-lçÈښ²ˆ ÖWRk°`d!ğ3˰Áê™IáXJèŽĴ¨ ÖfÛ]Ŝ˘›HûZ€ġi â;hZz…QŜH"^Ż‹ççbċÍH–s§Í`Âĵ¨ÍŬžš›W]ċ°İÍÛ.ŸĤ{^›Z2GŸA{,“À1ñ…µ§ÌWˆiáĊhşÌˆ İ6Y…úÔh·wĠıš˜€€>áP ~6³ƒŻhHËrNşüÖAvë„UÄĞŠĴŽ^!o’}ƒµ%ßmw]Ĝnğ'ŭ¸6W›ŸvqĠ_LèÏıĊ“ôÂğiż™˙µ;ö˘;­ŻÏëbBEßĠŜ/kïOÌóŭnĤĞ0{Kbr󲋲>z…ŜvİÒçkÉ̂òżïŠFŸÜbìIġsSÏ%˘zúFô~˙ĥiB†ŝ¸î Ù÷]]˘‹}S$ö4ƒ)v~Ö]X½ €àû›î€şÒpÚċċÑß¸Ż †xIŻĈ(ż/uÇ ÑÙuW„+à.ݍ{ ċN  Ĥ Tĉ ­ĴšBURħœú@…ž@ ÇĞĈĞĉBù7Çt´_fí1‘Kc§Èg™Ì[Mœ›”„  Á"œ.Œċ‹]‘eOɞ´?⺸şŽtmß×ŬżµF†^ùŠ”Éo½"etPĉXĈ“”údlŞIÀ\W²·áŬŒT‘ŸÙù½\OnÎó ­§˜nZe‹^‡¨+¨:Öâ•eôO€Ä6ó-qkXG *Î9tùĜŻa;_†²Á‹£÷ŝ”žcsj3(9ñ>ħMĊbLw*we(úi‰*ʨ@•ƒÈ ˘LïeĝYĤ>KÖı6gG@ˆ?€5œĴż­xħàÛ9ŬĈóâBNézƒúT­ĥÌĴoef½_„"ïË)[í)[mĜnÄÑyo–ĉ ×üÈ+%™ÌlŻxèÊA-ä ÷cÓSöZS‰Ĥ)N[,S,Vk™6~ÈcÉ<Êü‰HĞp ‘8ı=ĊœەVÌjÓQ‹ßn~vÜ‚SµĴĤ•DMB ñ<"§NˍŝT—Ĵo²ï'µ°& M$ŝq‹Ì'Wğŭ„Ħqd^Ĥ;=Q2Òµwô3ĥġâUċM)µċ^ƒa)ğŸï@ _'…ĉĥa™ÇÍ\XÒ¸œĊY­ÑhŻˆO\œn”vt˙wÂ۟‡ĴzëŞ`ϵĵ_f<²md^Ê×ÛÑżŭDĜžœŠçËĴËVq-ħç¨à5ÍÈTQKż1 a=ÉÓëš½¨énB‰’7pÂöäߝŸ3Ş|óċèÖ{"íMîKC¨ĉĠÂáìj‹ĊU8=wĞşïßïĠ?²Ô(x Aĥĥİsëğ4ܢĥİdžëÁ˘ÄXÇû‚µTGóÊ9ʙ`iUDM]MĈÎFrÁˆ'Ĉ*àÛ4yY!Gâ>"Ğşżñğʇb—U_|éêÉu¤bAO:ĜÉ‹ž8xò-½>Ĵžĝ&D\vÔS³’!%–Ï!ël–Šçïú‡C<à…äKĉxè~c—G˜¤ßÎíëی>÷/ÀùŸLxC‰˜ċǟq½—·jtˆ(€|¨`_ċße‚ĉ—Ú ŭ^ñ.·)Â8o ’ÖĞïĉÖ‹ “Ö²Â…ħü˘Š73›CĴĜŬZz†ÒËxŬżWÉ˙‡[Ŭ~_Ó¸âH°ŭ^ğŒß]X›ù߁xÓ{CëĊ!-×ûzù Š< ÖEŭQ…Êi5­<ć‰çéŭw”>`[½JLLMç²KG7ĠÔO•ÊY˘ĝ†Rt˙ &ĥdxŞÛxò%Úŝ-ÀOşC“˙OTĦuóÉKÀUt#ÄdWykɝ|ŭ£‹?­§|“zƒdżħĝ38ú%ˆĥş˙½ŜüœJÚkŜÔĉ6‡ÚüĴ6_tÇö+TŻjó67µy[›Ïş‹mş½ò™Ú˙ ï‚endstream endobj 378 0 obj << /Filter /FlateDecode /Length 5090 >> stream xœÍ‚ìí„ĊżWÜúì ½³bì3–ŜĴ•Š* ;Éf‰Ç{‹_áI¤ċ֞X´Úé‚Ä`|–ǝx|#\èìpĵĦhï=ë`]ùÙ^:[!v‘ĴsÀòĦ²€ Ĝ·ÀßBwè`9L!6Jğ\°ç êóxÁ‘ß ÄvmĜñV[, ]„ċÂë^.Ê3ĥڎŜeÓ Sö*/I CÈş]°ìRD Q!ÊJÀc’üÈŜ˘–Ș–ħm5———[ïaKô·ˆucŞì`šqcĝ8XŠ Ĉ÷B5W%³÷£Sß³CĊ ûżĦ Ç6|Ŭ†o×>ĥáħ oÚ]ŠÛî.—°ÍhLĥt÷ˆne†=+N”ħ‡Ĉò;){‚ 3ñ$•›M/MÓ!^à´ï‰í¤(Ħ.)ÛI Oô‘Ç/ħŻèUĴï{hĝ¸]D"–P­hġ”ß“\HXYĊĵÔÈ\ ŬH Ĉ8HÉĤs‰r}ġa4ÖOĵô/̛t¸ŻH•ÉizÀċô€‘…Jë”xŸ6fG, ;•Gàá< FŽä4 (ş²ĞtµíŻÁÁı<ü3ÈĦħà{ÄB°6•Óiĝ² ßµánqöCMÊĝ³6ürñŽS>ĥáħ o>Ä]^-2Òq‘Ó„ֆ@Äâ¤%˙óâêoא&À9,Bĥo‹Ż8~ìñ_,âìvñâÓ2Ağnïu”Pb‡6ü§E¤}ù˙Ĥ'§áOFÙ3İŞòÁ–1ݲ?…T½ŝ8ǗµaĝÇ6ğm³6™'<³ÂLŝÈ˙ġâağĊYÁ½xĊañ„½`•a‘ƒ>_ĵN@ù°¸ĥó"È7$¤É\FÔ8?6i‹FĤágmXX{[ž;y˙GŜüqñsqéM·Éó–oXş ˙ ĤC°ë²ÂCÁċ7rÛ$SBN^µY!H”=È >toÍ ˜oWĵĥáoJF [h—Ĥö/W[ŝ%Ëô2òƒctO!<~‹IĜ~X|—¸éue‰„6€‡eĥ7mxhÛ6Ü·áݝpZÜö(ċyQŜÀ#uŽ3™ŽÏ4O½”.kÁÂħXvM¤c!MˆßĜ†ÏP1?ÖxIx>%Z#ŻğŒ˙Q\pçnñ´û6\v…ÎŽß\]üîâí…QĈ@ı#Kn4¸ü£Ż˙½;lŝgs˙dJÒX·q#ĵ2#iĤ‚àÔFñ1-ù͛?îîn›/ߜ1 PS@ùġğîñ°ßĵıßĵĝĝúxO âI[<Ò¨8ژ7˜óJ‘Žxwxûŝpŭ‹óùW=]@Ôç­ĥ›p™7ßÂA˙vaĴĦÔ›cóĉîÂ&ĊÄíĊ×çkڄWh!hQiÔrÑ4!eƒùUħhšh‹ĴÜg Ò4!yG+MbQ˙ù¸ĥèÓ(h1Q LlwĦ –L΂À†nbÚĴm³ÍúĈpĈxêĈ)ˆ}UBĔ7ùÄĜ[X6è‹:Ó­2>ÉÈUeĤ[ċ£³\UfşU¸ÒZıŞÌtв £ŠrU™‘ĞĵzÔµUuĤ[UŜ-V L<‹fMN4fLAN”i·Ñò• H4êÑÑhè-­.pmo B£_“²·Ó Óé€ù–°Ñ.˜,[ÑOKc§U“ á˰YHš\ä”ÙhëY9 A{ò *WóEŝEWızêĥß}zeìŬ˜áŻD‹+‘*Dğ`˜ÎRuP9)Jôš„Idß°q…ÎÖ'Û8ëĤB2³(g(Óe/˙x9UqvóCĤÚÒ!œ­§kŸVogW°•ĈL1•î ”5ÊÀ Ê ĤäS—üÛQnĦĝӀ $ÂR˂R ËlK—àğ)Ġ 5?!B7‡ĥAĉŻğrTĜĜɆH;îù@kOŠú·Ia “£÷‚NFĴiĴÀÔÛcqœj$¸T°F@-ìĴÇòM=şËtN4xÓ²w…ĵž+)ÍäĴëy‰BùœÌ?–b‰WÎĜĈ$²j0Љ R”$[İLœRÍJç@Ĵß'$Vjì°ÛÒ!´“£LqF@ #Œ*;&”5İŸ(ş£dkşKĴ;Ng‘3 :d†˙ÄçĦĜ>§0ÉÓQfy1gmÀpPóš]ŭĥ ° ™Àš`až çÈ9,koLġtË Áœ<Ä(޲ħo‚ÌÓ8zÇÛBÖÌÊ|äiX’ʃXIĞ7äR+•¤;Ĥ§ÑĤJ×ĵb)ù£\•c„ĵˆŭ‰ÚÉö³]µÉW3!`SŒ›’ùT[sÚċîmĴĵÉAŠG÷¤ëĈÓ TH4\T*ïCyO])Ш¤Í‚—½N¨%+™éĥ)KyJ~_†ŭ–^Ħ1*Ü=0‘‰ûżb5EĴËúRe‹{q×`Èh­ÍÖ rĥàU6o˜Żĵ ħ[Ìŭ•k×vrġT·2*VÎÑ ƒÀìßa ÄĦ:o†Y"’ÁŬµ°zRŭuTèĞ<…3 ˆ³ž•ÌššeËn\è Ó £.ƒâìŠï¤çwF OùO/WÉ?UĈ™}„²XZ€ŻS+ EbÄ:ċž]gƒSkâ[Şj #QY–:E(Qà •*bĝ+UĜËęîm}H/à eġ•> Ѹôĵ울á—àüÌ0?jS)d³0ܓŸ˜ <óĤá£T‹ğŽoˆşÊĞ8ìnĤŽ7/Û>ċ°èèF=‘óéĈ‚qK-…!Œ‚·ß·ûĴµÍ@Ċ^Òv„œ¨‘ͨ sĥöÖ ßÊ yG]4 {:UXzk4eÑêġL…˘éĝc'[3zG…nCÏr‘ñVÜʟµg>òí5wÓÜÇ “h²ĜKqiİqos¸¤‘v˙e;â}Ē ›ñÄVClœüÎ}Ħ(à­àgÌġDatñĴċ–§âµ)hÜMçî—ßÊhŜ˜!ŸĊ ċ™½ñóŽl2ġ<-`8kU$oú˜áĴoiBĉOÄVšWÂkcġĵ 8% í&Ġes‘~ |ž07vd²÷lv.{Œ!p8ŽÁ}*wjĝĦ ‡Ïšˆ0ži>xíîvĜ²Xâ ĈôjŸ v`…[ó͵µ˙ WĥKkÜáuQƒğ!Ôí:3z@+QïD?]EàŒ“Ĝ`ŝÜĉɵšP(QĊ”öNß}Ĵ÷OÜĠ+ĉŜr›,‡Î}`À÷ !T/ÁsŻ— ŽúH×Â`;° £ÂKbQŸ,,FL+CÏZЍ âj˝ĜÒş‚q£LÄĊ;]—áùıX,ġŝ›f‡ÖtÌÄa}-‚‘”]cAtŜp Ä5kaÁYĵ¤€ĜóVŜz̓<ğ÷ğr B°öĥΑEı|ϗ‚›³£Íoüèĵ•IŞêäŸĠQĵ aDwŸ Es]=bĤSpړÂ^’O¸,4|çé$îfÍpÛúĵ­ĈöúȏüoBpt9ÏĵBŠĵá’hÁžèĈL<Š]ó闛J™ŻKâÄmvò¸]™v*Ĵçs'`ϋAW&³ÖdşÏJ×§oöœšñĉžÑˆkÏԄÏ5ÎÚ!EpÎgežÌӂs–ì”ôù5~èŝ_~qYS‘żè‰ÖJì999ż½l û-QÒ)܀ŭD6?GXÉ*”7s·ÖĝMHĈ÷´3üŻMZÏuóşnKEĝŽ‰If4^wĈD~ ¸M„(ÏÖSúQ:?<Ğ(ğŠġaW²bjx4ï có<+ÎgûŜñ>+Ñċ{úNŭ)+P™³FÏMÑrġš˘zĈÇ+cŻ.§uŒ§à¨çÍô0fV?ğ š2 f›,P@]›İ½äÓżË3@ğ˜lèòi?á41hîŝ‚_Ŝ6÷îċbÎÉ'†ƒä+ˆ$@5ÀK¨wÀĠÎşgĦ‰1Oµg`^›†{û#po%nĈ‹Ô^Uĵqž×tXj]0ÔßĤ(Gç7[à4ˆè‹c—FŝbS´ż,¸M1–^ijE#§žkŝ@Ğòu}›',EUż²Eïµ­:,Ĉ„¨ĠĜhŝ^Òᙿ²§ŒY?eǂĠ‘,ìGĞ”ğĊRFş&—4„ĴêWxÔ1l)A f`xyoÊ7-ĦT>uöQyNpb²µòmT È£´İ4€“TŻù6p"zß74‘@2?Í&Ò¤Œ5˙˘,u0‹Ÿd†€Öcñ³&Jƒ>Lr¸ÎDÊ[ÛĞħï/gž(WĦšâEkħìu3ġ£™œ‡qfIñi£<[–ċDŭAĝ²Ë?vÂ5ASı²\™£˘-‰Qv\ݎu öĊġÎ<“Á„ĵàĥRħx"Žy2÷Ş[Ëlq’dÙáìż!0ÁħQžı´ScR†Ü”`0r¨ òܛ ŒĉnÈ2e5ÑŜwp4<ı/ûe¤Ôĥe(W œ½‹Á6˜ş$– KÀ™ŬCߣ:‘‰ÚêĴ—Ẏ(ĦşœÊôİ˘=ï SIóù#@kf<ö‚V²kže‡gaöèB½şí(|_–zÀo†óYÇIBïÛâĊŒŝnÏ@=ËÑbċ%ù.:Ż_7΢ڈ˜}ĉgêĝŭžoŸĊĝG'AóoY>>ŝîrZœáNtŭpa„rïÏ .šeUŭP58í<˰O; Ġ´k+ÚYSÒġœµ]çĠcìs2³ìİHfÖX ]÷Ó²˘ŸX@şjeuŜo2Y%=ÀžŬ>É íERÊŜ§-rĤ÷eŭ,ş”…èϗİñŬ̴ъdeżÎ­xEwOŝˆîGöbġ'"°ô0żbeN|Ĵ2nO_­!ÈĴEDî*µúżÇÙŻÜ.äÊWò— Î쇴:œëŸfžyF‚(ç9’ŻŻcñĤŠ…ˆPe Ĉn!l+”}ÙĞè‰hX}Ĝ„]ĦóDDÀ'ž&™µ$}u`g•CĠR *şµ ĤàĦbuBÏ‰Ŭ  Œ‡> stream xœ]1ƒ0 E÷œ"7 @[@BYèÂŞj{”zû::tĝ_z‰-û;iÚkëì“G˜ô nĴëÌÓ4ëXšñŜêe'r=*ϒĉĤüûc˜ïj„ä™—9=[“žz˜½Ò”€ĠBÈÚÉÀġ_Ċ֙½òŒ•QB #f’„˜!^JI$ "IBÄYuq’$!+IBĴh“cf\*Ĉ;Òp½†nĦPĈÍ:ĝÉO>vqû\qföendstream endobj 380 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 833 >> stream xœ‘leÇßÛĠëAšò#ıdŜâ²µC܃…i&sË0nrŒ[ÛA{]{™0Zö£ëú@³Ġû­‘`ÔÄJX4„`$’ò`bNEüŸ›ïŝĈĥ?ˆ˙ĝϛçɛçó~Ÿ÷KafQeM}ŭö=NÇl³ÖXÉyĈË,PezĠô[/€›%ġÏÎċĜı ƒK°u)aĤ£g°Ró·<.·.żïĜäh6§ì,//-”KŽry›W xšŸ\£ènĠĞèfsHך=ŞŜŝl¤Â­ëŝÍĊĊáp¸Hñ‹´€kë,P{t·\§ĠÀaġ€\ùtùĊĞÊ Q‹ŠJÍëéj@Ѩ!ÄêÓôöZw!ğI-i ï'İ& o.K,¤‘œe–1)ĉĵyY#n7& cĜrÌ ,À ,`8Ŝž|0vuӛŝcbâîĞîÑŭ˘‡sE˘-ҌĊê:ùFĵÀ?5ôµ„mևW.žÒ÷ˆôsëÁԑñ…+ğñ}ô>Nċ˜/MÁY†,Û2IK閭%t-ÜŽNt>Ìa™H{i‰@ üöÓ=˜ú l|£²‰Yobr9dÓÌŻ˜Ï˘ÏÈĤ¸3YÈf]‘J~žËwh._™nĥ€Ë•…3RšpŻd÷ŬüF݈cŭ'ìKġdbéNˆA"ÑÓíò‡àƒGÇn›Ċİò‹ñcšÉĠĴá6Š…ŝ!8 ŭü9?CÜÁQ=ÛLÛbğĝğ´˙Ñż´›Ŭ#{o:֛ì>“Ŭ™×şÇ£ñ+"­65@+èÑT,Ùw"|Ĵ+é¨JöJƒ‘Ğ}£€Ká.ŝè3Ŝ>]„8<ÉüŽëp %;1#`!‡Î?o|u-Z$ÑäĵÇs>.Ïû°×|qh÷Î]Ñ·éKµ0· •ô-ŻkĴÒ:Äž›ûĈ–çħ˙Có³Äßĉ04›x ĤÍÄFï 7GŸ7q/ġB“HğŸ'_œ'"kĊ2za8x>…×ıô|!ÍĵŽO aùLcumG]"ÙĊĊ–Ò´m!˙†*ލendstream endobj 381 0 obj << /Filter /FlateDecode /Length 263 >> stream xœ]‘Anƒ0E÷œÂ7À°…„f“l²hUµ½ħ‡ˆEŒċEoß?CÒEoÄl}×Çó霖ÍÔe _ĵ™yIħ}}”ÀĉÂ×%UMkâĥ§é ·)WġñmÊß?™ ~ày÷÷éĈġçaèôU³/ kä{ž—)]ı­qžİâ˙}jüâ2?ízRĴĊ„:R ÚħWíE]Cе˜)ƒhG ´ĊNwv²³H˘h¤@£(“eљ(N5zO°ڒmE‘Èk*/İ<yMċ%•G"Żİ0 Wҕ´ŝ*لG)œ6½­^_˙Ŭ^^³Ĵ2 ú ׇendstream endobj 382 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2162 >> stream xœ­–{lS÷ÇŻÄı°(@Zk¸e÷şcĜZH`ċQħŽ ‘„GŜ-;ħɎíÄvž~Û×ÇïWâ$މCÀIHHH€ò€ÂSRa]ğŽîÑN•&mÒÏÖM]/dêĤMCë¤+_[Öï÷;çó=çû;,,9 cħXİ9ı;²×$fĈ^eĊ–$Ċ~Äş0ŝU|g ¤ħ!-Ù³ä 3Pë"¤Z€„ 16‹UĞuċH¤j™¸D¤àÍz3ë$ó‘ÍÏŜ¸qŭëü5YYùż*ÊÄ'‹*ĝıE ‘°ĵHÁü( êż/Ù$R(¤o­^­T*W•ËWId%o'vyŻ+Dü}BıPV-·K*üĵ˘r!6ÒU³ŻIı´J!”ñs%ĦĴ°Eé6Ùvı˘Şè¤@(.+,ǰ|lĥËÄöcËħì]ĴۂmĊĥaÛħX.ĥË2 X2ÖÍä)ݍ½˜ŭ4ùŭäG) œyê+ݵ8 —ßÎ{³¤ÇFµáĜê0+–6Ùq“l¨“ë^ŝàWáPMîûtZÍaR'3ë ?ÒS>üĴ­tút`n´Zê̄N,ÍŜxŜé ôxd×£gp ż{;÷hÉ{§ËHمc €JmġqUqC>P¸ŜEù6[ÄM´L·O÷Ŝ*s•ıžÜB˜ëÁ f^£·1ñ‡ÚœDzÌ2$Jşšî³cFÔËŭË[›ét:ƒ~^Acû1JGh)Ê$h ;¸Eâ Żv˘¤ó7ɁûŬ€OtŬw\N§”'ĥ”‰gö £hġ,€_ßc˙~™Ğ/3…€k´ Ò{(ÙQûYè†^* iKŬM A]U ->›gí&ŭ²3˘QÀ ˘UhٗÇlß}`—ÁDêĈJ:Ä/”yµıŽü †ëíıóùàڋ ÷‹éEÊ"R´í„¤ \W6‡Ía÷’éñŸAŬ‹˘V<5p>°ƒ ÷kÁb²€ĊBP”^iÒݜĜGŻœNçTXm'ĜAò#ԓò%çCo­DmPz(Ê \ëg“ÍÙì >@2›Óĉ'/ħ!#q½…PŝR-ßĝÎ]dóġ{l½ÀC‹8(-p"OJS) &J &\W8B˘m&Xpz¨!fpjt ÒzĦu ôZ PŒôĞ3C:‘QŸ<ġó?ɘ€›ÍŬÂH“=>yd„Yù ıE£i-ĝ\p:êëÌŞ:áĠ­ú–Ùĉ ïx$DŽUŠ Ŭôñé˙\ní­LıĊ3ÄÌÓB·Ñ§Ü/8÷üu’Z£Ô˘I31[&r ĜAq iRĉX™ ĠĉZÙÀ7q àĞTÎ_;ËߑYÔIĠĊ˙Ϩv*F-r†ìƒ0 —İĦDYúî×C-iäÊ <Ğvzì'ڝÇèç÷'ĴÇO1v,#–Ì-1Sċ`Ĉ5žúp¤-Ôwġäà.:M´ìxq{µOK´Ġĥ›.kϘ&Ħ—Ê×ÒI%‡‚£⚝9ΎŸV{ôsAŜMÑGˆħo<ŬÚz$@HŬ%^Áğ:~6­.ġéè ÓµK˘h Ó¸ó§ĜÈËäŝŽÓĉgÈ5ä&ÎÊĥÙmLŭò|†•LWĊĝ‰€ÎNYÇùGE|ĈÉĦ‡MJhd:vĥhê›q´Â•p•Ò˜ˆĈ2ÁʝŒûÔ{η8#Î&ċŽçVñĈÍöIvŒŠŭë 2âÄ[} ½Œ)èú#ı–2ñ”EĊ˘c€ż§9ğ˙ëÈ}Òq5C’ÎÓˍş„P6GIxğğxSÀ$—i+Ğ÷’k‚Ïž–]êġAOu?\„p´9ÚÖßtĝĴOZFBıA%’^e:Ŭ>éœİawÙ1I,ƒë€ƒ7ĞK  ĴVĠ¨¸I <šE§Òo™kFw?î$y#ÚÈ µ?Ä5VĉŻÛ x!ġ¤iĵÍo"ğîŽL\üĥgÁjÑĊT¨ £KżġYávlKlWf­R—u˜|ŝ÷ähÑ@Ŝœí.ğ“˙[´ó?=zŻÑbµêôDaÎfÉAÀJGĤŸğoßíħËà†ë<‚Ï%ÄŬ³y_‰ŻċÚÜv'“ıÏ`е.×-·êĴ Ĉùƒ Óš(½ĠLìĦuġ½²èñï£ÙuÎÑL´s Òü7˙-Œ;îUÒRŸ2‹BFż`Xpî!SĠ :n?Ú(c¤xpÏRš\Fo͜Ìùŭ? ŸĜĦû´÷Šçœ˙"és‡Úoü!À‡"1Ÿ~ JÉtt}–ñ˜…^šŸd£ln{} F]Y+İb\-Üê"èŬ3 @‡ï½X}ŝ˙zùVfïcîŞFWgWBhŒœFë|g7 ñ&NĴ>EŻ0}§‚{ğž1Ü*MħĈ f˘phñĊŬĴgLwNüW%̔–Q‚ΘħQ:Ĥbêx…}˘Ğ}áÈı :|À`gÈd6€‘"ĴsE×p¸&_ü]ĝéñSĠ§?޲âħ‡ÜèµÎè”ÛoóÚ -qQDH)HĦÂ^™p5£T:ŻĠEş­=T@£Ŝb˘ŻÏÀâħ6*D½cµĝ?с‰<"J ĥ—Í­ĠúÀÍa¨p·gµĞíĉfà5ƒŬámĈÓ³íç$Ÿ˜)1ĝDn —ŝ/ƒÏĦ’‚Âĝhäì…e%‡ÏÔÔê {ğŭÔ}ĈĠá>íêLĦyÏ‘ĴU2KÔäşÑ„ı/xoÜÜDÌO^N›‡arbXàendstream endobj 383 0 obj << /Filter /FlateDecode /Length 168 >> stream xœ]; D{NÁ ĝÈR‹Ĉi\$Š’\/‹Ea@ı} ÄQ”bVvfġ`x½Ë”ŬR€fj7 ×°%@:áì<’ùê„EG†‹ŽÏWDş6Ġ ²{Çğú$Z ‚Á5jÀ¤ŭŒ¤ç\ġÖ*‚Ŝü­d+Lö'Y$j·R5qsŞġ#X.ĤÂ–ú\Á+Xáqż‹!–ŬEŜ0VUendstream endobj 384 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 387 >> stream xœ%NMKQ}ÏħO¤/*}‹@‚ħˆ0"ĦEa‹\IĥĈ‡ #ÓĞA[8fTöüÈ4"ħUEğhßOéoĵ'Ó˘ħ8Ü{΁{· @‡"ÑX<$ġċŸ…|ÎĊçJ{;ĵ8@=ġ¸\œbG“,5Δ @xVŞE´\^ϤÒ%¤UIqV…Âáµ%´,Ia´b=£ÈY•IĞ2qÌŠiJ“üßËFšÜz0hF@VšžÚì§,!#CÒhcŭ'Ñĥ–%hOV1úïĝ§ˆĤĉNÖQTKb= p9/à­_½ĝÊŻÇzVĝ„ßœ =?+L?uh·›§ßÏÇ`!O £CŸ|ÎQó™Gğùı!p‘½OÛ vPlWĴ2KsóÂŞ´LKĜ‡ĥ3ĤYİ Ñĵ?żż³ĴvÛË(ĥbŬ4.ëTlß5[­^×|7–½ÂBñ/ĥËvgjġLJZŭÖŞVic¸UnËWWĤéóŽş×şž~<œQendstream endobj 385 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 482 >> stream xœM1hSQ†ïÍK1•Pµ’É$½ÜJšÑ>)‚%K$èâ …—äö%—^ŻĈ`cˆ(Íë!İې‚Ôê(XĊB·vêà’E— íR\í"½7Ü7˜¤‹ËùÏ7üçü?FnŸ‹'ï>ŠFëUq żKŸ~WŻğ%^ŒóċKüġ^ğˆF0~^{óîSÜ,–­ĵžcäq$ÉôG”DUġĈ$ı‰¨äĥA­|F+¤ĈrÔXĉÉC3“§Ĵ<´Ìä+Ŝœš*•JaÍX›–~kpe’”ò,Gj=YrÏ,0r_3(9‹>“¸iŸ0j‘¤™VĦ¨Y´0OçX:ŻëC†BÈ5~áe HÁĜ]ŝ#êc=ÖïĝŜ?z}óì‘ÒKùOĝ`ĊnĜÍı/‰n‚#kwĝÍ-~ÂUû‹‡wvšMh@Ó³ú *ƒòXYpTpżÂ[roƒ}Moëíj:àé´`uâ˙§"u¤ˆ~ùÌ"Dĥĝ^éŬNoUÛ6TÀS} µ•†=ñYï&şñ˜\û)ÀñÜÔċ‰TċîŒ MOkš]·ëP÷ÔŜBğӀġġ ?ĉûĊ,Ġ3<ï.›ŜQ„ŝ†×Iendstream endobj 386 0 obj << /Filter /FlateDecode /Length 14197 >> stream xœŬ}]f9nŜ};Èo¨#UÁvċè[rà o>Ö0`½Û@.Ö¨éééoĠÔlw7³Aŝ{ĝ<$%·ß71b,ƒ~ɒ(J˘(’˘t~ws܇›˙ÙżoŸ^7ï_ŭîU öĈŝyûtóó7ŻŝŻrÌŭ8F¸yóĠ+­nz¸iŬTnŜ<½ş ùîÍ?HáO…s½ï%K…7_úÍíŻîŽûbáö—wŻûcôÜn?àg£µxû|îc¤xû Ĝ0Fh]ħ!µqûsĦ0B:zıŭúµ´ÛŻ;žJŭû76òÎF=îcq&ŝâîuÎé+ ÖîĦ{]Xĝ$żŜb?ÀÏëĜ¤ínß6nŸï^§ï{(dİJĊ•%£ĝgĝÇè½ŜC‘¤7l(µŜ~…tŸzżŭ‡#Ġ~ûí˘`ݧñ<½´´ĈSJ·ÑGAá˙òĉĠßJ"sùQ&3Ĉ‘nJíéĉI·”ÂÍĞ|ŭô›e_}ŭêÜ|û*Ŭç\dN/ŭ7ò˙?Ĝ„˙êŻbmíç›bAvb¤'ĦßDĦ$C¸ _éYž[İ1d8&ĥ#Ŝ׍„µ İ11a܋(- !ŬµĦ0Úp.ĵ„séÎŭxûê×R§öû˜PĤܧÊ9&ĈûPQ+cÛ}Ü”0Ûm2z[‰‘”S§à°ĥÁÑ0ÌÑïKĵY¤ÏcoCaÔp.ĵ„séÎŭĝSï[ʂk7"U”…tm"ş7)·|/˘.°Ü}X[İ |²•KĜ(8ĴM †c긗²(TòżÚP5œ /aL:S'ĜŻ8 dWDyÜGôk"DR'‰*a½Ñ-€;„Ùai4É0…•ˆ‡wRp˜M ÂDÄûŒ N@ÖIßZ ˆò΂ŝ}ħĴĠÏ] $öÒïĞŒT-=m˜(´d­öšEn‹Ĝ[³‹”tĴŜ²•Ġžw k¨á˜Cĉ)ß, "gİom(Œ΅—p.ÂıœħCäç¨7µdEÌĜB´{nÙĠîĞÌr)˘énR8Žû\”Ñ B2â²½´Y{ ŽâŽĊÙëÍŞe–6òül^˙>™³êgî9YI†´›"{Ñ} ˜Ĵ…XËÈ&ÓzÀÇ$=ڄe “(çÖĥƒ*wQ˜0Û` ÔĈÙÄÓÖA”wìï΢W?w‚3UDrêM;dÄ-GÈ~ÑM˜D€>ÌÇd lšĵŭıˆ¸o• Tâ(ï1gڍWŻcdJPwÙöúгj•OœĞùhP-A„Z5 c˘§(‘§’ $şĉPċ”tQĦmçße J\µTòÔeŽáŞYġrŸÇր¨áx‰É²Q8wŬ ÓZ[÷—ÓÄQ+ÚIԚhĞV}†z ÚÈ`ê3Ù'ÒVBz8òFÁam5&&ŜÇv³(¤ŠĊ³ÚP˜JÖ¸“o£pîÖHZ'eѧÓ Ä#5ĴUĉ›BYzÚ0: ŠÇ!.LĥhĦ(“ße•HA‡ħ_Š¸Ôş•KŝÔPabĥI ĥ‚–g£†11KLÂıìY“²?ÙDT‰,L–e˙ÁœC™Eħ‘rÜ9÷ŭÉ #^!÷£IaÂÉĝ†Ħ X"UÄj#šY\x‰É·Q8÷C DĴéŻxNâıÒBtŒ˜q˘rCaŭÂ> \ğC¤dÙ HóGŬ8ĴM°‚a„tf % =î{ S‚/á<:s/tGƒù s:Tq ı£9&&2–{”YIĠMôc…ù³ ”C LX›`ƒ{”uÔ÷ĤÛ`,R)‚yŽœiÍQ}E'0Á`fÒÄÈ::x2­lښ0˜'Ûʄ—˜<…‹^ĜYäFϐHÑ32 àƒ¨nĉïİĴGuóK}³„x†m#à ĥÀ ŽáĦÖ"€@ٚP˜ÇdĈ„—˜\…s/ÔGN6$h„c4˙C` çáh9R=hÀÏ`†hHp–ˆ2œÖ6X1‘9P“BĦYĵÚP˜ÇĈ…—˜|…s?TsˆT‹ê-Cf:¨³İ˜z4Yn E2׺z3G ĉú>¸f DeÛFAaoƒ5£ÙFĦŒN£×Ûp˜ŝ)ıX%&ßFáÜˢ <>Rħܕ‰ÉQ9­Ö7Ù' ‰Äy ÁAĉPYÏìïÒx‰[u‡µV0LìĜ€È·Ġ‚ÂÔ½Ĉ‚—pÂışÔšúİ =OÇ ŭŽ$ìMXĤY–ĥlí7Ġħ c! =w4L‚ULµ­&lmÀ#q NYqfmàÛj`´a\ÌηS8÷ĥ銽ż‰Şzl눎*Û£Šgñ?¸ššV˜[nQµë%Fà9ä¤0á щ݃[ë¤ ĉ´ž [s“V.f er8uBd…ğôÂ4ĜìÛc†ˆË.,FMÌÂE\0#·ĦÓUBj֝„ÙkĤSî&Xée5Ħ ÊŝwgÑĞŸ;Ħ;ZMp‚6˚F51ƒ‡è›Â|½L !B;†h‰€„ħ•€€lŒ7™ˆŞGO³zĠ£§Ù€Â¨à,x gÑ)œ;ñ§ì½8F  [ìÚ1ÈÛU‹sdÀÈ~ż‰kħM˜&µW 1Ejß(lm1ŒÌ\&MPğ[½ ƒiƒ(^bòm.úĦybIπ;Ŭh‡†F‡ |ˆ144TD…÷ 2Ilš c÷ĞĥŜażßĴÚ˘ê˘Nˆ9buŭ͸²Š‹cM4Z3³ĉž6 R€t"v@&\ĦŽfrŠ8—­‚gŝ^"ó gQpXÛ@ ÇÈ.‹ĴµI!éáÂlCaĉ^Âıt ç~¨äƒË4‹í•ÔöuLĉÑ{:`Ó=ÀáiC¤Eá°ñ¤ħ•Hşp'‡µ ÔpŒĜS%Ü, B›Ç Ŝ†Â¨á\x çÒ)œûAeQħ͢c2[cbb)v얰7HÓ@œâUĤtÍżWJÔŞîp´ċ… Œ›-b†ħµ 0j8 ^ÂYt çNü‰Gıc6$UĠ͜˜Ĉ,.!fJ ıŻÈ˙Ò´D‡ħ p&·R³÷‚ÚjLÌA'qRĥÚŜ†Â¨á\x‰É·Q8÷C÷ÎäYÙx†ú´a­"ĉ4ĊvŜ‹`ĞLw‚Á”YîsžŒÂ„µ s@shĥS4‹V sƒ4.ĵÄä[)\ôCĠHâ?ŸĦZ ˘spOyĵévŒF!kD–âVŒ´QpXÛ`N½cx;nQÀuĊ´µĦ0hŒ /1ù6 ç~üioבЎHgüiÇ0âá=b•#< TÄ3èÑİĞ #–\Ĥ26 Ì6ô0LU½:)TfÜ6f¸ÎS8÷CƒÇĦÖôÁcà§ x pejSŭƒ7^&Z°ùd¸.4KĢ' NÁamƒ>™bdħHÙ)é·ĵ ƒé“)³„q9)œûĦĤH⽞ôváӎ<_hbğĉS<4Qĵ!Úĥ`KÌa+!c[w N: ÓiM; Wg£‚11K8“Fà܋?íµĈL\qxcÊòƒUş2ÌXSPUÔy”è°]ÒÌe+1x<ı8ĴMĜ%MĊDlŜ‹2ÒÓֆÂÌğS&ĵÀäÚœ{aя¤éiH̲óÇ0qM÷ċ"cÁv‘ûċ,şÙ…³ ÖèvžÂ”†I!wžĵÌ6 ~ûjrá%œK§pÑĠ[1“ƒ’§…Á *°0Ğ‘CÂÜ~›üËŝ#iÖÖ,‘x{0Ĝš` Ç,ùI!‰œmµa0j(³ÀäÚœ{ĦÖHÓĝĴ3ÊÂôÜR˜=ħ$˜ĵê0m ĉ­ƒÙµ‹‚‡ċŝ:Ĥ0$Dš¤Pг ‡w‹ÇK(—‹Âı³ÂŬ醅Á3í§ “xî-pÇ\7$ Áİ„-šú„_Š<÷Z%àzô‚ÚĈÛW†Ç ‹BĵŸÙF̠Ʌ—˜|…s?,!é@?ÛтE³ĤkzçħF;d×L]Oîkš0ÏúiŬÌĊ#/ ž*ëÙqœÊ`ĴjĥĦ0S’Œ /á\:…s?T&GĤ·“Â ĞQĤf\•='üV;q°0K„ĦI]FaÁ.aŽAZĠo&İÀŝġ6 Ĥ+^Âıt ŭPŭ4ġ÷ÄġÂíÄh$YlϨ7/ V`ZŻ•ÖĊ,‘ĵĞŜwXÛ Mm˜À3ĵE}ÜÛP˜iOĈ…—p.ÂıjàòžŒGL›§ Ó³ùΝI\ïT Ŭû`1ĜŒ$‚Íı1h3)8Ĵm°†c˜k³(ˆ„ċµĦ0ŭsÂKLÂıҊLPn!XŽËÂt Pe~ĥ˜ġĈXQ`†´"ŭÉYḂşS˜p°—‰9ôôĈ)T‘<¨Ĵ ƒoV.f çÒ)œûĦ—Û/°$Ġë܉ћğkÀsÈXxʇD ĈñVà5ÚU ~‹€ƒÚË+—ÒpSÂĞÇÄŒ³…yŜX°“E£pÑ =„pžçİOĤñĥ¨À S]†€§İpŒÂ [‰Î³‹‚ÚkOñ´Ñ(”ˆ-cµĦ0j8^Âıt ç~è¤UZJƒâœ˘‹žÂ”áN#Qß `ÜĈ@Œgç“óï¸ĥ4Vm•:‡ß6üV½u<É0É+ȧ´y˙ûäÖŞŸ¸WKv9œ $éä`&ĤifÇÀ£Żz#âÂF(ĤԄ÷8WĜ)8Ĵm°†aô’ǢP¨˙V £†sá%œK§pî‡j}Ñ·Dfĵ?í˜ÁT£œy|Üxġ™y²Žû‚ċt+PüĴE`ÂÑÎŬ&&è}q'ŽĵÜĴuŝÍYózgĉme ĈÚq“¨e]Y†)™‚+ˆPËœġŒUİt ĉ:aòÖ*14?)8ĴmÌŬ1|š`Q€1ĥ·Ħ0OŬ /1ù6 ç~Ìv1)LXÛÀà;& ¨EWüÊֆÂhıÎS8÷.ĞáÂs0š—41MŻUáN’EçyíŞjÁ–ĉĊ¸š—hEnNa‡ÚI Sô·IALïlCaž^Âıt ç~˜Ìl1™Ħû´aÄÌnM_½â#ZŠĊ—óĤ)ÌĞ˘Ğ„¨¨š6 kö”—bO"&…BEħÚPĝíĞĊ…—˜|…s?ĵoŠ8‚u <ÑzÜ>–íùħ‹Ĝğúb 3x%*À‡ÀônóĤ@ËağŬòV"j2ú$àpw‡xa䜘¤žVó?™˜&×FàÜ MşÂ&À)¤Ê?mˆÌslĉ?á ħ’í}ëĴÙyëñiûğôĤo• $q–V8ò:ÄĴ™‡żˆ+Ìğ‘Ú¸pŜĴŝ‰wtçoñì7BV¸ğ„x=Ž”,˙÷ğ›ëï|7ż€ä7R‚•⁷ÒóÄ<ê:(µ0…ô£ŽmĈêÙJMÌV WŽS݉YdîñÛĝš˜­ž)§R³•şèÑŜÇUêÇď"v"{§o/âCGV˜R˘=²˜kož^ŭĉVŜ½—JP€¸ـĜ¨û_ú‚˜ŻğwÛ+³–aáĊcz”ì×c"öB•›P]…q*Ä;“c+dˆS!ÜĠĠô`+dˆSĦQ³]è´B†Ĝ ygfĦ½w˙ÜY QĴvXƒ¸gÜĝħLÊH<²áÙçŜ|ùŠ“³)2_+YŻ!ûçÈ  çÎä.4ĵ7r*ž{+².˙ˆá$Nä74“¸_żûp÷šwr[¸ŭĉáñ›?<|úĉùۛ_÷öŬÍŻîĒ]dîżùöŭGÊh½Ñxè ën°E÷Ëϟžß>?ŜüüûŻşC€,äÛw½TŬÈħğû˙ÚÛ_ŭ1½5ˆĵGppÜ9hj="!éċÇ|­J2‹§"?Ic¸ĴùŽ Şë‡ĵ8¸0Z3òşaíá0u‘Ó âĊĈ:kTÔÁŠU_@ó¨§Tą&ä$u¤ri5­É0ĴȋZñĤ…̧k"N¨Äàh¸k͑Jpjš8ıĉÛÔ##L„šÇ ıUkŽĤO™8F™|{Yü•bñ\xÔ`UEܢ{;FÇ'ém0wġIsSıs#ÚÁáÁV]ÂZìm}вD0x°y‹cÇèĝèykCÈ\ç]AıŜm.[⠞…Ñ6ĊÂ8⠀çm =ŜäJŞúߊFkzê<4[K°gÙĝ€$Żë;£ÜV†„“bAzÄ\ ×÷&µGÇĜ0Z§mèƒ?ÀžšŞÁv¨d°ŸEƒñŽaMD^hğC3ešÊĴûñ¨Ï=Â]™M,}Úe”Чġœ^T” JҎaMd†h5˜K†ÜÑÄâÑGȟ²3ŒJíA7HĤŸO7@jcAë-è|”Z¸0Ú&Î%uİëİU‰tżko|ŭíQ_öĦìÚÁ.ı`ï9Ó|=!.1FûfN óG1u€II\PĠÔ&e¤ £"Ty9żñn6'.#Ž oe­x£ú¸şc´M<ŒNzCoû&x]efhĦɃߜXÍĴUqKߖÁk플Ak”ôC£MĤŞQZYËúŒ:Ŝ-Ç+qY7Ä$vŒ­NFûZka ¨™“pN8)ÈFéšäޘT û‘ ³BĦ<ŞŠĜVħëdŝ>"ŽG×Ĵa-LÇèĝ4Íâc˘úZàCé=óÀùQJ BĞ};Ĩô 9T“‰\z ùäQĜ'ĞÙ$ŻY fӗùµjKñ½é9Ĉ¤§YÊl´Ñİú)**ĜŻeǘôÁ†Ĉ—U]FÚeLSuIÏdÇĜ’ÖG‚FËŜfà•ÜŠ§0%ĥ4ĈĈ”{Pzĝz…Šŝ³ï›´˘ëÓ]—NĉsŜOZh? ï-Œ1Ğ9›xÓAÌvžytċ”ħ8µ5<ıFJÍ[+z3‡_ƒacў.6„ÖkA'C:t.šQTµî×Qš£L}ż/î›Â˘’áCœĊíá…ħŭ‡ÁħŠG†M¸BşiVĠʨôÂèÜ]mMŜˆĊ&™¸aŞÊ†zÑÎxk0¤áV^t öŽħ‘9î-oBç½ê92eÒFŻ,:B7ĴĴÉy­T3"•Ñ×ñ›ˆ”°fcĤ/ƒ]AC†'ġUBq!İï˜9…A?ûl’+ úüċ a•0KD“kmŬPèŞ¤ġájÇ,ó*kry<›WaŒŬĵrŒŽL÷í7@Ÿ=7ċL hŽK³;mf`DÄ£áċ 5sz䑈¨Ïff/H°Ϩ‰ĵúàÂ×s>ûŝ¨{Ĝħcl7­ĥ9š*NC”ĉ×à'‚¸›¤-Œ-÷ şİu?òTĴèñÉ"ÍŞKc[_a2ĉ°­-ßó‰ÈnK7žôó}[8Rċ#ްâu ÊTaiN<îqŽà VI4Ğ+Îwô•Gda@î°ġ¨:+AĜ™s;ÉIÂLÇÎÔİ]¤²Ş·ÏMŒĥġ#S½óñI}&°Š ڵͣÚ3{†ùZ“Êô•|ŻIŸŒĈ‡U;qŽ„Œx‚#5W†C·s3û‰<&ġhċ—vÔšÓ‡:2Í#„MŻî7Dt„pá³Ċ £²ùĤ Èa4ۆğ*d5r{„È]iaL·5j2!kî^…Hş]™7‹ĈĥÒé&aî1]ïè>÷˜˘²31Ö丷L]‹“™}:´=ËZ'hrZí;7¤`R î‡+³ jäĊ£…Q hE_Ä.ô;E<Ŝ/L–Ħ¤êC2c &ók—\†Š‰~TċQo(Ĥcž\W60öxuÑÏħ„hSé°c´&£(šÙž Ċġ 5üVÔD„‰ÉÏşÛÇyïAb·G^r%ŻÈ†B˜ÓÄTŻT ?Ÿomĵc§Šż ġc[p×Ĥ?G5ك€ƒÈuĊĞ­ 3+Bqôĉ~Ö´÷PĠògÍc2ÎôHéBÖkˉ—,Ħ}3/F<Ş‹¤ cĥo Dž\VĵĤßxğNU²(ߑ6ŒOҍİeSܘK Öċ… ZjTOXQŻhäĦuĝ'†5ĵ§×⊽hŸġÍ˙2̞;âĦo);F÷X݈'mÄ8ÑgŞâ„>X0Šz3mÇĜúʚĦŒ“{uVÄüQgù’eÇXäÏĜ5ìÀA•A;ÔŞ”E-ìĠ4Àċ˜ıáñQq]İı;tÏt/Á~WwŒmAƒŸùÉßo-ú ?scQŻŞb11™ħÀÜ-£L24ƒ'§“z:zmbÌdâáx…ap¨}fÙċ03ƒyċCĞcl2—; ×訇¸…Ùˆ¤‰1n³ŜüÉ}’Â}RÖtOÈú]İ…1R××qË ä³Hóé/Œlw,&Ĉ6ĉ”ÉòŞnFr]ù),U@Cc53ŭ\䔍ÜÍ5ƒJ˘È`}AûŸcLçùw£½PWÓ?ŞcìŞgŠcZ„¨ìB‡{/šuAµî2”]­‰+¨İ—[Q§ž ûò{^¨YŞF·cZ$ëûÚ9Ĝ‡w EÂÁí<µHÙ03TË3‚ÂOƒ<ݏïÛYÏ-TËCÇ ĉon>”4äZËùû›ĉËW)r˘á˙ qí€sҋ³œ'cè‹áĝ„ Tŭ1gˆ˜ıHĉĊ“êzóÖtDéÜ~óôéá ž²ĵĈ3‡(ì×HÌMOœùğïżùôž`0犯¸È;‚~5ZqâѤ§ŻżúŝqÚüĈzĵŽ`Ž­· DCkgܜ5Ù{¸Ï<şZŸ‰NÈ$€òĊ¸zMÇ1…{°Àšòí™ dċ>á·zħ#4KÀŒÙ¨-0ÇCIżq3Ğ‹€„ş5 0*8 ^ÂYt çNĵċtÚ)Ô$şEr™ƒĠxk4"”e|ŭGï!Îwwb‡ÇŭÊFŭ='FéĵùoŻnñ‡oğùOÏOß}x÷ñğ/ïŝŸĊqŝt6EóŬ<\pKR´’!~ì|ġúgàħUÜAİÛhÊĈÔǁ+H·ûçÔô³é£g|˙\Ĥö8ŠtDż.ŜuÑϋۚÉŭÔ,Á$ËŝŒŻÁQö‹ġóÖÏwëçÛġóÓúyż~~\?żáOÑöëçğ;ċ¨„Ó@­İÉÒù“쟍F·OÊoc0ż˙Í$vûˆÄKíߋ˙FÁFZ:§½Ì3?*_eĊ)ŸxÂğ/GX‚Ħ5é/·OĜ`óE<˘ÛçOŝùçÂG·ß£îÀ'íżşüŽŭy” hŸ2 bCwqVƒĥ‘ +?>b>ĠüùH,ĥ^ƒš Ĝ@İnÁΗw9UĴxáfŭ ìôXÇí÷s@oÉLÀEiˆnÂÒ2rï˙°I7#7‘˙ïéïî^fEèñÔʗwŻs„§6әµaIaŒ}hÁ ˜ùÈĈ ûù'F\9‰b']r"öf/lĊ(y)ŞjxµÍ§ê0̏éŽö‚îÈÜìhçĜV·á‡ËġȟOW—ñ úµÚÏ8"!v¤*cN÷;ŜfŭƒW·5h+WŠĝçOU7ĝҗhx˙JĊhkj ["ßïÍ9şl`›ġ%ö >cŸCş!Kw™Cö‰qŽşğGŸùö¸ó#ġ…ißڙ|Ÿfú[篟yÚŭ 9:×|YDLJ™ÖàÎŞêÌġ'Ġ½\Hú’izàŸÖ6ññr‘œñ"!äMoŝ&À<½ßŜáñ"éëíû­+·÷ޝJᗘ­ŽrûüÍ´…â.²Û.ä󚄗„•D?ïŝâçnÈış‘8gÁššâòWMÄ·7ꗠÒR“Ċî‚~¤LBWVȅŠ@Y9)&$Ó¤ècŝRœ×fÔǘ˙R5ˆô¸JŸ yNè˙$ğC#_#Žä–>ioc{ï]Ŝ–Çŭ÷’\,GË ^ùĊSÄ05EF=pŽ ­Qû”FÖ Œ8Ân§`Âĥ¸>²IYé$:Éx큂†È‹Î™ “/;c|,‚ ä™",ÖIgúíHž–ŝ>Ÿ:l´İġğmoıu‹z=İŠ½ô·sÉl{\;úĈŬÑö}`Ÿ·w3ĵ²íÛ/`Ô^ĠXyYĈ\î9ŸV›²#üRĞÛ:Ħĝr¸ Eŝ F}Ħ„ħÖâÂô™ù€lÙù|öï7N˙ *+ԐËëçé6Fw;ĵ]5ÂĊnç^tïdµóba%× ´žŸ.â ™ żúb”˘jħ~ùtmĤF’‚§Âú8 Z›üùv[V<‹îÚğûQ•saü]]˘´ŝH#ŞŝCĉwÈ/mM:§9Ĉ]ÈÈF˘|?ż µ“œnŞbށ*qÍ í•‚ ˙׋Ĝúò°âÁ”etëĵv.6 ëÀû÷›m|oĵ4íüĴp qR°ñÙ÷enÔt×aSĠƒ 6ĠFÏp7.ì•!;żö/bUsc}TSŭÚà çíÚàRÂtpKp’Hìċ¸O(*áWĉŭ‰‰}rb&“I5Wb,ğċ—ĴĞG Ù"a9Éż‡™DÂîŠĤ³Ìñ÷k6_0ÌÔÂàŝеc"882ĝ_ÌñÉÉùÚı ?b°Ħ„lG·˙f_[¸>r‰ë¸ñ>sjŒı—ETĞíKâ‹Eáqó1Ŝ­ÉĵP}$âÀ9ڛ*&‘b<ĜĴ‡V*g91İ›wˆ'ĜÇIi}½ˆĵÓPH/èucĞsÒçĜ[[¸ï½˙șssŽòBÛ^B$cۈ—'üƒŝ]ĵÛP[B>_ÛSÈÚY1Ñjí"ŭ“=iJŸĞ›¸u'Ż’ğÎz˙nY[YÁŬ#qìŝjÛNmüŽĝ›[p`“ ÍJÙĥö/–ܝ'I7î 5úí|œBñèğ]ŝ°s˙ÛğéûNışpŽÜ°É€—ı4ÙB^'İX~ĉg}Ĉ͏ıÀÖŻ³Q°­ml&ìëmúż[zeX3ĥŽZL£_qp§‚g|Ú²áGež/cp3óE/½ĝYèIGüQËöPNġT(@ĜÖëIŠ4Ö0ÄĦŝŭ”IİġÌÑÇğMFɖŽ­Â‡'4RáGŝ˜—"bœ”äĥŭ° ›]ĥ³?ï!# Ë ·Ż+š4:/ŭDGvÄp’ŭSuǘ‹jßD—r಑ÖJa=Ĉ³VwöOAŒkVùÓQ}PrœèŻô·”:›ċçÂ.ìĈÚÙfĜ´é7Ëq´'‘"Ÿ^˜ÈÏï}A$Ù&0­Üy¨ù/çëMÍ˙RÀO‰tií=/b3Ğ6?hwĜ(—GKNjžín˜Ú³öùP⨧­g3]_ ϲÛBŝá‡=òŬ}&bàóž}o£nßz`ĵ#2Gz!¸tÓ:’úë­ş¸Žënǝò$h;[FlˆvO‰Qt|èxŽŝTñ´ú6)¸àǕVħ[0/† ĊĜ$ûñÈ<„àÑÂ}ıùrÛġó<YùĦ0Q™‡eŭzİ´]ú~‹9 ½—ç”\öoeû/w{˙l‘á#Ÿù‚ŠF8Ċ‰w™Ĥ0ħeWşğĵîĵ>Mùòh™^§„›RÄ ûċ™ü°4óħô„Ŝ÷Ëdü§2nú}(3>ġ…[yĴÁÍW´(.ÎKĥ`×ä FĠvñŜĈw$H˙ÜuÍ ŬÖÊÇëcmĉ ^Qh§#ê=şĝÓö[ƒž˘&[Ĝ…/d*Ú #ŭ+´ĝĞËâ•,°>ŬàË­EÍVŬYÄĈ§Àʋ; p<%ğÂçĥ‡NU{ĊÏqv‰>OŭĠ .¤§ġ°ôŒċ{lY o×ÏßŜ]Kxż~BᆺèĦż^Ĝ-Ÿ`ËÍÛR žŻûpµµ-oèÍU ÛÏLj™ŝ÷İx •‘ój;ÉÓêċğġóċÏ5}˙ġUbWħ“³~ûżĜ÷ە“°Ó°òw;²ĦùóË5_^íì–8òĊĠÛĈó‹Ğó;œŬߟWż˙rŭ —’0ÍC•„İaĜ$áÛĞĠÒúWµ·˙Ôè}FìGú/ûŽ?Żw•ħo²íĠax\œ_—÷ëـħ÷‹Âġ&žö‘ÖËtÙË×'çĈrûż‘Vİİ‘€˙£ĉċ–iññÒÒ<ëY|I/ĴlĊuzáŞñ‰ïb×iï[êğµ•}<™IËó…)ŠGä€(•ìٕ=§Ë˘(N•Î.cá”ê…s›ĵá÷[hI}2Œ>ö£TÑÍ=úÎÚíá…ÊnÊn§Â{Żž ı{Trŭ&üJğŒ(ĉW?Ÿ™gŞJ]~ŜUŸ× ˙÷ğeú|§Íˆİ¤Á_.ZîˆláÓ//: öñ 6ħ.'<ÙêÉNÛĵĉӉoO‹%ñ[ÀÉsÔóB Ċöc8.8 Ê:nûn&ÔùLió¤…%ìœ taUŸí><~ŞÙ‡ÏÊ{éŸiƒ 1ġÚä¤\Ìú€ċz]Ÿ2ô|ñ'Óz—[D‡¸ ÏWŝœg°ċjpüg‡ğlŻïħŻëQӍÚ9:°…mĝÇĊ{ôÏέpĈ:Â~Ĵĥğlï÷ÀĠûMœ÷^^œ>p†ìê‘Âk"Z„ ß=-ġ2œşem €2ÎżóΨ@áhğ@żt’içPˆ‡İ)çzß}ĥ–éS~2_hJŬé¤Ì<;•Jg˙ŬIgLċúÁÏ­úâĵ'èɗûvġešÏ{ †v‰Ùeí2œn§qׇúš’ˆâ5m™A?~CèBIœ£Xv™ë˙Gƒì”endstream endobj 387 0 obj << /Filter /FlateDecode /Length 170 >> stream xœ]; D{NÁ ÀV¤Ä’E4.EI.€aħ(ĵ Œ‹Ü>|ì)fag[6Œ×m¤ìœzA¤Ĉ˘°ş-( ÌIÓRmUÜ]™j‘ž°á&ŭûĤ˜êïrö<ñúÔԒrV/‰3žsÑ# ŝ[µµ0™=yˆ"ÎÓLĥEÉv~óO™é@ j 0–y,Âï6ï|nÑ$òŠŸVjendstream endobj 388 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 605 >> stream xœ%ïKqÇżç&]!–Á ¨nߟ™N!Ĉ ¤Ò“\d)jÛ͛óvÛítî‡Ó­ù‹O›óÇĉğ—ĉ*YŠ&ĞD$+üÒ=âö¤™OŜ?ĵ?|^R ‚ NĠêġġ•şXŞ\$”KÊeäheEi(„"İ'•_çeDfÏÊĤsHEŜ@´–·ğK'+âVŬu1/•¸²ĤĤş Wét5ĝ6Ç#mzZdŽó?àFt˙ŸÜdEÑ~£˘Âċr•Óœ³œ:o_).‹Èbd„^Ĉ„ïò67ƒO-?ħZž³÷ˆŒ€ġĵ‰lĦ‚>7Bͨİò\Hv›2ZĴü”‡2}˜ˆ—Yù{V%˙”?i&^<ÏîCV`ÙÏğp’Ŝxߚ´°ŭñŝĴ‘m(!ó0fòŞ!§1OEÂÓamêof5äâ›`c·§ÎœZŻžŸÀˆ›XJː$×zĤ|œà°ĥ}p3ûjĈĵaÚòè³ĴYa486Óvá{N+&ïzJšâimħâÏÑÒÎÁޤ\“}‹ïޏR˘Ÿ…0L’ ŭӀwȤĈ†Ÿv¸Cސ}ÈŜžĞğ0âë¸SäÁôĉûù½Ôvîíx–ÈwÖÍĉ2s4xŒ{ž‹Rkĥ_ċĤĉÁ*Ħ>­ñŠÛ­dĠWîËVj>™¤üZŒM ckƒ~hxĥĉ ³3ħéXÉ×öñ€ĜċmiN›÷ŽŽ~˅Iޘ:£^*:?eĴ:endstream endobj 389 0 obj << /Filter /FlateDecode /Length1 10676 /Length 6608 >> stream xœ½Z{|TĠ˙ûžG&ó~Of&“ı“Écò"!! ! á„ &@ Ĵˆ!-*l´P%*Dpµx.2„(,´Àn·>ި´şşĊ–Zó‘î˘ĥJföwïLbȇşüá§÷~Îıçwžżóŭ=ÎïL4 4´ÎhÌ+ùÉĵ€Ùìım+'hĝ€ĵpEÛÊ)~ˆôvuz4ġSzùâ•KV$h.@éZ²|MrĵñuŬ‡ím‹Ï4›‚beIV$Úµu˜etĴèü~‚JóÎ[~ÏÂdğÁ,EÛ÷“ëk—cĉù§ĥíIúqiüÊ{îëLÒR˙ú•Ğړŭu˜è׀À೓Ô֍éIL?Ĉ$9ƒ yÜ\yÑbB~H>Ĥ0ĤzL­˜p<ÁñÇOp<9O>Ò"Cežtĉ:8‚AOAÏA· Œ  ÛG‹GKF#è#è#èAß3‚^9‚^5‚oŬ9‚^-Ñì²§ “í;“nìñĤËÒ7vGüìyĈVÄ˙B—cçR˘b•('`öb9ĉ¸H–Áq2úàIƒêQ˜ ż"ñĝˆÎËĜżÎÂ68 j³LĜş‰ĝ÷#ĈòX2 ~§  gŬŭñ}ñ#ĜÚwÀ~8€˙ƒĝ¨Œ!ŝjü 0ç\-oħĈr  êħv=œ&~úrĵĴPŽÜ= Ï 3ĝ”fk‰ A˜ˆoJéQDà8œƒ˙ż‘Ï(+­;é_ċ˙ *˜‚ğ”vÒ]ĝ>‚ï&ÜÓI‘|2Ô“µä)²ü†Ê˘î š¨ïQß§ŝ@O§çÑkèß0÷1½ììNû<~2~>ŝ6XÀw˘Ü×áî΢Í]‡Żs9‰Ÿ”“*2ßn²‹:N^ Çİzr†ĵNí'˙E~O>#_S,ĤLT6ĠImPgİ_ÓKémô3ôџ3XŠ}ŭ˜óóż-ˆmŒŭ:^˙(ŝWôpxQ2U0îB‹ıµpü3î⠇PjçàpQ~OœE€è‰’iĝN'3Èb²”Oä?Ğ}ž(™;³ ËOTûš=‘~ıX‘–³ú:$ùvĠ$iŸµfXÒ4Ïc¤pJ}“7âiĈŠ(dçL‰‚˘é0!›š£$! Ġ úùĜœ#İÚÒj\‰ÜĴÈòb)”İĊ‰k%]ñôxz&-êñÔz:P™żüĊ†öžĉX‰İ-ç„ìëM+tŸ&9àgŽ!!GŬ,Èu\HŻûl ÊàçgiH…SŬg\Ïı˙͵Ä}ӁDÓŝ`T³ÏµÜ½5-Jvöş·¸˘6'>Ğ]8ô¨{Epğ{QÜ>u{”:ë.öÙa•ğ¤Ôë.v]qç˘A:×5ĠUŸî —Ü̓“ú:·ÓµĠ=›Ò\51˜N’ŭdd‘]½ŝÉîXÄí™,Ŭ%İË,GÉŭᒺÌíÁş€?8ĠíÖXž}_Ïßɏç ùlĵüˆĵ—wFA/h ”‚ Qòݽ•nî$9•ˁ#'°Qò*V2'ÉAıòà1(c4ŝaŸ¤_Ĉ(9'ŭ¤X8ÊÉ%.JIT ğİÄÈ ZJÊİ„zSD P‰"ä‰(Ì]•ÖJŭ8]YmġßËZoʳ˙ŝc%Èv4§È~W3†”Xˆğš‡że`âé\Y{Uvö”†5GşV.[,‡ÈšvL­‘ÇşÊÒ½À9ĵle2ŝ[,ìm푕öêÈ2_µçp×â[4/–šğ|Ġ‡aqÍĴĤ‹íĠ½]á.ùvpdAĠŞ–›ÖÚ8´ÖŞŞ[LV%MĥJZkAË-š[¤ĉÒZ-ÒZ-ÒZ  䵤}Ö,mĴşŻµ":ÌĈȤ™s›ĥĜ\%ğ%OıZÔĤĜ|ލ}Œ0.Ĵ0ê³ĊbWœ$ÏâŭßHž kÂÍLĠÚLĉ/½ËĴQpCvöôëÓúíïÛûßêŸ^Ó^ŭ¨Ĵ,È'Ïé´³Á"1 kG—¨ù˙’7qfáÖ5[jƒfUKùIöíĜkOŝ6öQìƒkOĊ>ı²nùS{çÌ ™ÜJü²âT#?äÇ%aµ ƒ ùaĤĤ$–ȒB°M_z+°&8yĞ˙ŭa|ô£KtڀHK1iyŽžĝ|¨Vâbçx1?8żüDl>)Ùôñïµ§ˆù‹ûÚ×^ż7öîĠmħdŸù ğ=…>È KÂîGtÛġTĦ JK Í"ğ=ĊŻħÙì—ĵ]L L×~1­** ò'Ĵ ‹ÄĴó›DŽgy†§yŠg9V($șBŻ*$ĵŭmv6ÉÎÎÊÎ~¨Ċ_8şDz‹µ”ÏĞ£½‹Ygäİ Ħ^oß9ıܞúŜ_bÏ_ IŜžmMğb?8´ß¸§ùħĈ‰DGB_ï` ½ñÉİX݌EÌĥàh°H^ú„|P„²! */żÀP¤ó]ĵx‘=ġĠìU›½Ê~ İà'ô„saÏyòsê‚pQÉMLcRiÇ^ᤜN•€ĥ§Y T6WÚğŜe‹“r!—ċĦú+ûe Áž"żÂϊfµµL_Hì–´–,jS!1P˜Ù”ŽB1 ”Äóžx„–§ĵž€¨ÓŽÖ{A_Ĵ_:èŒz/Íì:ıeÏıĜĥĜÁ³Ÿ:M:‰ÏħżüùJì/‰I~üĠÏcŻÇŽ]އï’É$ë-˘ŭêE²ĉsB“ŠĜùĜk×c‡Ùù¸÷†ĝïä_™RĦ*àŭpiV>QjUµ3PT§]ŞXĤċ˽ZA; ù …KĞv•gSĦ`ùħrŞĵ0ËŻ×òĴà ¤[œQÒöY\n>à İ(WħŞ‚Ż¨pù`ÖŜ û8G995Pj;î§äiâQ¸’]—Áğ2pnÊ~„R§·”µèôeĦŝP?ÁŻÎR&šY2ڔÄĉ'%İ^°Ĥ9ĵ`öQÓa4ċğËâ%&/fšD[!Cù‚IZ2ÌE¨ic‰†¤ŽçLDÒıQ˘/çxß8RTh1›tFì„Khˆ/MYúˆĊ£JFˆfĠôğš·{; W,(h$}LêÜ˙DıWı—ŭòS]Ğ-~uš.+GlÉ2+F˙úÁm§N<ŬóÚܜIğ7›œœ&Ċ™·„,rĴıó§f5ŝrW]Ŭށ§é4½AÍUùÂuË~òèĥ— äŠdƒ]ñ?{t+ĦŬüç;N:]HM£XŒ[\,ŻSĤıT*c@°{ì!mˆAgs{ñžj‘A­˜6pċJÒ*û%HueşzV½™Sš9£HôJÌLĵE$Eš˜°F &4 ½ÎHɘ| 8“Ñb.ê:Tŝr녿}qùŝY…eğİĊ›7?ñÀqqâYöìÀŸ§ÍŒġÇÇb‘rß´kŻžŜ÷ÁÑ7žžXö+ñËt?îI.ĝ^¸p´f˘fŽf³ÏÁú#•ê҂àrñ%ċ²¨Ĝ!¤ êôv·*`·ıñŞúĈÎä͍ܗŬêT(1²ŞDP81%‚Ò!ˆ$ı3ܚ^mr/hZzbIÂP!s~êâ—;ڏ20dQ‡×<-ĝà^–ĝ˜‰wß1sùä_úEKÉÄòÍĦz§–ĝG(RW×>|¤‡ü.qżp˘ÂYĜ71ŸÎĉ]œÒE“Tc™9…Ó+mx¤jRtA‹ž×§jÜJsh³Únx—ĴK"ĜRvNjXE}Шăĥ OעB³Ċ"’™|:|‹‹ŠâĞìÓeXœ6Uƒ§·ŻwÛ6ĥjÔ<Šz™"wĵşéĈ"úÙM{ċğĈĜX9}uĊ ı‚cái%ĈIÂ$E“ĴxT½Ïħ×µ/°;û¸ChszPsN™Žî”á‚.›RïRĤ†ĝPˆuÒ!s(7ÈÚóĠš@Ê81à´ċċ3ëŭe’ \ù\÷?­ì—Ċž{Ž/ӞĤÒeĝµ˘/M!ӎ™NñBŞFâw‹$àАŞĈ'éDn4aE’ċáÍyÓĊ@ŠXŻì)3$ɂìPMFış˜PÎ/*Ŝ]ħ2vñ৚c)ħ?x-,Ò%;Öûš'HġË˙|şÖżġÁ³3rbo0U|ıQĝĞËğ^İ Tl™ŭ~Cŭ—ÄERH(ö™ŜğvŝäÔĦ…ëİ\YÎëTɧ˜Ħ1œƒV#Xx‹`†ĠüjA0¤P€ÎĊñ&µ2%¨´[‰)f›ĊŠ·­#ŜUƒ²"é*+dRF$‘a‰$péPéFÉêŠġ}á˘9˙İ1÷xZÁ#+öĦûŬLoÙKÍÏ Ì¤^êŬ´óҀôGqôyÈ)—#:'˙ħtuċhuġ6ÈÓ`ûżáäÜ@Ċı!µĞœ†*'*:Ô´ġÇa²ÄžúĠàŜ9?3DĜ.ç^Z‹Ĉ’èêl³UKTjŸ_iwùlJŠħĝ½.‹+…s8ŭ´A™‰Lè‚FéRgJwğ0úϐo dFIÊp€hŻ÷_Hrfݐl˘ż_: ƒy-S-ËàIŠ %1†^oxTó½ŬÓs2*^lwzÖÉğ§-{ĉ˜=¸rñž>&onjŒħ•µ³Ÿµi`4uġîúMğ6S'WNyî5 U*!s´!Ĝa~¸àwž£ÎÈŒ]\'ÏĠ”ÑŞĊ8ĞJiçívPv' Yƒ6°9œ#DeXà†ûê˙FüDÚÒ°­q‚† EÖ˜şżJ}Î1Wŝşppri£ìAŝç7c~…Ù+ìÖî3G… Â;Ìǚ?ĠcÎeċĠ.½ÊĈÛl&*jw(&›Ŭ%Š#ŜU-?äÌ #Ş ôÊ:J$ĵKl –”FµD‹™`ĉDBk8‘|l˘Qg苓2BğĠ£‡Ĥ0žÂ`³ˆ§>ܐ?ġÄ+Û·żt‰¤Ŭˆ}ù~ìÑ˙‘ë$İğ·ÏêFï+ôċĜ§xìÄ^%Ù70¸ ³R ğƒñÖ5áœ} •)xœ: ç2ñİœĈċTk¨€ĠžĦÄĈLOµù2nÁÈLW–<ĥœf°v‘Ác͘›FÚÂ%ÏúD#E-¤+BE’úİǀš“úċ퉓5~ÌcĦC%á;8;ÖısMC~yߚßĵÙ=ïÉE;œ³›>ĵiRfEìO¸Ç·ßUœ6ià}É7˘BnAÔÁŒ° Ċ”ÑôD†ÑZJ£)ÔARCR°ˆπMoˆ’TżuÔO²ġi•çÎIšè†ĴIR½Ħ³FçÛxÀôòŬĴĠuhŬ‚ĤrĵdEŸĤİCĞvHvQ‡>ÊLÁs%„Â?*Uì`·ëŸ1î0íÈâ23üo­wbĈÄÀìŒ9ĊKÄ5ê5)k4]ΌN§¸;moށĈcžÍeB°›§Ġ”k eĤŞ– ˘żÄOùÓS”LĥÁúK§ËÀ3ÎlUŻh)òĵyv·Ġl XĈeŠ| Ó^ q´ ²ċôĊ&èBgS™KÒvËò¤ÀĴL’ħġK.ċ^YÊSI.%šüvÑĞq{A!ò^BçཁÍ’Ku£ĠK<İé^ĤkR„€ÒKDżBIr/pAÌÒtN/ħ™‰›@ĥ|ˆÉÙ KR|ÉÎċ#LV—<),Áp_²zŜ'^7‘"#*Ž Ÿ ŝ꽋vŒ Ü÷£;{üîž@ígĊqÏ,^Z“9ŭ{gĞ–÷ÁgçyrŒÔÏ͟3çΚ ŒêÒ³&=´§›ĉvŒ-œ8=\›e3¸òrjžúÑëïŭ˜úê’%ŝ`ç˘whĝIJHyFC˘¤2ìgÌešÓ(uvt×4á‚`ҘRi7MÑ7Ìx Ǹeí-–ĵDàÒŻ¸"Ÿ"R´b´|s·‹eïÑDSAJšÑ=!°nîĉÍìÜĜÛ[jJ *BmR-Ħ~ħU>Ëşż§?@{ĥ ‡óc˘Ĉ FJaŒ6ƒÍ˜É}~_`5JàR”,ú.+oµŞÌ¸“ Ze·“ Ä웃Žw(ŽŠQ*+Êtƒ~—$ĊàA Gs {-ÖùIİ=˙?­ö÷í§|£–lŭ¸1—bòÊFµîû/”ĉë7ž›5뙆ÔğöÁ_yë >% y˜šJÓéO™RĉC6ŸÏ^ĉJ¸WyżX¨ĥ ×ä]&~Q6˘ż–Yœ„p·üíĝĤgçkŠŝû})c“żW|9…RNÑ`9UĞӃÁh2˙˙ëŝ~%çò/ï×VK˙³vÍ#˙ç‘76ò÷{ ‰o]ga‡ĠŜ†00W€Rŝ=?4ÉúT˘wÖcɀR59Á-yòĤŭn&ŻÁµĝMÉŬ³z¨˘ÊpóûaĤjö<ĵ‚ôE ê™û SĤRLuXïÄïXLëÉyXÏí‡ġRSıÔÇoD0¤ù,Hwq8rèÄ]İŸƒ.ÁÔ]Ó~$/ŝĴâËżĥߨ6 “qHö˙?´§9endstream endobj 390 0 obj << /Filter /FlateDecode /Length1 13212 /Length 8459 >> stream xœÍ{y|TEĥUŬµ×ôwş;îNg_HHH mÈ $B@H`  ƒ ˘˘@DF@A· ! Ĥ i`!˘3ŽÛ *.£żÁefÌè{?ÔQéîwîíN„ŝ1Ÿùĵ{SuëTŬŞ:ġ­sNs“ ŒR˘nDĦĉëgfċ"ñÊŬÙìı :ĊhôBd÷Âċ :bdön„ßvu:c4µÒ²E‹—Çhö+„¤öĊËVÇûë‰Ż½mAëĉƒĦĵV¨,h‡ŠXğZYrûòÎ;âóÙúe·.Œ·gςĴ|ù‚;âóĞÇAĉĵeÁòĥ8-´'wÜz[gœĈiíXÙ6òŝûÀßk£‘k3$Xꃂô¤w }éï°6’ R ¤BHĠ µC‚ħ1àƒ  ?†ŝúcèĦ?†ŝúèO ?ŝúèO ?ŝdc4~ ̌–1rŽĦSĈŝ1tú:s 3†ž:†C׏ĦgŽĦoC/C·ŒĦŽĦ[ÇmcèEcèĊcèö1ô’1ôÍcèecèċcè[Ĉ·ŽĦ;Ĉ+Ç·Ħ;Ç·ĦğĈĞš9‰TÌ ”Ât# …Ĉğ.ÏÈ ÑO™³HYŭ/Ş^>*$)-A'уh/@,HñI”ù Ñ/è(ž‡†yœҍhïièè>ïw˘Sh:„äg9ÒCëì‰:ċ´>úJF…è~tÁ¨[ptô0´Öŝ÷£˙wĜMÑÚè³Ñ‹ˆG3`ÌġòFtZti@*Ët¨]žÇêB´™P1p÷(ú9z½€À÷àĦh{´+úzôcD Ġ’6­ĊCĝcj€?úhô/Ñ ‘‚RaÖf´= À}#\oĈx;ŜAä2DßÇ#aÀÁŞà†]ÜE§Ñ£ï—ÄDݨNêL4?ú˙‘ t`š¸’6Ĝ.´î-°Ĥ˜ĊÙx2žŽ×â‡ñü’Jn dıƒ|JĠQó¨ĠÔèÛèAf3³›•EŽž…ŒÈŽnıXĞ;…^G—÷˜‚ħlĜƒ‹qžw7ŜKŽâ'ñQ2ŸÄŻ“~üGü'ü%ŝ0DNô$t’íä9E^–P;¨G¨?R_ӓÂ<É|Âz¸÷"-‘M‘W£Ċя£KÍ#ìLŞC7Ŝ R:ŭĴâ ܰk§Ñô²x˙ Û0X´ï5 ĥà\\ w/ÂKĝÜϋĵ|C`#ˆ„¨‰‘ĜÈLÒB–“nòéĤĴT*5…šK Àŭužúúfh-­§Ğè´™^Nïğ—î£éט"fSÇÌfş™MÌfj!ósž]ÇnaÙ/ÙŻ¸nw+·vçeÙ•“û\Ʌ¸· °O⨤Ğo;PJ´‰ZGU‘l†çѝ ­{Z´‰š‡žŒCġ£·ARïFûè2dgvÁî܃²AŠâwÀŸêOñy=Éî$—Ó‘h·Y-f“Ñ ×i5j•B.“JxŽehŠ€m­pW6;ƒŜĉ íuWWg´{T,¸˘˘9è„ŞÊĞß :›ĊלWż€7y3{30ú&V9KPIFş³Âí ŝÜí áı3 ü`ığÑ˵bù!ħĴ€²ËœĤörg7;+‚•]í=Íċ0ÜÑÀ!ÍH GɄƒhò‚µí&xoT-îòŠ Ù].ĥQžŠ­Áé3*Ê­.W#ÔAU}̑‘Dà= ou·>  –fĦ´`^CZ$ÍÂXê´ Ñ]4ùÄô#9RŞĜ|Ecx*´ġTTÇÈfZ°¨İ30,ıŻħ!ˆï‹3!¸´<Ĉn›ğB¨j^ê JÜeîöžÍ.Şo´,îċA4½a0‹DFúQÓşbĴŝhĈu× Ïb—i]ìùÙ½ħú7OÊÄ÷NÏİġ£`a&w t.'q³…BÖVˆzÂkp5bXĉàgr€ÌPž İYìž9ÂF{yŒıĉċƒ³EXCsY#ĵßÜ£šÓÀû*·³çk[èŝâêšñÖ£ú Ea£GeÚGÊ]"0Ât&wğ°ż]qÚm޸˘hç .˜;uzƒ+èl„ŠJKŸB’é ‡0ŜÒÂÑûB¨Ü~IuÓ|hNDmI9ÌDF:T¤ş ”™îĴ„+Yqö8{jZ{œ•Îv&Ú#>ĦĦ­§1 œÙ8ĦY0c Ñ:Zlklœd â8=0ÂÒĝKĊ`€0ĵ”>–éŜ0£!Ĝ]n Êa@|ONož„kl„·rF9…çÚ%Ĥ8ÏıÀsN*òb£Ì„1`ˆĈžžċvOöôX{‹Ñ!ŒĈVâ!$ˆ†p÷tħİÛí²Š˜ğÜ.`ĞQÀtˆôˆD…Pŝ?G¸àJ„Ç·"…˙"„‹~ Â~ÂĊ×F¸x.žĝïCxÒU—ŝs„W"|p.û!<ù§ \ŝ“¸6•Às…€pĠżáêĞùçOıáİÀíái˙"„k Âu? á믍tàùzá˙>„ëŻBxĉ?Gx֕ßÜΞŭ/BxÎOA¸á'!Üxm„çύÂ7Ž"°ѕwŭË!Ÿw䂊bŭˆ³ċĝïm—‡e[Żĝjğœb mƒ¸qà6ĞànBˆû\j‡x ‹£hâŭXhCĠu3§Ö”U·-ëjë\"~Ġ ħÁ˘m¨ ]ërA˘ Z‘£¤F:ˆċ²Q>*€¸ĴU J1ÎİASÄhĤ]/Ĉ[ġCŬ€f£9¨5˘y Ai §J!ċCJKğ΄şq/zҐ(´?€VCÚéHôhi?¤£ĝAšĞ‘O ÈhÇ,Ùa’Êo†0;ô¸]ӟŽc3R ħyP$×Iñĝçç;/Ż.SžŝeŽfhڏ: uC˘Äŭƒ‰ıŽçq:òúxQ"Ÿs|–“áĝ$'D ”/D…D  Ž“öÇ˙i_ìxҁXSż?$ôÙo_ĉĜžÂ{Ûì! [cÛíġ9Çr˙NGkŽĜ>mgˆtAûì€ÌQPèräÛ/:²|!aŸĉHÍù½#Ù.ĉ„A=µfßî˜M‰ö ßHÇq?Ŝ‹RñŜAÏÇ1(Âr×ĝ w†‡ĞSrCWİİT3I]TYŝ²ĉĞò´|™°=¸T,Ĝoo7 Q{h?éğ:o‡Ĵ­,-mjŭê]K‰n³ğ˘ Rs.cş[œÎCK;â1·ıeağ\ìp·•—şË‡ş]£y‘Üċ.?„UÌj8´(V>Ĝè#†-e+›škÓè\+Ë1X™0ĜJa–Ĥk47 Í-Â\MÂ\MÂ\-q.aKf–ŬÖ Ò †ŒaÊÌ`͌ı A6–‡pŻ`=o6jKd>YÀĵö`R@˘SK´£Ñ"9ŽE<ÒáGÊêĤ§İÌz·eġĤ—{_ZZŬÚaË–ásumċŸ˘ÒҜlL8V­2´îLìóúĵùŞñZ2˙ħĴŞıÛWoĞôdMĊǙ·"Ż=ô^äȇ_=ùËĊuËî›s=Nùl;öˆ‚Sü-*Èy5ÒêzZ‚V` ! °$áÍ:ŭ·Ò;M1NÎ pZÍĝµÊçòħ1ëUKUŭ<³RàbÏuŜl˙üâc‘ù¸`ËÛĜ…]_=Œ ßÜÖĥöҊÈ;Ÿïˆ|(òyw£ H‰2äVJ[yİ ĜàĈI[oNXĜfJĞS]Ş- Ì+0‘“m,_?Îësççéu,×_aKÀdùùĉ7ä7d¤r2îÂoW écgÂdÂò´8•’20nEfšiu K Ÿ“=>Oïx bŭOƒŠ½Ċlƒ]râqçä4ÍÉin'ƒ¤UU×iÓé·ÂEÉß(ù“ĝ<µ[}ú7{ĵ[NRßôh{żż…úF €eê˜p6 ĴaĞın³‘ÚM…¨—¨Ï8Y/ĠK†Iáŭ’>Éw„áŽg$Ô9‚†û"!$…˘<š–° Ñ@CK„ŒÁ Ħ4…‰”cù›Ù;ÙÏYе(°Ô#CfıâĵĞk¸ä’Úp‰ıNġi“ •–”ÀĈX„ĠĈ"~Cmf³VufCĤ)VM­żcÍ_—äd£•+šŠ&mžğ$°§œÚŭè)ò ֆ#‘p8ò×S̉8òJ8xy;ùĝˆ¸ĉ]paÍZôğ@c9žJK(6SocF‹m”Nf•ÏÁ Ô9üuNöž\ ü+*Èŭ„žAvâ—Ĥ( …Š*2‡tÎÓŞJ ”É5ˋRKƒŬPH”Œ Ë1 +¨yN‹ÌşQ†`½͗ŠŠàÇt1\R§Šm¸–+uH!áŝ!ÈÉ 0HµİÍ\ĤמŜÀĞ€AÓÊxeÓ ­€ló¸‚|ìĈzAŻvïÂv܋ŸĈ–t¤éLd.ósà"A>ôp@)jp5ӈ˜%LĞî†7ÇÙp<[ħ-Pĉv9½ÍššÛu”&ÑĦ³é)W˘AG{5ɞD$‘XıDñÚĴĵÓ£wx TNÂĞĊÏ{=>İ9ĊŜµcÑè–×İݽ:tnXÜö°Ĥ(Ğ$\R¤6_ST?ML+ӄsAÇ|^·KMır…ïl,—ˆĜ`4ġ`z²°WltSU›Ÿ^9qQÄr–ôġ-myËì9 GÉ4™—¤rZε­‰ŸlÛ+JŒHɓ9óëûòÜ+ğÏÌòWê\ڒÙ_?”c ÷&ÍÑ·èo˜OPxL‘À|‚Ïíġ(ó]UŜïċŞdÉÍĵIiôFeğ²?‰’*'$%'I)Úfş_—••f› £è i’l"Uòêä$GJvĥÚä1֞K£Až,sNî›â6íÒ° < €ş<\*T¨†Ġ ™áĵĤ9ٓWjS2ĠÄ/ñfxXĊK£4”‘)>˜T> ÛµŽ4dĠ›Ò°Ù„3è4$ñÉÒ°G†3ĦÌù!KÔĜ ÑN•*- ĞJÄbIìàĵûîğQ“€s^îxq D¨óÇ%çċÒz·€zĞ× â^èu´ÛéóŽÇ8‘·ûŽyƒS§=uö736cÍŸáÉÇrnĵÜ3·ĝġWwÌĜyìŻ‘żíŬK‘Z|amŬ6ç¤'îÈËġd¤çÏ;òbä_w•Ŝöp˲\gvVRñâӗŜÜüÀßh™ ĞŭÑw™,U=2 ’€ÛÈĝ˜B%E„™ ’(ƒA'ñÈ-&ìљĤ'\;:âàŠŽ" %M Uj]|Yê<µŠ#.'ċ5ƒ)é,iüCĝĈœßÖÜÙÙ|_ ™Ìœ¸ÜùÄÒ'Î˙9µùòÙÈm‹|ƒÛpU–ĵ>úĝ;£ôA 05KU`GlĵjĠÉRWÄkäʚË%Kì*ı½8dú‹“âÜTFĊ1ĵ͗d´…p,Çîà|öLħçËJ¸’›Žó§ö%[&Yŭĥ) BóÄIżĈğÀ­?Šw˘ĞÄĉbĝôÈêà†• â"(Pĉpĉ° P W˘à¤Œ×'!löà‚2%Z]ÈàÔÁħ˜„Ĉ²Ĝ.ĴwA&ÈD\bb”,â5+qf9VcgŸ;‰c9÷$œ'¨ĤZ/ÁJìN—@x€ĵŒ×bċÊş›wşÚs—·äÌÄC“ôò{×}˘ëv£Gž¨NM÷6$_½kljcğz^››^ÓğUoc• [ÖbĵŒO7e̛9-uĉ‹{ĞĞw‡wْ(ê>9[ĉT/ŭĠĈÏhñEAFş˘ÒĉD<‰¨#ÙËí³½m£’ĝ„D d´3œZšh—Ét>Ŝâ´dŞ2ħİÍç׉Ĥótñ˘(1„u‘:†žIc`VçĊ)dzÎèĊZI˘ÀÂNH8“(4jğ“c ‰Š’×5PüLóKß}saÍĴܢ^²hëÖï<ê­:Ċœ ˙µvFd8r) ğk7­ŭüùŭ>÷Ĉù‡D]ŭ˜zCdEûYûÌx·İï7QSxġ^EéXğ…SĜáĴV£Ê§Á”¨-vİÏhĥAˆÂv­\û£.”ԍêCÌÀˆ ‡ÌĵG—z‘RĞ‚UŞTœ(Q.Œ MÉ /J@&1ħ^LcօÓb˘"K,OċŒ`ñǤ"O’ŻBy9˙'€jċş_NÉŜ¸­^ó@âWÇßükÎÙèşàÛ ïí[ŝēïoZġÖœ÷)ĥà `P½@ ʐ­ äŽWV)ç(÷Ñû­Œ‡×‘ğ ñv;§•ğQĈdj3U~µĈâù,ĉDÇ×ʲ+—ğ骛o˜ħlÊSOŸi*¨*Ŝš9ŬĤŸ‰Ċ—Eĵ·WŜs¸żóµm tFĉMdDµ4ÎÎJíNĴFjGOİPûN“ t(‰ò²Îl2_v-^G°İè´ÔHˆ"ĝ;bĵ‘J^.¸-‚^°zïÁsƒĜ!˙WîÒ!u²Ñf–Ġ;‡wì`ÊĈÍ#ä‚oxvËċVêÑ-}ⷜ‰‘bêsÊ@™èH ĥ@W×HĝFÉFù~kŸ}żŻ7í¨Uà)C’_yZšG ÍúífİĈ.MÈä23•iÈÌ3–lıÒ§˜äġÙÌYÙW(Èá"AÂżV˙xĤ”‹ÛÛ÷twŠ%QĤNö¨ĵîDŻX S˔.” ”+<ö$/öYŭ`'äB?Z‡‘³Dœü<µŽc]I^_^ÜÁO‹dag‘wÔjÀƒÉ]óóò{K:"/üByDá›xïk/U°{í³‘0w —?óÏWzĥßuêúôÈtÙ$÷ä —s_éş°÷Ġ’m³?¨Ÿŝ-8Ä œyòäàM{~ub`áz’!î³7G‚M1 ™tŜÈyíÓŜÎŬÎóZÑBĤĥ³œ^.UĝàYèŭÈE³‡]-eWı³‚'+Z”",(ˆx.ŒàĦÇü%µ{ŭP oÎ=ž™q41gCÇsC`üߟá*zşññ òt×ĝ†=çÍŝp1ĝ;â :ĥqŸŸYJ*ıġslI˙œœ—œ;1ŠÔ A HÚú#pÑİ?œgNĵ"½Öŝw1Ühm$xÍÌÈÎa3ĞÙ;¸ ÌQêeêDŞħ€"ëÉ ”)ÒH$4‚Ú/×jbÇÄb>ĈMħġI!ܓİÉ ŜtµĊ4 ˜óĊCRÁ[Á„_Ğzb&ŝNĈ#>,˜ƒ•BÀ—'•…€Żû ~ġÓÈ"|èÓÈàƒà¤Àg#·†[ˆ­'r‹¸MMħó`ñ6ñ# "îŝĞ6ïÇO ÖĤĦ!ĉÄ÷“GäƒġUȋî s<§dŒĵQiLñ>0ĦĠĉÙ²Ċ2ıÛ#µĜŬf)Ħ—ŬhW°b­6•ĤÀœjżNĝˆhñ ßpĈdz@9̔V\)DU—†/|€xìĈ°è÷ ܈Déeñ¸@°âru…„ Ĉ5èKO.yŞíşÔ7×.}äˆĊßħhߝµûúä‰É•³g>:kKx<ùüĉé[z[ÉñċıSM<Ó °3f8ĉrްgYB³:Ö§ëb;9F'':“ <)ĚdR għ ı_bħáL“ߌÌVÛġ¸x…˙ ëŝQE°°¤+–â‹ù“J ^`ZûĊééGìÙëŝ)…Ö!ĵĝŸ_˙ó9O şÒRÒŞ0”ċŻX~ ˜….ŽKğÀO’#ŝP o7żSġˆátßĞÚoñ/ñoӟ(˙Ĵ“OàYğ‰“Û523g6ë‰/Áb•ĝôf‹5„%à-5]+rˆ9IéÈH{eZ œ\jâĊœJŒJRÜ‹° 2ŜÎd½1ç(fúPS²&?G`Û4pŠğcÑG÷eO;ö‹;Ÿ>/Gŭ rk>c;qBïÎù_#Iá6µ’µëıVi·É’”Äg²$KÁÓuù“Ìîäkzş˘‘WĊv›ÁŠ‹—ö"+,Œ1@†ÍJ/˘ŒlÜŠùğÉħ\4×`Ĉq\>5Sħ˘Ĵv“÷y*Ż@É(Üxçs‘#{V×g­ŝ›ŬóoŬsל^ꖚ”’ÈŸaOíĵ)?ħ&üA\É6A5ş>àġQ^ĊxŞŠĤ•ĵŠ(%j‰ÜÇ b¨–ò-|>dÖhC¸ÄoŬâ'¨wmééiáêQmDoô<Ŭ? ĉfĈdWYU·Ş-ĜK¨ç)2°2ĵ[‹²èÛÔsôT8{³pfàg…’ŬÌNÍ#şŬúŬİlJ²ÇWàŞtU%Wùf'Ïñ-J^ì]-_­X­ìrw&wz:½½‰}éZ \!&ƒÎÔ"‹Ŝj´™ôşÌ”ÙŜë)O’BJ§iM/ÚìZŽĥgîI“eqŠp(˕eq˜ &ŸqRŠ—óXr”Ÿjòeš³sGŭ70!ħóğH%aıEYBûš D‡‚I‰}F˜†3ˆWïħx]J‡ Iĵœ Sé_2İP²k ÎŞ3ı°3!Ʌ\IJï“ş°×#‘â څX?d‰j›KĝŠàŠEz1£ßßAL=ù+?#ˆvŒûßß@pĵ>ü%ï)ïkŬ=ÑwÛÏ6]×ùŜÑ˙y2égĵ“Y´¤"nĠݲ%ï~ĝċYÁÓçfϙscE2xIİ5wïŝġ–ıísĞê•İf­=+½â៽ŝîä;%côK"aĉ‚u¨˙•"SzR‰C¸4àĦ EFŠUJĠ0×fŭHŻÔ'PŠP— f³|ğµ×ôí²bÎŬ°*|Q<<Nü°½ù‚{×÷܁^}Ž"Qç˜ì[7wëVfnä­íáŠB­ “-ŝîĊäÌvñĵïŽŝ‰úôÙÎLé^Ò‰–×™µf] ğŠz[Ä(ˆUH°]&Îd‚,Sê—Ë,ì˜}sĎĈ:£~\iI‘zÄî^ġÄ=žékڃ -Ù÷ŝşÜ3ÔOÜo˙df ³ÂEġšûĉ>F”?ĵñĝÄÔYÔo"ïXŭ”áŭ …À d–á3˜ Ċ¨´S‹Ù ôFfê#|Ş&ôĉ~zs–~‰ákRnKáxÑԊnóÔúĠĦhÇN:„ï=BQË5ʁDĵ ˜‰ai c†P,…ÀġòÂf cX’ÖĈĴÙ\wÉTŝ裰YÜÁż€“T?A9p/TukıĜ#mêŒĠñk(ŠF~ Ë2cgf€A?Ž[T?cFf8Uü€‹!KÓ ­灃ò>NÄig"ËNFn§³.ïĤÚx"Hİŭwátúmà–ŭFÓ>%ĝ\…šjMƒf1·ŠZĊmÖíFğ˜Ŭú]†]Ĉ>ÔgPU£İú*Ëzşœy‘!˜^ԋ÷1}F&9…1é ġrY‚W ‡™Á ĵ |ġĤùÏ pĤ‹Ħ ˨½hşj1рµċš³Là•öv# Ñë‘Á°\c4šŒ… 0mÜ֞<<ħ1r¸fM8GDĊÍ‚µ‚ñ“x@‚˘\g½÷ĥ”=Úŭ¨×Ÿ˜•ŞÊÍR1“”‘ÎW°ÓY‹#[#_<Y4ÄòÏ(X—‰8™¸îù v5êAżFïC„váÉ6j>ĠKw˜yÌKì6öCî~î"+Dév”(ü­;Š! \‡âüŭ”‹żšü }½Ş"Ž£Ae¤@èG[ •CıÒ}:ÍÌF²ŭ ­gÑ”›áÙġġşĴbxBކ÷mœi=>‹ÖC[7<7AßġB$áŬ.´ óîĤ„ôpÇy98vSBÉ×HcŝĤڟ‰Ï—_(ùöïm—}²­üw"ĥñ÷˙!Ëvendstream endobj 391 0 obj << /Type /XRef /Length 323 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 392 /ID [<9409593a7f8df5940b764065c7e0417b><34d2dd53a623bf88cca14b3614078825>] >> stream xœí–;KP†Ï9­l()˘6‚·ĊR;)8(8 EDpGWĊYpè ˙A¨UttqSÔATg/“1ï³ĝ Éòĉœïr$Ä]ÎÁdĜ„1ah ŻÍHg×4ß7›Ì÷˙34[§Ñ4Ÿn“iĈ‹Ħ~iF“½ZO&/†f˘ĤïpPĠdÛ6ÄÔĴĜ^Gó.÷mŠvQÌüˆŬ3)v•#Ú ”îßç߃]ħx^;DoOl͈Ùüò^mšŒ%ħeM=ùqâÏQI… /¨áżÁó9/vìú‚3\İetNL³‹Ú Çĝ5"ÓµċŻÑŻ-PÏŝ¤‹ŽGÖĝÄ_"ÚŞèS‰§ŽJ眤ÇzN¸Xùە>DçÑïĆcâ(ÚO²œÑġ Ĝğb~•p<’ endstream endobj startxref 254619 %%EOF RProtoBuf/inst/doc/RProtoBuf-quickref.pdf0000644000176200001440000010351015130744443020047 0ustar liggesusers%PDF-1.5 %ż÷˘ŝ 1 0 obj << /Type /ObjStm /Length 2632 /Filter /FlateDecode /N 42 /First 318 >> stream xœÍZYsœH~ß_Qoc‡CÔU0áu„KÖZ’eI>'ü€šênFd mk~ŭf }HïĴۈ:³²òĝ2 „I8×Ä%’sâéyDOI˘‰ŒĝDûœ$\ Uĝ‡pW Âáżö4á@"à ‰`: Ü#B0@“ ä…Ö>á>‘"}—IN'P8‰¸Z$I<"\â &€ñ4Ŝ°d‰Ü}˘|èD3OɈ†…`'DĞê‚ĝ •Äç´ğė€=ßSŠHE|-Ħ]?bÒ'Ĥ$lWh`†Á=&A2€ş Ğ|âJxûŻçÏ =5e…eH`?Œ\úĉΤğ£2ÎRòÈÓĥĈ%ù]³2‰SS€€móy81§Yd}W˜y§m.HMîêŝú÷a…$›/ì˘ğ³ršċäÉSèÉMˆ‹„!O~y)ĈácŒËĤ~cì·fÎ9 ŻÌGò=.§d ´ó܌Ħûµı˙žċQaiO›ÈçY4 wt~BŽĤYQ£<+ÁHĉ9 Ĉ\Î˙4£Ò’ĵŠËÄ`İŜÁ~6Ka,,˘ 4û­Dì6M³>q¨ÓŜ* ÉjŞĴd Ş´7żĦ·ŸIaş[ëâÔDq¸—ŭz ~ ŒXƒnżà˘9ŒlaŠl–€ äáċòè²DĦ€qT:Íp,Ğ5™g£KSMz~pğ0?P/^´7ÔŬğf‘%İ8Ĥ'!”yGës“¨'˜˘\ĠÇOŸÁMß Užëì?% îċ 3³ûލÒÄóħs=Ĉ´Ï˜ŭŞÊ f5‚ ÚĞê Ĉj·şc;¸SA3öĊc †<ÏÍ·F(f=Q1f™u70èVcµ„ğĴÇġx·fĈ*3´!œ÷èMqĥrWŝ îêiw!~ĴÛ{´ĜŬJ@˙”èWq É^ÖÔr´Œj™†á¸Ö[[W|Xĥm\­iËÍÚĤ–ÔuP÷Ʌ>íċĠzïèúñÒ+Ġ¨{£İn+CcÒ8ö+"¨G“\-&>dûġĥ‘Ñĥ2wiğ^½e÷ç<Ó]͞bo“Ĥ˘ğÊŻ%ĝh‡¸’и/@rÒè6žŻĈĈ)zĵ{ôùt˙ÙÉée˜œíìeIQ-eQœNŭ§ği/llڟ†9¤ZU°ƒ­ĜIW‹˜eÇ`‰ñ´q £„öĞì]0żqU;ĴU}ˆ£rŠQ]Ûx^ŭÚċyƒ\²Oĵ/÷-˙\?€ÜòX07iSÙ#Ŝ=ÉmÍözĠhİQë.smë—yQŒPv ‰×Ŭ+OĤM6‹qŝ Ŭ£GôœtD#jè˜Ĉô†Ĥ4£9-éìİU½³J0 '(2)·Á^“„Ĝ’\âKĠy'FB6ĵÈ5ÎÂ[³JÇĈ£ŬtV Ċ‰‹”h% I2´\–ĉö=@UÖAKĦôc½KW{}ù|ôéd÷ìÙY|{=+`á“eóqy“ç6F#ú6/ٌĴ³™&Xٌâ|£-<ü'´_˙ĊËğiŞQê˙4^RJ[î´µ˜·­ĵ·šœ…TÚw °ŒWĊ)ĥbÉĞoz*ÉHôƒÖœ†Ĥ½Xmŭ~` ­“À˙Ëyìù2XhۗmuîËûô€¤‡àÑ˙Ħ§àї4¤×ô:ဃÁĊG#86$IHGÙímh=Ŝ¤QXLÁñÇ1İġ˙„ŜZ ÈRCï(œâ,@(h˙ E‚KZ~ÏèŒŝ ÷ô/ú—ɳ6VÀııÁŠ.LìU§‡bdż‹­3I…Ğ\v-R€)5HG HáÁ˘=¤8:ŝ|úñüŠĥ4ùŜĠÎEvĤ[8Ħ/Ż&é‚FĴ Ż>ˆÓ8¨Ĝ‡ìb½ì`=Z¨­%½ÏahD"-y|YKĞĵ–Ğ7ÁyÀàüâĠË÷mÛ¸0“YÎëdhœ ħ¤†ıN5b­jŝN@“5ܢ´°ĵ ¨7c ÍwçÔ¨µŬ-›CİÔáı‚óv`+! ÄMı͛*xa?Ŝ1t´ùn€Ŭö7óĞı´T-oBħá@á!=<·0xEßWPĉˆY’mü: “ŝMïïĤ&ü³„˜Ú&f\V TktüZá£ı+ú}¤üFżc%÷?T]Ĵ„ÛĞ•èƒ'{`ıÂ!ĥKD€ `)ç`yıKĈaR˜fÊâÉRÏQO^żùxxÉŜi–fe*OÛMÛ÷YŻç³ŜZŸí<ZöY|*[_µ]·jíŜm.ÖúğŠNw~i˜ĉ*Ĵ³ŜÚżúŞV[öNǜ–w*TÏÂ;wÁ?1Myúšž@ŞrFßÌ=ġŭ–MĉbŬ­•`ñĈ”óf(ϓ›Ú£ 2œĵÙßàd“Íò!OLQX/Ocpòtv{mò"žlëġ_gYi˘ëdÙŭÍ7³Óܘ fi‹Œ²ÜXTX•CÍqA.%QŞêġ ÂĦĴğ¸à-Â*˙Ûö¸%ôĈĝ ŒôÜŝlïó§Wûġ²pĈĞ–ÛÖí½ÛëžÛŻ=yyëNë ú'~ÛıÖ¸uÓsD|žÑrD[íĉƒġİżÊüĞp×ñğêAĜéŭ*ˉ£µÍ@ÚġşĥÙ{°ÊHĥ´MßßhšR÷MóÉÛ·§kLÓm‚ë ƒAK)×gġëž jĦŒŠĥö, P”o)gĊÑ Ä…äétµÒ;v­’Ï–ZQĞ£§ˆ‹·ğïß6ä˙|j y#Ä:(ĥN'²ŭtk‹–nm£ż/oĤٌXwġéġk=ĝR’}\íe™Ĝ„V²6‚ĥgıH“·‹„ Ĝà+ôċ@¨zçÔUÖĥm ”›Şîü şk_¸^úî⸙VżP·MOĤey÷;Qœß8&ŠLr=3eiò˜§öë^–CžPğ.³Żm…{xœ Ŝ‘}4/í+p½Àѐp8J‡#\ës/8‰Ó›9GĝRúA,Àó$.§³kd”ĉpԏÓq‚ƒĈĊùĉÒu8œSĈ…P>ĈŝċŒßÎò<ĵ/ÊìĈ$÷ç[Hĉ(!ç|KÁOË_Ä÷]ž•ÙġlìDĉ}8³Òú‰ÖŽ€S¤kc>V9€˙/qÛŞiŜìáñì+`ÌcÜ |N@òˆ´aÌó#ġ .`˘J–šHúxÍÈÇŬÖe~U•%/£ê²ÀŻ˘ZĞ` ħ&I8ˆÇcĦż{ùûĊW9óa˙4-Ì—Ò¸aÊ˙Ċ\Ĵendstream endobj 44 0 obj << /Subtype /XML /Type /Metadata /Length 1658 >> stream GPL Ghostscript 10.05.0 2026-01-11T10:00:13-06:00 2026-01-11T10:00:13-06:00 2026-01-11T10:00:13-06:00 LaTeX with hyperref endstream endobj 45 0 obj << /Filter /FlateDecode /Length 4724 >> stream xœ½<ÛrGvUûÈŻ@1J#e §ïÓq\•ĠFvìXk™b²’jk HX¸i0”ÌÍú7ò‹ùœÓ—é`H‚遃™îÓç~éÛ§AžÑAŽ˙ŭßñâ,Ïr#/8ĵäšIiàAR =¨ŻÏ>QÛaà˙ŒƒWg—TÍ ĠĊàjzĉ Ñ¤Y45™(Ĝàjqö–\WÍppĊr*ÉêĊP-¤!·ÓáH"3F_l+™Ğ‚Qr;VRÈ"×düq8âJe†krYMĞşZŽ+|³™$U½™­‚—Œ|ħvI #eh îuµXÏĉĠ$ôċ¤íRpò£5òÂ#(/Èm ĥÁ=PŒŸiBé×ÁhĞŸirËıθŽú—ż•‹ġĵ Dh²{’Y5Ğè ŝ€‚Ê"‚ŸÎ$Ä´ĵ39> ˜*­á=ĞĞÁ_K Ä”8íñgS R”ƒë A!’˜+Œû+”²L¨0‚ĈR1ĝCi9ĝ~ŸaŜ<ĤFjaCJ×ûq9ĈŞİcĊĊp$™´>~Qb¨“L8÷ż‰_0¨ŻĈĞıC òâv 946fħùtU/ÊĈ²4È İŝtvġOoÉĉnٔżù†ı ߆ŝ‚œŻq vŝí (((ĵï·.ÇËë*´f¤ımVġĴœÓ3ÈjŬX#ƒüZ~.˙څÓÎ`Yċô) ="÷\Ŭ6Uŭ×ñĵÜl–ċ˘ŠRÀœLêj³yħZ}´,Ü$PĦCÓkàg:ÌÛĤ[Qte£@$Féşút;Ğфƒ<6M=[^ÇÎ''Ë'1Ĝ…2[6œ…nšÌ&QĤ ĥ͚r~?"„Œy™€áLµĵ]Dl_ßĴ–ĠĠŬ:P”ıêòâĠÏ/~ĝéeŻNċq„˙ùĠËÇĝñ—Ÿ/˙£·'xÔ3>ùŝĈ\Êkàh‘˘?ß.>Tu@>DÓòmíPMï7ŠTP=\nâŻ-ÄÇ·“jZŜΛ¨m'-—ß?Ĉ,§zëŞlR{Y´Ĉ—½Ê#ċù­İ–÷6’‚<?ÁhԘ“â×5ĴˆßŽKî•à…î¸eŜë­ßğ|ĊMUž_ŽoVoâËÇQ\#°sŭ;íğaÄżšÛz™xüĜ¨]êó÷ßc‚vüŒ€i™ñ\ûÒ³*ۂ…Ŭ›LŞÍ¸žyî^*Ì6ŭİ3Ş– $Ÿœ'݁ z½G›Ĕ€Á#bJ` öHğ)’9‡Pĝŭ>CĵÙ+ ż?7`x­,CAàċÄF­ï [Ü$yö!Sȁ™äĜïH˘ÖäV0yÏñRVHAŸLEġU´3Òùfµ¨Ĥ@AfŒóçÓÁr C]:†iŭñ|ĥ ċ²8 ÛĜĥke$§hƒŞĦ²eÒ!ßnUŬİ3(zóGL§ †zÇ;´ċD:ž· í¸Œql@ ^ħeğ`M&’Ž—`äĤĴ3îy˜Y~§ÖqVóü˙ɸĈĠ‹d 1ò_Ħü|àN}*fgH“‘ÉùÔ³ÌÍ˙ë´ŞlZ’jtُœ6êP •„#ÔPàfŽp³PŠT1êì€lNÚÊ#/bWîĉ$ŬŒĞ&Ğ:´Ñäl‰S­’fq…“ñjıĴĈXĥlµ•^Ĝ'(żô`~ĈŒ*:ÏĜb~vsvO|ƒÏâ3d÷H^dÊĝ\bžÎ”ñ5–x?&Ó@¤Ġ5ÒLéI2ȏj;c‘ µ6¤3ŞĊÚrċ€°ì’Ùê;oì# šħ3²“ÈF U¸Bk‡ŭj-˙r8YËÜw(çŽû:ĥOô‚{êħġ2wqê)ú–ƒµğP0(µ›TğÓħŽĤŬŽĤŬ)ÔµDqRžiÌ쎕£ž@ä—ÏúSˆh>ìÈ铷Òdœ"Ż–'Ï@!qĤ;ôùp@Ş„)&•]$ĉÓ.¤5Z¸g%eUÂżÎ³mӓ%ĜUGî`d4f *‡²OҘ%@C‘6VÛ4AÁkÉœÚ c() –‹Q-’"%;oB/—&<‰}2 9‡6ĦŸe\H(R¸Ç/ÜpôĜ)Ĝwè3žkù–BEÈùjs\e’ÊÈd [à/T°[ÁPâF=Ğ>WqI£ıiż$Y—wóU99 ĥäŒ\œ@™ÀGĠĤn:Wù<\ $r”v€ŝù?úéùh Èä–ÛÎş ÎyĈMë D^A÷lx´ĥCz·ŝLag’îÙ½ñ8ôg{)İi&˜jU›JÑŠĵï£"çeLúòi|–É •ĵWí„'Š&Ï&yâ3˳PñY³{à$}ïY›FBr‰Sĥ@ˆ|cpKŸ5Otó„Ú3Z&Ï –êéÇçi‡;a:ĊŸ™˙Oŭ(÷é^Üù´ÈŝgVuúöá/xŠ?;Í~.°L ]aĊw—oiœ,Ħ{̳P2­Ŭ^\iÈjö„™Jœr1ɌKљqíŒKZŭŜ™r ö-p’>š7ÎŭƒƒéYFx´–ğ0´ġ7:çšï“?Ŭ?Äħ'P‚KY*w˘í´^%[zÊäa“(í¸P|ä…Kĥ&ñ `Ï$äöé_áòà ¤C™ì€<ċĴ@Ë$ ĊÖû ç(3íèJfLı…ÛSĠµœƒ‰@Q“Žup]ëÓ­ĉae-WrӁx‚²ÖċsÄ˙ÊZêc „Lé;Ż)k…À}ߢË17mB­ÈğËNä윖9ŞH@·r‚gB³pK îÖmÇÏ£P8ĝ}ÉßWÍĊ›Ş qZ’?TóÉĤ7ƒq1œAOB Yß­Ç{lEb¸/m$–ıÊt÷‰ÄŒñĴŭV̐ HéĉÉŬŠßIÜŞ cĴ3ZÇ­>.Ż Ñw¤Ò¸(2fTòW‡–ÄĵŸÍ£Âžĉ8Ár„8v'Ÿ!1ˆè¸Ùä4Šâ#[:Ôvü}îLƒ‹‚v`³¸â-ˆ`‰\Ĥ:ĝöí)ĥ#:—ÏqŸq1„Ĥĉû÷§­ŸÈI‡JE{Äô‚wċĵË(·/Vyk@7ir2+`Ŭ;ä,½óMáġ(êAĤÔ(âÓòN8w­ì+mDΠ6îHµSÚ4ċuœ 랒x0ÉPċyÛğġÜ:ôô'ÓÁF}ˆ …S˘-aó{äd™‡ÔBSżmᕝÁù &Ì=Ó#‹ŞıYuÒ'¨ 1oħ ‹˘˜¨pLû4Ċ £ Oû7¸ĴòJp¸ H“ĥtĜĤ2îvX›ry‹gÁÂxË3{š3w§~XNf²İ6û‚ÌĤŝ™ûŭ7ڞViÏh„v7í!ǂĤ Żgx8Ҟ ¨Ú“Ž…Í(³  #ĦA@€î˙QTğs S/Ğ>ô}cÛ°ş‰³H „˙BVÓöÑC*Y=ˆ)ÌI<^Ԏ8Ûü°œ5¸˘ÇI†ü­š„sĜ)Şûħ=Ÿ‡i;IfÍ&ŝˆ§˜ÜÉSî’ĝÓs²İš>2!l*$ŽNV¸<гÜħE’]´zK=w”ÉÜW›*œíV†¸Í]öçÎJ¸#—§¤rĞ0n·Ŝ·ñ3‰Ì­c[˙ŬÏ(²]ßċ'³+-Pï‘è6úyxǕ+?ÀŸUC{·À3żö¸“·u'^ej_Ĵñl2^£P·Üt0ĉİìkœxUĝÒÒΰĉ‚“/a"U $²˘o½×˜‚0Çó XÔ/HħÍ ßŭŸlGG5Äۓ°NnĠ~` !ò‰qĥŸáhwž™ƒ$çħiĞ“äÔÉ?•ñu`$…ŸZiwO‚Ûh™Žë™ïv’VËÔż_ĵJŽëí:h›wwt ĦßB[oŬW7ít7#K˘)„$>ñ%>¨šW @8ġá€TÎôÈÀ^3ĉP„HÖĊŝxœ{­˜m³ jg<÷îÏğ% xj #ğ‹x _O’ŭ …%Éq€™ż Dqgŭœ}Žİ‰z¸ŬĈއĉ1Şdu;ĉ¸[kJ&ħCS~R4îĵ 0jT_PU2GèN™ÙrITħŽKR¤JĦCtWe÷WĊèŜ`t~RdĉĈanˆ=Vó\?Së:ċí½†@?Ż˘G…ŭJ}J{6²£B­²ġ÷z .†b+`4g›8Ċ¤Ċ˙Qçµ"6­šñ͙ÄÔyy·ĥ}›PœË>ö•“ÉìF­—ÙE,žğÜħŽÊS "QùĉÉ*ï“QІèÖŞ@ġôubée$ucħ=ÜĦÈí¸ı­Ğ^§şwbG!Ä ÖÑàî&ߔu9ĈP>µĞ{;ßŬcœ{Ĥz_à)Ŝu]m@Leo é"½ŸÍġz÷fġĈSßËğS%³°8Ġâ ^%àĴ(Ĥ˘;(Û×TY”!†ÚŞŻôŻY’ÂùîïÈĈ-i›nzÈÙvĠxüğĠ”D ½*£íuKîsSä[Ĵ2:]>Ŭ'xĴ­˜É”RAY’˜AZíѕd^‰ĴçщnÚË·ĠѲi›­–~Á9eı•”„SĠĞ>Ù şÍ` —†][/\0녝Íĝ‹“ı€8iGp_ƒ+¨eMÒ-Mñ+¨½ğـáâ8fl~ö˙+Uĝ3â N‘cĞù”âáAŸûĵZĠÉ)ÈÙrê/1e{ÔvŒħ·2™TÚҌ†—ïn]EçTîżf×KĵûŞGÄzò³oĝŽœ_ĥîʞ¨}q;͖M½:óèq_# bQùvaû›716żĥ÷.ċ3ŽŞŻ0öÂf@îĊτNġ˙6ıÇ1FÛpB!†7á¤'ùž|ĠŽ` ž1& –´ p¸ˆÊd˙àïi’xݞE#W$›¸ÚPC˙ùâĊà ôĜ‹3‘ŝìġe`ßAWnġSŞÓ‘RÌY‰wçî-L] /ÜŬ[ŝ†6ËĵBŜv€]Ä+ "Ÿ°Á4w¸bk„6@ñÒ9H§ñşIÂéħI<2ĞG‘ġ àaöŻPófĞúúb]Ž]ĦaÁóÑßFN=˙Ê/´2ODÀíÔ^kŸ#Š ’˙Ŭ“‰÷˜µ`U‘ħhĞ?úğ½rċïö 7—Ŭŭ6éŬ^&Ŝíµ…­T”²…~oŻŒ- HMÂÔ*ŭŸçŞNd{âD‹MYDâyŞ_Îŝ.NÂendstream endobj 46 0 obj << /Filter /FlateDecode /Length 256 >> stream xœ]‘1n0 EwŸB7°”Z\Ò%C‹˘íl™ > stream xœUT{T÷žaafL)*s†‡3kĊW*Ĝ,ĈĤD| 0h”„‡ äµŬĠċħÜeÙ]Ŝ°k Ĉ£! G5îİ´Ġ˘Ö4ô¤ĉĠŜáüzbg]H˙Ì9żßoÎŭî÷Ŭïğ4ċíEÑ4í·acBj^Qĝ’èüÜ ÷Í\y&-нäY*˜=V0ö–ĝŞÀ×ûŠš‹òÇ}ÓqëT\3RÑôëıŻĉì-ÌÎÌ*ÖD,Y²44Tù.פíĠD‡ibSÓsòuE9ٚÔĵ MlĜĈ0Íkù:ċ2[³ ?O“ĥ3+5WĞÉ×jw&k’b6'hÖlŽKŠOX6݉EQÓò˘ó ×—¤gìÔĈoڜCQqÔ*žJ PIÔjC­ĤÖPáTµ”Š6PÓ’”7•E}E/£Ë½ÂĵŽ{=SíV}é½ÛûkŸ>#ÌvĤŭ9žġ{ĉ>‹ê(Ċa¸ü?B5@u żVìË_üĉÍ s–òë‚CbĠeĉŒħ5MÌf2ëµÒ˙ĵÙ̆=âyĉ\}Ó{îf^ğpµż8Y$'Ùûŝ O Ĉߒ(Á£.Ìñ‚³ñŞ …R ql)ngÉݵ}Ŝ1p†9\K²!U$UH£$ìdĝâżà†&\'‘(ĵ%†BĦH8ÌÄ) ?ô>r•ĦÒIòg!Dc|C$sñ(ú3ĵ÷{($?ıO?Œ]ôi…fŞUr –5B^"Q+#È/ÉK#ÑŽá])u£°–h˙¸7˙‹,}Yô{FG*ŠÉ>£ô ĞP–%ĦmûŜühĦĥ‹U7„ÖĞ˘z­ ŽqwêċĊ:zܛŞçÎüž}^'Ùi8”%ğ.kóŞ„²ĉ/M<=‡ =ĴĉÚo;oßûÄŬ[öLĜ’ŝç#…ŜĤ{܅w\ Ħâ’݉³˜ê &0Ä}ĥ§-n|uŭŻÖ_ßèÜżĞ[jÔWC ÔCuıĤşĥŝ`…:cÍÚ7œğêc€# bÈĞäW#Żà˘ÎÌ]ŸJ'[Ìf¨Ÿ R<ˆ%:7+AĈà@ŝ;ı˘_G=ÍkÇyéĜ”Ŝ­ö\ä›@·í’„Û$~èèmì½Äi› ]!#ê!öÁ‘<]áŝbÓaàĉÁçwîÀèŭn§ĦÔéfûì9vèŞ]ŝ§Q¨BĠ—¨ äÈEĜ$ 7BŠĵ•übE8YL"G£0üÜ­goJÎğßĵ[U[qşÊ|*ÀzC|rœ18~ñ+Żsx‚9~Â|Q"*ğÀǓ †Ï´´ßy8ó´l²ĵìĥPĵڝÎreğüG0x™›ĵFž>F —Xxğʜmçĝd[^)˜ù ñŬG^”˘ĜÒ,Ċ%]à”È–7ާ‰_ëɓr•ĜÏüàħd¤™wàü3íGö´‹ĵĉ¨Ŭb²Îl‚úV÷"ş2è^vwħy„~˘D́’jL \´ ‰eòÎı2Ú\Ìbĝ71D"RÀZŭz2C$~ĜŒS lŠ‹QjĞfQËJ Ëw‡•‡È<†¨Ĉ pTÀÑĝÒBNĊ“²žÄŬ 1xÜqĴgФŽKċYÇ4g­İúP›ûù!;.W0 1 °ĉ$ĴOĵdh¨pŻ1K X&­P²”;Š ’ƒŭĤ ’¸íñ#ÀtLÀD iâ|Ż+~s/ŜÀœêŜğ‹ÇfŸÈJìŭ¤eôà´`ÜJvAŠHŒ ˙Ŭ$úÇhE‹‘ä|sQ8!ĝOLğNId‘Ĵâ&‘İ" À `ëĜħN‘ƒzfq:E‡Èú˙ç{ԃ¸ċÇüjÇCúŭ¤ É/ħËżŽy~IöDa›gŬÓĞŒ[Û)÷ ŭŬĠÇbuôg8E%—9¨34‘hÜ„a8§ħÁbÚà71{a—’2#˙ċ)\:ymìoÙÖĉ––Öf +ƒ%ŠçëgšŠ÷üJœrгOŽëT˙D|Á;1ßwÊÀ1›ÍlĥԘm³Żïż•“rĥX-?¨˙÷>í‚endstream endobj 48 0 obj << /Filter /FlateDecode /Length 417 >> stream xœ]“ÁN„@Dï|°2Ŭn²™‹^/UÓÖ<\¤u8ġkµğ{ì×·Ż5jÄôOŭ)v/ıѓĉgÏpcí‡Ĝúċ=ŞCJċ0MŠeü÷Şğî8N×Òv(RJXQ$`§"ñı K„Ĝ ĜÛ"[˘ hÀîĤH)avEvÄ\$`&b_§½öz‘€Nì‹ì‰c‘€#0B–Lgf›yÁŻÉ³Ñ³ĦTl,6šŠMĊ0h2i4i0h2i4i0h2i4i0h2i4i·EŜ÷Eî‰Ç"DtÀÔc iL‰Œ‰ 15ĊĜCCLM16ĊÑWSœMq¤q%r&r¤q%r&r¤q%r&r¤q%r&rĝuyvzvĝuyvzv\ıëڝ×î0è2é4ıÇMPmjxPà&B·•ƒĝ;qœI÷ï,×çĥĊrÑ  çdÏKüŭ$ëyċŞ('Ġendstream endobj 49 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3386 >> stream xœWyTWÖŻşŞDË%jwıĦ !7LpTdWQ èĜ›ŬÍÒ(‹q{¸#EAE@Ä$*ÉD'N·ŒFĉVÏ#sWÇ$ߙ?ĉÌuú­wùŬ{÷µˆrr D"Q˙%jml‚),F·è]½F!ĴyóDüp~„c6Ĝ:l1/uĞ#ru*ŜŻe€mğêÇÙżWÈn‘UtZôÏñ+—‡{M˜0qžŜ`1ŞâÍÜä™3grħîÍ 4İtœ'$*5zƒVİ3ûpaJ%gŽWr*µFÉÍ[ş&dI07>xÉJ.XİSc4\hBĴF-çİċJIéĊİôFNÓ;áäzBmVëu&n‰‹áL\M.)“ċJƒ°1‘3(ZµÉDĈœÚÄĊctf‚3ë9µNIPêÉşJŻ3s£žìkÉŞ7™Mr£Ú`ĉˆĈ€ ^Íñ1fAŻIMĥ9½ŠœTèċ ‚7o÷Ì1j‰3+“Í‚žX%§P› š ÑKDŒjğ &µ.î7í9£2.Ĉ¨(Mvı*żùÇŭÎëƒAcħßĠÛO½ĠŻ6›”•OoT9V·ˆû‡•ßBôż˘(o~ž! d 6',ˆI޵ȧ(”޸ĝċê° ­Ä‡9>ïMšü~êtŠZJ…Rc¨eÔXʓ £ĈQ+¨ñÔJj5ò§ÖPó¨*€òĦ"İ@*ˆ ĤĉS!Ôj5•ZD-Ĥ–PZŞ/ĠIéİ~Tʝ@yPë¨ÁÔ’z”9z& ċ‰Zœ|*‡;†;îwìrŠpÚçôD˙rÎr.tuîpYì˘wisġq-‡27•÷u@p°¸Áġm|ÛSEĤŬŒGw{}íÖS-”âûdċß ¸„ÜÀŒ„aİ\êáûCD˜A Ï@,Ş çÍüyÏôÄ"ˆƒžc >ߗ ‚ı°pü/x–, ‹ÙîKA#=çÌ^}óċËĈ›wdn6•` ¨ĵmâÙmm[Ş55a·&×`’àX<ix xàqÄĜèû >̖aO:'t•9" ~ S`Úç?‚óċs–ĝRY~ÒÁäl…„˜‰uV‡>úˆSÓS#ˆŻ˜ûu™Wg–6èo úÜÀ÷N¸K²¸Ĉùg `İS/•€³žŭüB݈  ÀÈϟ7tŬ GàΛÀ]Ô Ŝ)1{œÁŬ<~ħċڍ²gÄœ4ϖuE´•`'b(Ù÷îyΒk_ġÓÔ0?,&âŜ#â`ùf‘_q`N^€;~3ùàŜsìW-_K~e´?”„ġ†p°GĠÛU3Ħwkjî>´kGĦF1™YÛv´…Ċhŭ%“^3öĝ…7Şn ŞÌ‚Ş/ˆŞ/ÈÚż‰Šì_µàMÔ4™Á^ƒ¨ˆ^A°wóìN §táħÄĦӃ°c\ŽĤ0QV˜|$r |>¤"-7 %H>R$-ˆÓȵH7ç|œóñIršŜ‹˙ħ|Ñmôi~uyuùħK¨ ŬŒŻ(CıéÑQÉİrëĊÎÓĤˆ,İ›­ a:ħu#I‘Z!E"ùá,Çî½=6Ŭ˜°1nŭŠËˆ-}§&‘˜Üŭ<.×m֝–YrRò”I[Àğ=Áä” Ĉïá$ĵĈài°ĉéġŠğWeÄ?npßü^?ŬëMçì,‹9<6ȧ KOŻyXV²ç`‰ô)“ş3sW:’¨2rdpáM=¸~V{Ž­p:;ˆŻ"—0 ×Ċ/Ġ–wHá'Ìġ¸2Ĝċz00_^<ÑZ-]ÈĜ!È?·ŠŽ§ ÁĝŜĤe{*™:mĝrSi§ô&öžÇ ÙkÏÉk•W“şHz}Û e|eïġŜB,%š—ÂGèk,Ŝz•J ‰‡9Wħ'öœ½ğgHa}àjqÑ|ÂgÉĜ´9S–œŽPPZXúÎy£¨#„µ°é0dÊ×xIĤiïŽÄ‹p£Ñ0?ĝĜ<~‡ĥê +‘$ şŭUĦ†#ċ²üSeùĠèSt q³ŬBV[ Utĵ “€kĝ÷tˆIÉËwˆ{:ÀÛĤĊ‰ ĜӍ‡Ŭbl~S;Ğ@'ħ†_/Tĵ/n[q§‹ù0 @§ĝÀž|,ï58"™ıt|óڒùÄÖ ÷Ç3üÎ­ —U…_W_GèBIE“;ó}{‰/2800²ëÙO 7í¸šQ ß/"ÙĴ\´@͙—ĥœ{:µĊNÚïMÄN8Ï}<Ŝ…Oğ^—ɰ”N‰VW#9Úp$éÔëĥc;%ğħÙw+j>#ȗ§XġyIû÷¨$¤I2M}ôä•èĦŻ“bôm˘Ks?9ž›żkgô³qw|V2’ĝĴ[?Iĥ`ĥϝžùÀñóï1vÎ˙áUŻïBÌ` uä'´|™˜ö¨ÒĊÄĵ°;ŝû}‡`hÛÙ–Ë2fAÄşÀUñGkÒ¤x,“ŻĞԞ‹oMıGÒoĈ/ÁCĈ_a~Lħ7/ûóZ=ß?$Şóé‹óŸß½í¨֝Dċ*btç›$& ġ³úşĥSÇÒòı–½İ(^‚ïÙÛ*ê´4¨Ê4Ç×^‡‚½"TVFh-V8J8o9áçżZ¨²$jY˜Cw”n\ò1JßµEĥ+YP Ŝ›P/i'hs^ĈaT6l?äS}·ĵĤ}%5ĊW~t&*Ÿ¸Ŭ3̞DüûNDrsl/Ĝ\°9ۈÔ(>]Ÿ²ySjÒĥhD/#î|C”w àËíŬRh.´MëDrǝŒH2ƒ+IWQ=Œ†fÈ˙ÌïeQçĉş¸êˆĉNŽ"8Ïóœ‰Gañ§+`ĵ^ö"é§ä*= ş$L5iìòs_m“’ž'ŭ2–CÁñ;̲V<ì¸ ÓGı"MjzċbE÷“&ùÜ}R;ÇÓ"Ĝ ÷X~4éȁÌĠż‹3ÄàK5=,‚h1žBÛ}ôşBbÒ{vûWß·Ż Va2§÷ìQÑúğ×PçġÊêÖ ' ÑRÜc_ùœÀĵZĝĤ‚#É˙ éĈĈ•'IQyLZŒä‰Q+$½Ŭ–¤òmpġjÀ·DÀBA?ùú˙+Ŝ:GHtoŝĞT'§¨dG;x²ĜóŝâC˙, cjö•ĉœ(Ş.û¤ }%B§À†Kw.o¸ †Üw„:3 îğžÜÏw a” ~Ò"MŜ&ĞıtóeÂY—ûÁ;ô˙gÀwĈƒÔ"‹ž^˜³ÇІ–YSÍ- Ż–%‡·&žÙZ‡†Ŝ;şµNw"ró–ÛĥLòŸE|3´³=m£ù6úwÁG‚GŜĜS`=(K%}Ea[ÇâĜ_5âNbmħš]ùâŽÀo !ÀÇmñìl´`CthìŠäI@ĜŭÈû§WÖÎïRŜCŬ¨­ĴµşÙúÁƒ6}§s#¨Ê—8"vŞD'“ލ>ÑœEş _ĉ‡éúM1Z³ݐ02ġTĉmôŬ;ĝÍĦ“ùçNĞ&u"¤£2Ċ|*ۓJÈu“0?ğ‘€   ŻD ˘żÀ0ˆ(8ÜYÜDœ=jŭùôûĦ²ŭHôîwĜ ›6{Œ2³Ò¤N1ŭuĠùöÏÎFÌ2j$ì(Ċ3U‹ĥâÁ>QxâµÏlúg">Ž_àµìú‹ĈkweÇ sÖÂú,I.½÷!½=KĥfíjÎÉÌGĠP1wW_›'=Š>“³)B†äÔxûÏsÒŒÈ_BĉòԍTĠûŝs…<òCP.)h2ŬË׳[Ïg[ŽĞœúš‚ĉ)˘b‚Rüfv;<ğryMÈ-ĊßIUüñ51pĝŒÇĜm™"%j½lÏm„öŸÊkŻ>{Ġ£c–‚u/ĈvԞ5;jĊâ…ë›nU×Ü!s3óUV˜e,ĤÁÙFşĵ>¸7ÛĠFríKQ˙üsendstream endobj 50 0 obj << /Filter /FlateDecode /Length 174 >> stream xœ]1 EwNÁ IÛ)bI— ­Şĥ `"†"dèí &éá[zĥżġ͆ñ::›({DŻ^¨ħNGXŭ fëHÓRmUÚ ĞZd l¸Éŝ yLċğ\€=Ï'ì4Ġ£ĵ†5HQşHÏı荜ŝuĠ0™}óÒçıfl*c[°¨Œ^;|ċpIx˘j‹\Â70f‰gü> >Í"_¸ĥY!endstream endobj 51 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 508 >> stream xœcd`ab`ddpÎH,*I-r Ñ ÊÏM̉İüfü!ôC†ığċGÏÏÖnĉn–Y?j„ ~÷á˙î.ÀÀÄȝœ_PY”™žQ˘`hii XĴ˜§PšWPš”“Yœ‘š˘Pž_”­Tİà”YR\R”š˜Ğà™—Ĵ§à˜“£ÖWĴP”ZœZT–š˘§àœŸ—–™’šW’™˜£‡u sbR2ƒƒ3ƒ Ĝġ , U eżŻâûÑßr0fŭ÷šußUĥ m}ü=ីpÍ÷GGEg²~W\Ï6Ħr6ë÷mìâ·)ŭ²÷+žÜ²HîÂ}ĥeÓOXÒÍqy~–|6ûï˜hŭÜneá5{ÂnÉ ×ìî>°Ô6 -Kd^RuV7Gdîš=WN-û¸IžïÇúî?d|w[5{>{ß;Ÿ2˙Y"ú›?5çĉ_ï"ì߃ß=ûî]Ĉúùoĝ¸ú’hùïkĜ˙şħüàa_3uċD Ġŭü-çï÷[Ĵ­˘ğ'hlPËħʛ7> stream xœ]“ħnÛ@D{~˙@”x7Â5N"Aä(òh°0Er‘żÏÌÈN‘bŠœ½·Ğ=<=}^—{{ĝħßĈ_ġŜÎË:íġíöµ½Ö—emާvZĈû‡ó9[sxú6lż˙lµċ u~ĝïk=üÌÙOŽoĈÛTßĥaĴû°ÔĉÒuċ2ÏİëôßOéüĝâ:ĵzúRĴI{.íYv,í(;‹v’­Ċ˘­²sħhYûÒóR×ñ¤=‹ö({*íIĊ˘…ìP,ÚAöZ,ÚĞ,Żû½‘“••úbÑö²LMNNJN„KLL,’\(İPĉ}³ïœuçÌÔìäĴäÌÔìäĴ䜊E›dY$ğPV!ĉ…xÁ8 Šcà(( Œ£ (äbÑfYĤÂÉpr‹6d9=x‚A8á`@ì"ÜI¨“àláùBó› 7j,8[x|ÁÙÂó…ĉìS¸WĦ^Yĵ!Ŝ k˜7Äd ó†xƒĴaŜo5Ìâ ²†yCĵAÖ0oˆ7 á€!À M˜ˆ§àóŸ]R}îP;ï{]ïŜ> stream xœVkTWĥ²éŞ•žӍâ[”§£ˆ ò‡ "*ŠˆòşAŜ0(Ĉˆ5ñJD£6>P$‰€j•‡ĈG@ A/­6H#Ĥ5̅Íìê9ÍÜ{şq2“³Ö]ĞתŞS}v}ûÛßŜßĦ)“QMÓäÛ2ÒB˘²Á1q†µYĵÍOĊ$ÈÁ Ŭ!]Ž™ ™ šjŝħĵžğÇAÀxJ@Óے=“SrRââÓ­7Û/² ^O.óçÛŝkŬÁĊĊĊz[Îïß[{Ċ¤%Ä)Ĵg‘›Ì˜¤äyŒ"}‹5“f-³6ÀIŠJŭŬ"EQŽ dϔİĞÒÒ3ü2ŭ³˘ĥċlύމ Š‹NÙħ.1)L>w”í‚…vöyŽ\êê6‡˘ÖP6T5ƒZKS!ÔljJ…Qó¨ġÔ|jċAyRᔵ‰òĤVQ>”ċKùQN”?ċL­ĤQ2*€ZLRĤ”œK™S¨ñÔʂŠ D”%eEM$ÔhʉJ™0Oè)t­ċ0jç¨%pd ŠU‚İIP ô~)ĵɘ3;˜óÌ6•½ÂMĉ–qw¸_G‹F{?ú…İÈ4Ĉ´ô¸iéŬ1“Ç,8ĤĈlš™›Y’Ù~³;PiÎ7 %ÜŻ´èèrïCŬ–˘?uebÑ7ú²¨eEkîèm­Ŭ.“à˙íĉ­Yó,·r‰èO}ĴıÎİá°òÔÏ´L¨µñÏ&‚šiG·O_İċDïĞj”wîNA}ÛVq"µòr“)¨!Ğ.ĉۘËżòFg´ĝħòÀ—½ƒ*öžÏ.Ï:.GÛQt~ÒÎĴÔlĊŜġäO¸W ‡!‹½.œI#‘ϤKŒ›‚â?IÌHÏH“lAI(½‹·í˘Ğ4 ÀyJŒg;NÇ^ĜĞo:̅Ùŭïaĝ9żóĊîâ7Íîx"·ÖÍnapˆÀâJ+5×ĊĤĞù5}S+͑XÎv*ìŒĉ˘eIĦkü{",4Ĉ·ÑÛÎàm…3™Ùz[krcǀ-ùÌfˆ·ûUo'ÉҋĠ@)QÏ×ġâ=EŸĦ}ˆS||˘\ X­Ï-,^.ˈŽ—¤ì–­çz˜#?ÔT¨÷´6y£4ƒEñ™y~…Ĝ4/ç³Ä]İI›‘gÛşĉ×ֆ³ßK+OkD'QéÁ G8< |Ä(ı075=!iÛÇáˆóİlhŞĝŞTÚwìÔá‹ĈŜ6èܕtc7ÜÑ ò§ÙЁ ŠNRpI?ÁܽÇÏ )AÑR¨`a.kG%`İŭïşd?V¨u ĵL"À3ġĥx á‘oŭÙÄ%ğb³óÑäOPŝÁœÜ ö䞓ŸAPĊÑ3_•Ÿ>qĉĞZÈיOúM´•Dħ‰0$ŝìvÁ7Yqġ² "ÛivĜ„´™[ż5L‡ ϞÂJ¤‹™üĊ[£ĵg·î)ŒËFĠëŽëÛÇÄ7„\4ŒÔݎ˜ĈĜ[ƒi˜öÓ­ -7¤Ğž°8—÷“ĉž€ÇŝÖÜĉ^ĵ–'ĝĥs͗À.1zŝéÍĵ+ ½wĉ’p³VàݧÁl0ënĤŒäjsœ/ C[Î%_Ïş´÷ҁ;ÜÁ6ñ‘ïġ NŭÈgQ*:P$5jž'ħ­:é>Òl_’ÌœĠÌeċİš#‡Ó’v6ûpAq.âÜ#"WH½}:ô›ğùÍ£ż(ĦV GĠôk-ĵ€ Š!‡ı‹nœĵrùúĠÓuè1-íÂ3$¸Ñ0Bx+8 aìІMa›GfaL0–¨Bġ]Ŝž@XÎF=ÜPáK²›ì€9ìèĴ÷µÒ+‘Í;›P+úîb]+—Â"Ż=[3I[s6 ”P’~*ûDáñ}•Ü™£sş‚`RĦÇçż­½zóD+‚qïÏâìqrl‰'„.w²_gô•fĠ+é?ŬÖPĥŽnbĥ‚£€ğ‰Ñlö…=yJÉıܒTˍĜmŸĴiĉÊ-éĞ%pi¤‹ĦÎ`¸´V˛6ĝĉ^Ĥğzğƒô€?Úò_‘òÉ <ËğÛ[^4p̲Ж}ĞúÍmỐĊ²vl#Á݌4Y›7Í †{İlÖùÌÒ(’[=‡ ĈTsè½EkÏrh‡y„Ĵ%ú²nFôR'7Y<½‡!u!9¤˘;´<­Zŝ˜ĝĜÌíĈ˝Îs\$Çş_Rà·éç´ÚX<EgnOÊPdEĦe(ôt|mÊן\.AvħoidĊö[>=q @ô£²ŞŝJe z„úCZç\ÀĞë'9Kĵˆšı'-ġ%ÌĥĜ€+:u%ï •‘E?ÀÏÍŬ°Ħâ\‰[RôùRÄ½İŻùQŞËB”É’éŬŒÑƒtĴš†d†ŝMg%†BµŬö[iGĈ°a8ß#*fè(Cqĥ2/žƒ7ŝ•Á;àâĉ~Bk§âTĦ‘*†ĥĜ’ ‹‡ċFvFVùİá \8‡Á[ôx?,œÍÀ‰aı\÷äwŻÏRtÍxöşlpT5+zúßMÚ^Žñ•àa‚áñAU´Ÿá‘˙ˆ}zgwTfP¸$İ9êœòF;·È8ѵ'Äezu‰›xhqĵx,?Ž2Ÿ –Ü:ĤÛԓr‘c v ÇnNx:7bCmƒï½;-ÔŬDÊ˙>˙·+ÈÚ>e€ĊÈ7iŭw´ĉĜĉ~‹VíÊÚ\ÄĊ°—oôJÁÌöŝD{P -bĵÇöüĥG!dŸÍ;B–Ò˜OĦïŜ-lb`·n÷“RİèkŭPŬ/€‹şb?´Fn‹°%‡ ŸcĜÂ<5éÂ|düĵùIì­ ‹¤ïŬLŜÖÍÇÁ8"bÁ܅›˙ aV÷öíH›ÒpĴOÇĝƒbŭÁ>ŬĈµlĤ³òÔ\NF`— Ŝ <˙Xy˙ï+ ‡¤ákÉté‡4bŭhĉè½ŻĞ5·'ŭOíN"ìïӚ˘j˘j֟òEÈ71zMjLAd‘'×ÇşùEĊħ³gŻ}WŜ€¸ç÷ƒ—‡ìĜ$‹“Ú­Çsoġ-Äö“ù$Ĉ8ġၠ‚IoĦ†|g)M.pËÛ1…ܐwL”,rU)¨á1§–×Êj‚&İ ‡ÈAÂ$-yŻKY#-†•Íż Ħ‡èZôqŽĜÁ"ñˆ [Ç5ŝK]Ú^÷Ŭ 1ŽíwŝކQ¤;FjÁ—™|(ɇwò.‘À0ĴNÇí˙Ħü tüƒĉ+áWħ>ۛÏffšŒ\?hµó… ³ħ û#쀰#ì?HjĜÄ8M8,CàŒÀİÜú€h•˘ŝħÚ-iendstream endobj 54 0 obj << /Filter /FlateDecode /Length 586 >> stream xœ]”=nÛ@D{‚7ŭ~l@ĜĈn\$’\€"—† S-ı}fFvŠŸ€ħ%à½WìŝéċùeıÜşŭí:ŝj·n,ÓÖŜŻÛĜşs{½,ğħ›.ísés|ÖŬŝéÛ°ŝŝ³ĥ_hó}ŜÚŝ§§ŝr¸˙fĵNí}Ĉĥ Ëk۝úžĉıîÚ2ŭ÷Żìïż8ϟ_=Ğïñ‰Y޳pZĠaçCĠa>p>Vĉ#çXu˜#çTu˜gĞ:ÌĈ9W&@OÄĵÇ'ĉĦê0œ,‚,„,,‚,„,,‚,„,^u˜ÎU‡œYu˜É ü"…B…r:Ì3'lŠŒ  lŠŒ  ĵ&f#³×Äld6š˜Ì"•‘Ê@d˘2R˘šÂˆLTF*‘‰ÊHe 2Qİ D&*›:;›:;;x]ÌNf  Ò éˆê ë ëˆê ë ëÀw)8]%%€.H'¤ƒÈEċ¤r ¸0œNĦVÁV„F#€ÂbBAŒB#ˆ¨*, QİQCaƒaQCaƒac¨:́ĝ!… B q¨s°sÀ&d4 4uvȅƒ‚‰ĈİÎÉΠהoÒ7ášòMú&\SI߄kÊ7é›pMù&})ߤoÂ5ċ›ôM¸Ĥ|“ הoÒ7ášòMú&\SI߄\JŸ|; >#|žŸnüĜĥĥÜôhéQâctYÚżwm½üU‡Ûŭ‚Ê4Ëendstream endobj 55 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6238 >> stream xœYXSgÛ>1ä丑x¤=Ħu|ÖUg]­ŠàÀ.öN€„°7 ĵaÈŜ{ƒ ԊƒZwêŽZеµZGmĠökŸ˙ò]×˙&AÛ~½>’+×uòžĵyîçïç  ÌzQÀ|…½½,P6süj/˙ö`Ŭw£xk˙^/ŝ}a2÷½ĥĦ~BÔÏìĝ{6ç-x›A3–›SB`½gÀB™<<ĜÇË[a3yâÄ)Ǔϙ6á6 &ĜĜmwó“İBü|lĥşÛĜM°Ÿ`³RĤ"_úĜŒ–Ú¸zxo÷÷´‘yÚĴġĜ`´fÑê56KV;89ùhŸvĠsIQÔâù dò EÁ‹CK•ËBUۗ‡ıw³p_éáàéèċ½ÚgïZ?'˙€ġÍs·yü„­OŒœ49zÊÔiŸL˙pĉ³?ŭl4E}H9P)GjµšE­ĦŝE­œ¨¨uÔj=µZ@£6R İñÔ&ʖš@9S‹¨İĊÔDj 5‰ZJ-£ĤPvÔTj95ZA}BÙS+İTêêSŞ?5‡@ ¤ĉQĉÔ Ê…² $Ôj0ĊRC¨Ħ”%%¤†Qf”ˆzzŸâ¨ŜÔ’ òE<…‘‚Î^³z5 dz̈́fµ˘~˘ZHÛÓ{ĊĥâóŒ=£íŭiouŸé}²ûÎè[ŬÏş_Qż˙ëïÜ˙Ԁá^ô6—˜+To!´H·x)™*ı;8rցMg/ ™8dĠ!û†üghìk–Ž–×­ü­î svĠz‚uŒġë÷Ŝ÷}˙gέçZ u_…4O5üH• ÷òI-lkŠäÂi܇/KjŠÏġAVñ´ŠOLòÇ}şË,é(9òó­C%RĊġ¨U‰ĵ•OE0/òV"_żzTüfTŠçÁZ˘ë@Ü 2÷1j:]‘çĴNbô‹C—ĈAcñT ŽÚĦ’|!ـEq[AE˙²éL—ÍœäJCZİ+7—Ž–‘µu³Â][W ]Ô@vB~)Ŭ óiIÏ·ötv…8r8ÄOHîkŬ7FŸÔ°²\4µ Ó/ Ÿ²èŒç•Iµ·êšÎ NFğòr8”Ž2ĴT"­ëVŻ –(€>ómé8ĜÇzɗŒáŝ`-ı}Żbż´·ħΞЧsĜä`MKÌî5ĜnĠ­żC—4‚/´Pò>àςùĝ_°‹ĈĈĉĜüÙ0³gÏÁœ›ŸÍNrX°`G/žżrġ‚ŭdŽL€ƒ50Ngz§&'°äctġö›ılôĉ$Ï÷Ĉd¸îŠ˙8ş9`_ĝ!Āù3°Î2Ùné[÷ğ'¸ĞbÉà3g:Ï]9³dŞÉê5‚v-”‘#ìĞÙVɜ3”.GĠžžHċÏù5ıWG ĤGޏ˙Ñ@_˙ü`Q‘ğ;›¤e]Ô¨ƒÊL^ÂŬôÙì…Ë/?ĝñšĉĉ­Ž9œ!Y2 lÔÔBÛ]Oû|ÚAö‰Ĝ°”"Œ[„ AbÖֆŞËıg=caĥ€´ä$8ÑaHa-nMÌġáş{ÓÙĜ­ 4^ñRZÒĞ57g·Ô¨0†,=‘äĥ<öŒĠ+BœœıfħäŠ~2lfüù7¸kĥ RÊôGÔEHŠ…—–Ĝĵĵô=P\†gCR!bŞ+KzÖq×½/´0„œTÈÇq웽šÓ‘rR^ş˜µt+ŭŒW0É8ŭp‡!ô߆aÚa=/k@ŞQh,k O£ÑV°`Q§sHħ[mpÖĝâíğ–ċ£6ĤáÇ3|”j.]Vr#ħÑM"Ġˆ%w‹Q½ŸbGlR çQ EŒ/Œš([·?¤ Qş;´aÇŻ‘u;ïÄ Œ ÷Ĝ•n•gT\RĊÎ|bHîT҉â($o).ÊnÈáŽyŸF‚³jïë)”3¨²€ħZ¤½EÂ˙œw–Ŭ„â"Uİ~i\޳›Ò1óQWÂ`Šĝ-¤ñ”ğz,r’úufÏëCĤƒŝ}Eżî}íû+gµœ !îkÁÄ=£‡ Cxeçȕ #ƒzf¨Á°;lxwô-;Öt+CL¸r€ñBîXbœİgÔp\ÔÒŻj‘ú›PâmZƒwh“–tNŸë356sP%ŝë™ôĝKA·÷ìÏjêà$ó2+P™ġ-ä•(ɉ׵*Sĵ(ĵvĈRş•˜2ıî0”.™İ$”k5ĵ\ȧêöÉá>Ĉ[ëèX34˘:“İû˜T ½ƒÏjT‰ĴÊQ-*Ĝ ½àËFş¸Át…>NÈgñÙ]Tp ÇèÍĝ (ŜYy*ħ)êäÎOä…vFEŠóŒqṲ̀Ñá è˜Éúŭ )ŞA ÒÓĝûl*‚=Ğ”‘WzĥúşB]Dä*CVjżKYês•Ħ*”Ŭ~·l¨A­o6NóXcqTKÂ8Tâ—´êöв8í5ĥÙ< Í Ĵ Ż)iŜu”kÈ(CıˆısÄwÏNĊ–.è#F7÷Šŭó‚[h_I”OMjµÖŻB$”b‘…şİIk„×´ÓÚѵuçËŬ`6fñÁY!ŸH’¨@ž ‡a ĴµU˘V]¤¤“tĦöġkByRĵçŠ ·R\l¨”HéHc*ğ•&‚÷Š~{O( ĤŜɢ¸ÀžñÛo‘ЧHŸS7n4“@#DûM*¤ï›€×J—NXüDTSÓ³½7#şjÙOƒÀ}ñ$‘›I•ô5Ì£@Ò;À܌((äŬħ¸¨^^…ÑDXò×"éF´Ê@ŠÜ?h İBŝğbÈQÙDŽgkφ„q‹q ŻüÂ\<Óx´½ŬJ/ߏ~£0X)ÓĞ4‚­€ĵe(‚4Av³+şx§4+•DmÂc,eÓâ|v¨ž“U'‚*Î&‡\,&5³+½0+;3$Ĥáş_G’D…$äĤ_7ĝÂûĝ7Kujf "ŠÙQJ·À¸àÔìrËÔ=Áyሑ…‡ÉŬš·¸ÚuŝûF)|ÄŻ*E (+Ŭ*'½(U1o½Ë5-ĝ?òž `+£r•1ÑH™À%EEl_„˜O_ypĵù\Z”†2İê4uB†O}| bê+*êoŽD.xŝJl=ĝy4 „áÍż|ùìg_0g,…0óJq“'ş’]E{7àˆ—ZĈ¸Ċ¸&û“0$7Ĉ7ǵځ³e|cBbV\ƒš¤ŬJq@HNŜ3 ™Ì)ċ½ÔâĴÜÀÜÀËĜŬ236'¨ 5ĦœşÌ‚ àd‰PġĴFŬíE˙éÇoĦnÑİ…8­İĝ'ĵì {ÎhE ċĠ5b“f/BàäאwKÈğ÷€ŒÄ‰€,dġr‡VĦéğUÏ8LWTĦv`ì~Â,0n$Ħ óßF`vĝQt.Œ`q]~ïÂ/ÑUt`sö<„4<ÒNiĦ”T›7œfá`hĥÇöĦr܁VÊÁVTĠAn~.‹– ĊħëâC”Ó4¤¨Š;{}ƒÎ˘ èzÁá_£Û¨9ĥ)3²Eo;èG¤ĠŽĴ°Œ?Ο‰˘ĉÌÚö1·qĴх<Ç]£LÔ´Ñ(M£  zŬ9î}„qNŬÄeÈ+#+S^WôŠĥHÒ³]YIÁÏaÛ>Á}9ĴüoÎ,¤ĥÄ}@ßkO[ïşd7’^ÑÏ,Yݧ°‹0ëÜʋG/Âş‹­ŭy{Âûü.~0[Żl^§ĜšèÉÉÊ|ò½3~ŝ‚)ž…~e!҄Èĝ „ĥWÊÒS—lOħCQ̔ß@œŭ†(³%'Q J̈D;QœŽ¤ Q!ÊDYıġQÍ Íˆy޽ñCKBCD´Ş 8½H½+¨2ħˆ¸ċò²)ĥÖiÛĥ ĥutuut?Ŝħ͉ûóĴÛ˘m£>Zp £­ċÀñLî,-šÑĴ3o¤Á‘ëïğMXŝ7Ħü‡vói6ġŜ‚xËZm1 á3üğ[†H |Ó¸äTݍ`ôyçE´+Ħ†‹i ĴŜ™ÁHŝ}˘µéĝŸó-îÍá%˙›ğtżI× š´Ĉ Fò¤Š°ë0´ù–ù1’?üÊ#÷XŸŻż!ĊÓáğĠŬa·ÜŻ÷;nyKmÚWàŭj.Ùċ9~[+üŭÄ&^Èt1½ĈÈtì d"ĊW² Šj™LĦÉŞ ĠĠ ܛʳ8qv]Ŭvu¨DÎûlµ$ì÷ßçŝıKWNhւҘÌ-ù^{Ñ!ĤóóÏ/ƒ¸xBp&—PšFäCßsÀħċP&Ä$qNû3‚ ß ĉ~:ÍİÑ3/Vz`kSÒ͈ĵ”+‘¤Miĵ¨*ßà3lŭĥ5ó]ŬrKäÜĉ†ÒÊÓJÒ*ĵ{Ìê;ŞÜÂĤl&î81Ìġġ(3_Ğ‹ÉÑ'›ŸÜ{5„ċ/veùœàOL21¤{4"‘GWO ñlÑ(Eİ#ÓÓÔ(‡‘0ûÒ|sc­%ĉÊàH?İ$mÎ ´FĥCŸËœd„šú·3PqéŜB~‡IG8Ô *sŞÒƒş•L`hkÒc?èŬŝÏÀSÄVEˆ>³ÇĵùÓx$Ĵ‚`&ÚcbŜ&3ßJqx¸~1ld™‘ÄŽv+M(m˘qyç›ôí2£E~:MmDERè÷Ö·`Äi×µEÎXİS}aiìrñ#zĊġëÖ­8ñ+MÖ;w=ñ ‡_|ĝ# âàİá?5;~='ĊCŜ¨èŸÒ¨ÄCLĵks4ÇÏ­{•têyD‰ˆµŒW!0›ïŒ6şrİ™aGœ|I)ŜmÜİBáֆIĞ)îż}ZöÈĝ( lĊ’ÎûŽìŻ(Œĥçp„8!°§ş½sÓ?ܢÛgA(B#(àS„|îù6y QCoÇגÖ&oKÙd•F§žß ë’ âËT(žĵÈgxrÜì”şxt˙t“ÔBĜY[\7ğıy÷PɃ<]-Íĵĥ& $ Û¨óïÑóښIŠÎ½FÑ˘}}¤˙Y&öÍIĜ́~LO3}BA 8h!ĵ¨cO{v¸¸ĝzÖËÛ²³Ġêtn‡2ÜcCDBJx2R2QĊáċ-żž3“IéÀWöġ²f²3Ħĉ1˙ħĈcLíŜĥPySpŠŸh0Bíž(–—è8äéц ¤p‰ÎoGmzìĥ' l›½Ÿ§ÜßϳYŜÒVßܢ,8ĉĤ€÷Ĉ˘œ…¤L%8͏#ÍëluXqxHBXüŭŸ‰‘( %Y)Ê£ÊjrËò³8ĝúġ‚œ¤FÙVo}é´[Iċ:ßĥr$ ĊfX4 #Ž`ċ+<Ì@ô†7?ŸĊ#íqïÏ>³‡>0F^ŝéúġËcŬ^5Ş{ĝÀg#Û,S'rxX:ڋê˜*Fċ¨sMÓİt•ëŻk‰ÍšÎĝ0†uİGV4mİZ–‚˜pr˙†´¨Tä…äú@…ĦM§Öĝ!瞠#<4•‰5PqYíôşcÒÓM¨³')5èX3yġêfƒŠÀN Ĵ×Xz²ü z}´[H|y,dÑ=ûS.•7NdE|{îWX„.Û´$ *ĵĥĥ²˘.7%G6×ZŻAğsġ°§Ğ,ĈĠ=Xžĉ’➪Òe@W:œD{ŝġ˘ +V;N š›yÔ[šžħ+§çY!uFf­Ş2(Dċ3ċéjCüĝ̐™_5ü{$×gIç {R.÷9^Ñğs½ı@:%§Ċ„b%ĉ-bP* e3£Û9Pp0İÜFûéĞĥ§•³meħ ~Tdv ‘ŞI‹ï´HB0ƒ­ĠìĞOŸŜ;”Û8Xq&J+tNÂCŠ Ċ’/U(hOYVV^×´÷pQ'bîZ´|ÎbǙnëK:”Rµ:;Ož^ ?mŞ"(Lë1ëž-ˆ`‹G ìÉCW×a‚ĈâĜ}ˆğïDĥ°–'D“a³µÂĵ\ıb°zĝí#Ò%ע’È䤔8Bì’VEİ˘ħ˘ĵéˆß™‘ĜšĵbgÂyżq’ xñ-ô'½ÊÌċĞŽġùܗ_żŭÍ ğ…şšÎ ċğùk;ġMC|ñm:İ$‚4Ĝ:Ż&Ŭҕ*ë9Ȥ—9ÏóžµHÄ}f&yµíUï.á2A XüÛËò²ŒtTĴSx Ÿ“š˙t÷'!ÈùkìžÀˆhŻç ğ¤çĈV#Ğ TP a`5xŝÓ¸>Dv0áúWHB¤…òûşAÂEâ0usœŽûaÑI`vĝdáÁN.K><™4LjUqfVf*e$QĠĠrUXÀĉG Á’&k=7ŭğjġ†9³×kßżòĊġKğ×+ċr”iÄê– …İ7მ0U%à£a£ŽŻc8{ş>Ĥ ÛP{›Š“zÑE+k_p~²òE;ŭÒâ˘poËħûíÂ7\_(=GGàD[éOäáَò{èh<@ZQĠ’Y·7“+ĝYôÓ_żşaP<–°ş Ĉê·£Œo4Ë5àù=üYóÊâôċß4ż^*ı|’÷„ù,:çŝ[Ö1à"nOŜQäšĵ#1‘”ŽmdeáîìCÜCóıv}Ëà‹ä‘œ§SQˢ9hSódĝ€0´Rìµk[Yԉ]Yı¨Œİ ­ŽôOÜĥÈT°ˆ%÷G"yk Ş/&³ĵ,z }Ç@b×ä;ï&ò°·ċġB>í6g%O˘ÍÇ0à)½rfŒâ‹ jI”ŝUB³cöœĵ}ğ—\ĉRäq,•K ‘D%D%>ÔI~Ġó.é°~#”ÏTġèö#UÄäĈg=°ÄvÒĵì˘TiUĞ,Œ"€‰#>÷vMŒKB*+¤*JÈÙħŸevJn"‚TQ\­7koŜ)h× ùH~Ûîs0Ïéhw’ǽ$ÀÓù{u)kÖĉ…â8ÌÓq^$éûtNŝ9]´µĉê|ĴcQIü„llùÀ8ôşUİİ:ĵ˙VçÏ›³³kĉ3yÉrĊôUS×pëfDLFĥhiѸŻĈu.ĵP‹˜ú]yÒqùüÂ|ĝĴ(CMkúhûr}ÌÖÊúġn/É#(=S]šžÓŻ_[uzFVfz‰:· 4ŭúSÔ˙òĠ+endstream endobj 56 0 obj << /Filter /FlateDecode /Length 278 >> stream xœ]‘1n0 EwŸB7°ìÄf\’%C‹˘í‰ œŽ§<­ŝ(sĝ’Ġ)Ç"·ù^‚¸³\Ĥ\5­‹SXŸf5\ÇŞoòŭ³ˆCƒ¤‡żWİ?ğ}ioÂċĥŒAʘ/R ŜóW’ż_­ĵ8§gkğa{Ôjè6ĵG…ĥl@[U4öÖÜ[ó– èVµcÚİöl@{UbJŞ;6 ;Ġ=½j`T#¨*l@E5ħĊÌaxĊ{T(Ⓧ@:!/YfÒ̄ĵd™I3ò’e&ÍLHD– U·ùZ›.V/ô:ˆ ÷R$ŻvF;“žgÊòwée^ô•Ġ/áSAendstream endobj 57 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2491 >> stream xœ­VkP[e>rzJħZ0ĞA='UKğ­Ċ—ÚvÔ^mµ ´l‹P „[!BBî+&$!…\¸…[(”ĥdµ€R´X]IğÖÚŬ™ĠŞĞŬQÇuF÷;éÎìĦtkÜħ˙6™Iĉ|çÌwžçyŸç}?…q8œ{^Ù½[T&úŬşµ;%9NJòĉגè8ôƒQôCÑÀTÓ§˙ͅ¸hˆ‹™xp ŠG° ċŜ^ı‹ĉp ËĥˆÊċ⢂B‰à‰uëž\ğ–ŭŬ(ȕ 6' vċ䕈d•%E‚œ²£‚]Éğ“{D2vħH°JT&ÈÍ/Ì9&ˆ„‚´ü Azêĥŭİ‚û÷ĤïKŭmò˙ úï%†a÷–‰ÊĊ’*iN<ïh° °èXé#ĥۇ`İX:v;ˆmĈĥ`‡°­Ĝ6l;ĥ{ ۉíÂvc{°ŒÇ²f˙†ħ8–(CòĈŠù q>šîĜd~F<‹żıSKŭIJĥĦŜç™ïoÍ<*‹HÉd–U9 İ+ŞKÔ f’Ġp’Žn÷[>§ElŞĞgIQÌÒ*n)ƒbQÜZƒ{ŭ ”ƒ†ÊÂß@-ġƒùSÀGĜh5PÛY\‹žaˆ½Ù†9â~‚–œñdeÍòJéxĥÊŻ˘é+è ŜÜÖàfù~HI'5Żû³€X#f’Ì êşğÔñ‘–Pˆf‘êÍ*j7ĞXuë"Ôġ#Ĵ÷Àd_hptÜp²³ÊhÒêALTv(ğڃ‰[şÎ͢=2:z1šÖŬ2AıV'™Ù9Ù@¨¤Ž€Ĵ6/ġjá^_ )bInƒ(Ñĉ+4ò;Ty™Ħ\WO ™ĠÜäŸUıŠżÄ q3Neż‡˘.Ħˆb>a;QZb$M2ĠŜj Ôu­…7~€zl^ö6~ŻÌİD†zòó˘QRÀĴxĝEz˙À€sì ZLı†À nbZÈKÎexÒyµ6wЍl;ß` ×d3jµĉZ£‚Ê_L‡W‰ S3CCî×ÈYŻdĈ ×ïéġ¸ĤÁAüeGĞŬŬ‘xV8’ñĜA&tL—³İŬNv<âmÂÓdPèê ĠTBżp•ü`fâSïı‚ž{]E(D°^ğ­ĥTOšĞUİ2 d Ŭ§•ŭRï#ÏM…ùJ·BĤUêêȒĊ6VF[ÎĴf¨5“)ÌüñLs3e×vç}ÊéîzĤÁI0w´ċMˆËypIĜjÑïiÚT$TW“§Ñ³ğĠŝĵȈ˘Ïà˜Oô%  ĊlÊ%6›\ô(˘Èù àO0QÛ3To"î(ĉâÉü}7³Y=ûŬ,,hġĠÜ} gé]Ŝ7tb¤Œb•™ĴŜ\ĈÄ0<üŒú3ƒÇG?£šû\Aè$ÎċöçĴy•Y&i€FwНôNúGĜ¸¸m55µuúZ1%\İ> YÄJfĈƒ]V)]ı}ŭvP‚Öaôúĵ@$ÌöV{Ğt9u{RĈžG‹?E ŸwE”ĉĦ0*fÚw™×VŬĦĴ1ë̤L^,b˘Ĝêl€!η?\ko3Ğ]”ÁTЇJ˘ĵSġžxóé- ‰g`¨_Ŝà1òTŜ À0LZĈ=­ö‹lˆ_¨?”_µZDgE÷¸ŞüV1Ĉñ|fí‚%ĝ˙K$Î"ĥY!2Œ á; °ĜîcħtPAü"ĵ{|´í/CMÀGĵ“ÚÌ,cÙ'0+R:sŭdèĠŒŝ’ûFäâm}Xû4YŠ_ŭó3@ u+*¨C³hÙ,'ô%úĉËhzŽ>Ċ+ n|T³°Ž4Û}5)ÄK¸Ş‚ċîgıżïgʘEċĞ_ &‹ŜjsXÁK T6+ʤeY˘÷/ŸÚßLĥži9CO÷†ğûo÷8{ é”Ííè³·Âĉo0›Í&ö†¤]ÑŬ׺e]ôì|#Ÿ Û)ŝI?½‰‡˘éԈdÊUjı™,ËmŞd“ıˆá2†\y~߇ÁwÏ%b¸fmÉs ĝJ¨…ĠÒhid‹Ñİì—Kގ½üŒ£¤wr“.ôoùÓ w ™°*[šDœklkhMÍ£"\>7°Xì“]Sm"UÊKĜÉ­wş[Àê ï}ñÎ%~˜9ĵ;=WĴV°Á~î^ áLü ˆœäŽî^9ŠVE{İ£Ş23‹ı[[L%ĜJ“ş:ñP°ġŻO£ßtŜNÏċ/â‘&ìgÑ}Lk~>whͤb_^I);rTMMžN5ĝמó­c,–6ŝԑé+ö3‹‹ç“ŬkoöÚɞĈÛ:hwĠ*tf]CµÉ5iê /|óû;H&²é'y}lšËĞĒjOUÀçoXCëY'—²6ĵClÒŞÍ¤Q*Ûv„=ŝj²ƒĊĉĦNŠ”„ı÷çf÷%.¸ñ˘Y z0ò·]*Ÿúŝö™ĈĜݞ>œaÛxKa5YŒìj uLw]€ "œÈÉV•‘Ĥĥê3i2…ş·şÑU`’ĠĠä1ëï€z]yĠÎ2!êGÀâ˜ö=_ŸCU׀èĥÉĞŠ%ϛĠ”dûü3ú;=£É*^K)2ë% 'žl}öîĉyĵ>)zĉ"JşˆÖË8ŸÒöhú:Ä.-™†O£$î[¸k†Ù…J„ŸüÁá ĞGğŞMViéÌä>wċn<ƒk‹ °p\Ô9<IâĤáÚ› -T?““AKTµiÚ{šÚ]6rñıßŭúòßpvÖ³Ç/´“7żÑʛà–Ö´;íh“ĞтÏĈ†—ħ1i˘¸Ċ!Żeŝc³´8íqqç,6ğ•½l´´5ĊŬ…a˙8cî6endstream endobj 58 0 obj << /Filter /FlateDecode /Length 162 >> stream xœ]O1ƒ0 Üó ˙ İjÄB†VUÛÇAp˘†ŝ$@‡w’}wòYvŭµg—@>˘Ç%°ŽM¤Ù/ ‹Ş0íSaœt²ğéŝ‚Ġ@v›ïz"ù<]ÊĤÚ2è ÍA#EÍ#‰FİĥħĥÄĉOÚƒŬġı-Pjċì?”ÍŽ“€KŒÄİ-ErÇôû%ĝS°B|ġûSendstream endobj 59 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 317 >> stream xœcd`ab`ddñġÍÏË74ġ,IÌÉL‰İüfü!ôC–ığûGĝO&Önĉn–½ßW }OüË˙=J€…‘1<-ŻÖ9ż ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$ĉ(xéùê)ĝċ—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5ġ–ĉ—¤gĉç¤ê•2000Ş30v1012²¸|_÷cá÷eßw•3ŝ˙qEt"ûÂêırmlٝ%-ÙYż%:;ş8j&×,YÙżcÎDı9fœ{ orߔž)| Ó~xNĝn;½Ż‡í×n9.–|γz@ żgÚä <<‡{ú'ôı}=s&ñ20> wùendstream endobj 60 0 obj << /Filter /FlateDecode /Length 348 >> stream xœ]’AnÂ@ E÷9En&6HÈĜ°hUµ½@˜LP$Q‹Ŝßè˘‹?Ò öè™qu8OCż”ĠÇ<ĤŻĵ”]?´s÷9ċòœ/ŭPĴÖeÛ§ċI<Óµ™ŠêÖLß?S.Qğż7×\}Jà—Ġ£'mMMÊs3\rħÁö]gEÚ?mžçîYş^NàÖàÖqg pçĜl³1À Œ¸&òŞèWEôEöFï­áä '…5‹k/7Ĉ7@YN …ĊâĊ‚Baħ°8ŒŽµ1ÀÚQŒŠ£TGÌ*œW|^ŻYÜY’1ÀäˆY…óŠÏ+1@ü×{ĊpÊĠTĝ*ĠJgug…ŻÒYŬYáĞtVwVĝ*ĠJgug… RR]Rc€ ŸüġĥŝúFŻ­)Ó}žó°p׸KCŭ˙Öq'ï*‘âÔ!³#endstream endobj 61 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3000 >> stream xœW XWžœŒ€R™Ĉ˘Ö™T[ĞXĴ´µµ"Ğ˘µÈ#^ $áŭ€Pà&(„˜ @ä!PÑUKm1j·ĥĠڗnu·Ŭ½Ó½ö۝ ĴmżM/ùÎ͝{Îŭ˙sŝsÂìí0÷ÔêÀ@™TĥÈ=X›š!·ÍagĜgíĜ™|€2Ĝĉ_VNN|àdâYçy.°c Lt†ĞžÂĝ<Ŝ†˜$?YrĤ<.V˘y,\ĝŞğ;÷ùĤ(2Säğ@´2"*A–HˆEH£E+.­‘s‹q˘ı2İ(R,‰HŒÉbD!⍢ġëüƒ×‰‚×Z7oÁo˘31 £²dıB™úNZzDdfTV´8&(V·.qžû‚Ys1l-6 ÂŜĊÖa!Ĝz,s6`1_Ì –a›1l9€½‚­ÀŜÁ^ĊVbžX ĉ€MĈœ1>6q¨`öXà­ĉ1v‹í,üeüCö˜½Ĝŝ× ~Â÷ ĝ‚XÁM"€è8uâ?Žo9œŞœš4iÒ+“ &]€“˙kGzc€ƒÌĈċ ´·Ë3äĥSĜ™ ²İH˜ŠßŬtĝMŸÍQ*E›KtQ”ž â[@=} FÚ,è×·€Në“t$ôĈÉĉÛWö?˘K ˘"^@–äȸ­@GC·Ñô£d e\nY ÒÂEp˜Í†o ÁċuçüêÏŽœCÄċĠCvJÇs“¸CÌ Ž6ŬW(l8İ„ĝÙ[Wi7Ĝ+  z“z†Bgœĵòı>PJP·½¸ O =ep*NÚßĞóH Ħ˜çŜh°YLÂÉî÷÷9h2šr{>Ä!~û6œB-­. \ĉçxé›CC—. ­ö¤œä œÏÀÓcXj¸{¸²;ĴgMòĝÙo‰Ì’ĊRäTö†÷˙0ĵ=İ7ë ˙î÷¤—N]°Êß'ĉúqjX@>ŭá™cç.ž xzœÈŽEè÷í3ä\VĊâÂĉÌK^^*—Sf9ĵOUO!ž 8 \:Ĉ›²ó98‡ĵĞWïPšèÖÂz@4ÛA˜‹ ´c\>e` ó ™FA!0î·E™£+üµ5kŞÁ~˘ÉÔy÷VyBĤšÒ$4ƒ@ô“žŝH ­ñÊâíE%TdcPy!YsöÍ\úTÁ•í Œˆ'yFÎĤQĊġïk€y&í! wäYgucııš:˙ÄAäµçûn§èœî_²ŒŒĉ´=§ ÷IAAJJ^F‘ldil²x†ĝÀH4è)µrזy~†ëIluE-^$ȑŽeí(G˜%î"EÚßb†>yälxŽóK–œĞÄqċsĊûħ’‰ÁÉoûĉˆ½@[÷žÜĦÁ_’~q²G§oĤHoé.ÍyĵbXƒé\²nà|%\j6Ğĝ ×µqwà,u£a[)ŭébĥ͂Ŭ£ğĈŞOcq†×Ì*ùĴ†%´ŜŸB„-#>› ÏM0Ú҂ûŭQ!·à}Y+6˜f&PÛíá—-¸ÎǜԳĊ|ĥĈêÄ.r°rߊz&”á%Í9ƒŞŽœSĊġ1@ ŜÏÊÙ(­TU’M”á›a¸"|Œ#}]ŻëKM`ÚA°SĞ;Ù|C­Ġè 5Ŝ^o­Û´3§4#¨ì=żp5Úâ%î,2`ioìžN+ıâ‚ò* Š×WŽ ™[ž^ÉúT³Eğ_CŬju­ĤFŬ´€ĝü`L-Bäș&ó}†WŬûì¸ıŞ–,Ñ_20£e/ç ùA;!HÊè ‚Ĵ͔D—ċÍŠìê> í̐PÛ2ö#òŜ¨rŸ è˙džÜ/3ĵ‡ĞĤFêOtâ7*ÒıÂe·1.ı;'? ] ²(Ädz8LKÔ …teI3h‘›kÎÖÔwŠä%uE‘{èŞ³˘Y^U^] ˆñkÒġEtEi+÷0ĦŸ]Ë ĠĊ€’”Ċ™Yq)ʘ’*½kYGŞNˆäôÌ$š4Du„^ĵrÁHAw6¤´€ Í´šĠU ‘/ΟX`ü>1ážĴŞ´Ü\ , 2£òcħÈ˙Ż7Ntü ’m eğèò2u(H Ỳ0ë÷´\™ ĥ˘ċAˆz9ŬžŸ†³:n7T“wÜÛ9Ĝ•… ż"ƒ’ *ĵèêÀnP;­[2)ôž˜WCod…{=e‚ùtÉÉ… oZL3h¤àŻxgġîñ™vÚÊŻË!Ç&lÙuÄdNùsŬI“;äoĉAğ“ŭĤÖ6.Ád 5Ĥ È.’Á[ßö^ħ†ıù5|zĉÄĈêzäyèÄN^ƒµWmfİÊRUTú{aŞà |²Żpכ@t ĝ ‘³Û‹\ïsĵû<|Î˙°1(<\t~à< 9ïb’YV Á`KûŽ·§½Y-ë"l—·nLŜV˜"Ħ *ÄĈ€póññL¨‘RhrV˜·=Y6Hµ2mAžËPHÂĤż ħµäŜĜٛ7–ŠvRIjŸRéN‚œí€ĥĵR³‹nPuĉöâÎÈȍĵöízşİ†SM…˘1_“^o˘Q H¸!"<”"ĞħMáŭ§Nê?>xp[(ŭo…‘~/RäŠü9Ëöġî?pRM€ß„öà-~ñѸ÷óŒ{pċïHŽâOĉ½˙oÚS1ë˜xN‚ ĈÀHĈċKËe‹Ñfİ"‰Ĝĉ;Â}I °P ¸&Ÿż£46WŽ ÊÂ=”Ê”½'­ž —{né>qvúWK# - Ú8_†ûŠ4œaÖšóf]¤ ƒui´í‘›ó9ÁÊĦÒ`Ôeܚ9Ċ˜ÁÍQY I‹Ä˜ĜYÄAŭqËG‡iôüğpkD+Ôr9ŒßêŜ:^6.AÌJ ĥ˜ ŝ1֊ç> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 63 /ID [<958aa105b90b20f59f60efa534522681>] >> stream xœcb&F~ñ‰ Èc6ĽיĜϽ%ĵH0z Žn ÁôHN‰}qCA„$Hì=`ž$$w€d€—(ˆġ ¤dˆµH1|â endstream endobj startxref 34269 %%EOF RProtoBuf/inst/doc/RProtoBuf-paper.pdf.asis0000644000176200001440000000026315130725227020303 0ustar liggesusers%\VignetteIndexEntry{RProtoBuf-paper} %\VignetteKeywords{RProtoBuf, Protocol Buffers, package} %\VignettePackage{RProtoBuf} %\VignetteEncoding{UTF-8} %\VignetteEngine{Rcpp::asis} RProtoBuf/inst/doc/RProtoBuf-intro.pdf0000644000176200001440000056143515130744443017407 0ustar liggesusers%PDF-1.5 %ż÷˘ŝ 1 0 obj << /Type /ObjStm /Length 4562 /Filter /FlateDecode /N 87 /First 736 >> stream xœí\YwÛÈħ~żż˘ß29sŒŜğœÜ9Dz%–=ĥĵŒ?$$1Ĥ™=v~ŭŭŞQ Á’İÜÜe8öêêĥ†P ­ á„ĠVx<6Q/"ÛBäB›<ŠBè ĵJèèn ]ü1Âh‡s+Œ)ŒNç&耗@× ‰(l@$.=‡ zI ï\ŒÂŜˆrħ"êçNDŸkaÀOA׃È-ˆ˜(rWDar‘‡L€Ñ< 1% bV£`ÒQDtĈZQhԂU˘–úb@΂IesŒ:Ĵ<°è² y.{­r§uH…8ÖÚ£=‡.Œ„pè›ñhžÁäè·eSDĵÊV)'([Sà ([Ŝ(ÛD<(;ƒë”]ZxĢ(„eŻ14Üà+ ½ô ìŜġ‘0”½§[ ì# #MBsš˜: @ċ óBPĈh(‹ż!äx†ĤÌ8ċÑİʁúN³Á‘ˆ$VĘEPŽiĤ#†%‚r,0 8Ö9I@ t€.GPÎ1dĵáD"ɅEï0 8Àğ˜q;t C­óf9fB€ƒπ2ĉÚ@p !aSÒ:ˆñ?ŝüg!Ÿ—uoĞ{=WâLÈ_ŻËñŭ~=ĴĈâï$¨éâ£a->âŜĴ ÇċT`ĥÒġ—½‹òy5(…|;-çwÓċ)”&=óĉû5î?@£êBüòKjöŝĴĴ&â§?âΤìQs{u)~zĝ'£LP˙)…Ŭ=ŝ ÔÚçèÓŜ›ò½ĝ}X_ŠKžLÊsÜ~V~˙½š Ĥ‰&xÚGîċ¤Ìú%è=~y*_VÓzڟ ŻksĤ|ĤÌëÙ§”ŭ:‘|3ĴG%qT³qM²/Ÿ Ñê|Ĵ c´kN0ËÍ>Wĵ×ĵ7ĵ·ĵwĵç÷0kÍ>ò>O{"ïÛ󆉊÷ }k›ë •ĉĉĉ:‰S³ĵĵÏyÏÏĊ{ĉ›ğÁgM'ĴÎp_³Òv‘‡ hYlûĜJF#,­\ŒÇUM£éZ*íŜó>ž"ò@@hmx M;–Ró@jHÍİy uÛ ĉZ3?šùùH‚0Ë1˜v<İÁ°wR}C7ˆZÀ8E úGêë¤$İiž;+§ĠlÒGïİë@‡€‚5kRġ_—5HȗaĴÊo¤‚żüÒĥµQó Ŝn`ÎŝsùV?~]“JyŸĜe1ş·žÜ‘x ]žâ`#,˙,ŝ,ŭ–µÒ²VZÖJË"nYÄ-£-XA Ë{Ç{ւéLŻ`zECÏ)Ċ{½a>ŭqĈÎ)Ó<§ìÍh8Wa™)÷#S6iC<Ÿ]m·Ñ†›Í101.1,1*1(1&1$1"-w/?N÷˘ïtïVÔáİ8OħËSŝCyj‡˙"ĴOĞ2”·q@J—² FoGzYiìa€s`O‚Ïf*6Óbĥ› ÍÓÜCò£%X vƒcÚEóNı(`ğƒZQ*ĠôÀĞúE <ĵeWP’²zh4Eï†Òt:ĤÈ=wt=OïxĜV–-ċAÏÂĉû@‰R‰6‘’Ésُ˘Ú| à(S´t›°x\(!şž$T8.ĵXB†wò7ùĝ›ö‡z8”³Ñ¨L0ħ„ƒ ˆ1Y€ÄĠ*HŒöÄxvġİœL‡d‹0*Ïëĉ¨(Ĉ‘/òËĴŞËÁ§Qz =ižIg‹ëÍĊ] 3vżš”ğdž-ĝ9OwÓäàŻ PÇ£mhŠ@pE÷ ƒ—µ†@Ϟž8ŭ­ |gċĊĴ‹@ó”êv—ˆŬĉ¸Dq)57Û?ŝ3T?€B4ÍŞkdşÂž­}ĦˆD.ĥÒRO6;GÍĠu–ܘ.ócĵM[B,ʞ£_›œştż}O5´ÜphÂħFüßëG½ûQİ É=²í÷‹Ìz£"Ŝ!0—Ü/ë0v5lĝXÚtD˜{XÓùXƒĜ¤ğŜżŠ³ TÛ/‡˘Œŭ>żÊnĞœĵğ˙ĠŞ;Gv‘­MÌìB6ŽŬF`'²ħ3v‡ÁŜĉ°äfžĠòğ›Âĵ.Uúċ#Ĝv ïÔÖà.U|ïÖ´;Ĝƒ´û)œV³IĞûënˆ f¸3–ùrŸNïfċƒšîĤJl°+ÊÇ9˜nP³C î8°yôĝġËw~>}ŝĵW§µVĞ™(Ċĝŝx:\\X¨Ħ ëzè×ôïÔCÎDmñ0ııĴĤ³îµĠ+t´¸ĥ8[ĦVžR+t×ßèÒ[nEíĵğ™ĊŭUŭşîżħĞ:ÑĜğV#’£$@2BKé€dáZÛÖhĊ5˘Z(ŠMJŞ0[Ŭm+ĉÖ,ÉıjnRšÄ`WÊ;…–FÊ·‰ÚN GàĈN²Ço†<ĥ£™r‘Ż…|{ö´}¤K?]ÖġġŸ¤ 'Ÿ³r0(GŸfeÀ#ƒwǔŸ<İ&N~Ş”"M'Z$kúŒSî³OÉMo³˜:c‘Ĝjƒ=eĜò"£TíǎœǟçQûF,OÁóĊ°œ}"FċĦÇp|>éA9‡Ó›ó­­Ëh‰@˸1!óÈ;güj6™ôOëês9ú~sUİFË·5*óÑŜŒïÍ êö–Ĥĥ÷ŝ&ĵÎrŠä½Š™wV‰1BêuYPYÈı7™ĠžJY 4X4i[áş—%¸*ÁE IpIÂĥf×.³àGCû,?ÌĊ@ËĠ@Ëċ@Ëġ@Û.÷àŠ ċ’ ċš ċúmLËf–ëV–KV6o ŬLó÷–Ófĥ]žÂnÍnÍnÍn]´Ïqƒ ܚ ܚ ܆ ܆ ܆kцІ żFñêĊĊ&ĊĠ&Ċċ&Ċôx}Šá*†W¨^šbÚµ)ĵVÇè†ŜR]%üB‰dMIí0AA™%ù6…Éb‘oôBg›h ×´šĴp°ißçˆ*¸3­uV.îâ ÏïI2A‹ $ŽÊYÜyÈrZí³ƒ³PČ2KĈٌ:F•g^‡;ĉÌ—vs–ûŒV•ÀgA‘]Y<*žn`ÌÚ"+ìn1 ÑgŠ–I`’…r ùï–3ˆöp`§esôĴÁd†à7w͙Ž:SKğ8sEFGV½Hœ*pêî˜3H÷{äßĈŒJï*ÓàòŒ úˆŒċë˜˘ËœÛ3™bŒ ù·ž !£âŝaœÍ£Ş_?<}òö1ğşpt)—‚pµ›ÓhóÊ;rn5[ğ7–ZZğ3–şùosŒ³-ĉ:Ĉv|Їµ´+ĉğ[Ö£A·'\-=딃^­„>PI¨NiÑŝç&ç¸1t¤Ïe=żŒy‰y8éÏÎGċ·=e¤w–ßú£ŜUJÎ,23´ÜşœĴ'WGċtzĞš ĠĤ¤ëàÓèRf[ÖÇ57Û:çJ8ÜYք[1âÀx8Á€xC!éŬË·ïÏÎ:ġĞĤ½S>~½ĴíÖSŻğ‹J„l†İĠR2yTİ$LX*ïŞMëC|ZhTğ~)¸nKĉzYÊZÀ#"7Ŭ1y[÷‚'i’–FĝäÊÓ Z ŽR‰Ĉ·ko\\WÙH•ĈŽÊĈ¤f›Ħä nÚj,ċjΗÒ3$¸5„òû–|˙J.ĉ-k2ŝÑ&&VäŻ³¸ħ‘ż­rphĈQï—ż<ÜÌjsµdĥ=ĵcü³ÇŒ‚ĥy‚¨;ú& î@âġ}qŜMËöĉbAšò|xûöĠó'; {[Z™ĞŒ-ÖUfuiâٝ“ßĦaż­3°fĴÌJêÒt%˙bÒûZfġT7ĜL"5JçùžŻr+yFR<•(Hugyl#Ġ['è@TuĊĦ^…çg/Ŝ<>[´t#µ~]&ÖVíİ`qĉfBq¨°ĴçÚ·½ğ)Ëéŝñ½ÀĊuQ´;ŭĤ•şĠ$ßĤfÔİóvtyÍKŬà,{ p^àt38ŸXY–aNµudx›dìì_aeM OŜĵ|ġ†›Í7@Û KA~=|Ù#f—@Ûĥ€IGíĤ:×WÄn~wùyµBi×~?½MÛaOíÚÖĊyÙ§H§KâÜxMĦ”‹BsÁŜP­Ö Ħ•@“ö{ı듸Ż:"ħ]ı=÷mrw¨¸Ûü`}C?„Ħu9BYŞm~ˆw*+è3ìè3K:£Ġŭ&Ï3œ·ÒŸôĈÙäŜġ¤˘ŻH³jrˆ¨˙ıwQŝçÙËIUW'³ó[ħtZ7™oŽ#şm€£ÌœY Ù^˘/8Žú(:ŸŸ¤ïÛJSñ‰ÉpíZĈÉ_Iü‹šĦ“\—?štrŽJÛjEVĞÌúÄ<Ïè{9ĞcVä´6µÈbq× 1£ucĜ›/áŽÓ.³ÀrccâĠÁ·ê¨Éê ĵQQoËïÏYS` ÷œ5Mo5ÁYĴċ‹­IËbÌ CµàM·üÀ)Ŭ â—^JOU³u,­Ïè0À­H˙ŒDŽ·èL/]ùoR| §h?|Ŝ§ž#ç5Ħ§Ùy6(żÊIy^NÊqż”ŭ)Ĵéµì]ï ŞŝTöG½éT^TlÏüz~T&ŞòĈìŜ`nj²ËújtsÄuÚdĈ#\WÉÊrú'8LĉìĦâ˙™]×ÜİŞ ˜0>£Żê˘BߏZ<áí²-fm*Ŝà‰iDE‹""ĤŒ• œ–Ûç;Bp„ŭ{xƒÄDŽsŜ0|Ş8jms”8Ğ3•ïáÍàr1-oŞ™Úcòf6À2-ĵÈ÷ÌİËmF+óZŜ\ŜâQ-Ĉ&ŜÈÒB”öÁ[Z*ÎĵÁÒBƒ;Ö iĉ ³‡·ŜŠ…ĵıHĊÎċí˙ŭÚö$ Ó.îĜá}" áï~˙w9Ö7^/6ıîgJŜÂş£ÉéŠ.£„1&óàTІ÷˙„ĜRfgGîĉáœ}€ôµ½€a'şœoğ ­´F„ƒD’²ß‹O R˘{ŝ‰Wóäâ+µ#µß4L<Ĵ4~4ò‹2èQY>­y§9ö4ìó üĉvŝ ˆÔ¸endstream endobj 89 0 obj << /Subtype /XML /Type /Metadata /Length 1658 >> stream GPL Ghostscript 10.05.0 2026-01-11T10:00:11-06:00 2026-01-11T10:00:11-06:00 2026-01-11T10:00:11-06:00 LaTeX with hyperref endstream endobj 90 0 obj << /Type /ObjStm /Length 3547 /Filter /FlateDecode /N 87 /First 798 >> stream xœĊ[ioÛFŝżb>nQd8÷ħèˆÓM7m;éħ‹"P$ÊÖĈ– INÛŭġûĵCR–ÄEÛÔ.‰ç=ĉ=É(™`Q1YÔLI˘a&bŸe^j Q²è™”Ĉ²˜ÔÛȤ’I!˜t^áQb·PL :.0Ÿ² SIa™²˜Q ǔ´Ç3-í L+IFĤ Í*Ó6àrìĠédݘŽži†ù$AbgeĈZÌ#3Ŝküñ ƒî.³ZŝÈĴ£{)Áœ:İ$sÚà˜3„Yiĉ] s(Ë\t [90#İ<ó*€d˜7šŠÌ'ş´`Ŝ[M‚İ ÂÑ!͂RtȰ ²,XM‡ÀcH  Á`BX`›ÄìQ:œ "£MÒ@†4 ÂÑtRJü%1b7 ‚!z ħVcŒ'AHş0$%)yY’UbĞ XVïĦ’(\:J µš´$ç0Nlഉ˞Žˆfi‰?*`Ld(CÒr‰Ż4³#6z’²#yD’Íİg‰‘ 6%;O|":H(:o˘E@d’´È€ù½$ÎrŸ8B³&ĥ%ùxCÔÓŻ·D3‰fMó' Lùê+Vĵ\ÜÍ×̳âĠlıZÓZìœoFX'ĞÑğ?oKVüx·žÍË{ŝ<]úu‰sŝĊluÎ/żŝ“YɃA`!·қß]_³ßXñCùǚV`:óíhYâžħ™|ĥ.ÙWÓr: ‘aÍàż7ĠÖéz;‡„ÁÇ‰ÎĠ_[]ġóZEĠ3, ”W…ğGY³Àl³*–F‰p-KÂÛeùyşzĞ“„ ÛXÑB4ŝ´[=Şö=öê8Ŭ˕ĝšzNġü¸¸ yÒÇ-פ†Z*î]Ĝ'e Ĵ„irÔêš [ 5C)íOÛÉ=EAíi_/ÄJ;.Èöï"öˆmħĴyĤwÑäT%!žVD•Ğd°#'[óŜlÍ3­Ž?’zHm?œä°Òûԇê]Žúš’„BÔÈċUQî“.¤ZGî£ŬG;úœÙkä£j>7:NèG-{ rÙÖ0c57r9E<‡Ħ‡;1UmYı'@UuÀ÷Ċd‡ĦĈëw£ œĈê4ĥKşîWÄA+ĥĉħġê™›kßQ!Bëä€Q†kÙrUŜû*ӈ9ħÇ4óäĜ³ó.ž.*D@<Ĉ}WBÁò6–èv5IŬ³k³h\ûı†¨ M·—ûïA3yh5Ÿ²NŭÁ–² äâËmËĉSZÑ0ë–;İe”[JUÔ6hÛĉŞ AÔk¨ tÖğŬĴŜi½í“Áëh¸˘œkĵïŸu´ÇÀ×nÈ4Ö1n…ûĈŜî9ċǧ„ĉʵ‰ Äeŭèâü1ïġ@IıŒŸu ñP[Íb'19WÛ[͚ O=|€áÁö°Kщ=çk{ â‘L÷m BâÈE{mKÙ <ëy1]U4´ƒ˘ =ŞQĊƒùPÙHÀûZs‡Œß[ߖÀwZÏ9×Ŝkĝ†'Z!&FnŬŬéhċAGÛ6n ¤€>|°\ŞV ;}°|ŒŜf¸Ħm¸Wò›Xşvwŭé‚ÑÏĝi)ıŽmMêôÓòQ~Ú˙O ³ˆš¨,²K˜ñŬ{”—•_îé›ÏFĞòĠ÷.Î.y÷ê_ùŝb4_Iñìlq=aĊ7óñb2›_Ĥ‚\B“‚ú—W£%STµ |ĵœŬËTéŬÄúé$*w×İ:G5:‰Íâŭ|†‰K0¨YRéxċçÙd}µ/Ħ£˙è)ÜĵÖéğsŽ–ğç¤`µúíŝ˜@^ÄRm\o߇j½İ<€œ°‡WȎELIûkĜ˙b5&Á{„kĊËÑí·ċìòjÍ\4‚{ċšŭµxQœŻ‹·Ċy1.Ĉ‹ëĊĵ(‹i1×ĊĵXËbUĴ‹ğ/’ĤéžRñêztı˘*8R“Šħgg‹?ÀT‘ŽCıÓmЎ½š]—Ĝj#Ağ~Ŭ”‡Ôâġzt=ż˜_B1+Ÿ­VP’$7Ĥ°~‹‹uyóS ü·$ğ(Ċ/5­´ZşxŝŬż~÷îKbÁş\ž½ÛWFhÈüĊ|5ğßqŻ•&´µR‰–VĈn­llJN+-RĜ>_ʒĥ?΂í*Ô#kÛşíħÏĤĜÀyYk£= }ÖFáRÛ*ƒû‘Ĉáİ£cÓ=4ŝÄv 9e‹ĜĤz°Q’ݽCh1VFŒmÍ4zG39îiĉĞâǤ›ï‹ÑF?'tééì3Ôuq·,.‹ĞbV|‚ÚŜ@qç³y í]à÷6éŞü\΋ĠìhóújY–Ċú÷EqW|.~/ŝS.Û H~•†kµ£Ŭ¤Ûép@zMè÷Üî+ĝ]ëÔp°°Ñpş}·†ĝn4|ħœ”Ë´éh/ÉĊ7ƒtB`/ÇéÁVĠ‚;P$œM qäÁ§%Qġ7³ù§‹ù|ħ~2´V]~š³\!ĜĥÒqUS* Ĉ…’+OÉ!ĦġĞİgÁ ƒ¨ƒş^‘Óê³àŸ ?5¸Vù<ÎDĊµĥLÇ(¸>Uê,8c¸S¤s‘“3ÖRQòäàZä,8­¸PÔۆxÀ,q1Ĵ)éU4Ŝ >áÉ­r Ü‹<(¸>e,8áɉPžƒ‰ġ`^}*Ĉ9l:ZÑ(x„×&Ĵ´ş×§2œ4÷Í(N–"ÈSƒkU~³àÔ,6„˘”uP(WŻ5ĵĞĜŠôݎfħI × +‚p“žšÒ ÁlEúT@sàTŒœ†RÂqJ™s7°éSèÌb£-ârZ qıA”ŞžÜ~!3‹ÍñƒmXŻFD°Ï jDúĠ"³Ĝœĉôè›2P#ŒXÓŒôĞ'fÁY ák+˘eZBíNN#\ŒVµfDÀÔd†HbáğNNjÜŝ*…œ6P 6+ˆWÖİAíˆr™ċ€ÈœğƒIWN"ĦHçTĞÍV³ĜtP0 GÂ8ä<8²#IXeԎdÁIèp}¤'#r­TJñ:!‡}E–Iò2}°Ñ £tAÇTpPŞÚž›AÖ Ġ‘Žê;ÎW Ôû А[‘\ufßû#™Ş´X0’R(§K+ìé9‡h–ğpLߐ™Z„od=_m5ÀË9ŸİŽHXêguƒC¸ĵÒ5z0ÛHNċâAÁeŞ#:çŽÑR žž-`ĠSéK†µż9p°-юCŠšŜž€m šÁ÷ܜžqt¨|76H^cYPˆ)½Y`Éĝœ› :àż…Ä4b(ŠÉħd£ÔAíŻksˆÇüÁrW tT Ê?Y\™A-H—ŽTŞ?²D‘ÒË.”ÌK#‰cèi=^0ú½`ĊûóכĈëÙb^íúëĠz}ğú[QŒ—£9_>ğ].ŝ{óĊò²¸?.ËżŸż].֋³ğé˜ġ­=“-ĴNjCŻ…xϑôżakˆ¸-Îڊ³!›s‡òDKµ`U³HĝŒ‡;ŻŜŻİÊóôfkôJMĜ (ÄĜ Eµ L2›AL½Hµş ï}óŭO?ouĤÎ7£ù³‹ëÑ|ŭAR¸WC4fÚôMĴ›yä.ÛMϰчŒ4Êô_Qo †zoÄjPĤ`’ÑfZSC<×v4ÛmÇj¸i;ŽR|V7osp „Ş:pù*Ún69l„ÇĊÙ+DèÔô ħ˜uÁż‡eĠ1×ğù÷öPvĜt½¨g(½F”’Ĵ ‚a°,8*Uǃ&ıiejĊÑût!;܂?ùÍäáRĵN/ĜRŬÊÔTuÖC4§” —ËÑÍ IçònEЎ?BDFR–K53“J £à(À ›{ÖŜ˙ïTÔ6Šâx9OñU<4ҞĞĵuUçŠ:vÍc†ç !´›Kï:7£ÀŒÚĊ:bĴŻg¤ıċ|\’ÙfĊtJ”T7ça²˙ô‹nendstream endobj 178 0 obj << /Type /ObjStm /Length 2329 /Filter /FlateDecode /N 87 /First 797 >> stream xœíZ[oÇ~ïŻ˜Çö!9—ıœ" 7M  ı’}eÚQm‹EöżïwV#R´–m- ag—3;ߜsĉ;—YŞR †˙Úp êW™ü*ĦށRöŽ9KA˙šĵQċì ôŻì ó§hX œ †fĊpÀbŝ“ΙÀ5á–·"h” É'·„*fĥDć›+xk RoM\ёħŒ—% JÉ \֔ƒ*X‚ĉêOjÊŜ§mÍGYÈ ™VBEĴ?74$ä’r#ïœC6`f*Ħŝ‹ĝìX@‘â-”Ì˘#3Ħ!€ÁŒ†K‚%˃¨x3çP“/­,Ŝ§˘‘!?nĦ û UĦ1†hj…HX(Tó• ‡– :ÙüŽECW&n:v-ĥ ‘°ÔZñ>-X^¨(Aƒ3 e@1u5*+.•`öÁŞÁ CYa)ıND>šMv³ÂŠ #ŒF Ó³[Tʐğ)¤ì À FƒĈšÈn~másĜ0Âç°aĉÀ$˜ Ê!r#ĉŒ9H`Ò\0e—i!oÁ:Ùm’ ´0lٟaXĉ-nİéoü2̸XĴÂ?Ĥp2(ÔŻ˙ ³?..Vó üšËÍo³żÍ_œŸ>YĵC˙„żہBĵïÓÓ%ş½éw2żZ\/ÏĉWÁçĝÓğĠŸŸ­NWóÁH†ßâĠƒ wO—‹³góŜ:{úÍ·aö÷ùğ^úĠWhżœûÛ_ÍqûbĜ×}¤6RÙBޏCšï#­i*¤e i}Òn|#Gß{7WYM´‚ĤwWò£V ÜKżjżĉ~-ŭZûµŻXúеŻXoVÒî×Ŝżġŝ­÷·Ŝßzëó[ŸßúüÖç·ŝ>Ğ#ċ‰$jíDÍ%Qí+Ò"Ġä2rÍw‘kyò1ëTH·dĴŸ";¨òD¨òĉÇ1laĜZĤBşĊ°ùSöŞ:Ş-ûˏ³żÜ9#wÎÈ#µNċ[˖ĉË4_úž/2‚x*[ĥxż| ï?Y,_̗Apâ†no™_ù‹¤ ~ö˙@ŒE=ĤdŠÖ‘\\ży˙fß9Ú3b‹‡Kñ8µĈ!<Ï Ċ{?ğ~àüġüâġ-´A€`ËV#<Ó~l’£û`ÄôħÀsˆ–X>´Ò˘Iڍ%f$ˆ÷bó„G4ĉRŽ 6Ğ–ŭĜH"²#O²"˘``ċèùÏħħY†µÉ^hpÔQšg*M==Lħ"ŸÚ-K (ĥŒĝ@Şĥ[ĞQhHŒbóÌÍZDjztl9qĴmżJıĉèTä8ŞïÖ™#=66ßq­> Ó˘ÑMn‘²ĞFw}ÇĈF–˘•ŭÛáA$ıa·ê)iá8µıÑñĤ•›Rô\¤5{5%Eâid ›VÌSuĥbûğĵRʃNĠĵÄb*ÓRÈ8daq(€ì•8Œ 7/%qT::4ˆĤ=`n [!Ġ5ó2˜ĜdR{£1vƒĥ²ìgß-m(^I”Ħ̆ÁuRƒ–Ù°ñvY[‡Ö@Î^Ġé!5ÔI d š‚çkyZAÄa›„*x$™ä[zYÖXx€ƒÒ&1hT ÷³)/Âa€Ğë¤ìAcÌòH^ÖŬ'6Y6ĤÎeRò Ù àöö@hDŸ!ĥ15ìµiıc#ĝKDÒĉ§ù°DA™ĝ@7t°Ŝ.]7ÏŻ_Ĉó˙̖ó—óċüâl>;ğĵœ^žñbqv5{µXĵz3ëoçWWPììġ)È*ä(Ú˘=)Bt'$ĞšÏü.Í!CÖ-‚ ×íıfŞ0ŝÄ”NşŬ knËšö¤¸TŭWNÇ<2˙$#ŜjÓİMï›;sFĜ+#ò4Û+O5ÁÜŭûO:‘w ġoš6ï¸=ğŬ ğCoğ6-ş‚Íg^KıE‡ÈÛż96:1D˘ĥ+Âß Cœ:|ĤÒÑ%?;hGGçM.˘ó¨5m4[ 1"O›ôcmš-˜gç)Ċ;^Ítˆ`'Öë6p;Ġ]›u ÍĞŠm£ÖâP™X­u$´¤şÇ?­Ñp˜7à2ÀM\^çU`ŜNyF̎¨ "^ŻI–,éÀÈ÷Ptí^ĠöÖŬ˘ëèÈˑyƒÎŻSŬ8†÷ċ•í5¸äU?Ŝ€—:­ğ=Ċ>_Ŭ‡QKLZôŠJ•!úñ½ :­y}|´îxd蜑xĝQġŝÍżn<ĥ0“ÚÎÊ"ÜXAĝá ê- ´‰ûÖb£ ˙Ñ2ù·{ĵñ oè;iï‡Qµä·òĴŸ9ßÈ 6£uQ!xŝ\ùĈ–w í3ÏóĞ>>³>ö§ÇŞ1Ŭ̐âÖH^bêwepgzhŠp°­ĵ:_ŭtŭ<ž-ŜÎŜ^/—§ïŻV‹×ó7ïgkKù~uŝĉêr00$û—Äp!&~ò<˜Ÿŝéuċ_°Áï²½ħêÇÏŻë, Ğ—èC†™,ĤQôŻÜ˙OìĠO–ÊP;9oW‹ġ³ÛaNÚ?)ÖuĠúżm6wendstream endobj 266 0 obj << /Type /ObjStm /Length 2538 /Filter /FlateDecode /N 87 /First 798 >> stream xœíZ[·~ïŻàc‚Â^‹4€7‰vëî:Mš"²v,ĞYkTI[8˙>ßÍÌj£™•v5‹şE°°ÉĦxùxxî¤ QeCR̊JÔ}(I%/UdĴTXEİ8EìŻÈċŒJPĵC%*JFZ0k|%eĉ–ßm‡c OVYŸÑœd.‡™ĤÈF~ÂÈlñ{ ŠÇ)*ĥ$}’b›Ĝ³•ŠƒÌ“IqrI†*g :gVŽ‚Ìê”c™0{ċœ`ÉAıÀÒ9*³,˜”ËXÇbK^†³-ÈbCÊ{’Ğ|ÌRaċ³`1Nc˘ÀTHZ‚ B$Fkl’ ¤%Ğà-’Q!€L¤B‚LVEB&VÑÖ?9cOäUôB ˆ1Jçˆ 2֋ÙJŸĴ’Ġ³'Ë^¨ƒ²íäA^ĥĴRpĥN޲ġ*’– 2U–l“ÊN``˙9€ÎÌFċ(0€)g'-Â&K —xap‡qB=€@ K0ƒ?ŒwġÉĦÁg Ò£& 8£&ĵ&üGTSŜ‘Ôd,ÖA \),GdeĴä“óR“uħAÔähÖ O2kP°Ò–†Ŝìeˆ½°—5’ ÷XÏÂP¨Yç˙ĊŞxşXT›µúg}ìFĞŸTñUµĜ” ´z0‘´ŻÊËùäĴúˆ~Òä Avô}=YĦĞrÛ~çċşş^M˵’ıżù¸y~ħ™lʚ•êÏ0uÍOġ×ëU5½(7˜µxŭġ3Uĵ)?n0é—_˘ú˲”Ùg%>‹Ô÷ ħ†[HiHS=\d˘.É4%5mJnJה};´#íníNÛ!5;¤f‡ĥÙĦmvh›Úf‡ĥÙĦġMš26e3Ÿmĉf>nĉf>ĉ ñHb·K!ö'QˆCR7Òx izÒT~$T.í˘rù$úù†|OO…Soaz~̳juYšċL Ô~|]e˘FĴ‹ŝñ# -o`½†aÔâúêJú~ĞŠ‚l*#ĵÑ)ÀHĞĦÜa;HGœn$Ò"‡î×o75œ—óĊÏ-´šj#`cŻa˘°#Ÿ’†Ñ‚ë´¸9j|lhžtm)ïDƒ&ħwµ8g!Ħ$;&4qo°‘NâäÁ}ÒÖÒp(³¸ßĞ„ àŒIĥ”÷é‚ÑVœ½;ħy LâŒx …‚ĠŠŭħħy'ċCìĉĴû˜öz’án>66Âz,‡{—˜k´Äĝ„?% Ŝ£c NGqô亂IZÜRbÖ⊊:ĊQ…Ħ˙PĦɂq“‡+X{l0 W²ÙTa„CÀ%p?œbŠV¸%>38ŽŽw.Ĵêĥö´m"Pżġ½Î 35“| 4Ŭâ4Û}@ÁĥFËJڟ$’tĤû@`×ŝ"NTk‚ÏĊ}iLè=5í.yê0X'Q·–@8Í2éÏ£ŽhÇTż!ö¨8ĴyH:t èuèÄ´úqC:oaSŬ½ïĊĴÜϝÏ@—FUÁ½èÖ(û!qí…Ĵ-·C—N£Úü^tbÈ)ŻTŽä5:tí~T!™¤}³- B粖X CžT'' $êËBÇ@wĝ%{ltÄ JvÈôwèl†Ûğwè¨vBrƒûĊÊ:5 ¤äZt(Ġü÷˘sÂQvÈî K;|‡=97*ßQrû'ĝDC2›cM2riëİx2^<({$Û=­ƒ· U|wŝ˘ë0ŬÌĞĊĥé³÷›Írŭ§˘˜& ½z²\U˙ÂêşZ͊ċdú3¸?Ÿ#ÚÛTg×ï>Żĵŝŭ‚MímԏAr‡‡CÑi'f—upGâa×+,Œ ê8Ż`².ë@¸xŝĉÇç{óǗŻ^U‹êċ†Ì“³êêòŻoŻĉ˙ĈYLĞËùbĤŠï狧‹ġüĤáÙ|µŜ|ġ~²‚=نĠàéjÜTĞ:Á\/ŝrÒt"ìç†NB!BQ}·˜cÂRI:¸°ŬÜ÷óËÍ{É ĝ:ƒ´˙7Ôŝ°żğfğùm[Ûŭ÷k·e÷_ÛöSÇëİä(àǀï&ËoËùì}û zIRâ³âM1)ÊbV̋ĞbQ,?ĵ-WëùlQTĊ²\ÍĞËbUĴ‹Mq]|üĵ–zÎ'ñHñìj2[ƒc·ÄÒĠ˙twGˆŻîeĞë+GoÁ+GŒšyÜX!ö°ÖŬ>[’ĵH€Ġċĥ˜$UG Ò8JΉ¨p€ëıäS$Ĝ-÷§#"cßÂDI° *H‘Cçb‹ ž7t…ğĥßÍß!ó÷›ì×-|`öĞW<$ĊCîAäb/"àÊ~ÂFDÄ[™ĈÍBDêÄ#aĜN7àä–Öĵ½™ŭȊœˆ$ûàŒ6òjĤ'Z/zÙöĦQM‚áœĤE`ŞÄWÌ ³65Pı†7˙G6‚ñĥq8³Ô-\î.$ޝ°GGQòä‡À!˘÷Â\¸Q­Eϑ1§ĵd ĦX ííc3ƒÒ Á™‹4ĜŒ`F5d=, zĵ#{Ŝ@#Ĝħxsœ(ĈÍtífÛüj :Ñpžk+ĦşDöFDĦv͸×Ñ=œuÚŜ‘\­ĦÉ}ı|ä{ÔûhÌ& Ÿçü*’ç€-4#îɨĴÖÍzÊ!hPı mMnBh\G³A?™ÁkËZw Ò@˙¤ÜoïHÁÍHƒlü+ï\ô­ĵ‡nĦu÷ ´ûÜ|ZİÒßò{p˙•Y“n9ŭ•Y³tóÊĴqQîġ|ëJìl~?tóJÍġĵGlŸœÓ[ïŬƒŜ#ŝ˙óì'5ÏżÁ8 ' 8nÑûžôlµœêyġ€<•MâĈF„FGy‡/×wa‘…sĝ_~Zdƒ×ÁËŭşÓò*Y°fħ„Ò|dÈö?/,ÇòĠ-1ùħhtaendstream endobj 354 0 obj << /Type /ObjStm /Length 2480 /Filter /FlateDecode /N 87 /First 796 >> stream xœíšm·Çß÷Se‚⸜áİHĜN\ˆ[Îyh żPäÍYÍE:H:ÀŭöŭÏjµ’ë•äóQp {İ]>ü83œrׇ`œñ!JzMĈ³^³‘˘×b’d£3…ôJ†\Ôâ"(xC1è1T˜P†]Š(DìÑKL†}f²áàġQ1u ÊYO"`ĝ„z< ĝç]A%j k+t‘6˙_JÑĉĴĥá²ÊĈáXû†lÉ))t‚R€µ”0q”˘–t.œPÊI[dC01íh âWt$‡ˆ!ÒQêžb Ñ{ƒ˘òBƒDI1g"Ì%ŒT³ÀÌ‚Rg  :!!-˙‡Ż2Í£ù|ħ^™vâvĉÒĵ2͓Ċ|ŬÎq7Àô^óĵ}=›<^ĵE=‡żÙ&hu_L–¨jdSï²]-î–Óve´ïoß˙rµžĴÛN…]…§ ­ =vż^,ÓĞv^›ß<5ÍËöí~ŭ5Š˙mµ÷ë?;Ò=*E•ßĦ*Aµ“ıùùJ¤Dû¤Ä#ŬPézĜ\Cŭ5ġ×Ü_7‚Ñ•°ıRċŝÚ÷Ç2"İ$ûàĝ p! µHßħ*ŝĞÚ£Š•¨ĵÛ§òô ùù^ó×ĵï-É÷–ä{Kò½%ùŜ’|‘{Ş4Cyg†ò13|ŸĴß|Óf×ó‹'Ï..Ûëğ›Éòâ%]`µ7ßΧ‹×³ùµi~šÍÍW³Ŭ§³ċjŭäÍd‰9oˆËt9ğ]/–]NÑħ}?é+Á›ĉêî—uG¤\„Ëâ‡ù ĥQoRâ áO³×ë7ލÔÜñż”ċdsŝ‰äŝ˙Wƒ5­ĤŞĠ„ħy2ı}ÖÎßlB&޳/š_–“i{ÓŝşŜ”–Z§ıiWĞĉöĉnġiTĴÚÍ!T6Oo&×+$&!ĉ˜o Ş{5#ÁŻ6ŸÎnZᖝŬüuò{ûaÊ˙n=ı™MÍŻoZ4ožÏV+hSŠ)ÌÍĠşŭŭGÍöĠĥg[“[,_·ËŜè]·4ƒĥ?@m·×˙Ï˙’5ëu5‡\,²"gĉw77Zġ tyLµA,6j²FŜ:ĝuŠÑf¤k‘ĊFĝïW{ĉöŭlŝۖħ[âFc"‹ôġZ! ™èĜ¤ÌÉT€ġRf²l C2ۀ…œmFâälDÎ û°ˆ ıÊÙÀ}´…q°b­3;"ÏİÓéyÉàëmÑ=Ó12XW@ZÊÎY§{Ž@*g&c(5—tœ,°MĜc°Î ;v:Ö! —Ĵ@1ċ„ÈÖlċlFĴ AoWó!ĵż°{°1ĝlœ-Œ †–-°y8„ôs³aG‡Ġyb˜rsĊŠnfá>BŞê6FÙ¸À‘Ê 6'V /*‚%£ĴêmΎFÙ_RĜêNŸIl@òœ·"U}‡žħŒĝµbħ8ΖÁ°ŬĊ²!ŻĴdġäâÜlÇÙ"Ì- n&Ŭú' ş•u:ÂĈpŝ„×€FNfċI`MX•]Èbh”ĉ&UށûŬùP+{4ĉŬàĉ]>ΆPàà1ĦA7$,•5:‚†Ġfı£!²;lġÙ{ş£Ĵ„ÚĞt„1|ǃ‚¸„ â‘Aêi$ëÜùÙ99.7]É9‡n%ĝ ‡‰ÈĤ¤²ÉïŻ„ä(Ë!Ò§à>#Âë‰a"ğ9LÀV6¸8A¤wñ¸ëġ`JpŒHE1é²ÍTمŒ°İ<÷‘Ĵ4hR™ôĴ<áŞú{§ğLXÄ^uŠH]<{d*·­—}ʄw`Kñ;² ²³KíhÂ;€!÷>ﰟ‘rŝÔíxÊ;=ÁéžĉüpÇsŜñ[ùšëǧÍz: {’”˘ĞşcŝˆĵW]šxòzâ‘ġ6 Ĝ£z´ŠÂŸ8ó萏';:]e½Ŝ;ġటIšüná(ÚDçß4O~·tŒ8šôşCOĦ²ÙŬ7ŭà ²ßY#@ô§ÙŸ0è"r’]֓Êa˙Ŝ9@‡8Qş,¸§ÓsŻĝݳàq˘ÈÎìq˘¸Êıĉ½óàB_qtA3áL6uoTLóċwC…ézĥ˜on}ñf½]ŭİiĤËÉÜ./n—‹axğX^7·“éo“ëöϗ/–‹ġâñŬŻ_vŻXĈ'ŒÙzoÁc¨.P³?JH)#jû@Ëĵôú|)ĥ·Ùm˙^?ôóŽ<ü@˜\ġp‚uZxÏêœìĠµşèŜ_°Ñ9+rjÁJ]ÜYèœ*Ÿ–Ñ$ġ)ŸRĴÀ:MùĥtĜ¨”ş'?£tşŬÏé°fc÷âUúŻì]—>K]İkvctT0^<ĵd{:$ġúIï@‡¤Ŝùşg´‘F|1t'|Rv'hG‡ĉúé˙}Rü9Işž˙ż•˜µGސéQ+ÁġS@‹(ŜëáĤM•ŭ{Òs˜ƒ .YŻç\Áş²ù4)ê·û¸şÊŻáĈàHż³È‡}Ġ!‘¸ìà(ußÜT„£ħİßYĝ1¨c˘Ż‘⎠·İîÛò1ĥ€ˆ—ĝàQkÏÖžĜXż6¨ûĥ|ŒMß.§ƒoáĥl†,;ƒœjż.có‹ÏbCVÉ)ïĜÒĉ˙ó‰Òùƒçàû˙;xŝ“Ĉìendstream endobj 442 0 obj << /Filter /FlateDecode /Length 4498 >> stream xœí\ëŽÜÊqòËôû/=È.—}awóü³|Î1tpŒÈ²°‚„áΚ!Ç$Gë òyÄĵ†ĞŞ/$G³Òj/'2°6`ÉfwUw}U_Uqġ׳4ág)ŝ×˙ı{2Ïò\­´²êĴ[żĝë NÏü˙•ğ³Wï^\ċšŸċIĤ•8{wġÂÍÂÏĴMD*ù™*1êìŬîĊŸ™H¸JĝâBÚ<É­bï6ĠâB –íŞaÓ:OÒT°UĠ—]½Ú÷ƒLŭÇğŸ^üîĊïAÔŻ•KhPNۙ\ÉâBq“äıq?An?ıûĊÏw˙_ïĉ&ġÔ>Ҕó&“ñÄfù™Ie"„³ ËÑÊ9ûPoëĦúğZċÉ%”J²LNÖ@5ŜŭċžZœ2|­ †Îy"tĉġ@8Zî7e[ueŬĴ&sÖ.˙R•CÀŸlh  €/Öw×ù$Eš¨ı8ϐ{ûhPŝ, È@pò#ÚŬ~[ uÛ<IJıËÖrĥJÔ5uĠO÷9˘ŭƒŬE³“2OŒ”`KïVwĤ'šy* i“È,F‰HKÉZŻëa \Í*DzR? €@òܚ­ŝ °çğwı{żQ€eY˘ĵÒÒĜY·„¤fFN'˙%ƒÖ3ŝŝqï>*z1À٧ŸĜİà2‡À7B_ èËċ|êo tÏŭfïŝ²üñègŞ6Z$D­Ġ –m~½úX4e…Ĵ3çTÛĝqĦZħfU1şÇ)èL–GŸĤ˘“ĉInĵ†XAô߆Şé!‘}PĈe²bĥijyûíy˘'ôYnaàH°f„0û>v)|炳mÛ~8ì–š„§vä3”žïŝ2°‹Pʟ Jƒu@քĴ ÁZ],ë! I°şŞuĦYŬ÷‡‡u¸‘‰ÑÙL†g<=ß½ËŬ{ĉĥO'´/UP*„Ĥ}W•ĊP…Êj.=ǵŠ{ŽûŬâBž¤iÎŜtí–íÖ5ĝ^,iôÛ=ìÖîài+ĉÂ~sGü|÷ ĤŒßa臙òg²µ,If=É00¸fÁż²Ĉ\€­JVì÷][”›‡çhVN×D½î˘}N- Ó>Úèñہ7Û˘é}šçìŞu:²Ğ‚sÔ·ĞĥUÑ?NF:‘…İôiԅl1S^]3ÉıËM{]­ÖĠj†ÇÑf\jĤM’ĉJH8]ʈ „­l–)óY­`Oab­N¨€˜Ü:µ8 !KSrìoş…Hщ6úPK_1Ħ]à×NÀ;˜0G÷ ş—+Mqž#™ÀŸ[í{ÌnĤ"΋÷áÚ²‚Ĵ /ҌĝSR\;\ŠuuÑT‡Ħ+ĥçĝ(ƒQŠí·Ċ†ı›=rTĈ°ÜV~&kĜuq.kŻÂ`ÉúŞĞ‹mŭßî?C?t‡m}d1lU Ċxċ0aħ2ÙĦ+!9 zIVĥğŬĦİ/hW·Şñj">°Yĥ÷{֟ğÀçW÷´‡Äĥċ<Œ×³Fċí*Ç R"e™Xì™Rp\Ù§'c4mëx4ĈÀR¸W>àjœúCuĈZv Rî)<î%5O3ډ">ñÂk‚UW/Ë€ĉ׀‰‚rZˆ]wċŽž>£½Ŝ(°)Â˰Çu^lÙşĉ­!ĞŠÖ3Ém“&ëj÷Uûï÷ rÚù Ú\·WŭM?Tğ‹bŬ´ŭP—aNnŞ!H Ñ˘<–L™„6l[Ż7u…˙;Žöâd4bÏĥ7á!g iŜ„ĴeUSĥ+ĝ|ĉ>†× M֗£ĉ¸gĞêâĥaAz+ÙuµŬÒÖ ÀvÂp Káô0WІ(‰ĵ•mór}èâ8„3Pİp6Až‡šY"Fİ!r·—ä#Œp·íÛ0a†r]tĞĜ"îö°(xb’–ö if„Ít_IÒ9İzù° -×BO}­Êt˘Ĥz;„˘g?ċ[àĴxžÍĥëċ6ʊĴ‚ µĤœ (²ĞŠ'ŭF ĉ¸ħîŠŬÄq,ġ6¤ŞpĊş¨›>Ŝ0¤¨żzġħnñu|ûŞĴ_:w”„ϏˆÌeÂáO›Ú9Z_*-ÁB7ğ˘ûû[èwwı´SÒ"ÚXñħ¨·œÒısŸèÚ~Ûĥk7Ÿ£Xŭà '`îÍĝÛéby˜´(WĴcœ†윴p†ÒĠŭ8+Œ\`ĉ!3ÍÚ ƒf˙ŝğŸÏÔ³€ĉĴ~Ñ8Ħu>  #¸ñççe š¤$j_ìŞ°G9êŬhšú„|ôAr ZNa}u_0UáÈ ;/¨ x\Và½ŞĈ˕â†vU:|‚I26¸q)EJ”żż³¤‰fÀĜ~Y ĴĞ“Ÿ* Ž… ŻÁû܄MĥŜk9Ğl·ûlshVžƒŻÓD&Vò™&WĐ/)˘\:S')ú vî9BiòLÊsHÇ/…‹Ŭ²^<ôó}J_Ċ-?ġ&9ĥëè23~2ëĦçÙÎ/ÜQî/\%ƒ°VùÇ  Ċtîâ›O2VáeàXH>|•¨OĴ1¤7}{èÊj˙ž½Z\pbğìßż_Œëlë˜b…a(ËÈŞ½Üú¤ÜfĴ?൧C3jXë¨<³ÀäÍħ=À9Yœïïföŭw——…–Èóa;\-$ZĦÎY*‚ ġÇûÒú`@˜‹ÎE`°`ÇÇ&Ĥ²DĤı'µm3`ô ÑEħ …ŭM’˜™a¨x(cŭ ŒO †­ĝ˽uTËјԆ·ĥġ²+ş›IœX÷”E;âF·)% ûŠu‡†œĤü„u5Ó)] ĜMž_—Ût2K2puS]5œVöe1͐"ĵv–a?A8 f" @÷ÍͰ ñ}Ä'ñ\ÊDfž üiAeÔÚħiM8„ĠW³ç‘\ğ‹2ZhGÛîŻÚë˜9\µÛm{2`_Ĝ›•gmšhÜ+J`ÖaŝîT\’·%ĈĠHŭ_cĤpU”“eC+’Z\êç ëxë={ŭŭÏä |²ž• €™/hžrSŬÊĞÜ}ˆœ4x‘"lĝğcé˜ONŝĝ,„â’ƒĦ ȃWçÛ×]=TċÌYAöUïÛb PdUCٚc{Ż£mH}ŜŻúÑ#­ëUh£0äS˙‹ÎĉŸ#™0óıI”ġ‡17ŸUĵôiƒ ŸíùƒO êIÂP†vù :›p[°uĠ`öïè.¤kİ`³Ü´}`tnE·ĤĜAsE‹xÏz”¤,ÛS šOg'ğ\äè*FïFV>3yÀĝu€2~qhÊá†GÏŞîËCïÔÁ§àŠ5?פŭJwTˆ†Œ`)ħ’êwà]Ŭ·Yŝ…İacy”şnê! a?Tû€ÌlĤ öXÇúˆ˘3-ñù[ٍoÇĈâŬé~'eá#ŠPJ“dN·ÔĊ³„ £ÏŽzÊDÇ`Ċm]€4‹^ÄW„(cżq§q;èÒT—KeYùÓ3ŽJ ;Ü·ÀùôÓ !2a„°Ċ!äÓaÂCÁÁÑÂ1`­îsĝâ;Ä£ÉÖŬésİÁ”ıoy¸2öŭf]?Ĥ˜ħ2à2XXoĊ;ž?ú:Z>n;l_hĴœ:½İá@ aµÙ<Óc¸%ÉÍMbe>&ıb Ñ·X~l™ĉÇĈv—†=ßpúßëM=Ö܌7 ˙/„ù/£Á/´&$?Ŭwµ/ɞh MšV+  ğ@üq`ˆşŽ\@jîÎ(-%Ó9²7Ĵ1ùĥ1NŠ?Öh1', LĜĉcs.8ż‘ùħĊ*5Ò£ĝĠ'Ğó”êížxŜfßÂBžÇšóÇ:žM Tžj^7žş4U'<39Îy!8p ½nğr7ġĞUċë`GìP CµÙ\€ħäÌşTÔ:Èü_[‡ÔiüC ó†öƒ+gd–Q´TáĊ'QÚw8û·zŬàŠœsIŸ@ŭO˙˜2Ê4òÜXĉûİhœ’gËXôäT|DÊèäü<Ĵ“3‘ }rS2mĵQâî,fk[Èä2?@Ĉĵ÷÷/ŝöà§endstream endobj 443 0 obj << /Filter /FlateDecode /Length 2173 >> stream xœċZɎ#Ç|$ô¨' 1;÷Ċĥ.‚d†,ŒĤ ĝ ñMVwSC²zÈ˘Àŝ˙ž~/3Y§Šlrl cÍŞÊŒ=^DdÎğŒQžħïw½i£3$ËÖñ§•Êe+üdĴó;.YžFÏ6#F½gBŞì1ìĦ^ˆĝr™i&%ċ&ÓÜPĴÉĥùèaôŬèöµäX‹ %U„F… Žâ›ĉžJÏħ! ,ġo/гŻk>ÉR&“´ÎT{O™ëySíZî ƒÜïF<š";ü™Ż³/ĤS8•yê0Ùôa”ìÄ3í¨“t„˘VeÓġè{òéx"8c”qR<—Ëb3['ZhĵdWn—›Ç Eĵ&ùzĥ\$ŸW?9‘˙cú×çÔkͳé7£é:Ä·ùs>+óECœ–û²Ĝ.g+ú*ßîŠ }ġTlòo÷ëû|[vä9ĵìeİÚ,}Ëüç2ßì ÒÒÀ|:HÀ)‹êƒ Üû!8S°'˙Šßo_ó`Ôs+£qÁJT6T† €OÉÀ‚zjéx˘ĵ¤ŜZ2}‚:ŠÌvtµÜ•áE0 YçċSħ 5#/j£Ä1#u!äN‘ô‡AçC\ Ċ;[*öqÛ07ÁuÌvġJ˘ÉMX —ûm0uPĊ;CfĠOO6³u¨´&Ĉá[ñi2Ù%Sä“|µĝìGċ›ŭş~„Ġ6‰/Ùäğ2Żd`ž,òŬ|ğ|FXä`L“ċfÚ/Ò²ÀRáMòô‘×4$mÒ|ZFD‹î˜s=—|ôĠ‰ĝIbĦ-Uş†Žŭ)|@ì´Ê0ßœÁpœ¸75Îp')½3+€?_ż„]äp ‚Éİa&ÑQ‡`ŠfIôĥ—‚—– ×eqÓ Ôí‹ÉZ0ċ²oțqM²ñ˘îPák‹Om-'WÁ ]bò§v!VÜıR1Lüz÷ioİÔĥÂŬ„D=ƒ‚­\¨Qġ!=$T}X"y&o‹ްlş‘ß÷Ħ•ĤB2gK˘8qU—€ç§!McŞĊ%ßG”IÒrRŝòœ÷ʧ8uÓ9ñP‰Ó’žÈ?&‰dSĦ: 9-„ċÙ¤6:–~–™ŝf™ìú= z´LĈżX Pċ#‡Ŭ‘ÚĦì‘$D_’Ê5˙Í8Ċ£‘b•W”öJêû[á $Ï˙™ƒÚ(6\KnÚ-˙5y4hŽ!üy/ YĦ3Œô!Ĵ,Nşn"ŒÁ”ċ_ħ‘×´R†Ë£6ôÉ˙s4"ġ(ĤP{2Žâö§eùT ~’Èf†ûqĥÚçğĦıŠ™n‡.Ì #L=Wı8WaDwşšĞ à0Ĝü-ßífcH䘒3l° ’äĠpfÚâĦT>7[!öLÔ°á1˜jċ„x/şÚ5ÓlÍy{şrI7&ħ6ñ‰Ú{o#UÚĜʐ~Ù%şfLGöǢx\ċôy[”Ċŭŝ~YŜĞêœFHvêÄĥIBĤGEĞŒŻF¨‚#Ŝ—/œ¸¤DOëU3Ŭxdò'&áGŬş„inJWˆ3ù’‰ë‡ë[v˜ ó‹˙_N\m7½vĉrˆ/:„‡f./sÛĜÌ)ŠÈ<5t î8ò#chŻ]kröT{vì&˙NdċŒxoîŞ38ıjú5ÎC{‡ğÈ‹Òú¨p£]2iuħ^7X[Şú(N’]^ö?|íş0@ÁÖyšîkĉ#™„ûZRÔżß­òpL™ gp‚Z_ñ,ÎÛ`òĥ@PĞ´[ ‹BaUW£ëQ‚óġÛeŝc™×6˘ç'fŸĴò—ÎÉÔá;OZĦ=hm4Ŭc,™aÇi`%îÈ]^“ Ι‡à7˜Üר/ĝa”Q° ¨4Ž àS._„3G; ƒDŻN5b_Ğ Ì·.ĥyušgÈrƒëYŻ*8šÌî‹}yXƒ¤K6ŽÛmûXħ· a VÈxc0T€úWwAK¤h@K2_R}È_ZBŠn":*X˘qÁBc‹ÀŒ\,ŝş¸ı “êrûóäCŠƒqĴéì)œ“¸Ô[şj^WU;VWJ‘âüĉ}°¸V;x@Ŭ&>PYÑ}(ŞNuHǕuxG7Hñ>Ĝì|‡Ô)Ĵ'¨_£Ü;Ôx˙^a önŠÑÙùéy6ÛŞĤ˜ĉÖê ™-[Ôëû˘x›J)ÌŜ \ëp~Ag:ĵÈîZkŠ.âòÎô‡ğë#½vÄcÚ TĊk]˘(ê.ñ7ѓŭÑ.‡êDûàŽ#Ğsô[éŝ’hĤŝÑ.Â\%?j´÷ŒëG· HɝÖMúDLëĠµIš—ŽùñÄÁ֙;ĉ ó?² asŝÔÇi³µ£ı`ä#˜¤Î‰Ž:UÇ&µfÏ6Ġƒ ÷Aí˘‰÷ğ|'c´uq½‹—ÎáoĠċU‹UêĠâW•M"Í4Äß^–ĈûzrHDlšjÁfğ]1_Ĥ{÷DYôjE Ösê uÜ%mo?a5í³pŠi}:òRTk‘Ħ7Â‡í¨‚U–­h?]sƒóÏvħ½ĴËì­[LÊ˙ڐĊVÖSY>ƒôŽLğ?ŜŜÎĦ:4dĥĦÛÉxâ">H‚@˙ 0-ĥ·È’ħ7$¤Ë篰ôĊŝĦŬ_*˘>h§ğ"~µXäĞû1÷ñÒyŸ—eú,ċxgÉ_Ĉ Ylµ$Ûp°ċÑgA_‹tSm˙8\§ weñ6Ró֑|ġK#w£˙7péendstream endobj 444 0 obj << /Filter /FlateDecode /Length 2159 >> stream xœÍZ]oĈú(äG݁R@4™ï‡Ĝ‚`³Ğ´ğAàµhŻZ™rô‘büßŝž’â MR2m…dÉ3÷Ŝısîı‡Wŝ-£„eÔ˙ÔŻ7÷³ßfŠ3B-Ï Uš›)*a:Öú—]‘ŭ3+g”8#5uÙŬù ³ÛÙO³oß &³ğ½÷À,QÎŻÄ:ż eĈĥIÖxÄY|ú¸ÒXâXö÷ \½‡+J”ĤJœK(JĊ/”ÑÛî°pèĴ~ııÏ[úĝ¸Íqšëly;Ğ2Â2%a$3\İdĥĵŸ}È˙<_(îù~}˙°)ê÷Nċċġ}1˙eùŭìÍÒ’ {V{cŒHçĵ·üpŝ'~Rr8$q‘/ßŭüĉ™á@0J<ÍL1)ÈUĠÑ#Ä4ĵ#­;ĴD˜3#Ĥ듉 ɕҞaĤÜ+ŠúöÓèÄ1#‚aByc›(e„÷lsâ+™/¤ġDüŒŞÒs—Éoĥċáz]ç0Bjúîח‡°À›•ù}qĝĵ]‘“c†)-yÇ1sŠèĜqpƒ›Ä…ˆw4ħ41„ŬƒıÓĀڳVÁ"xáò]qĜ­‹ß‹=>â!½‡pxA?­ŠŭÍnŭ€7[dŭÙ§ÀcĠşf“7`|ì÷×wE½ƒáŻ_j’cKŒWG֞mà@p³ë}óŽÇÁ0ĉ.sÒב”@“4-#Nş‘Ž4¸ĦS-›³ĥ2_'.iHĤ‡¸òŞmżÇ.z7•☆êb‰ùġ…îl<œOyÓhوl„äwt@&J´WİáVeıaó“/’B: Êğ,÷Ï?ünİ• <’`I {xGšĴ3„O@÷ˆƒİY‘ ,ÎäkÂ;vqġ1ƒtQĦ{o?oËâÇŭ§b÷ìpÑ6 •’h_°!”ıJƒ(F)˜ó€8Ŭ²ĊMY3RŒ;:ÀÌ ÓGŠêŬô)ŭ¤GÌO†8‰‹Ç’#nƒĠ£³ÉoĞ7• 9u8˙œÀbûe8Ż`—ĞYŝ—~ĉ”ÚzIÚğ6ÑR,µ™ ž§`Y¤kÁħĜ‚°´V:JDc•ÒñŭgĝSħYŭz³=–‡ú#fĈµ îAë&Œ!1÷ş9ÛíşuÑ#]@ĤœŠÚ`+Uu´3b~ò*Hœy‚’½OL îE¤ŞÑë˜@āĝ7°âĜ(uà’Œ?óԑpGk€à,kĥ—5Žğ²İrÇSŜˆ‰½â‹Š×îHġWĊ*–†?Ü 0 wFCLŒ€²Ë,;RPb°pÉĵñ³Œ¸˜ L*p·Ż*ïbW'Le•z˜V~PĤŠ&UŽH–gÏ ô£ÁüI°}ȵ„›'(şá´…ù•}Ş˘1?iÜàb ş˘Ğ Ó/ébĝ$]3-í‚4tœYHÍDCn^ÖTѲaÉ)ħOçâ³úE%§5İŻĈ;\râݤ²Iß9p&?FŞ:‡ö³w›—ĊŝPĴÂÓÌI‚ŞpQ£ Ž$kŽqvœ†&e“¨zÜö4˜è`‚Ç(İäd§Ž£8f˘Ž£üÀŒĠMoüµ”Ş_Í+ĦŞ|İ5I¨—ZnxZşKX)šîÖÙ´ğ€Ö™è.^ħ‹îsúhwÜÑİw†W7at0â`rĊİPĜWí-ħ‹Ğ^ M˙#qŠ'ô+ş°!/Gç˙ƒÒĞÄç EġÄñ˙°ñİ×èı_ĞÇĝhWÖĞ]3S†¨ĉëÀDê $]tÍ‡gH(ñ9-{z> stream xœ½[Ŭn#·öÒĜ‡5ñìoHn‘›$›EÓ&ğ.zá Zyl+‘%­$g´y•^_£˙Iy$˲ĝÂ҈<ä9ßáùžƒĤ&ƒĈüù˙›“'˘µĤt ‰ µÑ0V“v@4İ5׃e7ĝ×`vÒÔZòĥуĞ=fœ\ž|òâ5#|pµ²k°š33Á,ñŞĈOD·µfa^k…‡ħR‹š Ùg7XİÁĤ>œËÚÀ˙ß 8¨â]ë–ĥƒ³ËÇ7ĥ jĊ¨H ş œŬœTëÛġ|9Mëïşċj>žŭxòêÌR7ˇ.A˜Ĵİ*—ĝ¤›ŬŜĵ[˙şèŜç·³uĥĈCÉSj)Èż­Ŝ#ɄlĞ(1òŽÒ“?a²şĦŒgÈnŸa‘€ĥŠ( •UĴn4ïTŠ ÎäßXò‡@Ù* ´FçĠ†§¤áĴĞsòTPQ7 ­È‡³ż‚ÁĤ1œHfHÒš+ ê§TÖ ôìì4h­k"kLnšşĦ¤:ğî†ĦêfCbž6ĴòˆúŸHuÓ­Żçu\‰`Ó˘ċÔnÚ2ŜbXÂ\w8S5o•5Ĉ,ɁCɉzîW6іÛe·]ÎVngZÓjí80żŠê˘[—“”Ŝ?#Ġeúĵ1xµèĈ“çŬEjöeżT‰yˆ°šÌÒ¤ġġd•~ÉÖ#Ä(ݜ6Ġ•5²˙û˘í36ԕ5˘&ú´c…Gh,3úžÒĝäK|R¨Òf‡(hŸĤá·UıŬZ‘FpyÀ5Żeqòi(éġZHĦ[3;ÁĞx͔Üa!·Ï(Ud Y$ İkÖÊû,äò·†×”“;27‚bKZ:KĴĤ=ëΜ1Jòà„¨ÖŜTŭħϘ‰š²Ĥ ÖìğëùĴ;‹ÖĴ¤Ĉa|%Sğ¨ÁnàìÓ`>NÖ×~›„UÌo_‘êçÑôĥ[%ëÒ·D™bN&İ€Ç)Wâ5%§jİ]‹è Òĥf]É`‹“(­ħğá)×PĊŞŻ'ŬԚKVX>ìOÂò­~Ëlß.ÍŜÙH idı ï£8p“Ġx:Z­™­ğˆ˄Áxht89Ż~Y[“b,oĞÙhêƒyĜ@Ċŝ½yŒô“.›‚s¨çÚ§‹‰-i+£GáLç[ƒÚ1ÙFCûċ§Ÿ†ċxġóş7%aÛ@Él‡a2z?Û°ĵšv=E1'“˜#dÄ@ÀsÈü“²û£m™qCJ™MéMd„4‹ ÙltÓġá…hVŠhèV“›ĊÔn†Ç†TóË˙YUόkş+˜ÈL&ŞÈLLƒĝ‰’\0ŝI.Ž3_#ÔÌÓà iÑeĜ~dö\+葳@—·ÓéğmÒá&5i˘™ħżŜ‘àjQ}¸M'Ϝ=”6{ŒÌŸIŠ‰Ï 3Œ2)u&³¤™Büİr³Ĉ*Ô|·YÛİLÜ\F•ċÌÛui?YÜtĞĠè*˜'üĵúxŬ-ğ _Ġ#FoM˜j¤MĈ/:¸‡e×'ä(˜$ö$˜(d£'s#žÜçRċ#uȐˆp8Ù0K•qŒWĈÂĝjÇ´KŠdŠ#™lìġUĉ5Ü)“<¨'³ r!ĠµYHċĞy0ĥbEĞ(zëĥċvŸ İ ÎÄxµ` >I™’’‡ÙE‰­ħ]Y!Kˆáħ•>Ħ8p:ČYħš“È'{àÁè€S…ĆZĠġOR4Dԇxd, ßĊ, âÓ³PÊÄÖùŞU7v˘%А˜´™Z ÁŬġ×Ì$êÙF“l£‘eސ½Èœg˙¤…–:ċž˘!‚™Œ7 Ċr˜SgÈ9Qĝïc•ÑŞ_–£ñÚùRBÛŞ[>"¸e=PĴHY°Ëîö+FlĦ)VCKn +ŝhÁݏ} áÌHÌħFÙĦ‚AόÔ(Œ&^RP°Fİœ¤ œˆWƒGJäÚiêğlÎ-T§ÓҗşĉoÖËÉì*/²l! =d‰è“CÇÛjċ}“£=ZġĊš„ ˜‡˜8ĤÓÑı€µ?Î4A 5+ŠE½ˆJPêŽ*T°ñ ;èçäÂİf İjîÌ ĜùÖ{Ŝ§•|%Ğ+ìş’=wx@h‹RĴš%ì“ Nĉgêà;SjHš"3FŭÖwÏtÂ`ğ)…QBgH…yGŞRˆĝ‚…È#÷ƒ”-bAâÇ)=Ż^{p ݐ9HE ÷€¨9†{½'Ü]àġBAÚ·€R SEÌĦ4óL5X‹U°_ĵOşœLğ"]µIïıĜleŻ8ĵ9;{ÂûÌ3í2qâ†=äÇX^²Qŝ³YwчuDħ@ż-Ħn‘\1žCí§€5PRĴEZIƒ3›WMfĈÇhʽ"z´ÓÚíöhç í‰vη;Òâw\ĝMèûàÈm^à+0ÊWöJÄŽ–Ò áu²z×ŭ²îfĞI‚7ÏŽŠm\×A+mĈËvdÏ^™É%™Şŝù*˘4 €óµçaEŞĵê†ĤJZ9 Îg}(Gü6q/PĉH“šÂ÷Úy‡ĝ^›,J„d´÷½·7ï]óĝ fËXT÷­ïïD5=ŻéÖYÒX ħ•ġè*sĈC¸â˘rĵÛğ|rv•Í gË0Š·9v~ŜáqSˆ½EQ:>rÙ"9} äѝȕċħ‡â%‰T‹)=¨Â3Úy‡xFŸ¤2 î¤+¸Ž‹ÍĞGÁ6ò•\aĦ9:‰êNtŠw ƒ*‚P‚·á䈐‚ ŜG½%İŒÙ5ò›ŽŜwÓ'‚)­âP:Fŭ'Ŭ ’cën%µ¨ ”žìm5·UÀÑô³0è‡Û lègqz j¸İWt£uwñvĜn„mîÜ£„ÊÁġóˆ`ĉt5—1„ñğL!ÌĊÑ#wZĜ~ŒêQÁÎïĊTû0hm˘œcJ5žéÂçÙy‡ĝ<İ)!KĊ3L­^>=ĤÙÂÓcTy v~LŬ9îÁ4ĦU˘\úKŞ„İ;g˜†y‡cj^Q1ġÖ'a:}*LÓÂÓc… v~Lƒµî4˘µ‰rİĨĵĤ=RŻMÄÀlS™ F×£Ġğ‹îrt;]żKìĠş§6-ï=F9¨`êİ€…°İ˘È9¤ĉvCz IĤ_²ÛF˘ĥ Oß§ çMġ(”ĦşnrGìĤäˆyÍINËp Ëi‚Á?i“iBZÚkÂ1JEC{–ŠŽ`ÄĤ„tí Œâù{·0ïàbĊ*šñNÙK@^“LôTú<€ieà1 B?{xÏċíĵ¨ %â÷ے*%p7•˘PŽg*Ÿĉü>Â[kŸĊôuól)‡ù1ÊEĠ½1ï\ˆKS J)í!Àç%Á=¨nƒ?ğİù j 2ż‡žr‡ÔB€&\ğlĞWzÔCôd7oùC/ġpD‡ûŝû^êI×6ïıÔs§Ë‹Á(*sE— $dœ„6/£¨[ÚĵÌûô('˙b=ï—÷´z ˆ"ôFìÓꕽĵïżƒ/jnú8ĥt{]M~vW¤u”úiêġz{ċżY­ÜŒÓêċ@íiûzc­ôŜ\¤¤è^1ŭ}Íí3ÊvD—í4Ûï´píXâÍáVĦ·† ²@Öċj‡£Ç4vJnŜf•7;ĴOà)…`˘şİo‡ĥ„ÁR ˘76|ä†6JۚŠċ‹|ò˜Ö0FjÓp‘Ó³ÍI·/Ŝ{ûÄ4fİĴYÛ*wuÒnŸQ*ĥFˆÉdꍜ˜Ž°{ÚÄvP?ĵMÌܵԄŬi‹qk ıĵÂCYŭÛׁ”ëo'g²T(1ĉ•ÄBFhÛÑıÖ3^gĊĥ.òçŒ:éĦRêD½ŜPÄ:µ ù=·Ŝƒ‡6²l=š>žûü'QÎĈŭċßúÁíÍo(í·5›ûj[›}r8ï2ôç7îî´ssé4Ŝ‡Ž ğRûG[XGÓÉ(k$†è[ÖÜ^íëÏh-Û'QĠɛ;R;Ai|QrpÊL{ um5”ĉğXÂ`‘@î? q#Ñp8xMÜeSáß]^Ż× {Q œêË/Ĉŝj ÑĴ^žOU.n-–óğñşž/Ż^,F!5úŞÛê'İÏ_Û[__Ü^îÛĜ·E£ ”(·ĝê⢛şŝEĞÛn½îâÛ0_ıı“ Xµ´Ħmcúĉf˙›§XàûEšf=˙Éyˆ²§żĤ òàaŸendstream endobj 446 0 obj << /Filter /FlateDecode /Length 2266 >> stream xœĊZm·úQȏX¤ş*| ‡ït5ri8İ}VZ>I+jö,­Mo˙F‡Ü7îŜîêN’Q܇ەÈy!gžy8ÔLjˆ¨û+ŝÏîFG’Ħ†E$#ÒF’rN@E`Xa£mŭ=ڌ(ħZ(j£ċ#fŒ£×£ŻŻ8ˆhıs:À¸8ÁİĈñ†àW`ħĵT ˆ5ĝᯨIá џ£é jò>EÛ%j‚üıĝ7ğ‹^LfDd‰ULE“Ċ(wí„ËH3ME4ıĊ³i6žüst9ñBŸ*OSB4^ÇÙ>K·ĞéšĵJĥğtC^ŬĤ›äçŭŬM² Te?E„m*ü*KßdÛĠfy‚Lq"•l9r=WBë°QB˘ÚÉÑ:ˆKAÔôNASĊŠÂ+Ğ`‘ˆ–˘#Z´ "_ú/ŭéñĦŒ"Fƒ[…·ñïÇ@µñ]²ÛM—ÉĝB2I(q¸³Ċ‡:ŝ÷ĝŬäÇ`¸J‰2^Ž&ôRPŒˆ·ÉÇŭj›Ì‹ ]}ĝŽ>Zo*‰ùû·Ċ£ ¤Ûéé}ĥJ7Óu-tĈäÓ}ċˆŠ³ú x¨ĠoçÉbş_gµä`Ü_ŝúÓċğozòÂ1âûâŒ&’ëÂ҄e1ħ)=pŽa\rÛò.· ĥ.o8GĥßnvĊĈÄS|4Ö?Vá—§‹ò‘ç˜ğ×m9׌p*–/ÓtıNÈŭ6Íқŭ‚|żJÖóï’ŬlğşÇyċ>ïrꂚ Ħ˘‹jŻç苳‡iëC(ó›ä^pÇZrÇÎhŒLoq ]$n>´€_ŝM|‘lQRžXŒ4‹17UÈi[ zj‘ΈĦM_P—‹rĠ·šŸl%‚½°şie#—Ž­e„†BC°Ğe•L Í gġÜ3TÊúg´bM 50ĵŽ54†+}¨– ˆ?:ŸÄzx°˜ıôÍ+ á„3d[t…ċ`ù‡.¨”„qJM1äñÓÔĈfĊ"4GŸ_WÙm]ÂD]šNċôMĊğ$ëÄĊâ)¸Ó;£ ¸ÇÀNż‚“9°³ÍŠ3ràPàu|*:h #<4¤Nwdv;ŬNgYƒH g ƒÏŒÁ ·ÉtCÉ)ÌF‚lÊ;ƒ×DoZy F¸Ó [kìΝ8, 5…Gĉ” àp˙Œfî A‘ƒ°àLĵѨC8< ŝXċL=(SÖ/ğƒŞ"ە;e‘(évÎL"ßĤ|ÑñMNYŭ. †`}ޞ‘oWÉż —ĴÑ!ϕ•ƒùàš³ĉ°/°•l€sŭ3ZiĴĉ­náÜ!˜~,Ì1íÀÈ€ıvcı„½^&d‚Ż|áċèĜĝwë$hâǽ{ k‰ÁŜZşx—Ò„&Ċ‹UCév×ĤéSE4=ÓÑçRÎ3İġ$ğàšĊ(Ï5ŭsH5Ë/oËyÈQżX'•ĵy¸<ŝ#•“OŻ71'ŸĊ°ùäùuAgċ^\=ò˘°wB+ài˘ŽıìWprk„1ŠdCöDÂħp‹ŽJŬ~ŝCŠĦ’“şĊuc(݇üÖÜ]ğġ‡Hûg4cÇĦWĉpŒ4@q@úħ èšħŠħ èb¤ĉ-a6ĉ/Òm ›÷Óه ñŞŞ ¨/Öé|Mvğ›4ŭ7OqÑ;òrİàîópböÏh­ş^Ĉ>>34½òŸ•?çeI¨â—%Ħĵó]–4Ĵ<6•ÍĊPzύ P5ó„4ïÑ 8ŠWħ§Ĥyżô£ƒ !—ê˙šĉmċĞu“B!i*Kr…JXĉ {Ñw“ 7K7ÙtµÁ³Ôûü˘ßAċ0‰âÎëòŞç‰Â:N bt`Ô­,*t˝;QlÓŻş_'ŬwÑsÁPt뤿5/;v ½âEÇNù%;vÂQÚ²§ìbƒçğèGÛÖèòÊÌ·g›ğĦĈ%µĦ\dO­Ùí4+ßXı*ğâ+ñûĠŝ·è֎GŠ€ÔÖw6Ŭ €ñ Ŭ^ŝµ£Qendstream endobj 447 0 obj << /Filter /FlateDecode /Length 2988 >> stream xœ½[_oıò!„ë]6˙L›—Cs\[4ğı‡äPÈÖÚV#KŽŝ$ pŸ_Ż_£3ÜD*ğk[ğ)òĠ.93ç73scN˙ê˙ŻîFFZNŒ-”k.%3ëp?^•_Ĉ‹gŜs!Ġĝĉ3F×£ŸGß½–€×ÄӞ&Hĉ%MÀ‘j N2îUdĦ˜wĝöò²zücĝœ#Ž"}AXĜ¸ŝïênüŭJ œ{ĉ0‹ëQµjkĊ¤[!˜ĉj|q7z[üîä ¸ÂĦx żžœiĦç˘ĝĉ—żżŝË7'ż^ü4zyÌöú2–sĈġN*Ég›D_V”òĉ3‚vj2Ĉ[ĤÍNM’ÔLƒ– ސhރCRċZY4İ9Gš8xxZµ+Q תD<È1*Q ’O‹É]Ykd1[\Í·ÓÙâ&0Ċújy_²½b+–Rtmħ–‰ DĊĝâ_‘èSéŸ́…Œâğb³Ŭ,W³Éœ½*Wëċ"!”Ì óÚĤ<í!2ĊÀı”ÜĞÛċ˘ĵĝ|_öU0a ġdí£bĦ3Jċ*ŜÓcÖx-q03’;<Lj­,s6cħĜŜ]–ĞıB˜ƒpžÎÀ)Ĥ\ĥ…˘JYÈȽ;9V'’kĤxf&×ÛùüE_‘ÈY%d/^˙eeH-P·"WĈŽ^â€F7İsXÙXí3°Ôè·ÌSqރüy „cSÀ F7Fĝ'ĥÇĴï^ƒA¤cĴ Ô‘0²$Ä*‚`’œ)Gldqq‹^\âFxW”‹@ĵ\ÛğnÈğà'‡^wċĉv9e;ž€+Ò1;ç ‘LȔi`›ÛêŬĵašŽr2\DÂÄVvä€6&]c%*ŠnDq5Y„\Ğ-.Ëê™sSl×eBéŠÍ’žÑ¸*Vċf5+?îĈâ×Ûĝ\ñEûsıZÍîqOj∇ËëHÒ &Ĵe?Ĵò­¤E8Ĝ&ŽkœîĞ‚5…(Ú Ç’¸É#ċ;"”Ö ùùÀaŭĠŝ|àyù˜Áyß@;4N£ż4cac'…ĥšÒ>p:„²)“^ħ€ÇNe䆋¤e r…ôŒc#Ô\ËGVĦOÈy H ùòmìH̙œŜğ“FÔÒzĤäŝHad"12iGÁö§\’·V z&};È‹‚Zéá˘`âĞĵ½ĝuġ£BĈà\+L’Rú‚3áɚ.Ĥ£â÷M„‰€D÷^ÉNÑ!5„ŽĝÚA í#¸Ú0ämñiĥıŬgG2fEPù˙u#tŸ‘ŻZÏ…’ML#`+lM‰Ÿ€ °Ħ²(&kvµƒìÛÉjrµ)Wô•àÜvc6Šĉwúiƒh‡‹rQCÄmǤ— †ŸRЍ‚­…ĥêfö^˙ÔFĈÓòr{S˙[ĴğßĥĈçl^…­ĝĞĈĠH°ˆ–Êa^&íà²}F~’pžgw^vpè ˜ÊËÀƒœËĠdÓ'iFSL}ĝqBĈLÀ'i°!TŒ> }&È&§”Ħ{ùcÑ]‘‹CĴ9DwÊb÷ ùb_[lHÔĞLŝÍ3'¸M R·@äfyòğNTäžYkŠêA; ˆ¨Ó° ŝ݈8<qg0B *ĥÏÈ-Ç&ŽAĊŭQ‘[4˜!Q1!8 *&TS;ÑŞ;vhDÄè2½ñ\żáĦFâı>úçşuѸÍ"ÉuëJrÊc`<Ä8q"e ĞòqĤ“64”Ĉ`Úö4lŸqà‹ŒĥÌ> ;È‹†Ò"ŒÉŝhÈéʰ&\•%⍟Tz Ħ"%ˆˆ{*‚ EÉÉúoċz=9!ΚÛâ†ä Â(ġ(*‹v'haB<•Ñû8Ë4f9‰„Q„›Ĉo²8!Mˆ²ĠE(r•ħWċfğZĴëÎ|¤·£UTlêo;ĞGPħ^^‹ġâna˜›I~³\ŜÌKvżZn–—ÛkF%á7ä:öuáWô­iagġĤ”ŸBš6² öx.SÚÇ|ıY7o…Bµî.EË­ş4̀ˆġ§Í1ĤġkTFì‘ŝâB—ŞÙÔâi,:„mk÷Û¸xƒQÜOŜ·lŠŭÀç4„JÖ1fLèÎg:żÎgw³ùd5˙LûMÍrĦOP/&ìÊ6k]–w:³†Ĉ0ĈJò€ “*ÀhŞ.EÉi[|Iĥĵ/W“uR ĤĞF nkuî x…Ş‘†‘yT €pËo(0Û|VEŬġZŻWËğú›EŸ0ÓĈçż@ěêôT²mngëH PÒuyZ¤[% †’ŻÓòÙ˘¸é44#‚@„qġYÈêQ(5.×ĉ.‹ Ux¤ġqù~wVDqż.·ÓċYUĞĞNSU­ğ8ñtĵ‘ŭär^ŝ'ûj‚¤żh@ό"<{´[Ŝ ŒÔ`żˆÔ£ż… &4ȕpôppW/zK·S|P–¨Ú˜Ò+ĵFF7§íĉ0Ep^Ċñµû2&q^„*ö. <]‰]ûŒ<&qĝŜìûŞ…ÇA5Ċ$_$vŽK€&xĠQ|DÙGŭL3#ÄA £3V:ë]:˘Ë”àWú디Ċ·×_ĜÖħYYŬDšRġĤ³god]üĤpZo Y²4ëCœ2hċĝñFòÎP˙aÖË鴜_žĠö/ĥċfSÎO÷Mo?œ(43 ²XÑí†ó-ŝğ .’Ĉ FWAJ˜à‹óÍò} çµ+J#e-Ċ$Ħóŭöşn(ŜÌnÄUäŝ‹ßâŬupï„WAÛF”ŭiRġĠsŠídUŬ´ Ÿk!Ĵ/N#_L> stream xœµZےÛĥžqï4}NڙPMKœdrQ7Nzˆs°w&v&#KÜ]ٔ¸–(מĥÏÛ×è€ A-=x={ħüĝß ŜfĦYáŝÚ˙óĠäô§"ğĜNÖŝ5)²ï&”›‚hši.8ħ:[M„6‚0Ö­T“çn'Zeš J86u \ÄrżİÈ.&o'Ôߙµ˙ĉĞìñîÒfŠHĞuvv> ьJA”ğœiBİÍÎV“ùĥŞ›é çĵ ËċvY^5Ëz=ŭġì“'g“Ÿ‹”PŬ³Ó-$ìt’1n“İdíJ*™²\ÎRÑ—„ùM‡¤â\fšÍB E”à™ĤX('T~U/×Mı™ž½vşP<Ġ¤Œ'!\§_äċ”YRŠçï›r ጑Fĉ›é “8ÉóġĴÂ3³Öv÷`ßR7u˙esYzà›II„ÙğŝÛeU~Ӛ`z^İ˘*Ż7-Ħƒ˘pÊà;fHĴ~ġşœ7=Cġùı–kž˙ġ‹/z6u'…Öyµ|µ™Z<2Kó™Ġ}à,˙0µOÊĉî£q¸°ù7ġ|·*×ÍÌ;PGó|OĠQYLܤ hž"ŝqúa…à€Ôĵšm·àœ‚3Ëó{fžb>›247eT4D_V³WS·ÙX‘WÛ]8™òóM½ Ÿ *ƒb=!D“×ċĵÚŻË= /òŬyĞerçBár&˜Í)D~5ğ(żìƒÑ! ·ÒZ…%”0"ÛA‚C*”#(÷”rÙ4WÛ/OO=½¸ğó݃ŞtNmˆ–ż;ġlíLY$£àĤ G ĉ¤,×óòt½t~äñFĉW§³ĞċÉôÄ;dQÏ·§Ŝ6§u}Q•^¤/§›òw<ìôQU†³Ö À náœ>gw_’ËfU]Ç´ˆz”ë€(b6AY)ZǕĤÈà](W¸Ŭ7Áġ`ZK²ŠÂx`;‡˙ŻgĞr ِ>4˙Evĥ€ĉÏwUġÁĤVĉow³jù¨\´+ĈùUséiaĊ@c"„>›Ĉ³8 wä$`Ċ/K% y™ĤŜ*08ħA§¸Ä*â:#¤-)R#´+# I£S#ĴÈû'÷Z†Ä2›żA8ŽŞŸäĠ(16NCüòܟhĠnòDċŒÂe­ƒQL\·ë‡ŝHc€ÀT?¸:ġ&é”Öé_Ħ KġßS­ĞD 8Ġ|Û­‚m˘¨h+‘³İq˜ÀEîÖ=BUÙ{, ¸áÊ$ƒT“T*a²UçÁ…ñ…Í6:4EòHŻEÈA~“Lüà–yĤ„g%‹Ò­9i§ŽeĊ@0e-¸ú~.ú¨šè24÷§SŝۉT.§GÊİCNYT¨Ê¨x–mÊì—l=AšħN-›OLÎ[Ҝ8ßÌcÜ>0(°Oız­%Œ o°ˆÊ”Àżżğ ġçžú¸İQ2dT1•šZ‚ÎcgñĤŝPşpÈl=¤MO$ È˘×2Ö\­‚ê!|!ĥĜ.¨ĵÙaóÒUe†Ì_ĉ³ĊbSn·ŻêúM‘—Ó1½#íYbT/§³ި^ïZ(xçĊ-N ġŽ}şĠ`; ¨vDñˆRni˘ü#WÜ_ùÀm„9Äùo,%w¤x'ŞP)ÎD˙˜½3=K˜ċC&*7[v$šĜL †tĜĞP ?+‡OìÙLBñR&6³„n–#ä?Â^Š!ìµ`ı1<šW]âF –Ü€cĥ¨üó€aC&Pġ"ĉŒ.HoŠ}šL!ċ€Ĥ·ċÖİLşĥŬˆË@mÑ-ĝ´" $}ĝ9ӌÀżWŭ NJ 7Ĥ•ħĤ3Ğ`:ŻUÙ\ÖHħ­‚+mĥĦv„R İR÷z^´ĥÈĵ={ŬJÂ^')ƒkžHÚ. 7ù-Ŭê ($ žŞƒá^îQÀ(Fu$5)ĴGŜ<JÄÖŞ@Ġ_ oaİZŜ ush=!ú"V6ğĜˆKÇ´ohÛÍú|k\­kĴPq…>Ë ë2?ĦÂj Ŝgx¸…k| íOÀ’CoFFü£³Wï1½½:Ĝ%R£ĥÇînTİàڀBÊì~Uú ìš\äíŞÂ=ÑğĜġ¤*ƒ-MèÌñ ó²êËĉۖŬÛĞrğ!ßï\нz†e·ġŒhó}WICX×7 Ï;Ž~ûŽ4*€64‚ßlKĉh·góv\B™rӆš&ìıJrspú2ÇÉÒĥ:‡P~öÖZxS^ĦèK†Omç›tµ³ŜµŽÏ [³7ÔCô†ú ¸LÌÏŬ#ÑcA%-+BUÔÔϛÍr}ñi"=½É›=„ùz˘ŸÜ|TĵÌ·ƒ 0íݐécÏĥ*ÌĈHıÖêk˘Pb†²çċ”tjêœsƒ}÷8‹Ĉ.™Ĥúpî>İ^2WCƒ$´-üì ò³/êŠ~tNdn;úw}…–'ސ‰ğż$R·‰}Ŭ-‡_hğn7ür·Éä4ÄR^>ŝɍP>@fYb;ëJAĉ‘şÓR€ì>“èVzÒ]ĉZV #‡6Ĝ½+ˆ˘9˘#0E_ĞLĝ>/ôoS’ -­ëÙ[écğ‰ĝùĊò]ıe,i‡EùjwÑ~¤:߆äŜ~Ž!žç~_Ċ, PêĈ"uò~pÂŬ°œİ#CĈŭa×áÁ w³b­o2^›uıáùŭçSqˆÂ{½2Ô|Ö|ĄJ "R|™ì öÓÒ믧şïl÷d˜:£öĤ(|´R=ż†÷d™ù×İbċ½)ÔËİûŽŬ¸ìž¸ĤîmTE1xv;ŞÉċäà4L熜ԍôFĤéqŸwtì.QÜ8NÇV½ßk ›qo%Ò<)ÌÈJ¸î/áŬÁş~ËÉííTkÍNíĜ´àߞJ{ŠQ—ÖèÈİËz]ŝ°[½*ğĦċ4\¸)ßî–WĊ÷1}Ä×áâHIé/RúKߪ½P$žĠ37oîßĊôŸèà>Ö?X”ç³]Ġô”“}ûñé“_Żé{Oi˙Ód iûĞĵ9Òj\‰O|ü÷BñĠĜÇ਄ttû/?>ûç¸B!Qjò°naŝÖĊo`ġ0ÁċşáĴ’ċ"Òf#’ìQğî?ûì•ĞÙ² A~€żĞrÖ¤ü{äİ×£÷żr‹£÷ˆÑ{Ê÷MıŜ‚ùm˙Š_%ŻXê^h0nB˘k†ĵz$(´ñċ•CŭŒŞÔd'.e¸Ş•³ôgqŻK2ŒÒĥ²ŭÏǵœјuPż#µfî5ZħŝEîwtP8$pż-š·# ô,³5ٜLOLúóö§O¤Ŝ\œĈI.ŠI?Éŭú™GÇğótxyW°D×6`ñÉbQVíŒX+›ĤĴŝÜ·ßN…Ÿ1Ü˙Îրñ˙Ġ]ó gž­ŭç Œú-“—Ġ‡žáŸ'˙ `„Ûendstream endobj 449 0 obj << /Filter /FlateDecode /Length 1724 >> stream xœĠX[sÓF~×ôGhRf;dÑÙûӇfh)H<ċ0Œ°ċ Ȗ#Ë@ĝ½ŭ=+YWKIpüÒäÁ’v÷œïœ=—o÷Òġ ¸ŭßŝŽÎ#(¸RpÙ£b\ğ‘#ŻñœM‰œ™óÚ]:>1Ĉ§ŒğSğ†ĝšfÄg# ]%$ñ}í&Ħ3q^9ÏàôµUšƒ 4ŝrğ@S_qşkpb4~ûŒš”pŸ”Z‘">Ïħ6ôf09ĦĵKħ*rΊ¨/ÈánF ÷dˆ İĉ!FRé'Nî%pQ CoPNw‡ ç÷óà˜‚ïĵ$\…AŽǂ ü <’nÒ8™y&ëxiG2ƒĵUŭŬ0ï×j ŜŸ:ÄÜá3gĝKĤ|ŽˆŒ÷½—ÌŽàŭü]@Çüu˜|šÂ-,Ÿ{§£Y|Ŝü¨ĵŻ™ÔíÒÒ¤Ġ¨˜A³e;6] Š =n’ċşĝ ½éêŠš6=<‰î%³n?Ĥ„İ{L)ú†ş1şœ`„ÔbAR†3´ƒ*/^Ÿ§É|9Ŭ~@ka:‹ÇdĞ µŻ!J)Ü[”\­~È Î’S;“s"€B>ó7_ç Œ2^°´Ï&ób̓bÈP/žtŞĊ0hM5X“Ñ,H‚Q&]š%%Jbúċ³‰r:Äè½Ĵ"€]&`ÔnŠ ÂU\úĤž˘} ² ­À' ÊÄ#‰a™)q…'·PçŭOöK>iħQa³ÏiéŽOf…ÑĦ!ÂĞÉÛ ¤„*hœ̣÷p=Jĉ+̅; 1!d ònBŜÑÊáÀjîĠ“cOĝĝ•pŬ†1¨!‚š‚Á,—e 1%µµ n÷ŜÍ ĈiĜJTÔLIì‚úĤ~Ó/ŭ<“ŝ,4#š³²”ċúj™_ŠÖ ê­áh•ÄiLj-şıĴ‚ÑÇ`ZëEÈ䂲Ġ­%ñ*W Jx‚OÁğĤ l£xAÂ/Áb…eÑ?ê,ö² Öżw£(XŻ—Á",7ZÑoq×'qüñuĊú¨fA­#ĥ.pMŝF;F_{ZnÑwÌâeĝ÷fñkvw E–“éNÂËÍ<ݳ‚ġĥAʗ˜>.™û/ˆú‰É ŻVaĠ‹Óê JhġĝfN‚M”V’kóŝxñüôí£.š½­ñMĴT7°YѲî˙F?qòç³ÓΜ;]dħvÛíÑ×/ÎŝêöÍ5öĥıÒͽë>Pŭܕ=_ĤŒVI2jhü]Ç‚wCİ :\ó¨3Y§onfÁ¤•mb?\Ef‚Ûb+rQ•-Oa$ ”É/b fŠ’î1&€PÚä)~:‡ÑûKٍ· Ó4ŒXb•3ÇŽÙ¤0ŭKÁ´1öĥôß8ż=UÙù"XŽ‹Ĉ;O‘RCĈÖ´FWƒcR—³Ĵ.l&Ûk]ïŸùtiġaŭĥ~~+œ½ş,Ħs!‰TEQz,9ÔŜ&Hr:\{W[Êx 5Ĉ£¸ %1ĴğĊ"*.qżm½ÖPĊF1]ÔLĈÊ-{ċü‘–Ŭâendstream endobj 450 0 obj << /Filter /FlateDecode /Length 1629 >> stream xœĊX[oÛ6~ú#·ÀèĦaĊ‹Dqo êè:,MŒCZŠMÇjeɑä´ĊÚßğżħCêJNê˜ŭ ‹<÷sxCßÚ&ĥ£żċsıµn-—›1Ù[óS0îۑċ§óېDÖĈzcǖƒt(öĉÁŽOÍ>&ÌvOÏfÒgXşvŞĴµġÚzvÁgZ!ñħ+5ƒƒ=| {Ààa΀ÁÖ*8–>Ĵ~]µ_ÔzÀ&QXÛÑl ċ˜ò•Š+².Á쵈 …]>–[ûlfRŸÛKzö|mq"6HaÊħàö|k]ĦÇÓ(%ú:}7iîraÏ_YóŸ;ûwA´WÓ—jŸúğ!‡6äœ:v(Šƒ­ú!Ÿĵùâ·I’!žŭöZ†ËĊŽ5 =Cĥ)ÑĴdxQ}ÊUœ…IĵHƒĝFUrei|On–i^™,]BZöʁ¨xUK˘úĥƒFgÀjqв,¸Q‹üó2›ĝ]³+Ħŭ@ŸV)pŸ%ɇÉŭ:TÑj0ƒ>öĊïTš%ñX&k~&ÉPÄ£àZE­ˆż:=›½Z\ÌÎg§óÙó!–5óżÎg‹ßg——§/fcä‹ĥR  Î÷y’†A„Ïût*ı›µoĈÁf*½ —Ş Àƒr7[n’Ë‚s0w[•o’U°Á::ĉcĊĈğ}¨£ĞM>İÁ‘ìó¨Ú1GŸd—‘Îî íûà.Xì‚ċ8Fu4À˜e²ĊêS°ŬEŞĥk2r:²À9•.–QeŠêıó4ɓlìxtŭzvA(´ Aş"<ÖğPWt”ü@Ĵg0!Ösaë…ÇħìèĤċ֏stKh ”÷WJ÷OĞqáÇ"=L™‚ò Ò_‘w hM‚bàdÀ;}ÁšÔŬ˜Ù&JŽ@Ûâ\R"í.0.ÓHr…fĞ•Š§ÄÜ$ÚЍÀ|’żTĈCaHÀ^ “Wè%t(˘›·ç£}êÀèÎċ£Ï°yZİ‘nUŜ`P@,ġD5|)ħ£*B0Ÿ•$Ì­+ñµġ/ ìóñendstream endobj 451 0 obj << /Filter /FlateDecode /Length 2536 >> stream xœÍZ͎Û8ûFv€ħiFü'ĜK²™Ĝ “x°‡d²,wkb[IN#ÀïĈV‘’%ı%·íî‚>´~ÈbUħŻŞ(F”M#üĞ˙'›É׉Ҋ:Χ†)N•›ŞHÊô”9FtÓ"ŝgşDÔİ#7½>aĈd5ùmòêƒ`rz]ú5•'àÒ0ŜRxĊœĤN4 Hê,<ĵƒ•4Œplúë)+}„•"Pêë„yÓĤġżd3}=¸•SGĉz:_M‚Ŭ ‚Vp;5äFr:ßLHµĞò"‹×ô}Z”ùv6˙sòvî_qîLÊm‰ŸVÙ:ŭgZ&Ev ‹u–8W:gŠ){Ò?“ϳÇjÍıĤFQcA”ë+Úş´ĊŠ6`Sñ¨:Xq²ƒ•ñ+{ˆh#ĠúaŒĠÁÇé½ôK°Ħ-§R£>‘żÎXš9G>ħ?fWŠ+Eœĵˆ—Ë"-ËEžĦ·E^ċ/fÌ˙²™† ˘Ž²Á#ĥŻİ@CQšbA<(/¨Ĥ —E W’ùM:ğâR%·q2c0ÚEÄ3ĈàİPät‚K&ˆ+` A6iu“/é^ *-ı7„+ĦA‹ùr◀…/X/"ŜĠù_×Óú²;rZġ= ƒ^ 'w =#Iĵ…Ö2Eh· ’]™v†Uy¸vN’"­Š,ŭ–vŜŜÔ7Îê½rġ[IÊ$żŬß:—eždqċĊ‹àĉğĴşi– .+ÛğżĴÓVeËYŒI˙(ĝĝÌDhéô$2>LC8İ ’Ç‘.ŬŬs&ŽîOŸ8şÒŸ2qô´îĉRuµ‘´êĥħ§ŒÔvHĜœEî)ÏèÇŒcTtHĤEN>ÄÊGÄ_xʂ#¤ċ&$_´ Pe.Ĵ€òO œ°X¤9ĥÛ ĈYjœé)8\A9ǵÛs¸—éH’iÊĦ:Œ|Ë$c€9dLw@NċÌo1ĵË+ÇÂċ€ÚìhÔĴŻĜğĵµµgÉĠn½ŝŽ·ÖĞ’mn×é&Ŭ+‚î Ûò.M—e£Ż $lL i?ё$ßnÓ$éÁ°¸yÄpT´]ÛîĴ#Ŝżi”íêq•ċ[T@^²:ŭùQ–üšç×ÀĊèLwî` $ħÎöĤÇ œäkœ,|j|½[­€•Â\óM!Kuüg•¨Í‚­ûÒOĈ{àáÑŭĈ@Öö "Òx"rJ<"ŜŸœ‚Ë#8@‰g`g䯎`‘ñV‡rCí[Ċ÷£¨´¤ĈÍ+x6Œ$Ġ÷ÛĉŠƒNáSÏöeY}͆$uÓĈ%ŭìŜÜys‹ö³,‚=‰tWìç„ÁîV„˙™„>PXs¤ğŸqY‚sj]§ğ…JEVŻğ="ŝòîVGMßNw{/>wÂîó+x„/ĠéŠ ux8ûÛ÷*ÊEd›3Ák_r„ƒÌĊnEÛ_.ŭ5˜Ĉž[²Š|]ù…C·&´UşĞ,]cMìJNĞ!nJ ŜwŒ%Ÿ>B/£úq 3`}†ħ§ÌĝÏÇ1PF4 ŝi“nw›AFy*ĤàêĦžœ*şrïq}“oÓ9 `5¸lGâ ÖŸq- .%ûĴ…ŜĴqDüċĴÁ$¤´? kĵ…H;…9° ÓG× ÌÁ‡™ƒ1‡cĉĞ÷ìDêŸÑĉ"Ègê’êäÈÏĈœĦ´³*ïâĉöYĝ[SáܓóGWî=ŝxôÇ €½rĵ·ÈOQÚIjıèÉK7qĥ¤7Ĥ ²…RċtzŸqŠiÊìıEÑñ—Ó´Ĉ”1ŝ£Û/ˆ„“ĝ şwżTFò|~ƒŽ”²sJ£ñá˜ÌёžŬüw‚³Ĝm=Ün=ı"-ŸžÜ:r˙›݈ ӓúd_^=h~ ò½Ŝoĝ'ü ~ύN8üŞÎŭ)Ġ™47.ŭ1?7ĦĈ˜‡äşğŝl5Üh÷×r\8…d¤ŒCyWĜw×%¸ èĊ/-tsŽ&:cñ ’³Ĥ9ŭoç÷„6‡ÇŜ`˜àk]§§›Şşġßr-‹ )~ġ*)fxĴêżŒniq5ğ²>^gá,͋ëWĝŸ@[šàOŝñÁûüġnuêA쐊âUYĠWñír™áĵ˜“]ZUéúeó…֐_f6À(A <†Âւâ˙˳úk—gÎí²ħÊżxiĝŬ$]oŝmòtŽ\Ùendstream endobj 452 0 obj << /Filter /FlateDecode /Length 3166 >> stream xœí]ÍnÜ8öhä ö҇=°11#ŝ“³ĜC’É. Xcìe°ı[ĥ{Òny$u<^Ìsì+îkl‘%ÊŬ6·”b"‡´K?UĴúb‘’Èß& &“ÄŝkŝŸ]$81œ2Í@ÈÂÀİ…àjR\üv@Ü“ĉżÙĠäÍéÁĞ"ԄlˆÒ“Óóƒúvd"ÖpE ĉšNNŻ~A'ÇE^MA“4!ċoĤö˘¸0h}>=T#$úqzȵĈ† ô:8e5=dRÀ)ĜŸŞ9JYB :>²2‰ Óè<Ÿ2‚“DPT4R#Q§_H÷Χ‡ÔÀMÑ,_úĞŞÍbœHÖŻÈŠ2ĝóß§ïŜü|PğäA//Ĵ“Ĝ'I£1W¤vÒO‹â˜àlŜͧ´%F yĥ<›RĝƒP´ÎŞ*[N­z¸µ„aĊ´°·–kĊé„aθR“ÓùJ§§żnĜ'$RòÉapĉ/èe£Út’_‹UkÊߋtġż|Qnתħdĵ§ôlğRaHBïWšĉöJ‡uQ¤Sb#¤8şm‚>Vù'h?6Âp`›IpC°žM³Ĉ&8‘c)ħ'R˘°”jr˙S0u™-fF|,¸äš?hÉ&)L/NŬDjjqUú²Ş|ġj€Ú–PA'œÍÛ@3h[i<ËŻĤ_ĥ­6 AvF żnsxŒR ĴĈR‘ÄtÑ΄ L4ÙtH ıXT—ë³)PĈ‘müЁñĵpt ZPfŒğ8…R…”s áşç”Ù°NĦħ$1wʕóK$˘Ôžá Ët[EŠ(¤Ólyzê‹Ñ vIтô˜$ĵ6ìôÜßV˘ÏSê’"÷CQtJ Eİ?UA˘½ş^,³ıż–ĦöÍ{Gwm ¸nQ)8-êD­Ħy> P…yés‚BÀ\Ù&9'aJÚV$ äNċtĤëvuV…´šWıë¨]J£7ëós0Ú5%$B£6ŭı´ĉUÛ½ :\>Ğcï8…ŸÚĤp‚ÊüĵşI‹Ĵ9nıuShcŝk6ĞšsİDuHdŬŜĉ˙Èó‹%tMFb£Úİ.S11=ŭëÒışımVGĝó{•­ÊĊg›EıÍŻ*T´XUYħJ—ÍANƒuŠnTË2÷íá¨È–YÚ)„“×ĞyVĝÓİ jsH£^gĞîҏùœağlè½gYwÚr1K­€ÔhÀOs=Ġè¨ê4y_B+sw#(HçĊ<+ÓğŸ7uǢÙXŜ3ˆêĊÊö‹ŝĊQ9+g™? öÙ³–RäҒ ìŬ‹2,]q Ê|ÚWĥ`Q‰Kû„bA¨İ™]°9¤…°ĥñI€ÈŜ‚ú$pÎêvRô)ZK˘@ĈáŬ–’AŬ\.fîIáÒ;E ³@Ö:Ú´ħ÷UPŭV>"´‰AìbÀlrsċċAr³÷>ıĠÙ óײ²Lkt Ġ38A•wœà syê € ¨Ş·ÔDzSÔqz›CnZŸÜġš‰.Jä-ŠĞ›Ž@ˉqPvaݽgˆ‹„ġž <²WŬŞSÀà‹„:§Uĥ°°míZġ&-v$êrô0ìbÚĝ7盆ħö`ÛÉžèìÜĊd‹(\hb]A,Ie ìBœ £+`UĠäsíj’kÛŝ&û‚;^,=ĝ]bż]W‹dÍG—Uی˘Œa#”žQô¸‹Úl­˘ô;–BÍ.ïáHf@À' ²Ş€ök—ÁÑÛ"KÈëş/6Js=ÀEĥ ĥaĵ”á=ŭmğeç ñÒŭı˙@Fé@R‹;ċ”‚ApSM=šH|$"q#07̉µDz=›]yşÙ+àÓŒÎokù‹l9/ğŜF ×ĝÀ´£PL¨„ġ­ŭ6‚ö£]ÛSêÎëé§Ey½Lo; 7`}tĵµ“ ˆŻòI=Cì/žôNâ i$Ĉ˘‘"0Ĵó,5‹>fĊ"].ŝÔ]|&Á™3ÒÓ)Ci\ʃYbÀE‚•èĉ[íC…Í%sŸë¸' l  …÷Uïŭ/Jw< ’¸ ĉ<ġ–ŒŜ$sk r$êĠŸûd”>üÚ~4"ĝİĒ—füg·UVvĠŒ$áûj&Ôñŭܤmr§cá›ĜO:ƒYF¨›ıûŒŽuÙŭ&½^9¨˜ 5Ç|½|>Ŝû1+ Nĥà=óŸ"›A‹™P÷¨ŝÜ £t‡d?ô‡püÔ@âċÁT#lüçY5ğ´”qé§ûkıv˙1Òŭ"PÌt0 šĥûwġ‚ġ*,ÚY:Ŭ˝´oDDëw&Rbĉ›¸ƒak“Ħߙ´-ğ‡ŝ ²Ċ°à˜Ê½Iħ‰át>÷°êîİŜƒ“÷Ŭ(Ŭ/ö9…Á-DnbżĴ ˙0tš;Q8QŞŻ{żß¤£tż<` ”.áT£ÚÒ”xv™éĴʊîSĴá^téûŭJÛ²|48Î$êM8WùÇŞè>ĜM)ÉŬ£!Ö7 fĉç&móġŸ˘·O$è g ÍÖ|½\”흃¤êz0Ô>ĵ÷ż(ŭ1O Fó…tËġġ<­†}ÚOĦ:²Ż>"ŭKÇGş&X }˃zIáë*/†|üÏí²¸ĤoA„ġ³ĥ°zÁÖÒ`͂‰Fşċç‹eöÓ]dífĥĵgEñw&m‡–c­ZC„ÂJµ3†Ĥ·¤GWjwÙy·Ï›ej{ZÛÇE:˘ôé—ùBm?ÀV¤l4áBï~Żìc0-C‡â’èÔS?j öŽ€(ŭ&ë Ĉ°¤ż]pn$˘:½l?ĵÓh•Ŭ XÛÛĴĵŻ~—"ÒĉùH·÷%-UĈZ›†P‚…é˜ÂîaJ‘ŝÛk3WXO¤J”îB•ĤŞkM’À1Ş;¸òúÛ££zÌá–èèY_÷Fa.e€{qîç½Úñá^dëû(ŭÚ,ó„ĞŽòÜ}‰g°ê›Çd=C"ĉŸħttÌ+†gAĉW÷c>xb˜w֒ó;&´Í£‚(}@êœÛ]ëm[i2ìn’ž ’`Ş!— ŭĵ × zVD°GiĜ9]–‚Úş<Ç,v­3̔]ÇoR?ĞwĦOìv’+\NµŬÊ:qûİÚ Îq^\ĵ²;#𠣍DŸ€ëĥUŜa“zğRż†!BϰîÎ͖ÈŭĞŬ<š·ħú#ĜÓ½ğŻ’ gŜ7ÛÑÛÙŬvônçdż=DFúÁvôĤż}hݐ˜JċSÓŬNÒŬ) %šÈŸœğz÷l§ÀMD…nBĵˏ?üò0endstream endobj 453 0 obj << /Filter /FlateDecode /Length 532 >> stream xœ]”1nÛPD{‚7%á7v"Aäùi¨0EÈr‘Ûgfd§HħFWï-÷sûôòü²œoŬöÇġ2ŝj·n>/Óµ½_>cëNíġĵlvûn:·Ïäëĝ6Ĵ›íÓ·aŭŭgmĉ{ŝ>ĵµíOìÂíî7—ݽŻĜòÚ6ÇŻÇy›ĥL˙}U÷;NóçO÷§êê{^Çêb§êbœ[u16ĈŝŞïyeÜUNq_]Œ{Ċ‡êb|PŒêb ĊR]ŒEĠĊĊĴ.ĈT|Ĵ.ĈGĊCu1‡êbƒDaŞU(L˘ …İBTA˘0Uˆ*HĤ Q‰ÂT!Ş Q˜*DDc„0‚aŒ0§ždh’1W#ŸÓħpŠĊ“,šd!`1dd!`1dd!`1dd!`1d$è ûB`¸Ô l·‚ZmàVP+° Ü nEWĜò]a_È|S€ž¨ëCú :Ĵéƒ+Ż´fàŠÁk­8x8pÀƒ× Z3pNĴ Y%甞UjVIı´`J0)—L &ċ҂)Á¤\Z0%˜”K Ĥ“riÁ”`R.-˜LÊS‚Iı´`J0‰ŸVH)ĜUµïwÂhìÚܙWËŻó§޳ŝu´ğñzmËÍ/xóóÒŝ½3ÖËŞğ:Öĉ/€Ösendstream endobj 454 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4524 >> stream xœWiTG×îĤğeħ]P§Û •h\ĊWEvqEA„Faa@7ÀŬÂ%Š@DqCA‚,Š ¸FD„¸a"&Ĉ¸&.qğÍ[ä=oġ`Ô|çûñïpĉP]Ġ]÷Ŝç>ġÜ[2ʸ%“É:ùİb$&ÌSOêŞ‰‰ĉìĊž2ħWħ·Q:Žk­oĠÉE……ÌŒ™qA/nHçVdĠÚÙRĵÙİ}“M2½ìˆìğYÓ §è˙—4Š˘\&Ş]5“âÜÜ=<µ‰ŜI>K’èÂ}S"”S#ŭ£˘§Ğf,œıhVLìàCž Ír6üëċ#FŽíèä<†˘úRSİ~”?ĠŸšF  lİÔ@j&eG͢fSöT5˜šCıRsİIT ċF9PA”;ċA £<İá”ċM |¨‘Ôdj5…MùR~”K™S ”Ħ,)+Ş3eMͧşPĠ•êFu§zP6TOj!,eLM VQ˘l"!îż;xwHîPŜág£P£kĈĴħĞqqŞñYòTyŬ‰ ӏK&šıĈŽf³Ç;ÚuLê&=MĥšÔ›ĵ2íkmšfúÌĴ‹™Ĉl—ıƒıĞùLóEĉXXX¨,YúYµüµSH§mVĵĠ7V•Phщô` V°[Cô2q äŞñ@98xkkĴĦqö_ħrJŸ2½ Ĵ8<~r ^tSµsB7ëŞ:ħ„k+!ÍŒuóĠŞòë—/œĴÀÈÌ0ġŽ×À¸İá k§ğŒdžĜžF~Î`Ġıì!úcKèßÍú]KW¸G˙ŒÎçV–T–\Aэˆ ÎĠĴµxDAùt:fAqhɜÜqˆĊwi°ÇV8ҍ%êY³#ĠO}™UkÑ:4Í‹ue­‡½g ¤ƒ“MŬ’Li%S7ˆİdî?ÄDĉ_ħ`OÌÔhĦĵƒ²j²ġL‚¸IìÀmzD#@ê=ÚEeĊä%ñyÉğÒÏĤÀĜ€îÇR³SQ"ğ0b‰O”z[ĥNħ,kM֚Cämz 6ùĠœmt!·Ĵ¨ĴhßiTƒš˘ĞÜö`÷3Ŭ#²Óĥ£|öp‘ŝT‘„À …EkžşÀhâëbB‘r‰"Ab/Wa+CŻ[Ÿ¸8*dĉâiÄó‘ïI&†7?볕ËÔGĝ=şĴ”% }h!ĥĊsìFŜŠÄŭWx ^LÉ(˜ûâÚħ–óüîÁòG´<‡÷Oe÷Ûé|€°€x84â_èÑUaO ÷oŜ_ñ‚YaĠĈ4ÄFĤgUópò.c8Ĥ˘‹ŜÀħ §Òb ùĝ13y~˜çÔĜ˘zĵÂB›ƒMŻysóÔÁËeŠÉŒ"}Ğğ^V'ċAĠËaûżħ')^Ż—Á›à'–Èħem<î(òÒĤµ•È ê"ÖËö‘GK[üFĥh+ffŞcĤ'4(š°ŭ$ß=Ż"ĵ\y~I#aú _šĦ/íÈk·!ĥv…Ħ’´s›ĊÑBŽi4J  aħŭé˘Ġ½6ĞvĞí§ż€„;z‰{vqñ{WïD,Ô0aÂyl‹mÇûbĞtô¤·ßğ›X=¨‹Ò/]ĥŠONCÈ#uFZwA0Ù£àċŝ¸ÂE'“ĞÑetîÀİ3H³9-g) Ch<bı1áÁnóÔûËÊóġ³Ġ™%Ûٔğ½Çgösà{äĜ…‰G€£47ĵ{áŭrpĦŸ€Ëcì" ÙêÉo¤^vé£*\"Àä…sÌÑÙ'%Eà^€%8ŜLĵu–Ĵñ>êĵPPĵj Ù ˜àÓ\)÷ƒŬ=Üĉ]ó  b ÖĵiíDUHcÜ֛нċĜ†àĥKòÌzfŽ2"0uUĈV˘/³g}öĈ]è*ßĥoÇwığöî½ ñ­ÖŬżĝ¨Äzמ'‰_°z‰CHf˜°ĞÁÊ.ƒħ‹]bcèQWšwé,ïÊĝÎwŸ9*ŽÏn‚5/žc7˜âšÎş4ÇËĠ;¸áĊŸ'~¸Îês$^4“³IÜ isTUÖŜ—š˜ĞÈÖmYŽ˘Y|ßì ]udáù;ç#4Wáςžiï¸ò Ó ?Ê$R œƒ t}Ábż5(m ~c2ÒĦTäı%1/š…QimNúNT´­ÛáPÖRtüú ]\R]ĵhp. ğ­g;d_“½™ ´{Ŭîeğ—eĈ#ŠNÓ¤,[ş|ÉÚPÄD[ĵGŒ7Hù 7´Rġ[c ϭȈdJ f„Ĵf²*èµßH|+náP²Ê¨²ÀÚ1‡M$[gÜË/Ì; ˙ç’WÉ%äßoFä°Ó+îU&'û0üÈŝ`ô¤—™v÷<Àc:_Ĝ³Ġô8wêXóóš‰[Ä1Ò´VϚ$Ï"Û={EǤĤĈĤŻÉĜœĤÀĈLÁúcôˆŭµ¸ĝ!ßzġ“†IAÁJ‰úœĝšéî‘ċĊmŻ˙I’Š\’6‚ûœĜôQRŬ™ó߇ÓċàDıLP9Avù‹FşáZqÙċ“‡âB¸Í0ógħ3ónòLy‘‹³bñ™Y‡ˆJYóEáIÁ3ÙRàïéI5•‘öŬÔH< •ölŠ}ȟ)ùv“™8Ž|zĴúëü ħ5Yrĉħê£ ^=A:ûÖ÷ŝO§ŸÀĥ²ĞĊĞ`ËaÛëäíż’ÁßZupOYá·%è. ½İĊCñħŽ@÷FPİċÀjóY`Ċ’Ş‘âĦÖÌFħ(&gİ^[°ì,ݧêñâ6ô˙Ĵ>Žwì@ĦCGçefmÖ£…úċIÚĊşEq‹·í'\N:şşġ¸âÈċJġÁ e+6Ĵ]!é„COœçŜ{Â~‰RŝV&ÖÂU­ŸXG$,”˘´Çĥ÷˘fb‰E*,´Fs‘Ï˘P˙3“‡!ÜaĞ]_™UîĠ¨ĵšQ]aċċ²ZŭŬt]úPu.ìşG‰‰Bn\Œ-Ùùmìöq¤ŭpY56M³4,VŽ"‘&/xùáU·Ñ3tû½‡r+ï+#‡^"ż Ò%éârm9İjs˜DG×PlA²%!.Ŭ t@˃ž,ĠLé²WCï.Í׿½–ŠkÑï$;CâAx਑Ĝ~ Z•‘Ş›½ô%'^) uƒ‡a#6sŽœ²wcĊ$İáÇó^ĥj^ÊÀ:ŬÀó¸;ô3[xˆbP…>Ż*ƒÍĤ·<Ħ×ehêŒÔ-=´YĞrQ ‘L˜‹“íJè£YKyÀ ×üĝÛ+'¤&Ĉ#W–<‡/O‰QD~pgxî(ÑĥbĦ‰;…27î[srĊá(€ġ ™ïçUzs÷˘3pß§_ı Àà?~Ċŭ¨ÚħßñÖż\;~°ŞŜLFÜĈ½ÇxjšèAh ğş2›óĥíÎ),Ê;ŽĜóE*·QNüÊvyŜÀÊàûöĥç7QôÂÎäŝÜĉ!Ç&P‚‡“ÜżĊà…ÀrĜ—_8ßŜšÁ>0zGԋ\•È·Ë[çrm–ô”6^éÇŠò*ûCĊœQN!sÜŭT…ÖK½Á&Üé™#(ˆ÷CŜ%ġyÀW¸Ûĵè•1 ĝ½`'‡Ar êO¨W ˆ‘ÊċħŠ[}"}Żî@äŸ˙B#¤ˆP·0„9„-vŽ/ž~ÜûVÄÏdï>żż'Yëċĝ [L‹H á7ßFè›9WËJÏ£*´O·{>;ÏàêËçŒ<ÓwrHÍíğ•µġ|{{û½Ô~)žuD2ŜÓĦÁ£1§ñ ìKכŜ$’ç!ìG—??’Ç|’F–4ħQ`NŝTh¨Ĝ•Û—“µ-kÇĦƒğ* ŒßŬp÷Ác°ħgAèU•Âúsˆj–£ ĥyƒÀîÍS°ùYUë\ݰŝÛ@"wB9sVH„ŸoÈwçj+Jëxë7Qħ"x˘gÈ|OÏŞĤ•'$˙ˆ3Ŭ…ûÚÀvDßBçâ£;róùœÌí™{°¸§ÒË%Pu°|½â‘8ğ^>Ûi\HÀäÉág½bh­À’‰€–•(Hîgw˙­%Ú½b‰ĈéƒöÒ`b}Lßoߒif}v˜™SÔ˘cendstream endobj 455 0 obj << /Filter /FlateDecode /Length 617 >> stream xœ]”=nÛ@D{‚7İŭ~LÀĜĈn\$’\€"W† S„,ı}fFvŠC`D|o$ìŝéċùe=ßşŭëeŝĠnŬéĵ.×ö~ù¸Î­;ĥ×óşŬržoŸM×ùmÚvû§oÓöûÏÖ:|ĦîŭûôÖö?c}4Üš/K{ßĤı]§ġµíû>žNu×Öċż[i÷'Ž§ÏŻJUúWTĞ Şħf½§FևŞàîëXTŬĞ‚:³.UA]X[UPj"Ó÷¸˘UAXUA=°°²²°²²xUP5Ş‚ĴÀgP“ĝE … ĝE … eŞ ê„j 2Qİ D&*#•ÈDe¤2™¨ŒT"•‘Ê@d˘2RˆLTF*‘‰ÊHe 2Qİ D&*66ílÜÙ°ħigΆM;wĥSUPñ‡xtLîšŬ9ğĈeä4rĜ¸ŒœF—‘ÓÈa2r9l\FN#‡ËÈiä°q9. 'FÁ˙Šw‡vî QİD!Ş U€(D¤ …¨‚T˘U*@˘ RˆBTĦ÷bÎÁ‡vîÇŞ Y1yhöàìÉC³gLš=8{À5äôM¸ĤfOΞpMù&})ߤoÂ5ċ›ôM¸Ĥ|“ הoÒ7ášòMú&\SI߄kÊ7é›pMù&})ߤïˆw2ĝQ(8❠*Gĵ“9ôBŽxÉx?H5B}”~6;_  f_gW7\Żm½éÄӉĈƒìĵĥ‡âvÙĝT‡ìŝsŞ>³endstream endobj 456 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5977 >> stream xœXTTW·p‹ uĈ Šf{ħĈBbWŠÒÁ‚H”""UššƒEAšQa°`AEDħE,Á•¨ħäûNÉ{玘ßdċ­ġÖërĉÜ{vùö÷í}%”NJ"‘ôžëċä0gİ‘żŸĞJ\. ğßàèß5á4ê!E=t2ĝ Lú@Z/0ïMu‘Hœ}çúŻ öô 2?mš‰Ħk ĦĞÊ0Xµ>xŻw —ûZ˙5Ħ†sĵƒƒÜ]ŭ ÍUnĈ†³}} µ÷¸şlt_kl8×_ċá½Ö]äíêküß:M¤(jÑl•˙ıëçm˜° paY°ùF‹×Mk…ş-ŜĵÖÊŬÚĈÓËÎ{Éş>ö~ËFġËŻZm2>mž‰û&MŜ=ċëİӆL:"e$E ĤĴİiÔʆJÙR(;j8µ„A-FRöÔ(ʁM-£ĈPŽÔʉšKQËİy”1ċLͧĈQ (j!5ž2£Ì݉”5‰²¤&S‹¨)ÔbêkʊšJu£ü¨ž”ŠÒzQ³¨ÙTJFm§äTĠ—ZEñ”BéSŭ¨ŝ”C  hŠ£ĵİÔb’²`E‘ô”ì‘ÜíòM—£RZê/mÖŞó íC1şÌZ&•ıÎ`×ħ8S.…ğÒĠ°ĞoזnònQŬuß=½{{О}zêvѵÖmê5ĥ—_݆Ŝ#zÛġŜÑgp˙>‡ed²›²rN>@n#ß+o’?ì;½ïŠùürBŻ·^¨^‰ŝ8ŭ”~]úÍè÷Şż²d˙(ÖĠÈQ%xÔŸ9’XÍp)”kf8òĈ6Š^Ž•ĴEò–ô°„†hĉ&^ħ8Ĵ‡T²Öi8NNƒù¸ˆĈ+]á *äĊͲwmàŬĤ/Ż)Ò˙2Ĉ9ys& OÙêĵòԈğ}oŽg³›œhO²µ×n(eß:Ÿž´Ú1ÈLq֝•·`Γö½˙$;íh]á5Şž“ÄJS5y7ĥ9Ìq^˜G£ĵ+Y³ñÙ0‚`‰‹0‹#Ğ;+مiĜ.‚%¤7íĦáĠnlCÌîH<ŻÄú°&%íâNúĞ+ĵCj(Ĵ†ô²?Á†_ìŜèË˙S˘=è||VŬQÇnް½ÏbáÛç×AöĈì”ozuàÄİ;eĉil¤o2ÁçyĜ$îÛħqċ̚é£m]qŸ¨H”İ”˙_ׁĥ"İdÇòµôÌj“á‹×`ƒÁ‰;•şBYLµ0ĦZRŜEíRÈ˘x<`ôp< |3 Àà—÷0FŽz(Wë§+ÔaU,Ĵz_–µ·AÒS}ùƒ|Ĵâ!ŞŒħÔĉt[_ĵ­€x9òÍ{’ií¸‹‹Kˆ›ƒRLqá§w´~JħüCÏĜ£y%iG÷äÂÌâ^ MGú'§#~™£ZáN­„$è×wR³ƒ‘óü ö-ş“zíԏĠ/tçÀ÷ƒ>x‹bê ŝ–ÏŒ2ì0a ĥTšĜÒúQ/ !1˙ ĥ·I…U‚?ïêĵӕÄ`–á0< o]ĞjÒöŸRbvóĉE[ t#ËX‡¤,Z¸È˘=;öï¨à&y]Y·-~ Aˆ3²mŜ ×|çCnÁÖ¸"’Ù[¨Jjag­ˆ0ġŝsa§ġċż—è iġ2fóˆ0çB LeÒ÷ÌĠ°Ŝ…Ù2'"‚ĈSa'„‘UZ^™>…ähxGà?ÜÖd¤üzñ½NÊO_ŜBj/Œ™ŻMC[YWZP‚rQVìŜ0îcfîMI!ˆ“—ǢğŬSċéċɵ.;yıĥBÄ! q¨2µq·QgŸ•–èAr%3/ys: ğa*K̝CÌŬ_s3!˜Ùž1–> &An̕żÛ:4ĤJ˜X-ĞŞsğcîZž—/…ׂ7ïħv×*ufѲ‰fÇ}ı+ċ…Í~eĦË \<½mUŝ)™ŝЍG´3ÖcJ#Çž"ÈêÖrŝeyDQà>ċşƒîé^Yœ|钃ŞÜjƒš˘ƒġû÷ÇEP¤Ì£O0ş‹¨zˆĞ„Kġ²ê€²;§/„Éż†½‘@ÌkÙµ1Ŝ[Uäüñ#€[0{ġŒŽ•‹Ċ‘JbŻ­‰Œù>‹=Vd×ĴÀħ'Öż‚9 Äıq•DU¸@jä^>ħlVúÙdş’Ġ…'ÛN ]Ġs$OÛ¤O…i<ÎËġkШٕĦV”³A AÛfĉG–ÜQBŒUħży°ĞÍU´/ĞĞÙHRPY ğ‰)xŭ“ô_yik%ğX›’ƒ*á T.Œ)—¤ áÒìONDƒ!żĦĜŜ.–öÛrÖnWBÚ{öJˆu#kŜċĴu ë Ì=·‡8gĉÁÖĊ§Dšà_ƒ~òžÚZÊPU=,(Î̑K¤ëcgHÎÉOĊzàYÉX„j6uüNW3°E£Cw\b·D˜‹•[É.JŽÒÖJZúeÑëu,ĥëHÀ6ÂwôAìEZ ĝ½$ÇĜMÖħ$^$xŭke5‚^G5ŸÒ—çÖè z0‚‘·:2ÑSÂI}(ÑGñXİfS[Ó 3ò\œÓÁ“G4Ĉ\&$`rĉ“ÄÊʞBjµ ׌çħ ëğË/ɟ0ßĜA†D äl]Nċ)|ù2‘´½žf!]V^ŬÚÑÊ{yFy"nĵġ è }?x·ż(~Ë’!ĦÎ_‘jCb­ É6VèÓq…nŜ1ÙÙw×=ÜĜ‹1ÙĦtÇ:· ğél#Gv§ûV˘ûQ1çÁ§ ĠHÊCô3ݰô7ŜÎŬ)Ä qÍî@ßïQJRB+“˜Šö =ôšwK°ÁèĦx ñ|$ôğ|%çĜEĊĜĊ0fç£óçšwµ|ĠôˆĊŝaġBûIġŻ‚ù¤BÍ<~2šċgmkfá5a ù)5ıfŜ°¤Ġï½m8÷êHCV3ş@âù“Ùë†ÙE“gŻü3Ĵƒ­°ĠL‹ ܢ7V`ó ş€žRn-çĠŞ–ĵmQĈ,C+P`¨ĈÊ[,z˜wş:çıużğ2öĦŭÜaŸ‚¸Û”‘xú6´mUX†Ó>MÔg ?Kô³îj%<ŝċß܉%-Úö}„ 'ży}aìäÓxİoú‡hTÈâ᛽#e’Í}/-7Ä]Ĵl0ĵ{)ŬĴŞ…•×Z*ÀC]!;vßö18>¸­/ïC ´àĈËÇPûÜ=vğÀŬf.=KmÓşYéĉ‹6 °¤œüYôÂ(7gKƒÍˁ½Ó’_]ݍ8œ[ÊÑíeĊ¸[ö˜Œ~ß~—‚’QfRĈôh'ıäÈóûáê³Ò˜ÂM…Jè˘fÈIx_4ßpÌeĉ,7g[[·şZĠ6(ÉnÓù×Ħ×#G#ûŝKĴ&L³Żm8^\~6KĦ+\"qïßü‰Ô^‰(…A"݉hní>ġİÚĦE+}˙6Ġ¸ˆT¤5Ôn S ™j–‰S 4%7@^CÚ@1áo˙]Éc:5bĜìÄĴÄ ôUl88-×2ɢÎ5?¤$Ĥċ£‚ï‹vrGÙmHüÌD>iÁBĠߝġŻ )ñÎ]¨ŭgÎĦÇäĤçñ…É ŽŜŬ‡Œ´[‹{ćjéJ´3[fÎG`eŻ€3$ĊŜŒ5Žĵφ€u>>Ppĝ†>$t[qY‰ëÚĦÌAt4XßÄ&`6ĦËz2u<;)ğxÁù%l}aJšÛ‹9|mHcÔM˜Iż´A·áċŞBċŠûLÇ\ÒݍĞp.¸jpëTŬ£Ò˘¸ˆEĈfÒ2ž†qŒÍ%ğ—˘<ÁÓ£<@êLZA¸4„N5˜oï4z{J†J™,mèÂ>ĴR O:=y ÜXâÉ3_ó Y4.ÌÑ#jô…~ÑQ›P0çS|üÌİüŞ Ċً;n£œ0\ìa´”Ġï$„ñ_z.F‚@£ĠƒZIĉY°xg™âa|–M™žAƒqG#a&&/ÌĦÉĦ„ĥÁ˜tĈéĈ¤6&sF: ġĜr°ù„-iv8ŝ£oX€èu`r”µLĈó ‚aM˘6Ùy°5[wE`#<“Ŝ$ğ3£ĜÖ6 wIˆÖjÎH €ˢÙÉK+\ޏí÷3úŬ.:Z[ĦN>‡nqĊvòާÈĞûBi ,¸l–᎗a ŝd³;C(Eešž˘ÙżĥIé‘ı‡ħÍŝ‹ç?c#͟ 9BÇ1If¤4HkJSDŭĦC·0°Y£Ó˜FNtÛÏ=Ĝĵ#‘YbjzƒöÍ/^ĴlƒUb˙),Lù îùˑ+ZĥÑ|-÷/Ż´ġĝù-ƒüDŜñòԒ­›˙Ċkï/*6÷hİĜĈÎ Ħ_Tì§÷ż8Ġ›şÙ­šŭ}iá˜ŭ>Q azW˜.‡o:ŽÓט(üq58äFZĈ¨ÔܳOÓó<ı#óš”ôË)dCiV"Hp&ÁUšĴ* l|$-ÖĴá]Yĝ*°÷E8á(+{ƒ Ž,ÎÉù Ĉ Ĝ`ï0ƒä‘iûĈ'EèóaÛ)ÙÛ6!Ñy75}ĝ´ô,TÀoÈ[3hÂ<‰JPX†Ññż'”ħŽúá£]µïôÙ%9ŒĴZĴcm×ÓxÍ-Ŭßw²"“Âxg^•TX˜Ÿ_x((_ċĴRèB1ŝIZ@)­ÀßïRŻŬ%ÓäWĉäĵ.49"5JÑĈ D8iŽÇÊ9Äô;_ˆĴ'óġZM?Ìy+™ÙÖ˘ŝ˙5ZùŭèŬ^ÒŻô]Óñ‘é䠐2‘- çĴŜ·Ğ5KĠp7ƒàĞd­8ä’@.%t½Tŝžž…ëKK*-ó?äE”kŽn a›/ħĥž†‚엔‚BlkW–V>ÖȖ[Rìİ.Û_p$ukjÌ^…%³=íB)¨öà‰ú œH€uÂkµ¤²Žŝ,…bÍL1"iŬ€7´c9 !í ‡ °ÁdxˆÒEçĊÉax9^î4lÜ8Çw°œO½AìİGUIŽ’žJĦI|ŠŸMp1ŝŬQÊFmĈl<½žVħ˜JŽÊ 5V÷÷p¸D`.ß/ŭΈı'œ<%ô^ĠèËÁ {<9|ôŒÚôé=zOœ7ß;7¸43#yOşâ#[”U¸Ğqm'—ŒĊú¤%–`ĵ@ıˆ•' n0u%:…@ù „òh¨’Âhg4YÜżùŜ}‹&Ó–3aÖGĞ…—äôîÏÍ_èËWuĝsèÔyÔʽûö*îûL63÷É >œı7iwš˘-Ì)Ŝ]Џ֓ŽĤÓ흇ÇĊ%˘8 ğïûìDÒpȓ_^a:Á|‰ŸJĉzï£è¤-‰1¨żO`°Êñž tc:JùjôܲKS8]ÍmˆnĜŬ yBèH%0üüċĥ뭑Zíœµ2seĉ2d‹.tá,Ĝ']@èÂú– ’èâĝBt]ÎoV‹iġÈÏ+Â`’‘÷­RAGCĈ÷öŽ)´ü€Z! è+˜Ĥ°ßb 10Ĥ.7¢ğ’wùBúNT‹66/İpG9ÑBe‹ËPcK3£à ¤”`Û-;bQïÀ`_ç–`ê‡×À3ċ.6ñLˆ^Ğ8q—'…ó˙šÏĊF4à2ıí˙-0Aïóĥ_n³ĝ§Z|n~{$ôH;€cŜKJí7<ĉ„p„â ò­@† A\™ÎÚÏé†e Áݰ0[ÂTwkëNQ˙ >Zĵ:endstream endobj 457 0 obj << /Filter /FlateDecode /Length 568 >> stream xœ]”ħnÛ@D{}˙@”noÖ„kìĈE‚ ÉPÔÉPaJċ"Ÿ™‘"ĊQäw{ĵġÓËóËrş ë×óüĞ߆i9\ûûù:÷aß_OËj³§ùö™|ßĤËjŭômşüŝsé˙÷ü}zëëŸĜ<ĝ§ÍŭĦù|èï—iî×iyíĞŬ8ĥŬñĜV}9üw ġŝÄŝĝù×mĥ{›ÇĈĝ\È+cs1úîı÷Šss1Ί‡ĉb<(öĉbìŠÇĉb$ÙQ5Žĵ2nš‹q£¸m.Ĉ­bi.Ĉ˘ÍĊеıĞ"š‹Š”S1Ĥ"ċŠ‹ ċŠ‹ËÔ\Œ“"]‹}‹| ċŠ‹ƒĵaĉs7Ìbò†™CÌAŜ0sˆ9Èf1yÌ!ĉ o˜9Ä C† ƒ€aÈdċ*VŻdĠJV"TcTaT"TcTaT"TcTaT"TcTaT"TcTaTŽĞzdU#]a_Èl7‚MàFP#° Üj6AÀ&p#¨è ûBà|àA3Ġa}HT‡ġ!}p>Œ ûŜ“žÇ ¸á= íIP„“И^ÉÔJ&]Ó)ߤkÚ7ċ›tMûĤ|“iߔoÒ5í›òMşĤ}SI×´oÊ7éšöMù&]Ó)ߤkÚ7ċ›”K Ĥ;_Óŭ*^ġÁ}ÙúöuŠ|üq½öċĉ£ĈG‰NÓÒ˙F—óEO ĴĠ_}"úendstream endobj 458 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4317 >> stream xœW T×ĥ­ĥéŞR…N ˆéFPAA™”yÈ$PDe)bœ£^‡è“hŒħU‘D ˘ˆŠ8$4Ú ˜VIEóNġżÍ˙˙6$d­˙×zkġŞşUuÏ9ûœ³Ï.3‚cJ[ħ6;<.=pzXbÒZíÚŜTÀOÁ,\‹ÓĠ{Ô"¤+Dş:h‚¸Ì71€ŭc h,%‚Vdxfdd­JJÎ1[jçlĥ˜üÙ[[Ûü{Ŭ~Μ9f+ ŝ~ßÌ+1{URşÙr’›˜š‘™–˜ž3ì‹q&Û,LëNj\Öß)ŠòtO÷ÈÌôZċ“훳Ö?7 /.EA|aBâʐ¤ä°UáĞD¤FĤMµaó³púŒX[;ûuŽNÎ3g͞3×ĊĠҊ˘Ìİ`ʂ Ħ&QĦÔd*ŒšB…S–Ô"ʊŠ "İiÔbʚú”ò ˘(O*šò˘–PŜ”ċKÙS~”?ċHPNÔ'”3Hͤ‚¨YÔBjKQzÔC*Ò§ĈP ¨ħ”eHĊPbê#Š£ĈQF”1eB§Lİ ”„bİ‘”ÉCÍ £!‚ó#Ä#BG”Žhê í…GtXwġ:têtŜ‹,EE´;½n§ĠL SÎ(YKĥŠ};rñÈ‘ƒ£G…ŽÚ4ŞiTç(<:zôÑuş#u-ukġFèëMĠsыĞğŻ×£ïĦE`LÀ˜ú1/Ç&ŽmûÖ@jàb°Ì *ôĠĥHKäĵLÀ§Cׁ3Dïh|@&Âş4>4˜&ú•î„ üCÎáu4èÂ3‘>߈d|X{²Ì°­Ó­öt‰hqâï5Çz –·˙ëzÛóĉÚĝ@ ŝŸnŜŒQ\Ÿâ•ĉ#˙Ëh­*`ŻÖ) ğTZ¨2ó]@A·˘+GkjYñûÊjÙĠQo|ŒJVÌ7Wœ½öxéĠ†€ü]…à…ŠŸ ghH rħHpŸĦUƒĤ00é§ix!œ?O’ŝĠ5Aİv ùÍÄ/uĦğ7“rڇD&ħÇ"ìŬž›ƒ¤ŭré)`µ ÷↠6ÄşĦ.Žĥ Ÿ‚>èŬQü,.•= (RúTBĝžqüD…f"ñv ÍîÁ4^Ĥxúœ”dl›Ì°•€b$nmĠÖm=ždPÇцsċGOîğı‹}ĈˆĞvmÙµÁ4­HYâʊ[_3ú<Fx7;Vß;f MÑ`šŠÖç·WI½6)…|ŻÏíüÍ÷&Ö#qéÏ œ6§6ĈĤIċù7‹Nä˘D“èèĠËϕĴ?ĵġĥ*֑Ŝ‹ġZBác’!žoċħç-NJ]Žú~“~U™\:_Ñò°2}Ñn‰úhŽĥ+ L!¨SñëBuÏqĝĈÈÊ£ñ8ëéĜÄŬŻĴ~ıdÉĠt%êcÁ÷Ÿ0 f€IĜt™ä5½Ĵ°Î3삐gNĜÒYŜK°a#çÀÇĜ˘~íŞêz$91Mt‹@W‘ÓÎOk<ëÂ~‚š3Lš'yù>Ҙё•id²Ŭ_ž’´1ĥŻßùb“6WI?g´]ÓÎGË tŜîFbŸ;Nü–?6_f̽üÎŬ“Ìlô üŸħŞ5”5´² ħŠdjo™`à•"ĠiÜôÁ´WZˆ‡Ò(€êqM§ħ•Ĉ›ñä5ÇDÚ,ÈĠĉ2Á‘×°†dê9yWSÌ ­Ğ ³ 2VDĴwBŭ3i½Í' %_ îêC _Çh |hŝÊ8˜1´ż…Ĉfo#šL[jlÌȉ- 6ÄÌ+ú-oûğĈV4]§ V ‡HE×ÀmÚñچĜôÏ—Já£ò½Œıùk’%ٙÓv,f{èŭ÷ĞËċˆí¨Íˆ’ePrî:˙ÍxÔş‚/RÖ/ÌJ]Š|Y›ĉàߛO\ğ%ÙYš} A‡v—ígñċPĈĉÂĴœUİ+>‹Fl@bEcSĠ݇¤½żŬ{êûo.@ ^°O “!†&²ĦÁ ,½ĤÁbÀLjúimÚÎ7™àZ7\U ŻäÓ:2ç6Ĥ·“’”ô‘V÷7ç÷XâùifH‚ʘ‚qŞašk÷Wĥà·t…ú#‚Ĥ1)BSXïMéßyúR:4@ÀŻœ:|1Ĵ瓭—ÖĠĴzîru*ÙnÊtĵàċD°Ŭ‘r|–&ùĦH´Ĵ$£.ïô–Ó;ݲğ[¸ŭŭ·îġ VqÏ×yÚħs‡t¨Sx²·iğ —´èW$2'}Vömġŝ=hçQI+“żwBÄşĊÄ.:xûĥi–vóK•ÌtŻUÀ…à ^ô ™ßċ €.İ9[wîh=zÈÂÇs;ñ$ Ĥ%9ŜT@$ó˘q‰‹Kä‡aVoƒĦ•+ĦĦSÈÛĉ3qw?-÷#љĜcğ9Ÿ>%­‰½Ĥ 5£‹§ê›ÙLymZž›6uyÁ§(­*Îù6˙ĉŻ·U°3éV!0ÉѓgjÏ]:܌` Ë08?ˆëkœ°AÄ|GğECóġşü…ôOĠĦM[[7ÂĥĦî&‚C+7ÊÊ6­“IJ ‹³JvXvô6Mv_–óI´N÷>Ôk…‡@âu è‡-twUĵ½tgZöĜCi& :A'—l)ŬÑżtó+çQœûŝ êfÁp^+ĥàC0™éUħ–Ó›OäÌ=´Ċ²Îħ V}È"n}oĜÜ3›è˘V˜FÀš­9ÖM‹ŸİÓtf™÷$/D)ĵ• ÚTĵ@%äUüAn'XLíĈóœNVs°ħC}ĝ›,)ĝ/ù9ğv% 3A ıñİkÓób6„ y(âhrmĉwŸŸŬuŒ”]~‡bË/ûö$)Ñ#Y}eCMĊtġ…7[•áOŒKRNĦëì żû Òf—ÖKœŜ.~O j›ĤŸY\Xĝév„vJĵ˜â_î<„ĜW Ġ¤j=âtf›wÓCSRÍ(5aŜİM9ĜĴ´Î-ƒĤŞaòÖRúMRµMÎrúéĈU˘ßhĵŜU/2£qÎ )&µD&xĤâG´T~€™êŒGFÄ:™,I:UX…šXŝÀ ²Ž­~·w˜#^Á €‚Zk°G6äċYƒiCèŻòĈÁ>"d­hĵL3ˆWóƒ"KIĞŻ~ü7›İŭ‰ÏiĜ³ZÍ `Ä?5Ŭiı{6ÑO‚µ ÚË;• ŝÚKŝcĉUÄĠİŜqı!ђÔëq%ÈĊĴYȊÏ?&~=WGzö|*TádnŒîA{` Fì"ş[4tyˆ£ħĞ#6'ĵŝt£ ‚ÛPÜ&ä+@Ĉáxˆ÷Ĉñ8ŜÈĦ Èċ#ÒŻeà½wğĦ˘BH‘=…/˙cR€À–?ÊħŸ”PV Áĵ(ßq· ä³>oé6‘i;{áıt-ËŻŝA“ĝéZІ9B8’‘Öí–ïvˆ‹—àb\ÜC˙_Dn^éü FZ–wbÓùÍİ^Ĉ·Ü·÷AdR~¤(gMN~jVŜħÒM{sWÜÏ<µ™üT_y£6ŭdÔĉ­hG‘ôÏè ĉÈ •ŬàMÂï‡â˙8|‚•;”•ĤV4–a“Şà‡7yÂĤp!œ@bñN;9ħ×e߁ I›DñŭÚGòdC). U‡7n5ѰQ½ñµ — Î÷AUŸNİ£8œ2:&(ÇfHm~‚Ċ`Ó„ĜŠ@²öç÷%+/‡œ"TêŞóşŜšÌñ˜˜éSg,ŭ"!²ŝġëaĉÀÁ^!äwsšŬ½ê¨P& òÖá …l )¸CZon ˆ?˙í~ûżÜµê )ùZ2ĉô ù=JN3’>póğ*ċ•kĈż^ğÒN¸âVvS\u\ġâoŭ=òKIÎJÜğ“í÷\ÚW~ĉóKûävĜüĠK“¤ĥ‹ħĠĴċ~›ħ Ÿú‡¤xÜiÈKû|úŒÄÏ` ÈıŻèŞ]"qk˙ċĜ™‹"m­—^úmĞ”(ß°â•GR*}ےû‰Ô˜òJ û’/Ï,—ŠŸ5—~ùÑxŸÛŽMħĊ|Wl½]ÒKï:ż·äвšş’&ÄÊëcD¤%|&ÍŜ˜úENv˜Ö%€'–'àĈa·^p{ßeÎ/'C¤C&šÁÀĠ.gѐ÷†§>(ċ`Ğ.’L’Í:R3Nô”ŝĦáÌbĉġíóÉ!AÖnKkžä§†g[s.âÇÔ'Äi‹w0 ÌfĵÁ˘â×§­ž‚h\ĈîÈ!Œäŭ5T“Í·‘‚,v~+Ĥ+òNŒ ŒġÉ#½Î!<úÛùµĠawSċÚï´ŝ‚ħ½ ‹½e.N”î÷ëoŜ˘ğè|Â×,QÎܳĈ‡à€ıs‚Z^öŜ£ücŝJâ8˘!Ŭ‰ÓĜoġÁV‘¸ˆ}E×@Ŝ X N°Šöíğǐ-7Ĵê 胝ä`$ŝ7ċGrâŝöş’ʇAè$'ÒÀÑ ŭK’~\&˙67!>Äu<÷‹=˜Ù/}ÀuĊߚS#Á,|E^ì¸ëëî]÷°Ħîħ_Ö˙Ö{;|öĴàp{çàŬŬ·Ż÷J‡Í‡Éán§ şŞßa&w³?ùE†˙£êî]h•)pFüw/áFP…öĜtš%–bц’Ĥ‹ÒĜ=Üz BËkŠZXĝˆ_Í)îúÚ:- ržyëußíO‡´Ò;h}'€¤W÷/Lg¨?Ü’{)$AÚUsÜú˙ñŜSĥŭ³M@˜ĝwN“ïÍçӓu†˙ġaZôNp_%ĵOúÍâ³+´(3yyûö—ß_DOĜ·΀ö§BĜ@žħÄF8a{„îá€BM´#XD<NÀµÈ  ¨˙éİ×Lendstream endobj 459 0 obj << /Filter /FlateDecode /Length 470 >> stream xœ]“ħnÛ@D{~˙@ı·kÂ5v"Fä¨Ñ`aŠ ċ""ĊIœ·ş;<>?=ŻË­=üÜŻċw½µó²N{}ż~ìĥ—úşĴÍħo§ÜœžċmܚqûówĞ-~Pçğßêá—÷÷Ž÷—ÊuŞïÛXê>ݵ9w]>Ïsnê:ŭ÷•îo\ĉݟö–ĥf ĥ¢şOĜc–`´}–`{Ú!K°-R%LR–`­g Öi#K°Aû%ĜÚS–`O°† ĤĈ† ĤĈ† ĤĈ† ĤĈ† ĤĈ†TS²)yÊ움ž„ŸˆŸ0$iP⠄!Iƒ% I”8(ÍY‚Ċ?qvôuuvvvĸ˘œQŽW”3ÊŠrF9úş:;;;ÖĉZsu޵ıVç\cmĠ9Wç€s:ŭ’%Ĝ mÉlĦş ߉ï8à< ‘“(°˜r‚Ë À…ƒ€¸`0 àB€AÀ\0€ p!À `. À…ƒ€1f vÔĝ>éĵ ĵUߗ¨-û^כžoÔ²Ö·sğn|Ğ…šOÖ*ì> stream xœWiT×ĥŞĴ(˘ĈîŽ8b‚â5*"âÈ$£dh énğ›ĦD4(p@@PDFE'À1гqHLĵÉeex—DĦÒÉôò½pN¨\i”!r.ÙJ£Uô›ĞS¨"ߝŝħL+ ц+ċşŝ}…¨ĵóOöž×!Ò˙Żş˙Ğ·ç+ô:ı2ÂnYV'[-À• è*Âŝ²İ˙vEÍ\˘rR/Ġ8oZĤĠécWÄĊ‡$„ÂÖl—G¸GFy*ĵÖE+c†ĜϰŸ9köœOçÎs˜@Q)7ʆr§&PÔDʓšDyQë(oʇ²|)?ʉò§–R”3eG­§–Q.ÔrʞrVP³¨•ÔljµšZC­b¨‘Ôbʌ2§ÄÔhŠ£,¨1”%eEYS45‹d&eL–ˆĴEÑË!ŽCR‡ĵ2’…ŭnĵÂ8Çĝ¤qÍÒ×é??ĤpèˆĦC C°l>ûúƒ”îKV>ÜiĝĈáG‡Ÿ5™kRbrÖäËŽ#‚F\4]mšn #ġ#ĞG9úÒlœ0í@E 38\vE"&sGd>al{chĵ„é›öÏaúÈÛ`Ĉa젖6ċñsÀXUdÎëÀvŒ¸\ĝ:íĞ£AĈ܂+´¸ëEAëĊÛcϕiÖoMOÚ+uĊ_ ‹Oà_مYGĞg—f.ñÖĴò–ˆgyA s<Èfĉü-˜2ĤŽ÷ĵ°€çÌ?PWÉċĥóçŞî˘k¨=ŜŻ‘w?p޳Ë5$6l*Şġ/X‚Xüó ŸĉjÀ†yLGyÂí6ÍĉiĴ6ö _Ċ{f|›k\˜ŽÊĜ@ívuRœ”dk²'b‰gz0†0½(#Ŝž?ËM@öÁî ÖŻVNFsXlúr!Xġ]Óó’–›U˙@ß²0jîcşİÒ+HIÎt oâÇo—ġ0šß£EżT£Ŝ|·ğ"ó:@6˙OÇ#e>“%γ‚ñX„9Ï~=ÁJ°îEg$Ĝ†QMwö†X[˙ĥ7/Ê^5ߕĥ<ì¨y†ZÑİ„£Šüĝì.xUEàD<ù•xÂo'nÀ- ƒçü3C€á:ÔukRßEV0‡8A v}ö‘ĞWŒ{Œô\ÛÉÏ]°x ĤĉĝD5ßó‡0ä[éFs3QïPâÁ ¨g`"úĤáAϽ_NÁHXXş^!ÁġLq_×ëhËü½9xĈ‚MîÒ ‹Ô³Ñ7òêÄĈÍóŻWş Ğyh~°÷bç;!ĉ#ï:ŝvçJċµf‰€9½4™ÀµĠCcÑlï¨ĉ.0{<`èô÷’Içá6ż2e`F_!;xSĤœÌúJ<ä9ß40•2ĤĵÉnk’ìŭKb߀FZĵĝEÁĊS/ĈBıGҎxË™;Ñ.´ ­ tbĊ²cż‘iL#sRbSa,L‘Á¸1ânŝ9?„Ë>’™C˙~Q;6_à'ß Ù W{"äu*ü•êİÖRÜs3>ğŜ:zƒ~m”r˙ÁIR^ꁌc,Ǥ%f¤˘íèóÊÀ3Ú}KJbá3 ^Àèëá óJÓ*ü%ċ˘"ĞŞš£­ñöêĝèԌ]éÛĤ­ˆ_Ġ-êÉFüLŒ[Ȝ€‰4I %žHğ0ñvt³ żLKJOB[­Ö5*T—ìŜ_!)ú%)}GĈ6dOÌ=´'+/ğ@Ú-ôWÌ@ıK‹DŻÀֈݷ€Ħ|°ár|o³£ŻïJdċżİìüAòË1é]x&,Íï3ٕn@ĞùW}_=l+ïl“$.§Má*ê]FˆÈ¸7†ĥ¨€-9£•À‘V$‚˙´€6aû) öë“ĈRaĝ cÚ[8 ˙O (>™Èàı}Ĥcx6_"Ä^Ñ|FĜ-ŒÚ¸nF×I€pċïB—×ĵ· Ġ£³›[Ôµ‘Í%Nh!šŻ XċD‚7™Ċ£KxrDO'µK°„‰—k×#ÖS^מƒöïÂönk˜œŞŭGò JŞ Q ŞÜœŻŜ—˜µ E³„ZH&Îîŝ鵈_Hˆe“׺·òÁRd•‹öd”§żħ Éڜi@S‘OHĵ]ÒJËEŬÚĠ5Ĝf†oġ•=™9™9<‰I‹ÏHAIȧ(¨vıฟ˜˘îšĞ·›ZÊ /ѓu—&aQħĝÁ'…šġ֝—xÙ˘òŜ™ħ=cğd@Á ŝßAԀxx>`ğ–Á\_ÏÛĉ% ü>àÛA\Ëît<Ċ;‘Š9ĝ!”Ĉ³Ĵïz!ü믙ŝ1â­î͆)‚^úž>é‚'Dxß=Ô|úêĜúR}TrFJú6éüƒ‹‡î7Ÿş‰ĴêŽĈG&§'Ĥ%I—âîÁĴÚ[I‚I²Ê·Ċ~ı·Ös$éÂúŞ5h% ÔşŻdĊ3 žÊŝÙŬÀÌĉµıĝeï´˙?œ³¸ŸˆE•{ Œŭ?Q LA:LĀO 'žĜ%â[q}?3‰.4˙3ÓO|Ĥ|.a½ç„ġÀz½QĤÑô•밐érĵM" òŝ"ìß;axğ¤é‡zpB=,Œtz„M$˘Û[Žoô[£Ç֚ê)ŠpwÄĊT_üù‰³éKêwzZŻ?mDŽÍuĜ€MQĵ‰ĵEŜÁ˜áĉÔʔÖUG__ŞĞĴŞoşpìşIR÷³Nl§Oü/Ĝ$k&˙çĉÖ.ÄĥUĊĝĊŻW(¤Êġ˜qĈÒyk˘°%Ëǽç°9ï6“…4x up—;r2ŽÖĤUĦPÖy›ĞgtĊù IñŒ\ÈìÒ§'˘ÂkVĊ/OĞ;.J/”ŜC¨Mßpœw=;ßxëİġONíXüé2$"̰!q! “Ó°·0· °Şšp?Û\ ]àîk/MÈpĴˆeܒ~ü°ƒßôıhñ0šÜĜ^ˆÔI°§0ĜXŻf ‹\\£`ü†”Ò5ĝ„ˆġr½ŝ\Ÿ˜Á“ú¤4˜3Ċ'ë ›{µj£Ç$·EŽ>Q {2÷gĉHIĞÚO8x+;ċÙJ0éyuĉÙUIӕ’¨‹…!]X(OVJÚ` ç9„v't^‚é3ä8c™#ò"íatıŠiÙïVJ|fâĠ›²xĜW‹`Ä·ÏïµJÎ^ŻxŽîħŻWßïhûK :²öċWUÜ­;~CÇ 9A,½ıóĠQ~vnŸ9ùEĠ]úŝĉ“‡ÒħvC¸8ÍÜK(“ßì‹Ŭ§bğùx'K¤E+x}E˘9ĉvtÖÔîßϽċGp#€_›@2#ÍëS°#ŝ‘Oĉ-¸“E…ù‡ êëŠÏ£sìŽ7ñx"aƒÍ6‰i‰”ĝk76Ċ°â7ÁħîëĴħèk°úúqek›¤ġbġ#t]××­cĊ?Úħ^§Ú°ÊÓo™ŸâxóÍÖó·â7^¸†k݉ö›µfwĜɖon|ù•t.X>ó; ™CìÖ V½ı\ږŒ/P ;ŭÁêßaÈßÚ^_—Üĝí4Ĝ#Aş Ÿ“š#íqĉH´–cê–ëëË5‡Î]–n[żmc²Zç³!†´ ñ›ÀèâŞŬ(;sVò^¤—FzÚZ8_*îPžlíıúĴ?°×`œ7s&Ĝ,Îwï5âwrÙĊ™yDÀ_0œ‰SäyíÉk³\ÎlóöŬ•"·Z°9˘mž`¤ KñÑàœ¸Š‹ÖhڗYÈb &U›m§°Éúñ–w˜â7—÷žÉo8jġ¸éÒ+ô ;%ŻTU^Wp‚,ĊîµİĊ›ä¤ŻflO'•6Ǚ =WJçÉšŠÂƒıùÙe{È1?ċĥİQòŠ]•ÈšêñuE°°hŭ1èa0qĝ뜃&&ġoyH÷êendstream endobj 461 0 obj << /Filter /FlateDecode /Length 370 >> stream xœ]’Ánƒ0Dï|€ö"!_ÚK­Şĥ?ĈDˆC˙³“¤‡föxÖŜêċôzš§½Ĵ>ĥ%}ċ½§yĜòuım)—}>Osq¨ËaJûƒXÓ[‹êċ­[żÖ\bAïüŜ]rġ)ġ‘Ÿ÷MiòuíRŜşùœ‹ÖıĜŽc,ò<üûĠ4÷ŭĝXZçH9‡Z´”s¨@‰P ûH{!RÀè‘rXG XÂĠÓٛ³‘Cây·ƒ<\=½9ôcr×@ç`ÎĦ‰°1„M U0+A"a*ħT‚…ÂĊb‹‰„İÄR  S‰Ĝ­„V) #<ĤH“!â [kApÇÂ{ğg#Ä;µŠĉ” Ş5¨hNÙ ZƒŠĵÊÌj™y•™Ġ2+ò*3ĞeVĵòÔŜHAĠâùò66eÏĦ*ÓmÛòĵs9j6aӜ˙Ĥu]VÛUBĊ/”êğxendstream endobj 462 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3528 >> stream xœuW T׺ž˜ ŠV™Ž@mgèİġÖgĊVÛZŞ˘¨Uô¨ ­¨„ ’2 D@0³‡‡(BÂû%ÏQ[k[ÛŜŞW5V{RнöX­½zöÜğıw€âêZ7ÉÊZ;³óïß÷ûßÂͅH$SÖoĜ QkÖ'/\0w…FµÇñ›ż8]"ì"â P’Xġßk܁§+tûäċ)a^°w*Lx†L!\%’mÑڕ­!1FĦLö{cÁ‚Esçâï~‘żóüÖÉäq]R\ŒŸL½ÇoŬĵ óüB4:ücŒß,Ú/2J)SEûi˘ŭĥFm÷ Ŭ²jóżàÍC7m™=ïOY ‚xuız…F´*quRrŠLaOTô&Ċĉ˜-ްĝyiĈ€7ßYF!6Ż›ˆż%ü‰-ÄLb+J„+ˆ bħŠXM ‰5Ä"b@l Ŝ"BˆˆpbÁŜÄËKüC¸İĈ$]ò‰Ë*— ×W]‹Ŭ\ŬŞÜŝ×]í~Ÿ &/Iƒµ”ħÚ˙&DL”Nü`b­gˆ§Ĉóá$í¤›“'·N~Û&‹5À6l½u1Ż‹9GŒ‡„t€°‹ŠQj—Fl/HfÔäQÊÁ!7WŞԝ• í({JuĈԈ5·¸ġ§3c%rÒ&3íÒÚ½™jP'Û'éX>ôĴ½€ZúĞ9˜çHŸmÍùŽĴUH2ğò=İÓ5š0F7P*9ëjÔġëƒ'Ŭùj‡ yÁ‹ĜƒÂħĵÒĊR+Ó/¤ħ x‰ìÌĈ2yf:Q8IŸy{yĤ:˜ojbaĊ('ÏÙR'Ê%g $\ﲖԴ³txRqo™>@Zš„.î邧l^§q•jE3^K-ÔĈ‚‚lʤ߅#˙]Ż Œİ34Vĥ•~,° µ âÒİÄM,Zž‡&†9t!ĝqÇWĊMŭ˜ mŭIS×ôĥşüNìŻ úĜtŠ.J‹‘ìé[£›;únĥÀiEÏüĈëŞn{äM˙.Ĉ@’iW 9ú}Ĥ¤,6wŸNö –­ı8t²á œÊÑÔ§ĵ ŻIoMu–6ŽŝŭúĞáhyzċ 4éא†Żµ˙Q9î˙1󯺊‡ş˜6]Q+ʤ­UEmŽ=r[ÉŬà@ú~ġ›Èâ³vìkÔ iÀwгċëİëu˘i¤Ş6úH Ëì9ˆáè4ġ—Ù˙QeÊàĠò‹+ÔElaÂќşħ2R ßĴHÊ6&d³òĉËd¸^Ŭßî•ÄA7mCîïyĜÊĈÂєgċ+ĝ*z>f@R2‡ç9SSr¤İ„íIĝÒĝ>g&|ç.÷Ìż`‚£ëAÑħ†ĉ=×'M‘Ħ ύŻ=sŸ£{Ċ^lEâ€p ìLgËgÎmçı#ËfˆËÚshġuÚÑLgQĊTçuq1•ÉÌ|+mĠBi/¤EŜ§Ğş°{Oŝ|àáĠ‡ŜôтŭU_¤`Ħ^Zm‚ó4Q™ħj6µY{LÔ@ğ?Ù@ÑŻÉÑ †é*'wħ–\|ÈÄ.u¸Ħ¸³²7Ñİ‹xŽG@2â1Ĉ<î²râÍĤ#\˙0/7…Ŝ”•°óœêDòç9§U=v˙i}xŸÀùûĜÁżt’‚ĝ_-|èñ ë •€Òa–js1Ë^&!ÄS'¸ç¨Ş3yG,żäQhıhy5ò193À׃ޟĦk÷%N€à88ÚRîÛ^Ŝ/Ԍn`”Í;6‘ÖIàE|P€ğFµ o“ÖìR9Ğ%µà€)=%˘G>ûà HĦ˘Ê²;Y˜µ0lôşp{ܝ›G ]ÇmğsyT‚h£•Aa$Ĉ˙ĵğ³ò`€­á:ô·y}ú œ6­Ċ]G€·3PúĈäžÉZ §}à&¨ċıĊyyL9ÀHiŞ’[Xúfs­“èóŝè%üž„vĦ,H|ÀÑ÷àœŒ}ŝŬ°µ•ŭ_ĜÜq2êË/ú\;ìĵž{ĊU}ŞÑK˘KB9.‰"t‹ıÓ&—kâ£4Šŝ\ÖİJ—Ëĵ´, §ôf]uísPê7]’ˆéâĤ'2?EwÉ´H“<Òʗsw²Ü*ôrh–[o”`dÑï¤1Š”÷š*8x—ĴèÍïá&g–‰KÊà’²Â2Ò6Á>‘àĥUéqŞĥPpĵŠ,…‡<=Żĉ B1U•%ž“â_=pÏendstream endobj 463 0 obj << /Filter /FlateDecode /Length 2215 >> stream xœí]Ûn7}òz”€Š^ŜÉ} ê<(&~ c#ml%²¤Hë Úïío”+테EÙqH/­‚ÀÒħĴ=âœÑ™ċ§a†0ĞŝĠ?§7ƒê Ġ\ka&˜bÍĠàÓï^8ĴLo†//gŻħÀC¸`dxñ~°ƒ$”ÄCI’lxq3x;"H#=žhĈ‘Vttq]Œ'D*óD^,Š_‹ít3_—ĞM k:ş)ÊëĠlü×Ċoƒó‹ÁŸ†Û÷!T!l>ŠM' k”aµ(͵$ 'ŒjR=”#’ÙZ İslHÙ g UFŠıJ_ĉ7ğg†PFB0Ф––Ò}OP çIÄ€>w…SŒ$µrĞÈ·ħ0ß^_ÊbıŻ– *Âx"‰Œ> ½jžĊÒĵı–vZSùĤ÷·7ï'4ħQğp)|;ŭ›tĝîI$2;İ}Ok[9ÄWSê0hJB=‚ŜSË[˜ĉfşb/~q6ĈBìê. Ök§#LĝĜï8,’3  }£ñŬ@QdŝÛn€ğÁ"W,êġp¸>ċ2€ h€ Ácy‹Ä¨úMç,ä°³˜EöĤXyY´½7*ÜÛĤ‘œií!sSm.Àœü:Ĵô¨ •ôÌèI‰żi¨¤J·ÚÇû~ÊóJé]1ó·ŭ”î‘Tˆ0ċ\³ŭ¸m‘üñÁíߪ€~7úÈÉÖdĴà!Ò¸ËnâŞ/’‘lׇ|ŝĴú ëĈ° Ôìŝ:×OT€&„ĈwAâÌr_“dE‹ùĥl\!H DŬ#€Ż~@Rœ§G†ò I-ñ7PFíwˆ¤a@û *VX  Ib-,ĵ}“1{ç‰ = é ñŬ€$„°ÜÀ×µwŜĦ‘ž=Mñc3ıʨ%~_ËdĴŜy‡Á‘1é߀&ƒŜ]¨H낌 gċì뷌Ŝ;o3I΀>÷@@t†˜´“¤.Ë'èwÈ$b@ŸHá:–~ĥżË}“‹byU^w÷* 7Ùq8•ŝÍh2èŬɎŽ3Ù!B Êí$¨ŻYò:ß6sá:‹•K hôzO“X´pÂ"ÊΞúZ*wġÖİdĉ!:+ë ‡GrĈô”fPŒ BìLİŻ1²+İ9y²/!‡ w&O41ĴM•ĦU§A—I%u™^]·ß6³ü"TÁ^}Sçòí`@A ž:ÑX'zW[żŬ*ƒx)ˆv?/‹P?ß23{˘Êr_i^Ĵŭ7‡D@‚FŸU5ŝ5EÚ:LŠxëò˘6ŝ84’³ ŭ‡XÇb…‘ĈöLÉW ı(Ġ!’Èèzšš)fOˆ|Ġx1‹R‰ = é ñŬ€K$­C;ˆ·./jQŞC#=3zRâoRݘq$­hs‚ìÂşáP¨ü)7ßĝBı×l?ú½mÎO×}í_ ˙gÔ×ñœĴ‡µá…RdµÓ­6Wg&TĞÛab-FUÌúċġ›UızyûŝĦž{ˆ qĊ]†ç³Yħx7ĈUÀ$£Û˘,‹ĊOĠ†Üıĝjl‚¸–œŽ6có½˙˙ĉÛú5ĈĦóċĴûƒ7ċêîŬ´T£bñµ#üçà?Jíendstream endobj 464 0 obj << /Filter /FlateDecode /Length 656 >> stream xœ]ÔMnQà=§˜0Ĥ˙°„ŜĈŜx‘(JraxX,< Œı}ŞÊ&‹,j¤Fꏖzŭôòü²œnúÇġ<˙ê·áxZ×ŝ~ŝ¸Î}Ĝ÷×Ó²zĜ ‡Ó|ûjzÎoÓeµ~ú6]~˙ıô?èÇÏŝ}zëëŸıġÑçKóùß/ÓÜŻÓòÚWğqlğħ­úrĝïĞm~ħ?Ŝşi_™³­v›‡ĤŒ#ž¨ĝ†AŬ°ZSPĠ›‚êĴÑÔ`Ŭ6uËúĜÔGÖ}SP÷ĴsSPgÖCSPĴ½)¨ġĜT w-3Žx˘b|ÁH0Œo" †ñM#Á0‰`$Ĉ7ŒËĤ òÏħj jħgœ hÚÔԉV“×è5XM^£×`5y^ƒĠä5z8 tà\@'s@Ît8 tà\@'s@Ît8 tà\@'s@Ît8 tà\@'s]@,ÓµPçB֐7è XCŜ 7` yƒŜ€5ä z֐7è XCŜ 7` yƒŜ€5ä z֐7è XCŜ 7€ ƒÀ. ¸0 hB˘ (1~А$$ĈO’„Äĝ)B’?EH§IBbü!IHŒŸ"$ ‰ñS„$!1~А$$֕ZYre MJ”%4)QR”¤DIQb]İ•%W–À€I`a]•WV°–ĵEoÁZò½kÉ[ôĴ%oÑ[°–ĵEoÁZò½kÉ[ôĴ%oÑ[°–ĵEoÁZò½kÉ[ôp% žĵ•÷£È³É|ż·üq½öċĤ+­+Ì{ZúżC~9_ĝրĴŝġíhġendstream endobj 465 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7486 >> stream xœY\SWûrsU\¤‘Ħ½ÁŬşêâ(XEAp‚‚‚˘È™a…½OĜ{רּŠ'ŽPmV­ĥÚĦ8Z[íüż·=ô÷ûŸ$@Òïkûû0†Üs/çĵçÏóĵ'tC˜U¸µdÏĈw›È½ĥQû6ylŜżĊsĞ—·½ƒï6?G§wÍ]fkî<·÷ĉG/X(]´xÉÒ÷'/›²|ŞÙ´ÓWêĴZŭEMĦ6SËİİÔʌšFmĤSvÔ ÊžšI9PïPÛ¨w)GjċDÍĤĥSk¨9ÔêCj.ċL­ĉQ.Ô:ê=ʒšO­§P¨…”µˆ²ĤSİ%” µ”²Ŝ§6Q˨‘Ôdj%O­˘FSĞİ1ÔXʜG§vR”rŜ˘DÔʐ2˘t(cJ—2Ħô¨‰ŸšDÑÔÛT,ĊRbjċD˘GnÄRŻJçmW[şĉşô ġRĝ~(˙J˙)pŽáêü97YÂk†ÍŻ`³.—Ò&BİEqı)Ùa(áÑ\QâİÌ h”èGÔIQ(JɈOII@ħŒŞd˘ĞP[ğyŠëáRş~*ßS‚üüP•ĝ'ş² µ‰ñ*Ĝ.ÂFôÇ _µ2ôÉäß+ÀAa(<Ċĥ‰ÚƒQ4ë1ôÛOĴÜàêÁ ¨|/ğ†Ž&Ó5Ħ2ñ)ÜçĤı‚Et™]ù—b7XG [ßÜ;rŝbYàfKö TÏ5+Ÿ›ĞzNĴZ™“Ê šÁŻ['°µ Ÿĉƒ­Ħ.—LlB1l('C!”_G—+ç'£âİtL0ò÷ĞGġâµxĈj˜ÁŻİGímÁê[AäV*×Ó °1ä‡ÑÂÚèbA#Ĥ˙B.U“… Pñ pä Ó_còž6ĝÌ/ŞĊÔFB¸\ċÏ£pQy(VˆÂċĤYġş“PswÓcĴËâpZŞ\ĵUˆ›¤´œ“I C½˙Ħxt‹Ü}­fħÓÀĈÓÂ_×ÙúˆkñQ‘ó-‹Y,„p`iĦŜ×mk\•ë§ÈၜwE ]ÎüD0~ŜkĴ‡ġĉ½ƒÇcáws@t{Ĵehž­ı……íŭ—ÏoŜĵóé ëù쐗yAŝ<‹{ "{ŽfX‡ÄSpĵôĵ,K¨5n¨Ó8Qyğì£–†w5>Ŝ,ƒQty£Ê{Ñâ`ĜHL¸ĈŻU)-Ž—srŜ1\#KFÀJÑÁŸŠ2ĜäwÍBÜ3Éo0 Ŝ}ò[˙ġËğÌÊÄÙQYÑmˆéDµ5b *P£djBr*›‘†2bƒ}ZvĠlG ‘m›`kĵÈo˜Ì7ŭϔ â`9ĵ'‡[ê,>İS%#.FéĴħ ˜ìâéçÍ _·f”yü%Zŝ1Ŭéî=';ĵïżĦĜrÂìuÖëVy==ËŜ ]½ĝѽĞkküXUdż‘pI‹—À,lÌb÷ĦÙËĊuÒ0Í™ Ÿ‚),![ñX’>³9é+ĝ½$c­mŬSù²žÌ};¨çÌ]˘ĞQ·Šò`´ş7ÙïèMŸƒ…xÜ·³@çÖéúZ1öu֊٠u|Bn‚ÈÎyùr ëÛÏ^ÜV|q˙Ôj+ġ. Ln*0TœRì$>üƒËìġ ÔK…KXK\a`(pGѝ‡P]5ûr^´;‹ ÁvC†#Â)cI<ĠžRäÍŒeۀÔ_NL uĉvˆµ€ĉ*@W6Îç˘ıQ˘š¸ËĥoŒ´q` „T3bM†>Â}fš+(ÓÀÖUĜ´oݽ‚ÑĴ,¤R҈˜şšŠĉÁĊ|”/ŜO ˜DĥĞËĊr)˘!ƒÇkL<8 ġÑ Ü’EmJÄĊ£4ΙáQlĤ­]B(bV£ bH„e‚a×eéáĴ\XÍ.JÜ~ŠÓéÙ·<ïŜ{t˘ŸĠBoŜx‘ù3ÛÔÌI5‘ÔŜs#vĊ^àú×ğÜÑ8 Ö\ŭÁ ‡Ó˙ “êM:(“Ûš`žÂĉ c¸ÂvÇĴ+<ĤUi÷nġĤ…= Ìâ|W˘ƒ,Ô ŝû‰Bzĥ"änwwQK+Üé+ĞEUïҍjżjÁŬ ™bŠ“UG4u ԀSZ×G†°2œ)ç5ÀŽÇ°C—KçĤİ]ˆGhĥÚBcypŸß˘ċ¸WµÑ À/KĵkP-2Fġ¨ĝ à[£6mÚH—óîôƒ%19˜{8˜ŽV›Ì£—.OHrAMlNnN.Ş`"j‚Cb|m>ŜùĤ˙Ñç,·¸M0䄴ÏàĵœW.߂‹.—ËMµ… H èÈ•€¨÷;y~&Ö{:;ò£ôb/”@Ş,>,=y/fÓ$L&íçù=jeŠ"ÄC^K żŽûsB³cŽ!c(ğ°JŜĝTV–]ÇÈè\§.<"'İ$Ş • .”]‘SwúÚj‡ÒždÄıÁ9D¤à*H6îŬ“›Ä‚ŸàÎĥŻ´ŬÓÑ˙Úè†ò–Â.‹ d²šĴ2Y)*DÌgü֊ñştVïFĝ‰zò ™ x× ì[Zꑛœ—T’\‚JQYAAYvŜאWr‘‘ ÑÊ)ԝIÂa¨ ×£€n’Ŭ˘ĞĉëpzjkdÙ¨ÒĝPŠ`ñKÚ')ÉGĵK0,:š K€oâžpIf:Š2öCĠ,7–ËC5¨œ [ʔÖ&ĤX 1qyCL iŸV÷ŠŬ„áy³‰â ³ñ¸g³~ë=ŜÜÚ 7y"é1v†Êğ„>A§K™a‰4,Ĉċ‰QbyĤL‚˜xZ‰"ReéÙİâÓ ùô$iI¸”xŬB—P/zPtĥôr]Í ÔZ˘Š­ ·£ġhÛ`‚Ŭb9báߟÁĤż!;éżŭ‡Aê†Ì€(u+ĊE QEßqĠ/E!(ž´ŝ™lRĈŝ¨@túâG¨ ħžk ­•3Â_?w›|óÁc<’Ċëŝ7­îóôm¨#ŝQŽÂö˜ kä_í[éß}15||„´Ê³ÈÙuë|öCù”öż8ıĊešï½1ï7kˆ•„YĊɔ!%§h•÷áÑZerV-v„óñNÔVXÖÒRW§Ş>U’\¸i­8£ħÂĤĦó3şáy<ÔŭĜüUUfUF{J<:Ñĉ|ÏÙ;0²|_›VœR3ԕİ[ÇÔ(˙$Ö½s[‰+Ál]ó•K7œĥú2D ‚|ayKʗ’Ċ&Nğ·Ĵ tÎiŜËîiN;žY•Y™Yċ;ĜEb#UY—WÖQÈó—Gß "†ùôi˙ ¸ H~@鍳ŭ`ôfñ‡§ç&â,Ġ Bèb’`ÂÀ\E! Ż~D• ¸Ĵ˜,BbY(Ÿi ­  ‹ `…‰ü€şaúażÁ ߒqŻŝÖIjùDñ‚üÓċRµş÷‰j*\£Ħ‹`< uÒ: ħjISdô×^] ²£Ț‹}ݽŞyŒħßG ~§V+5OK‰Ñx)ž‡_ĠĉXk¨Şg@êĴĠj%8?˘ż¸£{êÓZ•·F‹bukt_ñd§•­‘H ‰ñ·´İ•““£ġ…˙cáÛ6&ooSYö—§^Óxì“÷ŜĵyòĈ²ZÓ)iµ‹žƒ=2ž0Ä˙CATöÒ(Š´5’%é .XnP6x*Ĝ|6JŬž=dítµµ¨Sĵ_‹uŒĝ y·R`vĤU&vÍ⌍„ğ;kmn™N _>˜$ò@e‘GjEĈͨvWet¸vÈrġħÑĊ^| {¸R•ód!•ˆg úğÇî dcVù _ä/ c„Ú2$(r˘/=ĵîx†"ÓSulÉ$bX/öôwŸé/‹²fħT1_÷˙òż<˘òÎW\€Ü 'ÂâvXl(|É)uÒ9+µP‹vß$mJvÊ $îIıħœ3óëCQ"iK%(´;ñÎT[˘LQnfuò%'ÎT[œŻT÷;-¨P,£?¨á xċ6 ’‰…DöĠdç_‚Ĝœc¤AÍq½„#eùÁM(Ÿ´¨ (·óSĈ¨x°Û ]ĝ‰ŒÚġÌëœ]óŜħH’bŠ“sÓĊ° óÊñ‚›3÷c1ž8?&!)Ċ0Iy’ĈVĜ FP¨>÷:/‡6òĈ;ÙûĵÖıú…¨%%D£„ÖË×#Ŝ›5 (˜ïŝĝÓÏ-§6Ġ‹Ó³”ÑbVX/Á|<êĥÙ½žWÇÁâ&‚hĵO"]œ!!âġ0ƒé³Ż´Ší!Ldĉj·{çžëż:}ùĝİ“[͔,“˙>•¤v0Im‰`jÏù}*ÌÑÒ@V´Or˘Żĝύżĵ„C,X '54Üĉäĥ.E|Ñé…â¸Tşuzy!/r5Ođ^¨DLšĦİtòêìD%,L…)‚òQ9·ßE„ ҊÒóWżŻ7J-JŞ CŒ$&*2)'!;E _ŭı>7Ħ ŞהWVİRĈó`'̅׍"ù£n{Cŭ}=Zƒĉċ˲òÙ۝Ñqi é‘İHÂĔGUvüt t´ĥ,%!ĵĵGôûĈA,ĥÒŸ9NĊs´­†Fċމ0ÚíZ³ğ;ônMŻ ûD]ŝMÁ~~ûۂ:Ž4ĥ·+MÀ+”³`£…Û˙ûLQUL$,9&6…Ċ_ŝi™‰P’qdyTM]~yi _ŝn™_!C¨ÀxX?SÀQÎzÚ4 ħ֛İún`ÓOĜt@ï ˜€5kY,ÂïX‘ĞVYHxf(^ßğ{û]…Éí,äbÊVKnà—-PżßYÓ.ÂÁ4O|µÚċ°DÎ{Ş€L ?°ŭ¸ú<ÒË-9̝;HÖ:UŻS£ D˘ŽŞœÜ˘ĥı£ğê* ŭİ5Ö+Ön~?pcÁċ@²Ċ‚|²Ċ֊˙Ä}ËZz0ŝġ3UËWé½>XNXùÎÚÏ!ís'â÷3œ/l½¨ë89Eığ²e0ùÛÇOÑ!TŸ›J~RP$R%ijĴİlëñĵ4‹T´ ]qè­yÍ Ÿï‡Ż@Ÿt”KĴì>´Ŝ×#—° Y ¨Œéğ~î³G7X(×/ çşQ\Q5ƒG ĝK:"%!Ĉ…Eˆ÷ Šê*ilmĵñ„u)òéĴĴ,nesĦ ĉÂùµšŞĴ,²‚2xo¸jıàGşp“ë]tÏILtOsdóql6- jBÈĝ0Ê.È:–F² 9—ÑEf DïïE>dÉaIN…ƒòû=ċ—ïsÔİyßúšEíͧzĉñ҇xÖ™ŬéŸħÂ;ĉá·˜›ÌzıĈƒÁ‹§ß³Ëà˜ÈÎÖm +<¸ĈöTï…Ŝ³Ÿ?ĵââ$.GE–VöËXĦŬ2Ğ^…üêGÏ_\ħÙ¤ÂĝGp†Ç‰ı˘ì3Ŝħ(Ägğ•b7#YLvx AşÜ*Y%ƒ—ÁîB½‘ċ}Eb­€†‡kï %‘)‚ĴИƒug,#1¤Ÿ. *ğOħ xÜŞwf=) ŻÈÉÍÍC•LCdMP°$Êß·j-éŬHÁŒgvĠ‘6ğefŽŸÜ{r§÷Ó-Ħ5LLjµ&dċÚpx˙6̸ K%<˘âĠ\cEWÁ ŝYÉ(ÄtrğBŠbħJ Ȍ‹Á£Ĥŭíèj O}BGâ|gÍÀQ:Eİ1‘eQµíÙ­%YlŒá˙üŸİy›•H9Ġ4•ajò+ rz˙Í ĝšŜßħêĠ #Ŝ ċé"ÔĝOof`Ÿà`Ú9iĊv˘ÀâP,C:İĉچ’Ÿâ‘El—ŞôCÁÑĴ‡ëÄnüY  ŻUÊ"$9‚p'nús]ZBF*J6ލˆnÈŻ*ÎaĦù÷ġ9EYı(ßĝÂÀo˘{ûŻíĜħ‹…EזsçşŬcq?W r‹Œ‹‹h9Ù]ĠVZZċO0óà€rôm>y²şı¤¤ú€›Ò8ÎëıUÇÄçc`eä­8ż´U×G”D'Ĥg&JYüïML‰MBĈˆ> stream xœ]’1n0 EwŸB7°["ZÚ%C‹˘í™QŜ#ÛD[(`0Œ‰F`@W“÷ˆ@” ,ĴT@b`r°ä¸K”÷ˆÀ&QÀĈ=#ûFëÑ3²o´e"KE–:$ x0̉f!QÀÁPT1Q@ÜW'°/Al}áb# MŠ™š3)0(4)fRàHè Ñ6ñĵr[Š­÷ıM—oëŞeàŽmµSÑżg²Ì‹rPġ $endstream endobj 467 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2628 >> stream xœeVyPS×—xoĠĉUiŞ÷Q“TÜŞhġ9SëÖşo€•Í $d’°Š ˆœ„MvaK€€"›,JEpyë2RE´ŻuëâëĵéıÌáġ½uĉuĉÍùï7s~ç;ß÷[>›ĉ‚á8>kkDpŒF³ċàòŬš`ı4Ä\̸á̇.Ì<Z†”““Ì䀙ÓÊ>œÁ™ [fÁ”żÀ÷0ŽVë·Ş˘b¤áÑŞµkWŠ‚Ġ˘`HĞŒÒžKĠ’PQœ*&Rt"A´EŞQkb$Á ÑneÈ Ñfı\ôúžZ#QKbb%Ħ+D[UÊ0i¨Dİ‘ËWüïÂ[”˘7˙/ŽaĜ\ċUÔĥí1;ÔmpBH¨$Lĵ_*÷SĴ°}˜;&Ĉ|°…Ĝ"ìĥ;ˆùb~Ĝìĥ ێíÀvbаĠĜÌ[ƒíĊÜ0še›†}‰¸~Çeİ pıÏYĊ)ĉ<›8mŒĜEóÈ4òG'÷µ™2RW§GOoƒ63Ŝ{ÜÌ,ñİ›Í̚˜Úw3ħ|W1Z"#b¸“?›ZNL#GµáòĠËY7Gy|PÊi­^)<Žĵ3´™ñ …ݍë­o/4÷ êıšô„L dñö²ÜêĵáYĝə–ĵzPG÷FÚüŭĵe^Ĥ—™ç`[Ĵl›Í|ŝóú_ĉ¸z4ıš/á^Ë(LŝhŞ?Qç•NH`6ûġ6\ú·Ë=Wè݆Ğ7^üġÉ.r¸F ùèż–ÔM†@żìRì^¸u'â$ŒZĦë+otŸ?mMÙ£ ż÷É6"jû½X­Á¨ò˜Ĵ“瘕mxġ,œà@;Çß ö*ûîWĴë(DŬÜüÛ7ÖÁnA˙p=0FÁwwßu¤„òŻĥú/A›ŝé°ŝ—“ÛÌ&,AÊFèu™S§íŸÍĈç¸ÀNNŸĦù –Óûió§ĈÒ§ ¨oäzT4Á½uݽ·šú.ÖßO(öqĝꆁq'|ĊW‰/ĤVó‡àhgsĞ݃-Ç6ĴW­“ ċ'Â₀ ¨ &Š7ıt3wğpĤĉ'Î6ݳlŠĤú“tžN6ıpĝµiìŝĜŭNèàt ŭ€‚ŜGùƒ$\zÛııG,Ĝ%ôßı& á€:Hò˜íŬ0Ż W3w8ßżUİș÷JL<××GI预$!Ħ€ËÉbŬİ­Ä9ò<Œ"Ž“Ú- :y½0€‘dQ2ñi·.bKa>03î£l60äW1Üî$ĴġÏEĝˆ<S WqùSûàÏ‹ï\#0‚l@³XÚji çѕžB;œÇfËí° VtáÑÌ(çñ¸é…:ÑÔ@’Î+ƒ!§ğ=WWÖ Ï#²8™EÙAv°(ƒHÍքd}D^„¨áZssYN]ŝYá(ĵÀ>X}ò*ֆWŒs˜ĴqZy™<_è%`Ŭ‘€5Ò Ŝ`…\öLôôÔ_€LpdR•1ç­çŠk. ıQé §TXbݽ4ğ&żIĜ·—Ŭ)é)Ĵ˘ÑÂP~û^Tq"(T+´²ŭ;¸ú1œ§çĉËö  )F˜{#8"˜çœq&˙q$ĦċNèMêiÁQz fĊˆ8(Ŝ{Š_‘eÄj@ŜĴè˙ñ\˙T0—ĥCáí‡}sи,D<é…û£ÙÁ"Ü8W éżñ§@8•EñAÚ0óA/^6ĈpŠï0ÔĠċĜzï–ĝù(6€żQˆŜñŭ•öë#‚.ïÁŞ£€ò–ô>óêÑ€‘En>9ĸ·Aßú3^ġ€¨&5|´\I¨¸ß§E #QĊÑıQ€ŝ Ĵôŭ42 Ñì¤Ù·çğAÛHŻSêP•ĥËrÀì$RĦ×:ĊSèJëKŒ•9ĠÂߙ—£N~Ïŝc(˙Ĝŝ£Ş0@ûK/ŒÁġ?Aü‡ü3§³ X N^‚ÛÎBŻó, xü[tüĝîè׀j¨ÑȽĥíC³ô )î(~q LP!m^‡ö(ŭIJ5` ;<‡v?żq£qxDÍġñ}ŭcϐŜċ†rcݐ;‘ü3Ô up´ŒéÀß'q-ÏdŞ1˘áŠ5+&™à y–ìf~0jGtâÊ#‡hwĞ.í+Û‘ĠħöžKŽğ‚ #Ĥğ%OÛaë\ĝq'Û½ĠƒĈûŽ:V6à€²nĝ°güžqŭyv½‰igžÔĴYĉĴ2@C1œqèqMrɧJx¤âÁP‡ŽñK ìŽĦ K_ÈJôŜşÍÈ=Eg0èXĥ~a)í„͝8ó‚sïġ#·Ò‹ŜLOçÄÉtp÷äĤ–vC}•Ád(´Tž.NïÓ䅔ĝ”í,oQT&ÙNžċ ĈhËĦZı™Ày>ñuħ÷˘žu}u%|żŝÖ}Oê·hıĦ1vµÙË^£˘˙u1|ŭ‚M^H˜š ),ğíú>ĉ=Kħ’{ÇË ĈG'òjµB^Ğil¨ĞmlˆİS P -‰dGƒd1ê;=Ré *m‡£Çٍ64:Pgqk6kt™šôHá>ÔEŒ“×á³Á~ĞMċÚ`ŬéĜ·GZœTÚµàDMüEk{‘y@`eMNĵÓäDĈ›ìċĴÉħ69gsêA5= µ>ì­ĜğEuEaG€§|£§éĊ\ü6΀™pĈìn8#\t[™h,:Z&³Fٛ,ÖĤĤh‹LèZµŭ‡ Għáh{“ĠÒÔe• y‰Ll.ô*éÉ!ÛŜy8ŝ äJOœendstream endobj 468 0 obj << /Filter /FlateDecode /Length 171 >> stream xœ]1 EwNá@š.Q–téŞj{bLÄ@„ ½}$:ü/˙žùp½\MÀыët¤ĊŻ FšĴcm1íSuœU`|¸İŝ‚ ³Íw5ĥòTŸš­„^ÓRTn"Ö ÑwĈôŒœŝ[É­0š=)Ï}•ÙY×ĉb‘ÙKŭ–Ÿ Ӂ¸ĈH.U VxĴ£ßmÁ‡Ò‚,öVAendstream endobj 469 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 404 >> stream xœcd`ab`ddôñġÍÏË74 JM/ÍI, Şüfü!ôC–ığûû½ŸLĴŬ<ÌŬ<,{0 }ÏüžĊ˙=M€•‘1<=ż˘Ŭ9ż ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$ĉ(xéùê)ĝċ—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5ġ§%–ê•–ĉ—¤gĉç€ı L ê Œ]ŒŬ ̌Œ,=ß×ŭXĝ£½ìğT9÷{?f‹v/7]ħ°nb͔ÚîîîĥîÎŞŽ†êîêîĵµ- î§IÌh›Ù4³›cŝŒ³äzż,ûĞ\è{îcû³â ߏ˙¸)Úı°r^I7GWUUg ‡„nŸ)^}Ŝ=Ċíi›ş9–÷[ ?•]XĦ÷@ßĦ z&÷LížÌÁ×0í‡ó´ïĥÓú§ħàşÀ-ÇĊ’ÏıqöĘ0ż"Ïş½ŭ“zĉġL=¸f*/úq˘Ĵendstream endobj 470 0 obj << /Filter /FlateDecode /Length 348 >> stream xœ]’1nƒ@E{NÁ Xc˜ħ%kğq‘(JrX‹Â€0.rûüùĥS¤ĝ#=vgµo™âx>Ça͋eŠ_iÍûaì–t›îKLy›.˜mÊĵâú$ÖxmĉĴ85ó÷ϜrlHŭƒß›k*>eûĝ´y4ĊİK·ı‰iiĈKÊ!ĜĦï-Kc÷oiûìhûçÖrkL¨Àd 0Ѝ1! ħħâĉÊ7W{c€{`•šĞµŻÖ•1À (8Fx”ĝQR,Ñ'ìïô {…½µ1ÀÚQŒŠ£Tǝ1À#.(ĵ¤ĝ%1Ĝ8ĥĈ[Çh 0:vĈ;G<ŒqÄGzc€xëƒâÑ=! !§TTÈ)ĠrJAuA…œRP]P!§TTÈ)Ġ6J#u#…ÒĠùëßúß÷9zMï˒Ĉ•ĈaòĈô7ó4{WŽdż\Ÿ´~endstream endobj 471 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3727 >> stream xœ­WyXSgş?{…ÉĠ0öĴëĜê8­µvĤ>µj]Ğ‚ŠŠ û–,d‡ì&d’aK QĦU´*Uj[E[ğÜŜ;­mŻíí2>ÎwÚsïŭĤS˙ğáy“/_Î÷ż÷÷ŝŜßÇ!&Eç‘í;v „Xı|‹(%/;mtm1ó[3/‚y4Ĝҟ?Eraz$LŸ48oöwQ(<ċÏBÛ!"9œŭ„…²âìÌ,Qì“+W>µ|9~66Uğ~Eì֔´\Ħ´$7;6àhìÖ;VÄîJñbvìRaAljzVJ^FĴ0#6>=!voÜĈ=qħ›÷ĵ´wWÜïVü"Ş{ ‚ ×7—ˆÄ[$ҔTYšühzFfVv\N|n^ŝŠññħ‹XHì&âˆxb/ħXFì'ˆġÄâ ñqˆĜHl"6/[ˆ­Ä*bñ4ħĜAì$f“ˆX ŝ',àdsnEÈ"~ˆÔE2“&}ÍÍä-ġL~tòëä ò£)…Sŝ:Ġ0mö´žék§˙u†hĈW3[fEÌ:>ëG\(<“i‚ᆙùRSĉ‡Š ˆŞfZ¸Ŭ2(,‘@Ž‚b]wÚäPF³@ĤݐÂxİïy„ñŝz.ZÍĞX „"0VÔFƒT¤° |x—?ašöòÙı<´]µTrñĦ†ats˜Ĵ‰dÑB­²%ğ¤’)ĠAIĤHƒÙQİ :iWs?Š‚×È7Óûv&§É22(eFm dA‘D–£ÈSĊ–ÔÙ¤íUŞòú†ŭ@ş-rĤÒTĦ£7²&T€I ġİŭ!{ŭ7Ġ~Ë­Î+Ŭgltks’RĜİÊÚ 3*AB&vd|كb|ÔŭHQô2\‹dĴ(È˙q˟ÙiìTv>KŻÚĝ1"Ñ ƒS›­|–³’ô|‚èô94é ÄyïBž#£O)f\œpş·™ üô;K•ĠU‚Z_Ĵ0Te”Vevĝ¨ïìv5{”Mbg^]ŒżôK4çµzM¸L=ÉNZ*ËòÙôŝ‚žGڈfu§n—VT‚.h‡ÏcĊXàsÙâaôûħ jGÏĝxêá–ĝÖ ‰G…ĊBJt6ÉŞ†(ŞŠJsUû lJĞ;ä˘͞óŒĜhÀ`ÒìÌ;JL.uä`xhô8ϋË*5Ä;ö[*:Óρ?˘e(–Ŝ„ñ˜ü K”Ĵż@܏ѴË=uII£qy%Lżâ‹Hĉ}ô9˙Ú áġ²=°{/~9'˜äĊìbÓxU=Mşş§v du£Ih€ “’ŜÌMJ\Uó„ŞÑúnèlÛ@gï xàxE£Ĝ`Ô蠘,iP4Ġ‡Ŭƒêım½8ÉÈ">|ĥ¸>ÑW“á„v¨vĥ‡ŭ^¨:è„&^o.ƒr2ğŬXÓôž8—Ĝŭğ(seЍş((Ħ‚Rżù†úerHı*7[–Yšj.5ÄCa ŞÊ?éÓ´ä+³´ûGó*Ħ7,á Ôİ`ûĞpŠçÚ0Ú)ċ £×#íŬf(1•Ët”$19%HÄr€ĠĉßDµÜ/ÇAb×òÂ(ĈVV̤eĴ@_¨­ 2ĜeÜŞô!ïEĥ‹›p"ùMqÍ Máİ í'4ĞDÊ(UT ¤ÊìsŸxµĜĵĝ› UêR ġB}u„]ge²‹ŝ ‚l]°£Ġw MĦŬ]ày!#”ĥ"•ċKFвy|6Êı%„‰ä´4SıAN§ÏWì…äšs™C]]žŽ—İZiШú 5X×èq_9ĤLŒ “äsĉ#ŝhş{œ§,ÂYqVa6޸ìdž²{q1ÍdT\4™çiÇt/ċ(´mÄ0‚ž™ŭ%Fwĝ=úl™L!0ĜÊİ*ER–Ĉö<Ż ëŞèŭŽŠŜċÙ= 1g2zžĜÏNÏÍĴÉċĴ·SÍôx}@Ö9ġrme…”ŽnÏX*۟³ê#ï£ç^E7Ĉáf˘¤Q_ÁşŝĈœè˜Ö=]§ÑS0BúàÜÑÑôVƒĠDUË@FHÌbI£B²U”šä}o[“³Ŭ k_kíI˙Ġıĥúê.¨"ë4u ‘Q‚k~€M2JóĜGâA°ŭ/;ÎzşíŬÚ‡:Ÿl·êò*sÀl͔вĤ @j*+/–èĆR2: +Ġd‰Yôĝäħ__Ċŝ–wÒ:ó¨iç şáĴżÎgżŽğjŒ#èġӆVóŬz_!Ĝ%ZŸ ̨\%uù>…Ucmhôxŝó:â£ÈWüGç–Èl”h(EħLXĠ5²Z‘WâÍòÉ}Ër~]}›ÍħÑ[ƒà…:C@P[Ám,ÉÈÌÍ.ÈÊËÏ?p 5äd™CŜŜh·ğ]”żµ½Ú‹·×š”ÍŠ&UHq ŭĤŝ'ŞD]›¨rżÊY4™IšÈœ?>P•~^:ğ|œż‚˙ŝĈ #<ù5‚ô#ĞÖ³€G™ĊÒ@‡y×áê^˙żw9Ż@€ĵ”0°žKÍ.ÚŬ˜,˘@ï?êYäĉż˜ĉi*Ÿ×ŭá;§‡€ìj–фfş†ÑìaÎÀmôÍíHĉs‚ß—~vĦzó!-ÏħÊv“/>Ù×y{ĜìäÂe‡@ £Egµ9ĴUà%;Jjä’˘‚¤~á[7O~Ĝ^CùNĠ ¸ Ÿç~:Ĥıw”=ä½ß·¤unrÍ!7œ'/żóöÇŻkÖ(*  § BàĴݵµ8¨chá˙+7èÊ ”Ak(7–'÷żdâ ÏX¸|邯DǵôUyYìlZ·nĠĥÍ oÛ­^k-VGUİ>O'™ž†Tv•Ü%kò9\ĠÚbġ4U9.&Ŝ<œ‘àÄŭĉ˙ûFáğ})Çàà˙ú›ìP-:Üğ›ÜÈÎ(ƒÈVísRĦ+§ÛħĴ4úËKLcĈóì˙jӓWmVĥ*Ğœô=–íĝŠ&qġÇwê1jè ĉÇ_…mÜĠüÄaJù-6ĞO’1˘Ü™Çaòêò¤œk.5·¤{ùĈjG“ƒò½ÍEsÇ=Ï ŠÖ=èµäğ–gÏ(.O½ûqĵÇ-ˆ³ú½‘m#gšĝĊµË¤,Ŭˆ­†Vl”ŝÀoŻ ĈÀ› Ħŭuîš7ŻÚlçχĴ~ È++Ífµĥ\²1O=hğÔ: é:œt°xËêp‚¨TĴy]˜;Nò_‡/è_ïqÔúŞpĊ§:HDĈʒ˜ƒÙgíB”û~à”Ċ²änÈĊFÊD$ҍGMñ`U—,ĥ:ñ˜ƒŭ̓£oóbïĴ3)@ÁĈ…çż½Ğgì1÷ı†°³ óĦNë–[@´¸š| šÀ 9’JIÌ(Ê. ŒŝÒSñùRıÊÜZZe1ĉ²4vġ\¨Š·°<U dq\¨£ZˆÄ·€lĥÉÄ9˘çM*Z´itîa{ÔI9Ëiyb…Cŭü%°µÙ›kĈĜƒfsP.ŠŽD_Ŭà·È:Òs d†dÁácŬ£ôÌu´ĝ:Z-ċ|ÂĜ#™cè ż; 4T<ïZÌ=ÏswC7^(£…ĵwxÁ‚ĞWú%zİք¤€ğäa_<ÓdCVV7¸é‹ĵxv17ž§É[¨ÛyZQĈ bżşĊYïĥQg‘€ûŬŻ/˙…‡ï ŬĝJ‰ĥG´d,¸™eµÌ;Z벆§ŽL£ĤNŠNŸ2ൌl–Z—}úô‹›ŬŠ?VYüÎé3â˙\HñJendstream endobj 472 0 obj << /Filter /FlateDecode /Length 418 >> stream xœ]“AnÛ0E÷:…n`Ú"gÀ˜M²É˘EÑö2EZDgÑÛ÷˙§‹.>gk†ó(êôòü².·ŝcżÖ_íÖÏË:ííŭúħ×Ö_Úë²vÇS?-ġv'­ġmÜşÓ·qûŭgk=hó'ßÚá§ ƒ~:~ĠëÔŜ·ħĥ}\_[wN)Îó][§˙ŝÊ÷ŠË|ôÔBI kwNĦ¤„8„ˆ9`&Z(@ĉc()a˘.Ğ6³6£.Ğ6³6—P€…ˆ6Y­²Z=†|$NĦ'`“V 6)Ú¨p£‚6E­ [•9 Näl4¤qHƒĞÉ×èkhcjele˜×4³qfĵĤ™361mdÜÈ< B>ac22Ù%à…XCV"\MF_û1½#;2Ĝ˜ŒŒFŽ“p†ó4r.A§ CÎ%ètÈı‚9— S!çt :ä\‚NA‡œK)ès :r.A§ ĦG]ÄŻÇ;ÉÛŭu™ûúħïm½éçÍ^Ööï+ÙĞz¤û ÍÓÑendstream endobj 473 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3953 >> stream xœW T×ĥ­ĤĦş˘B˘Vš8ĊfP4 D1 ÍĜtÍ<2Èm”dhhA˘‚>cÄO$šÖĝbby/ÉJŜ?ġsùë˙jşĦÛ$/답nWġ=çî½Ï>çŠk+B$MĝCİP.ç) Š‘ûF>›ÉOñSĴĝİâÏwŝiƒìÄÈÎú”û ×bÇş „X$ÚîŒHˆ Žv^¸`Á›óĉ ˙ßvöKpv›ïĵÖ×?L§ qöU8Żï1ßy½2Nĝ0ÄùUÂÙOì+tV:o–y;oùh•çGÎĞ=7lÙĝÑkó—•iIÄk {ÄÊÈUQïĞ˘c>ˆó÷K÷H n ù(Lî>×Â7½Eӈ ÄFâb1ƒ$f³ˆÍÄ‹˜Ml%ĵ 7báNĝ+‰ùÄvbñ>ħšxƒXC|@Ĵ%Äb=1žp!hâEBJL"f ˜ÖD1$rĥZju@l-V‹³NµyÉ&×ĉ7ҝl–¸Hú¨­ÔĊ1Ş17Ĉ&ŒŭÚv›íyğWíÔ/żŭ¸ †ĈŽż5aĊ„ìÇÙ/ĥïtĜċGğCë¸˙³˘]Ä=ĉĝYq˘&^!ĉó[­‘(„Áĥ|ufG Š@Nr”ˆ2°ŬPµcH$ ĠĦƒìżÈƒ:ÔځlÍcXHÖ,°QD<÷Ċnà)Ċ4YÒ~T…§)5Y[YĴ¤FÂB7·žsĝAÖz¤ŸDŸä+…à(‰ñƒòÇmŸĵíşŬ?#ƒĦûuyŝŒ+™dˆ*ٓ¸ÛÏĵ˘W6'“Äú I7<ğ}üü™Š˜ V…JèĵdfŞ`aö›Ĵ1ú8Ñ%=ÔêĊĵäR7ï'LajŜL<Û?›$Ïž=³bżtÇJwwÇß]ğ60píEŒq ŽÏċNêĦëö áOùX&=ĤD)1ıÑ{™=˜œı' QŻż ĵ 3ïŭò€úġì(w)Œ+LjET;Ş×²0URšBcs³‚â˜Ŭ-ğËü…ħOĊïĠ`…§ÂK@>úö{Sê8Šƒ9\6áW „vä÷ŽÂÂbëŭ•A =x"Ċ>‡ÛPġżĊ͇<Ŝ‘xQ ŝñ{ ÙĴ^·Ê5ŜyĤ_Bżĝé•sWo\Y½˜!Wq˘ğz(°Kƒ‹Rxs1ÌÁS@&Fšh‡TñĈp‡Q $8=PX$ì%žĜ[1ŻóŞ'$X_Â1ùüÙz9Q›j„í;ñ&ik8JavògH-Ş—ÉPŒ’Q6úĠy (Ù͜'àqÏ^òï]öícħßNI²Â$Ex‡Ĵh6hñmž–nr[áşîóûèÓyÚĊcô,h8˘÷0–ú6ŭÏè”ôĦÄOÏ|€B88H‚P\ğ3ĉ‰éY\ƒÀ›¤} ˛ŒG*[’£%Ħ̐­Ĉ!UĊ3 0üËdĞĉÀ1öù‚¸%T¸?™DżÊg¤´!áä²×·xEE1: Ŭ?ĵ)‘)áĤêq÷ ó J͜ҭ/Dwî 2MY•ˆj¨­n6GóçÀsĝI˙D/ÓŽüŸĊgJG·7'R…[èfŝ0ĤJĜíàOÒ+a"IS`ÚzXÏO$4e@‡Ħc ħx"ĝAŽ:#ˆ¸Xq79(ċ&ÑÉĵ?8HQ}ÖqY³ż. xUÙêÒġtœŞİoŭñQaX‚š)k@Ĥ²éšèœ´ì<ĈŻÚE zX³$xŝŻIRĜ‹™·Ó$ _äá_ûY,“S™[Ĥ@” E%° %ôžd¤lĠTê4̅żĦAúË}ßfv‡ËŒs€ıú[ŝdÍûÀDéQʌLψÊghŜooP„l²+şTÇB,,’T4 °(Q2‹Ŭ5)5*ywİQúǓ˜‡ÜzÄ]ûb4Ĝzù‚ŝô'…Pr +ü’ĉ9û $éOŜsK–-GÍÍ ’üñòġkŠozÚ+´ í˘(ŞG“oYşŸħ‚!N(°­­ĈúšÎĞ~1S‹ÛÈÑ2úeH5Ŭĵ‚6cQ7ŞŒċINÔÀG‹ù~šÔp~Sĉ\êÈéĝêt¸jSg–Ĥ|Ԕ…úÇߖËêQ-rŞEġ¨ĵĴá[ÇFÒçsA*ù1_jbH5or–܁ÛmòÉĵ†ää‹9•H†r“½£ïÍÈK˘òÉías–4S4–4ħRÇ^Á÷öË´{ë‘Ó)´ŻĴ˘§á;uYVhXê´ŭĦµn·íKîDĠ¨íï¸ß8Ö5Yô¸Ï8‡.=Ä ĵĊó‡Z ¤È2 ÷e0 “Ü[{ Oŭĝ´™€˘ öPÍüE+ú]#Âq‚‡ğ9‡SüF*P"ƒĊd˘wž:*‹ŬŸ×€Ş7ží˜ĵ#ĉƒì(A y³Ğŭ€Ĝ³+ Ä–j4¨Š²ürNAœ6›-ŜÛ$|œñŻŽ…Yê„P^äğ™ ‰!‘сy%ZÇü–˜ ˘"âÂYşÖżeW÷WŬ·Ż×10ß\…QqSé>M ŞĤ,ǎ/ô:(ĉCJ,‰MIAљLÂ.˙ô D-]ġùwZŝtsĠŜü"ĥ0_2 µ‰ ˆÒi5ŜžŽvà÷7bĉ-l÷l&ĵÓZžU™ËzWÁ‰ú{ÁŞ÷YŻP.FÉ*ÉáF“6‘q( É<ñ*G„"ŜΖ ˆd·äTĤµ};3›²ÊŭµÉÈ|#:Ìİ$‘#ÓŬ]£„=Y>@-)Š*LׄàHy *AÚ"ĥ¸ü!èÔjÈï÷_|NĴçġpDGô)é§ĉNŒK$pÎTDPıS[J`SRžšÈ~,m!ġ.Á×ñ™ä”…RP5˙kÙP‡‹ó²A‡GCR²ÙWùü?ñĠÙäŽEBż:Ó,½{üXġtÖ75 5İDñ§“âE°TJ·zîxÏeÍzîÁCŽğyċ‚÷ĉÑÖtĜq˘žŻ üŽ™èČü˜ &n§OFrCn]I_QEjëQ;Ĝ­~ŠxüìYÂôiû+0Ĥž~À.ƒR\FVܸržCPŬŞâm–4Ĝ .NqNú_KPÒòóŸ9ĉž3ˆğg[Luf3˜ Ŭ`ka‰ĥgÈk]šNĤ0ìpJ5˘jWĥ˜ér k¸ ³„`‰ü2é.ñÇŝɀcœ&š ?Ü`< ĥ7Ÿ>aW¨^kĉ23 ëgrÄ*Ÿ‘Á/–öuġÁĉ>Ŭ5~Ŭ5Ôıĥ^àíEŒw‰jòŽĜÌdËêĵ5ÛĠuQXipm$KO#²RÓ"”/!E™²,™˘ŻĤûŞ>>/½ Ä …_â³ß­èvŜDŽĞ]÷*öQôt—]¨ •î/(bĞ2ZSN jÖ­ïŽIÓ²5‚AĞŞÓµˆŞ×jëYìá,ŬêğˋĦ5Äĥ]/žî<ß}j·ûߤ~î³zMú̕§Nt?Ù£f/‘À½cĈÏ(ÄÑÛÎŻ˙ĉĥk˙ÄUqŬùÏ.;Z‚xWˆ•÷55Š™##žfáġ"܍ÇXĴÏŭ^€_ĉk¤:U}x¸J^ŻÒéêëu£×!HáàcAġpl@ÌGÂ{Rԙt:ô˜ĴC˙­÷JGYİ :Ku=Ó’ƒ ċELQDҌ\„èá‘.1uO°`‡ċğ›— µ(Zĥ|Ħgk@I&{Ò·9ûV≠Ç+İeyġ1UIHNyíŜââ‹Ċ%˙Ìfòµù5AĤÓ„WVUĜaÎÊıŒsBGûĊ‡–€0V€¨Ö Vİ1˘ ñ È/;°ĥiµ˜Zĉ™Yh"ñ\ü² ÙZgFê“!ĠN Üĉš'ޝ7É;_€ ža3ê‰Â€ŝç3™ÜDĥ1*ĵbWû!ĥ·Xeé­ħĵà­Z>]Ìàż4ôdĉcÛo@:v%nKŬğ$g·S>™Ó{/µÛN:êL.ŠqÛèˆPÁCċš€CBsjD‡Ĥ&òċŽG?Ż*áÊrĦHß$ú_-dBa ¤IêXżê—ÉÄW–+„&4[AÑoʎFɓŒIĠ£wKÂT&ċ>0Z’° îúܽSgNÔj˘½œ(Éqµç^ú‹WFR…É"Éb¸]z"Ĵ)Ĝ_ìߢ£î,ï$ĥußé&\8ˆ°ş„Œ^cmmcUnQn1ÛrĝšdİŝOdÉıÁrVÜĥwSnbPXô•tL'ùËé•>·x,H]‚ÎÊĜ‚Âb *(8Ñûӑşp_C|"2:1dá3/°‡)ß>}:ŠÔÏ?%N_ ċ•;Œ·7ĝ™<šYÂÈÉ(”Ÿ‹0Šö˘XJ^”ÚÎ@ÁŒ Ž·Ö\ƒ~idżß*ĊräĜfß$`ÒÀÁbAŠ÷½/ğżG$˜WÁ)ˆ>Âä"Ż³÷0Z˜ġë·…Ğ^uNifNvNJ£è“QĠÑ:ĥĥı'àÒ<OúïvœĥĞzĴĵvìŠ|é{ë<ŬŬ7}ŝËWÏŬĵyeÓ2f\††w×ÀòŠB5ɍĠÛ2c­7+íĈ´7Ş…Ÿ‚"uMá;ğö²2uĦF­ÖŞ5ĵ•Ŭ ñ˙}ĈŜendstream endobj 474 0 obj << /Type /ObjStm /Length 2689 /Filter /FlateDecode /N 87 /First 810 >> stream xœĊ\ËܸŬç+ĝĦY,€áMYAd‘²\÷0f'Èç§J-v³ĊjšjŬv}-İĠâ9dU*’rHdœ )ÈÀ˙&ƒ%óżÙP)üo1İD²3%ó9ß 7do 8ı‚""y„ÜK†oá‡ċh<?='ċĉl<ùÀĊĝäɄâŒ/ŽŻ0èĝO(Ŝ —&  Qî ## … ĉ$÷‰ ž’ >ÊŝA ı‡›‰1rÒ07JĝC‰˙xó‡† n˜",ßJBÚñ/ 3 —L„"ÙD,òÀb"%ŝ)8“<‡‹ç'ƒ7 ¸A4ÉıLàdR,òUä”ĥ ™ |FMF›‹É›ĵ39qƒäÁä̽AŜ›â’|…†›Ba`J ı‡L‰î#Ž<Ħ0 !ĉ3y”/ †CèĝˆxD y]â%äat™&!$Š<€|N|`é6dû€…? /G܆wIžÌmxSà6ü‚.p>† =ÍGÙË5n ċë€ ½¸ Ä(÷q((‰I&”_pXPċ6£1Ľq!Hcä6‰¸ 6c~ qlƒÌ—¸ G~ [pçÊ5nƒËS¸ ŝ­·A™ŸJ‘ۈ܁b|äÑŭîŭ{óî‡ÓŻ_ÍżŒ‰ĉŻĉŬß˙ñOb`ÔHd‹ĜĈÏż}ŝlŝmŜŭùô߯‹g-·ŝċ—ÓÏ_ı·a=˙rúôéùìo?}ŭ|2ï_OŻŻÎ…OÎEĥ߄çOäAé|͇ġşüëùÜñġz?_‹™?üŒ>˜ šğÙò w ÓtXBĈ^r.×ŭ‰q g˽+İċ;‰ċ†ĜLb%Ĝè°#–‡ÄpFͨ°§¸x:ßwfo#·³%R†DÒÑz9“¨Ĥv`ĥĊĊ- V•‰üÈhÈwĥZMjÒûIô`‘³%Cċ‘Q×ïŸXÍIHUSÛë ĦŠEŸ„t u„öQˆĞĵœŻ…·£ô‡_~cżgѲó‰lJÓüñ§/ż~]’•ċŜ?}”³²ŝrKÉÚħ,ĜĈéÚ+óŭàĉ‡2áԐħ°Ú˜{' 7¸%3S  ŒÜ¨6ânƒĠ°“S|Ÿ#ħ4½…M:ìĠîP!AĠ&j˙žV û˘l‚o9½°ħô}‡ È÷híñ}‘TÊáĠ"ġ@Ó¨&ĜßàĴiA>ċü9žóKë]éÀç!xM”;o'Â*pç,'ß2‰pgOK‹˘˘b‰]ħtıDqCš i<œ;(ħ8+ßB†!dMxïAŝfş/ž{ğËŠA/šàvŸ'°÷épuÈġMçĵÔéhşİĈq¸B›‡ÙV45ñÏÑfHÌ;*ıÂÔ4³ƒ‰+ŒÓ šÓÄz]c:‡)~ߗe¨ eJAĞ!ÑjLá żR•lşÒ=DħĜ‚½/ ġµÌèĞFáTÏu|ĤêPaˌÂ^ò•&Ĥ×ßÌSFXçğ)Š2Ôß2£ż{¨˘ÉġŜ=â2%ĵ“éŒî9ƒ’û¸*˘Bî*ħ-‰)ž ħ£ÊÊ#ܔ‚,Û‹jİ´ÔX2ÇÙÔXp;N75֝Âċž{O)üù41 žċ-mb-“Ÿ-âK•ĝJêàâ°•e™âVq/]Mj9ûĵœşô~1Úâ݃†°§dúMó:z@ÏZĉ;è4„>]>”)0=H.ÛP) #˜ğ$÷ié§B§$fÓwz²™Rċï’Ö!‘úĜHÛ²RVœF¤Ĥôx­żĊjĉ~.+ı•ĝA"!DB½7—!‘)YnÔ,úGBĤ Ĝ´2)ĥ nxF‚ßĜD€dv NĠż¸z¨;nÛQ ĊR7× +à0/Ğ“Ö Ğ—`ħu‰? EĤjÛĈë [íáv}b_Ù˘’à ÑbŻK0”T˜’TĴŽYšİ$8›‰Ħ7÷Ħĥ”ĥĥñµ§& .VµÓš”EĠè8ApÛ ’`¨ĵ0ĵ5‘ĴDŞġÄġúêİ–^ñJjùn§_+äBHÖû턜lj‘›âïOĈ°„P€Ġ5ûŽÌ û<mĠuüÀzĉş"r ŭ­*áE¤o+KÉe։Ĝ•‘Ŝµe$B[F⭈ܔ‘z…¨çul­K%8Ħ“gnìÉoÔԅá&M{Ŝ Û³ġìjHïuĜç~öğ+á‡×”ċäÁ–ÜɝÇ!è)Í~Zù!.m|77*ûĵFDftûí*xxÌl6xŸë7­áU>’MĦKù|‚Ÿé‡Ğx(§Ĥ%wċÓç”Ŝ>½ŒÇ¨ìàVm}°ÉCBSšû}*yqʗş½²ùrDjJ_Ê%à+¸ƒ€‘+öÜ­hË\ÄÔt“£ ĊYN :wät9SüjıäñÙ}ŒÊŜIp‚Ç>5ğ…3rú` ĵĤbq ”Ë. ŭĤ)ÙÜfb7ú8˜żŸĉl³°ğ´Os4‚ÁĤ~7B‹S%ññy) "`ħħÛ,%ħUˆĞé^G~îċ0%Ĵogñ nY[†~?à÷žRġm :‘z­^ĉg:Ñ [ÑĵĊgĦöĜ܀†˘Ì"÷v²UÑ[ÌOVÑ LGُ J$ĵE6µÏĜ]=.ŝĝh„!^Šé6Ż0ŬDÀ4ŠyjTÁk„H5ŝá›Ä?…Ö·[j݇]ğ7ŭ¸SÊü˜MHd}òŭ˜”vL[U˘[ç-í+úÁ ² SiÎiĥ’uŬ[@ò>ߍ[ġ½ŸµKc]öëù6HË÷òŬÇó}U€j—×aĝÖŭ¤)İq@'´z³ZUjŸVO~i,²BĠïUWƛgóîäüi")ïU\F:_ƒöÒßĞÉoï9G×wY™ĜŠÑYßOjŞxH_p Aĥ.=ÜiR3·uÓ0nL^ƒAê·ËĠE˙ĠOoŞk*÷ŭôŽ›Ĵ/o\*ꚗÑuȖ “Üeù9ĠžÓÍ^%#Âş)kڔ¤ WğÎq)ö6ÛQ&aPħ XzÒQĴ£İĵşgêóeĊùzÚó‡Ŝ˘U͜żĤÒí:Ħ<Ĵİ—Ŝe<ëôCiòĤ5$^:8]½£] _>twÜ5ä˘Mä{Ù@V_?­}ìĉñj†³&ŠÏ÷P}ÎëuŒ. ħ.âżRŒë§é†šßW\sŬ+Á~oKtwĠ}Ħbϛ!wٛS1^’ğĵoÈd—ngrFPĠ­Ŭysjr˜¸q¸vçfĜ|;ì/Íâ=:òżô˘ÈĉĜÇì[Q]n³ÓŠ:] ŻúIU“êC+²˙â7ƒ£endstream endobj 562 0 obj << /Filter /FlateDecode /Length 257 >> stream xœ]‘;n0D{ž‚7ġ% ÛĜ‹A’ ÈÔÒPaŠ ċ"·ÏìÊN‘â-¤%VÇó霖ÍVe _ĵÙ¸¤ı}}”ÀöÂ×%™şħóĥ§é ·)›êĝ6ċïŸÌ wŸn\}m§ŸêŭPXgç)p™Ò•Íè1’á4˙ûUû‰K|ĥ)ÎašħĞIqڐmD¤@1‚s˜P,öşÜËò’â&´'ڋ¤@Ñ@ 4ˆ2)P¤@qĞÑ#Äk— ŻA^‚|G ´EĤ×\Liäuu)Gj~µj£N›…v-/‰˙ž+ŻYNY`~ᇃÏendstream endobj 563 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1713 >> stream xœ”{PT÷Çïġ½WK!²sY ë½×ˆŠ0"MBÄXKâ‹hĦ< M|A†Çò”bPvyÉîı,/—·ZÀH”Ed•m5m³mc›cLËLû˜œËüœĜğ.„!ÉtúÏoĉ÷ûÍï|Ï9ßÏï”׊Ĥiß;Rr ׆F›²ÓÜ'+Ô Z5,P—2`žŜ2ä > ĝxĝŭñb|Ù·>F14ŭRZöóĤĵ҂LcF‘ĵníڈPm}VŜ_*G‡É1)İYĤ’ÂĴL9%7MŽ Û&˙ÄT˘fÊ+Mıòŝ)Ùé²)]N<,'%lŽO·ĈÇ&Ċ%Ĵ ›—Òì†˘¨Ċ?΍6oO=Ÿ½>ˆ˘ž bİċT•@%RIÔ.j5ġµ…ÚJ…SÔN*ˆ^DùkuR^Tġ)AÑ_-è`|™,ĉ¸—ŸW³·ÎÛä=ĊĜ\n=žò}¸à/ITÏA ™T÷”Ó[h€şš6bTï/){+J€`K Ê^%Ĉ÷—Ô+Ôy}.:Ù0ígGY‚'ÙÓ!­M%cĝkĥ½$R„éÉa]˜Ññvۙfg Â6‚µıˆ×t—şuoşÀċ˙pôşmj혀'9Ŭıí]ñÄŜċmï°oVuî3Ycı9]zàĊ[ʇĊ³ìGې„ùÜí+£ÇEÉ"9Áe5½6:{ċİ &ħ҅ĈI˙ğ¸ û@(”ôşsÓ¸K\F¤ŜôĈ/z.]„›p÷‹KԃêŽ)ġu͎Ë*ğÚÍġİ-YJ>{É@–żÜ›3P( eT½k~£fĵöñğÓŞÒö%´]Ŝ-Ö4ÔÚĞÁÖ [µġpyC¤ùŞşĤ„žá‘yDWÜ£8İìˑ ‰X¸íñ/$T·_ñüìĠ# 2ÌÉWrŝ=!|zAÌ÷ 8<‹"c×̛Ž)ĦżÀ'ĴÔ)Ïëäù´ŭâoŸıíùä&=ìNeÏ;´=omíV‡ċ¨,ñPÙîŭÏżî_ûs_˙y}൧Ôjŝ–IÇŞê5żÒ›Ĝ ˆ?#9°W$UĴî?óÔĈfÔ:‘á0’œm/l^ü-ÛŬ'%˘Ĥ q‡“ˆŸH°Xä{ölפ݇³ĝ=šğĉKŸ_ΰáv PÉ¨§o£žÁ\üR˜àúmJ¸‘Í·Ùò\bë'Ĝ~Eé—È-Ż˙u­•oü†µ¸É­˙M˜"ü oçM´ğżšûî/yL½ñĤ╀ıàœüÁ‘yßô˙è[ÜĞîíÂÌv…u-B÷ÄE^‰&Ÿ…—^olT{½ÒhW||îµĥj;moo°û|Ÿ˘ŝ óáċ+endstream endobj 564 0 obj << /Filter /FlateDecode /Length 390 >> stream xœ]’ÁN@Dïŝ ˙AâxĤ;HQ_àÂa‚ŭgàX&öïİŞ‡=ÔHϙÖԋzw˙ĝ¸Ì×v÷ĵ]Êk½ĥÓĵŒ[ŭ¸|nĥçú6/MwhÇı\żIgyÖfw˙gX˙ŝ[k‹ uşñÓ^w/ÖwúÔŬ†ÊeĴëPê6,oµ9í÷qšĤhê2ŝ÷SĵMœ§ïĞ=2û=N` °#Bˆ}(Àž˜B&b˜‰ ˆ ‰ÇP€Gâ](À;â p&4Jj•Ĝ*ĦQRĞÄV $=”ĝPšBâ/8eÈe f fÌeÍfÎfôÍêœÙوé!CW“ŻÑ×àjò5úĉL³ĤYT0Ġ0Ö0¸š|W“ŻÑ×àjò5úÚ9à™XBâ p$ÖP€•W“ŻÑ×áêòuú:\]N_‡ËÈiä°q96.#§‘Ĉeä4rĜ¸Œpr·~–ˆkĈ…ŭÙÏĥ|n[]Újm-—u^êï⯗•S-Ò|o5É1endstream endobj 565 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3587 >> stream xœuWiTTÇĥ>msúZ=LšîVQÀDqVPÂ< È( ‚Œ"¨-ƒW ‘D%*CChdoœ h␨1‡k’}HñV^5ı÷ğÖ{oµŞvíúö·żŭ5ŠmBc‚c­ŬĉZGG(4K3ùÉ~Ê(ŝ a ŽŝƒJ¤ÑX!ĞU6eü ¸?2ǃ˙J(lّf“ĥ-4N`ɒùòÀòÀ(y|TLüֈ°ĦÁ ùîèĜpùÖıuXÜθĜàÀHùĈ¨ 3ùšˆùÈıòĜàÁħğ‚fr›è¨0EpT\X`„Ù˙ĝgŠrM‚˙k•˘¨™k˘Ĵ£cbmwĈĊïÚ¤v qÚêî9ıĊBËE‹­–,¨i”#5r˘œ)Wʘr£Ü)j3ċIYSkİu”-5ŸZO- 6P) jeG-˘ì)j"CI¨IGéRz”>e@R“)cE^X ’żŽru\¨-tÖ _j-ÔŞÒúLoĦ;EF˘DÑSÊüÉfżÓ^˘]¤}u´˙ès£ŸħÓ5†ë6ĥuìĞqQî‰Ç‚J<$CjpÊSċ‚”ĦċB¨ZÊá]˙E9ĤÑŜfìòR‹{` Q˘ĵòÀ>ğt²^İfœ ^ŝOÚ Áŭˆ×ŠÄü'Ô̏şüBç-L{ëIšÏéjùç(KiĝžıTX{ä4bož [#ûeR@&훏œ}dCB˙yŝñеÒë[ÉmläC}ƒ![=3iñ‹ş ´ vê|]Xҙ דüZ3dÁy3×3ʔôY&1Ñ)ƒ$yƒĞî€Î/›zħö!™dÏϧ[; ?ŻéÀ&Rɞ9ĝ LIvqv1bß4‡ĴX°%hzZÊN“I~Ċ·µ İ>t•!öC[à˘Ù›˜MJÌÎŜ+óöw3:AJ AÍgrxÁŒĜ Ïŝh ³ÀüG0 Ó÷x,ӃğÛ²ëa]Û5ëüî‚pÍwî’0?àèXŬ |ŭĥç:Ż@ Û`ŠžäI%Žĉ \”Ŭb—“TBBĉ|ĉ™ƒ' ‹ŝñ‚ÜêíToŻĝ­N²?FRƒgˆn_'ıg’'àJ^0g‹Şò*û䊣u²ĥĜ½ëPnıt j†0ĈĵžTiĵžäv.Ô4‹Öĉ$‘Ô3çNœÊ/C5¨"4–mƒ40ŝH<28€ögÈÚĥM‘óI‹Hr“›ïǃ‡W&ċġÂĦk‚ß@_xVZĠ˘uı{Ëh’!S²ŻÀšJ'Q޵r ḋŠ÷•΢oòá,oQßżëç˜AÂıĤtñFW­0ĈÁh!/£9Ïc^G½‹Ç[ÛY:^ }"PtĤ"wÖ?"Ú=2:Żd‡4µ0ċ9í€MD7övío%¨qû>Ŝs9cŜ$sŞ ;†ًg*Ġ•'ÓS+¤E)Ğé‘ŝȸï{>— žÂáSŜœ*yf‡×ĊU&žI?P{AÏIĥ•ٝħëàNÄnÜ[uWF`҃M`‚³yúš@:˜óïҞŻlĉ…—ĞËu~ M°QħĴ4ü˜ş…Vô fT?u´W6ܔJâÜÀı™ÙĴi~½/ƒ§ìıÇHÔİÛ£Óc'Ûî¸0 ƒ›$p*痴Òù‹Ât>‘óezÒaázúVóĥ×òèìâË\É8ŞÄ"ĴšͅĊíıt #Ş˙ëdÖP‡0ë_'9ròƒĈ!ĈôGLámŻj‚8û2éyJ ܈´ħkcX …%êiŞİıÜkßj„gaJŽçà?τ}½ÇëúH´ŸHúµĵÖU˜SĤœt°!DXÈ É9ĵˆÙ–q8†kÎT9ĥÄFßÍ­+m•Ŭ2WpT1ž9Ê2zh1İ“)a>s¸“ OŽ>@ĝ`ċÙZ0ĉú½g§2RkÈ=ià_t‘;&'è ùd˜À9‡¸'x ÖÄŝ`²ùdX„Ž =%9;{AżGvÀ—Ïo6ƒwwÂ×:@<“Ta1Œ_cô$)~6ÊIfSċŜù“ħÁÒu3lšÜžÄÉBĥ'DĦíH™³7+ù1ċËtE ½á’‡n$IK ólÍY<£Bş>˙`AV>:j€Šċd |ĒȠ˙ĝÎÛŞ§“Şd@u‹È¸!SĠĜĴ óġÙÖüèŝ…Ĥ6 m;l=SŜM¨DŜž>6ĵ[:kKŞĞ+bŝf”€y— I$ è@H VCğ9lâC+î?˙k"ú‘éÊĝh÷_Óµ ħ7Ş˙˙éê×5ÏÏ=^a#….˘ ¤YŬPÚMj   žûżišqÈM$U‰gŽŞĉ˘¨*àܜ²-ù~íA§ö\LnBç…uıD3P&ù6 ÈÒ]]{ÚöwF¨âjNl)şâú5ôšá²€b Ĉ&áy²lWnò,ì=³–/WüBtÓ­áí·¤ĦPŸs£\Ċ +„ĦްĤ=˜V‘ŸL§0É Ĉé´|hcĉĉ¤”Ñ<0šSŸĝ’>Ż­1ik>q ³ŭÁ$ĜEƒĜÍ_gX­*Ż8RtR S~´<ç8b}íiŽ'’Q*ÄÛ°•l9ż\˜ ˘\)×ĦôdôéÀŸ0 5ž-†XŞß8 N_½ŠÙw‹ïa Ú ô ĤyK†Ìq)‡kqŒ—´kôŒ? Ŝ>p0% &Ô½œßÛ@H;ŞßĠÜÊÎ~ibRvN˘, heNòádàĥñ;0dêÓï ùµ-ħ,Xq É_+ ˙³&öè1d” &š™Aœ 6äÇá˘,ĵŻ@ĝ(‹ßaĉ‚éïaHĵĈÚ Û½¤§Áôû§ _˜İp wŝĜWG/ Ûîh:ŬÇaÓRïÇ`žŸ]‘}VCˆ°rŝ.ĝÂGšìn1?Ñ(‡_ÑżW‹à[ž§û5%ġòzta´9è€15 ѓxÂ~<7³ŜğŬdŻĠ7]½Ùäeí.ŭ:ޏP߉ŝÎ_ösxڂ•X´ö+;áRÉi‹>n+ ñ¨7‹‰·|ó0R‰'zêÓeZÇJNĠLòşŒÖ°ö>ŝ6Ğ\zžŞË/6^"š>àQù`àş  à€Ĉ˜Â.")ú@4bxtŝÔv£˙a› 6Í OášáÑT<SĜˆ`+ù˜ó c #<OzaÚê֒ӭҐiËV`‰³ß~}1ü´,ȏ‘9юù„ó|êï_ÚÔTW§R…ÖÈK-²ĉç˙Uh£f­Y³&N,÷–À޲öQÇhĦ¨˙/œendstream endobj 566 0 obj << /Filter /FlateDecode /Length 228 >> stream xœ]1Ž1 Eûœ"7˜Ì3BBn ĦĜĠjw/ …Ħàö|Ĝb‹gé%ħb˙n<K^l÷Ġĉ‹MıÄĈ×ùÖÛŸs1ŭ`cËË´†‹ŻĤÛĝú{Żlñ€ÓÓ?ŭ…ğïq˜ô¨6…9òµúÀ͗3›s´K‰ —ĝï iÇ)½žŽ=)ÎĦB7¤@7˘#)QtK t+HÑH 4Š2)P†N˜Ip:DW¤@W˘kR kQL4éT¨²Ġ{|YP˘z'c­5.‹ĉİyILı_äuÒey0vwendstream endobj 567 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1285 >> stream xœmT}Lg~ÒŜaĠŜ M{:3ÙTĉW–TIĤĝÎİ“"Ò \Ki{ĠöaQĤ|ˆy·Á@ÑÊ7*-\u£Ò(ÛÜÌPœtš"bÜÌÜtYÜ{äÌĥkĊÌ?öÏċ½ĵÏïyßç}~Ïáa°˜Ġyz;KÛR&ÛĴzfaŠEϰY‹5˂ğ~&ĈÏ gIJfâÖDħFJ`d¸*¨ĦĝÁŭZÂHĵ~–´\>™ŽĜİÈ0 „aXĤeµmG‘ŬdÌcİĊÍ"Jï ô UÀì(Èĥ˜yt.Uh³›İì"*ÁÄ:X;­·R뙜8j•ĊB…ꔝvö]tnµÚĈLı4šô–¸˙ &ïˆdvĜlž6˜,V6ƒ- ¤‚4  `H`˜"êá Œ`‹°l½ñŒ’ĵâP™ŬO·¸tCâîwë\˜š˙şV]—Ż–ó QÒ´nËQR49,ê)çdkCGÁżèiwfĜXzÔI¸Ĉdğ}XU ÒS ÷҃FĈhÎ3žK!=!1ENmPÌÜŭ½üRŻ˘w çšsƒ?šLEy“ÒTŸ[“ AönúÒ¤>óZMžĵlċŠÒctFÓĈVÛ`S•Ü‘f Q²ž½}gEİçñì9ċ8Îï¤?Ïk$ÈԔNĤÙÓŞs°­­lO‡ŞvÔ/“£ğ•gù—|cMĜx@2Îk”ÂĤÙ8Ó_SïSypĥ‚­d!ħvŻ{DÑŸ°à‰ß·ž‘Zp9yßĊ4ŽîjlR<|f°ÍáK”aúäĈç hÇüƒ­Ŝ *’MAħĞ.jòëh|ò3Nú ³é}†™IÖîĞj4*²V•}PqšÛ§èGÛEÚbt÷[ċÑ-R4›“iƒȋ?ÎòÎo§orԖµŞ†GeumĠ˘ÑW›òĠf\ei…ݤ{_û“Š,€ƒ-C^ñż;<ƒÉvĉC"êö_êD³Ïˆ–ì?Ì½hv?ĉCŬ“İO”ÉtFa$^KAŻ| Ğ`•Ŭ}\šşĉş€ 1oÌĉ óîǢC—š¸ Z‚j”‚Söٝóß\„ÄžĴċ°V¨ċèşĜ9J*òa’“Qh'Ûl Ê'¨Żáp´ċœ·éŝĉ5ġÇaá2·ż/Dĵ+,Ż„àĠ†bİùâS0Ù0È WCÓ_WüŠJ|§(nbĞÒĵӞoî°ğ\í.×γšĵw@°+\lġ+Ħôhƒ9+ĉ,hÇ*\Žz 71E$ŝ HNDĦ½œ,9¸7ħB´J.ÖŬxʋuï‰çNŒê(+h;żW²}të6¨‡éğÖç˙ĜP´ŸgŸô·ôyêÜ3/œÈ_ûBĝM“=œͧˆÓáûI@‘S0œżg Ĉç$³Y+Urg_P‡ùjeŜˆÀËü !ڊËendstream endobj 568 0 obj << /Filter /FlateDecode /Length 3320 >> stream xœµ[ÍrÛFÚ#+Áâĉn™cÌ/fR›C~œd·ĵYGV*İ’r HHB  ÚQĠ>ËŜĈöü3II$e 3=Ŭ==Ŭ_w˙§Sŭ×ŭğ¸ŭ1â‚#EÈ8œ Ĉ<a1Ĉ #ĊÔ¸ÉÇżŒĞQŠTĈDŞĈ7O˜1şŭ4z}F1ß´f ŠĠôÒ0^"ĝ„•@ŠúR~ü+ Ħĝû§ĴôV22›X Ûg÷Ïânüġ90B$+¤óë‘ĝHR"Çâ)Ÿß’ysÓNϽ97tŸK2S(ZҀäeÒäóċğĤîêïŠ2o/§ŭƒö—QÙKÈR‰¨cJ eöwÏ0Úï•’Ş×:^ċµg+s÷‚3­ŝÛÖSQ ĵ honğ@Úz rei$fsüÏ\Ón‘QÉĈA³eHŠÁn)F)ç{ÜĜîñA‚qÑl8HT ”ò§ĝŻ=Kq˜°@fƒÁÇĴàt n 6>Ġĥ›"ÊÓÎz [š§g;IİċbñjŸ.ò × Ü ‘‰ˆj{ßvùòF| Ĉ ‚#—I  KC$)í@ĞFE ƒ6 ­41V:9‚}ŠI9¨ Ĝτâ#ASİċx>߃8Zâb›?í×)•F#œĊZüġš£D›ûĈΛP;#ƒÄr<3N]P,WħĦǫ̀LPŸ™”!ÇŝTgœI*"ŞZ¤]ëQ'†€STŬKQ^½Ìı‘™‰Ö›Ì—Ë&oÛĞşŝ€Ž?DâˆĜhzĴŝ½ßŜQgPS‘Ŭ1›@ œû˜ĝµQËùfL‡@&Ŭ\^t°·çù—)ցR¤˜š|² G„6F!Ĥ´Zö0€`.bB”Á2°’|ş-† Ż8)ZǘIqSĠMtÁ˙×~ z”kÂDטë]X(`›HŞĦIÌvÈTğ^­Ê"_zNĉeéżKBĵnir7ï·µıïñÍp†xĈ"­ġ?Â9aıĦüÏ.ŻZƒ˘-KɧbàVX$ež“ânU7]܎ £ç°BÁkîĊO;Ĉo 'ÂR$ež(¸i&ٓÓNûA²†8¤9Ħšú10>Ĥĝž ~cS.tħ™Ŭ°—Šßô„BNŽlàÀD+ŝĵLü„‹ùÄCÌÁˆÈžĥAÎÀ(‹·ŭz]–¨šßi?drP#·6„(HJ‰Š¤9?ûùÍÑè,ŜÓEdP —ô…"r@<Ê$Nq”Á­qaܐ;Ĉ$ŜÌCV öGÛd¤)Ŭ@€Ÿ0l}WTü28},1ĠMă1²Ì”fĊ&ħzŸ~<†%ˆ1chx`—4a8$MìħÄKğDÈQàŠ!ŸçĠ-í8)İvÀ ˘Dżm숁*Zd]ĤqPċrêŞ:`;z#àY@h͂›™B<8CáÍ"?œœ³ş@Ž£ĦS ĈnäJ˘½Á$–Äİ,³u!½p€v¸@hÌ1ñ›nd€ hR֋yg·[Û,Œ˜ü Ĥ™Nž‚żt‘A§LKíúj[™/şşıwĵ@ Żŭ3ö;bŭôMñ1݆oî éŒ)Dò•—P$ŬŭŞXĜښŭaŬ:ù5ĥe8ğ^wkíŽ ‡ŝE9ĞħcžÌUaÊ|‘P]½­çËG´ĊS@|Ê Í‘'2è Ĵϖ`7ö_Bü瑿@[*逍IXk{ĵħ{F aa\ŸŜżĜ³Â 0,ƒŝR iHüäáS— ÖxP‰z9$Ğ’foOS‰"\GĞî‰Iĵ 3ŸÑŭğZ€°JûlrĤ-Çt3l9\×RúDÔ~cÖ7Úѧz:,¤ÊíMkgÊ ckÔm–‘É2oMħÖST1ĊùÇyQÎŻÊž5F'“*9Û|ŜèÜßÎĤ0Ĝë†Àdœ„ŠJú]ûâ۞ûwu]nSùŒ)b`9ĥÈħ퉘6Çĵô- žäĠǢİ+í;KNMX<żġÍPŬşZĉMyï5şÍÚ\ÜÎĞ˘½(àİ—C;6oòá­‘L9Ċ_ġƒqĉܳmxÜĠMżtƒ;Ĝ„ĦŽlsY˙ˆ*}bôqeÂäŬğ­z#x÷ŝ_ î—aŬħ²V ĦüIçdEpèXoe@q›G§*…­z†Cß9!öçTê<ç~ôîNàÎİʀ;nÔQ…—cH…z!ĝ.5Ùu,ò­yÉ´­Ħ 'Ĝ+í÷ˆSٞ~úÎ FC¸ê4Ü gX·ük§ïĤ~x ˘Íw³™~òÇI“˙ıBßüëŬÛ_'әR1ş_ÏŜüún24ğµ+|ğÙĥ ˆ½??ûǏßkjŒ§–š‰FWëkôC^–ġ/uS.Ïò?ÖyÛMĥġÂ/xDtëìvUWm>ñd2éÖ`?à£ÑWĥWu]ĜN> É÷ÓŜċM[W“M¤ŠĠRí3ÂÍQ’ë6>÷$ÊTĉRĴbœJÀ4ħËċ "=˜ z$ùYçÂv@×|èg=};ԁCŸÙ{6Nĥdaz'Hœ„+c żŻÛŝ ‡Ĝ@=@$„Û!ä‡RÇY{™Ê?m­%HDĊp—%Ì#•ħáòÈB¸àşŠ3•í7G£žƒ3vψcŒ;$kÜCŝ AtëHٛiĞ—i{Ü.u|ûÛ^D‰İ:94Ċ5—PxDñ2و§nŜ¸Ĵ3Xó"ÑüájÛKŬĵpŭƒPÚÉY}îŭ(@Ĥŭ ™ìİ;’˘ŒÊXgĊÒw<ƒŽ’8}$ˆïŞÎ*$AıĦ0ĝ˜†àCb ş'ÀXlzhŬjQ ñN[µo˙jħŝPb“`ÎĞyìri/ùÉÔ$£ÉËçk˜Òfîs˙sĉ ‹NÛiĤ!‹~  nzZ Ċ! ˜ÇÉcK"Djtà‚ž Ӎ˙B› sz`LÄü_ğv˜û™×~³ ŬT¤-Á¤m ĜÜGŻ@s‹Q+ñ³ŝ+œäµğÄiV!}ÜÛÜŻT"ĉqü².Ëy£*OêUŜÌğŝšNŞ ::{5<ßÍ? WF]hQ—)@Ĝ×yO:ëƒĦúg.ÊâCp³,Ún{ÜÄÄl#Jíğ0°sB5q&•Ê÷üÀı{&–’-7‹e€S@<$úùљ~̤ *óbÌ8G$°÷8U{Ŭ36ö‹qpvéÛ5êÑÄxġ#6 .}xÍ<Ό}ìÛfÒúTʞcÓ;gl( §q~ˆQï^áEá eLĜŞ˘'ħê€^ħÜbәîsSú ›Ŝ=#ŜLĜ%ü\£ŜCŝ½‚  ażQc˙_ #ç\˙_‹ë8q°}–é#I°˜OŻh0›Xë˙CÁB“x^ 9"ê%ÑpPŒ)0‘ —CŜvŬŞŭâġëEcjpÂBA€ŻP3›Ît•œéĤ˨nn^Żĉ‹)1`X$ş]ôe_l|*ìĜĈ ƒŭ’ÇY.óòJß§ÔA~w]^úË3›20ƒŒÓ¤ÑPH Ş˙Ġ;o:.Ġr˜Ğ?j*“I^Ŝ ˙4ú?yèáŞendstream endobj 569 0 obj << /Filter /FlateDecode /Length 3044 >> stream xœµZÍr¸Ğĉ!TNŞBlñlċŬd'ğ[[ݝeś– ›YIԐԸ&•gÉëċ5Òĝ#@Y’mÉS>‰îFwëŻ}9ĉÏ˙Ÿ­FŸF £ĵx,9ScV’#>F ċŠŞq£Ç˙ŻGEċ…ß>aĈh1z;zŭŽ :m$͋0Á¨†÷eâı"A͕„/ïA‡7˙í)šŜƒĤŒú4Bvic˙oĥ7°¤c•+Žùxşıuƒ 4'l,0H-èxşe›Éô_£ï§Všùkž-RċLCĦżO„>W§ıDàïTž^•Ġ2ÊÌ/OŠBI¨°£g›ħ@ŒT۟UC@§R& Œ*¤z&„P.áIŞêbєëY]µM K\˙yÑh/š‹'ùq0|AñÀüGċ˜+9dĠ\g?Ô÷ú³n&ĈXOv9ıÂBÁPeekĈ²gġfS·zPYWÛ³wŝ+%³eĠvíe|e]‡ħÈ6eÓUċ2ĵ̲UÙÍîŞġ­“RU0ŜèfQ7Ğ^™ÂYıžGSş;ldÙş\ġŸpĥÚĥ˙„³÷ ğ­>ëu´JŻğŞÑË/;GIšċ“ÓŸÌn—ì8JÂŜÂÊĈc ZÁġ‡B(1¨ƒ××nÂ0݈bD³ÁÓş)ğş‹A¨R$›•ëAfċ²5n•ĈvîÖ‰lëâc?!;GdŸĥşùb>R÷ŜôÏZŬ…I,{—óÖ?éġÂ?*DVz*[éĥ-oġexfív³Y~qÁ´ŻÓLWĤ&ŸŞ&ˆ !lAOXĴDñEg^WŜF!ëíê&5™œŬ µ9†KiŒ”À÷ŒAí3,j÷` ï^Ö£5%<X~ \QñŜŞx>Ts^äBıTÛ¸\{q`0•˘Ş ş§Ħ°+PN1ŭĝñë@8B"G“T××Âp‚sSìU×ÙĊ; Ŝ“+†™Ŭo<¨_ÄÌ=µTs*sIéĝ[:…Ò8ñùg9n1ŽÏˆĥdı x îĞ;$V˘+ öY~é3)N΋! ˆ”_y‡ˆ&ş.,m:k$R“ÀF8fŠhFäCP† ‰‹pĴ LhLJg áŜƒ€G8FĤJÀĵ‡p,XĊGğ Ċy˜q·ç7ıBUĤR^£aë„Î Á– ĝa&’Ĝ)ùİğzV÷|*ğÙ.şiù1„ĞZϖÛyàFÛnž)žqzuSu‘œUëNßÚÂj_`Y÷e£/Ù]K{ċwYÎ~³lÁ$'”ôˆVdƒ*1ĴĦnş|rE4/’e߆‡"ğŻ›ßÊĤŜ:âgĜñ$ÑĴhgHàòfݽŝ‘DË>6@ŞMš€˙0gÎosŬΚêFÏ£¤j4콞uU½ŝoŠÎ°³ÑÈ9…íOmÁŭÄQ5!µ$ƒĵ9ƒÉ#h­#µ-ê&FÛĝϳkǷĊO˲ıĠ1’ƒĜ"ĝı\nu›'~0[ IŒ?f›¸d€):–°v¨ŻÚ QP5}µÄ9…d`°*ijżVífYN̅^7süĠ‘Ï 2˘ v°>›í ­}²GS›L/NċŽQÉN³Ĵ3lµÀeEà­3“k`ڈĝtۛo—YµÚ,ġ şżñ÷ á(œ‰-Y{Wßj)ˆ‚’ìĴağğÚ{â[¨² ŭÎ6Mŭıšë¸˘›²­fñcµ6ŭXivĈŜ †ü÷ídySoĤW(íĠhpTLğ½üŬƒĜ=>sj[ĤüŭŒ‚} l—X0¸ñ;z ?˘âÔ˘Á éá<9i‰n †H ê5B°ˆGêĉáC7PÎdNUR7UN¸xĴnŞ ¨ 9ĦäAŬì%fӈ2LíY€İM~ëŒÙ –!€JާóQö‡}Í:ÔORÒżÒma_Vċ2˙ '¤ĥ0 yJ-Ô– PdÓÑríaÖÚ ûŸx³ĦŻ]T·vË ĥï>PùċN᧔ċ û öfÂ1 ž…{.@ Î|^™ŭiOXÌ N·­­ċHTŬٝçŽwì|_:ÌĉÍġÍööÖÍ6ÛĈ˙Ĝîx€ÙÙG \ċ)54ĉ³ğ²)gàç ëq ¸:Vµ; –Š\müĤŒUŬè°@™Íjğök’<ûöŭ_~üqžQs.Ä=t6zÓèÚÁŸ‡.éŽFlħ¤)ÈPµtŬġTE ^-c…öIžï@ZcPä'χgìl~èçŭAÄ3OœhxĈħ„rN¤M’”ĤÓûb‘ ü{Z¨Tên.ŸÚGA Âw Ŝ|˜|˜ì) „×Eħw!€yİ ' ³‚P! âñdĞ€°¨}•qPK?µ"鸧“2‡Nß0Ğ€/•!ĤӟGÓ?äTóobGFâËT_ĥMr ¤ùh÷b,\‹‡€D@?‰$™IĤÊô<SÁŞ[´&ÈĦ’È‘‰áÈax"GN,BžBáĦIŭBá:ŞKcŠ#ñ 0{:oCF ƒÏĤĉÌĥm|hPÒ>BÈàşçÜĉ)w˜)·ŽlkH n“C/^Í*½ž™ŝÂB½q˜)ŠÀÓ;Ŭh(wÚÉl§šJîĉ£qĊí Kı_Ù$aÈĠĝÒ 5­Ğm#•ßš*dk€=+wmxĞ?mÁş…ÚIQ7_:“+Ѝm€§U nG`‰4q”4¸û*j:,€í‹Áܤ˘Z„kħmnñĜ¨ÄebÏĴù8‰“E-öFÊz>éü{/áµEÓ{ùċŠ ¤ à¨ofvşh^ëXVĊ8ñżŭI‹ħġ~,é²Ĥĵ-òg=s·0ŝs<'`î¸ÔFëÙ µ)Bcċ-ëÉC§nŻŽq,Lƒ@ŸÁÏ˘=ĵÇ|3óLpDÙÀ8­àêaNŸyϐȽ6\ gä›ËÁ1Ï)–#h}™Úŝ÷üüó9f3’ ,"÷rÀsAŬÇ+(áœ!‡gìä6çU}z0ڐGÈÀé§²LqNIÂÀ×CĠ˘Œa‘4‰ Ç1OçódŒ’ħJĈ:ŒQ†‹8Ĥ<ŽŽ( ĉr’ŒÉX%r’wP˘ĞHż/“qb9{Ž“ĤkĴ‚ËĦ§&Dí9nĈ-ž°,ĥŒġÁıûúk`¨öú@Cĵ‰+éÓ; AS€D,‘ŝ7î6Ŝ~á6Ŝ–Ŝ˙âÀßÄû }u‚qZñzù}‰ôżvH'ĵZĈ%ö˜!eǃlÏsȑBqxĈıíñ¤+Ĝ–tß ËƒJqDĊİh€$ÎrÇçŬ}KÄêÊv/Oĝ)QaÚY‚^mĠòĴçïœSħ|µ¸rgWÌsW—èż%dĞĜNYgGJÉá;„@8œj JÉé''Ĉ…>rC÷ş[m^7ŻßÁż·úןüÚ/tİĉşàH_ìہh€Iî.HŽ qdž1ôŸ0“%µŝímÌìÀ#*Îĉj†[!ġÒ\-‘û€ĞĊàŠ1ƒd?—Äı%>!ĉŽ]ÎżĞÖgĴ'ì÷Dèc÷ċı@‚04othmy˙çOK_ê7ÔÜNdç˜J͵ĊÔÉċKÙÊĦ³–2µäkĦ€K¨kC‹NĈ@•<… WȜ” 2†œÎ…`Ò1’ïçs½ĵ™ ÓG şëôҞ KŜL(l„Ĵ™˜w Yıŝ_í.ɅmYŭÏ&…í|ßwġoVœb23żĵ˘Òœ  ì½ünğpDœÀüZŬF@JDAÊ˙6e~×°–èŝö'àFö°‰Ël[6îä âfoo@Žş zkÌ{š–z…qH`Pî7-mëċ^`}¤ŜŽŝ‚< endstream endobj 570 0 obj << /Filter /FlateDecode /Length 2618 >> stream xœíZKÛÈ ŝÄ$*µûŭdÀÀ:ÀÂHĵĥ‚<{àHԌv%QKrl8È˙ÍßHU“›²¨ÑHŸ>˜ÒtWUW×ûŠú=˘„E˙Ġ˙ÏÖ£ßGJ+â8 •šX)*a:âέe”§Ñż£Íˆç(2ş?aÇh1úyôúƒ`°ĵ:‘7H",n°ŝ&('ZÚF…$η_@—QÑßOÑóôP0é÷ó‹ê˙fëèÍ,àVFŽ8Íu4]ŒŞS³HYb·‘áœ(*£ézô)ŝÓx”Qñ'öËx˘¸"”ò˜&ĝ †9x^´ÏŠ·Ï:ĝ^σg<ğĉ™Ċ:mŸ9mŸnŸ Ö³{µžÁs ËkX ‹†ß'Ás`ƒΞ_Ĥ?#N)MߍĤİÜM%܍‹?q׸œ‰Àd¨}›yÇ4IO8–:üÌÓŜ½xĴטfcJKŽ1ĉˆÔŠ‹h‚ÇáìÓ9×?óñ„ë7–>ğ8Éï–ežä_ŭG8ğ‹ï–›ú3,µ6že›M:+—ÙĤ¸ñÚ~œBÀ·9Ğİs¤M ­ä RÖHX¤lïŸħğD…e†pĥKT­!?¨–8$kż†^9y ÉN85˜§qıà鯕#(x*i   Eݳ@ġOùs‹\Qxö@Ù_'­.żìÙR"RŞÔ2]oËUÈ~X&à~l×3·ñíEN x¤R*šT)ç01”^ĜoŠŽù=Ĵßİ—úŒi"´éˆĵĊxşc´Sv-¨םa:“†éB=Ÿâl›nÚ÷C›ÌpàyÔD”s˜­xÎYw†f íŞQxÂĞ/wW8SÖ½‡*Ì.ıŬ]bKJ¸Ó^j‘ĉËdµüÏEW Ö:ŞCıŸàŽ·×mG‡<û[÷_xn‰•[fĞĴ¸Äx‹eUveŜÖöċoL[ù;O“ù›ċĉƒw9HŬO¨óìeú 7]{“/—D†¨Ç잭];‰e*žŸñpz‰ħlÎtċŬŽŻ‡²V[˘ğ…&p‰ıMÙé˜ğĜÂĝß(l§SŒŝ]Àë ŸK,ŽH?Ĵ(+ˆĤúRñİ8›TtI‹ù^ƒÜ§ph#Ħъo̒MÍ*¨‰“U‘5ôCÇwiE?‹tŜĴáñr·^ÇICHxĵÎò´Ħ#&ĥ2_"IVġgwżCiwdù2Ŭ”µèx‘°‘­@ërsżÛ\>¤íŸĉÙj•ä$…)OÊĴaNVĈ90M0™ë$6ÀUÄQÔż£[T` FìŞŠ1 ²:…Qññ|ŽċċHáĤÉíׅÇǔċAÜÔ_iOA›nĠ² `è\˜Ħ4„jo/ĊÀp¨˘#ôσ€Ċš„‚°o½ÈEAwò’‹jĉĠŸT0'âú¤ƒÓşÊ!/NCeÑĈPê@´1ù’´1óicxhcÇiĠt‚IMän8Á|kĴHHœ}7|‘LÊ$ô ’C†2ż1—P'ı€żÂŬ|iО  ÖYbœñú Ĝls&²0ÄVq ›Œ'Ò1?Ö|?ĉĜÀ9Ô°|Ì|ÉRq¤Çë´(’1 62G‡ßĞ8-Èi5­‹‡BxZ,Œ§5Œêıvcş³ċû<+³7‹Cĝ+ÔǑ½ZÓġÈ6™ŭ–Ü{¸P'}µI ˙ìÑâ j˜|ĜÁĴ“sż?e‰¸ÈŜŬ,7UШĠğz"]™âĊVŸ˜Ĵċ~g*Üċ"ÏÖĠµ9'WĞ´¸n—#G÷ü Ŭ¨BnĠşÛŬÙ^Ô@i“ÚV–ĠÚÀÇÁi_WY2‡à­á+DfŜüŭé ş 'èäzNFıj BÖAîGŭ;şèÖihħAÌiâÄ)àñˆ†”* S>„’ü¸ ĜìZx+ñÖÇÏAò/”PDµ§âÖAeGÈ˙Ž=O+ĝ;m=Íô3)Ÿb˙GğÏŝ…Ħ(sGŝk6Úĉ\ĠËxjž³|ı…–ġ€²ŸÜŝ_ïŜ|ûĐI5=ÑÈL†•Iӊpb‚\ÁÏn›§°·¤)ĈçPĥ¨òİ%lĝ}˜­Ĉgë-Ĵ,ÓM½˜ ]­Ò:[)Í{™èfžUuñ&+[Ë ‹ËdÙHĤèĤE–Ż;v=}HÊvIMŻjwiЧ!•ÑPû‘~{ŭLpÁe*żÍżn’ġ„ŝRH^‘ĉġGÖĝF9Oä[ç(ë!zùu›b„Ċž‘klw:ŝRïCü|n>İ0+oóìóržú- gY4rùž'eġ'û „ĵѝ³öö•ÀCÚƒŒï¸(h+ŜŠj¤àŬ=Œħ/Q-úhu½ÔÔ!'µW´éQ/³ê€[ĉ³ğ<7ĝVżż„÷ïèXŭÓµcE†¨ê”~Dµ…2pğï•ğĝznûˆ6ş£rnÖ@éPjl Dâûžò˘ ?yŸĉEĥınçkğêív Ĥkäµç‚V*‰Â „÷_OœÏħCİIAfIžÌJ¨]—Oq{×Qy;>ˆ8ÂD-Ú¤pŽHvônĜKSnĤg“ĤˆG0Ÿè˙ŭÒÏOQÍCQġM˙‡î‘Ŝ4ó_}È֟UŻdü6O6³lY\ßhüËùMûA<Rħşi§DW‹ZKîµ˙m‘§)YäWOüŽÀàV¤é}¤ÉzïGÏ€9Ô?€ZÎXTO¨{>k4]b8ÔĞ” ÖA“İÄ÷u'.ˆ‚‰žš›Ŭü;˜rï“T’Ü­Òö›Ġž–M\ïfĜĊìĦ•-{ÙiĝFÁĞUşÛßÊ<ĜŬ˜Ž´ƒd 4Ócü¤wC7i`™&Ĥŭ‰R†Ŭ)½­_Áùy,à4ñ}&ށáށĉÄ—7ĥjó´18ßU>Ȱ1ôX˙Ĵñğ '†£FNĦԁS ò8röw3ƒŽ<‘h™tİĠ€0/”8Ì  óş‡yj"@‡Óa^ï†nÇàûÍóP^ż ş ŝÄ|”uç$”÷rN² 2½Œ‚ &$ááPĤÍäĤŭ=s5Ş0\gċ7Ü*;ü;„›Ĉbh6š0eZ<ĞM4AÛ¸ò?ގuƒE°’áû&íj´ĝß0µàĜĵ°kJ-ႏ½ìè mî;/„Ë×ġDíĦ,·ĊÍë×³Üż½ 8–ĈYu€û6$ŸŒ'G'Jâ+A²üŝġ6™ıo˘:Ĉ÷?´oN|ÛqÈ@¸W˘ĴêZĝ|žîĈÌù;xLË2]]·S³·c 1d”ˆó1Ĉ–?ÁĉÙr7ŒSͽÚħÌ~óҜħq ³3ĝçÑ˙’@ëAendstream endobj 571 0 obj << /Filter /FlateDecode /Length 4161 >> stream xœĊ[Ŭr#·•ÊÊÁ²}–GPpm޲vœìĤâ3£Ŭ\hrÑ"[Ĉ$›f“c+•gÉëċ5öüt’ÒˆÔ¤ĉb¨nààààœïüĦU”*ü˙Ÿ,.~şPœÑÊò‘vœSçFŞ‚2=’\)6Z7£żŒ–uFêʍîŸ0âîâÏWŻ“£û×`–*‡*ŞpĵJrM•èWÔYxú3,aˆc£ß?eİ7°PĠ•’v&TU9 ?*Vù_ë{`€ùmâ“Ċè›käÛ‘£Ns=şğ2a#%ÈÈpA’£ëĊĊ ùb|İ8òÇÉşİ§³ċ=>P´ŞÙĵkÒĥŝyĝ}3Ù´ë8Ġ)²Şĉm=M4iïÒK–“dÑt]}ߌ˙zŭ‡‹ïqƒ£ğàVŜcT‚Ü`ŭò׋4Ÿ'´ŭË9M™Ċz˙q9,ċG}4QÔ,ĵÉİ˘üż™-3ÒMUZ Ĥ ŞoÉĉ޽:™_¨5ä4â^˘Êì°Z²I-ó§ĝÑÜò ĉ¤Ğ8ċ•ĤUİoÇŻÎĊ*˜ğáĴ *{ż’S-wF‚—ÌZÊA™/á•C”ıž^ô&ù’Ö££JÊ3[ON­çuœÚJċ$oP!#:ŠmñfġœŝĴğvùjxóĝ°Ŝ.µüĞôè’*™5^ډÏĞ×Lƒx@֒##ÊÊU˜Q7dR/Ç0ÏACêy×â_HO“ÛĈż!ۙĤ1œÔ]H^Çnj“U×l§mĤà°7ïÚluë: œ6Ŭd=[y˜H{û7Àŭaü׊ÎV).PôŝŒUÌQÁ8Û3ĵ³í},ŒS Ĝ½“e€xŠ=²Â ùX`İ÷ħwëv˙b.iĠŬl~/İATĈ ĝ$vž­WĜù³M<#¸c‚'£ˆƒ W,ñċ‰0™ÌeM"÷£êñĤOéŞÛílY݆ˆnÒ.—`ì3óéJȤP“üÜÎİ€FQnXıĜéžT•T½ežA³3’¨"< )¨ÑóÀ2QYÀ稷”kŻsCÚU³Î˙×ÙÙR’Ç•j4ž…s Ïó~ŭü¤ #şBd1˘‘`p*4Ò|ş€Ĥ‚Ĵï hž­Á—şl‰³]Fó-ZwtÏc7€†òĤAcŜv§˜œ €*'ùŻçeċ¤ŭ <Ĝ`‰ÈEʝ˓XiC+e?YŻwÈ qäKœË8ršoÓqJW9Ʌ(|•‡_mĠ#™$ƒq^8פ>i‡ ÂÂ8YÀ)T6视Ž/%l²Ş,ùv^w]ÓAò"à¨*ĤÉ÷>€ÜA˜0¤^NÎòCÌüßV¤Ñôi*Y&8£\`Ÿçœ’ëwMH‹ˆD)Ĵ.ĤĵŝaŬnÚoĥwûòİl9Á uB—‚YĠ“Ñ.…Ò>ɂtŞ áN½!úWèĵ‘ĝÛĝä{è6Í"MSdÓĈI™u ™a™-ïÚġ˘öT˜ËİoÛíĈ˸cfçĜ˜ğ!ûòi]4Ü O.Ù1ž%7ˆ’Ün7áêĉß0SrFn§i†…Ai)ÏÖäucM–*ż£YbÏ9òÁ2Œäd1[Îġ<‘d‰{œ'ɢž-çq7 uĈŬĴÛtfBb8Ğו#Í/›f½Â^Œ;"d'p;[Â!+Ŝ„48ώżġT@çx:pZ€ëHÛ§â_ÁxjPEú_a֎ÂiL :Eä²´ Èe‹ë‘šÂŜş‚–W"û6ÚXħ_8)/öĞáÈÔGmx>ğ]c áù²Ž}ĠiÁ·™!wĥAĝv¸8ppBY€aí²Ħ6ĉžT8ĵÀ›SCi!fĈĥ>ÁĦ 6KV<ÉàKÓ´€áҎ¤ĉ?ĜĊ˙v>#DËóV,Ŭx D  ż żêùĵŭıKïċa½ìĞĤFñ|ñG{(ajˆĜDÉxĜ ĦĠ’éĴ[Ġ›Éğ´ħTéŠVVUĴ·?0eŬ¤ħ–,ÛM"ĊÈ}³lÖ³Iz #0Ş™¸4y#"u€ĜYvÍĞa`·í™tşîŽÊ*â—T•pÎ(Şeóó^!Y*t*zLŬç4a.ê —foöÑO\™„Gd޳×0*iġSü´Ċt€ħbÊSŭ4Ö`AtùÜÜOWÁÉNÚĊílé}u…ĤPD›QvŠrn{X{IXPŬ‡ĠlRQá„Rd>ŜoȄtiö _Hhqáï*úZQŻfèiĥP½)·´5œc ÍğÚWƒz}ż]4ËMëËG$)}½sg‰Ù%–ƒ]`Ĝ²ÇŸ†6f˜½Y×ÓÁ§ƒoâ;aF .ŝzGĉĵaĠ}éHGNjˆ}™‘ïvŸÚ€Pwıâž-¤ĈX×íH˘`'2ĊÔbjUħ1Ce’–²úŸ<ƒŠb-„äYsÎok´)ù>Ĉ€ o°;lxP³~YÈ3WëĤKbÁŻ9° è×q, Ġ6:˙Ĉ<ŠíÜ*ÊàQĈMbfßaċĉÊJ–ñ~×fëCŠB1ċPk<ç>ùi##Ĉ ‘]?1 ³ßğ%ŬĵŬ‡\ Î!È·BĈGĥ à,”ĥĊÔCHœĤéûù@Ħ½Òş„²^]ténŠOHnûŝĝŸÙ[gAÇÎ;wL?ĉÍ?sEqXíC‘ZçÇL¤´ż¤—Ú‡ë#Ş(cĦĥžé ĦŽ€@.§7X7äoĊAĝ†ÀM  cáĠhžŒ9DĞôdŒĞ6#Ħ­Änóbxbà ÷ƒŽa´3Ĥ`|4?# ˙ĦĠ á”û>YJŜŠâ9°‡EŒ•ŝÉÀJż+ ZħSĥĞĝ¤Ĝ•€#ÖùĤ´Aĵ?ş+w'¨4Ô%Çà" j÷ۂÈE‘%Ż ÍħâùÔҌ‘¤ ż„ Ì7ÀÄ|0Ï͸ÀB(‰ƒÉŭù^^ı„ˆŸ‰‚Ùì9Ä,Úşdvpb¸|J<#[Á¤xżŭêĞĝĈ˜˜o…wÜùägÌ`Ó° 0ê‚҇ħC+”Š ¤ 4OòÛvâ=[ŸŽ# EîĈ =`ŒèF#7E=" ) Uöݲ@“ğúì ²è16– üod˘1Ç3†ĵsŒğƒëÙĵƒ‚èHâs]›÷™üÜħlO|½ä&í<ĉ–Ü"ig´$Ûğ  "ġêa…÷Z0'R¤ż‚~}”’АĜ·ĠTŜm6ĞîëĞ+Ï90‹*îâYT´l·c +7Ÿ˜›ċ’ĵìF€0lÉĴ‰öc ƒ8Áş= )•ˆÇ9?Ñ!FuÍ&2Qù2Ü&ú£ GŞ!÷ÈJŝ_cĜġ˽îµWLû{핝÷†è"Söĝäħ€À,@\´&}áHTXx2áëħEd’ >âOf>úbŠ$ Ŭ>Vŭm.„ kÁ Yoċ!˜•H0=âzWµNƒTĉ(¤  §ZËP&yÒ9ûcdŞÏ–C%ȆÈ;,ĈàŬ#ıg*p(òĝÏ9$uÛ{4?oVêñêçTc•§—ÀE[Î †* $VûñŻèŸÓ^ĵĜÏB.ÔÀ°]{wħ-˜ ïŒíß<֝àXqğíŞY×ŝê•`á>ĈĴKży,´#XW_CÒ7xĈkaĜòħĦ.ġğY3Ÿvi¸¸Ç†ŬÄy&ƒH¨ŽĘvÒaŽ% Ż7­› äŭïSڏàÛ_CşítöY˙ì ċšq죚1€Ǟ­I<˘ġ|bWÛrRğ>Ú`B3† -ŸqsóĜ:ĜéZ•I§××]‘ĵuM³ê†)oK%ĠtÉûûYğWß^ r^eŭBOĊx/ú]fuÏ0-ğJhûĞ„&Üú‰ëUêz>oĤûÊ@Ĝ1êÏù.ÔĦ“ U(‚ÎŜÓ2Ԃ.÷xÓk< ċ/û£~é ìN›|—„Ÿ”ÀBĴ› -ë]œ*ïZfGúRÓĉ³ċPFXS,Żiî5AĊ’”c„£ÜV}i3ŭÑ^żî^eŜ½ż]\1Á€Ÿ‹0ĉ̆’× Ĉß7ƒj˙ QˆîġèñµŒíĥƒġe‹Bö˜F­G—Ĉe*xï7pÀpĈ­ÛUÍdÂ΄^H2C‰=Éu=I<”F³{µYñ3pĴÓzSïm“Á”UG! eaôÉÏ(eMQ7ʘRâ'tʎ,ñĈ/ññ2^q )?ÙĊ”|½ó]CÏİĈĥÍsïğpHçM)—·^=?ï=Aó]û‹0Ŝħ–ġ˘yù{‚Úá½ĝ|eòù]۞rQ0~V’“<³ĵÂç Ĵ”W³¨gótĊëĊ†>Ċï ì7·ġšNÚĊ)‚¨Ïjû’’C"¸+%7›_Šŭşpí'|U#ÇúF—§ùôCä 5Œ½¤lz+× mL#WïÚe³_О‰Xk̰ ™ÏşÍ .£¸û×s?àÊiž†ĞéB^ÉċÒPÜ˙³]Ü6ësc†˙ʋâijDÂXżRÒŝ— M•ŻM>˙Jˆ·¤z;Ĥ”žɢ3Úç Ħŭ—…è|YêŬ“ŻUĵÜŭéûïN‘˜Ĵ$lGD?ĝšÙQ•1g5˜ŒâżĊ`d¨ċü[ fX{0˜/ĝâ,“Ñ~)ƒÉE÷i &Ü÷úĉż˙xšÉ@dÂeyñëÎ$•ŭçñ{ÖĝNcġÒÊ}ï°ŭWCŽû> stream xœĠ\[o#·ò(äG›ñdx'‹(Ò¤AŠ&Hv ôAهħ4ĥ•H­4Žë˘żŻ£ç9şĜş8@ħ–Fä9äù͜ŭ0,r2,Ÿ˙;Y xËŜmž=Šá·„Ê5*ĈYnÔp1àJ³ĵ0áÉ|FÉ"×r¨('9ƒAáEn˜T ïÄòú?“ĊĞkàK„Ê\†×·· 2$Bç”3 ĞrBÌz1g‹Şıݧ£+N‰Î šmŞI3Ğ—£+˘ ɍÉĤĠf²ž­ì÷×|s=ĝ W]ä…èVD+ › ‹x³ŝI:ŠœÒd”{’ˆ„&"– …'DÛQûäÁĴ,çŠ&â<§0& x ˆ#ğ/7£ë_ÜKf„1>H.ıĉġ™KĥCĉ”puƒĉ:g—£Ir´tLsœ}·œÎ&eSmFWTDg³[˙™šĴď*7šà›MyWµżğçk4nöۈ $Ċ²jÙ>çÙGĠ|šïP…€L§2­žç着_‘SF$ġZÙNĉġ²z#.ˆ ż‚Íqö—uÇc(Üĥü/Y}>6÷Ux‹ì64Aè}°bh¤! PCç l $9Ìmpĥùn9kfċ|ö/X4$‘Ù´[î%áŠ8[¸ÄàJvs1ƒ›ÏÛ_D6k6Ŭ—uġáaĥĤ~ĴRÖòÚWŬlcŬĦĜG?ÁZs/x„u;ïxĴ8iĝRƒt„´ßTkók˜bÌ ħ•§` "Žá1Ġ1nTœ_AHf·2jż =ŻĤ2ÇTu ğßLÖÔĝHR?ÎMùh^ıçĈ¨Ĵ^w£17³e żP ß$Ϟ<0–I½\ĥñÙ7YW ¨ƒÏžU# ÀÍÀ‘`VèxġÖw´_bßAz‚Q0×ĝ8³*-ÑBŠìi^—Óà‰‚NƒžFÊżî)*<¤8‘³ìÑ˙lüŒÖ*ƒmÁNĥĠ9(j_Áu–0Š“Xŭĵ“£Š„ì€0T*ÀU4ıc‚ŠĴ.á¤I)váÁ_ĝâ$_ŻğH³qšB˜‰Y@Ġéù (ípyVÏaÔçí•M˘WµlÀÛu^ro4ëÀî+I˘žİ8šıy§D3 Ž I­t1eójÎ-b‚:Ħ/ĦÍqv}iÁÍ’:‘=,n*MŒi5ŻÌĤƒeĥìÀ?äPOv`PIÑìE'‰?|ħ…ĉ Ñ ’|Šä˜ì +֛'ÛŻ†_Äñ3—ÀŻ£y$~7Áé>uİ ·3o Ĝ="U­˜Èê‡ù4²×ò×AU@Ġa_/'á›îB'˜M:)“YµK#Ö}‰‹CÉħ” QqĜ>Iô†2çIVáIĦΰyĈr áÀÚücış´Î%.¨4¤8Wk0ùîˆBBc=<%}-8PÙnBQç }Dl Y°x³ÇĊŻĞÖ+‘vX‹a`ĜVƒ]§tN Ïtçŭĵ“ĞIAJÊg­Í+ÁÛñ°è’K hŽíÂC€E$G$‹ĵ6&‰Ç`¸ N{R(,÷[pž„AvŞ 'ıÛŞ™Üż> ½@Ñqv;˘èRÁÛ]yX£*£ĉà3çHÏÄ, ÑG1Á 4&I¤µóN‰´\ĉŒA°*`ß ­f~óÏĤZnfâ'Tfqñ²0vœŒgwÙĈŜv:C+m&$1f>Ŭnë¨_vĴ' ¤PĤ0ÌĽávŜÉÀ ;Ġ>^ÜŭžÀEœpg7׸ŝvş|§éL.äR€SWú”ó‡j·ïŒ`½ ä˜}%H ׅNNÚi'Ç>İ”vY9Žs™XpÏnĊ!¸Ñħ]zȈyTìɜîQƒüû°Ċ‰* éYGû$R4q¨„Q˜pžb9ċ>‘i.ŜXFL,–'µŜúXvDÇiaòÖ;X-ì–\c 2҇Ió°U8!ŜÉ?7È?`"ᙉϚÚy§ûX {Ġ>š”›|r_ËIÓùĜjŭZ>ĥì ;ğلĊÛÁ½¸–ÇIÊQiۋ`cëjÖX6£L‘{‘£ ˆô‘Lp³Y|ĈÔÎ;ı} Rt§?MŭYϖwŻdb'‹ÓÙ Äİ#ú8…ĈÁÏÙĤ\D½€rc1ì —céÂ`…×ÓÄ üħXĝÚÏK·Ċ´ÜÍË~ÁeÀ÷&QŽ)]ĴvÚ)qTȜJ aqt“Ïg›W*$cFV9Îî.ĦrtDÇxÂZFI/ĝŠÛ§&sÔĊÈmĜa— mxpßvÑڊjÛÌ[„R`Y #+8ö}`O€QÛ$01î\éa5…œà•PŒĝ ŠôŬžˆè¸]=ħ5I3çĠZŭAʐiğĈà6ş¸Ŝ ş%­ĵvÚ vÄ^ÊrÎÜiK{İ~­D)âe!DË'"ÚŻhîkމû²v“kLĉĥĉ<—4u6ŭ´Ú] 5÷³pèÇíe_À <ÓIĥóN ڜĉLBĉM@^ÊG½ÛÙĵúÚĦ˘LrâxYü;Ö˙Kt”’ŭĵ{֌G(ÂD?q? û‘$·Ħ ĤʐŜü‚Q$Wñe¸öÉ!èñŽĴ“@"ËŞ5ĝr Ĵü‘É™SîíĈy:Ĝö<*ŭi>ş²÷ïŒÎŽîğ…í £BûsA<ğµ‡"Fñîp³Ö¨Ú$F un¤ä.ûÑı‚ş,ĉ{o5 ŭ-1µ2m³¤wĵ³Á‰cH ~–›M'ö!En(r`&T@T rHž)˜áşŝc¸x* âM|vÂàÖFß ì_8lÓ ‰Ċ‹·„1žÀÓGàFí ¨ż³Ôw#Œ•ìSR# ÁZ3ށĤ´´-Ÿ€*Br‚÷ÇäŭèJàĊµ‚fonëúÍN…·2Š É ¤¸„Ŝ=?Ħ' /—‘€ŒÄÁĥ|$Œ0$–Ñ^gÈ"ĵî0rÑiZëïàß·›´àËKHú"çĥ›ƒ•J&ôŞE9›šh `$yıZÂlp¤^ :h 9/äóŠŭç›rOêĊNgàiAŽŭ3z²D£ ?^Ċp8C\Â@i`b;…ÌhĝĠ"Ç^àŒXÚŻú¤€m01Ç7ĞûzY½9Ç [Ä$TßżßĦŭTX§éIUàŸŭÊżwBŠ' ¨Ö-žRAà|ŸÑŭŭÔÏÀ´[›mÍĠïĤÂĴU˙>¸ŝC2&¤­ÎB\˘*°Â2ÓĤ°AI´2Wm+"û̅át"§P=H?¤y€DgVÎóĞġĤ^ĉ?"ü?¸ËvrJŸp‚7Ĝ‡ÀvÂü r9·Â2ê·ÉÜíÌUcnKŬċÏ+ŠM­‡WN6IJúYÙĜXŬÖxL½@/(Ċ˙c!ö-‚e`áU›ĝ&„<à;÷ÏèÙ•°—`jxŠnôK\çïĴ›²@ĴÁ߉˘šölÊ~:àçĉö[#ċÈvĉè¤H³‡ v?ŭW‹ŻKMy×}Y:H£ëXç–‚wYßçäq4TV'ğġ˜ÇËʵ=ôÀîS ½ÈĦ_*B%ÔW‰|"¨H6›îÒob Ö)ĜyÔŝİ~8Ĝ?6:@ŝŬyzS`Pâ‡s)ê4ô:BrÚğ!.!:£+8²*p1­·Ú§VQ‚‹f}êËĵ}|PsŠtʲ>̄B*ff8ğ8ÄÜ)ĝŻhÎ8Û<ĴVġ; †gĞrŻiĜ/%T6“{kóöIáÏŒ+˜ħğğÉñ 2iïE\‡Âw÷šñ⺂Ġ!Fi“)ĝ:IğÀĴœoj˙½“í5ۅú#_;Še÷…ħù£2÷ĦEfë};TĝŽ˜˙Á;ĵÄl´=)—ÓÀĵyfğ4NBRó,DWĝ1&ŽäĴ^Uë24lŒ–°ۙ0VÚ°ŬöŬ6òŒğ‰Ĝ}1­+v#MÛ0ñ5lc‘ŭ8ĵŬĠâ*äSÛK1 ƒÔoĉĠÎèŸ%X·Ġ%¨3”—C"$îVX/½Ä³‹Á[j,˘6ÎĤUĊċĤÛ¤^ŻĞÍŞ^N+eݲ›ŞyĴŞ iş-ĤVš4j‘b@tÚażôf: h6-›²ûÖÜ·]t$1ó½&£Ü³ê7wœb²›§şÇ Ëàş”i§u)H´MÈŞpÉğ܌†5‰´Ç³@î%LË+o‡ˆ¨“UĜ·Üĵ9Hq€„aô½lÛ!" ÛÖÊŻ§³Û'Ĝ!FêÎ!òNZÉ& Ï=Ï!gɍÍg"ŜÙ§şÚµİxĊDâ-’LÛ'ŻvŠhÉ”ñĝyVĝ¤İpZûG%.Ş—öòƒvxĥXığğV'ì™ŬÖë>˜)|…"^_ډÜğD"—Ĥ`}óK5iÚ¨™5wiN‹Èˆì/*ûÍ_´ò‹ĥöàǕŬ|瑘µïżk÷ĠÛVÚYPüúRĞi Ä²Q°„ÀîĞġÄۑk˘×ÎĤl´sSŻÜç@Yz~‚ĉûqúĴM†’`W?̏ĉħ(’Ï8b>¸ìİ8àg›ùµ)×à~•ĜÊÈ˘q6#˵kÚİ‹.O+ Dá² ‡Ŭêííœù]0L²ğkyZö|¸÷3tFzN‡”P<İŞËêñœŠ‚Ñĵİ`~îWџG2RÒX°;¨şħùuü. à´(ÏħMġşÂúË(ĝ_°ÍF%¨Iċçúĝ§Kj<€1 ÍK €S“ ê/ßl ‰¸Î*XħK&À!Ǜ9§`e גÒs·kÀ‡L;Òĉ҅OÀs¨I.v’ÓKO.ë<ĵQĈìbçqÉĈ3WPħ™„UzpşÔZ§ĞĤqżc=bĝf6=Ğƒî› Ċóû-‡›ġĞ~À8½…אHLšżÖ€ŭß^ˆ;MÊì\13FJşşS·É‹ÇcÙ&Û˙ßçŬ‡é/B k•ñ"ĈÙ}ÓĴ6ü⋉ğu8@ĥ‡W• TÓË|}5şÒ˜q ž­Ö5&–y½ûbUNìÍ4bdö+¨ç—o\×MŭĠíËŒğÈ%úR‘›é´šßĜCvlwVMSÍ?oo ¨ìŻ#ĵĦso·ğƒċëpw"tü„wMŭĞż# ³jŝÔ-ĝ§Á˙öŸéendstream endobj 573 0 obj << /Filter /FlateDecode /Length 4560 >> stream xœí\Ûn#Irì7ÂA´çĦh·jó~iĜ€w3c,vnÙ~èžJ*İıK‘’Mû-û{ŝ ŸÈŞÊ YİRáĈÎÌCSÉ̌È8'#"3CúaÊj>eô÷ïċíäWo%WӛíÄ íaÂĤßN¸pşö~j’µ·Óۉ²F×ÂĖċäġò5SS+Ż%:ĊİXíeèÄĤ7“&<Ȝv˙\ŜNsıÜÈİݵ·vz~=iâS.u-´ĥĉÜOÏo'ïĞżk–W³3a]͘vŸîšÙ÷翛|}>ùn‘éÑ7dz c)ô$Ğu×§˜ÙÖàëà¨.?Î7óËŬlÒÖڰьŽÛÒ$ƒFĉož:óİĈ6àĊJ…>R`@Ħ–VÊ£iŸ:fN"b fže¸ž¤Ξj4°÷dĥGdü\‰ĴYAܸQÁ½Ï¤ŸE̤‡ˆœÄÔ~ItϤŝ"òŝäÌşgz·˙SâDlJ*í%½L‘tt^t@¨cÒ1ě$uIy“„ŝB›—&B³O¤‚6ÌÓ49mşq/8r èìáÑ:̄’{œÏ $˙ ½ˆB›}RċB:@÷Ü9…¸QİWŸN3cŻJ§‡H”İPê%yXÒངD ›’VÈòÑ ¸ñ,Ëï[ Ş9ükòíñ/zż+֞×^·yÊĊz½<ˆq™H·BŸ$W.sıY\Η?ÇYíĜÔÏ8Ğ%#$\“"ŠÎA„ËQìZ ­“u~üF'YëQÏ[Š!YˆŽ#ùĥğÍìŒÓz”Ċ–¸Qƒ„ñQ žF4)ı·8çĤ†~Ž­Ù›!C9š!‚c²†6Ŭ\ {Ĉé~Sê§ùyìrŞÑ°XÎvĈÈ˙!Ğş§R0“ÖïŻ°TIÀò]Ğ-YEWËùe(3ñNVŜö Ġj[üĜkF],véçàĤ@hˆpXiÊñÍö5z!‡UĥëŜ,&ĴĞgĵ%\-ùŝ¨0”ôÒŞŬžo˙¸YïÖżıżċŻ·ï`K¤[-‹ĊfìàĜàž3a ÜíTy$‘ó{kŞĊĥûìm5ï᨜”Ġ|ħìYdZġwë~IĜŜoşI™P°ċ†Ĥb\ğ ĥĦáÌ6ĦǐĊJx”V—jŝ•ĦÜérĉĞڃeä­hWh‘ĞÀARş^\usDËġv1#YĴ ĉëÖRŬmšËĊf3èË#’œŒ–ÁOĠdf5Y]5ÛËÍâ˘ıê×Ïħ´€wÍċYÀ{_²°mßĠäé^ŝyW˙%ücjË)UȤ¨Zžtù?<£5µ"ݚÍĝî,T÷y ֜İĉKâ{[fĈ˘í͕Ğ­yƒwZu}`ÏûĠvq³júz=·gďŠÏôpÁkˆnğ‡ġü0Ñpı é&|kĝè ŬżiüW~Ĥ.ËÉÇÉMWìĞpH†10Ĥfßô==h&eÍÍTài¤œnšÉu+‡;zJS~[Zê‡DBMéĈCîĤ™ÒÌDD´>@„A¤Žß&΄׈ÛĦAÇps8ҍ˘@ñŬ£Ĝ ˈ;̀ˆ†SKgò<ŭûœvà› ‘ì) Kà y>Rß\ĈiOMÍg`8UÌ÷ŭ÷iB:,˘”·àJ°éùş $TŞ´Ïżœe²$fĤ ĤMÉ|…8áGˆ ·Ĥġêz½˜o^•H<îd£j%Û°q™Ġ=‹e"jä~8ÈOGêÊ9ĜoòÉżšoëâ7–:Ö×Îú=Ċ?Ì>Ìâ¤?¤ÇħqğKïq^íw1%ˆñ*÷ Ĝs` ŬĈôîA1 ‡Ü“oO˜}ôĤG$´}ıÄ?’CU”ä ­ımŜPRno C¤˘;3 Ëŭ~rŝOĊ¨ĊUƒ0ÌDÚr‹½.Í-r†~fäU4óżaêúr}û*&> k£D›¤·Aî ó FrŻBë-EmJc—Í__ô4ždġĈApö†Ëİt,¸÷O‹Žƒó‘˙<Ÿï}Ì B£|J·ImĝIùÛ6°yÊcĜĥŭ”#ÎwŬOHAç›~G’ĥ\ÚHéCeûb•>gÓëj³¸ùĜς8ü1¤é½"ÛĊUì* é]³ş˘”²ëĞ<~œv7ßÜ4Qğĵ°= ĞĞÀ" Ĝœ{STúÄu´Óš>ġ-áÜ?KÇtİ5Xn†ûƒ6ê:Z r44–˘…ŠÒ Ê3萁Ĵx5_öI‡ÛûĠa•[3Ş[FĞ$Àċ]İ2Z‹”ĝ.y-Ó^:ïŭ’@vc Ò%i[2-#ZS<ÊAèZÊ^8™µï ħWÛR@„­ËĦÒh‘c.{¤”†›´ÇJP%²Ó߸1µ1Ö÷÷K×Ëĵ^=‚ĠO@T?˘šİ˙Ԗ­qâ'뿙? MCÎ;½S=6çŭĊÉç3höRr0š4ħ2™4²K!`™³Ğk)ĜEɚÍÉ:ġ˜Û̞\á.ŜfĥġžFÍNĠÊ /rĊ¸!ÛD9iğvûrÌà}U.ÇÊZ2yş° çÚ˘˙ŭ) T/-üɂ1LşAGW$$íƒÓW$ċ@e˙íI+Âé×?Ħž ”ħW…óDšNĤĝ4™z]ôż^ü WHr´ƒĝé’<=§ :ŽFYèTA„İÀé´°ŬikêQ:uI=JŭµÏ$eĠRÑg÷n"sëÜDtâċöŭ[pâƒk3òäİsÑ˙÷d!"Â>ÔFçĦk)6`WĠCZFU5ġ ƒC4]USQ§Ée&”é•ÉüĦWɈhÒđdÒH F7ĊE޵ä”ë żŜš‘„ĠîIB¸ŬíçCV…wWĈŸlĠmĵÄ/Ĝ•ÔÏĝ6Nŭž]ıúïÊ$8C% î1žıZdt Žn?D†:Ħó˜×ÊŞ—èžCšĠŭíĦÙ˘Ìdȑ2£Ù2™ŸqS~ŬôÔö>ĈSüt²iâH²id„c‚~3+£D×RpÂ0Vóú˜=\˙BXŬlÖ÷w‡üŠúǖħúG~eúż_3:ôÇQ'y›zĠœ Ç5E¸yĦÏâñ·ìĝĞ­lςx܂ıtš5aġ™™ìöÒÇÑÓ Żĉww›ġ‰Ñ˝–Ġb‹_ğZ;–wê}ñ‹kCûzÓÏOŻ”O,L€HRŠ……ƒ#ĞR–Wd1n°êàCCo‹ĉıUŸĞáHÑM6wwGŸŬ.tħÛâÒİ”péú÷¸0zÑĴŻ™Òĉˆ-ÙĉˆŽZÖĵˆ]Ë3Şâ ‡C0Ž½ŞŻ|pôP-UĴ|€êË&Ŭ—İĝ^éŞ_÷×kôw%Ò­ZzÈ´éVĥ^ܒÚpQğŽ˜ĥ½CL7‡ÜĈ?AJ-ÂdħBÁèlQÄÄn]Ŭë°`áï²DíjŞÙôgĵláëĜbŭûşáUóĠÇyPWÁŬÇġU=xßÎ9=i™ŽLç;"=öšB‹ËŞHHG½|ÚlooŠU´A;ú4z"żB"¸kÍËÂuĝ‚ÈjÚkäyßÜ^§/ZF³Á´7ˉ­Ĉ‡›nzoż”ĠĥÙèVUß̌bŜzÎîñİtĵò¨tf ĝíĈÉìıRċzEwêL5ÚOĠüÚu:Ût}ÎÛUÛĥ2˘ÒU;ğíJlâzŬKötOo³ -úŽgOĤĵŒŸo6óO3.íèŠoƒ7$#… Ġİ]ġj½:Ë ĠIK†zäş?M/%3TzˆA‡h‡ÏŭjDĠqğpŠ“ġ^-v‹ùrñßMG÷Œ‡†ò)ċĤÜ ¸ĊÖĞá;Jĉò!Ç ïZáŞ³Q‰ñܳh„Ùi˘/w{\!˜¸çmĝfzŠhàŞ‘ĴúYSùb…(Uİŝ}ŭfA€<½ ŞhôLCéÑè sI†=eÊ!AÔ;rDœD 8o ­·”oӚvíòèÚ·µt%Ŝ7ëġͲyóĉŽJ¨.îŻßĵyÛ\/ħMşš›}ϤѵC=‹Ï ’żíŒ òtĴ|ĴYŝg²ĥŒ*ÒÇALµ ,V.SŻŜĤ9ŽÀ5¨ƒñ£ÎžĤ÷KWë_LsÉÂo~÷/Ӕ †'ԅ+ û8M¨ÒŠÁÊ×ÏZââ‘,äċĦ×è"†|ÖUó’ÒU´-íòĦÚŬïÖ¸¸úÍfğ^½ÎLd×’Ó;¸díçÙĞk+x.ó}¨èúıĴŝ5{|˙ŒĊ0B#Ż‘ŭ¨ZàĠ ,ˆV°Ù” …gB"E•Ĥß×>lÏTÏBŝɐ+žRĵ= |Ġ…ħ\èٕMùĦúyŞ’¸ ×Cı¨WD— ¸‹’)ġ*ÁÁq ŝHFŻÂİ2ëyĵçñĞóT)£§ òtE γös ÑÀɃ"œ÷üûTNsŝö?.JáıĤ_sBDbmœá~z†)fLpşj–ŬǓşovğfù:_™)*ÀŜ„òïİVû֋ŝLƒ“OWbC*òn·ŝs[­]Ġ,?ÍΔVĠ> stream xœ½Z[sÛĈ~çäGpT?€m¸ÚûEÓÌ´éĜi2I'ĥÙöÁÎD‚"c’A(uúû7ú-.Ă"(ñ–уHp÷œ³çŝĊç>%ĴOŭ_ġĵì}î)­ˆĵo˜âDı˘BĤûÌ1â¤ëgI˙ßŭUg¤Ĥ÷‚½iïmïú`²·.x"…ßàYc½%ĝ‰9Mœ¨Hâ,~'Žġż{ §÷àD!Ôç+ŽÖŻŝ—ŭoG[ÙwÄiû£iŻ<7D°Ä nû†ƒ.•ŭѲ-“ġ:K£_{ŻGU˙—JÚ)"-ÒŻfñ: {(IĈ4Ú´H~Œ‚D0JĦ 9o#J(sÎşgœH›ĠĠ|ruŠô¤˜kK?ĜlS\†$/—!ĞĞûYşJN M蛳ĥü;#“ħÚ;^™;ĥüŽQKŒ=44ğİŸàs°Ĥ·Í CóúÓŞoˆcFä`ۚ"ÜgSÖSŞġCĉ%’ †~HıŒ~ò^=† Ŭ †àeŒ’Qòj<àŝħUÑö ıÁİñm™ä³tB6ÜáÓDiÉ îÌ*%Ĝ&½h4+ÂÓìZs<0ĵŠM[”›sqdpÊYû`ӇĠ8Ÿ§+/§W ĈYçÉÚ?€PŒEqŭQDĞäK½Pl"ğ|àD”Ïâĵŝf£yM‚êÄ¸ÖŠ_˘tê?ÛbU>Kš-uè\hWo4+IzîOäV?Pbüĵ–7…´C)iƒ€/ŝ%‹ïï“Ìïyœ2KV“’Dy˜¤úŠÊvëÊv[fá’ĝœZÚî.3X¤ÊĞE1í20)áŞEKïßdér9)Q“iµòCD ^ȽKLŽÊ%uMü.MïÉÍÍ}–ĉéíôĉĉ§&O?a*Ż•\•è<\˘½û:^ ô'ÈC Ĥü¤Ò;Ŭ^û‚d+ÂEĵ^“ùK1Ħ‰²›|ĦĠ˜=e³sC;{a™ĴZ„"{)ɐ¨äKÊf7‡3˜‚Ÿ [u³,¨CJS%Ħ~xÎuˆŸ.DŽE›×Ÿ‡'gŠ:$ÛTWe [Ú(ôLu‹âÇ(ÈÓl/ÈÏIĥNW_:21ŬD ¤^wÌ)8…by~ˆVñ2İê’×7M[wÎö€{4ÊQxÚĞišžÒpšĊL[ƒEw0äTÀµeˆ2ì”bEô-ù…=Nú$âžzÜÑÎ ċ8ĈñˆF—R}µİŞÇzħ@ĊUmQ?ÖV0‚pşpÜ9P+ıC/‡` ÒTĝġ„#lÌK–ñ|qoÙÄ}À.ô– ôä!+tı32N—W§šb“×™+tѧĦC:ƒ1Š!b9NN4¨z˘E5^“ñ,ÎâqŽéôáA[à%û8Ĝ T¤E0Ĝ³kœŞ=@{GğÔKK‘ NÁvnŸ*{¨_ĉĠ¤îœâ ͍Ż4^Y˙C‰&šmAı5CŬŜŸ=èÖRvĈè )ž/zBŞgŽžĥÀKŜ=] kF9ĝVhOôtîĜò 訛ñĘx6zşİŸ=>“ÂgS^ìŝĜÚR”ħz h;ùï@…ĥ–§ËcĴ(VE]!›!3Ì ŠyfQòjŝ~5ÏÑÊÎ˙SÌœ#$“jZàö ˘M×Xò™aÇù)`_ h0O&ğ_pNŽ}Zl´”Î +‹ Áç‡ùĝÓâħz@e4ž%OĊLa>­?Ğ(^,ê…:ÊìÍêƒû­_%‹I½:œĊż%5#ŭ/ÊÑDÉgä~@`Ôf8à×ÉhĴٚTvCĈbJ—ÇÉgóUġ͋;çh]„Şö÷ÏéĜ ‘jJËaÇK ½Fûö†ô5òî†ôLö€ôµov"z᭍˜ŞSƒ€—Ş=5Ĵk};M ï4ĵİòÂȝyêI ëdp|ĤҏÄî!ĝy{f]t‹á阞އTOÄô )^Ós4[T†</L_áï´'czkŭ$³­Á Ó J˜[pòĵw/B ì3[bÊ'EäXŻŜËZÄ?îǰ­ğ£÷Ŭnpşw´3ÖÍËóÍoĞÙCŝĝĵÁJ“UGŜ1rİ âĥÈ¨Ü“[ğwléH*XÈleח$×=NP“KĦ/qÇ’>evR'ĉŜ|rĦ"Pë×v@|ü'^eî8?A1ĜÀm.b€ôÙsUHĵ+W1†hÑÜıvïĜŠCĈ8ĉÀ;×=ÔOˆA†¸–v޽ûgç•+5Ċ²-g!`8‹;Wìħş‚S`` ĠĞċœZ'Y KEĠ #Ú÷½H*€ÓjÔë@„għ…*9kmİ%麌Ŭó>„,ß:qtbÇñŞċÑíĉÖÔDë¤Z†ò´ŜÁö~_}‰é3[÷µÖEñşa7×ÀdÉj\/4#ş#·Áċ°ŠĉĞ’½ñ’ì„Z…§ñ j}µ¨oU™ÒĴFUĠ%s wnçĞ8{Ĵ~òÒéj•—½dWĊmÀîĤKŠmÌîİxŬ;ڑ†u8sÓH&ˆuê%%o‹)`×Qò.(B†çC!Ġó Šâï…(žż3˘O{.DÒ<·ÂÏúËŻ–ÂÊ+¤j\w1 éß3âO4ĥëŠçPڒ:·ĵù̚ó³NM[sh Љ%kİí¤-ZûĥœÒàù×=jf T…°‰iĠ|zİ÷Şé<“HŬ’ë}‡ŞÉ İĉÉò~:_œv]l²Eĥı.ĥD*şġÖTD‡ÑÏğß3Ŭî=ğw´+˘ƒÓÖĵ1ÓùžiĞ÷ÜCŭĝbè ­Ÿé=Żóċŭuvŭ˙Ŝ&˙úáñï×ŜF|šÄÎ$Sn'ͤ1Ş SˆpCóA¨DÁ"éRWj›ÑşİÁRß4SĜ˙†E„ó9Ì'İ‹Id·Kl­O+ :DŜ(FU§ċùŭÀ[án˘ġÍġġ8+|ËŻH6 --áû,ŭÍI³ğëû¸|7V‹>ĦyĝĉŬÏ~Vüí4Ì#‡Š(ae…Nĥ%âëÉ$YÜXÑ˘GIž'‹ŻË>Ñ·˘oÎb”ˆ²AÑħ; Á˙—Öï ú똸ş—Ŝç駂š36JÀo{˙²}Èendstream endobj 575 0 obj << /Filter /FlateDecode /Length 2763 >> stream xœí[ÍrÛȳö!PŽ`bŽĉ˙G•TœÚ$ċòĤÖĥ²9X{IHâ†"$²J[ûytb&(‰„|ÚòA 9ÓÓÓÓŭġ×ÓmB K(ŝĞ˙ÎG·#ĊĦ–'Ú2M¨I‚0(n‰Ô.)óä?ÉjD‰3RS—\>aĈèbôatòQ0™\q f‰r8Aeq‚%›‚yR‰f Iœ…oïa- CKŝñ”µ>ÁZÔş1żı¤ŝ3ğNŜžÜÊħıNÎ.FĠÎY˘$*1œEerv=JŻóġ:ğÌÇgżŒ?ó2ñ_ù\ÁŽâWħè×ëĵ\dËĊŻĦôç fRu$ĝ<Ŭ\°ó1JXKÓ2™ppRgóüÌÛ%‰ÒTIç/ÎÂeÔ?={›Fn˜J´£^›?O†2^(u“_ß\,–G™Npbi,ö<­ífÀ“”RɄ1â”b_Ù-ˆévë…ÌÁĈˆ£\È0FzgĝiCCÂ֭ۆsš¸]‘aTŭÒ?yéϏ­4„¨7Ñçô £†şô3ûyeˆ5.ÚáĞ{ˆĈ)Bl² ݘÔX \U0?pîҌƒÚásW(ĝ#£ÚÓ1:×֒´BöÙ²X£Ĵ‡ <èzò‘i°2@Ì“Ùz˘@àĜWöŝwv•'ܢûIôzÈfE™• †Tß-óµwÌ^û)È震’1ó?˘3œpL*ÁĴl5Żfġ,. „é,ÄYˆSK P’hÓbsĠlQ˘ŭ6Ùb…_;‘nğ@ÄmŭżHo²‡e‘Í›_uš­[ fH—óÛğ|5Ë™iqÑü¨Óé&_“ñDXÔӟÂ>K­<Ÿ ÷]ĉÙüíbġÈŜŠAR6ñŜ/îV³Í˘Xµ{˜e+ŻÀÖm1miI¨ĞĦjŠ[:â`/wë-¸‚ wSĝgŻR3†×&ôCDċCĠOÖV&óÏܛ 1ž–Ù}3]¤_òÙĤ(›Ï*ġ§İô˜ád­Óӝy\€Ÿ¨€xXyUï˽3:y\‚Z²'ċñŝ%>‹/ )‚]ż8aœ z*˙ĉX4d@{„ìè ‡~ w†óş£kĴ'Àžg5gìP8=*ϙweÇo†Ò‚ü1’,î}kŜëğ£òPÔ2bZŽÊ fħĈëŻ<úgtŽ‚\'<"=Rzì(iV °P‡2*;h†Ï҃í³ÖÁóĊîgFƒı<ĝ~+“tÚ>·2Y '~–4ĝžÏĴ}6Á÷<Ĉˆùó]€+6Dgn˙Œĝüaœ$VĀ à €ğg‰£W‚,äRn(µ[¸‘ƒnĴëÀ€ p#eÜPú0€ëğpTx{·F'à¤Jhž ¸{Ä ¸H¨ĦöwÀ­*ƒ˜â;0ĥ´xŠĥ’Â×ÙXFìŞžd° À1Q½Ü•*1 9?ô3Ô=›Ğ"àùX%ÔLš-×EÎu]ôŝy(Ñ/ĉ/87ċ"˙Ҕք%CXhĠ…/ êR!ÙÖgµäĥm}–Ş./v–Â9IôžkÔn2띇 ß˘~•Êú88¸¨†àR/ÑZEz= îĤœCr ĉIŭ׿߿?FQ aÉlĴè.ĝênÀϧw˙ŒŽi‹ĈêÀ÷cè½GúĦ&Œ$xÂïè]£·J q Шĝ‚ĤşiÒKYe.N,1¤PçŻB~À3ĵ6,½ÄĥŜ"ħ4=s|V.]ĉŜ–XîoU*è&;scp–Ġ Ħ/i4>  şHĞ`:ók=réĈ˜ofEÛ&+ŭuY•PĵÊŞJ!Ĝu ݇ĝ‚ÏT×ëV$ eó“MżË—s'ĵĊŞğ6ᯞ²vTp‘'ÓûĞ|ĠĴĥĞ ˙é~QŬ Ÿ+VL§YyywŻ6oêŻ8K‹r×Ŭ™ŠXİŞ—\—‹/~]ŸžœWœìÊBÜ)W1“ ş' ġñF"Û&·`š xBê]à`ˆ?d pg²y–Ħ+ë߉jÚFĦÔU~TiĊ ”Œ$Bx<r(ù1/×ĊjàĤçxOÂÂ5?§Ğì:ñĤ‡‚AˆĜ~Ż.Šâ¨D¤´:’9´Á€‰9İcƒċ×ÙbY£}1‹ ´&v-ö×iV’Yq}Œċ$ö :Ŝ<°ċ$ˆĉRĊ–[ÌÛdš-9Ĥ0—’áb7àÇGj˘ı‰s Ö  À×0{b^Í6GhiÀ³$‹ϒ›.~(5[“ÙUVf³M^p“+\'‚óñNâ ħíF¤mżìàͽ:iQöŠàŭ Ì~ĉ~é‡ĉD06qüë\’O„‘5PzÖÑĵô~töÇhÊb~ڒmîwFxĜj¤ωÁd'aÈHE[ˆ³÷™ŝñÀ8Ml{íd°àuê)ĵdÏŸz˜ÉaÔTÇĦè×["}0c¨wCĦçƒA§ĜĴšBAS(u`hŠî@Óû ˜ ŭ+HLwëòDk2êĝÀD6”: ‘ %~+"Ĵù‰l¸ÛĦˆl(ó…ˆld°oKdğ’È ċ"YîE‰l¸™!ˆl˜˜ ÇNMüžñÀıA`bàÜ “ʐïO6x,ġj1?ĈM›ÛçHûò6@b– —·CċíPêÀy;VxIÁ *lé#ŜÓYöÔŭ3:œ–Bĉ-§EPßyĠĠ{¤Jgn­Ÿ]T¸EĊ%C§RĊŸŜ¨ì½dĉJ.*’ž&ċ˘éŭ^ğnAóòÌnnòrÛÌÊân5oğƒ›2h½vú·ŭ*š>ğÌ]+iF$gÍ%ŭeQ\.óÓӛ²ĜÓğ‹ÓÓZhŝê~˙7’µy8_•nÛèŭèC Ĉ?AŠÔ;°yĊĝö€²ġš4 „퍉ԐL‡3ôà÷‹`W’ñDB‘ìlÔàrÛÔ`Ö¤ùëġâ׺Ç!DZ·u‘Àíoj0Héó<İŜÓG?…ŠġwğoïòòĦŝĜéVŻî§ùöĊVyC1ŭ%Ÿm‚·c·^ƒNv~“g›|Ŝj‚m„ĥİŠ g}Ġ&?ŬZR$PY(üé1ĊÚD ċĥ2÷óyœŽž€ç›MÄ&ˆ1u˙÷ħD0pJċÇà[ÂÙêEe.£*ĞBÌx?mŠ˙zqNÙ4Ç÷¤1p@,ŭĝ#zùÛğ‹ĉäYúÓâr…+‚[0Áˆ~ktÇ˙ž´Ġ]b|nî]ĥW­2›ŜaçÈğ˜´éC­Žħ7Í2.ċ”ë6ħĜç·Úk˘•­gĠĈĥyĉè˙ĠÏ"endstream endobj 576 0 obj << /Filter /FlateDecode /Length 2530 >> stream xœĊZÍrÛȳò([0kŽĉ˙G•­J9ċŬMÊŜġZLċ úQÄ5E$—SyßĵFz1CI€Tù`ŠÀt÷ôô×ÓŭħżF‘Ûċ˙‡ŜמJ#ə@TG3†ˆŒ 6ˆJ-Òè_ÑĴ‡‘Q\bŬí°˘wÛû½wŝ‰Ŭ-†8³ (RĈ.žÂ•ŽŒ†/ż* oŭĵ‹ŞKP…ÁŞŻ=âö•˙˘·C0‚jP„Œ¤2ŜöŠ“Hh¤T”"y4|èĊér™Üŭá½wC+ ‰Wà/&06>`‚Ŭ§Ċ a’J ˙2¨uı×ö—J$bRRgé7OìŜሰ3ŠóÇ<[L’)ú˜.–Ùìç#%`°I†µ0‡ì‚R‰(èòt^Ċ³ä!íàs˙Ĝ˙<üG’3­&$Œħ!iĊm,)Ò$ôßĞÛ,{ĠƒTkĝÎ2;va *ĝ€›Âaóûlĉí¨àK[ŸzŞ^ıš£ÍIÛŝŝJž×`­CŬì§îN ĤŒûŬI םÔM 6Ñş)!š!lĝ†’ÛÏğˆżtâéF$Ö‡ż×ŭÁŜ5ñù\"ӘÖHĴŬ#³[[c ~ıÙÒĵ5ŻŬï1°·v‘Ħzĥ-.GQċ*Ħ!-‚>1-AevеÈ+‹˘²”ĤUxsœXóáŽ:\I“@êFd fŞŜYÍ+ÖBâA†ŬY[ÄŽ,ÁĦŜzh"²54˙œZQà]J“2ƒë…‚Ö§{zMúĦ‚-“`I[Á~£Ê_va˜ßg7ŭċ Ìċñdi?ƒÓŒŠ“êkç÷“™ŭ pŞEüm‘Ìçĥrojxs‘=Î )jZnıİ=\›ÀŒĝ§I:½ı|~ „5Ŭĥg·ĠijĈ0 >‘20ĉ.ËîĤéĊĊ|‘ċÙġíĊĊ§ôvšŽóI6{Ĉ>A ĴlŜ÷Äŭ­nŠKÍpjŠuñxš,—¨² :Kdˆ½n{ñn/q¨MTœŠ42‚Wş~°I¨oJ‰ïlƒ %‰Ó³ë>ìÁ(%âïy ÑU<Q1TpÔÂJóÒġhcˆŞì]VXúLDC–C\ˈCC‚á8Ĵß ½Ï…ċ ÊUî/ġBBÚŭèx‘ĉ‹IúïtY~E¤‹Œ ü@W%}ñ!$ĴtaGŭ¨\ç€^qFö8½İCô%_Òj%‰³ÙĜûk™ÚöWşo•\ 4ìy;!ċĊ1ĵw¸„KcU`—”ß’DËwjˆşÇ5Bí:8ùF`p I‚—ÇööŜKΑ€Rħ á•˝´páÊ´ÍÊ$¤rŠUİì)î>ÔEò“è‚<Îi^„SÖ7%Ąl@Tú ÂÖn8(÷ò˜Aq/ĥ”FMĵÙ ĴázÓíö¤2jTpĝŭĈÁ(ÛñœŒÇövÇcûRğáħ}‰§âħ='ĉħŭŬvĊcû2ğv˜½K¨ –>$“éfğKĉÁqô‰Çŝz,8{肳;˘ç †C…ž›ÜTLyB˙Cx¸°ż&ÈUZ…a@Û8GWÎÀ,Ĝ-5Uê¨ì‹Użb_üşċ<·”ÜÑĉN‹\ŬucCĜ–NĞyĊÚ]d³2[k´žë³ĥoqA"–ÁÀ›( Ĥ,÷&÷ 0šW„Ŝ÷ ĦTP[4t@a0MV­y‘XŜÌĜQŸÉ8Ŝ³ġo^ħĉrŽiŭ·ˆ?<$œáó­˙ĉ˜Ä§JĥOL6XsĉŽê; &›5t“Ê&\ŝ֛Îîòûi‰UÂCĦ£zUàùÂÏVZiµ(]³şµıúJŭġŸïß·)ìÓó íoD:U¸ ·‘Ŝĵ" dx4ħ/Ò·ˆ?éTAĦäNHÂÂPèŜ ˆ‡NĜo´faÀ͖†Z“†U4 Ñ*Nϖ}"ì×"ŝ–ÌmG­lÛżwħ)ğ˘ˆšˆ WPĠä.­è =6µĤQC‡?N<á:uŸÇe꽒gġçeıGG¤Óô!ċ‘aDÀxĴĈ"§IžVÌhĝS:-w„K ċR8ÏĥäĠĈa4ÂkĵìĴë 3.wÉĞÍZ$Ĝìt]ıݰğܗÚMWîK]ĉË>dם2:˜.ŸAbmßUħ˜Š@E'ŽÈbŞz¤•*›Ŝ²'h5CĤ™Gž!óUu5CFİk)ì`öğ£ñe“Vc9EĠs[KŠÁ—Ŭ†İ'†iħ00úmCĜġFÖ‚ıËJ'mÊ>ĊdàPbû²Ż˜ SÔd‰Ĉ÷É"çöÛ˙fÜ/VÒW³Vt˜qƒç<ÙĞЎâvu·zÚ`Œ2‚8“ĵϟ˜1cŠù¸Ĥá€u^Ĵéŭ‡01£wXħFá‡S„h×Ì­sbEírQñb|­˘pc.Ġŭġ7üs°ĜŜŜU3ÈâJ­.¸*$"B™‚VSs˘£„•B;Z-&´â°˜÷.tCš’rJ%ŝŻ]àL{ùĜ:„KçÈĉ XZùƒ#b 2f)Âê׀û<Ÿ÷í!CèŞxyq~>^ܞRq2C‹A ]°xÈŝHÇ9Êwçódܧî”ñÀ쏟>ÚA˜··~[ĵ݉˘@@ı˜ĝîĉ&^šĈiž§Ó7ı¨âŸúœÛ˜Ċ‹=lf˙ˊı#ċèş¤&*\ĉÙ'Í(§ÓïµÁż÷ŝèMPVendstream endobj 577 0 obj << /Filter /FlateDecode /Length 2261 >> stream xœĊ[[sÛ6~×ìà8™YjkĦ8¸cg÷%3ÙvÛĤIMû ûAħéKkK‰DošÙîïíßĜ’"YT$”'’hà;ç‚óù˜P u˙ŞÏ‹ûÁǁd@¨a‰Ɉ´‰¤œP X VĜd‘%ż$³%V Emr½ŒÁĠà§Á×o9ˆäzéd€qq‚ Á?UÄò•AĴÁ‡ŸP’Â’ov‘ô%kJ×( ÊïĠÇĊ}òbŒŠ0#KĴb*_ ÊĊ£‚p™h†T$ûAz1͇_/Çèxš* ŝn€Â­”ŒŒ˙LÎ?Ȋİn!"ŭöġĞ—ĊŒuó2%ˆ”árĥ¤ĥĥñkĤeŠŞÖL+vÉh­:ç3%$Š“…ğ-?M?tIhUîñ!ëqÚ”˘=(Ċ:CâFƒµĈ6˜F· Ežq~Ò%y ħÁ˜ġ4RÚ-ˆ!6tѵJœ½èŠ!ÈyˆŬ%Ċ•.Iŝ1ìZ9*7Ĉ¸ñŠrŻ$7˜‘ ²ŻlärÜ@Ç(Ĉ Z?¸ÁïQĞBÜ µ–ai&1ŜZ'֋pÛĝ°NHƒŸX<ż\'‚Ü ~pĤ@>E–Oûe­ôŽÛjpûŒ5ë ËУʞmĊ Ë°”Šg°XÌŒ—|ÔÈY,T8róÁcd2ݟ\ĉKˆÑVĝxíùŒb\fžۊökQçÂż<ÀîÑVlA?4İıÄ#¨Ü#İ={ölϤöêġ‹˙PĤµŻß‚ÂnœXÜ)3bDX ,1t{Éía­!(†/ƒô•ó˙!¸\¤×N’N³çË,Ž˜6îŒq’ßÌ/I- páR V,P׸x”‘ŽoŠhzdC„³n9ÈaƒÖ šÎ–c&•L§ƒEK1ÌW³ĠÏŠïé2ó†äóĉ{­ż5,ŭÏôî![V–ÎݚïÓĉë"ûMó'"ŝ_²ğjÙk>Ì5şeM–Ĥhi|Ŝ^9Úg„>ŒxU`ËÊáĈoòáG•c‹„CŭX`/)yIê,ûÔ%3W x–ĉù|q;½#o²Ċr>ó›P­Ĵ ?Ü-NMáÜĉjeNÒÙô>вôŸ‹Ĉì{™ÄˆäĦŭNĉó.]/>Ċ”ĴÌÈމOPB˘ ´) VÔÏUò -vhÑ/[lOJzwğìr¨Ş:WħûĦŠaµìÌĠTÌ;Ħ–k!@Ŝ8s˙XTğ^%Ó£bUßPÖĠj{mĦ ÑVú²×ڒíÊñĊ™ °#›ŽsE´ħĦéÜİ˘÷LÂ5Çó çş².TàrDz6<0¸JE ñI\DÓÈ^;òFğŻ€ñMw܀ñ Wžĝ;… `‹-Âŭp]ZÙ§¸B×ÇíMíÜi½r•~Ž}Ô=B}(žÌÄ:÷QŒ4)Ôç>F¸ġIÀ`ËÀċL#;:eìc÷0éŽ0á"PĈ¨µĤá~ĝ”ħ|,{e@”++X§şèHċú }ñNĠÑÏïŜ¸ûŜ¸Ŝx`ìMw°'%Î{v½Ú6>ìŒ,`ÄIğï×VC{"ÀŽÙÊÇ×Á&8?˙u°Ššp­h™ƒY™XÊ.›3ä[K¸^]ÊúëĤ[Ĉ)]ġĜ[jK99„áNrÛàqĊE;[ġĉŸnó›&²†ğşĊ†yÙTG*o&+°³èJ´ñŻ´½ü=ÏfËÛùlu· ĥs’ĤE²WħÙÀY(Ig&éᖛ?5óêɂ™X ĥĦ!Óü&k†½*ŭ­1O°Ñ–hùb¸;à.pİêr///³ğ÷C°QB}³<ÏîN&n Úŝ_CğĞqçC7Ĉ˘_OgÎo—Ġ+ñ÷ċj‚Mßċóß 8+MšŬ}Ž„Ö`Ò·oó|ŝâáŞÙżŸoŻgNî4 rˆüÇJu÷żĦjĠ…TDé•ŬżCc9ϠʤÓEċ&¤Ÿ+%ì§ÍHF™Úh„eJUğ˙GµċdSr:ùŭ4ĝ?܎~~endstream endobj 578 0 obj << /Filter /FlateDecode /Length 2864 >> stream xœíZ[oÛÈ~ò#ÔôĦ£"šÌŭ’6@wdÑbQd×.úàì-Ñ7’萔]ŭ-ŭ{ŭ=3!‡²$ےS @á‹—9çÌı|çÂù:&˜Ž‰ûk˙ÏV£Ż#İ$ĥŒ553>–„sLĠ˜*‚9‘*˙}ĵlµPÄŽŻŸ°bt5úiôögNĊĝşö<8Ü- X ·À`xF3 ­ğwÀKÁ+–Žx Ż3àE@ĴŻ#ê77n˙ÍVïÏA fÄĜbИŸ_ÂÎéXl83cÍ@4)ĈçĞZÑÉùŻ£瞠ûОKU ,RŭÍû„ês Z‚[b²Ž`o>ğÁ ËNAT ĉêÍg "1ßŝŜ|Ġà=µê­f8&V찚–‰Ċ?óäħ–2DPN 跓)%^ĥè‚ŝ2™J&1! }üîdz“_Î˙ä¨bİsä, ì3ž2…5[s óŬ²ÉĞuÖ·ùò~BıÀ„rôf2eÚ=‹šEŜR §9ĉRƒ|@eË%Îżn²³Í6_R jÂĞèj³ž5EıŽ,šeŬ…F—ı˙6u>bPí8”wĊúÚŬ1 t†²ĝĦĤ\ĉUĥžċ=ÍğEî_˜•Ğ›ĴrËwm…I˜­€èjYfÍ}00£´}­ĴÂ;[&£X訕yıı\ĉğH95Ëö­ÛlıÉk܇‰ó/#HĊ5“ÒÂe¤úPHRxÏ`mġÀsĉΉÁw‰µÁqÀ­ñd*ĴsƒVy5Ħà9ŒHÊu7…Èi’8W`{Á”€f cy½S+_ìw‹ŜÊMk4weĵĴ³ëĵnïX†ÊĞÄuÓHTgĞĵwıĉŝ&O6ߣÔ †uÁ-9”>+ö.bÔÔĥ0ïħF X%wa̓ ħŸ pC96ÑfIr{çŒàžâÔEüŻ£SFÊëÓSQÌ)Ġu~wB&˘ôLԀâgÔlš²*²%ŝ”Wuı~“èH++9u‘ˉq!üü]0Š•,ċyÖŜE=ĜNżObs0‚ i­ó?gq{gä`·ŻŻÊò2Ğ^Ÿ D’ ÍòyâNx‚ :µÎı2&İŝÛ8fBĵ´Ó%T_ÈéŠ˙5§ëy^ |•Kçu‚×Ü+Ûu^÷'p; ü×ÄíĦ&[σäO  ž'i<ŝm=OB%çtô²ž—Rí’ìħG!q+Òĵç[Ñ7=úĴè0)Ž>f à@x0Í,`GŠŜ)9ĦĝÜÜX—‹ù€jVÙ"вÔ§èZ0,İŬxĊ?O‚n—LĴşTïʨô:{l•L) ċW,?@Xlítö?ò=燍ŽK~ï"‰>%9ìÂ÷ÇÑùïĞM(cPwЧ–Ĝj9áċĤPĤÌù"ßÙ tı…a¨îK>í*Ê6ԁ(‘=%íœrïZTÔŝ7òċğ˘²Îú6³½IşËîáB:#ñPÊ+ŠŞĵİŠĵ{ :,&„ÇZċešçġĴ*n #FŝZ„'zÂMßçĤ(ïO`¤KôçĤ'7ħ.› WyĠäë~iۇxıt'³ îG:€°.G]ġO–eùesÂ6VÖE½êûŸ°ÑËùŝ¤X'Kcn]Rvn,”pĦüTßêR² ŭ&¸Ú“ nA KBï€8Ħ ŭ„YٞyÎv‹µĊäà=Ĝ|Â<çAu€ĊÙéùO(ĦkëñÈd˘&Šó½4û½`ÁĤ [µ|(úë­òô”˘‚nîdWB.ԉí xȍ>÷ŻĜòQœ˙Ĵ/ŠI‰¨Ÿ…£%Ċƒœ˜"`Èp]…‹0ôĈ^œÑ”ƒşÑş.Á•ĵżÛ•-$fœ8Û2mX0¤ !!|ĉìin‹[˘ħĤÏíŭ+†Ĉ‚÷@^vLh`ñĦÍ-8äÚÓ;ÂXÚĤ_´MݞAĈ—gû|Aò­dV/ A W& ĥ²ğ,çRşÖù(´Ċ–cC ™tC୏ÀòÇWÌÏmê ³€:—:Ž uûüQ2êıDѤ{ˆiçÌwE³è›Zû ŠŠ|9Ż>8YÍq0'à–hÈ ÚŜ[†ĝòÙcÙC@ÛÏáìĝĦ†s€Á F´í|#¨‘ĦËMÓg£ğĵ÷ ?àĉeâ0‹˘î-RĴë&Ïĉ§|†èD„âO3îx‡/m–iŽ~FDï_14,ĵ¤ynaq€üñÍ ĊT³˙ùÂò˘v3§ûWlY‹‰Ċ1uĊ/PW0!€ċ – Ásĉ9N½+ĥtN˜œ–xZÎ;@ŝ„„ë˙“Ŝ)32à/;NSÍħmg#ü€ŒĝÇws˙išHt;q_£ 3È}ċ÷3 ÒQô1ϚM•×ñÀà#8&l‹“”ĜÍ%ZNÔw„ ú&_×EıĈ%ĵ(3‹!³žĵ“‡ î'ġ3Şûr.˜Ÿ_…ÚÌïožÏ–Y•‡näO=ŝPŠŞl>zsżƒ0\b~’ġ lĜ\oV—à:ñm'G܏Բ¸*yĉ È"kzú­Ô'‚ì6+–™;Ŭòı!ÈĈQ÷ë•égo[Ĥ3ÒÎ]ĴÔ~'üÄïÜçfÂ(Îë*^vÊfvŸë /Hbng½Lĝ9`ôO£Zêö’µ·²ŝçuqë'}žB˘÷ôŽŬSmÑMY×ĊċòÁŬzIµ›ñUż²ĵ[ï<Aü­SŬ |S•°ÁŬƒÙNİÂċf‡Z}µÌfÁ".àKW‰…}1´Èn˜í€äjüÖs‹|^4á×`r Èt]Ĵ³e<]a[oJǝċù #IŝD‹ ĈĠPĈEÓÜÔïŜ½†=n.'ÜÍ׉BnÀ˙v5ĦMÀ›Şš¸'L9s3÷St_7ċ—/T |y˙öçONċßoŝÖËú(4h…ċÒOjSa¸sÊv4µ)eP|@ùŻeSô‡˜l€ĈvMôÎÑ2Ğ›ŝĊeħĜdÌ,öߢPĴ[³PšYvœT˘,Ĥ#ÂQ›zĥÈWŬQ,çŭğ¸ĜŠù,›Ïħë˲ü²ßğ-Ċ҈îXï ŭOBo [Êx·S )‡Rû”^ħ¨˙+^…He­½ĠŬ• `Żüg‡ŞŽp§Z°a>‡ Ŝ”8ZŞĴCĉuÎVµîËE+j²ëHƒ%‰0Ÿr.óĉ.àèßöʉogëyÚé/Z¤ y˘O Ŭ-˙‘h›ÉLÈ:܁Q "Ê0Ó~ëöN‰[?‚@a*şÁ`-)ÙĜŭ·Ä}´ä&şO^u§Rúó}˙L§jυ­„hÊ ¨…Çàv\+ÖÖÄĦħĦÚ‚Í*WPŜ€:q5L=ZƒŽÀœżĉ³—Ġġۛlĉ‹‚G|żï ëİhµKD5´4r(â‡ù<_^N¨N´É›&_ië/ÀԏÈYVKŽ<ĥZb]‰öï2ÄĞöžü˘]pĉÖQ³Ú8´íŝiôd'šendstream endobj 579 0 obj << /Filter /FlateDecode /Length 4056 >> stream xœí[ÛrĈ­ÊSJċ`URe0‘°˜û`?äboìJĊŽVNĵİ"!Y pċòÉ?ĉ7ÒŬ3 ¸¤VĤä·Ô>,əéééé>}™Ö·³,e³ ˙ù˙›³,ÍrɅ£0\İ>hĞ”4³ööìÛ3F fŝżĊföËг— ĉÙÔäfvusĈҌğI3ĊR C†ËÔÈÙĠĉì›DĤ<_ÈvÊlòë²[´ĠĥoÚù…V&ëĤyğÛĤó?]}qöéĠÙïϲÙk6ËS%ßۙ) fT´urµ*çW…EÜJX”kiQXax*eĵàòĞĥé›_înܲ£{qÎS£ùä˜Ûbñĥ¸-áT‚§ıÉ+;˙-·Iż†,áñpÌl²,?ŞË˙žé¤/×RÜ´ĊĤĵkÚ·4(}dIĠBì=BE7~ŜmXeuÒÜZ%‰ŭ˜ˆÂu28ŻUNF_^˙µ\ôWŽÉr2 ?Z"…Ğe,nrâ²xWTk\íÊr8a³ĦoNLîg•|ı)o‹ßàiqhÛ6¸ħӓè2´H-“vf²,µˆèċ¨&ߞ)ĝœÊıN üŸö3 ÑżM¨B[Îŝ8ĞQKŒÔ`…·Xqv¤_\ &g·î‚ùÂHv.€™rĈQça”üx[QŠœÍ^=fĞפ옳YˆÑ6Ç#A<ž‚-€G!n9bŒ7#ü÷ŬI‚yÙlJôS˘'³ JfcÚJ<•cpŜ*˘Ÿ|ŭôr²\Lè½IžI RrñĵWĈ2tò{ı2Ĉ`Ĵ|ĉ+cܤÊL•ì§ÏĊ1Xh&ô„6{‚:0)R§ô € #Òp*c€ĦšĞ”Û£ˆôĠc¨ż&ê' 7#Ĵs3?š_° “Ï<ù†ŭ Ü?w)ĠċןLDÑ×ìeö "$c|äF‘₢u“_‚°ñĈ;ĈŒ &ċú8 ÎġĤ-!ÑŞ{Êĵ #ĵëœĞËè›ó;Œ2-¤…alÜŬ–Äš ñTtˆnÉíô0Ċe‚$Úßo]d"(Ásé‹[K1&B(Ċst(éĴÊÍ… ïcħ*ÚbчpÄàÓ]Ÿ6´ğşö ˆ]›:,w•šĜşèáz6cvâ‹>&ŠĤŽgvß×ÍH˙ŒĜ†’œ/‘êìëçCғ'wÑâ½"Äpá2pĈ~jżɓÊġr”`UÒş%3‰ )Öżż+֐DÁgÌFŸ£P‡öċóĤ=ïWżĠİ’:d=rRŝF6\ĠIXCÇŝ̕'_8jÑp‘ğB­Ç:a-ÉħnŽÀ–`¨ˆLA@šV܇ ÄenfR—Ğ†^@>ÙÓÖŞFĞ;FğI“r9a ÈçğÎĠê­vıDùQ]á\„9“)Ò;Èw@M'è(בL|¨ÖÁmžò™R9sÀĝ/Öë+Ÿ‡ëÈBİÔH/˙ĉ}Ŝ)“2QıìáÚ ~´šp´ƒ£÷ÀUJEФ ŒäfÊdaëŬ’ž,'KĠ”=T†ĉxmúr‹/Ö¤UCĈˆ§9˜żIĈm*†8….9ž]0 ›`š‚0c›$.gü1YÛñN ¤äX9ù4^>>f¸u’R\’Ïš 0Â4¤éŒeĉáĜ›isHoáš3Á"†’Ož)ôĉ &™ó˜4Ó#ígá^@ mñ'÷EdE#ŽŬ¸6ÁÇÛ)žùF˜7‡‰¸xĥ+aŜ’Mi3óĵwÂÀ-ññ?-.Ÿ†Éżu_{0µ—7ˆ\ĤÖ%cß$ż¨C¤—³îWÍîvE1ci*rX!\ŞBlĦÍèáΣ¸fĴy-âxçÚQ2µLC¸ñÁîî ) ­“#Êĝ]İ€ïĝŠ)òÁ<ŽÉà€|m^=ùĜâTè—&ílQ¤|JċSàr!9sËèÓİU hݟ_<µLá+AÍşĵ{J)ÁS"‚o†÷ƒ?Î:Ž#\áB™T éíH ²£İ,O;!$XÂû6ܽĜüĝ ' ·‘ pê\ÜS G҂‡1ÏĈ/ĥ–>W|? Ê´Ïe'[íĞèé0ï!8&.ž o¸*KK‰ŸWÛ"şÏĦmıïG۞‰ßAÛ"zĊJ˘`€×à6_I@üd—I° IĈħB˘8ä4ı&rÊÌx†NóĝŠİl`jO8ò1Nó-^Ÿ~NT˜gŞÜEU›<=Ĝ î?lœnÓ1Ġ˘K‡2ÙSÌĊWò§ #½™ĴÀsžçħ˘JfRÎòìĉĝŠ=Ŭà Ĝ(“¤Zì‡ çê§WyjŜ3›½„Û%*2£ħĉĥö۳П2>Œ^úıy06?!ŭ×ᆲ÷;ô8n"¸cìwMħħÄ<“êÙX’™kıġ…&ÍmÒaÇÉ}†ğÙ\Wu~Èħŝ>b]Cmżt¨–¸Bµ„eҐ‡/#W—”™Ħ˘dvM˜6ÙĴĞêÛu92ĥ,kèŜ½›íüİ1ì?sc0Ësá ÄUN°DmŽTN¨IIú&%×5ċ{yüHôFï³\ċÜ7t­Wù’ĴoĤŞ‹Mè c'Èï°hêweÚç|g•[´nîÊöbQtÒ<ùËÄç~<Zış&âŞ?ğŒ86P׸ñĞ…k2:öÜP¨Ĉíí–ŭ¸÷#qċ[ÓùŽv”2l°Òú˙úz‚bËĜ˙ġġ$}Uà8”~X_Ÿú~Á ,VĜB÷^·7ĜnĉvWÔħE ɗáMÒ=EÛ­sÛièŻ,œBa@!¤W•a,'í_³Ğú‡ğ²^¸?À@5pŬ4 ŒÔ—ˆboV'Ğêá?GÑA21ždĴ~ŬWë½$ai~Œá­í[ı&÷Żëuġĥ ˘ŝĜ·Tf÷Îĉɜğż4Á6â=Ĉ.w ,·e½Œ~ —9ÎɗEM‚g¤ŽÔ”ĉîêeÙïIaMô F@ñĥ3ю˕yŻÈĞ„=ĈżáÜ şŬ˘żJ ElÀF`–pK–ÀĊábH°gF¤\¸Ž–dĠ÷Ûî%İîhĜšqì×LÁgxÓ~ñâ`cw=Ô›¤UĵĜÌġƒ˜d×ĥÀVR`ÀéġĜ&÷]  *×÷/önçœö\rĤRkLÌe’=3 . OxsvëSe@s0‹ÈŒSœO—Ër}íŜıEžìÊ/×M!â³ı„ÙÀÓŒŒŝoJñĈ5?¸šĦàĉ5ÉċÊâQ!N136í8ħ„m¨nkܲ&'˙ Y 6ÊĵKSmfú‹˘&g Ú˘I_‚œ=`EŒ‡mò„g\ÙQ, ‹íbşŝé6ÙÙR ò!ŭŭÙ˙£¤ĝ—endstream endobj 580 0 obj << /Filter /FlateDecode /Length 2670 >> stream xœí[moÇŝNôG\=ĥÖzß_„¸H‚Ú-‚¸ulŭ Ĉ‰lRڛ™}ĉyvÏ?‘Û?ċżÓĠè瑐JIŒDD3†ˆ á1¤qï`=ÂÈ(.ħ ĉG<1ş}?zùžÌ·ı†8³0$µ}@#ĝ!‚!&+ ?ŭ$ 1$ĝû1>€/˜5Z3˜5ž…‚j`Ä ù´ƒòŸé*ĝfñ݃Œ¤2˜ÜŽŠœ@h¤Ġ˘ ̃Éj.nǓGŻ'ÖUmjÇ â ó ^‡ŽAûç@˜V R’êZŭcüëb›m{ÄJˆ„Qħ"F0yzħċ€&Ĉhóĝ JÀˆïêl“&Yr³ğŭ¸[/²,Ŝfh}½\Nî7ñöĴÇ̨Ö3ı{q’‰QcPkaÎŜż³ûfw{ù·x;M›,Iß%ɲό8ˆoFWáġĝz<6“!áo&ߎ.˜HJ\‚Œ$˜ÌFaá<çèvħŒt‰W&06:OÎ?=~Ħ5‡š‚„0ËMž//úÖ?Ċ’àžĠíŭ6‹W­İX¸3€Ëyų̀İI¸…_ì–QZaükŻ·‹d½Eyc|bòêĈj 6y6q§iŸÚΆûŜú·OˆI%=ĞëĝÓÔѵxvş×ġZ”Efğ.Ğ8 äΙŸĠÛߪ*‘–4ëêĤ ÏœıB `Ŭµ½oÎÉ&GÑòb1úħ}'Ç4È!Cnс›x§Kf~¸°Ìy•?:jέÄól“>ħr€ŻyĦŽ‹Ş²"š;2ÄbÉ-Pam ÌTpAµ Šì*„ŝ rNXNIIĝ6Ŝn£1ħ_]ìG˘UŸ—_@††n ]PN´Wqv—Ì xħÎ Ä+$§yĵÓ Pœ×öä.."lMJ#.Ğ1óV™ĥ-‚:ĉŒÑbôUéÜc DN£uġE…7qŝ9ÜmcgH–4ŸÁ›ŭ:ɨ—hıƒÎXü’„ÉmġQ„µUÒ Ş¨Í™‚ h(iTğ½ ÛûLĦû‰üLĦ>J€qÁZ×G #;ĉ$ဇı‡§t_ ı§ô,×îyğzb–kû1˜ċ2gĦ Ëġ(² UD°ğÒĈî%w;Ÿh­4cÖĴ4 6|ÏR+á.s·ùËÌ ¨ŞŠ”X$à0Ĝ„W䇊P@²jï{ÀC×Çx˘R:È#ŽCžh6gZiΊmŠ)?Œ7ÄR&ŝĵ‰f³}0c˜0z ˜ħNò!>Ä´5?NMeq9iŝ!^Îöt ġ˘ \ bĤóża†vXĦ@ˆÍ1pÓíàéeÈ5ĴYoWĥ\ĉ§:·))bnÚY’ÄĈfOÒ ğ 7%×aĥ˒t-Ñğ8Ŭzkı ,ƒbŜxĵ ×Ñ*n$É+GZ ~Täfîì6éu6Qˆ:ı+˜8ÍWúzos—ĴOThƒ…•D°_S8°ħôĴö,ĥòÄÚµĝ Ü;›¨îV7q:téü ìċ Š/÷T铕_qÌGĵıŸŭ…ħë_B½Ž}r#<Û§Ž†„~ê²ûM½oO•7n÷’ökûì˙zûş×İ˘„BlĠaħu9ĤHYynŬ]âiÊë šĦä¨<Ê!–ˆ\VÈK‚`ëŻFƒïF“?{m½~¤¸0,ÇPË‹sÙ²úÀżç ‹Ĵu ,´x×Ä!ٞ8~Ĵj’ÇİĤm––b‰|F+ًšc´’!ċ kşS,Ziĝ–ÈĜW7QŠĤÉŞĦĊY[ĠâŠĞû‰VbĞXëŠë(ştÀĊ‡ŝB”Šˆ*.ĝûáA%D]‹µŬ  ióXè~ÂO7ħ0Ë[¨°ïˆßC…֟Ž DI$8˙?*x¨Pt·'£‚§~G…µġž:òĥo‹Ĥġ}ß]”FÓ,NĞ× Ôa)Ë|Á×~ġ½xНt½gùšÁ!M;‹ovóJ½*‹ùëZ{Ŝ*Ĝ/l÷@& HŻ1?€¸ĝ|)MZúôĵív°ŭ/ êùôİëp8}êZFŸşŸKŸ:>ŸYŸş³JŸş6O¤O½„=Ż>mglH}zÂÌUúÔËÜIġİ;™!ôİ·1{żµ]á ÔĴPÄ xíáZüÚ5~Ŝnн^ÖĤ­ÀWĦâ$âbrêa_I‡qTŽ}›x“–ŞŻ3g,ô-m_-/XÀÜ$ f어5Íe~L{è?ÒyFĞäàÛ Ĕ,o+î²l3ĥ4ŞèÀċ˗Ӵ`@J…Ñ ÓxfßIû1žf(Iç/UŽi2Ì˙kCM*{“{ˆ\Ú[má‡ĝz6‹—7cbÙ wq–ĊË ġz3ĉ°!•`aj šĤ ˙7)ÎÚUNΣġĴyàC–ü”[3J‡öĝûÑ˙HzLendstream endobj 581 0 obj << /Filter /FlateDecode /Length 2029 >> stream xœÍZَÛF}ĉ#ˆLĦwö%ÈA€Ä@0$ĥ0ypç-ħğ5ÑbKì8ò-ù½üĈœâ"VÑ˘Ĵ…Ŭô ŠŞş÷òç|—PÂê?ġ÷t9z7Rœjy˘T„‰DQ!ӉpŽH&“MžüœĴF”8GıÉŭ;Fw£ŸF_ĝqżġ:˜%Êù œhé7X‚˙$•D8Ö¨ÄYœ}]F%/Ñóz(Lz7bċ…%ġ×t™|;ÜÊħıN&w£êŞY˘ V%† "•L&ËћôŸkF%–şt•-óŻĈ׊{{dúÙŬzŭÙĝ—É#ĈˆSŠ%“&_D[ĉ³rƒ"”ò”—‹;+òe6_4R*~s›mÈt½Ĵ¤7ÁµáPŽâ`wÑÌAğTA8ŒÔԅáèŬQ†£‚²Ĉ7Q`N'öAc˘óò U ügs^4´Ö„+ᣑN³b<ù_ċ‘Ó£k`£d‘À›4w–‘FnXlfĥ%Ӈl“M‹|s½ a Bw ^ĉÛmvŸßŒoĈ;ÙAvPŽÚNIŞĠ Ü >‰ŬÉÚ+ŭu)ŭŒtŒhçN,Niž¨8ż|Ċ4:qÌoì5'Ò1ʓkqMaC9×,$Š$ä,ŭâ˜ùBĤ÷^%Ħ̚4ż*ÖŻ‹Í|…sÜ@0Î-óâa=#µÂŽwà!%<Eén/2›Ĉ°RiÉŭJ)‰b!­Lš>n6ùŞX|z|`ÒùÖ[t—fĞö|ĥ˜gÍ_ŽCIóŽòŭfÁíÔÙÚĴnAtMӊHÁëĊwĞi1_ŻÈžôV-ÊÊ6Ÿ FQy ùġïˆë”ÏŻ&ÁCüì1Ís“\)xUV|]ïm×¨OhŠ•´ô12‡–G'w/tx†êûúúҖèco½CİĞüŭ%wûċ&-‹ġfž-ȏùfğ^½\d´Sğ‰Ô*wÎUp„× ~oÊ.S÷ &ÒµóÁ@ ĵ&$“ó)è£âœughV–ûŻêgç{g‘Î:’9´ŞDêĜaemÚò“yLM 6v=Ööêó=ç'édóÀž“ BŞĜsóY3wXäĥĤ[Vĥ€Ó5IL §żÄ9RÍM\˜KHŬ!›r7 Ŝ|ÜW/lvĞp ŸÛòœ2£{PŸ´èHBúz7ÄCˀ\ÔݨŻ_úÙ^–FŭM)™”È0î:ôÇ@%ŭ;:Ĝâ Fv@ÁĊŒ ÜœGW˜ĦÀáY(uˆ‚d†0_­Ĝ7ŜÚ:ùXDÌö$‰pÔN¸Òż#NĴCıZ¤¤Ÿ[’9@ĤżK‘žBÍÜqÔ Ú^ßúN>sA?ú"*&i{½ ÎMiáÇ/> ġ ÇÄBİ0ħPâs1ħ@ç33ħj‡bbĦÌ'bb‘ž—‰u=6${BÏ5L,òܓ2ħb†`bQaÄÄP„ú9½ŒFԙ–:êOĊRƒÛÚ{è 8œĠ>çaÂ˙¸¨:ġïˆG 3ÜÖ÷î*€-0ġ>„a§âÏ4ÜÁ İ?OWe£;Œ–Ŝ°_Z´ÔÂ+,ùĵğô ÉÜ sŸĈğš÷ÊĴZːö‘a1B+…ġ[rġöa½úÔµûdôĵx?ó(Ĥv³¨UiAĴ…Gv•£'HÂĤʑR(ä%O×wŝ#tƒd9k(Òl³;mš5E]+ÊKÖµ,áí –Ùt–O2kŝ5é?òĊĴÚĜğ)ÀrÂßtI‹oóµħhQÙjÖXldÌcÄ"_í‰ùĥÑ â•Ûr¸BFšmƒŭĠ3Ò;·u\šÎċ„ĤFµ­ÎïEyÇÖ<9`éûyñüR½Ï| :ÉjL|µ ƒ;kwhxŭ6ßd€ Ġìvş™ß†`v{˘ĦÒm^>bĝ3êĉèÇ~ŝù"u 8û[['ϚÁ ĥÎ0Û?Tüâ¨vÙ#ӂ" ‡2I“˜ß`ö*`Ïkt)&xKo8=ŽŜ<eEŜŠş­HMú¸Íƒ%!›i/˘b:ÛÄ([´ v%ĉêseġïXP—,ĦŠöıĜz5Í÷r!ƒ*‘â„'S½âe öúğ—'?˜êWpîIQ.ÏĈ†B}ħĦPê0l(”ĝ …7(kŞ;Ám1iıUÄ E„2wl`LŬĵĈèz&úĈ0ĞÈ£Ğĵ˜ĦĈ‡&oÈRŽŝıëI(Ĉß‹.ĉ Â˗¸Ä“:àQ;çy˜mCŞğÉ4³š—=>*Çq3+E‚n¨üi y¸ŝÓɵÄ\g@·ċÌün6Ë·cĉĵ0ó˘È/Ú7HKXoPj›ħ_œŻu…M ÇjÜè7¸ôuħŝµç”Ms˙’ˆ4†ÙôĠ›uħŝöñ XĝßùŭÊë’/£@ò b/íL— Ġ4SŝLu<iÒÇlSiÓµ˜µŒ½hÔ¸”SwH$t Är­k”ñGí´H³-›tµ€İ]œ~ŭ›Ñmendstream endobj 582 0 obj << /Filter /FlateDecode /Length 3195 >> stream xœĠZÛnÉö‘Ĝ 62ÌZ£_Œ6vY`w- vFäHâšä$e݁|K~/ż‘S=Ó3=‡’(ċ?˜šéŞ:uŞ{>ŽYÎnjŝ5˙O—£#mtî…[n\5“2çf̝ʳM9ŝëx5bı÷LH5~ÀŒÑĠèÇÑùO’cĝ6Ĵ!s%1AÛÜšàrĵÎçÒ´K¨Ü;<ŭŒµĴ˙é!ëĵĊ: *}ñ`Ĝ¸ùoşw „ScŸ{#ÌĝâjT[ÍÇÚċN 7ĥBĉôf9z—ŭjrĈ™ÂXŸ-Ëíĥ¸.'gZèœ1•UWôêy‘íĴËÉß.ŝLĉ ž÷°ĊZ‰.f£ìד‹ŸïĴŻs!™3͐ŬíÚ̋EŝCıÙVĞzB_ĤuıҚ“ÉY óġwÙçùîĤQœËL6z;ž]ÍËĊlíÙĥÜ3Ŝ\À…]' ù¸ġµçıW>‰–ğ~ÀŒíĉcœÌħÙíĉ{“{y`ï Fxžì˙‘êŭ§›SƒÀ áÙ´Ĝ‘ƒOVVċZÈÄ÷m4urOR—sr%ŝ˘ĜĉӛbSLwċĉ Ї„2bOñ÷“÷“Vh!‘Ûv3$â^ñ#(14~/:„9b?F‡bPÉóû aPĝÛ ü¤xF).î ÂŞX–Żb>İì›ĞŞú&dG4R’^üetñ›Ŝ”ùìU‘‰d°?0¸\óE\Àë°Àï/‹M>­–ß4ˆÛÜsÀ 4‡³]TÁA^dÖŬEîàсcßS$NènyvMKıáYùbVn§›ù€49@ïwwSÍòvi&m”N“ˆÁîâĤ<MrF+§Sí²dÁ0³/>ħL“Ğaµb¤¨(·)w›yùİÜÖş×;(ÔĜa³ğĥ‰€èa,QRLU¸LZ“½-£ç—ÓŬĵZŭ£L*£ÒkïçıQ†Ô;’ĠƒjĉsŽÈO½#r˙ tŠ ²fÏoWÑ ËjS×1Ŝ!í5PÌ×3ĉ+ÌYdy$Ĥ³â²şŬulĞeíŞĤB6™ÄûÛüPÁÑH´¸K‹>Rn†Ĉ÷áDkċRĤ!žaƒîŻ6ƒ œ)•AB$mír€ícZYŠ&Íí B‘…_/ YÓ[·gÏUzRİĞòóS Ž9Ó}Çĵß'Duġ9³àhBÏZ˜pâi†!ԕ҈#``]RûÀtŞ}l}*˜êéjŞeŞxëžħ—B ˘Êǒí#⟐Âç–Û;55…ĉşîÙbÑdÛ\°\x/Ûfîħlğ'so·”óp—|;žÑß-ċ޵:YáĜħ‚’ğ5ûÔÔ@säD*¸%ÉSDĦċò28aÏċÚÜñÇ&ȰôÓóCjô˙_~˘¤ĤO(”$”M9İ N b˜m8) ×'ġœtĝĊW‹òuJŬlï-M— ëk“/Q…‹AèzSĉ=5Èj\Ïp}£[ЇZ‡”ŻÂ("û5aĊ{Ĉ}öġ"ü!‰’öÈkó>WzÍ\b° î*ĥÛj:/vċĴÏö̆LESN E냚Ĝ鎋1Ĥ]P 9FH>39îÚR#­R@\ž@ÛfHyİúf7ĵ¸1•xq^íƒp½]aş½—îJ'žôĜ%SG*Ȍ>œI'fġ)ïC*ȑži ìŝ9oşàóqŜTêópŜTâ‘óJ°)jÎ{NµŠ{ĈSáĵWRŭObî.“ÚŻê3öò@y•ĉÁ “êUġ#ÒOÏ”żSĠÉŬŬí½5~]L?$ÇÑĤ™(CÉĊlĥA€\VĠ‡|½İvĵ~~8:û˜Ŭá{n§CzqÊñÀJ ½| –?1—SáÇIĴ tĥöñ><£ïxA§Ôc=*ŜH?=ŜҞ‹˙€G9ñ(ñNR…ħ"ÖÜ8M5ç Á8xĊÛ`Ú;^ÚS§Ġ0Y:¤<ÌĞħŽÑ­ê,P˘}=ğ9m‹•YÊAf͸ï0§Ú÷Ŭ‰œ g} )Ħ‡ÀhlJħ‰şy:B]›ċŠhb;mê~˙'š–%Ê@f‰€ÖT\€OuJ x@Ĉĉâ8Vh~œmĈËŜŞn­éü•h§‘á4ñâ&šĊyŭ2ވ?ĞĠ˜ŻânZŬöŽ8…²ŭşoĠn{¨'ġ?^Ġ­ĞùŞıbÙW^z$_ĵˊĠì`ƒá@tÚò´E`â|ôÙĞELÎ)‘½\1âNc!‘ëÖċHYêFmûdôĊ(x”ÚIɎQí‰'Z‡QǒÀ@”µŭ-–E2ñáÍä;l >íTˆ*·A ġ81N•öI˘Jk–˘—NÌjž¤fqşêUj–€ N5 ËĦOUĥßa(ƒîĥG­0EÄŜ^ËÔ9mo‚Xr:ùÉN`Ffż„3l¨‡!ي K)Œ(dU÷²ËĤƒú È•Ĥ§ïŬÜP9ôĤ˜ÔSışüÍ[§ġ–ô›.€Bo^“ŭáÛoéT p›Öf‹ùċ†ÀÏ Ï+Ô|RĥŞìËÄ[rÏÎĈïìu5½]jš*ÊĵšÄYĠ&>ġ÷9¤Ŭ4ûLé8$½Z„<üp*=ó›‡ßĊD°ìÓ%È;í²b(.ñîħ* M áÁÂĞMµlĤĦŜĠ-zó*xnZ-âk›‘ˆìöêj"y@Ú8´:w4şŜž0ŬápŭĠÚìOH‡ì|÷›UÓíùuU]ŸœžÁèéĦŝƒò-<‰iÔħ"~8€µ  X aM$ÓòîˆšuNĈ2yuğX|ĦZgiÍÇÛb1˙Ş.ß6TĉuOs˜àŬ'ïnG)Äz×w40,ŠÌÎ8³u@çŜέ3Ä+g6OîĞ=Ŭabwh‘Ĝ,ê.Evi­ëÏıšŞ6èëjĈĜÖФœ‹yDg rÊÍWŸŞe÷÷z[ŜÎŞ³ú(·Ħí ­dÔbpp#£Ó‡óm”ËEùÜ£€RïÌÌÎD½Ê9áJ˘~í§Ëú‹ :4ˆßÄ3ĝö-u_ŻjìİÏD{GރA†žEsñ ôÓ[Ŝ~ĉÖRn^ }û̟3ú,éàÂç1L…HyS×|u] ĤĜëÙ3ô‚٣ܤÜ1ċl—lj˙ž^"<h…F•Q@<ÚL Ġ­]÷0ĦdtM}ˆzài ^Ċ*߀ôĀGš6'Ż6×çëbˆ>ú„ŒN÷ÓÄŝżëàQÙ!•½F÷ÑSñÍlV..ëB2ߖğ]ıxÙmÎ'ŠŠŽ–Yhn=#èZŭ³Ş1£fŬtŜÓNxğĞ>4ÄÖ*üè_³ĥXendstream endobj 583 0 obj << /Filter /FlateDecode /Length 3060 >> stream xœĠ[ێıü¨Żh „f/YìğzɃMG‰F²%Í:öóİ"ÙM²Gê•ځN˜³Š˙ÍĞŻo`\Ĥ\İrĈT7÷“BĴbJPe˜5”1WŬhÒ£ġ}Û2oĝĜl·³÷MüŠ3r‡à4tŽ,n›ğ4Âí”×´ ŸÛŽìÛhˆ˘żĉh´ŜLog#tŸ:xĵä5_ŻVA0öáÙ!ĠG8ÇS;VSîr˜ÇöċˆÌè¨ûx’úǓcjމ%sʄ@ixĉò³ÉĥßèÌRiXfi³zzôyiZĠ”ç>Ú'CdÁ{V̈‚-ÖR‹l‘ *–½nĤ¸oâB’Ùm, ²ìvç’h:½òwL`”_ëˆ7ÉŬj<ĉÁ[!­oq 80\S#µò8´Ċ]SÁVMkŞÂ&mŞPŬmGƒž@ħŝĴ`}¸ĥŠäk™@š‡A'ËÙv›–ŝDqÜ£ñJë‚`‰İ8~äÚ4Ġ?Şnmë…ĵ?˘Çä>˜fĝíĠÛAYqÌ|kĠZö….‰·z¨†&ŽUß3Ä5şä|µ€7Lf[ûżÜYp[Ájhs.( F*é4Ġ"úŬŸĤWÊWgxÜ^ďħêÚ;—rvÔêƒCZIµ •§Ŭ˜\̖ôU³Ù2Á‚sÚ? Ĥu9ÄWGİÓ!{@'Ħ {Ílħìlf„’ÂQÉ:ìôÀäD(‡N–ê`Ħ¤xÚŬŠYçOžŸʨœL‡Í_{ó# S èİ;ĥ°ċÍċô”q†Ü‡ʗdâ)È|6´P@ñà~^ƒ˘\€´Ä&Ŭú÷-q 9*2âĉ}: ÊVx[–Jm}Ğ ”¨˜GżŜF÷M‚FI‹7íqI8<ùt„ƒ÷aq:ܣ䴑—°:ŽêñûÚ40´‰APËgڄùM¤ç•&VL8ŒĴ¤<]LĤ'‹I6´‡É3ûĞĦ´‚ H=ŒJnhµjhÏs¸G5a4ċ:iĴżúmâBÚÀá?Ğù3m·–Z-˜mż\¸VÖfŸôÁìCUcġâ$;Ĝ£UÍÍ;l}´ƒá­Ŝ˙sò…ÊJWc¤Ĵ¸Ĥ‡ î·A§WÒù#ç›…ÑhŠĠ"\òİ­·¨XBĦ]}_Aiéë~Ü Íĵİ}Iì/t;ĊĝӔh#tŬŬ{Œżċ gàœÌÓÏBœŻ×Ì⟌—? ħ @áëĴeqċ=,@ ‚m ıŭœFĊı0bFĈï2ŻĦ%O=Ïs ceiÉQ;Ü£ôhWç ³xµA#jCŒuĤÀ„ĜĞ%çÊ'ò!*Ót²I%¨µËMÍokf2-İ;Ü£ Ĥ'KŬ€ġÑĜŒé=R×9H6™•$dtD3Zċ–$Ô rnMê´5ñžm; AĥÍnŸÛZĦIŝÁĀÓj_"nıWžžËħí_÷ĞĊWЇä_ĉTRÉ ƒoûèk[ŝj„#`ĵ=mˆßŬŬ5Ë[_+·Â‘§f·k–/ÛHdÈßĤŻiÀ<ħxkĥúïş;ġ€Tĵİ‹ıŜ­˙Jïʒf Ú.a–ĵö7ż~êÎċùûâŭ ÇoÀÛ `ù·6âùß ĥŻ.•†M}Kğg+FQkKž§eĝI~Z†ÇŽ0ö²ĈH\tqĵµĞ0aĠ‘ñżó…ÔÂd‡\żLŝ”/endstream endobj 584 0 obj << /Filter /FlateDecode /Length 2640 >> stream xœċZmÛ¸ŝnäGەۘáûKíÒöŠ^›ğ,ñ}ÚÚ]ŬÙÖF’ğMÑ˙ÛżÑ!%Y¤,+ğ–}ÚäÚ29rfžyfÄOSŒÈÛ˙ġßċfòi"¤@†Òİ"ž‹İÀŒ!"§DsÄ´šĉÉôoÓí#c0e|z÷„“ÛÉw“×ß3 ·CœÁĦ”v‚FÑ1ı_‚#£áé#ĴÄôOYçĴƒAOâ66­˙,7ÓŻAŞùÔ #İœ^ßNŞ]“İH3ާŠ2dÙL>Fż˜Í ĉ0ÖD›¤(âğd6T Œy”ŬÚÏ žĦQùù!™ŭpŭ'ğ=J<áö˘ƒW“è—³ëÖˆ2Ĵe=¤Ü•YžĈkô>ɋl[Me*¸dH&ÁˆKlŞ!£Ç´ĵŻ',µŜšD·i²^Í>XT$e½ "í’BrjċÍíébaĤs*‘Ô˜Trßτ„³:Š‹"ŬŜÍĉ”3†Dñj•–iĥ×ġ3-£8żÛm’mY4xTfö³‰ÊûÄ}°Âà¤ËûlĠ|§Qĵ^gÍ$#˘Uš'Ërŭıj—íòş#ïEµÇFœµ›ûLhwŬڍĜ¸Ĵ?ƒ†Ël[”ùni7UëœnäNëŬ58\3R‚À‘öž "a^Ì(gœğ'Ìp1³)µFÊxĦÂ6ĵ'T$ 1Ä —%>¸%N İĴÛĜPéó[w,•¸üıÁH˜mƒ^n“GOì³%‚ÒFžÀEԊCJÁ`,’ŒÂœ¤³5÷Vĝ%›8]7áĈ˘·­ğ`Äĥ…‘0ĈĊ*x¤ç}ŝ†hĉïíê6Ë~{çh™mFœU†*°bĥ—çù<‡ó{zž8>£óLp¤ésӀĝŝÎ)ï˙rn Üún“:†œOÑŭ93L`×rìŽÏ À÷ĜŜ KPä)X7°‚£Ö°à "Ž ŒAĤ =ì> Ğu€×ÀYc6QŠx“´Çœ†ŒÍ‚Â(¤‰v!ı{XĊe2"Ì läĦĊÙ1°Äu êĈbí轘½:/²Sŝî-ó³a;À˜wx.pgà•B‡éEw!ħútt?>£äBËĥŸ‰îâOGw ğÈÒŬ˙cp·ĵ_L2ÄB™ċŭ>X`N5ì‡UR! "†fs›4:şŻ93ë<‰sWĠÉY"z+ `£ŠZïĊŠèÛ l(o=ÈÉv£BQPŻ mH³çnù-‹ß‰÷K]}¸Ïâڙ5nK„NU@£Û<ÛT€7êĊş)$ˆŠ²ĵWÒMşóÏm‘%Ċ6qEoÁ UHyŒX3•Çg„AÇísê•„@ѧ¤Ö%.–Zá@oÉaj-ĵlòèĉs–EbC)ŭ§+ иU֍û7Fġ’ñÉySÄŞ~Á^l›|N:Ž#ıƒ=” üÍ|tR&Ò/udNfaÌ—@ïï³mò—Ŭĉ&ÉϜĴĞÒÑL9Ĥj·q8½ ċêŠàPċèêŭöŬ¨ Ìw<z!zœĜÖÙĤm ]ŠßH ÜC…gökĈ^ÌüOpBƒTgN´ h:'PĜ¤êríeBŠgA™žr›ÁÉıB·!íÔ2Ù<ÜĤë1µ@żĜ…Ï G.NžWb˜.ćÁÒûÔ­‘ĝUùl [\ĝ‰ŠsŠ„8ÈSÛìħIB Ïh€è&^ŝÔ~sŬÈfàSg6PE•˘.á–Ċ¨ü@í’z(p ‡ŒuNJ%˘8\îeC8OEn PÈ@ĉ˘òs…dɝàe\ŽPuP­@ż;zš–@{•pts/4.ò>Îe˜ìÙ1o˜PŬÍbÖ[ĵ2iĦmà Ìj×£B ¸í(ïûSÀ¤x_*¨\ ?½peZ (~ğ…k•Áß´…k'ŻZdÙgż?OÌĥŒéMË-éĞR B5P•î7D}™ÇŞ”3:çKá@ôúŒ-žR ,1â”ĝ³$?ŠúKç ”úRGB[“t=‘6ëĥÖ ŬŻGénN† *Sċїx>8ôžC…"UpdL>ÏCĈ9$z$H?=Zİħ}‰W5—Ċƒ…}ˆ?Ŝ7ûŬ‡ŻżùĤ~lp¨{FTMh_îž5}1o…žìNñ˙n­LŝÑĵn7Âë§ÑĥĤ½ Q7ûIO–€:3öƒ½M5àx¸u4°ìúxŞêŬñyÌßŜç9ĉÈf£'¤İ#â/ÖH£PÙŻŭ„FÚ]²Mò¸Ĵûhö™ ˔Úi›Frž<äI‘l˸ş(QÍÑ^Ϝ\¨G)°bA•/]$CWı4\í M¸şµçK=Wj¨.%ĝ’ǧ2"w+HÙ4´/p$íèÙaçn{lÚ2]½ iâœçùÒ GĘ@:SMZ|`¸3ŸéPámĵIĵ9cߏ1‰0 ~ġí.ÏÏ£:~ ĦĠ4hΠ*À‚Ö=?ÉŞžŸm˘ Ò@úl 5b`7$éĝŒ0aÀ8a/2ìß(sĜ—HҀôÓIÓÂĉ•çGòC‹WÖ ÒYvħ¨í‹mşjȉ|żêKğ„r vñnd´Û?şsŠ”Û<ŜQ}/ŽÒîñKğ„3XΤ] mÛĥù6ƒË4ŭrŽM·^Ž-zó­éZ,ëĜ–Qvó#0(tŽlL¸'cUħ\Ü]¨­^WTŝb£šŽ˜œ‹Pà….ÁĝKĵ ¸ùİùÁu0E xá­BżWûàRnU˘PŻFŭ5J™}(óŭ5[[;…%J÷&‚ħbZßnhĉöPn“öÎÂÀœğşßkܛ[ż‰·íóxĈE[sĝĠˆ  ^µlq`š+]’ĠU ƒ³ĉ’Âín[ż­ï9N›h1pKM‘Ô5¸Úc•pĴ€9ŽCWçŞAʜ3b_Ásyeŭ™ÈáSŜğ 9³]ó‹{ó5Ĥĥ^éĞüörwµáĦE‡²QÙbM]­ıŸÌ"Áóꚵ­Y8u•Ë<}(]Y§İƒŞjĞ,JËfRô˜íì ·!ÑM²˙xH–鋤úÑĦžŭ{ÔàĦQäUZñôgà2=Gìe÷ÚêP‰6ĉ#ʸĝ¨“9ĉ0˜YiŬˆcŜPĝOISˆ˙ˇHa–JYŜĈ%Ċ#´Ù—™Ĝ6–!Üdmğû²|˜Y{UQñĉġëe^y˜‚¨Ù˘|>›kÇaĜ9s°ŸċwŻâċŒ:R'£Ÿ 7ĵŭŝ½=£Żv·OK ŭ*ri_ŠPĊwĞU²™rá.)ËdŭŞ:¤UôûÀ‚QÒŬÌrˆYPüßYÊ1‘xğj'|(³Ÿœ4£t”zìŝnòFendstream endobj 585 0 obj << /Filter /FlateDecode /Length 2353 >> stream xœµYŬŽÜĥĝ!kċ3Ĵĝ'’A i A$ëi{á5`í gW]4–4Ŝ,żEúŒ}’˘(Íjw£…/v(’ç|ç;?¤ßÏLĉ‰ŭ×ŭŬìg N4§L1ĝÈ$BT Áċĵš½Ÿ·aŜŭÙìç_Żg:'°Naİċ|½›œPżh.V0%)ǒÏ×ûÙÄ0Ċ‹× )QèÏĠŝP˜6ŻJĵxğŝ~öj=ûi–Ìє’ıĈ"ċôDĦ')èBëk³X˙ 6QĊa“Niê6…v$b¸üÇşjĞŻ;żïaeZ`¤#Ùĉ&ğ2‹ÓÔÊEı5moÊĥħß|KQ Ĵab `’C!ü—Ş(²ú‡loš'`1Ip*ÉÖkQteJSç˙Ak†vÇrcß-!] ­yVšmĝ"Q^ĝêIĝ‚.2réħ͋IÜ+.%NE:_‚µ%ĜzŬxħXĴ¨Ô€PVuP”E7oŠĴiLıÄÛĵĵ”yy‘av›ÂZĦCĠ4ùe^äm.ġ_ás^nŠÖUsÜVQÛŜ´×Ġ6Œ)*Ŭ‘ôȞ„ıt_Ħ86QÈ;ĊŒJĈç+ ĜIŞ<ö/V‚&N gĤĜ¨äQÍ0Ӏï8# Qħŝëlŭǧ.ƒ‡$2ċqïÑĥw‡€Ä£Ò4­é7J?‡SH‚Tê‡˘5›:?´U=À*& >fmz*îwiĞŞ0LĦšŸ[S6Àš!65)zVôô’÷폁œ2ĴWs!B5ó‘ü Dàv’hˆ0°I”£cYä7Ĥ¸ó_€É`JÙÂ(ÑîpÛëĴm­MœÌ›°MĦ,ÈÔèĜ˜zĠ§78VWğn9áàlÓz …¨1À\Ĥœ:ġ@‚ĴWÏPUö´“>fñ³>*½²‹JKQFü֐ĴT9D"˜1ċ:²‘*›iˆ ;R¨ıöqĴÌAöÎnLX q\›ÙšrİÀ·m†™§“~8֐}?”Oİ—wö7wĠ‘_•Ën’¤¨É;é1ŭös}6ràXçWĦMVĈeYq›Ŭġúşìċċ‡ê wÌ;q’`˜)ꝴÍÁL{´„qwÔBŭ?èì!ê§.k…~Aż +şÍÛëàMàkıíœ$ħSùçµC „IÌĦv@Ĵ½ı#œ­¨^i_PЉ4!˜Ĥb(›1Q‡@(ÔP%äH,ĜT [ywĥ–ĝ}Ça:żh•J2GI[ˆo@ ġ=2ŭ­KqOfZcMѲCJlEĴnóò*À…ÚQ§HYYqÌZ “(Ĝşü<~6?CÜ563OR—HĴĦrşó2–àĴ˙m‹Û‡ĵʽK’rħ.Iú$Î<Ĝ ŠLmÚ:‡ô+ç`—ûÓĈÍ$ƒBoZßÌQ'$ˆï&~İmĠâ.Yú€ ßdD"¨§Ö—иĦ4·¨=Bħʳ˙hêĤ²‰ÊMƒżÌ>ˋ8|~tĥĞŞ何èžu ÔIR›´üñ=ŝÜË]àû”Ü÷SĠŝ7;²ĵĥeÜk×E°fDGşċR§ Û{fħ"X&Œó) )°YSċ*'´T§í$ ]Êv€XŬF†ûŻ|;‰SR€ÉÌ/a=\;H˘§`J,hŞEXĵ ˆN’d i­ğž³k9­Ï™;C<|QíÖ¸‘íÏsgK8ü]]íä`ß=šĝħw'ĦżËòŞ9^^ (âìÍWoÏ!PÏÌ[Ĉm'ŠáváşnÈ.àÍ µ9ÔyÙîĵxÏ­³Ûhġ›ÍۈꋨéEuù‰|ğŒ{œâ;ħĴqž!~G·žÁĤŽŸc–0B;–‚à‰›ïŠ¤˜Zı úKÙ]ÖƒŬĉğ´‡ëyáÒ´·Ĉ”1/\\´·í/6Ò>7tċ8ġhQ^~ Fğ‚ċE“19l0‘ öçÏĊ§ĉŜ½M,;ÉÇéÈs–WĈéËÊöIÁe›Ìß>ƒA##‚špgúw_!rŽ•Ĝöq“Aß'öšŭw§Â™ç· KŠù·Ÿ˘çµ3aúÚóÀĞÔš êĈ‚$áö‚Ŝ·1Öç5ÙÍíçö :8fÙħ}ĝVÁâO½|9ù¨ VÑĜùTSg­IQ.Ùm† ŭ í²<ÏeMlއг"ï§´}ü™îĦ9ô}œw(cšË%N$Û%§D˘œKâq{%b@$ÉS8ĞOĜáˆùC•½ Dŝ¤Ui‚?),ÑdÈĦ‡U|6‡ÇÀ`wk„tá<ò"0-S&8ád$Ô³ċÉëŭ´<¸AJFÇ éÄii\c ŞÎQ˙à†ñYi ”`ä$֟ ġ‡…ö)% "ċż#ÒÙ<ĊDHíšH{*Ü×§ä)İ}ÚnMqıpp ‚Ñ´­)ÜËħt7ċoœÛË94X ğĈĦeċ*÷‚a×hnÓvƒFŻÛêĈ‰ÓB!÷É$jż4.ˆB?òĞÒêc#֘_xp|ÏEŠSÒÊ÷ÜeŞ1Ğ­'ì—BwÈ)„,ƒhBÓI§€XšÊ~í²ÄH5P@ş§2·„Éžx?Íŝ $›mendstream endobj 586 0 obj << /Filter /FlateDecode /Length 1715 >> stream xœµWÍnÜ6/ú{ä1-Š"%è!IÓA›&ö=Ô=h%­X7’v]}–^_£3üя;MbZ‰œáÌ73ß ?Ĵ#ÊÖŝü³hVTóŒGžĈB(ĝ#3!’tŬ]Ż>Ĵ˜XûGÑĴ_lWç öħˆ !“ġvżrêĜZHÊN„Ĥ°Ĵ~%’nÎDǰ”ĵ­óĥߜĊiF£H’ŭ†)Ş2)‰ékJ•JÈŝ8;v ÒéZç½î7żm_Ż^mWïVÑú $[+ fĊhWĠÛ˘”fwĈ½íÌ` Si ÷’Çŭ^whd6G)ıÉOÚ/gŠäa“F7y[ġMXċdoŭ°ëhwc† ~:SèÒı†[bRäuŬé”\‘‹·/Ż6nY)I†›|Ë1İúékf ÷z*9öş´/dwo;żˆ³Q2–óH%I„&Ïá€@`³}˙$”IĦr‰ċ³`„ ğ0áp7 Éï',MĞ­‰ d–1’J,ɜŜÒÉ$  &C~kĠIh”§ĵòkûI³·OPžv/c†[QäІ޽vïQäBŠú ótÁŒùt›!ƒŬ÷á< ŝĊ´Öëî{Yä|}6éÍÛ2¨LHQWş‚=))LİgÖôÁ=DŸMK@ğ|W[W$Ùċ.ÔÖCÓkLĝî€Ċ?64S>`ûc[ •ióşPİT6ëŠ;6jz,‹—4Íâı^raqx$…‚= J. :äĊ-€ „ÁÁ+DàıóĈ0ÊAşjùŜ˜ëZÏIL ,‘ ü=fYœ1*™X¸t …‰}>û­<’4éÒ_—ĦŽM<˕6ŜÜĈÛ§° ‹€ ›3bv§Êƒ4ä`úÚU6Œ§ğcÌÈKÓ]U Ñî'5wĉX—á„”ì|9>H™”QĊ}-6Ĥ3cÎA~ĤxùdSATf4×°´èD_ŭ>èĥ÷Xj[qLĥÖíÄUs¨u•â k·jƒĴš‘•_Í|™=%A7žpigËIÛbÊ\zêdömĤ‹“A÷ƒ 5•ÏŽÙrğ‚`D7ò÷<íWŠcׁ?ġŭGaN€RÔSžî ˆ—Ğoe…+ ş¸-³ tŞ[= l˜Ŭĵ,+WÙa[ >çˆhšĴ䴔Ĥ8"Ú9ʅcĊä \Ğuémò­Î.ÄOˆ-ä˙1YÈ8˘pރ)Ï 7L@ĉÜĥfcÙ³–gĥ#AÈÑı/š!lÊ<°"⌝—PއÑ߃,sşPhOR`ò°‰ğŽvĜŸÉÀ€A2ñ!lžŒÏmnı0Á˙lİc:,YXóóXR°Î#Ŭëü”ŒĈç€p!€u—€S°“Jʐ×Á³& &’ġ™àŒ2¸rmKp: ‰Ág{y²˜Ħk¸çÏ,Ÿ ŭBéȽ”)(s¸:Túš½†ĈNq úc˙ġùy7)‰RThwĥ9³÷ ÌkjşësHÑMlÇ0I0Wż™èċ_ĥú™˜HAE&–&*K]ïܔĵ‚#—ğ6ĵßm §¨Fnƒفôo"–úœ.skµİ4#ÚO…ÖàwĞáíCßendstream endobj 587 0 obj << /Filter /FlateDecode /Length 254 >> stream xœ]‘Anƒ0E÷>…o€ĦI$4›t“EĞŞíˆ"1–C½}˙ I]ĵ‘ĜšÏ§:ž^Oi^}ġQ–ĝ%ĞŸĉ4ı-÷ĊŸċ2'W7~œú0›ñ:dW߆üŭ“Ċ€L›żWİ>ğfgêíR\Fıċ!JÒE\÷ÓÄNÒĝïUŬn7ÎÓhóÂF˜Pa*vÇF˜ïj6BÀ„ĥl@[UbJŞ6 ĠÈ4ŞbIg‹:]ÔMl@‘𧆍0ĦH’4$!Y*ÒT„d1Hcž èŜ*x~ĞĥĦ½>kôñ^ФĠÊ·rµÓ9Éß˙ÉKÖ[¸_<€óendstream endobj 588 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1980 >> stream xœmU{PSgżr½*[)×H˜¨›™îşP­ÊV;VEħl}LĊ×,!$^1 QrCÈÉ[ /yI!DAñĠÇLwÇÙZ•‚Ó êîşÓNǝv·ŭîÌíûŬħû¸sçŜ™ß÷}çüÎ9żs>E‚„wwïÖiuïVħ.e›N£Ĝ[ Q—é ùUĴDÀ.bWDWÁ~Ë"!ÄFClÌGˏGĥWQÉ”GD ‡J ÛuĠċjŞRş~Ŭş ))ĝğYZP-Ŭ–*͖ɋu†ŠbµTĤUH³Sw§J÷è TK“tZiAĦJĤ)’ꊤ9…‡öïxoż4ë½½öíONŭ˙ä^˘A,ÑêÊ+*ġ²ŞB:G“úAì%öû‰âqĜF!vğˆl"ĜM,!bˆ86ŝ ? j£’˘Ĉ£7E˙!FsOx›Ì&ï,x}Ájy…ítqfÇLü!”z?”@›Ĝö È,µUEŞÈ1¤íĝçÑÉ͐¸>¨,­˘èğŭsĞB’IVĥ‰Q2Ê!k;Pcd.wQ¨âA+SÑZ²†lî1wPÇT‘h³ŝĠ³ĥéÀUÉ5”Ÿ>Hѧ–à“%á“Ö|2™lŸ¤0If}:#`H+êAô–çœĝ7:IÏÑÇıW£hà_á·ŬˆĤŜòˆjÓ²vdAäŬk{⛽wó܆{ëŜ¤ĉ"ĥÏò1£4o{](rö4^ŬïžÚ=‡>1-s›[ċ)IgTCI“Y…sQdò[ğ$÷qf’Ġ<[%S„1ÌÖCvFâÔÚŞú مH!ç{rç/ˆpPtFEÙês’spÓ5 É=£›‰€?H9“@ïbĞ2QÇŬ[ìJî—ğ˽Î^Š–ö:}%tĈ—Ra­´À„ pġ9{½_`˘]‡_%ÑéÓLƒ˘CĜ;}‹Ke£ĴIùÎĴî²éËzÓQF­(Ŭ ùp¤ĊxżİÇÒŞ0W4VPtsMŠŞQ;‰-]#šM€ÒàÚÓ37"\ŻàlÉC;B™!ĉn IS­SŽgż*1\ż]¸u^M~k'Ŝúô+²;q"éO… ñüíJÛßç¨ìäOç³íDî1­­(%ù şícZÈв$˘Ê^•Ǹ\!ŬŭV]†Q+ɇßċŸDíb÷./P˙£a9g>‘t§ û Âxs°‡Żœl¸ì]à·ıƒó$…Iôñ$t¸äZ¨s˜£H&n’?áVÁQxÍr2QwWàĴZÎ\Ĥ`ÄÑ~ûRù>f%·­‘[z°f E3ë?Íú—$7=ûħ·Ò³Wš‚’è³cés›˙!²TYŞ”µxcR ’86蜙œBË\ԋ°6iÚS‘kP2ZŠV¸ù†yQŽiíx#Éa-›K|Ĥ>뎷Ċy_ġÚş<ĦDW@ÙQ šp>ÂM Ÿp+¸_rɸŻñÂÏş“ŒTÖ5\.³=~.ŝ,İĴİš1—$2ÊA€xǜóˆ€N#Ĥy‘"÷¨Êf=œjĴ×ëòŽ4”.Ĝ{™™Ĥ(Ù=à™<‹yÎ% ܂U.î8·äñŻÑ2@ËáóŻç¨Ŭh•ˆcȁÏo^ŭ#\…ôy?\Ċ4Jıa횎o›ÚŝÈ÷eÌ*§O%Ŝ vŠ]&rġ×ör­‡55Ŝ’ö|X iéµ™‚ĉâVÉ£ŜĴ3kܕžş­yĈwšŒTíĈo~‡S4aäŭS·|O(:?}áÔ'ıŝzOaÏ@íÄÉћë;M^{8ìn‡ç†Ħ“A|Œ#†§ÓmÏ\~ˀñ\ğ§ÍáµğÊzL^8 C>×(Ċq„¨ápž<Í3כ?rñ\‡aYC.uû^d*ĜŞ\ k!{Ì3áhoġŸïì÷5Ŭ0§G#œLŸ×Áï‘0YCDjh{È*ĉU‘2×#ĵêı•á2›UĤ˘!V߅G5?(Ì4ŠŜrˆmı†÷C1hËÍĤ¸ğü<œ‡Á~÷ù9çĴŒżC„LĦôsì[Ċŝ™5ŠZïG\ŝô*Yġ§E}Ĥ¸Qo)çGXż³×3)ĈJĦ]é?Ʉù˙5Sß&iӜÊ"×Q>Ig?`eB$$MÌYIœ3ó’Zìŝ.[:‹q‹É‡lí‹ĜSIúñ‹;j0ĴċĊ$ï[ô³yx:"ñ°m´B€ùBä™ùU ƒcj³Ú$÷kp FFqñžîh,ŠŸEë ĥċ‰Ü {P9dĊ /’>·{ĈŬ uä÷N–zĞ!Q ġÇ,uĊ\´ĝMr%h<ÖX§Á`YVĤÀ$oòġYÄĊ ċ<ĜÄÈMV ’j.ĈjhÔû ŭ€Ö§oĊˆgñĝûodáOÇĉ™ ¸×Ñoò·ašŻ½ì&/ÚäuzəEĦĊ+Ċäèb^ëuÚĝÇĠċtÇĈŜ³Ûm›­ÓŜlsĊŝ‚ ŝ t”dendstream endobj 589 0 obj << /Filter /FlateDecode /Length 1160 >> stream xœíWËrÛ6Ŭó+0Ó.ÀN„àâqğñŒûH“8ħ5Í"΂‘hG­DÙ5­§í÷ö7zA‘"%Q’ey‘……(òâ܃û:àá ßêw0‰î"-€q'ˆċJ0­ˆĉR20DrAò”| Yę·ÊpOnöXG×Ñûèċ…EnfÓ>sĈu0v ŸInÑ֊y‡w˙D?M<ŸöùıD?éÜEPnˆT?ƒ 9í#áñÌaH˙:ZìˆVLjb…d !û“ˆÓÙ î˙ġ ӆke1>Rsî^pàċU~¨/‡hȵíìû^ê`îŜ0rݘÓ|”ŒÙğ4ŸM³xĝ̸ŠSŜ—Iqc‹ÑS°xµÇ­CÑŝĥ˜^ù(ğ9‚/(Ʉ1k„ŻâĞx Út‹òÚö–u Ŝâ*huŒçBŞVÇl_QvͲYÎ0Ŭ4 Ú&}G³XŬj”—%üá`Bc 1é7q¸BSO'él–ܤqO Í8W´Ş?üìĵĤǟúŻ" £×H˙uÔ˙ĜLĜQ_ĤYúv>ùœĉġM[ĦTKq¤”óôn>ÊÓaešÎy_:ϖ0ῤ?T—(œtANo‹Ñ4KĈ $[ë,Vòëßß.)Z4˙`Ċ‰h.?Óëd>.ä–ŬÏçoÎ>4‘2²#R˙î‰dŠğmXĴ ^LwߜŸŝòúĴ Y‹ï QàÚıÙîˆ~8żĝµ;6+ĉ]›ô›|@ΓIw2àdO7ħGY!—9”t4ĴŬˆŭ;Ù,uĤé$ô˘ìDÌÓÛ4)Úüş‹ómğꝣ·áf§Ġé'ŭĞH³’ŸĠ\-ĊGu½ ZL›8€÷+ ġ`X$r}RVµ&Cég‹í+Ö&Ñx6h J°™ŸNâ+ÀC4u‡‡£5U $ĉċé4µ ĝtšÚFMfl%ɓA…u„b¸4k„׊xSb‰A&ċ•ËÉ8ÒĝYıèK´Emñ1sÂ5éÔĝV*7Ï`-ğEÁhíneàÖË&Mŭ€ñ ܂žbBuÜİW­Ê‚##|Ç~}~}~íTċ—€y3 ´ġĦzad*/À“ž´ĦWq ħ}Άtü9@=§E‘Ž_ kñŽ?Ĉ -²Ï`1ŒIößt4Ğlp—I6ĴxzYL˙(áĵv4ßÇ=e-8zñ.ŸÓÓùu0Ċy@ŬdÁv0H ú§&†Ò’ĵÂİe,€’ñĞ$‹‡ZwtžäĦŭM9z_‘°žĵ¨Ŭx*¸0AAXaĴX£oœëqQ> stream xœÍV]oâF}÷ŻÑğ*|ùcVêC˘ş)+BxUUU…<$llLŒiµÚĉ÷îßĜ;ÌbŞVŞx`°Ï9çŜ;—ó‚ĤˆèÏö{–/†íĜÈq%JŠ•Ë…bXR[kDl<ż˘A°”„qu–Œéט2ŠlÂ9Ĥrxa£LsŜè9ôş8cÁĞx;ÀğXz€ô Öô/8ʵÑÍÑ1Éî pĜašĤ-%&^“2*6&@†íƒy@ÛŻY‚ É<$–sP07Ŝ’$=ìq;3àn $ĈïĉwV—`i.D½³ş6Ó´…Ù £(SëġCš>U–ĉiÇú#xoPŠmS ŒàûÚĞpö>íacBm³“oò4[„ñ[è>Ŭ?Í?­T™ŸĞPF §unÜìŒTĥN—BŻ*£ĉ Gû¨Ï{¸p+p¨êqàŭğF|Ü$*+uaÒ&T>¨¸ÜOÚĉàêÚLÇŝŭ‡ŝĜ˙İ)B'˘B ĝmäO'Á¸?ĵiÊÉkò"ġµêRżˆÚig˙öŝ0àìŒô ßJşJÂEÜN=oŻŝnôï†Wƒ˙}ċWOé²e‹KŠ?òŻ‚öĊżġ'“Ğ˙„Ôjä´*@şf—cżÍ <Ҋ†ùSCĴžÛñ£ÖıŠŞƒŠ¸ġAu*—G'àKµĊĤOgÇséPHíì˘š‡Ôñĝ+ÚßÙ2˘]זR_˙-ŭúĜ‹Ġ³u˙ĥúĤ;û-ġŝí)lË6 vêöˆÔ<ÜÄùôÏ0Ŝl˙dÍÎ/w·~cc›Żg î^+t.hĝ# %şà~aıoïû˙ₓ3SŻħ˙ ż£œı½1…Š8˜Ú`FÁŸu™‹‰ ê Š…ô<D†É…|ÔXPğÇRŽ=Fµ£Ó˜ż5Ä 7H0—`X8Âà³Óñ`ÓÒ LÁ#î`î‚ġ, âSžŻ,m•= 3oŭכeĠú\× —8ëZ]ݰÒÜ—ĝQÍrœf=0ƒӝ$SğÂÇ#í!Ż7ó" [֗Rڏ{v˘E*~°(TcĉFċıŠ€Nvµw͟-pÒÒµı™YşÈDz@üKşXo1pÛe´˜äésħ›t=SĊŸö„ïŻ„ûendstream endobj 591 0 obj << /Filter /FlateDecode /Length 1804 >> stream xœĠZÛnÛF}ú Z­wöúN˘‰­˘v(-+ħ%‡˘Ûè˙ö7:ˋ´K‹ EÊ …ğ3³3gÏ.ġ)˘"êŝÊ×ùŭèÓH*I,c‘Ɉ´‘¤œPX VĜ(M˘ß£ġˆĞ…˘6Zv˜1ş½]pÑr›ûàDp7ÁıĈñ†à%°ŠX^9ÄüòOô¤p„…èç.ž.ÑSĤ(]˘'(Ŝ—/óûèċaFD–XĊT4½‹Ç8 1œ™H34NE4½ĊóÍ:›­ÖĞġò]öù!O?ŒÎ§ı‹c­ׄ™úuœ=f›t5ğ#Ż“tğY{ö{-ħĵ.“‚fLFe`oµ¸ïLîñ˘ ċİ}MŒ Üh/–2.<ĵ4ÏÈñ²ƒ ŽÂù'Ĉô h遤Ċüen6”ÑD1íq=ž8ĜĈ‹d;OWXÌñD2 ÉêĝĤĝ ,ÎÑóvú‹k,³½L£ĝ—Ùz’0Nİ)‡€LŬĤ6DHĜĴWKMD½ƒdKw7ϨUKà—Ç·t‹ùĠ’hİ=q§UíìğÒi °ÀöV‹ÁQ"OZZ}q:Nc\d`ŝ:>LÔ˘ëŬÈÛèĦqF pAĈާ‡fóšüéáì°ŽšXÜ ™0ވÀ„M˜ÁfuŻbF“H0jJ eOo“ñ„Ħ9\Ájû.ƒ[ ñ_Y²Ŝ{qâû$ğŬ,HıDP.İ+–ˆ­„7­"góÀ"cVĠŻ‹2zß"–X¸r"îÂı‹ĊĉÉN“ì1]o‹àĴeñôâ·óò“ÑñêĤzoìvU3,ŝ*ı[ìgíhÏÖyˆw‘Ğ­ġ”&‡Ûv˜çVYĠ<#ì‡ĵŞ=î"0yÈ·ĊĊ ô”óB JĞU/[2@ŭ§}ÓWÈ•ƒ7,<­Ž À%ϊĝ Ş`w5Òq2Ü<#D$B"{·x8¨`÷b´¸<ĊÌk閺7ù̒B·ŭö—0ˆe5'–B˙—Ê(ĴĴ9‚ĊšgÔ0B•OúŽaħóŭYÌíġÓ³Ŭ€ÄäĦô îc.îR›g„éÁq(bU–jñ?CîTC²ç”ž‡S¨ ÏÜ饇ĈċŽÁ3Ù $@È [°yF cîɜÖÇĥ`‹ùC›ĈtêÁ#„ŝ—JoĦ{%6ž?<ĵóäxëÑJı;Uh“ÊA;4…ˆQj˙MñSı"Ĉ‚IŠŠU!|‹‰ÂzËâ­F×Ħp`7­IŻÈF½blg½bĥˆ=ĉw*Í3Bà[Ĥˆ†>żOiñp½ˆT‡íü÷)~úr u'ĝÊ7ûĵÏRŞí‘żŽAdn1Œ… 8,QŠJBáĤÈç"#֙"ğNU紂ÉDĠ‹Ü î§$Puíßŝ­‚p+­UĝF %0–„ÔŒV…ˆêÎApğ¨Xħ€Û,{;ÜÀŝŜ~v6OóóPd˘xĥ&éd<19­óĝ!Ŭ|Hĉ٤˳‡Ù|Ì•Yœ-“.^§›lóòñĈ/Üħ! Dĥ42 ñ|ħHîŜÁĉÌĝ˜dYr÷]E•:~5F³Zò8;–ĤÖ`à˙lŠM·;“ĝyħŸp™m>ĉÖĴ6qr÷y›Ñż˙O{endstream endobj 592 0 obj << /Filter /FlateDecode /Length 1905 >> stream xœÍZKoÛF ŭDÚ ˆ7û~cÔ ZäĜJ{ˆƒ€ĥh[­,Ù•Â@ŝo˙FgùÒ.CR%E˘×·3³ß,óL#âŝ•Ÿ×÷£Ç‘d"M•‚E’pŽİЍ6˜Iôg´l-a\D·;HŒnFFŻÎ9…ċ+gƒ,­àĜr'+ED ÇĊʄÀÖÀ·˙€--£·ğĜı;\zÑ<°¨ü¸N'à3"²Ĝ*Ĥ˘ÉͨˆšFR`.#Í–DD“ûÑ'ôóĝ„K-úD?O$“˜†èĝóä÷ÑÙìl Rà&ĉtĜ éA…owÈĦŞ‚uĥAÈ*Ĝ÷)XaİR…‹ÜÂŝ)c°ÒÊ„²uĥLgñżOÒĠr1žüU€RhK÷ŬÊ6$4ñ‹§t}}³éÁ^ ƒ…ĠĦ—×_²§‡äo­Ä2T{‰.ǵF/ӄVX˜ú”÷e·D#ӄĉXŠ}kħGŭà4“ µS:§ [ŞıSñ›Jԍ ‹)Ì´.”1hà5@¨D“ğd| TkšÇWÉÜŭ)à7î“ìn9Ċµ! K}ÇyL †&Sû6ÉV…¸™*Ŭ³Ŝ¨t ZŜ¸gGqġhÑOÉ|ZÊÀ˘K´|ÈfËE<Y.ĦÉz–&ӗ›uË´òĠŭüÄY2½Cp\[P+òà çÛáDcáŠnƒQé0$^3bZÁa=Ó!ĥZ•<ÊÖébUİ*\+}¨² , `q.;kŞħ“Ÿ1VXÛ ĉm ĉ°n ıL¨‡˜nAŒ2túT.†Ô˜&7ñzžU ͲÊáGWĴŽ+oZĴïŻ’´rD Żñ|xŽ]­sE ħMĥ˘ë(úw ׂûx x…WY:[Üví\…0prZ‚§·ëûdQ‡GÑuĵ(]„²¸*²ˆ6ĥ*€ĞróÒċ×Ù4q[ġï68[şg[U~or˜JĴïÖ÷ı•aQ0ŝF0`ŭı‹Ñšıњœ£µv‹lġš·Êï(ïŸŻ7ŬÔÚsUù`Ó’[YZ.òm´LA ŻË‰½žVóéƒyó\>ż°"÷ÊQD£ÙÍf,ÉîfĠ:ŽÊA´”Şћ‘ĵuPáî@#÷Ëoçú:p·D˜r\ÂVKŒî|cĜcá`ÂĊ%ì•äE[ 7jhr£‹§ù“kCÍyß5üz ŻMÈ!ŭhNĦ÷ï ïa‡FĠ–6P„¸11ôŜŝu 4’†jZ^{Çöĥ>Ġ­|h›âŒC£ŭmêÍëwgmè0Ş™À}×Ŭ!>ÌP‹é˘êħ0$fyçÏÉj|Ç`5ħšÀËt•jŜUw\Ċ3E"z8t³;ı&`˘´ÍZÜz›­}pžÁ#;cQ0ĵê€(>˘PÜۖßħ…((,íDÁĝ<Ħ4ÑĊ8ŭĦDĦĤ•(@§‘˜ñ=ˆB·D˜g°Ža-ô´ ÀkĜĞš(lvê@˘àiŝDÁäD!~;Q îŬŒ•{t§n‰FÚ(0,ÔíİGŭŝD8$uÊ˳ Ĥ6b-шi–ß1î_WŬcÄÖÌ>'WMƒ+ĝúŽÇ/ÓX*àĞîà –)ĝċĜ-f›d—ûĥ {´Í4 G(ĠlÇj܋,ˆn²Pż1-ɂÜB$VLï@ü[…ÚĈ˙áVĦrf ĤRÛFâŜÎŒ\B·ċĥël:MĉWc˜aĴá­“,KòWċZçŽĵ ÈM9JÇn…}‹˙. :Ħ/Ĥ•€EÙòï\•%ó§ñ‰štŝ>]fËÓġMuËCѳۅ³A9uñ­rŬ½E]Ra+$c÷_4ˆ2h§.@›0èİt  ôeeĈ"ĜĠ ¨eŞşHúVîa`ꊣXÀd]½F˙ÙglGendstream endobj 593 0 obj << /Filter /FlateDecode /Length 1787 >> stream xœĠZ]oÛ6}7ö#„Àd`aÄorÀV 0 C›xĜC[nĴ$n;³ċ ö÷7v(É1İH²,+CjÇĵç^’÷Rŝ3J÷Żü˙ú~ôçH*I,c‘Ĥ’i#™pN¨Š¨Ä ­Óèh9JˆĠB%6şí1ş½_p*˘ÛMžƒÁ]€Kñ†à#jħ|—@kÇż‘Ia„ÑÏ]2]"S>§h}‹L´x]ŝw}½š fDd‰ULE“›Q1yÔaˆáÌDš<Ñä~Ï7WЇlZNÉçÑëI,2ŠpäqĥÍVëùtAŜĤëÍjéá÷*Ÿ% I$’ĵ<Ħh–HÂLˆ7Ÿ}?Bî{EŠÜŜ~hl(ċ^ŻĜ„qáġJsDŜ+-˘L˘‰Ú·ˆá.êi‹héµG ĝeŜ§+”QÄhê–á}üíĝŒ&ƒmüž~ŸI&I’°ĝÍOż^œüòd…„äDĞ#ĜÔQY!!)aş‹Z2œ°L`Ĥ¸ë–œr† SœÒàT ħİ ĉ³“ĞšĠ!êËad„QI´ô‡¸ž‘”+##*ŭFC´9–’Íè'ôdĠە’çTÉHK5wpgŒc‘áŒĦħ”Ĉ‚ÎÄÔ+ §¨”Ċ“ğtŒ1ol|7Ŭ\Íқév‘]ŭ5Ĥ.!ÓñtħÍÇh·÷ñ}šŬ­fä1+Ċ$¤,Ÿ6c—-‡Ĉî=™İ!B™rL1O”G„°à4’!ïË \E6_…ušm×ËM1 TO.~]36žßì_gwóŬ8#âoÒĊl˙J)1İŒ§ğ—qYŬŝ£ĵLR'„Rڄ0z„6G„)Ñ›xĵĥdÀNH]*gkíVö–/LUúĝ› Nħĥ2Hr’İàŠ(àĝxoïVËô·íŭ§t}rıV6\ħÖĉċÁe_ÒZÁ•Ìm .ħ-‚ÛQék&`ÄXEpĊ!Ċmïݏ’ƒ>œ·+n.-5ԇĜÂByĥ ŽJÙBŭĉˆp‰0Ná1ß5mĉ·$€ùà܈gc˙lÌ÷“ Á|opĉVlÁ|n™—YË}! ü˜OsDħ%̽=–ú-èŭİ/%<é|ŝ9`ĥ”ïµT“×Úû,†Oq =Ĉgq4„f|–ċ ƒ&KCB³MVVLĈ}*LRŝ6^ŬÔÙ*ç½jM”p în˘š#* —@áèa˘Z2 !è‰S‡câ`2Ê ŭìáeԁcÍü$')Syôñ†”QÍÁ3\ı`‚D'úxŠ+ğkŽ:Úĥ5WĈgc:´ĥ ÷×Q‘£UGië9N#OÍ•ċá\Éz¨– °Ŝ+О…ġ>ö³ħŜO2ë}ĵg`ŭ`ċ–Ĵ÷ñZüÜÖŭ:ò9"llŒĦĝ‘ĵoA?÷‰$Š8:½xq´yÒMĉé>ŬlĤcäRŞĝÖeÄߍŽÓ+§Àċ@&¸(èĤĠǸ¨<ïm™¤ĈDa‘ï~Qx¨{w!ĊâŭLÜeUó5Ök˜­½ÁŞÀ‰ \£˙ÂÑ2'_Í•† ˘U=üWK†”˜áDQÜ´>ÙßŜ:L‰DgyÈÏHĴx„ċċ8M… U÷àœ׋W•ñq&3şMÔ#*=BĦÔ?Úüéâ!Uk†ïŻjÌÌjTm–n×óìĤ7”du|Sĵ)”.ïžBq8£~ B€K1ùNo°İżEjN0€íÂ9„[UX`Kû*) ‘MT€;¸ërB#- ’œ$˙v‹ñoÈŻ{ /ġ`ċ2‰£ ñöW^à"ÄU*µ-TÜÖpügŠ:a9}™Úñ–{c)Ç:Ŭ9ëâH%-P B ÔĠ² ]Ë xÊÄ]z+¤ú.ËĈî+ÈDǛÎÏŻ×…‚i “ġÙĝÌä_Q<~XŻ>§×Y­oÏĤ×ù•=hÁ×éo×Ğlġj{³'uÛÊ֗(@9idXâëÙ,]|ʈÙĤY–./à°ûf,„;óxíÎÂ6ħ…˙ğ* cĴÄûÙ>à2[})~ÖĦMœ.î ~7úÂÎïĝendstream endobj 594 0 obj << /Filter /FlateDecode /Length 3564 >> stream xœÍ[ínÇüSèC݁,kğó=c ’¨iÓvl5ùa-­$Ĥ)“”}–^_£çÎìÌÎP$EÑP†İċ̝;÷œı³WïMÍ ŭíŝ?ğ>z¤8ЈiŒ&·íÂĞ|rJĞ'ı°^ ijm•’°éf[2Œ³µq†Öl´&Ğ-Ҏ׆sòšħ 4dQQ´Ó!>ËEÛsĤaI–›š‘Ħ9ĞuĤç`™&[)-ùŠ6D1ü+Ô9½jŻkĵ2g“ÑbÑáǭͤ€”ށáÁä'€ùë^Ao˙rU­kĊ ‹ö/şEĴŞFÓ¸`ġ*|j˜Ğ>ÎG77휀ÙLwşt#u5šÏn§çQŠ­–Aoĉ'uĉıL8PŠG€qk xö1Ì+ugŞĥ‰‡Au ëŒ*q¸ÍlZ]Îf—“öùó›ùl9{w{ñüùŭöÊPÒ §x.ħĤ)Ĵç”ùµ%W ;‡G˘1Ĵ½›´˙Éy; –Ĝ6—†èV´ Š8•/Yħ†tz £@‡sHŝ²ĜC`ü;œĈcnpUd˙C#Şëvy5;OßJLĝ´=§Ÿ-à‰Â—ÜOD.`SP‡ħ‰l@'YΆ:í\#XÀ%3Aç¨àOm×pQŠĜLàŽ1ş*]3Aé‰Ö˘6ڏÚĉbp¨œ1ı%™‚û·$ÓĠ²éÎôb2[…8ZÈjÒ+¸GŻ7pÂJ*E!<Ş{R`%< ÉÁ’x²VÈWšh„|Λ_·ëÇ=Yd1™ĝnŒVÍ. TşÏĥ ħÒacU—g”öI›Ê,7•ì#ËhžÛ§{RĜ‡K];•ÛGà‰²{ˆ:œ]ŽüÎçyq;™ü²ÉH’ĈħĥhìïdƒĞêŭíh2~Üž€)‡1]ÚooÌ~żÉvgÍċĤ  Ë1ÉjÎsËqÙ új1ä-,„ÂeJ ·Qk7›\·‹Ċè2腧Cúñޝ·ÑÎv›9£ôñ"EnÁb îÚ:Y(³~²P²µçÉŬ=ı/J`}†!7¤Ġž{ş‘µ•*ĉ ĥña¸"·Cd'mO,‡4UÎV_gA$ 0Ĥ·kc}ÌYDC°êÂ;2gd5‹ŜĥQ™‹e8ĤˆÚZːİɚ£Ù”‹}iĜĦÉż–=hgaad)—ġĈ‡§è”ĤlĤ0Ñ+=ñĈç΢Ò|wŬ?ÑXÀȽB´§ …š –™ÌX*: ĵZ´gÁ°Ì˘6ÈêĴĠ8Ħ3ŬғL·´Oe4}—í³{RŽBŝÈbTxRXCÂ' [C‘ğp{idŻĈF=U£ĵòGz´¨'Ċ2Ë'˜³Š5V稯 ċ ùҋŠĵDÊBû7Ġĵ]ŜÇ}A)Şx>P\ŽúäÎû´ƒ²Ë<ép!™àuBċ½ჲ$ÂħÑ íâÑôĵqy?ƒ´^„úSVġ*&bôä쉑È"È\"§O7oˆ@µ‚HHDÈö€?gW£ùèlr2ĈuĠÎ?ĦÚʧ~ċÀ'q>ċÛĦ½tŝȞuéjÀgŜŜÌÛE;]Ž2O ^dg¤ón$K/SĤZ‚˜àY…µ‘û`œƒèçm÷ˆ@„)„HƒÊÈġÙëċ|<½|$Öñ€ÉCE>:\é,­]RdëŞ&B³Š‘qġhÀÓ´ë‹Ê:ÓŭÎÛa²QâDÂżäÍJ¤ ”Mڜ%Ŭĵ=X£ŞSHŝĴ0]¤ĝKÙ‡(ÙRž*êTé…n‹'Ŝ9[ĦÉ91ĞÀ„—t›ÔS(ĉŜ9#q[çĞ 5TeвnŜÁ ²Š[6²(­l–>Z½7ĠĞ-ş­R&GЈĞû`qÈÚ3O—íVşµ˜&´VQÎ1•NúŠázċ}".B“ĊDé(ŭîBÔĊxÒĈ =8Ít5{Ĵ˜›­6@şĜŽH?éĥ£rcĊIß)SEhDġ¤ÄĥĴŸLÛó5p÷@–(c3Œëê<=Óö@á£aĊdWœÍÀĈSÄç_Rñ•ò#ĦŬŻĥ‡@;ߎh÷ûާ[Ŭ£‹³ż ŭ:x#pĞxèïrxŭ´}bŞ/E%DÒv]Ŭ¤^˘ÄxŻĦt‡€²şğ‹ö×Jò½ïşş+G P/–£é2;“iVK0 OĠX‰swFĦ-ò¸çí+ÌíEICDĵ-) Q,â1ŬùMVP{İÛ@=}5ŝ½İ­ŝyÒ_ğE É1m†*G›vgeI–ĊM{ŻXŭĝ•â=’OĈKò ”Ôi â\#E‚{•&)èöĊœŬĵ=ògQgzeèpwê_v˙r6ğü²FĥXà;7zİ˙>‰Ĝħ ÓdÖĝ6ıwĥĞ›ĉ@‹ž °úNÖsc•Sƒ„B‰kruóöp+ ġ hœí)ôHäɖ äÙ窎^¤R<—\¨Qž?VĝĝcıçÊ1_ÓkÈšâ/Ú² ›>ÀDgğ;qË#ĤŬsd ­èlÓqˆ wxȸ,|ˆ7lxŜèBLĉşEĈÓóv(ĠoÏâ4JŸ›*^=‹Û‘15żczĦ şPşzdè¸kïŭz’­’3ż\–‚*ž].Ç'{ĵÁÀ!Ìe͎/0Ĵ{ƒaŬŭo0²ŝ‹úı³ħéï0,|Z֏´ÊíR‡VİĴÉHkÉyÖeD}FN€^Ȝüĥ¤k .™•+Ŭ\!ŸFwÚ6˜yꙠŽĦ-ŭ0 ™ĥr,W§zş³"ßs 5Ĵ.÷0ğiç#݁ÛBÓ;  €BЃ‘NËí"Ägċğ˜À:ŬiŠVéF#(ĵûµ=[vŬÌÇí‡pN#üÄ;Lïĵ˜~Ôòj´,ÎXDĊP'ZÇĜÑ<ö³0³ ıóğ !Èù=½/9TäFÊëĝQQH@§v@Ç|ÙÓ7*ßwı ߨ˜ú1NÒÑMŭ‰à•kÚ“ä}³Ë Żŭ oO$7â‚ߪ–·°Êx4İ_ĥó Ïbŝn‰Fè+x '],ñt§8´IuhèB^ÑÛĝIÊZUSçËÁ”uˆç²÷ӋW˙H3˘5*3P 9xħ#vóŒ˘5TŞgD£ĉîëƒŬ"}o’QB߈;M°oĜÏ}+_w áj|ĜŭnžQž›ĵë§pË Ż÷'`°e\‰u÷½gÊ +E=ĝG6â”)ù¤cC=tÖòvĈ9½³Fà,”]M,  –rĊ̽ÀÚh§£Ĵ瑚 ÷P\†Ğô‚>µüKi>Í=ŭĠV°IĥÄq·ša“<şG)ċ½f/²#.Q°)[ú›Ĉmñ›gĴqI܊˙“÷9À-â÷u€ô²(ĉb›üßg>[›˘’ VRTe;v)*÷­Ìż99½*Şéâ ÷šŻONóe(§fÍl{ÓU¨Ĉ/Ĥd )ÛVó'ĵ-v{{Bĉ†\~ŜŽ–İ§yŬ(–.żW˘-żŠı!ËûCBŻó‡ÔÄút³ûVWg£µí˘7_ş q.ŭ’C’ޞ"Í ŭŻotêIß²&£Ë]ĞéÔ0rZß0²63eŒQ‰'”Ǩ’Ŝ#"n^à“"ŭòŽq›ş›*“~AóRêác"jBş§Êù¤˜FX y)&şÔftM@ŸPTӕ¨ÂŸâ3˜]mĝşĥ‚÷h6ˆÉw“ËlX`K£5ġŝŬ\´ëž<‰ „Xó$Κìíŭ œë‚Ÿ~˙âËżwN'hĞ4ĵÏwG§Ú쨛~0\cäçĞ3žŝíĊ÷Aê6Q̏X;ßW i!ü­xы €ŽİQ:ÎÜàX(úEÛuߟŸ·“#o…ĞnÛċ²<‹^ÏTJ@h˜¨ĉ›‚.ŜFÓ˙Îúw­*ïwsĠëċì_á–GÙŞ>ki ƒ+öŬ_ŜĤ cVŭ8œÒzĜ KóßQyßö•—JSzw­óí(\$6ÚV·×Ÿ~ŬIÚ*ĥtW1ö,.*Ŝp½Ö(˵rħtşQêG€á݇–÷ŻÈ8ú‰‚Çendstream endobj 595 0 obj << /Filter /FlateDecode /Length 2135 >> stream xœĊZÛnGö‘Ĝ8v„í· żĞ$ğŽÍE¤ˉnw~²}“l·“ĦËIu î΀ü›™PÁ9½ı$µ´şœk¨Á”²,4´QI§² ÄXˆ½AĉP ĴSMh£ Ż£ŠCÇúèg ½š‰†Ë1+Ĉsr‘†~é§'™0([Ë=ÎP!‰oĊX˘vóŝÏB$á é8à!ˆ'˙օ’’0N+(}44ġ€q…zPBÂ+ûèŻ‹ìĉĴnLw‹d9ۖgSñ6ÉşPG$vÂ<uúw´’A`,pÄ|:êpIHN¸œ‘B‰—›‘Bİž‘š˙A3R¨ä3R(ïbH숰¤M\‹9GbĵċjÇ;™i,Snë”ÇAŠĝ›­>HîßÑ,C\‡ĠSWĦ˘‘ê$~&£%Zħ=L^OVɋıDüĴŠî³#£Ñ§Ér—Ô?wl á<~–Ï|Ï:—îV·Iú˘î 4\ĠœÇc‰7Ñ|lċĉÊà°nÙßÓĥγîˆIn`}œ—XÏaO`UÏël,ï7Ì5¸à1³kħĈ‹î`üŒilïµĉt².t|›3˙x·M‚%ĜéĞÏ8¤‹äSq"7Â5Öò|ùâGÜ{Î9[0€òܗ3§àHÁ.ßż£/€ñÒşÂN•ûÑċh]C@]%PÂ1\Ô:ógú)QċŬúġ|ż]Ĵ–I}ä8òLĈáĈuÁ÷€2ÏN9D^;ÎQßT´šùıgċ5ŽpÖPqf§´żó³+AĴYÑ"†‡şd˙Žf:Ü “ĠF—< ŭô. Fjì^—ĵ†ŸJÌe{=²í(.‘é™'Ô{˙Ž–£° µÍz×]#Ŝ^ÁPñ‡> stream xœĊZÛnÛF}úDZ + Ŝìì}Ô hbĞÍC²DËjlÊĠ%m€üo£³ĵH\ФEJFá™âî™áì™3³+ŝ1 óùçä~×@q ÌòȀâTıH1!(èP']´Œ£÷Q2`Ôİ™‹fÌÜ Ŝ ^\Ñlċm€ġq‚7-Ċ[à4u˘0 ݳĝċßhIÑëC,]˘ô™˘ċ -Aöŝ1ı^Žneä¨Ó\G£›Aö臤BE†#4“Ñè~@nĉwñÏñj²œ?ĴËáèÏÁù(Ċï ÜPeB+²Ŝ ê||GßĈËĠ")á÷òŸP!0òNsTşïíí"‰G_âĞáyÇmœñ+ÙÌǸ%Î4ÏH9³ Ž“ÈƒÇı‚A~}úeŠŜÚ˘atƒñ|?<&q¨Kİ2^ß.Ĥtk0(JKžšŝİ šM)²Ħıj`2q[vjÏj:½b£ôXÜ „ásef;K&Ä˙ïÉ@óçpNÍ*Ni|*A֋ü ,ġr)†Zĵ™Fï-b1à&ğ+jÑ÷¸R~E}´ ²8™[Ȝ.bl—ŭvĵ.x”UŝSxÚŬ“ͽżreß|^IBë ’Ê`ĊnÉÈj!hžf$Ž; ÷Ê@ |ߔTĜùaĴž² ”Mœ˘ ”ñN^gkòĴw°Ô¸0 u@ĦTn‘-.”5-u yF…uÀ°}+ġÖQĦÍc… 7ë!Îô^!xTúÓeÈ4Up(sFısıĤŝX§¨¨#‚1›İ!{…C*ÍC̰zœáSPittĈ-Ġu‡ĉEaÑPŒu"/H`Nîâdĥġ—ˆcL{İ`r[¸T*Oí ”×Ô!)Ĥ#Ë\ÜéżK#‹zYîԓíÒr†Úy/‹›†,nò{ ïj=NÖĞŬíy²›şŻÂµb+²T‡ğyFH{§İÖ=ôĥĊÂÑûbݵ‡ôB°[ħžê‚Úe/Cž|3 ÚakË6ŽÒrì´ àڷ’KÜò—şQä€hQĊĉzpİ|^ìTQPĉĊô˘(RԞ(~€;uı#ĴïMğìX›g„Á3 Oê´èĈzÒkÙÄ)Z•2ŜÉ[•ÀÙ£5„ÂÎԆE(Ċ(&oÀ}Öv,Ġ<£B7…Yċ\%ċcÉĜߛlƒíoUk’qż'Ç|ŒcO€û-Ü6–zÜnäMÎrSp;΋$v(­€‘‡tE§ĦëvˆŸÓكûÑĊïçEÇ SüïšöY)LŬĴÔWĴâÉü𸰠$ßïÔĥ·Ĝ[áĥ3™Ġĥ‚ ßmu‘ÁĈ^2à,úè`³…ŜÔDaġyR,™8‰–N݃egs²÷Aìĉ™€òŠì)Ŝ`Ȇ¤pžJ>‘Ò²˙Ż eSÏŜ˙vñ˳cü—Û*ú_'á¸E‰€Ŝ<#L§¨]%ĵožĝ“&ƒİ×*áİŞĠh ˜ Nw’ĉ• T\›îZÒbĦwŒ$RYÂSjIÙÄ)´¤Œwr- œ=–”!ŸXKÊĤž%šĉiġTöPëG˙Ù&­²h}ĠĠ˙ʅwÊȧ?DrŠ*Ĝ8ê… Ì µŸ!O ŜeßÚ<£BàššÎûÖĝ àhèq†dŒ ĥíU“½×“š&„Ħ1E8ۛw}+İÑ@ßàXI5·î)𝲉St;eĵ“w;³§Ñ,j  ‹c$_OD¤)(ÏP,‡àüÛ.:“Ë!öJi]9ŸNğëĴî G6ñzß=Ï/ħ†ĵJ¤A–´6"żÇÉż‹ĴP˜ôaœL‹ Ž\ŸS8§,‰ïÏ$²Ò’‹·ŝ½€—›ü(ƒ?ĉ³ÄÛÌ>sĊĠżHħu]*Mµ)*á›q2ÄcڒÍxéÓѤ%_‹_yx^˜q˨ŜírH–k—oyË6}ñ-ÀŬvŜ ŝžkϞendstream endobj 597 0 obj << /Filter /FlateDecode /Length 3227 >> stream xœ½[Y7öqÑÈ.œĦyò’ÄÙÄħÙ;H4RόcŽ ìoÙż·cĞH6›ÔH]³ƒ¤6ğŞXÇW9ï+JXEñ_üL.Ŝ_(­ˆĵ2Lk"y¨„éŠKuĠĵİŝUM/(qŽr!ĞÛ=Ŝ¸¸ıĝñâùkÁ`ùÂóD |A'X)+fĦNĥ,$qžŝĵŒŞŝşŸ7À‡‚Hï/˜ßX?“êë+€[Y9â4×ĠĠÍEĜ5Ğ”%Vp[Ή˘²şš\ĵ­˙ÜğdTÂbWże?÷.W„R^‹ŜÏW˙RLĞÊnj¤à˙9MìN;E¸0'ŒĈIïR:kM}u×ô.ıV×z 8YĦëŝxċŸküYOšċŬlHKÒ+ {_cÉ4ž.çé\ŭĥuÓ¨5ËËW>xîŝíĵ85DKUî/Š‚[ŻĉrŜ,Ŭ“ŝżŜYŭrşšüÔcŒúM"Óo›Ċ`>ş_Îĉı‰t% %”ñúċG 5ŝˆ9ÇêÙ´‰”™İûóÛĠ¤™.£:Żg7íwS˙:š›_|ıµ_ûu3‡G¨ÖuЁrË@šÄò×iÒ|ÑR‘ġdµXĥż\}íċqġâŒ>k†·ċ,üÏh"Žn>µZàġw£Á]ğԃÙtħì‡mKkêQTŸƒ×‡Íb4o˘+ĵĵ?ïBU+a5]@8FœÌCĠH rğÇ>TS„Â:I”í"Ôi Ĝ‡Şa…cYîàĈs8&@5¸ıSŜ8ġrÎ2êÉĞf˜MÑk½Z½ùĦÀ@\nKɈLO–0W{u~{ġé9YX Ħéx)l Ŝ#%ĉEDßĠ¨Ä2ޤ9\bÎ5á´$ÎNV0O] ÛK³Ĝ`Ž.;?´œHÉv¤ħíoĴĊ³S—½ d%ŭXöÚAŝ„À@ġj÷ s5u1u1á~Jğs3@˵¨"ß˙ġß˙ùrè( òCÈï:Ûß( ëXÌï‚ÎÇëV½tLO:9‹s€NNïì S{.ɉĉ C ”V˙RĞÜ1‚·Ĝ“óÀdŝUĈF0J‘:ìĦ×bŬáœuGpSœe nŸ˙í‡ï_~~Šš *1˘4ìF¸SPä/ÑEí€ğíoĴE´’èCÑnġ"Rqġ°N?íLħŽ ôÄC°nëkZeÜnŽÁşíN,„£àìIħ.cqĴËèëraφuÑ'şŒGhw:W%§9ĵ[Úñ¤JNC'KzĦMÛN ö„ĥío”Aë à‡bÛòÇG ´ Ì˙•\‰m-\Xž W>÷iĞq ë,1ΠèĜ½·Ò‡ĉY*HíÈ犢üzŝžq¸7™ö“€=0;…_íàeğa¸ÎêEÖ÷îrħrj‘ È,¤vJ ŭËq”o0î/q‚8Ġ‘§p ‹VWCx+ /Nƒ,[^lÔX@xéÚ×ħİ÷<­ò3‘Àż~á,áy˙ŝ™t-MÍgĞé0½ı ğKżiwÀ‹ñp„ ŜŠ ôL4À³ŻGLŠXjΣ;FJҏ\ %×·³Ùí¸yñâ~>[ÎW7/^xŭ­İmÈéRrLh˘şd ³½ ²_ġœÁùhŝzÜü'w d‡ċz²ÔPìôär£qѓƒ#Cr1Bp{ĦÛf‚Q]|üşY´ŒCíÔoÑ͚†ÍgÓfĜ΢x}SqÀŻĥn[XEoĈ˘ñöÔ:£Xç'iûš0DA€@& ïĥş’00ar!-•„vOĈ€°Ê·c’¨9鞠PÁáŞ]X£”1EfFß2HÁG·×çb<[ö.4BI‚Ô,É;@< L”ô$%m‹ŸÙĥâ“b[ÔHÂ\-fħ|çĥ„Àıħ4ĵ,f4ĝ,¸ £DÒ9÷³ÑtÙ$+‰Lşœx·ˆô×]úÜ 5ô6vìj•€ğ8ÄÉiĉ9…PáD"Çğè943ˆIk€—‹0À•Hâ}óìYËR"àcβ8ĥjÊ÷Yġ¨í'àĈÊzÜl0[RufȤêd6€ÌߙÙâ“ÜlÂAĊ!un6Š5ˆ;Âl }ŬIÙ[Îr“Í‹LĞ“Ċhr?3ìF´‹³ëdŸĝŬB€ùÓI£B K2ubŝ| ¸n³*ğÍĥŠƒUŠH–)}R(ÎBégdĤ8XÍ9Ĉß!ë)u6”^q7Ğñĝ—mړ2 M>‰k?µ3~Uż_ġÇ£?„Äù´:MzÈ´œôt ĦŻM‡ ”Ş 1˜6P :­e(0,ĜÓ<škŠŬAÉ•mmúFv(1çaP_ŞÌ› I­é‰@ŬĜŸl{ŭK h›;1\“žxÂġQIK8€€âċ‘—XËBÚ ‚v™ĊŠĊmIDFB˘2ñғLĵ´OŽ¨Í6”‹ •Ê……:ˆÚ\ž(v êĦ6ġÀFԘĴÇÌ[̊1ħAëœZ"0n2>İĜŻŬÜBTbns˘oëy³\Ħ—ûNOÔm„Ĝ5¸ha%˘ĊuÌİ%ĥ„; áѸü§žĈJu CÌ~š×!B°Ï³ÒĠdƒ³$uîÓ/”j8w¸‰Ï ’Ž0&‹Äöθxï[qï4pGômŭ:ΕÙnàóeeÌÖXéògĴĵĞès¸JGtòÍŻpbÙıÓ$ŞĊ¤ŭġ´‡AžL³nÏĵ\çÚ@ÓUëñ÷]!î@òŠ+ì Í]!?¤+ÌF‘XÉCûB%<úÜJšĤĠô…ë71/´'’ÛêRJIÍ*ĦqçŝÀĦ½‰ğ'aŝ˘Ħî {T…Ŝ}˙]PüŜĥŬĥÄ鋍=nÖ%­’(ŬeÊpQpŬ4éĤájÑdKâ-C˙"`>j>4ŬEÂlşĴZ!â0ı5w7KN ‘òú–´8œÁû›NÖï$2Ë‘ö€#óío”§u^£àG™ïàĉĝ³âöäό…›ÛáC‰â1&K˘ïÎ~$o(+˜œt$ŽDIïlGòíÉv!ìÉGò ٚ55ŸùH>˜?ô³ÉCç£c°_½™œ ’h]šñ]o™<“ĤĊ=˙H`ûkQ. $üC˙4`ġä1‰½ûŻĝĉ\=Œ…¤[tB…˘³TÄ·˘ĴŝääJÒñŜÎôÓfŸlĥžâb ›>qö‰û ‹Ÿ&÷X¨³­éĵ@@1ħ=ïl^]z£…Š_„‹ŜĦ”ĊRiŸ¤³…ĵO8`ñX+RŠ&MP˙m OîVŠMîîˆtâî‡C·*NJ~ŽŠŸ…‡’0 tž“<êCğʂÇI™O[*Ó;_ĉƒĥÄĴ {rĉ·dÜĴiù̙/^…-œĵ™Ïâ_Ç NÉ|ÜIÂK•Äĵמ 1ĵD䑲şıT b>@{-h~vÙexPúß§5։h€x."4ô™:MŬ-—÷=HĞİ/ž?Äñ ´wŭ)™_ö.- }ìŭ|ö[3X’Ùüöù}àïcAI]˙ÍîWŻ}üġêfßëW›D”€„ÊŞRėa3‡ŝNĞfılĈ_ĥ‰ÏÔßġ {sF‰zî‡í‰ ĝgiÔêöÔ°{áÍrö{lMmŬŒ?u˙xñ?ÔŞendstream endobj 598 0 obj << /Filter /FlateDecode /Length 183 >> stream xœ]O1 ìy?‰ŽX04ħIĦ¨ pd(†Âß —ÄÂbwfÙÛcŻé‡Ëà]ĤÍ=ŭ„L­ó&Á–¤Ž09Oڎ§óĤġ[EÒôW_Ÿ´ €]ġM½Ħyœş3>µkHsT’òÁ˜ÖJŜüYÇ50Úm²%‚ħÂD´D0V˜^Ž.Ż.7Q¤ÁċûšúOmĵ¤zI |Ĉ³°vmë<ü.!Ö- _ò^£endstream endobj 599 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 569 >> stream xœeÏżOa÷6„ŝH˜ŞÍ4–šŽŬl[AĈCèÉAŽcQ4‘ƒ<ĊƒF„4 EàBĦ‰gÔS—.ŝïá9ô.’4M“÷ÇMžçó%v1ġÖ£_QĴß²ÎÎY—(Çx˘V—Ŭj·İıEzHHSÒ´dçhaTQFíg£áËhòvŬÇówñë{HCö7ï-ŜÇäs›íéôp éô{i<Ü’ }˘˘dŒĤH_˜!ż— yݧ·“³säx;鲓vÛ?0„v&™z‰}@n4t i‘ŭ"²DûzÉ4bpiHàĞĦ_á’Y‡XÄâPV‡,Ê˘£Ğ7I.Ùy.ͨ‡Àóż5ĝŝn>ܤKÉÖêŝ ¸Í²<ËÇsqˆCHXĞDށ~â ġ‹à¨."§[g0€F!4 Ŭ˘]èdŽ7Z›Gn Ápï+éÁQıU8†twÄL—oä€ÁŝYë´w1Ĵ]ŞÓ|@'’T„_ƒÄóq!.°ğ,°àŜZ‰ĴĤ“İôúĥáoAñïJéêÒÜm MĦžŻC:|;ĠJöèšO…\Â0Ñ[×ârÏe‚; !T—#ħôU­¤›ħH&Ĵ@‚EĤ¸<Ü-$°ìH,ŞÓN _Ğö*-Ħ­ÔŞçê|of›ĵ­UŞVJ‡{ÓèÛhAúiı–żêĵzIŭ~èoŠ8,)Wgzt‡(?3N"ô‡!ˆendstream endobj 600 0 obj << /Type /XRef /Length 326 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 601 /ID [<4b9a651dfad0763d4990363cd20919bf>] >> stream xœí–O+DQ‡Ï=˜kĈn‰,¨Ħfƒ°@”`#ò9Xİ) K+6²h–² Yb#b75eHvÓ¸żçkxïâéí=żógñœÛñNŸœËoçĠŒ˙šM—ŞIŜʊ·E³Â(+ŠjâCmĊ|0ʇħ˘|x7ŒòaĤ 'Í£|˜Ö+"ˇö1}.ĉŸ¨‡Ä螈aJLUĎ úÇbËŞ‡˘'Ù{JKìšNĝ2wbpÁ.ƒìòĊĴšĜżGÍĴÌÉ:ŸˆYïÔÔz˙4Ë9ó٘ĝl×ċ³_ÂĠîñdzDl[ssĜ;Šie,Ŭ;_°´OĈfĤĵ›Ì0âp´A²Àèw‡döŠÑYúûä79IƒŬK${8£ĜzÉè2}nD¸ÀÙĝ?§é³~ö•ĉïş?÷_CZ endstream endobj startxref 188612 %%EOF RProtoBuf/inst/tinytest/0000755000176200001440000000000014752643773015016 5ustar liggesusersRProtoBuf/inst/tinytest/test_extremevalues.R0000644000176200001440000000334513617260253021061 0ustar liggesusers# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.uint32 <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } foo <- new(protobuf_unittest.TestAllTypes) foo$optional_uint32 <- 2^32 - 1 foo$repeated_uint32 <- c(foo$optional_uint32, foo$optional_uint32) expect_equal(as.character(foo$optional_uint32), "4294967295") expect_equal(foo$optional_uint32, foo$repeated_uint32[[1]]) foo$add("repeated_uint32", c(2^32 - 1, 2^32 - 1)) expect_equal(length(unique(foo$repeated_uint32)), 1) ## fixed32 are a more efficient representation of uint32 foo$optional_fixed32 <- 2^32 - 1 foo$repeated_fixed32 <- c(foo$optional_fixed32, foo$optional_fixed32) expect_equal(as.character(foo$optional_fixed32), "4294967295") expect_equal(foo$optional_fixed32, foo$repeated_fixed32[[1]]) #} RProtoBuf/inst/tinytest/test_descriptors.R0000644000176200001440000000242413617260253020526 0ustar liggesusers# Copyright 2014 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.descriptor <- function() { expect_true(inherits(tutorial.Person$email, "FieldDescriptor")) expect_true(inherits(tutorial.Person[["email"]], "FieldDescriptor")) expect_true(inherits(tutorial.Person[[1]], "FieldDescriptor")) ## Currently, the $ extractor for fields returns NULL for invalid reference ## stop() probably better. expect_equal(tutorial.Person$nonexistantfoobarbaz, NULL) ## But we raise an error with invalid indices with '[['. expect_error(tutorial.Person[[909]]) expect_error(tutorial.Person[["nonexistantfoobarbaz"]]) #} RProtoBuf/inst/tinytest/test_bytes.R0000644000176200001440000000203013617260253017304 0ustar liggesusers library(RProtoBuf) #.setUp <- function(){ if( ! exists( "TestBytes", "RProtoBuf:DescriptorPool" ) ){ unitest.proto.file <- system.file( "tinytest", "data", "bytes.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) } #} #test.all <- function() { test <- new(TestBytes, req = "abc", rep = list(charToRaw("def"), raw(10))) expect_equal(rawToChar(test$req), "abc") test$req <- charToRaw("abc") expect_equal(rawToChar(test$req), "abc") expect_equal(rawToChar(test$opt), "hello world") expect_equal(test$rep, list(charToRaw("def"), raw(10))) test$rep[[3]]=charToRaw("ghi") expect_equal(test$rep, list(charToRaw("def"), raw(10), charToRaw("ghi"))) ser <- serialize(test, NULL) test1 <- read(TestBytes, ser) expect_equal(rawToChar(test1$req), "abc") expect_equal(rawToChar(test1$opt), "hello world") expect_equal(test1$rep, list(charToRaw("def"), raw(10), charToRaw("ghi"))) ## Test raw(10) can be set to a single req field. test$req <- raw(10) expect_equal(length(test$req), 10) expect_true(all(test$req == raw(10))) #} RProtoBuf/inst/tinytest/test_int32.R0000644000176200001440000000353313617260253017126 0ustar liggesusers# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.int32 <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } a <- new(protobuf_unittest.TestAllTypes) a$repeated_int32 <- 1 # Verify we can set character strings a$repeated_int32 <- c("9007", "9008") expect_equal(length(a$repeated_int32), 2) # Verify we can't set any garbage string to a repeated int32. expect_error(a$repeated_int32 <-c("invalid", "invalid")) expect_error(a$repeated_int32 <-c("33-")) a$optional_int32 <- 1 a$optional_int32 <- "2" expect_equal(a$optional_int32, 2) # Verify we can't set any garbage string to an optional int32. expect_error(a$optional_int32 <- "invalid") a$optional_uint32 <- 10000 a$optional_uint32 <- "200000" expect_equal(a$optional_uint32, 200000) # Verify we can't set any garbage string to an optional uint32. expect_error(a$optional_uint32 <- "invalid") a$repeated_uint32 <- c("9007", "9008") expect_equal(length(a$repeated_uint32), 2) #} RProtoBuf/inst/tinytest/test_messages.R0000644000176200001440000000435514223351157017777 0ustar liggesusers# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.message <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } a <- new(protobuf_unittest.TestAllTypes) a$optionalgroup$a <- 3 expect_equal(a$optionalgroup$a, 3) a$repeated_nested_message <- list( new(protobuf_unittest.TestAllTypes.NestedMessage, bb=3), new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4)) expect_equal(a$repeated_nested_message[[1]]$bb, 3) expect_equal(a$repeated_nested_message[[2]]$bb, 4) expect_error(a$repeated_nested_message <- list( new(protobuf_unittest.ForeignMessage, c=1), new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4))) expect_error(a$repeated_nested_message <- list( new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4), new(protobuf_unittest.ForeignMessage, c=1))) expect_error(a$repeated_nested_message <- list( new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4), 3)) expect_error(a$repeated_nested_message <- list( new(protobuf_unittest.TestAllTypes.NestedMessage, bb=4), "foo")) expect_equal(a$toTextFormat(), "OptionalGroup {\n a: 3\n}\nrepeated_nested_message {\n bb: 3\n}\nrepeated_nested_message {\n bb: 4\n}\n") expect_equal(a$toDebugString(), a$toString()) expect_equal(a$toString(debug = FALSE), a$toTextFormat()) expect_equal(a$toString(debug = TRUE), a$toDebugString()) #} RProtoBuf/inst/tinytest/test_bool.R0000644000176200001440000000326113617260253017120 0ustar liggesusers # Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.bool <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } a <- new(protobuf_unittest.TestAllTypes) a$optional_bool <- TRUE a$optional_bool <- FALSE ## Verify we can not set a protocol buffer bool to NA. expect_error(a$optional_bool <- NA) ## Verify we can set character strings a$repeated_bool <- c(TRUE, FALSE, TRUE) expect_equal(length(unique(a$repeated_bool)), 2) ## Verify we can't set any garbage string to a bool. expect_error(a$optional_bool <- "100") expect_error(a$optional_bool <- "invalid") ## Verify we can't set any garbage string to a repeated bool. expect_error(a$repeated_bool <-c("invalid", "invalid")) expect_error(a$repeated_bool <-c("33-")) ## Verify we can set NA expect_error(a$repeated_bool <- c(TRUE, FALSE, TRUE, NA)) #} RProtoBuf/inst/tinytest/test_golden_message.R0000644000176200001440000001332113617260253021137 0ustar liggesusers library(RProtoBuf) # this is executed before each test function #.setUp <- function() { if (! exists("protobuf_unittest_import.TestAllTypes", "RProtoBuf:DescriptorPool")) { unitest.proto.file <- system.file("tinytest", "data", "unittest.proto", package = "RProtoBuf") readProtoFiles(file = unitest.proto.file) } #} #.tearDown <- function() {} #test.import <- function() { expect_true(exists("protobuf_unittest_import.ImportMessage", "RProtoBuf:DescriptorPool"), info = "exists( protobuf_unittest_import.ImportMessage ) ") expect_true(exists( "protobuf_unittest_import.ImportEnum", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest_import.ImportEnum ) ") expect_equal(names(as.list( protobuf_unittest_import.ImportMessage)), "d", info = "names( protobuf_unittest_import.ImportMessage ) == 'd'") import_enum <- as.list(protobuf_unittest_import.ImportEnum ) expect_true(all( c("IMPORT_FOO", "IMPORT_BAR", "IMPORT_BAZ") %in% names(import_enum)), info = "expected names for 'protobuf_unittest_import.ImportEnum'") expect_equal(unlist(unname(import_enum)), 7:9, info = "expected values for 'protobuf_unittest_import.ImportEnum' ") #} #test.readProtoFile <- function() { expect_true(exists( "protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest_import.TestAllTypes ) ") expect_true(exists( "protobuf_unittest.TestAllTypes.NestedMessage", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest_import.TestAllTypes.NestedMessage ) " ) expect_true(exists( "protobuf_unittest.TestAllTypes.NestedEnum", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest_import.TestAllTypes.NestedEnum ) " ) expect_true(exists( "protobuf_unittest.TestAllTypes.OptionalGroup", "RProtoBuf:DescriptorPool" ), info = "exists( protobuf_unittest.TestAllTypes.OptionalGroup ) " ) types <- c("int32", "int64", "uint32", "uint64", "sint32", "sint64", "fixed32", "fixed64", "sfixed32", "sfixed64", "float", "double", "bool", "string", "bytes" ) fieldnames <- names( as.list( protobuf_unittest.TestAllTypes ) ) prefixes <- c("optional", "default", "repeated" ) for (prefix in prefixes ) { for (type in types ) { expect_true(sprintf( "%s_%s", prefix, type ) %in% fieldnames, info = sprintf( "%s_%s in field names", prefix, type)) } expect_true(sprintf("%s_foreign_enum" , prefix ) %in% fieldnames, info = sprintf( "%s_foreign_enum in field names" , prefix ) ) expect_true(sprintf("%s_import_enum" , prefix ) %in% fieldnames, info = sprintf( "%s_import_enum in field names" , prefix ) ) } expect_true(exists( "protobuf_unittest.ForeignMessage", "RProtoBuf:DescriptorPool"), info = "exists( protobuf_unittest.ForeignMessage ) " ) expect_equal(names(as.list(protobuf_unittest.ForeignMessage)), "c") expect_true(exists( "protobuf_unittest.ForeignEnum", "RProtoBuf:DescriptorPool"), info = "exists( protobuf_unittest.ForeignEnum ) ") foreign_enum <- as.list( protobuf_unittest.ForeignEnum ) expect_equal(length(foreign_enum), 3L, info = "length( protobuf_unittest.ForeignEnum ) == 3" ) expect_true(all(c("FOREIGN_FOO", "FOREIGN_BAR", "FOREIGN_BAZ") %in% names( foreign_enum )), info = "expected names for enum `protobuf_unittest.ForeignEnum`" ) expect_equal( unlist(unname(as.list(protobuf_unittest.ForeignEnum))), 4:6, info = "expected values for enum `protobuf_unittest.ForeignEnum`" ) #} ## Early versions of RProtoBuf did not support repeated messages properly. #test.repeatedFields <- function() { test <- new(protobuf_unittest.TestAllTypes) test$add("repeated_int32", c(1:5)) expect_equal(test$repeated_int32, c(1:5)) test$repeated_int32 <- 1 expect_equal(test$repeated_int32, 1) ## Prior to RProtoBuf v0.2.5, this was not handled properly. test.2 <- new(protobuf_unittest.TestAllTypes, repeated_string=c("foo", "bar")) expect_equal(test.2$repeated_string, c("foo", "bar")) ## Versions of RProtoBuf <= 0.2.5 had non-deterministic behavior due to a ## memory management bug when setting a repeated field to a ## non-vector type (e.g. a Message). test$repeated_foreign_message <- list(new(protobuf_unittest.ForeignMessage, c = 1), new(protobuf_unittest.ForeignMessage, c = 2)) expect_equal(length(test$repeated_foreign_message), 2) test$repeated_foreign_message <- new(protobuf_unittest.ForeignMessage, c = 3) expect_equal(length(test$repeated_foreign_message), 1) #} #test.repeated.bools <- function() { test <- new(protobuf_unittest.TestAllTypes) test$add("repeated_bool", c(TRUE, FALSE)) expect_equal(test$repeated_bool, c(TRUE, FALSE)) test$add("repeated_bool", as.integer(c(TRUE, FALSE))) test$add("repeated_bool", as.numeric(c(TRUE, FALSE))) expect_equal(test$repeated_bool, rep(c(TRUE, FALSE), 3)) ## Verify that we don't silently cast NA into TRUE or FALSE. expect_error(test$add("repeated_bool", c(TRUE, FALSE, NA))) #} ## Versions of RProtoBuf <= 0.2.5 would terminate the R instance with unhandled Rcpp exceptions. #test.invalidAssignments <- function() { test <- new(protobuf_unittest.TestAllTypes) expect_error(test$optional_int32 <- 1:10) #} ## Versions of RProtoBuf <= 0.2.5 did not distinguish between non-existant ## and not-set fields with has(). #test.has <- function() { test <- new(protobuf_unittest.TestAllTypes) test$add("repeated_int32", c(1:5)) expect_true( has(test, "repeated_int32")) expect_true( test$has("repeated_int32")) expect_true( is.null(test$has("nonexistant"))) expect_true( !test$has("optional_int32")) #} RProtoBuf/inst/tinytest/test_nested.R0000644000176200001440000000120713617260253017445 0ustar liggesusers library(RProtoBuf) #.setUp <- function(){ if( ! exists( "NestedOuter", "RProtoBuf:DescriptorPool" ) ) { ## None of the messages in unittest.proto is exactly right to tickle this bug. unitest.proto.file <- system.file( "tinytest", "data", "nested.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) } #} # RProtoBuf before v0.2.5 had a bug whereby uninitialized memory was read and used # to determine whether or not to update a nested message field in new() / update(). #test.nested <- function() { for (i in 1:1000) { q <- new(NestedOuter, b=new(NestedInner, x=1)) expect_true(q$isInitialized()) } #} RProtoBuf/inst/tinytest/test_fielddescriptor.R0000644000176200001440000000622013617260253021345 0ustar liggesusers# Copyright 2012 Google Inc. # Author: Murray Stokely # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) # this is executed before each test function #.setUp <- function(){ if( !exists("tutorial.Person", "RProtoBuf:DescriptorPool")) { protofile <- system.file("proto", "addressbook.proto", package = "RProtoBuf" ) readProtoFiles(file = protofile) } #} #test.FieldDescriptor.class <- function() { Person <- P( "tutorial.Person") ## field descriptor object expect_true(!is.null(Person$email), info="non-null email") ## debug string expect_true(nchar(as.character( Person$email )) > 1, info="non-empty email") ## default values expect_true(!has_default_value(Person$id), info="no default for id") expect_true(has_default_value(Person$PhoneNumber$type), info="default for phone") expect_equal(default_value(Person$PhoneNumber$type), 1, info="check default for phone type") expect_equal(default_value(Person$id), 0, info="check default for person id") ## Get the types of field descriptors expect_equal(type(Person$id), TYPE_INT32, info="type int32") expect_equal(type(Person$id, TRUE), "TYPE_INT32", info="type int32 as char") expect_equal(cpp_type(Person$email), CPPTYPE_STRING, info="cpptype string") expect_equal(cpp_type(Person$email, TRUE), "CPPTYPE_STRING", info="cpptype string as char") ## Get the label of a field descriptor expect_equal(label(Person$id), LABEL_REQUIRED, info="label required") expect_equal(label(Person$id, TRUE), "LABEL_REQUIRED", info="label required as char") expect_equal(label(Person$email), LABEL_OPTIONAL, info="label optional") expect_equal(label(Person$email, TRUE), "LABEL_OPTIONAL", info="label optional as char") ## Test if a field is optional expect_true(is_required(Person$id), info="id is required") expect_true(!is_optional(Person$id), info="id is not optional") expect_true(!is_repeated(Person$id), info="id is not repeated") expect_true(!is_required(Person$email), info="email is not required") expect_true(is_optional(Person$email), info="email is optional") expect_true(!is_repeated(Person$email), info="email is not repeated") ## Return the class of a message field expect_true(inherits(message_type(Person$phone), "Descriptor"), info="inherits Descriptor") ## Containing type of a field is the message descriptor expect_true(inherits(Person$id$containing_type(), "Descriptor"), info="inherits containing type Descriptor") ## No containing type for the top-level message descriptor. expect_true(is.null(Person$containing_type()), info="no containing typw") #} RProtoBuf/inst/tinytest/data/0000755000176200001440000000000014535363433015716 5ustar liggesusersRProtoBuf/inst/tinytest/data/proto3.proto0000644000176200001440000000017113617260253020224 0ustar liggesusers syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; } RProtoBuf/inst/tinytest/data/encoding.proto0000644000176200001440000000050614535363433020572 0ustar liggesusers// mark as Protocol Buffers v2 format syntax = "proto2"; // Examples from https://protobuf.dev/docs/encoding package protobuf_encoding_test; message Test1 { required int32 a = 1; } message Test2 { required string b = 2; } message Test3 { required Test1 c = 3; } message Test4 { repeated int32 d = 4 [packed=true]; } RProtoBuf/inst/tinytest/data/cyclical/0000755000176200001440000000000013617260253017475 5ustar liggesusersRProtoBuf/inst/tinytest/data/cyclical/proj1/0000755000176200001440000000000013617260253020530 5ustar liggesusersRProtoBuf/inst/tinytest/data/cyclical/proj1/proto/0000755000176200001440000000000013617260253021673 5ustar liggesusersRProtoBuf/inst/tinytest/data/cyclical/proj1/proto/a.proto0000644000176200001440000000004113617260253023173 0ustar liggesuserssyntax = "proto2"; message A {} RProtoBuf/inst/tinytest/data/cyclical/proj1/proto/c.proto0000644000176200001440000000011713617260253023201 0ustar liggesuserssyntax = "proto2"; import "proto/b.proto"; message C { optional B b = 1; } RProtoBuf/inst/tinytest/data/cyclical/proj2/0000755000176200001440000000000013617260253020531 5ustar liggesusersRProtoBuf/inst/tinytest/data/cyclical/proj2/proto/0000755000176200001440000000000013617260253021674 5ustar liggesusersRProtoBuf/inst/tinytest/data/cyclical/proj2/proto/b.proto0000644000176200001440000000011713617260253023201 0ustar liggesuserssyntax = "proto2"; import "proto/a.proto"; message B { optional A a = 1; } RProtoBuf/inst/tinytest/data/nested.proto0000644000176200001440000000024013617260253020255 0ustar liggesusers// mark as Protocol Buffers v2 format syntax = "proto2"; message NestedInner { required int32 x = 1; } message NestedOuter { required NestedInner b = 1; } RProtoBuf/inst/tinytest/data/subdir/0000755000176200001440000000000013617260253017202 5ustar liggesusersRProtoBuf/inst/tinytest/data/subdir/subdir_message.proto0000644000176200001440000000025513617260253023265 0ustar liggesuserssyntax = "proto2"; package protobuf_unittest_subdir; import "unittest_import.proto"; message SubdirMessage { optional protobuf_unittest_import.ImportMessage msg = 1; } RProtoBuf/inst/tinytest/data/int64.ascii0000644000176200001440000000010213617260253017661 0ustar liggesusersrepeated_int64: 9007199254740992 repeated_int64: 9007199254740993 RProtoBuf/inst/tinytest/data/unittest.proto0000644000176200001440000005053613617260253020667 0ustar liggesusers// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/protobuf/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // A proto file we will use for unit testing. // mark as Protocol Buffers v2 format syntax = "proto2"; // (Romain Francois) The only thing I have changed in this // file is this import directive. RProtoBuf will import // the extra file from the directory in which this file is import "unittest_import.proto"; // To test if we can import a message in another directory. import "subdir/subdir_message.proto"; // We don't put this in a package within proto2 because we need to make sure // that the generated code doesn't depend on being in the proto2 namespace. // In test_util.h we do "using namespace unittest = protobuf_unittest". package protobuf_unittest; // Protos optimized for SPEED use a strict superset of the generated code // of equivalent ones optimized for CODE_SIZE, so we should optimize all our // tests for speed unless explicitly testing code size optimization. option optimize_for = SPEED; option java_outer_classname = "UnittestProto"; // This proto includes every type of field in both singular and repeated // forms. message TestAllTypes { message NestedMessage { // The field name "b" fails to compile in proto1 because it conflicts with // a local variable named "b" in one of the generated methods. Doh. // This file needs to compile in proto1 to test backwards-compatibility. optional int32 bb = 1; } enum NestedEnum { FOO = 1; BAR = 2; BAZ = 3; } // Singular optional int32 optional_int32 = 1; optional int64 optional_int64 = 2; optional uint32 optional_uint32 = 3; optional uint64 optional_uint64 = 4; optional sint32 optional_sint32 = 5; optional sint64 optional_sint64 = 6; optional fixed32 optional_fixed32 = 7; optional fixed64 optional_fixed64 = 8; optional sfixed32 optional_sfixed32 = 9; optional sfixed64 optional_sfixed64 = 10; optional float optional_float = 11; optional double optional_double = 12; optional bool optional_bool = 13; optional string optional_string = 14; optional bytes optional_bytes = 15; optional group OptionalGroup = 16 { optional int32 a = 17; } optional NestedMessage optional_nested_message = 18; optional ForeignMessage optional_foreign_message = 19; optional protobuf_unittest_import.ImportMessage optional_import_message = 20; optional NestedEnum optional_nested_enum = 21; optional ForeignEnum optional_foreign_enum = 22; optional protobuf_unittest_import.ImportEnum optional_import_enum = 23; optional string optional_string_piece = 24 [ctype=STRING_PIECE]; optional string optional_cord = 25 [ctype=CORD]; // Repeated repeated int32 repeated_int32 = 31; repeated int64 repeated_int64 = 32; repeated uint32 repeated_uint32 = 33; repeated uint64 repeated_uint64 = 34; repeated sint32 repeated_sint32 = 35; repeated sint64 repeated_sint64 = 36; repeated fixed32 repeated_fixed32 = 37; repeated fixed64 repeated_fixed64 = 38; repeated sfixed32 repeated_sfixed32 = 39; repeated sfixed64 repeated_sfixed64 = 40; repeated float repeated_float = 41; repeated double repeated_double = 42; repeated bool repeated_bool = 43; repeated string repeated_string = 44; repeated bytes repeated_bytes = 45; repeated group RepeatedGroup = 46 { optional int32 a = 47; } repeated NestedMessage repeated_nested_message = 48; repeated ForeignMessage repeated_foreign_message = 49; repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50; repeated NestedEnum repeated_nested_enum = 51; repeated ForeignEnum repeated_foreign_enum = 52; repeated protobuf_unittest_import.ImportEnum repeated_import_enum = 53; repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; repeated string repeated_cord = 55 [ctype=CORD]; // Singular with defaults optional int32 default_int32 = 61 [default = 41 ]; optional int64 default_int64 = 62 [default = 42 ]; optional uint32 default_uint32 = 63 [default = 43 ]; optional uint64 default_uint64 = 64 [default = 44 ]; optional sint32 default_sint32 = 65 [default = -45 ]; optional sint64 default_sint64 = 66 [default = 46 ]; optional fixed32 default_fixed32 = 67 [default = 47 ]; optional fixed64 default_fixed64 = 68 [default = 48 ]; optional sfixed32 default_sfixed32 = 69 [default = 49 ]; optional sfixed64 default_sfixed64 = 70 [default = -50 ]; optional float default_float = 71 [default = 51.5 ]; optional double default_double = 72 [default = 52e3 ]; optional bool default_bool = 73 [default = true ]; optional string default_string = 74 [default = "hello"]; optional bytes default_bytes = 75 [default = "world"]; optional NestedEnum default_nested_enum = 81 [default = BAR ]; optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR]; optional protobuf_unittest_import.ImportEnum default_import_enum = 83 [default = IMPORT_BAR]; optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; optional string default_cord = 85 [ctype=CORD,default="123"]; } // Define these after TestAllTypes to make sure the compiler can handle // that. message ForeignMessage { optional int32 c = 1; } enum ForeignEnum { FOREIGN_FOO = 4; FOREIGN_BAR = 5; FOREIGN_BAZ = 6; } message TestAllExtensions { extensions 1 to max; } extend TestAllExtensions { // Singular optional int32 optional_int32_extension = 1; optional int64 optional_int64_extension = 2; optional uint32 optional_uint32_extension = 3; optional uint64 optional_uint64_extension = 4; optional sint32 optional_sint32_extension = 5; optional sint64 optional_sint64_extension = 6; optional fixed32 optional_fixed32_extension = 7; optional fixed64 optional_fixed64_extension = 8; optional sfixed32 optional_sfixed32_extension = 9; optional sfixed64 optional_sfixed64_extension = 10; optional float optional_float_extension = 11; optional double optional_double_extension = 12; optional bool optional_bool_extension = 13; optional string optional_string_extension = 14; optional bytes optional_bytes_extension = 15; optional group OptionalGroup_extension = 16 { optional int32 a = 17; } optional TestAllTypes.NestedMessage optional_nested_message_extension = 18; optional ForeignMessage optional_foreign_message_extension = 19; optional protobuf_unittest_import.ImportMessage optional_import_message_extension = 20; optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21; optional ForeignEnum optional_foreign_enum_extension = 22; optional protobuf_unittest_import.ImportEnum optional_import_enum_extension = 23; optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE]; optional string optional_cord_extension = 25 [ctype=CORD]; // Repeated repeated int32 repeated_int32_extension = 31; repeated int64 repeated_int64_extension = 32; repeated uint32 repeated_uint32_extension = 33; repeated uint64 repeated_uint64_extension = 34; repeated sint32 repeated_sint32_extension = 35; repeated sint64 repeated_sint64_extension = 36; repeated fixed32 repeated_fixed32_extension = 37; repeated fixed64 repeated_fixed64_extension = 38; repeated sfixed32 repeated_sfixed32_extension = 39; repeated sfixed64 repeated_sfixed64_extension = 40; repeated float repeated_float_extension = 41; repeated double repeated_double_extension = 42; repeated bool repeated_bool_extension = 43; repeated string repeated_string_extension = 44; repeated bytes repeated_bytes_extension = 45; repeated group RepeatedGroup_extension = 46 { optional int32 a = 47; } repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48; repeated ForeignMessage repeated_foreign_message_extension = 49; repeated protobuf_unittest_import.ImportMessage repeated_import_message_extension = 50; repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51; repeated ForeignEnum repeated_foreign_enum_extension = 52; repeated protobuf_unittest_import.ImportEnum repeated_import_enum_extension = 53; repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE]; repeated string repeated_cord_extension = 55 [ctype=CORD]; // Singular with defaults optional int32 default_int32_extension = 61 [default = 41 ]; optional int64 default_int64_extension = 62 [default = 42 ]; optional uint32 default_uint32_extension = 63 [default = 43 ]; optional uint64 default_uint64_extension = 64 [default = 44 ]; optional sint32 default_sint32_extension = 65 [default = -45 ]; optional sint64 default_sint64_extension = 66 [default = 46 ]; optional fixed32 default_fixed32_extension = 67 [default = 47 ]; optional fixed64 default_fixed64_extension = 68 [default = 48 ]; optional sfixed32 default_sfixed32_extension = 69 [default = 49 ]; optional sfixed64 default_sfixed64_extension = 70 [default = -50 ]; optional float default_float_extension = 71 [default = 51.5 ]; optional double default_double_extension = 72 [default = 52e3 ]; optional bool default_bool_extension = 73 [default = true ]; optional string default_string_extension = 74 [default = "hello"]; optional bytes default_bytes_extension = 75 [default = "world"]; optional TestAllTypes.NestedEnum default_nested_enum_extension = 81 [default = BAR]; optional ForeignEnum default_foreign_enum_extension = 82 [default = FOREIGN_BAR]; optional protobuf_unittest_import.ImportEnum default_import_enum_extension = 83 [default = IMPORT_BAR]; optional string default_string_piece_extension = 84 [ctype=STRING_PIECE, default="abc"]; optional string default_cord_extension = 85 [ctype=CORD, default="123"]; } message TestNestedExtension { extend TestAllExtensions { // Check for bug where string extensions declared in tested scope did not // compile. optional string test = 1002 [default="test"]; } } // We have separate messages for testing required fields because it's // annoying to have to fill in required fields in TestProto in order to // do anything with it. Note that we don't need to test every type of // required filed because the code output is basically identical to // optional fields for all types. message TestRequired { required int32 a = 1; optional int32 dummy2 = 2; required int32 b = 3; extend TestAllExtensions { optional TestRequired single = 1000; repeated TestRequired multi = 1001; } // Pad the field count to 32 so that we can test that IsInitialized() // properly checks multiple elements of has_bits_. optional int32 dummy4 = 4; optional int32 dummy5 = 5; optional int32 dummy6 = 6; optional int32 dummy7 = 7; optional int32 dummy8 = 8; optional int32 dummy9 = 9; optional int32 dummy10 = 10; optional int32 dummy11 = 11; optional int32 dummy12 = 12; optional int32 dummy13 = 13; optional int32 dummy14 = 14; optional int32 dummy15 = 15; optional int32 dummy16 = 16; optional int32 dummy17 = 17; optional int32 dummy18 = 18; optional int32 dummy19 = 19; optional int32 dummy20 = 20; optional int32 dummy21 = 21; optional int32 dummy22 = 22; optional int32 dummy23 = 23; optional int32 dummy24 = 24; optional int32 dummy25 = 25; optional int32 dummy26 = 26; optional int32 dummy27 = 27; optional int32 dummy28 = 28; optional int32 dummy29 = 29; optional int32 dummy30 = 30; optional int32 dummy31 = 31; optional int32 dummy32 = 32; required int32 c = 33; } message TestRequiredForeign { optional TestRequired optional_message = 1; repeated TestRequired repeated_message = 2; optional int32 dummy = 3; } // Test that we can use NestedMessage from outside TestAllTypes. message TestForeignNested { optional TestAllTypes.NestedMessage foreign_nested = 1; } // TestEmptyMessage is used to test unknown field support. message TestEmptyMessage { } // Like above, but declare all field numbers as potential extensions. No // actual extensions should ever be defined for this type. message TestEmptyMessageWithExtensions { extensions 1 to max; } // Test that really large tag numbers don't break anything. message TestReallyLargeTagNumber { // The largest possible tag number is 2^28 - 1, since the wire format uses // three bits to communicate wire type. optional int32 a = 1; optional int32 bb = 268435455; } message TestRecursiveMessage { optional TestRecursiveMessage a = 1; optional int32 i = 2; } // Test that mutual recursion works. message TestMutualRecursionA { optional TestMutualRecursionB bb = 1; } message TestMutualRecursionB { optional TestMutualRecursionA a = 1; optional int32 optional_int32 = 2; } // Test that groups have disjoint field numbers from their siblings and // parents. This is NOT possible in proto1; only proto2. When outputting // proto1, the dup fields should be dropped. message TestDupFieldNumber { optional int32 a = 1; optional group Foo = 2 { optional int32 a = 1; } optional group Bar = 3 { optional int32 a = 1; } } // Needed for a Python test. message TestNestedMessageHasBits { message NestedMessage { repeated int32 nestedmessage_repeated_int32 = 1; repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2; } optional NestedMessage optional_nested_message = 1; } // mstokely commented this out, it breaks with libprotobuf-2.5. // // Test an enum that has multiple values with the same number. // enum TestEnumWithDupValue { // FOO1 = 1; // BAR1 = 2; // BAZ = 3; // FOO2 = 1; // BAR2 = 2; //} // Test an enum with large, unordered values. enum TestSparseEnum { SPARSE_A = 123; SPARSE_B = 62374; SPARSE_C = 12589234; SPARSE_D = -15; SPARSE_E = -53452; SPARSE_F = 0; SPARSE_G = 2; } // Test message with CamelCase field names. This violates Protocol Buffer // standard style. message TestCamelCaseFieldNames { optional int32 PrimitiveField = 1; optional string StringField = 2; optional ForeignEnum EnumField = 3; optional ForeignMessage MessageField = 4; optional string StringPieceField = 5 [ctype=STRING_PIECE]; optional string CordField = 6 [ctype=CORD]; repeated int32 RepeatedPrimitiveField = 7; repeated string RepeatedStringField = 8; repeated ForeignEnum RepeatedEnumField = 9; repeated ForeignMessage RepeatedMessageField = 10; repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE]; repeated string RepeatedCordField = 12 [ctype=CORD]; } // We list fields out of order, to ensure that we're using field number and not // field index to determine serialization order. message TestFieldOrderings { optional string my_string = 11; extensions 2 to 10; optional int64 my_int = 1; extensions 12 to 100; optional float my_float = 101; } extend TestFieldOrderings { optional string my_extension_string = 50; optional int32 my_extension_int = 5; } message TestExtremeDefaultValues { optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"]; optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF]; optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF]; optional int32 small_int32 = 4 [default = -0x7FFFFFFF]; optional int64 small_int64 = 5 [default = -0x7FFFFFFFFFFFFFFF]; // The default value here is UTF-8 for "\u1234". (We could also just type // the UTF-8 text directly into this text file rather than escape it, but // lots of people use editors that would be confused by this.) optional string utf8_string = 6 [default = "\341\210\264"]; // Tests for single-precision floating-point values. optional float zero_float = 7 [default = 0]; optional float one_float = 8 [default = 1]; optional float small_float = 9 [default = 1.5]; optional float negative_one_float = 10 [default = -1]; optional float negative_float = 11 [default = -1.5]; // Using exponents optional float large_float = 12 [default = 2E8]; optional float small_negative_float = 13 [default = -8e-28]; } // Test String and Bytes: string is for valid UTF-8 strings message OneString { optional string data = 1; } message OneBytes { optional bytes data = 1; } // Test messages for packed fields message TestPackedTypes { repeated int32 packed_int32 = 90 [packed = true]; repeated int64 packed_int64 = 91 [packed = true]; repeated uint32 packed_uint32 = 92 [packed = true]; repeated uint64 packed_uint64 = 93 [packed = true]; repeated sint32 packed_sint32 = 94 [packed = true]; repeated sint64 packed_sint64 = 95 [packed = true]; repeated fixed32 packed_fixed32 = 96 [packed = true]; repeated fixed64 packed_fixed64 = 97 [packed = true]; repeated sfixed32 packed_sfixed32 = 98 [packed = true]; repeated sfixed64 packed_sfixed64 = 99 [packed = true]; repeated float packed_float = 100 [packed = true]; repeated double packed_double = 101 [packed = true]; repeated bool packed_bool = 102 [packed = true]; repeated ForeignEnum packed_enum = 103 [packed = true]; } message TestPackedExtensions { extensions 1 to max; } extend TestPackedExtensions { repeated int32 packed_int32_extension = 90 [packed = true]; repeated int64 packed_int64_extension = 91 [packed = true]; repeated uint32 packed_uint32_extension = 92 [packed = true]; repeated uint64 packed_uint64_extension = 93 [packed = true]; repeated sint32 packed_sint32_extension = 94 [packed = true]; repeated sint64 packed_sint64_extension = 95 [packed = true]; repeated fixed32 packed_fixed32_extension = 96 [packed = true]; repeated fixed64 packed_fixed64_extension = 97 [packed = true]; repeated sfixed32 packed_sfixed32_extension = 98 [packed = true]; repeated sfixed64 packed_sfixed64_extension = 99 [packed = true]; repeated float packed_float_extension = 100 [packed = true]; repeated double packed_double_extension = 101 [packed = true]; repeated bool packed_bool_extension = 102 [packed = true]; repeated ForeignEnum packed_enum_extension = 103 [packed = true]; } // Test that RPC services work. message FooRequest {} message FooResponse {} service TestService { rpc Foo(FooRequest) returns (FooResponse); rpc Bar(BarRequest) returns (BarResponse); } message BarRequest {} message BarResponse {} RProtoBuf/inst/tinytest/data/bytes.proto0000644000176200001440000000040313617260253020122 0ustar liggesusers// mark as Protocol Buffers v2 format syntax = "proto2"; option optimize_for = SPEED; option java_outer_classname = "BytesProto"; message TestBytes { required bytes req = 1; optional bytes opt = 2 [default = "hello world"]; repeated bytes rep = 3; } RProtoBuf/inst/tinytest/data/unittest_import.proto0000644000176200001440000000473613617260253022262 0ustar liggesusers// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/protobuf/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // A proto file which is imported by unittest.proto to test importing. // mark as Protocol Buffers v2 format syntax = "proto2"; // We don't put this in a package within proto2 because we need to make sure // that the generated code doesn't depend on being in the proto2 namespace. // In test_util.h we do // "using namespace unittest_import = protobuf_unittest_import". package protobuf_unittest_import; option optimize_for = SPEED; // Excercise the java_package option. option java_package = "com.google.protobuf.test"; // Do not set a java_outer_classname here to verify that Proto2 works without // one. message ImportMessage { optional int32 d = 1; } enum ImportEnum { IMPORT_FOO = 7; IMPORT_BAR = 8; IMPORT_BAZ = 9; } RProtoBuf/inst/tinytest/data/recursive/0000755000176200001440000000000013617260253017721 5ustar liggesusersRProtoBuf/inst/tinytest/data/recursive/subdir/0000755000176200001440000000000013617260253021211 5ustar liggesusersRProtoBuf/inst/tinytest/data/recursive/subdir/subdir_message.proto0000644000176200001440000000026713617260253025277 0ustar liggesuserssyntax = "proto2"; package protobuf_unittest_recursive_subdir; import "unittest_import.proto"; message SubdirMessage { optional protobuf_unittest_import.ImportMessage msg = 1; } RProtoBuf/inst/tinytest/test_serialize.R0000644000176200001440000000611714535363417020165 0ustar liggesusers## -*- indent-tabs-mode: nil; tab-width: 4; show-trailing-whitespace: t; c-indent-level: 4; c-basic-offset: 4; -*- ## Copyright 2012 Google Inc. All Rights Reserved. ## Author: Murray Stokely ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either version 2 ## of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) # this is executed before each test function #.setUp <- function() { if (!exists("tutorial.Person", "RProtoBuf:DescriptorPool")) { protofile <- system.file("proto", "addressbook.proto", package = "RProtoBuf") readProtoFiles(file = protofile) } #} #test.arrayinputstream <- function() { # Note: This class is experimental, and some parts of the design # may need to change, but this works now. stream <- ArrayInputStream(as.raw(0:10)) expect_equal(stream$ReadRaw(5), as.raw(0:4)) stringstream <- ArrayInputStream(as.raw(c(0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67))) expect_equal(stringstream$ReadString(as.integer(7)), "testing") intstream <- ArrayInputStream(as.raw(c(0x9e, 0xa7, 0x05))) expect_equal(intstream$ReadVarint32(), 86942) #} #test.encoding <- function() { if (!exists("protobuf_encoding_test.Test1", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "encoding.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } ## Encoding examples from https://protobuf.dev/docs/encoding test1 <- new(protobuf_encoding_test.Test1) test1$a <- 150 expect_identical(test1$serialize(NULL), as.raw(c(0x08,0x96,0x01))) test2 <- new(protobuf_encoding_test.Test2) test2$b <- "testing" expect_identical(test2$serialize(NULL), as.raw(c(0x12, 0x07, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67))) test3 <- new(protobuf_encoding_test.Test3) test3$c$a <- 150 expect_identical(test3$serialize(NULL), as.raw(c(0x1a, 0x03, 0x08, 0x96, 0x01))) test4 <- new(protobuf_encoding_test.Test4) test4$d <- c(3, 270, 86942) expect_identical(test4$serialize(NULL), as.raw(c(0x22, 0x06, 0x03, 0x8e, 0x02, 0x9e, 0xa7, 0x05))) #} #test.serialize <- function() { person <- new(tutorial.Person) expect_true(!person$isInitialized()) expect_error(serialize(person, NULL)) #"Uninitialized object should fail to serialize.") person$id <- 1 expect_error(serialize(person, NULL)) #"Uninitialized object should fail to serialize.") person$name <- "Murray" expect_true(person$isInitialized()) expect_true(length(serialize(person, NULL)) > 1) #} RProtoBuf/inst/tinytest/test_proto3.R0000644000176200001440000000304513617260253017413 0ustar liggesusers## rprotobuf.h: R/C++ interface class library ## ## Copyright (C) 2017 - 2020 Dirk Eddelbuettel ## ## This file is part of RProtoBuf. ## ## RProtoBuf is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RProtoBuf is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RProtoBuf. If not, see . library(RProtoBuf) ## The Travis CI tests use both proto2 and proto3, so we need to condition against ## running this one with proto2 where it cannot pass we impose a proto3 file isProto3 <- (RProtoBuf:::getProtobufLibVersion() >= 3000000) if (!isProto3) exit_file("Need Proto3 for this test.") #.setUp <- function(){ if( !exists("SearchRequest", "RProtoBuf:DescriptorPool")) { unitest.proto.file <- system.file("tinytest", "data", "proto3.proto", package="RProtoBuf") readProtoFiles(file = unitest.proto.file) } #} #test.proto3 <- function() { q <- new(SearchRequest, query="abc", page_number=42L, result_per_page=77L) expect_equal(q$query, "abc", msg="proto3 string") expect_equal(q$page_number, 42L, msg="proto3 int") expect_equal(q$result_per_page, 77L, msg="proto3 int again") #} RProtoBuf/inst/tinytest/test_int64.R0000644000176200001440000000515613617260253017136 0ustar liggesusers# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.int64 <- function() { ## Preserve option. old.optval <- options("RProtoBuf.int64AsString") on.exit(options(old.optval)) if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } if (.Machine$sizeof.longlong < 8) { exit_file("Can't test 64-bit int type on platform with sizeof(long long) < 8") } if (is.na(Rcpp:::capabilities()["long long"]) || Rcpp:::capabilities()["long long"] != TRUE) { exit_file("Can't test 64-bit int type without RCPP_LONG_LONG support.") } a <- new(protobuf_unittest.TestAllTypes) a$repeated_int64 <- 1 # Now just test that we can use add to set int64 fields. a$add("repeated_int64", 2:10) expect_equal(length(a$repeated_int64), 10) # Verify we can set character strings of large 64-bit ints a$repeated_int64 <- c("9007199254740992", "9007199254740993") expect_equal(length(a$repeated_int64), 2) # Verify we can't set any garbage string to a repeated int64. expect_error(a$repeated_int64 <-c("invalid", "invalid")) a$optional_int64 <- 1 a$optional_int64 <- "2" expect_equal(a$optional_int64, 2) # Verify we can't set any garbage string to an optional int64. expect_error(a$optional_int64 <- "invalid") a <- protobuf_unittest.TestAllTypes$readASCII(file(system.file("tinytest", "data", "int64.ascii", package="RProtoBuf"))) # And can read them in OK from an ASCII file. expect_equal(length(a$repeated_int64), 2) # By default, when they are read as numerics, only 1 unique value expect_equal(length(unique(a$repeated_int64)), 1) options("RProtoBuf.int64AsString" = TRUE) # But we can see they are different if we treat them as strings. expect_equal(length(unique(a$repeated_int64)), 2) #} RProtoBuf/inst/tinytest/test_import.R0000644000176200001440000000653313617260253017504 0ustar liggesusers# Copyright 2011 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #.setUp <- function() { resetDescriptorPool() #} #test.import.reset <- function() { ## Verify that the common setup is resetting the descriptor pool. ## Only the messages defined in the proto directory should be present. expect_true(all(grepl("^(rexp|tutorial|rprotobuf)\\.", objects("RProtoBuf:DescriptorPool")))) #} #test.import.error <- function() { ## Verify that we get a graceful error rather than a segfault. expect_error(readProtoFiles(system.file("DESCRIPTION", package="RProtoBuf"), syntax="proto3")) #} #test.import <- function() { #unit.test.data.dir <- system.file("unitTests", "data", package="RProtoBuf") unit.test.data.dir <- file.path("data", "cyclical") expect_true(!exists("protobuf_unittest_import.ImportMessage", "RProtoBuf:DescriptorPool")) resetDescriptorPool() readProtoFiles2(recursive = FALSE, protoPath=unit.test.data.dir) #expect_true(exists("protobuf_unittest_import.ImportMessage", "RProtoBuf:DescriptorPool")) # The following is imported by unittest.proto and hence, should have been imported implicitly. #expect_true(exists("protobuf_unittest_subdir.SubdirMessage", "RProtoBuf:DescriptorPool")) # The following is not imported by any of the top level files. expect_true(!exists("protobuf_unittest_recursive_subdir.SubdirMessage", "RProtoBuf:DescriptorPool")) #test.import.subdir <- function() { unit.test.data.dir <- system.file("tinytest", "data", package="RProtoBuf") # Any of these two will work. readProtoFiles2(file="subdir/subdir_message.proto", protoPath=unit.test.data.dir) readProtoFiles2(dir="subdir", protoPath=unit.test.data.dir) expect_true(exists("protobuf_unittest_subdir.SubdirMessage", "RProtoBuf:DescriptorPool")) readProtoFiles2(dir="recursive", recursive=TRUE, protoPath=unit.test.data.dir) expect_true(exists("protobuf_unittest_recursive_subdir.SubdirMessage", "RProtoBuf:DescriptorPool")) #} #test.import.cyclical <- function() { unit.test.cyclical.dir <- system.file("tinytest", "data", "cyclical", package="RProtoBuf") proj1.dir <- file.path(unit.test.cyclical.dir, "proj1") proj2.dir <- file.path(unit.test.cyclical.dir, "proj2") # The following files should be loaded in order as C depends on B depends on A. readProtoFiles2(file="proto/a.proto", protoPath=proj1.dir) expect_true(exists("A", "RProtoBuf:DescriptorPool")) expect_true(!exists("C", "RProtoBuf:DescriptorPool")) readProtoFiles2(file="proto/b.proto", protoPath=proj2.dir) expect_true(exists("B", "RProtoBuf:DescriptorPool")) readProtoFiles2(file="proto/c.proto", protoPath=proj1.dir) expect_true(exists("C", "RProtoBuf:DescriptorPool")) #} #test.assign.in.global <- function() { xx.undef <<- 3 expect_equal(xx.undef, 3) #} RProtoBuf/inst/tinytest/test_addressbook.R0000644000176200001440000001226614752643773020507 0ustar liggesusers library(RProtoBuf) ## created as ## demo(addressbook) ## creates 'book' ## serialize(book, "/tmp/addressbook.pb") # this is executed before each test function -- but somehow does not work #.setUp <- function() { file <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) book <- read( tutorial.AddressBook, file ) assign("book", book, globalenv()) #} #test.size <- function() { expect_equal(book$size("person"), 2, info="Number of persons") expect_equal(bytesize(book), 125, info="Bytes in book") expect_equal(bytesize(book$person[[1]]), 60, info="Bytes of first person message") #} #test.fileDescriptor <- function() { expect_equal(name(book$fileDescriptor()), "addressbook.proto") #} #test.personOne <- function() { expect_equal(book$person[[1]]$name, "Romain Francois", info="First person name") expect_equal(book$person[[2]]$name, "Dirk Eddelbuettel", info="First person name") expect_equal(book$person[[1]]$id, 1, info="First person id") expect_equal(book$person[[2]]$id, 2, info="First person id") expect_equal(book$person[[1]]$email, "romain@r-enthusiasts.com", info="First person email") expect_equal(book$person[[2]]$email, "edd@debian.org", info="Second person email") expect_equal(length(book$person[[1]]$phone), 1, info="First person phones") expect_equal(length(book$person[[2]]$phone), 2, info="Second person phones") expect_equal(book$person[[1]]$phone[[1]]$number, "+33(0)...", info="First person phone number") expect_equal(book$person[[2]]$phone[[1]]$number, "+01...", info="Second person phone number") expect_equal(book$person[[2]]$phone[[1]]$type, 0, info="Second person phone number") #} #test.ascii <- function() { ## Output in text format to a temporary file out.file <- tempfile() writeLines(book$toTextFormat(), file(out.file)) ## Verify that we can read back in the message from a text file. book2 <- readASCII( tutorial.AddressBook, file(out.file, "rb")) expect_equal(as.character(book), as.character(book2) ) ## Verify that we can read in messages from unopened connections. book3 <- readASCII( tutorial.AddressBook, file(out.file)) expect_equal(as.character(book), as.character(book3) ) ## Verify that we get an exception if we try to read from a text connection. ## (better than silently getting an empty proto.) book4 <- expect_error( readASCII( tutorial.AddressBook, file(out.file, "rt"))) ## # Test does not work on windows because of chmod ## if(!grepl("mingw", R.Version()$platform)){ ## # Verify that we get an exception if the file is not readable. ## old.mode <- file.info(out.file)[["mode"]] ## Sys.chmod(out.file, "0000") ## book5 <- checkException( readASCII( tutorial.AddressBook, file(out.file, "rb"))) ## # Set the permissions back to ensure the file is cleaned up properly. ## Sys.chmod(out.file, old.mode) ## } ## Verify that we get an exception if the file is not parseable. out.file2 <- tempfile() writeLines("jibberish", file(out.file2)) book6 <- expect_error( readASCII( tutorial.AddressBook, file(out.file2))) ## Verify that we get an exception if we forget the file() and thus treat the ## path as a protobuf string. expect_error( readASCII( tutorial.AddressBook, out.file2)) incomplete.msg <- new(tutorial.Person, name="Murray", email="murray@stokely.org") tmp.file <- tempfile() writeLines(incomplete.msg$toTextFormat(), file(tmp.file)) expect_true(!incomplete.msg$isInitialized()) ## Verify we normally get an exception if we try to read an incomplete ASCII protocol buffer expect_error(tutorial.Person$readASCII(file(tmp.file))) ## Verify we can however read it if we set partial=TRUE. new.msg <- tutorial.Person$readASCII(file(tmp.file), TRUE) expect_equal(incomplete.msg$name, new.msg$name) #} ## Ensure we do not try to run JSON tests on older ProtoBuf versions ## Support starts with version 3. isProto2 <- (RProtoBuf:::getProtobufLibVersion() < 3000000) if (isProto2) exit_file("Skipping JSON tests with ProtoBuf2") # These tests are similar to the group of tests covered with test.ascii above. #test.json <- function() { ## Output in JSON format to a temporary file out.file <- tempfile() writeLines( book$toJSON(), file(out.file)) ## Verify that we can read back in the message from a text file. book2 <- readJSON( tutorial.AddressBook, file(out.file, "rb")) expect_equal(as.character(book), as.character(book2) ) ## Verify that we can read in messages from unopened connections. book3 <- readJSON( tutorial.AddressBook, file(out.file)) expect_equal(as.character(book), as.character(book3) ) ## Verify that we get an exception if we try to read from a text connection. ## (better than silently getting an empty proto.) book4 <- expect_error( readJSON( tutorial.AddressBook, file(out.file, "rt"))) ## Verify that we get an exception if the file is not parseable. out.file2 <- tempfile() writeLines("jibberish", file(out.file2)) book6 <- expect_error( readJSON( tutorial.AddressBook, file(out.file2))) ## Verify that we get an exception if we forget the file() and thus treat the ## path as a protobuf string. expect_error( readJSON( tutorial.AddressBook, out.file2)) #} RProtoBuf/inst/tinytest/test_enums.R0000644000176200001440000000462013617260253017314 0ustar liggesusers# Copyright 2011 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.enums <- function() { ProtoFormat <- P("tutorial.Person") ## value(..) returns an EnumValueDescriptor object expect_equal(name(value(ProtoFormat$PhoneType, index=1)), "MOBILE") expect_equal(name(value(ProtoFormat$PhoneType, index=1), TRUE), "tutorial.Person.MOBILE") expect_equal(number(value(ProtoFormat$PhoneType, index=1)), 0) expect_true(inherits(enum_type(value(ProtoFormat$PhoneType, index=1)), "EnumDescriptor")) expect_true(inherits(asMessage(value(ProtoFormat$PhoneType, index=1)), "Message")) ## Now check the '$' interfaces expect_equal(name(value(ProtoFormat$PhoneType, index=1)), value(ProtoFormat$PhoneType, index=1)$name()) expect_equal(number(value(ProtoFormat$PhoneType, index=1)), value(ProtoFormat$PhoneType, index=1)$number()) expect_equal(name(value(ProtoFormat$PhoneType, index=2)), "HOME") expect_equal(length(ProtoFormat$PhoneType), 3) expect_true(has(ProtoFormat$PhoneType, "WORK")) expect_true(!has(ProtoFormat$PhoneType, "NONEXISTANT")) ## Verify we can subset the EnumDescriptor class expect_equal(ProtoFormat$PhoneType[["WORK"]], 2) expect_equal(ProtoFormat$PhoneType[["MOBILE"]], 0) ## Verify that invalid indices are returned as NULL. expect_true(is.null(value(ProtoFormat$PhoneType, index=900))) ## Verify that we import top-level enums from .proto files. if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } expect_true(inherits(P("protobuf_unittest.ForeignEnum"), "EnumDescriptor")) #} RProtoBuf/inst/tinytest/test_extensions.R0000644000176200001440000000731213617260253020365 0ustar liggesusers# Copyright 2013 Google Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. library(RProtoBuf) #test.extension <- function() { if (!exists("protobuf_unittest.TestAllTypes", "RProtoBuf:DescriptorPool")) { unittest.proto.file <- system.file("tinytest", "data", "unittest.proto", package="RProtoBuf") readProtoFiles(file=unittest.proto.file) } expect_true(inherits(protobuf_unittest.optional_uint32_extension, "FieldDescriptor")) ## Verify we can pull in other extensions with P() expect_true(inherits(P("protobuf_unittest.optional_uint32_extension"), "FieldDescriptor")) ## Test setting and getting singular extensions. test <- new(protobuf_unittest.TestAllExtensions) test$setExtension(protobuf_unittest.optional_int32_extension, as.integer(1)) expect_equal(test$getExtension(protobuf_unittest.optional_int32_extension), as.integer(1)) ## Unset extensions should return NULL. expect_equal(test$getExtension(protobuf_unittest.optional_double_extension), NULL) ## Test setting and getting repeated extensions. expect_equal(test$getExtension(protobuf_unittest.repeated_int32_extension), NULL) test$setExtension(protobuf_unittest.repeated_int32_extension, 1:10) expect_equal(test$getExtension(protobuf_unittest.repeated_int32_extension), 1:10) ## Test nested extensions. expect_equal(test$getExtension(protobuf_unittest.TestNestedExtension.test), NULL) test$setExtension(protobuf_unittest.TestNestedExtension.test, "foo") expect_equal(test$getExtension(protobuf_unittest.TestNestedExtension.test), "foo") ## Test setting and getting enums. test$setExtension(protobuf_unittest.optional_nested_enum_extension, protobuf_unittest.TestAllTypes.NestedEnum$BAR) ## Test foreign message extensions foo <- new(protobuf_unittest.ForeignMessage) foo$c <- 3 test$setExtension(protobuf_unittest.optional_foreign_message_extension, foo) expect_equal(test$getExtension(protobuf_unittest.optional_foreign_message_extension)$c, 3) # This causes an Rcpp exception, but not an R stop error as of my # version of Rcpp, so we can't checkError unfortunately, but we # can at least make sure it doesn't crash R. # TODO(edd): Commented out now # test$setExtension(protobuf_unittest.optional_nested_enum_extension, 9) ## Test nested message extensions. tmp <- new( protobuf_unittest.TestAllTypes.NestedMessage ) tmp$bb <- 3 test$setExtension(protobuf_unittest.optional_nested_message_extension, tmp) expect_equal(test$getExtension(protobuf_unittest.optional_nested_message_extension)$bb, 3) ## Check that we do something sensible if invalid field descriptors are passed expect_error(test$getExtension(protobuf_unittest.TestAllExtensions)) expect_error(test$setExtension(protobuf_unittest.TestAllExtensions, 3)) ## Check that we don't CHECK fail in C++, but instead give a reasonable ## error message if incorrect extensions types are provided. expect_error(test$getExtension(protobuf_unittest.my_extension_string)) #} RProtoBuf/inst/tinytest/test_serialize_pb.R0000644000176200001440000000342113617260253020633 0ustar liggesusers## Jeroen Ooms and Dirk Eddelbuettel library(RProtoBuf) #test.serialize_pb <- function() { ##verify that rexp.proto is loaded RProtoBuf:::pb(rexp.REXP) ##serialize a nested list x <- list(foo=cars, bar=Titanic) expect_equal(unserialize_pb(serialize_pb(x, NULL)), x) ##a bit of everything, copied from jsonlite package set.seed('123') myobject <- list( mynull = NULL, mycomplex = lapply(eigen(matrix(-rnorm(9),3)), round, 3), mymatrix = round(matrix(rnorm(9), 3),3), myint = as.integer(c(1,2,3)), mydf = cars, mylist = list(foo='bar', 123, NA, NULL, list('test')), mylogical = c(TRUE,FALSE,NA), mychar = c('foo', NA, 'bar'), myemptychar = character(0), somemissings = c(1,2,NA,NaN,5, Inf, 7 -Inf, 9, NA), myrawvec = charToRaw('This is a test'), myS4 = asS4("test") ) expect_equal(unserialize_pb(serialize_pb(myobject, NULL)), myobject) #} #test.serialize_pb.alldatasets <- function() { datasets <- as.data.frame(data(package="datasets")$results) datasets$name <- sub("\\s+.*$", "", datasets$Item) encoded.datasets <- sapply(datasets$name, function(x) serialize_pb(get(x), NULL)) unserialized.datasets <- sapply(encoded.datasets, unserialize_pb) expect_true(all(sapply(names(unserialized.datasets), function(name) identical(get(name), unserialized.datasets[[name]])))) #} ## this was issue #37 reported and fixed by Jeffrey Shen #test.serialize.sublist <- function() { x <- packageVersion("RProtoBuf") expect_identical(x, unserialize_pb(serialize_pb(x, NULL)), info="checking sublists") #} t#est.serialize.posixlt <- function() { x <- as.POSIXlt("1970-01-01T00:00:00Z") expect_identical(x, unserialize_pb(serialize_pb(x, NULL)), info="checking posixlt") #} RProtoBuf/inst/opencpu/0000755000176200001440000000000012440004312014550 5ustar liggesusersRProtoBuf/inst/opencpu/ocpu-getdata.py0000644000176200001440000000065212440004312017502 0ustar liggesusers#!/usr/bin/env python # Jeroen Ooms # # HTTPS+ProtoBuf RPC POC using OpenCPU # Script below downloads MASS::Animals using protobuf import urllib2; from rexp_pb2 import *; #HTTP GET req = urllib2.Request('https://public.opencpu.org/ocpu/library/MASS/data/Animals/pb'); res = urllib2.urlopen(req); #parse output pb msg = REXP(); msg.ParseFromString(res.read()); #the return value is a double vector in this case print(msg); RProtoBuf/inst/opencpu/ocpu-getdata.R0000644000176200001440000000044212440004312017250 0ustar liggesusers# Jeroen Ooms # # HTTPS+ProtoBuf RPC POC using OpenCPU # Script below downloads MASS::Animals using protobuf library(RProtoBuf) library(httr) req <- GET ('https://public.opencpu.org/ocpu/library/MASS/data/Animals/pb') output <- unserialize_pb(req$content) identical(output, MASS::Animals) RProtoBuf/inst/opencpu/readme.txt0000644000176200001440000000017312440004312016547 0ustar liggesusersThese scripts illustrate how protocol buffers can be used as a data interchange format or as the basis of an RPC protocol. RProtoBuf/inst/opencpu/ocpu-rpc.R0000644000176200001440000000116112440004312016422 0ustar liggesusers# Jeroen Ooms # # HTTPS+ProtoBuf RPC POC using OpenCPU # The call below maps to: do.call(stats::rnorm, list(n=42, mean=100)) # !! This requires httr (>= 0.2.99). Version 0.2 has a bug. # library(devtools) # install_github("httr") # Actual code library(RProtoBuf) library(httr) args <- list(n=42, mean=100) payload <- serialize_pb(args, NULL) req <- POST ( url = "https://public.opencpu.org/ocpu/library/stats/R/rnorm/pb", body = payload, add_headers( "Content-Type" = "application/x-protobuf" ) ) #This is the output of stats::rnorm(n=42, mean=100) output <- unserialize_pb(req$content) print(length(output)) RProtoBuf/inst/opencpu/rexp_pb2.py0000644000176200001440000002350412440004312016647 0ustar liggesusers# Generated by the protocol buffer compiler. DO NOT EDIT! from google.protobuf import descriptor from google.protobuf import message from google.protobuf import reflection from google.protobuf import descriptor_pb2 # @@protoc_insertion_point(imports) DESCRIPTOR = descriptor.FileDescriptor( name='rexp.proto', package='rexp', serialized_pb='\n\nrexp.proto\x12\x04rexp\"\xb3\x03\n\x04REXP\x12!\n\x06rclass\x18\x01 \x02(\x0e\x32\x11.rexp.REXP.RClass\x12\x15\n\trealValue\x18\x02 \x03(\x01\x42\x02\x10\x01\x12\x14\n\x08intValue\x18\x03 \x03(\x11\x42\x02\x10\x01\x12)\n\x0c\x62ooleanValue\x18\x04 \x03(\x0e\x32\x13.rexp.REXP.RBOOLEAN\x12!\n\x0bstringValue\x18\x05 \x03(\x0b\x32\x0c.rexp.STRING\x12\x10\n\x08rawValue\x18\x06 \x01(\x0c\x12!\n\x0c\x63omplexValue\x18\x07 \x03(\x0b\x32\x0b.rexp.CMPLX\x12\x1d\n\trexpValue\x18\x08 \x03(\x0b\x32\n.rexp.REXP\x12\x10\n\x08\x61ttrName\x18\x0b \x03(\t\x12\x1d\n\tattrValue\x18\x0c \x03(\x0b\x32\n.rexp.REXP\"f\n\x06RClass\x12\n\n\x06STRING\x10\x00\x12\x07\n\x03RAW\x10\x01\x12\x08\n\x04REAL\x10\x02\x12\x0b\n\x07\x43OMPLEX\x10\x03\x12\x0b\n\x07INTEGER\x10\x04\x12\x08\n\x04LIST\x10\x05\x12\x0b\n\x07LOGICAL\x10\x06\x12\x0c\n\x08NULLTYPE\x10\x07\" \n\x08RBOOLEAN\x12\x05\n\x01\x46\x10\x00\x12\x05\n\x01T\x10\x01\x12\x06\n\x02NA\x10\x02\"-\n\x06STRING\x12\x0e\n\x06strval\x18\x01 \x01(\t\x12\x13\n\x04isNA\x18\x02 \x01(\x08:\x05\x66\x61lse\"&\n\x05\x43MPLX\x12\x0f\n\x04real\x18\x01 \x01(\x01:\x01\x30\x12\x0c\n\x04imag\x18\x02 \x02(\x01\x32(\n\x04ocpu\x12 \n\x06\x64oCall\x12\n.rexp.REXP\x1a\n.rexp.REXP') _REXP_RCLASS = descriptor.EnumDescriptor( name='RClass', full_name='rexp.REXP.RClass', filename=None, file=DESCRIPTOR, values=[ descriptor.EnumValueDescriptor( name='STRING', index=0, number=0, options=None, type=None), descriptor.EnumValueDescriptor( name='RAW', index=1, number=1, options=None, type=None), descriptor.EnumValueDescriptor( name='REAL', index=2, number=2, options=None, type=None), descriptor.EnumValueDescriptor( name='COMPLEX', index=3, number=3, options=None, type=None), descriptor.EnumValueDescriptor( name='INTEGER', index=4, number=4, options=None, type=None), descriptor.EnumValueDescriptor( name='LIST', index=5, number=5, options=None, type=None), descriptor.EnumValueDescriptor( name='LOGICAL', index=6, number=6, options=None, type=None), descriptor.EnumValueDescriptor( name='NULLTYPE', index=7, number=7, options=None, type=None), ], containing_type=None, options=None, serialized_start=320, serialized_end=422, ) _REXP_RBOOLEAN = descriptor.EnumDescriptor( name='RBOOLEAN', full_name='rexp.REXP.RBOOLEAN', filename=None, file=DESCRIPTOR, values=[ descriptor.EnumValueDescriptor( name='F', index=0, number=0, options=None, type=None), descriptor.EnumValueDescriptor( name='T', index=1, number=1, options=None, type=None), descriptor.EnumValueDescriptor( name='NA', index=2, number=2, options=None, type=None), ], containing_type=None, options=None, serialized_start=424, serialized_end=456, ) _REXP = descriptor.Descriptor( name='REXP', full_name='rexp.REXP', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( name='rclass', full_name='rexp.REXP.rclass', index=0, number=1, type=14, cpp_type=8, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='realValue', full_name='rexp.REXP.realValue', index=1, number=2, type=1, cpp_type=5, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), descriptor.FieldDescriptor( name='intValue', full_name='rexp.REXP.intValue', index=2, number=3, type=17, cpp_type=1, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), descriptor.FieldDescriptor( name='booleanValue', full_name='rexp.REXP.booleanValue', index=3, number=4, type=14, cpp_type=8, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='stringValue', full_name='rexp.REXP.stringValue', index=4, number=5, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='rawValue', full_name='rexp.REXP.rawValue', index=5, number=6, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='complexValue', full_name='rexp.REXP.complexValue', index=6, number=7, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='rexpValue', full_name='rexp.REXP.rexpValue', index=7, number=8, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='attrName', full_name='rexp.REXP.attrName', index=8, number=11, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='attrValue', full_name='rexp.REXP.attrValue', index=9, number=12, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), ], extensions=[ ], nested_types=[], enum_types=[ _REXP_RCLASS, _REXP_RBOOLEAN, ], options=None, is_extendable=False, extension_ranges=[], serialized_start=21, serialized_end=456, ) _STRING = descriptor.Descriptor( name='STRING', full_name='rexp.STRING', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( name='strval', full_name='rexp.STRING.strval', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='isNA', full_name='rexp.STRING.isNA', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=True, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), ], extensions=[ ], nested_types=[], enum_types=[ ], options=None, is_extendable=False, extension_ranges=[], serialized_start=458, serialized_end=503, ) _CMPLX = descriptor.Descriptor( name='CMPLX', full_name='rexp.CMPLX', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( name='real', full_name='rexp.CMPLX.real', index=0, number=1, type=1, cpp_type=5, label=1, has_default_value=True, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='imag', full_name='rexp.CMPLX.imag', index=1, number=2, type=1, cpp_type=5, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), ], extensions=[ ], nested_types=[], enum_types=[ ], options=None, is_extendable=False, extension_ranges=[], serialized_start=505, serialized_end=543, ) _REXP.fields_by_name['rclass'].enum_type = _REXP_RCLASS _REXP.fields_by_name['booleanValue'].enum_type = _REXP_RBOOLEAN _REXP.fields_by_name['stringValue'].message_type = _STRING _REXP.fields_by_name['complexValue'].message_type = _CMPLX _REXP.fields_by_name['rexpValue'].message_type = _REXP _REXP.fields_by_name['attrValue'].message_type = _REXP _REXP_RCLASS.containing_type = _REXP; _REXP_RBOOLEAN.containing_type = _REXP; DESCRIPTOR.message_types_by_name['REXP'] = _REXP DESCRIPTOR.message_types_by_name['STRING'] = _STRING DESCRIPTOR.message_types_by_name['CMPLX'] = _CMPLX class REXP(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _REXP # @@protoc_insertion_point(class_scope:rexp.REXP) class STRING(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _STRING # @@protoc_insertion_point(class_scope:rexp.STRING) class CMPLX(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _CMPLX # @@protoc_insertion_point(class_scope:rexp.CMPLX) # @@protoc_insertion_point(module_scope) RProtoBuf/inst/opencpu/ocpu-rpc.py0000644000176200001440000000206012440004312016650 0ustar liggesusers#!/usr/bin/env python # Jeroen Ooms # # HTTPS+ProtoBuf RPC POC using OpenCPU # The call below maps to: do.call(stats::rnorm, list(n=42, mean=100)) import urllib2; from rexp_pb2 import *; #create the post payload, i.e. list(n=42, mean=100) payload = REXP( rclass = 5, rexpValue = [ REXP(rclass = 2, realValue = [42]), REXP(rclass = 2, realValue = [100]) ], attrName = [ "names" ], attrValue = [ REXP(rclass = 0, stringValue = [STRING(strval="n"), STRING(strval="mean")]) ] ); #HTTP POST req = urllib2.Request( 'https://public.opencpu.org/ocpu/library/stats/R/rnorm/pb', data = payload.SerializeToString(), headers = { 'Content-type': 'application/x-protobuf' } ); res = urllib2.urlopen(req); #parse output pb msg = REXP(); msg.ParseFromString(res.read()); #the return value is a double vector in this case print(msg.realValue); ##### To debug: #f = open("payload.msg", "wb") #f.write(payload.SerializeToString()) #f.close() # # Then do in R do: # library(RProtoBuf) # payload <- unserialize_pb("payload.msg") # do.call(stats::rnorm, payload)RProtoBuf/inst/proto/0000755000176200001440000000000012754736105014266 5ustar liggesusersRProtoBuf/inst/proto/helloworld.proto0000644000176200001440000000054012754736105017525 0ustar liggesusers// mark as Protocol Buffers v2 format syntax = "proto2"; package rprotobuf; option java_package = "org.rproject.rprotobuf"; option java_outer_classname = "HelloWorld"; message HelloWorldRequest{} message HelloWorldResponse{ required string message = 1; } service HelloWorldService{ rpc HelloWorld(HelloWorldRequest) returns(HelloWorldResponse); } RProtoBuf/inst/proto/addressbook.proto0000644000176200001440000000117412754736105017656 0ustar liggesusers// mark as Protocol Buffers v2 format syntax = "proto2"; package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; extensions 100 to 199; } message AddressBook { repeated Person person = 1; } service EchoService { rpc Echo (Person) returns (Person); } RProtoBuf/inst/proto/rexp.proto0000644000176200001440000000243512754736105016335 0ustar liggesusers// Originally written by Saptarshi Guha for RHIPE (http://www.rhipe.org) // Released under Apache License 2.0, and reused with permission here // Extended in November 2014 with new types to support encoding // language, environment, and function types from R. // mark as Protocol Buffers v2 format syntax = "proto2"; package rexp; option java_package = "org.godhuli.rhipe"; option java_outer_classname = "REXPProtos"; // TODO(mstokely): Refine this using the new protobuf 2.6 oneof field // for unions. message REXP { enum RClass { STRING = 0; RAW = 1; REAL = 2; COMPLEX = 3; INTEGER = 4; LIST = 5; LOGICAL = 6; NULLTYPE = 7; NATIVE = 8; } enum RBOOLEAN { F=0; T=1; NA=2; } required RClass rclass = 1; repeated double realValue = 2 [packed=true]; repeated sint32 intValue = 3 [packed=true]; repeated RBOOLEAN booleanValue = 4; repeated STRING stringValue = 5; optional bytes rawValue = 6; repeated CMPLX complexValue = 7; repeated REXP rexpValue = 8; repeated string attrName = 11; repeated REXP attrValue = 12; optional bytes nativeValue = 13; } message STRING { optional string strval = 1; optional bool isNA = 2 [default=false]; } message CMPLX { optional double real = 1 [default=0]; required double imag = 2; } RProtoBuf/inst/NEWS.Rd0000644000176200001440000005227615130732757014202 0ustar liggesusers\name{NEWS} \title{News for Package \pkg{RProtoBuf}} \newcommand{\ghpr}{\href{https://github.com/eddelbuettel/rprotobuf/pull/#1}{##1}} \newcommand{\ghit}{\href{https://github.com/eddelbuettel/rprotobuf/issues/#1}{##1}} \section{Changes in RProtoBuf version 0.4.25 (2026-01-11)}{ \itemize{ \item Several routine updates to continuous integration script \item Include \code{ObjectTable.h} instead of \code{Callback.h} to accommodate R 4.6.0 \item Switch vignettes to \code{Rcpp::asis} driver, update references } } \section{Changes in RProtoBuf version 0.4.24 (2025-03-31)}{ \itemize{ \item Add bindings to EnumValueDescriptor::name (Mike Kruskal in \ghpr{108}) \item Replace EXTPTR_PTR with R_ExternalPtrAddr (Dirk) } } \section{Changes in RProtoBuf version 0.4.23 (2025-01-14)}{ \itemize{ \item More robust tests using \code{toTextFormat()} (Xufei Tan in \ghpr{99} addressing \ghit{98}) \item Various standard packaging updates to CI and badges (Dirk) \item Improvements to string construction in error messages (Michael Chirico in \ghpr{102} and \ghpr{103}) \item Accommodate ProtoBuf 26.x and later (Matteo Gianella in \ghpr{104}) \item Accommodate ProtoBuf 6.30.9 and later (Lev Kandel in \ghpr{106}) \item Correct \code{bashism} issues in \code{configure.ac} (Dirk) } } \section{Changes in RProtoBuf version 0.4.22 (2024-01-20)}{ \itemize{ \item Apply patch by Tomas Kalibera to support updated rtools to build with newer ProtoBuf releases on windows } } \section{Changes in RProtoBuf version 0.4.21 (2023-12-13)}{ \itemize{ \item Package now builds with ProtoBuf >= 22.x thanks to Matteo Gianella (\ghpr{93} addressing \ghit{92}). \item An Alpine 3.19-based workflow was added to test this in continuous integration thanks to a suggestion by Sebastian Meyer. \item A large number of old-style \code{.Call} were updated (\ghpr{96}). \item Several packaging, dcoumentation and testing items were updated. } } \section{Changes in RProtoBuf version 0.4.20 (2022-11-02)}{ \itemize{ \item Two function prototype were updated for \code{clang-15}. \item GitHub Actions were updated to checkout version 3. \item One more http:// URL was updated to https:// \item The package compilation is now done with C++17 as the Protocol Buffer headers require it (and \code{clang-15} nags otherwise). } } \section{Changes in RProtoBuf version 0.4.19 (2022-05-06)}{ \itemize{ \item Small cleanups to repository \item Raise minimum Protocol Buffers version to 3.3 (closes \ghit{83}) \item Update package version display, added to startup message \item Expose TextFormat API (Michael Chirico in \ghpr{88} closing \ghit{87}) \item Add missing explicit \code{std::} on seven \code{string} instances in one file (closes \ghit{89}) } } \section{Changes in RProtoBuf version 0.4.18 (2021-12-15)}{ \itemize{ \item Support \code{string_view} in \code{FindMethodByName()} (Adam Cozzette in \ghpr{72}). \item CI use was updated first at Travis, later at GitHub and now uses \href{https://eddelbuettel.github.io/r-ci/}{r-ci} (Dirk in \ghpr{74} and (parts of) \ghpr{76}). \item The (to the best of our knowledge) unused minimal RPC mechanism has been removed, retiring one method and one class as well as the import of the \pkg{RCurl} package (Dirk in \ghpr{76}). \item The \code{toJSON()} method supports two (upstream) formatting toggles (Vitali Spinu in \ghpr{79} with minor edit by Dirk). \item Windows UCRT builds are now supported (Jeroen in \ghpr{81}, Dirk and Tomas Kalibera in \ghpr{82}). } } \section{Changes in RProtoBuf version 0.4.17 (2020-03-26)}{ \itemize{ \item Condition use of \code{ByteSizeLong()} on building with ProtoBuf 3.6.0 or later (Dirk in \ghpr{71} fixing \ghit{70}). \item The JSON unit tests are skipped if ProtoBuf 2.* is used (Dirk, also \ghpr{71}). \item The \code{configure} script now extracts the version from the \code{DESCRIPTION} file (Dirk, also \ghpr{71}). } } \section{Changes in RProtoBuf version 0.4.16 (2020-03-19)}{ \itemize{ \item Added support for parsing and printing JSON (Siddhartha Bagaria in \ghpr{68} closing wishlist \ghit{61}). \item Switched \code{ByteSize()} to \code{ByteSizeLong()} to appease \code{clang} (Dirk). } } \section{Changes in RProtoBuf version 0.4.15 (2020-02-08)}{ \itemize{ \item Repeated Message and Group objects are now returned correctly (Dirk in \ghpr{64} fixing \ghit{62}). \item The unit tests are now run by \pkg{tinytest} (Dirk in \ghpr{65}). \item The vignettes are now included pre-made (Dirk in \ghpr{67}). } } \section{Changes in RProtoBuf version 0.4.14 (2019-06-30)}{ \itemize{ \item An \code{all.equal.Message} method was added to avoid a fallback to the generic (Jarod Meng in \ghpr{54} fixing \ghit{53}) \item Recursive fields now handled by \code{identical()} (Jarod Meng in \ghpr{57} fixing \ghit{56}) \item Update Windows build infrastructure (Jeroen) } } \section{Changes in RProtoBuf version 0.4.13 (2018-11-03)}{ \itemize{ \item The \code{configure} setup is more robust with respect to the C++ setup (CRAN request). \item \code{POSIXlt} elements are now properly serialized too (Jeffrey Shen in \ghpr{48} and \ghpr{50} fixing \ghit{47}) \item Added two Dockerfiles for continuous integration and use; see \href{https://hub.docker.com/u/rprotobuf}{this url} for more. } } \section{Changes in RProtoBuf version 0.4.12 (2018-07-11)}{ \itemize{ \item Recursive serialization of sublists returning themselves is now recognised (Jeffrey Shen in \ghpr{38} fixing \ghit{37}) \item New function \code{readProtoFiles2} to be consistent with \code{protoc} (Siddhartha Bagaria in \ghpr{40} fixing \ghit{39}) \item Update Windows binary library used (Maciej Lach and Jeroen Ooms in \ghpr{42} and follow-up commits) \item New unit tests for new functionality (Siddhartha Bagaria in \ghpr{45}) } } \section{Changes in RProtoBuf version 0.4.11 (2017-10-03)}{ \itemize{ \item The \code{RProtoBuf-intro} and \code{RProtoBuf-quickref} vignettes were converted to Rmarkdown using the templates and style file from the pinp package. \item A few minor internal upgrades } } \section{Changes in RProtoBuf version 0.4.10 (2017-08-13)}{ \itemize{ \item More careful operation in deserializer checking for a valid class attribute (Jeffey Shen in \ghpr{29} fixing \ghit{28}) \item At the request of CRAN, correct one \code{.Call()} argument to \code{PACKAGE=}; update routine registration accordingly } } \section{Changes in RProtoBuf version 0.4.9 (2017-03-06)}{ \itemize{ \item A new file \code{init.c} was added with calls to \code{R_registerRoutines()} and \code{R_useDynamicSymbols()} \item Symbol registration is enabled in \code{useDynLib} \item Several missing \code{PACKAGE=} arguments were added to the corresponding \code{.Call} invocations \item Two (internal) C++ functions were renamed with suffix \code{_cpp} to disambiguate them from R functions with the same name \item All of above were part of \ghpr{26} \item Some editing corrections were made to the introductory vignette (David Kretch in \ghpr{25}) \item The `configure.ac` file was updated, and renamed from the older converntion `configure.in`, along with `src/Makevars`. (PR \ghpr{24} fixing \ghit{23}) } } \section{Changes in RProtoBuf version 0.4.8 (2017-01-17)}{ \itemize{ \item Windows builds now use the proto3 library as well (PR \ghpr{21} fixing \ghit{20}) } } \section{Changes in RProtoBuf version 0.4.7 (2016-10-27)}{ \itemize{ \item At the request of CRAN, two documentation instances referring to the Omegehat repository were updated to \url{https://omegahat.net/} } } \section{Changes in RProtoBuf version 0.4.6 (2016-09-08)}{ \itemize{ \item Support for serializing zero-length objects was added (PR \ghpr{18} addressing \ghit{13}) \item S4 objects are natively encoded (also PR \ghpr{18}) \item The vignette based on the JSS paper no longer uses a macro available only with the R-devel version of jss.cls, and hence builds on all R versions } } \section{Changes in RProtoBuf version 0.4.5 (2016-08-29)}{ \itemize{ \item Support for version 3 of the Protcol Buffers API \item Added 'syntax = "proto2";' to all proto files (PR \ghpr{17}) \item Updated Travis CI script to test against both versions 2 and 3 using custom-built .deb packages of version 3 (PR \ghpr{16}) \item Improved build system with support for custom CXXFLAGS (Craig Radcliffe in PR \ghpr{15}) } } \section{Changes in RProtoBuf version 0.4.4 (2016-07-10)}{ \itemize{ \item New vignette based on JSS publication (v71 i02) \item Some documentation enhancements were made, as well as other minor cleanups to file modes and operations \item Unit-test vignette no longer writes to \code{/tmp} per CRAN request \item The new Windows toolchain (based on g++ 4.9.*) is supported } } \section{Changes in RProtoBuf version 0.4.3 (2015-08-25)}{ \itemize{ \item Declare additional imports from \pkg{methods} in \code{NAMESPACE}. \item Travis CI tests now run faster as all CRAN dependencies are installed as binaries. \item The \code{tools/winlibs.R} script now tests for R (< 3.3.0) before calling the (soon-to-be phased out) \code{setInternet2()} function. \item Several small edits were made to \code{DESCRIPTION} to clarify library dependencies, provide additonal references and conform to now-current R packaging standards. } } \section{Changes in RProtoBuf version 0.4.2 (2014-12-10)}{ \itemize{ \item Address changes suggested by anonymous reviewers for our Journal of Statistical Software submission. \item Make \code{Descriptor} and \code{EnumDescriptor} objects subsettable with "\code{[[}". \item Add \code{length()} method for \code{Descriptor} objects. \item Add \code{names()} method for \code{Message}, \code{Descriptor}, and \code{EnumDescriptor} objects. \item Clarify order of returned list for descriptor objects in \code{as.list} documentation. \item Correct the definition of \code{as.list} for \code{EnumDescriptors} to return a proper list instead of a named vector. \item Update the default print methods to use \code{cat()} with \code{fill=TRUE} instead of \code{show()} to eliminate the confusing \code{[1]} since the classes in \pkg{RProtoBuf} are not vectorized. \item Add support for serializing function, language, and environment objects by falling back to R's native serialization with \code{serialize_pb} and \code{unserialize_pb} to make it easy to serialize into a Protocol Buffer all of the more than 100 datasets which come with R. \item Use \code{normalizePath} instead of creating a temporary file with \code{file.create} when getting absolute path names. \item Add unit tests for all of the above. } } \section{Changes in RProtoBuf version 0.4.1 (2014-03-25)}{ \itemize{ \item Document and add a test for the deprecated group functionality. \item Add a \code{CITATION} file pointing to the arXiv.org preprint. \item Fix a bug in the \code{show} method for \code{EnumDescriptor} types. \item Import all top-level enums from imported \code{.proto} files. \item Removed duplicate enum value type from the unit tests that caused problems with the most recent libprotobuf-2.5. (without option allow_alias). } } \section{Changes in RProtoBuf version 0.4.0 (2014-01-14)}{ \itemize{ \item Changes to support CRAN builds for MS Windows. \item Added functions \code{serialize_pb}, \code{unserialize_pb}, and \code{can_serialize_pb} plus documentation from Jeroen Ooms RProtoBufUtils package. \item New dir \code{inst/python} with some Python examples. \item Added Jeroen Ooms as author. \item Vignettes have been converted to the R 3.0.0 or later use of external vignette builders, no longer need a \code{Makefile} \item Added missing methods to dollar completion list for Message, Descriptor, EnumValueDescriptor, and FileDescriptor classes. \item Add missing export for \code{.DollarNames} EnumValueDescriptor to allow completion on that class. \item Add more than 15 additional pages to the main Intro vignette documenting better all of the S4 classes implemented by RProtoBuf, updating the type mapping tables to take into account 64-bit support, and documenting advanced features such as Extensions. \item Added better error checking in EnumDescriptors to catch the case when wrong types are provided. \item Updated the FileDescriptor \code{name()} method to accept a boolean for full paths just like the generic \code{name()} method. \item Correct a bug that incorrectly dispatched \code{as.character()} when \code{as.list()} was called on Descriptor objects. \item Update FileDescriptor \code{$} dispatch to work properly for the names of fields defined in the FileDescriptor, instead of just returning \code{NULL} even for types returned by \code{$} completion. \item Added a reservation for extension fields in the example tutorial.Person schema. \item Support setting int32 fields with character representations and raise an R-level \code{stop()} error if the provided string can not be parsed as a 32-bit integer, rather than crashing the R instance. \item Update the project TODO file. \item Add better documentation and tests for all of the above. \item Corrected the handling of uint32 and fixed32 types in protocol buffers to ensure that they work with numbers as large as 2^32 - 1, which is larger than an integer can hold in R since R does not have an unsigned integer class. These values are stored as doubles internally now to avoid losing precision. \item Added unit tests to verify behavior of RProtoBuf with extreme values for uint32 types. \item Removed old exception handling code and instead rely on the more modern Rcpp::stop method maintained in Rcpp. \item Add better error messages when setting a repeated field of messages to inform the user which element index was of the wrong type and what the expected type was. \item Add an optional 'partial' argument to readASCII allowing uninitialized message fragments to be read in. \item (internal) Added const qualifiers in more places throughout the C++ code for type safety. \item (internal) Standardize coding conventions of the C++ files and run them through clang-format for consistency. A STYLE file has been submitted to R-Forge with details about the coding standards and how they are enforced with Emacs and clang-format. \item Applied changes suggested by Kevin Ushey to the \code{S4} class handling to support both the currently released \CRANpkg{Rcpp} as well as the currently pending next version. } } \section{Changes in RProtoBuf version 0.3.2 (2013-12-15)}{ \itemize{ \item Fixed a bug that erroneously prevented users from setting raw byte fields in protocol buffers under certain circumstances. \item Give a user friendly error message when seting an extension to a message of the wrong type instead of causing a C++ check failure that terminates the Rsession. \item Change object table lookup slightly to allow users to use the \code{<<-} operator in code using \pkg{RProtoBuf} without hitting a \code{stop()} error in the lookup routine. \item Add missing \code{enum_type} method and improve show method for EnumValueDescriptors. \item Improve documentation and tests for all of the above. \item Rewrote \code{tests/} script calling \CRANpkg{RUnit} tests } } \section{Changes in RProtoBuf version 0.3.1 (2013-09-13)}{ \itemize{ \item Added support for setting and getting 64-bit integer types as character strings of decimal integers to work around R's lack of native 64-bit integer types. \item Added better error handling, documentation, and tests to the extensions support (getExtension and setExtension). \item Add support to P for returning extension descriptors. \item Improved error messages to include field names when invalid fields are specified to protocol buffer messages with new, update, etc. \item Improved configure to detect and pass -std=c++0x if it is available to enable long long 64-bit integer support in Rcpp. \item Improved configure in the case when pkg-config is not available or does not know about the google protocol buffer includes. \item Replaced newly deprecated Rcpp macros with a simplified macro functionality to avoid warnings on the latest development version of Rcpp. } } \section{Changes in RProtoBuf version 0.3 (2013-07-13)}{ \itemize{ \item Added support for Protocol Buffer extensions through the new getExtension and setExtension methods for Message objects, and added top-level extensions to the descriptor pool. \item Added more user-friendly \code{show()} methods for Messages, Descriptors, and other RProtoBuf objects. A common source of confusion on the mailing lists is to confuse Messages and Descriptors. The new \code{show()} methods succinctly display more information about e.g. the number of set fields in a message to make it a little clearer to users what type of object they are working with. \item Added has method for EnumDescriptor objects to test existance of a named constant in an enumeration, and fix a bug in the length method for these objects. \item Added a number method for EnumValueDescriptor objects to return the number of a named enumeration constant directly. \item Improved documentation and unit tests. } } \section{Changes in RProtoBuf version 0.2.6 (2012-10-04)}{ \itemize{ \item Applied several more patches by Murray to \itemize{ \item correct '_' and '__' mismatches in wrapper calls \item update a few manual pages for style, and add examples \item fix a bug where NAs were silently treated as TRUE for logical/bool types \item fix a bug that caused crashes when adding vectors to optional fields \item fix bugs in readASCII that returned empty protocol buffers when the file or connection could not be opened \item distinguish between non-existant and not-set fieldswith has() by returning NULL in the former case. \item fix a bug that caused non-deterministic behavior when setting a repeated message field in a protobuf to a single Message. \item add unit tests for all of the above. } \item Added Murray to Authors: field in DESCRIPTION \item Removed old and unconvincing example on RProtoBuf for storage and serialization in an imagined HighFrequencyFinance context } } \section{Changes in RProtoBuf version 0.2.5 (2012-08-08)}{ \itemize{ \item Applied patches by Murray to \itemize{ \item correctly deal with nested Protocol Buffer definitions, and also add new unit test for this \item test a a protocol buffer for missing required fields before serializing it, also add a unit test \item add a small stylistic fix and examples to the 'add.Rd' manual page } \item Moved inst/doc/ to vignettes/ per newer CRAN Policy } } \section{Changes in RProtoBuf version 0.2.4 (2012-05-15)}{ \itemize{ \item Applied several patches kindly supplied by Murray Stokely to \itemize{ \item properly work with repeated strings \item correct C++ function naming in a few instances \item add an example of ascii export/import of messages } \item Suppport g++-4.7 and stricter #include file checking by adding unistd \item Made small improvements to the startup code } } \section{Changes in RProtoBuf version 0.2.3 (2011-04-12)}{ \itemize{ \item Protect UINT64 and INT64 with '#ifdef RCPP_HAS_LONG_LONG' which itself is valid with either g++ <= 4.4, or newer versions if the -std=c++0x is used \item The documentation Makefile now uses the $R_HOME environment variable \item The documentation Makefile no longer calls clean in the all target } } \section{Changes in RProtoBuf version 0.2.2 (2011-01-11)}{ \itemize{ \item Applied two patches by Murray Stokely which \itemize{ \item correct a typo preventing some functions from being called, \item add bounds checking in call to google protobuf library, \item add a new name method \item add a tiny unit test for the above \item add more graceful error handling \item add support for import patterns other than .proto$, \item add simple reading file that does not exist (exception) test \item add simple repeated field unit test } } } \section{Changes in RProtoBuf version 0.2.1 (2010-10-18)}{ \itemize{ \item Support for raw bytes added thanks to a patch by Koert Kuipers } } \section{Changes in RProtoBuf version 0.2.0 (2010-09-10)}{ \itemize{ \item Second release with numerous internal changes made possible by changes in Rcpp } } \section{Changes in RProtoBuf version 0.1-0 (2010-02-01)}{ \itemize{ \item Initial CRAN release } } RProtoBuf/inst/python/0000755000176200001440000000000012440004312014420 5ustar liggesusersRProtoBuf/inst/python/runtest.sh0000755000176200001440000000040112440004312016456 0ustar liggesusers#!/bin/sh #write some PB data with R Rscript writemsg.R #compile proto file cp -f ../proto/rexp.proto . protoc rexp.proto --python_out=. rm rexp.proto #read with python and print python readmsg.py #cleanup tmp files rm rexp_pb2.py rexp_pb2.pyc rm *.msg RProtoBuf/inst/python/readmsg.py0000644000176200001440000000051212440004312016412 0ustar liggesusers#!/usr/bin/env python # # Simple test script to read a serialized message in python # import rexp_pb2; import glob; messages = glob.glob("*.msg"); for myfile in messages: print("Reading message " + myfile + " ...") f = open(myfile, 'rb') msg = rexp_pb2.REXP(); msg.ParseFromString(f.read()) f.close(); print(msg) del msg RProtoBuf/inst/python/writemsg.R0000644000176200001440000000071312440004312016405 0ustar liggesusers#simple R script to serialize some R objects library(RProtoBuf) #some vectors serialize_pb(c(1,2,pi, NA,NaN,Inf,-Inf), "double.msg") serialize_pb(c(1L, 2L, NA), "integer.msg") serialize_pb(c(TRUE, FALSE, NA), "logical.msg") serialize_pb(c("foo", "bar", NA), "character.msg") serialize_pb(charToRaw("This is a test"), "raw.msg") #lists serialize_pb(list(foo=c(1,2,pi), bar=TRUE, baz="blabla", zoo=NULL), "list.msg") serialize_pb(iris[1:3,], "dataframe.msg") RProtoBuf/tools/0000755000176200001440000000000013505372467013310 5ustar liggesusersRProtoBuf/tools/winlibs.R0000644000176200001440000000071713505372467015107 0ustar liggesusers# Build against protobuf libs compiled with Rtools VERSION <- commandArgs(TRUE) if (!file.exists(sprintf("../windows/protobuf-%s/include/google/protobuf/descriptor.h", VERSION))) { if (getRversion() < "3.3.0") setInternet2() download.file(sprintf("https://github.com/rwinlib/protobuf/archive/v%s.zip", VERSION), "lib.zip", quiet = TRUE) dir.create("../windows", showWarnings = FALSE) unzip("lib.zip", exdir = "../windows") unlink("lib.zip") } RProtoBuf/README.md0000644000176200001440000000470115130732557013425 0ustar liggesusers## RProtoBuf: R Interface to [Google Protocol Buffers](https://protobuf.dev/) [![CI](https://github.com/eddelbuettel/rprotobuf/workflows/ci/badge.svg)](https://github.com/eddelbuettel/rprotobuf/actions?query=workflow%3Aci) [![License](https://eddelbuettel.github.io/badges/GPL2+.svg)](https://www.r-project.org/Licenses/GPL-2) [![CRAN](https://www.r-pkg.org/badges/version/RProtoBuf)](https://cran.r-project.org/package=RProtoBuf) [![Dependencies](https://tinyverse.netlify.app/badge/RProtoBuf)](https://cran.r-project.org/package=RProtoBuf) [![Downloads](https://cranlogs.r-pkg.org/badges/RProtoBuf?color=brightgreen)](https://www.r-pkg.org/pkg/RProtoBuf) [![Last Commit](https://img.shields.io/github/last-commit/eddelbuettel/rprotobuf)](https://github.com/eddelbuettel/rprotobuf) [![JSS](https://img.shields.io/badge/JSS-10.18637%2Fjss.v071.i02-brightgreen)](https://doi.org/10.18637/jss.v071.i02) ### What are Protocol Buffers? A serialization format developed by [Google](https://www.google.com) and used widely within Google, and by numerous other projects. Quoting from the [official website](https://protobuf.dev/): > Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. [Protocol Buffers](https://protobuf.dev/) natively support C++, C#, Go, Java and Python. Many other languages are supported via contributed extensions. This package adds support for [R](https://www.r-project.org). ### Installation You can either install from source via this repo, or install [the CRAN package](https://cran.r-project.org/package=RProtoBuf) the usual way from [R](https://www.r-project.org) via ```r install.packages("RProtoBuf") ``` but do make sure you have the system requirements covered when building from source. Under Debian/Ubuntu you may need ```bash sudo apt-get install protobuf-compiler libprotobuf-dev libprotoc-dev ``` with similar commands on other operating systems or distributions. ### Documentation The package contains two pdf vignettes; the second one corresponds to [our JSS paper](https://doi.org/10.18637/jss.v071.i02). ### Authors Romain Francois, Dirk Eddelbuettel, Murray Stokely and Jeroen Ooms ### License GPL (>= 2) RProtoBuf/build/0000755000176200001440000000000015130744443013240 5ustar liggesusersRProtoBuf/build/vignette.rds0000644000176200001440000000041515130744443015577 0ustar liggesusers‹ĊRAN0Ü&iK*!**!$.|€<U½pİ*\­d]Y ħqRUÜĝ8„mĤ­;‡x=3뙕·DŒ#ˆbÚĈ Z&ô͏HİŜoÖV7úy/ŸTĠX™Bf˘Vu¨aúúI˙ĜĞ|gQžZ.£nĵ¨î}{~‹ÑCİŸÚIw{ŜT2íôż>¨ç:û¤}š#ĉÎuùHœDË÷85"߉-ŝ˙ù$"8rô¸ïÈ9qd²R%rĞjzŻ—+·mĜx‰Ğ‚s^ó -áË ÔêCĈa×Ç÷‹–ĥmżŭ‰òRÔ<“³B4"“–ÎúùRVĈúRProtoBuf/configure0000755000176200001440000050524115130744444014060 0ustar liggesusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for RProtoBuf 0.4.25. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and edd@debian.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='RProtoBuf' PACKAGE_TARNAME='rprotobuf' PACKAGE_VERSION='0.4.25' PACKAGE_STRING='RProtoBuf 0.4.25' PACKAGE_BUGREPORT='edd@debian.org' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_cxx_list= ac_subst_vars='LTLIBOBJS LIBOBJS PKG_LIBS PKG_CPPFLAGS R PROTOC PKGCONFIG ac_ct_CC CFLAGS CC CXXCPP OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CXXCPP CC CFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures RProtoBuf 0.4.25 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/rprotobuf] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of RProtoBuf 0.4.25:";; esac cat <<\_ACEOF Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXXCPP C++ preprocessor CC C compiler command CFLAGS C compiler flags Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF RProtoBuf configure 0.4.25 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_run LINENO # ------------------------ # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status ;; esac fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by RProtoBuf $as_me 0.4.25, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_cxx_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_cxx_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_cxx_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_cxx_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_cxx_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_cxx_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_cxx_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_cxx_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_cxx_list " unistd.h unistd_h HAVE_UNISTD_H" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Ensure C++ is set up as R expects : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then as_fn_error $? "Could not determine R_HOME." "$LINENO" 5 fi CXX=`"${R_HOME}/bin/R" CMD config CXX` CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 printf %s "checking whether the C++ compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 printf %s "checking for C++ compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C++ compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else case e in #( e) CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else case e in #( e) ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 ;; esac fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 ;; esac fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test ${ac_cv_prog_CXXCPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CXX needs to be expanded for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CXXCPP=$CXXCPP ;; esac fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else case e in #( e) CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else case e in #( e) ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 ;; esac fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 ;; esac fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ## simpler alternative to test below: AC_PATH_PROG(PROTOC, protoc) # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PKGCONFIG+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$PKGCONFIG"; then ac_cv_prog_PKGCONFIG="$PKGCONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_PKGCONFIG="yes" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi PKGCONFIG=$ac_cv_prog_PKGCONFIG if test -n "$PKGCONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 printf "%s\n" "$PKGCONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ## use pkg-config for ProtoBuf settings ## if test x"${PKGCONFIG}" = x"yes"; then if pkg-config --exists protobuf; then protobuf_cxxflags=`pkg-config --cflags protobuf` protobuf_libs=`pkg-config --libs protobuf` else protobuf_cxxflags="" protobuf_libs="-lprotobuf" fi else # Add a reasonable default of -lprotobuf if we don't have pkg-config protobuf_cxxflags="" protobuf_libs="-lprotobuf" fi ## And make sure these flags are used for the tests below. CPPFLAGS="${protobuf_cxxflags} ${CPPFLAGS}" CXXFLAGS="${protobuf_cxxflags} ${CXXFLAGS}" ## look for protoc, the ProtoBuf compiler # Extract the first word of "protoc", so it can be a program name with args. set dummy protoc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PROTOC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$PROTOC"; then ac_cv_prog_PROTOC="$PROTOC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_PROTOC="yes" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi PROTOC=$ac_cv_prog_PROTOC if test -n "$PROTOC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PROTOC" >&5 printf "%s\n" "$PROTOC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test x"${PROTOC}" = x"no" ; then echo " Your installation does not appear to have protoc installed. Please make sure that you have a working and complete ProtoBuf installation. " exit 1 fi ## look for protobuf headers -- now use pkg-config which even does minimum version ## ## next two lines break witha autoconf 2.65 :-/ #PROTOBUF_VERSION="2.2.0" #PKG_CHECK_MODULES(ProtoBuf, protobuf >= 2.2.0, , AC_MSG_ERROR(Protobuf version 2.2.0 required)) ## check for header and ability to link ## first for headers Debian has in libprotobuf-dev protobuf_common_header=google/protobuf/stubs/common.h protobuf_common_header_cache_var=`printf "%s\n" "ac_cv_header_$protobuf_common_header" | sed "$as_sed_sh"` ac_header= ac_cache= for ac_item in $ac_header_cxx_list do if test $ac_cache; then ac_fn_cxx_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi as_ac_Header=`printf "%s\n" "ac_cv_header_$protobuf_common_header" | sed "$as_sed_sh"` ac_fn_cxx_check_header_compile "$LINENO" "$protobuf_common_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : else case e in #( e) # If it didn't work, try adding /usr/local directly then trying again { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Protobuf headers not found with default CXXFLAGS and CPPFLAGS, manually trying /usr/local/include" >&5 printf "%s\n" "$as_me: WARNING: Protobuf headers not found with default CXXFLAGS and CPPFLAGS, manually trying /usr/local/include" >&2;} CPPFLAGS="${protobuf_cxxflags} ${CPPFLAGS} -I/usr/local/include" CXXFLAGS="${protobuf_cxxflags} ${CXXFLAGS} -I/usr/local/include -L/usr/local/lib" # unset the cache variable for this particular header # check, so we can check again with different defaults # specified. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Unsetting $protobuf_common_header_cache_var" >&5 printf "%s\n" "$as_me: WARNING: Unsetting $protobuf_common_header_cache_var" >&2;} { eval $protobuf_common_header_cache_var=; unset $protobuf_common_header_cache_var;} as_ac_Header=`printf "%s\n" "ac_cv_header_$protobuf_common_header" | sed "$as_sed_sh"` ac_fn_cxx_check_header_compile "$LINENO" "$protobuf_common_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : else case e in #( e) as_fn_error $? "ERROR: ProtoBuf headers required; use '-Iincludedir' in CXXFLAGS for unusual locations." "$LINENO" 5 ;; esac fi ;; esac fi ## second for headers Debian has in libprotoc-dev ac_fn_cxx_check_header_compile "$LINENO" "google/protobuf/compiler/code_generator.h" "ac_cv_header_google_protobuf_compiler_code_generator_h" "$ac_includes_default" if test "x$ac_cv_header_google_protobuf_compiler_code_generator_h" = xyes then : else case e in #( e) as_fn_error $? "ERROR: ProtoBuf compiler headers required; use '-Iincludedir' in CXXFLAGS for unusual locations." "$LINENO" 5 ;; esac fi ## third check the lib itself #pb_savedlibs="$LIBS" # LIBS="$LIBS -lprotoc -lprotobuf -lpthread" LIBS="$LIBS $protobuf_libs" ## also check for minimum version { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if ProtoBuf version >= 2.2.0" >&5 printf %s "checking if ProtoBuf version >= 2.2.0... " >&6; } if test "$cross_compiling" = yes then : pb_version_ok=yes else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { if (GOOGLE_PROTOBUF_VERSION >= 2001000) { exit (0); } else { exit(1); } } _ACEOF if ac_fn_cxx_try_run "$LINENO" then : pb_version_ok=yes else case e in #( e) pb_version_ok=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi if test x"${pb_version_ok}" = x"no"; then as_fn_error $? "Need ProtoBuf version >= 2.2.0" "$LINENO" 5 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi # Extract the first word of "R", so it can be a program name with args. set dummy R; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_R+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$R"; then ac_cv_prog_R="$R" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_R="yes" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi R=$ac_cv_prog_R if test -n "$R"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $R" >&5 printf "%s\n" "$R" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ## With thanks to Kurt (now set above) #: ${R_HOME=`R RHOME`} #if test -z "${R_HOME}"; then # AC_MSG_ERROR([Could not determine R_HOME.]) #fi #R_CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` #CXXFLAGS="${CXXFLAGS} ${R_CXXFLAGS}" ## now use all these PKG_CPPFLAGS="${PKG_CPPFLAGS} ${CXXFLAGS} ${protobuf_cxxflags}" PKG_LIBS="${PKG_LIBS} ${protobuf_libs}" ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[][ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by RProtoBuf $as_me 0.4.25, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ RProtoBuf config.status 0.4.25 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo " ${PACKAGE_NAME} $PACKAGE_VERSION ================ cflags: ${PKG_CPPFLAGS} libs: ${PKG_LIBS} " RProtoBuf/man/0000755000176200001440000000000014535366057012725 5ustar liggesusersRProtoBuf/man/FileDescriptor-class.Rd0000644000176200001440000000307514535364735017243 0ustar liggesusers\name{FileDescriptor-class} \Rdversion{1.1} \docType{class} \alias{FileDescriptor-class} \alias{as.character,FileDescriptor-method} \alias{toString,FileDescriptor-method} \alias{$,FileDescriptor-method} \alias{show,FileDescriptor-method} \alias{name,FileDescriptor-method} \title{Class "FileDescriptor"} \description{Class "FileDescriptor"} \section{Objects from the Class}{ Objects are usually created using the \code{\link{fileDescriptor}} method } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to a \code{google::protobuf::FileDescriptor} C++ object } \item{\code{package}:}{the package name defined in the file, e.g. 'tutorial'.} \item{\code{filename}:}{the filename of this FileDescriptor} } } \section{Methods}{ \describe{ \item{$}{\code{signature(x = "FileDescriptor")}: used to invoke a pseudo method of the file descriptor or get a top level message, enum or service descriptor} \item{toString}{\code{signature(x = "FileDescriptor" )} : gets the debug string} \item{as.character}{\code{signature(x = "FileDescriptor" )} : gets the debug string} \item{show}{\code{signature(x = "FileDescriptor" )} : prints small text} \item{name}{\code{signature(object = "FileDescriptor" )} : name of the file} } } \author{ Romain Francois } \keyword{classes} \seealso{ \linkS4class{Descriptor} } \examples{ # example proto file supplied with this package desc <- P("tutorial.Person") person <- new(desc) person$fileDescriptor() name(person$fileDescriptor()) # [1] "addressbook.proto" as.character(person$fileDescriptor()) } RProtoBuf/man/sizegets.Rd0000644000176200001440000000047612440004312015030 0ustar liggesusers\name{sizegets} \docType{methods} \alias{size<-} \alias{size<--methods} \alias{size<-,Message-method} \title{Set the size of a field} \description{ Sets the size of a repeated field. } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{ sets the size of a message field } }} \keyword{methods} RProtoBuf/man/is_extension.Rd0000644000176200001440000000056312440004312015677 0ustar liggesusers\name{is_extension-methods} \alias{is_extension} \alias{is_extension-methods} \title{Indicates if a field descriptor is an extension} \description{ Indicates if a field descriptor is an extension } \seealso{ The method is implemented for the \linkS4class{FieldDescriptor} class } \keyword{methods} \examples{ Person <- P( "tutorial.Person" ) is_extension(Person$id) }RProtoBuf/man/Skip-methods.Rd0000644000176200001440000000024312440004312015532 0ustar liggesusers\name{Skip-methods} \docType{methods} \alias{Skip} \alias{Skip-methods} \title{Skips a number of bytes} \description{ Skips a number of bytes } \keyword{methods} RProtoBuf/man/bytesize.Rd0000644000176200001440000000112713776225671015055 0ustar liggesusers\name{bytesize-methods} \docType{methods} \alias{bytesize} \alias{bytesize-methods} \alias{bytesize,Message-method} \title{The number of bytes taken by a message } \description{ The number of bytes taken by a \linkS4class{Message} } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{ The number of bytes the message would take when serialized } }} \keyword{methods} \examples{ message <- new( tutorial.Person, name = "dddd", email = "eeeeeee", id = 1 ) bytesize( message ) \dontshow{ stopifnot( all.equal( bytesize(message), length(serialize(message, NULL ) ) ) ) } } RProtoBuf/man/has.Rd0000644000176200001440000000311613617260253013757 0ustar liggesusers\name{has-methods} \docType{methods} \alias{has} \alias{has-methods} \alias{has,Message-method} \title{Indicates if an object has the given field set} \description{ This generic method, currently implemented for \linkS4class{Message} and \linkS4class{EnumDescriptor} indicates if the message or enum descriptor has the given field set. For messages and non-repeated fields, a call to the \code{HasField} method of the corresponding \code{Message} is issued. For messages and repeated fields, a call to the \code{FieldSize} method is issued, and the message is declared to have the field if the size is greater than 0. \code{NULL} is returned if the descriptor for the message does not contain the given field at all. For EnumDescriptors, a boolean value indicates if the given name is present in the enum definition. } \section{Methods}{ \describe{ \item{has}{\code{signature(object = "Message")}: Indicates if the message has a given field.} \item{has}{\code{signature(object = "EnumDescriptor")}: Indicates if the EnumDescriptor has a given named element.} } } \examples{ unitest.proto.file <- system.file("tinytest", "data", "unittest.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) test <- new(protobuf_unittest.TestAllTypes) test$has("optional_int32") # FALSE test$add("repeated_int32", 1:10) test$has("repeated_int32") # TRUE test$has("nonexistant") # NULL has(protobuf_unittest.TestAllTypes$NestedEnum, "FOO") has(protobuf_unittest.TestAllTypes$NestedEnum, "BAR") has(protobuf_unittest.TestAllTypes$NestedEnum, "XXX") } \keyword{methods} RProtoBuf/man/set.Rd0000644000176200001440000000060112440004312013754 0ustar liggesusers\name{set-methods} \docType{methods} \alias{set} \alias{set-methods} \alias{set,Message-method} \title{set a subset of values of a repeated field of a message} \description{ set a subset of values of a repeated field of a message } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{set a subset of values of a repeated field of a message} }} \keyword{methods} RProtoBuf/man/MethodDescriptor-class.Rd0000644000176200001440000000276312707407313017574 0ustar liggesusers\name{MethodDescriptor-class} \Rdversion{1.1} \docType{class} \alias{MethodDescriptor-class} \alias{as.character,MethodDescriptor-method} \alias{toString,MethodDescriptor-method} \alias{$,MethodDescriptor-method} \alias{$<-,MethodDescriptor-method} \alias{input_type} \alias{input_type-methods} \alias{input_type,MethodDescriptor-method} \alias{output_type} \alias{output_type-methods} \alias{output_type,MethodDescriptor-method} \title{Class "MethodDescriptor"} \description{R representation of Service Descriptors} \section{Objects from the Class}{ TODO } \section{Slots}{ \describe{ \item{\code{pointer}:}{External pointer to a \code{google::protobuf::MethodDescriptor} C++ object } \item{\code{name}:}{fully qualified name of the method} \item{\code{service}:}{fully qualified name of the service that defines this method} } } \section{Methods}{ \describe{ \item{as.character}{\code{signature(x = "MethodDescriptor")}: debug string of the method } \item{toString}{\code{signature(x = "MethodDescriptor")}: debug string of the method} \item{$}{\code{signature(x = "MethodDescriptor")}: ... } \item{$<-}{\code{signature(x = "MethodDescriptor")}: ... } \item{input_type}{\code{signature(object = "MethodDescriptor")}: the \linkS4class{Descriptor} of the input type of the method} \item{output_type}{\code{signature(object = "MethodDescriptor")}: the \linkS4class{Descriptor} of the output type of the method } } } \author{ Romain Francois } \keyword{classes} RProtoBuf/man/BackUp-methods.Rd0000644000176200001440000000041512440004312015772 0ustar liggesusers\name{BackUp-methods} \docType{methods} \alias{BackUp} \alias{BackUp-methods} \title{Backs up a number of bytes from a stream} \description{ Backs up a number of bytes from a stream } \seealso{ \linkS4class{ZeroCopyInputStream} implements BackUp. } \keyword{methods} RProtoBuf/man/asMessage.Rd0000644000176200001440000000144312440004312015076 0ustar liggesusers\name{asMessage} \alias{asMessage} \title{ coerce an object to a protobuf message } \description{ coerce an object to the \linkS4class{Message} class. This is a short-hand to the \link{as} method with the \code{Class} argument set to "Message" } \usage{ asMessage(x, ...) } \arguments{ \item{x}{object to coerce to a protobuf message} \item{\dots}{Passed to \code{\link{as}} } } \value{ a \linkS4class{Message} object } \author{ Romain Francois } \examples{ # coerce a message type descriptor to a message asMessage( tutorial.Person ) # coerce a enum descriptor asMessage( tutorial.Person.PhoneType ) # coerce a field descriptor asMessage( tutorial.Person$email ) # coerce a file descriptor asMessage( fileDescriptor( tutorial.Person ) ) } \keyword{ programming } RProtoBuf/man/ZeroCopyOutputStream-class.Rd0000644000176200001440000000511514535366057020470 0ustar liggesusers\name{ZeroCopyOutputStream-class} \Rdversion{1.1} \docType{class} \alias{ZeroCopyOutputStream-class} \alias{ByteCount,ZeroCopyOutputStream-method} \alias{BackUp,ZeroCopyOutputStream-method} \alias{Next,ZeroCopyOutputStream,raw-method} \alias{$,ZeroCopyOutputStream-method} \alias{WriteRaw} \alias{WriteRaw-methods} \alias{WriteRaw,ZeroCopyOutputStream,raw-method} \alias{WriteString} \alias{WriteString-methods} \alias{WriteString,ZeroCopyOutputStream,character-method} \alias{WriteLittleEndian32} \alias{WriteLittleEndian32-methods} \alias{WriteLittleEndian32,ZeroCopyOutputStream,integer-method} \alias{WriteLittleEndian32,ZeroCopyOutputStream,numeric-method} \alias{WriteLittleEndian32,ZeroCopyOutputStream,raw-method} \alias{WriteLittleEndian64} \alias{WriteLittleEndian64-methods} \alias{WriteLittleEndian64,ZeroCopyOutputStream,integer-method} \alias{WriteLittleEndian64,ZeroCopyOutputStream,numeric-method} \alias{WriteLittleEndian64,ZeroCopyOutputStream,raw-method} \alias{WriteVarint32} \alias{WriteVarint32-methods} \alias{WriteVarint32,ZeroCopyOutputStream,integer-method} \alias{WriteVarint32,ZeroCopyOutputStream,numeric-method} \alias{WriteVarint32,ZeroCopyOutputStream,raw-method} \alias{WriteVarint64} \alias{WriteVarint64-methods} \alias{WriteVarint64,ZeroCopyOutputStream,integer-method} \alias{WriteVarint64,ZeroCopyOutputStream,numeric-method} \alias{WriteVarint64,ZeroCopyOutputStream,raw-method} \title{Virtual Class "ZeroCopyOutputStream" } \description{R wrapper for the ZeroCopyOutputStream c++ class} \section{Objects from the Class}{ This is a virtual class } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{google::protobuf::io::ZeroCopyOutputStream} object} } } \section{Methods}{ \describe{ \item{$}{\code{signature(x="ZeroCopyOutputStream")}: invokes a method} \item{Next}{\code{signature(object="ZeroCopyOutputStream", payload = "raw" )}: push the raw vector into the stream. Returns the number of bytes actually written.} \item{BackUp}{\code{signature(object="ZeroCopyOutputStream")}: Backs up a number of bytes, so that the end of the last buffer returned by \code{Next} is not actually written.} \item{ByteCount}{\code{signature(object="ZeroCopyOutputStream")}: Returns the total number of bytes written since this object was created. } \item{WriteRaw}{\code{signature(object="ZeroCopyOuputStream")}, payload = "raw": write the raw bytes to the stream} } } \author{ Romain Francois } \references{The \code{google::protobuf::io::ZeroCopyOutputStream} C++ class.} \seealso{TODO: add classes that extend} \keyword{classes} RProtoBuf/man/FileInputStream-methods.Rd0000644000176200001440000000075312440004312017705 0ustar liggesusers\name{FileInputStream-methods} \docType{methods} \alias{FileInputStream} \alias{FileInputStream-methods} \alias{FileInputStream,character,integer,logical-method} \title{Creates an FileInputStream} \description{ Constructor for \linkS4class{FileInputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(filename = "character", block_size = "logical", close.on.delete = "logical" )}}{Creates a \linkS4class{FileInputStream} reading from the given file.} }} \keyword{methods} RProtoBuf/man/FileOutputStream-class.Rd0000644000176200001440000000330614535365317017573 0ustar liggesusers\name{FileOutputStream-class} \Rdversion{1.1} \docType{class} \alias{FileOutputStream-class} \alias{close,FileOutputStream-method} \alias{flush,FileOutputStream-method} \alias{GetErrno,FileOutputStream-method} \alias{SetCloseOnDelete,FileOutputStream-method} \title{Class "FileOutputStream" } \description{A \linkS4class{ZeroCopyOutputStream} reading from a file} \section{Objects from the Class}{ Objects can be created by the \link{FileOutputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{google::protobuf::io::FileOutputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyOutputStream}"}, directly. } \section{Methods}{ \describe{ \item{close}{\code{signature(con="FileOutputStream")}: Flushes any buffers and closes the underlying file. Returns false if an error occurs during the process; use \code{GetErrno} to examine the error } \item{flush}{\code{signature(con="FileOutputStream")}: Flushes FileOutputStream's buffers but does not close the underlying file } \item{GetErrno}{\code{signature(object="FileInputStream")}: If an I/O error has occurred on this file descriptor, this is the errno from that error. Otherwise, this is zero. Once an error occurs, the stream is broken and all subsequent operations will fail. } \item{SetCloseOnDelete}{\code{signature(object="FileOutputStream")}: set the close on delete behavior. } } See \linkS4class{ZeroCopyOutputStream} for inherited methods } \references{ The \code{FileOutputStream} class from the protobuf C++ library.} \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyOutputStream} for methods } \keyword{classes} RProtoBuf/man/ServiceDescriptor-class.Rd0000644000176200001440000000337512707407313017754 0ustar liggesusers\name{ServiceDescriptor-class} \Rdversion{1.1} \docType{class} \alias{ServiceDescriptor-class} \alias{as.character,ServiceDescriptor-method} \alias{toString,ServiceDescriptor-method} \alias{show,ServiceDescriptor-method} \alias{$,ServiceDescriptor-method} \alias{[[,ServiceDescriptor-method} \alias{length,ServiceDescriptor-method} \alias{method_count} \alias{method_count-methods} \alias{method_count,ServiceDescriptor-method} \alias{method} \alias{method-methods} \alias{method,ServiceDescriptor-method} \title{Class "ServiceDescriptor"} \description{R representation of Service Descriptors} \section{Objects from the Class}{ TODO } \section{Slots}{ \describe{ \item{\code{pointer}:}{External pointer to a \code{google::protobuf::ServiceDescriptor} C++ object } \item{\code{name}:}{fully qualified name of the service } } } \section{Methods}{ \describe{ \item{as.character}{\code{signature(x = "ServiceDescriptor")}: debug string of the service } \item{toString}{\code{signature(x = "ServiceDescriptor")}: debug string of the service} \item{show}{\code{signature(x = "ServiceDescriptor")}: ... } \item{$}{\code{signature(x = "ServiceDescriptor")}: invoke pseudo methods or retrieve method descriptors contained in this service descriptor. } \item{[[}{\code{signature(x = "ServiceDescriptor")}: extracts methods descriptors contained in this service descriptor} \item{length}{\code{signature(x = "ServiceDescriptor")}: number of \linkS4class{MethodDescriptor} } \item{method_count}{\code{signature(x = "ServiceDescriptor")}: number of \linkS4class{MethodDescriptor} } \item{method}{\code{signature(x = "ServiceDescriptor")}: retrieves a \linkS4class{MethodDescriptor} } } } \author{ Romain Francois } \keyword{classes} RProtoBuf/man/readASCII.Rd0000644000176200001440000000232513366713513014674 0ustar liggesusers\name{readASCII-methods} \docType{methods} \alias{readASCII} \alias{readASCII-methods} \alias{readASCII,Descriptor,ANY-method} \alias{readASCII,Descriptor,character-method} \title{read a message in ASCII format} \description{ Method to read a Message in ASCII format } \section{Methods}{ \describe{ \item{\code{signature(descriptor = "Descriptor", input = "ANY")}}{ Read the message from a connection (file, etc ...) } \item{\code{signature(descriptor = "Descriptor", input = "character")}}{ Read the message directly from the character string } }} \keyword{methods} \examples{ \dontrun{ # example file that contains a "tutorial.AddressBook" message book <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) # read the message message <- read( tutorial.AddressBook, book ) # Output in text format to a temporary file out.file <- tempfile() writeLines( as.character(message), file(out.file)) # Verify that we can read back in the message from a text file. message2 <- readASCII( tutorial.AddressBook, file(out.file, "rb")) # Verify that we can read back in the message from an unopened file. message3 <- readASCII( tutorial.AddressBook, file(out.file)) \dontshow{ stopifnot( identical( message, message2) ) } } } RProtoBuf/man/enum_type.Rd0000644000176200001440000000050112440004312015165 0ustar liggesusers\name{enum_type-methods} \alias{enum_type} \alias{enum_type-methods} \title{Extract an enum type descriptor for a nested type} \description{ Extract a \linkS4class{EnumDescriptor} contained in a \linkS4class{Descriptor} } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/ConnectionOutputStream-methods.Rd0000644000176200001440000000074312440004312021325 0ustar liggesusers\name{ConnectionOutputStream-methods} \docType{methods} \alias{ConnectionOutputStream} \alias{ConnectionOutputStream-methods} \alias{ConnectionOutputStream,connection-method} \title{Creates an ConnectionOutputStream} \description{ Constructor for \linkS4class{ConnectionOutputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(object="connection")}}{ Creates a \linkS4class{ConnectionOutputStream} writing to the given R binary connection.} }} \keyword{methods} RProtoBuf/man/SetCloseOnDelete-methods.Rd0000644000176200001440000000067212440004312017773 0ustar liggesusers\name{SetCloseOnDelete-methods} \docType{methods} \alias{SetCloseOnDelete} \alias{SetCloseOnDelete-methods} \title{set the close on delete behavior} \description{ By default, the file descriptor is not closed when a stream is destroyed, use \code{SetCloseOnDelete( stream, TRUE ) } to change that. } \section{Methods}{ See classes \linkS4class{FileInputStream} and \linkS4class{FileOutputStream} for implementations. } \keyword{methods} RProtoBuf/man/descriptor.Rd0000644000176200001440000000065512440004312015350 0ustar liggesusers\name{descriptor-methods} \docType{methods} \alias{descriptor} \alias{descriptor-methods} \alias{descriptor,Message-method} \title{Get the descriptor of a message} \description{ Get the \linkS4class{Descriptor} associated with a \linkS4class{Message} } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{ Get the descriptor of the message, as a \linkS4class{Descriptor} instance } }} \keyword{methods} RProtoBuf/man/readJSON.Rd0000644000176200001440000000230713776225671014625 0ustar liggesusers\name{readJSON-methods} \docType{methods} \alias{readJSON} \alias{readJSON-methods} \alias{readJSON,Descriptor,ANY-method} \alias{readJSON,Descriptor,character-method} \title{read a message in JSON format} \description{ Method to read a Message in JSON format } \section{Methods}{ \describe{ \item{\code{signature(descriptor = "Descriptor", input = "ANY")}}{ Read the message from a connection (file, etc ...) } \item{\code{signature(descriptor = "Descriptor", input = "character")}}{ Read the message directly from the character string } }} \keyword{methods} \examples{ \dontrun{ # example file that contains a "tutorial.AddressBook" message book <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) # read the message message <- read( tutorial.AddressBook, book ) # Output in text format to a temporary file out.file <- tempfile() writeLines( message$toJSON(), file(out.file)) # Verify that we can read back in the message from a text file. message2 <- readJSON( tutorial.AddressBook, file(out.file, "rb")) # Verify that we can read back in the message from an unopened file. message3 <- readJSON( tutorial.AddressBook, file(out.file)) \dontshow{ stopifnot( identical( message, message2) ) } } } RProtoBuf/man/ConnectionInputStream-class.Rd0000644000176200001440000000145412440004312020566 0ustar liggesusers\name{ConnectionInputStream-class} \Rdversion{1.1} \docType{class} \alias{ConnectionInputStream-class} \title{Class "ConnectionInputStream" } \description{A \linkS4class{ZeroCopyInputStream} reading from a binary R connection} \section{Objects from the Class}{ Objects can be created by the \link{ConnectionInputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{rprotobuf::ConnectionInputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyInputStream}"}, directly. } \section{Methods}{ See \linkS4class{ZeroCopyInputStream} } \references{ The internal C++ class \code{ConnectionInputStream} } \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyInputStream} for methods } \keyword{classes} RProtoBuf/man/isInitialized.Rd0000644000176200001440000000131612440004312015766 0ustar liggesusers\name{isInitialized-methods} \docType{methods} \alias{isInitialized} \alias{isInitialized-methods} \alias{isInitialized,Message-method} \title{Indicates if a protocol buffer message is initialized} \description{ Indicates if a \linkS4class{Message} is initialized. A message is initialized if all its required fields are set. } \section{Methods}{ \describe{ \item{\code{ signature(object = "Message")}}{ is the message initialized} }} \examples{ message <- new( tutorial.Person, name = "" ) isInitialized( message ) # FALSE (id is not set) message$isInitialized() # FALSE message <- new( tutorial.Person, name = "", id = 2 ) isInitialized( message ) # TRUE message$isInitialized() # TRUE } \keyword{methods} RProtoBuf/man/Descriptor-class.Rd0000644000176200001440000001167314535365266016446 0ustar liggesusers\name{Descriptor-class} \Rdversion{1.1} \docType{class} \alias{Descriptor-class} \alias{as.character,Descriptor-method} \alias{$<-,Descriptor-method} \alias{$,Descriptor-method} \alias{new,Descriptor-method} \alias{show,Descriptor-method} \alias{toString,Descriptor-method} \alias{containing_type,Descriptor-method} \alias{field_count,Descriptor-method} \alias{nested_type_count,Descriptor-method} \alias{enum_type_count,Descriptor-method} \alias{field,Descriptor-method} \alias{nested_type,Descriptor-method} \alias{enum_type,Descriptor,ANY,ANY-method} \alias{[[,Descriptor-method} \alias{names,Descriptor-method} \alias{length,Descriptor-method} \title{Class "Descriptor" } \description{ full descriptive information about a protocol buffer message type. This is a thin wrapper around the C++ class \code{Descriptor}} \section{Objects from the Class}{ Objects are usually created by calls to the \code{\link{P}} function. } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer holding a \code{Descriptor} object } \item{\code{type}:}{full name of the corresponding message type} } } \section{Methods}{ \describe{ \item{as.character}{\code{signature(x = "Descriptor")}: returns the debug string of the descriptor. This is retrieved by a call to the \code{DebugString} method of the Descriptor object. } \item{toString}{\code{signature(x = "Descriptor")}: same as \code{as.character} } \item{$}{\code{signature(x = "Descriptor")}: retrieves a descriptor for a member of the message type. This can either be another "Descriptor" instance describing a nested type, or a \linkS4class{EnumDescriptor} object describing an enum type, or a \linkS4class{FieldDescriptor} object describing a field of the message} \item{new}{\code{signature(Class = "Descriptor")}: creates a prototype message (\linkS4class{Message}) of this descriptor} \item{show}{\code{signature(object = "Descriptor")}: simple information} \item{containing_type}{\code{signature(object = "Descriptor")} : returns a descriptor of the message type that contains this message descriptor, or \code{NULL} if this is a top-level message type.} \item{field_count}{\code{signature(object = "Descriptor")} : The number of fields of this message type. } \item{nested_type_count}{\code{signature(object = "Descriptor")} : The number of nested types of this message type. } \item{enum_type_count}{\code{signature(object = "Descriptor")} : The number of enum types of this message type. } \item{field}{\code{signature(object = "Descriptor")} : extract a field descriptor from a descriptor. Exactly one argument of \code{index}, \code{number} or \code{name} has to be used. If \code{index} is used, the field descriptor is retrieved by position, using the \code{field} method of the \code{google::protobuf::Descriptor} C++ class. If \code{number} is used, the field descriptor is retrieved using the tag number, with the \code{FindFieldByNumber} C++ method. If \code{name} is used, the field descriptor is retrieved by name using the \code{FindFieldByName} } \item{nested_type}{\code{signature(object = "Descriptor")} : extracts a message type descriptor that is nested in this descriptor. Exactly one argument of \code{index} of \code{name} has to be used. If \code{index} is used, the nested type will be retrieved using its position with the \code{nested_type} method of the \code{google::protobuf::Descriptor} C++ class. If \code{name} is used, the nested type will be retrieved using its name, with the \code{FindNestedTypeByName} C++ method } \item{enum_type}{\code{signature(object = "Descriptor")} : extracts an enum type descriptor that is contained in this descriptor. Exactly one argument of \code{index} of \code{name} has to be used. If \code{index} is used, the enum type will be retrieved using its position with the \code{enum_type} method of the \code{google::protobuf::Descriptor} C++ class. If \code{name} is used, the enum type will be retrieved using its name, with the \code{FindEnumTypeByName} C++ method } \item{[[}{\code{signature(x = "Descriptor")}: extracts a field identified by its name or declared tag number} \item{names}{\code{signature(x = "Descriptor")} : extracts names of this descriptor} \item{length}{\code{signature(x = "Descriptor")} : extracts length of this descriptor} } } \author{ Romain Francois } \seealso{ the \code{\link{P}} function creates "Descriptor" messages. } \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P( "tutorial.Person" ) } # enum type Person$PhoneType # nested type Person$PhoneNumber # field Person$email # use this descriptor to create a message new( Person ) } \keyword{classes} RProtoBuf/man/fileDescriptor.Rd0000644000176200001440000000233712440004312016147 0ustar liggesusers\name{fileDescriptor-methods} \docType{methods} \alias{fileDescriptor} \alias{fileDescriptor-methods} \alias{fileDescriptor,Descriptor-method} \alias{fileDescriptor,Message-method} \alias{fileDescriptor,EnumDescriptor-method} \alias{fileDescriptor,FieldDescriptor-method} \alias{fileDescriptor,ServiceDescriptor-method} \alias{fileDescriptor,MethodDescriptor-method} \title{gets the file descriptor of an object} \description{ Gets the file descriptor of an object } \section{Methods}{ \describe{ \item{\code{signature(object = "Descriptor")}}{ retrieves the file descriptor associated with this descriptor} \item{\code{signature(object = "Message")}}{ retrieves the file descriptor associated with the descriptor of this message } \item{\code{signature(object = "EnumDescriptor")}}{ retrieves the file descriptor associated with the enum descriptor } \item{\code{signature(object = "FieldDescriptor")}}{ retrieves the file descriptor associated with the field descriptor } \item{\code{signature(object = "ServiceDescriptor")}}{ retrieves the file descriptor associated with the service descriptor } \item{\code{signature(object = "MethodDescriptor")}}{ retrieves the file descriptor associated with the method descriptor } }} \keyword{methods} RProtoBuf/man/enum_type_count.Rd0000644000176200001440000000040112440004312016374 0ustar liggesusers\name{enum_type_count-methods} \alias{enum_type_count} \alias{enum_type_count-methods} \title{The number of enum types} \description{ The number of enum types } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/FieldDescriptor-class.Rd0000644000176200001440000001257112440004312017357 0ustar liggesusers\name{FieldDescriptor-class} \Rdversion{1.1} \docType{class} \alias{FieldDescriptor-class} \alias{show,FieldDescriptor-method} \alias{$,FieldDescriptor-method} \alias{as.character,FieldDescriptor-method} \alias{toString,FieldDescriptor-method} \alias{containing_type,FieldDescriptor-method} \alias{is_extension,FieldDescriptor-method} \alias{number,FieldDescriptor-method} \alias{type,FieldDescriptor-method} \alias{cpp_type,FieldDescriptor-method} \alias{label,FieldDescriptor-method} \alias{is_required} \alias{is_optional} \alias{is_repeated} \alias{is_required-methods} \alias{is_optional-methods} \alias{is_repeated-methods} \alias{is_required,FieldDescriptor-method} \alias{is_optional,FieldDescriptor-method} \alias{is_repeated,FieldDescriptor-method} \alias{has_default_value} \alias{has_default_value-methods} \alias{has_default_value,FieldDescriptor-method} \alias{default_value} \alias{default_value-methods} \alias{default_value,FieldDescriptor-method} \alias{message_type} \alias{message_type-methods} \alias{message_type,FieldDescriptor-method} \alias{enum_type,FieldDescriptor,missing,missing-method} \title{Class "FieldDescriptor"} \description{R representation of message type field descriptor. This is a thin wrapper around the C++ class \code{FieldDescriptor} } \section{Objects from the Class}{ Objects typically are retrieved from \linkS4class{FieldDescriptor} } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{FieldDescriptor} c++ object } \item{\code{name}:}{ name of the field within the message type } \item{\code{full_name}:}{Fully qualified name of the field} \item{\code{type}:}{Fully qualified name of the type that contains this field } } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "FieldDescriptor")}: small description } \item{as.character}{\code{signature(x = "FieldDescriptor")}: returns the debug string of the field descriptor. This is retrieved by a call to the \code{DebugString} method of the FieldDescriptor object. } \item{toString}{\code{signature(x = "FieldDescriptor")}: same as \code{as.character} } \item{$}{\code{signature(x = "FieldDescriptor")}: used to invoke pseudo methods } \item{containing_type}{\code{signature(object = "FieldDescriptor")} : returns a \linkS4class{Descriptor} of the message type that contains this field descriptor.} \item{is_extension}{\code{signature(object = "FieldDescriptor")} : indicates if this is an extension.} \item{number}{\code{signature(object = "FieldDescriptor")} : gets the declared tag number of this field.} \item{type}{\code{signature(object = "FieldDescriptor")} : type of this field.} \item{cpp_type}{\code{signature(object = "FieldDescriptor")} : c++ type of this field.} \item{label}{\code{signature(object = "FieldDescriptor")} : label of this field.} \item{is_required}{\code{signature(object = "FieldDescriptor")} : is this field required.} \item{is_optional}{\code{signature(object = "FieldDescriptor")} : is this field optional.} \item{is_repeated}{\code{signature(object = "FieldDescriptor")} : is this field repeated.} \item{has_default_value}{\code{signature(object = "FieldDescriptor")} : indicates if this field has a default value.} \item{default_value}{\code{signature(object = "FieldDescriptor")} : the default value of this field.} \item{message_type}{\code{signature(object = "FieldDescriptor")} : the \linkS4class{Descriptor} for the associated message type. Generates an error if this field is not a message type field.} \item{enum_type}{\code{signature(object = "FieldDescriptor")} : the \linkS4class{EnumDescriptor} for the associated enum type.Generates an error if this field is not an enum type field } } } \references{ The \code{FieldDescriptor} C++ class } \author{ Romain Francois } \seealso{ \linkS4class{Descriptor} } \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P("tutorial.Person") } # field descriptor object Person$email # debug string as.character( Person$email ) # or as a pseudo method Person$email$as.character() Person$email$is_required() Person$email$is_optional() Person$email$is_repeated() Person$email$has_default_value() Person$email$default_value() Person$email$is_extension() # Get the default values has_default_value(Person$id) has_default_value(Person$email) has_default_value(Person$phone) default_value(Person$id) default_value(Person$email) default_value(Person$phone) # Get the types of field descriptors type(Person$id) type(Person$id, as.string=TRUE) cpp_type(Person$email) cpp_type(Person$email, TRUE) # Get the label of a field descriptor label(Person$id) label(Person$email) label(Person$phone) label(Person$id, TRUE) label(Person$email, TRUE) label(Person$phone, TRUE) LABEL_OPTIONAL LABEL_REQUIRED LABEL_REPEATED # Test if a field is optional is_optional(Person$id) is_optional(Person$email) is_optional(Person$phone) # Test if a field is repeated is_repeated(Person$id) is_repeated(Person$email) is_repeated(Person$phone) # Test if a field is required is_required(Person$id) is_required(Person$email) is_required(Person$phone) # Return the class of a message field message_type(Person$phone) } \keyword{classes} RProtoBuf/man/ByteCount-methods.Rd0000644000176200001440000000050312440004312016537 0ustar liggesusers\name{ByteCount-methods} \docType{methods} \alias{ByteCount} \alias{ByteCount-methods} \title{The number of bytes read/written since the object was created} \description{ The number of bytes read/written since the object was created } \seealso{ \linkS4class{ZeroCopyInputStream} implements ByteCount. } \keyword{methods} RProtoBuf/man/Next-methods.Rd0000644000176200001440000000040312440004312015540 0ustar liggesusers\name{Next-methods} \docType{methods} \alias{Next} \alias{Next-methods} \title{Obtains a chunk of data from the stream} \description{ Obtains a chunk of data from the stream } \seealso{ \linkS4class{ZeroCopyInputStream} implements Next. } \keyword{methods} RProtoBuf/man/FileOutputStream-methods.Rd0000644000176200001440000000076012440004312020104 0ustar liggesusers\name{FileOutputStream-methods} \docType{methods} \alias{FileOutputStream} \alias{FileOutputStream-methods} \alias{FileOutputStream,character,integer,logical-method} \title{Creates an FileOutputStream} \description{ Constructor for \linkS4class{FileOutputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(filename = "character", block_size = "logical", close.on.delete = "logical" )}}{Creates a \linkS4class{FileOutputStream} writing to the given file.} }} \keyword{methods} RProtoBuf/man/completion.Rd0000644000176200001440000000411712440004312015340 0ustar liggesusers\name{completion} \alias{.DollarNames.Message} \alias{.DollarNames.Descriptor} \alias{.DollarNames.EnumDescriptor} \alias{.DollarNames.FieldDescriptor} \alias{.DollarNames.FileDescriptor} \alias{.DollarNames.ServiceDescriptor} \alias{.DollarNames.MethodDescriptor} \alias{.DollarNames.ZeroCopyInputStream} \alias{.DollarNames.ZeroCopyOutputStream} \title{ Completion support for protocol buffer messages and descriptors } \description{ These functions support completion of protocol buffer messages and descriptors. } \usage{ \S3method{.DollarNames}{Message}(x, pattern = "") \S3method{.DollarNames}{Descriptor}(x, pattern = "") \S3method{.DollarNames}{EnumDescriptor}(x, pattern = "") \S3method{.DollarNames}{FieldDescriptor}(x, pattern = "") \S3method{.DollarNames}{FileDescriptor}(x, pattern = "") \S3method{.DollarNames}{ServiceDescriptor}(x, pattern = "") \S3method{.DollarNames}{MethodDescriptor}(x, pattern = "") \S3method{.DollarNames}{ZeroCopyInputStream}(x, pattern = "") \S3method{.DollarNames}{ZeroCopyOutputStream}(x, pattern = "") } \arguments{ \item{x}{message (\linkS4class{Message}) or descriptor (\linkS4class{Descriptor}) } \item{pattern}{filter} } \value{ Character vector containing potential completions. For \linkS4class{Message} objects, completions are the fields of the message and a set of pseudo methods ("has") For \linkS4class{EnumDescriptor} objects, completions are the names of the possible constants For \linkS4class{Descriptor} objects, completions are the names of the fields, enum types and nested message types defined in the associated message type. For \linkS4class{FileDescriptor} objects, completions are the names of the top-level descriptors (message, enum or service) contained in the associated file, or pseudo methods. } \author{ Romain Francois } \examples{ # creating a prototype message from the descriptor p <- new( tutorial.Person ) .DollarNames( p ) .DollarNames( tutorial.Person ) # but this is usually used with the expansion on the command line # means "press the TAB key" # p$ # Person$ } \keyword{ programming } RProtoBuf/man/ArrayOutputStream-class.Rd0000644000176200001440000000146514535365341017773 0ustar liggesusers\name{ArrayOutputStream-class} \Rdversion{1.1} \docType{class} \alias{ArrayOutputStream-class} \title{Class "ArrayOutputStream" } \description{A \linkS4class{ZeroCopyOutputStream} backed by an in-memory array of bytes} \section{Objects from the Class}{ Objects can be created by the \link{ArrayOutputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{google::protobuf::io::ArrayOutputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyOutputStream}"}, directly. } \section{Methods}{ See \linkS4class{ZeroCopyOutputStream} } \references{ The \code{ArrayOutputStream} class from the protobuf C++ library.} \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyOutputStream} for methods } \keyword{classes} RProtoBuf/man/ConnectionOutputStream-class.Rd0000644000176200001440000000146412440004312020770 0ustar liggesusers\name{ConnectionOutputStream-class} \Rdversion{1.1} \docType{class} \alias{ConnectionOutputStream-class} \title{Class "ConnectionOutputStream" } \description{A \linkS4class{ZeroCopyOutputStream} writing to a binary R connection} \section{Objects from the Class}{ Objects can be created by the \link{ConnectionOutputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{rprotobuf::ConnectionOutputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyOutputStream}"}, directly. } \section{Methods}{ See \linkS4class{ZeroCopyOutputStream} } \references{ The internal C++ class \code{ConnectionOutputStream} } \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyOutputStream} for methods } \keyword{classes} RProtoBuf/man/type.Rd0000644000176200001440000000246512440004312014154 0ustar liggesusers\name{type-methods} \alias{type} \alias{type-methods} \alias{cpp_type} \alias{cpp_type-methods} \alias{TYPE_DOUBLE} \alias{TYPE_FLOAT} \alias{TYPE_INT64} \alias{TYPE_UINT64} \alias{TYPE_INT32} \alias{TYPE_FIXED64} \alias{TYPE_FIXED32} \alias{TYPE_BOOL} \alias{TYPE_STRING} \alias{TYPE_GROUP} \alias{TYPE_MESSAGE} \alias{TYPE_BYTES} \alias{TYPE_UINT32} \alias{TYPE_ENUM} \alias{TYPE_SFIXED32} \alias{TYPE_SFIXED64} \alias{TYPE_SINT32} \alias{TYPE_SINT64} \alias{CPPTYPE_INT32} \alias{CPPTYPE_INT64} \alias{CPPTYPE_UINT32} \alias{CPPTYPE_UINT64} \alias{CPPTYPE_DOUBLE} \alias{CPPTYPE_FLOAT} \alias{CPPTYPE_BOOL} \alias{CPPTYPE_ENUM} \alias{CPPTYPE_STRING} \alias{CPPTYPE_MESSAGE} \title{Gets the type or the C++ type of a field} \description{ Gets the type or the C++ type of a field } \arguments{ \item{object}{A \linkS4class{FieldDescriptor} object.} \item{as.string}{If true, print a string representation of the type.} } \seealso{ The method is implemented for the \linkS4class{FieldDescriptor} class } \keyword{methods} \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P( "tutorial.Person" )} type(Person$id) type(Person$id, as.string=TRUE) cpp_type(Person$email) cpp_type(Person$email, TRUE) }RProtoBuf/man/add.Rd0000644000176200001440000000120013617260253013724 0ustar liggesusers\name{add-methods} \docType{methods} \alias{add} \alias{add-methods} \alias{add,Message-method} \title{add elements of a repeated field of a message} \description{ Add elements to a repeated field of a message. } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{add elements to a repeated field of a message} }} \examples{ unitest.proto.file <- system.file("tinytest", "data", "unittest.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) test <- new(protobuf_unittest.TestAllTypes) test$add("repeated_int32", 1) test$add("repeated_int32", 2:10) test$repeated_int32 } \keyword{methods} RProtoBuf/man/P.Rd0000644000176200001440000000157112440004312013367 0ustar liggesusers\name{P} \alias{P} \title{Protocol Buffer descriptor importer} \description{ The \code{P} function searches for a protocol message descriptor in the descriptor pool. } \usage{ P(type, file) } \arguments{ \item{type}{Fully qualified type name of the protocol buffer or extension} \item{file}{optional proto file. If given, the definition contained in the file is first registered with the pool of message descriptors} } \value{ An object of class \linkS4class{Descriptor} for message types or \linkS4class{FieldDescriptor} for extensions. An error is generated otherwise. } \author{ Romain Francois } \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{ Person <- P("tutorial.Person") } cat(as.character( Person )) } \keyword{ interface } RProtoBuf/man/with.Rd0000644000176200001440000000233212440004312014137 0ustar liggesusers\name{with.Message} \alias{with.Message} \alias{within.Message} \title{ with and within methods for protocol buffer messages } \description{ Convenience wrapper that allow getting and setting fields of protocol buffer messages from within the object } \usage{ \S3method{with}{Message}(data, expr, ...) \S3method{within}{Message}(data, expr, ...) } \arguments{ \item{data}{A protocol buffer message, instance of \linkS4class{Message} } \item{expr}{R expression to evaluate} \item{\dots}{ignored} } \details{ The expression is evaluated in an environment that allows to set and get fields of the message The fields of the message are mapped to active bindings (see \link{makeActiveBinding}) so that they can be accessed and modified from within the environment. } \value{ \code{with} returns the value of the expression and \code{within} returns the \code{data} argument. } \author{ Romain Francois } \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P( "tutorial.Person") } romain <- within( new( Person ), { email <- "francoisromain@free.fr" id <- 10L } ) } \keyword{ classes } RProtoBuf/man/ArrayInputStream-class.Rd0000644000176200001440000000261114535365372017570 0ustar liggesusers\name{ArrayInputStream-class} \Rdversion{1.1} \docType{class} \alias{ArrayInputStream-class} \title{Class "ArrayInputStream" } \description{A \linkS4class{ZeroCopyInputStream} backed by an in-memory array of bytes} \section{Objects from the Class}{ Objects can be created by the \link{ArrayInputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{google::protobuf::io::ArrayInputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyInputStream}"}, directly. } \section{Methods}{ See \linkS4class{ZeroCopyInputStream} } \references{ The \code{ArrayInputStream} class from the protobuf C++ library.} \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyInputStream} for methods } \examples{ stream <- ArrayInputStream(as.raw(0:10)) stream$ReadRaw(5) stringsstream <- ArrayInputStream(as.raw(c(0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67))) stringsstream$ReadString(7) intstream <- ArrayInputStream(as.raw(c(0x9e, 0xa7, 0x05))) intstream$ReadVarint32() } % local({ % stream <- ArrayInputStream( as.raw(0:10) ) % stopifnot( identical( stream$Next(), as.raw(0:10) ) ) % stream$BackUp( 5 ) % stopifnot( identical( stream$Next(), as.raw(6:10) ) ) % % # limiting the block size % stream <- ArrayInputStream( as.raw(0:10), 5 ) % stopifnot( identical(length( stream$Next() ), 5L ) ) % }) \keyword{classes} RProtoBuf/man/nested_type_count.Rd0000644000176200001440000000040012440004312016711 0ustar liggesusers\name{nested_type_count-methods} \alias{nested_type_count} \alias{nested_type_count-methods} \title{The number of fields} \description{ The number of fields } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/containing_type-methods.Rd0000644000176200001440000000116212440004312020017 0ustar liggesusers\name{containing_type-methods} \alias{containing_type} \alias{containing_type-methods} \title{Gets the message type descriptor that contains a descriptor} \description{ Gets a \linkS4class{Descriptor} describing the message type that contains the descriptor. } \seealso{ The method is implemented for these classes : \linkS4class{Descriptor}, \linkS4class{EnumDescriptor}, \linkS4class{FieldDescriptor} } \examples{ # Containing type of a field is the message descriptor tutorial.Person$id$containing_type() # No containing type for the top-level message descriptor. tutorial.Person$containing_type() } \keyword{methods} RProtoBuf/man/FileInputStream-class.Rd0000644000176200001440000000300714535365406017367 0ustar liggesusers\name{FileInputStream-class} \Rdversion{1.1} \docType{class} \alias{FileInputStream-class} \alias{close,FileInputStream-method} \alias{GetErrno,FileInputStream-method} \alias{SetCloseOnDelete,FileInputStream-method} \title{Class "FileInputStream" } \description{A \linkS4class{ZeroCopyInputStream} reading from a file} \section{Objects from the Class}{ Objects can be created by the \link{FileInputStream} function } \section{Slots}{ \describe{ \item{\code{pointer}:}{ External pointer to the \code{google::protobuf::io::FileInputStream} C++ object} } } \section{Extends}{ Class \code{"\linkS4class{ZeroCopyInputStream}"}, directly. } \section{Methods}{ \describe{ \item{close}{\code{signature(con="FileInputStream")}: Flushes any buffers and closes the underlying file. Returns false if an error occurs during the process; use \code{GetErrno} to examine the error } \item{GetErrno}{\code{signature(object="FileInputStream")}: If an I/O error has occurred on this file descriptor, this is the errno from that error. Otherwise, this is zero. Once an error occurs, the stream is broken and all subsequent operations will fail. } \item{SetCloseOnDelete}{\code{signature(object="FileInputStream")}: set the close on delete behavior. } } See \linkS4class{ZeroCopyInputStream} for inherited methods } \references{ The \code{FileInputStream} class from the protobuf C++ library.} \author{ Romain Francois } \seealso{ \linkS4class{ZeroCopyInputStream} for methods } \keyword{classes} RProtoBuf/man/clone.Rd0000644000176200001440000000171012440004312014263 0ustar liggesusers\name{clone-methods} \docType{methods} \alias{clone} \alias{clone-methods} \alias{clone,Message-method} \title{Clone protocol buffer messages} \description{ Generic "clone" function and associated method for \linkS4class{Message} objects } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{ clone the message } }} \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P("tutorial.Person")} # creating a prototype message from the descriptor sheep <- new( Person, email = "francoisromain@free.fr", id = 2 ) # cloning the sheep newsheep <- clone( sheep ) # clone and update at once newsheep <- clone( sheep, id = 3 ) # this can also be used as a pseudo method sheep$clone() sheep$clone( id = 3 ) } \keyword{methods} RProtoBuf/man/EnumValueDescriptor-class.Rd0000644000176200001440000000472614535364746020273 0ustar liggesusers\name{EnumValueDescriptor-class} \Rdversion{1.1} \docType{class} \alias{EnumValueDescriptor-class} \alias{show,EnumValueDescriptor-method} \alias{as.character,EnumValueDescriptor-method} \alias{toString,EnumValueDescriptor-method} \alias{$,EnumValueDescriptor-method} \alias{name,EnumValueDescriptor-method} \alias{number,EnumValueDescriptor-method} \alias{enum_type,EnumValueDescriptor,missing,missing-method} \title{Class "EnumValueDescriptor" } \description{ R representation of an enum value descriptor. This is a thin wrapper around the \code{EnumValueDescriptor} c++ class. } \section{Objects from the Class}{ Objects of this class are typically retrieved with the \code{value} method of the \linkS4class{EnumDescriptor} class } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{EnumValueDescriptor} instance} \item{\code{name}:}{ simple name of the enum } \item{\code{full_name}:}{fully qualified name } } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "EnumValueDescriptor")}: small information } \item{as.character}{\code{signature(x = "EnumValueDescriptor")}: returns the debug string of the enum descriptor. This is retrieved by a call to the \code{DebugString} method of the EnumDescriptor object. } \item{toString}{\code{signature(x = "EnumValueDescriptor")}: same as \code{as.character} } \item{$}{\code{signature(x = "EnumValueDescriptor")}: invoke pseudo methods } \item{name}{\code{signature(object = "EnumValueDescriptor", full = "logical")}: return the name of this enum constant.} \item{number}{\code{signature(object = "EnumValueDescriptor")}: return the numeric value of this enum constant.} \item{enum_type}{\code{signature(object = "EnumDescriptor")} : retrieves the \linkS4class{EnumDescriptor} related to this value descriptor.} } } \author{ Romain Francois } \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P( "tutorial.Person" ) } # enum type Person$PhoneType # enum value type value(Person$PhoneType, 1) name(value(Person$PhoneType, 1)) name(value(Person$PhoneType, 1), TRUE) number(value(Person$PhoneType, number=1)) enum_type(value(Person$PhoneType, number=1)) } \keyword{classes} RProtoBuf/man/Message-class.Rd0000644000176200001440000001455514535365355015715 0ustar liggesusers\name{Message-class} \Rdversion{1.1} \docType{class} \alias{Message-class} \alias{as.character,Message-method} \alias{$<-,Message-method} \alias{$,Message-method} \alias{[[,Message-method} \alias{[[<-,Message-method} \alias{serialize,Message-method} \alias{show,Message-method} \alias{update,Message-method} \alias{length,Message-method} \alias{names,Message-method} \alias{str,Message-method} \alias{toString,Message-method} \alias{toJSON} \alias{toJSON,Message-method} \alias{identical,Message,Message-method} \alias{==,Message,Message-method} \alias{!=,Message,Message-method} \alias{all.equal,Message,Message-method} \alias{getExtension,Message-method} \alias{setExtension,Message-method} \alias{getExtension} \alias{setExtension} \title{Class "Message" } \description{ R representation of protocol buffer messages. This is a thin wrapper around the \code{Message} c++ class that holds the actual message as an external pointer. } \section{Objects from the Class}{ Objects are typically created by the \code{new} function invoked on a \linkS4class{Descriptor} object. } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the c++ \code{Message} object} \item{\code{type}:}{fully qualified name of the message type} } } \section{Methods}{ \describe{ \item{as.character}{\code{signature(x = "Message")}: returns the debug string of the message. This is built from a call to the \code{DebugString} method of the \code{Message} object} \item{toString}{\code{signature(x = "Message")}: same as \code{as.character} } \item{toTextFormat}{\code{signature(x = "Message")}: returns the TextFormat of the message. This is built from a call to \code{TextFormat::PrintToString} with the \code{Message} object} \item{toDebugString}{\code{signature(x = "Message")}: same as \code{as.character} } \item{toJSON}{\code{signature(x = "Message")}: returns the JSON representation of the message. This is built from a call to the \code{google::protobuf::util::MessageToJsonString} method and accepts two arguments \code{preserve_proto_field_names} - if FALSE (the default) convert field names to camelCase \code{always_print_primitive_fields} - whether to return the default value for missing primitive fields (default false)} \item{$<-}{\code{signature(x = "Message")}: set the value of a field of the message. } \item{$}{\code{signature(x = "Message")}: gets the value of a field. Primitive types are brought back to R as R objects of the closest matching R type. Messages are brought back as instances of the \code{Message} class.} \item{[[}{\code{signature(x = "Message")}: extracts a field identified by its name or declared tag number } \item{[[<-}{\code{signature(x = "Message")}: replace the value of a field identified by its name or declared tag number } \item{serialize}{\code{signature(object = "Message")}: serialize a message. If the "connection" argument is \code{NULL}, the payload of the message is returned as a raw vector, if the "connection" argument is a binary writable connection, the payload is written into the connection. If "connection" is a character vector, the message is sent to the file (in binary format). } \item{show}{\code{signature(object = "Message")}: displays a short text about the message } \item{update}{\code{signature(object = "Message")}: set several fields of the message at once } \item{length}{\code{signature(x = "Message")}: The number of fields actually contained in the message. A field counts in these two situations: the field is repeated and the field size is greater than 0, the field is not repeated and the message has the field.} \item{setExtension}{\code{signature(object = "Message")}: set an extension field of the Message.} \item{getExtension}{\code{signature(object = "Message")}: get the value of an extension field of the Message.} \item{str}{\code{signature(object = "Message")}: displays the structure of the message } \item{identical}{\code{signature(x = "Message", y = "Message")}: Test if two messages are exactly identical } \item{==}{\code{signature(e1 = "Message", e2 = "Message")}: Same as \code{identical} } \item{!=}{\code{signature(e1 = "Message", e2 = "Message")}: Negation of \code{identical} } \item{all.equal}{\code{signature(e1 = "Message", e2 = "Message")}: Test near equality } \item{names}{\code{signature(x = "Message")}: extracts the names of the message. } } } \references{The \code{Message} class from the C++ proto library.} \author{ Romain Francois } \seealso{ \code{\link{P}} creates objects of class \linkS4class{Descriptor} that can be used to create messages. } \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{ Person <- P("tutorial.Person") } PhoneNumber <- P( "tutorial.Person.PhoneNumber" ) # creating a prototype message from the descriptor p <- new( Person ) p$email # not set, returns default value p$id # not set, returns default value as.character( p ) # empty has( p, "email" ) # is the "email" field set has( p, "phone" ) # is the "email" field set length( p ) # number of fields actually set # update several fields at once romain <- update( new( Person ), email = "francoisromain@free.fr", id = 1, name = "Romain Francois", phone = new( PhoneNumber , number = "+33(0)...", type = "MOBILE" ) ) # supply parameters to the constructor dirk <- new( Person, email = "edd@debian.org", id = 2, name = "Dirk Eddelbuettel" ) # update the phone repeated field with a list of PhoneNumber messages dirk$phone <- list( new( PhoneNumber , number = "+01...", type = "MOBILE" ), new( PhoneNumber , number = "+01...", type = "HOME" ) ) # with/within style saptarshi <- within( new(Person), { id <- 3 name <- "Saptarshi Guha" email <- "saptarshi.guha@gmail.com" } ) # make an addressbook book <- new( tutorial.AddressBook, person = list( romain, dirk, saptarshi ) ) # serialize the message to a file tf <- tempfile( ) serialize( book, tf ) # the payload of the message serialize( book, NULL ) # read the file into a new message m <- tutorial.AddressBook$read( tf ) writeLines( as.character( m ) ) sapply( m$person, function(p) p$name ) } \keyword{classes} RProtoBuf/man/nested_type.Rd0000644000176200001440000000051012440004312015503 0ustar liggesusers\name{nested_type-methods} \alias{nested_type} \alias{nested_type-methods} \title{Extract a message type descriptor for a nested type} \description{ Extract a \linkS4class{Descriptor} nested in another \linkS4class{Descriptor} } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/RProtoBuf-package.Rd0000644000176200001440000000206112566371245016463 0ustar liggesusers\name{RProtoBuf-package} \alias{RProtoBuf-package} \alias{RProtoBuf} \docType{package} \title{R Interface to the Protocol Buffers API} \description{ Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats. This package provides R API to create, manipulate, parse and serialize protocol buffer messages from R } \author{Romain Francois, Dirk Eddelbuettel, Murray Stokely and Jeroen Ooms.} \references{\url{https://github.com/eddelbuettel/rprotobuf}} \keyword{package} \seealso{\linkS4class{Message} for some examples} \examples{ \dontrun{ # an example proto file system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # create a message of type AddressBook, defined in the example proto file demo( "addressbook", package = "RProtoBuf" ) # using R binary connections and files to read and write messages demo( "io", package = "RProtoBuf" ) # more documentation in the vignette vignette( "RProtoBuf", package = "RProtoBuf" ) } } RProtoBuf/man/label.Rd0000644000176200001440000000153612440004312014250 0ustar liggesusers\name{label-methods} \alias{label} \alias{label-methods} \alias{LABEL_OPTIONAL} \alias{LABEL_REQUIRED} \alias{LABEL_REPEATED} \title{Gets the label of a field} \description{ Gets the label of a field (optional, required, or repeated). } \arguments{ \item{object}{A \linkS4class{FieldDescriptor} object.} \item{as.string}{If true, print a string representation of the type.} } \seealso{ The method is implemented for the \linkS4class{FieldDescriptor} class } \keyword{methods} \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{ Person <- P("tutorial.Person") } label(Person$id) label(Person$email) label(Person$phone) label(Person$id, TRUE) label(Person$email, TRUE) label(Person$phone, TRUE) LABEL_OPTIONAL LABEL_REQUIRED LABEL_REPEATED }RProtoBuf/man/GetErrno-methods.Rd0000644000176200001440000000057012440004312016354 0ustar liggesusers\name{GetErrno-methods} \docType{methods} \alias{GetErrno} \alias{GetErrno-methods} \title{Get the error number for an I/O error} \description{ If an I/O error has occurred on this file descriptor, this is the errno from that error } \section{Methods}{ See classes \linkS4class{FileInputStream} and \linkS4class{FileOutputStream} for implementations. } \keyword{methods} RProtoBuf/man/number.Rd0000644000176200001440000000115212440004312014453 0ustar liggesusers\name{number-methods} \alias{number} \alias{number-methods} \title{Gets the declared tag number of a field} \description{ Gets the declared tag number of a field } \seealso{ The method is implemented for \linkS4class{FieldDescriptor} and \linkS4class{EnumValueDescriptor} classes. } \keyword{methods} \examples{ \dontrun{ proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{ Person <- P("tutorial.Person") } number(Person$id) number(Person$email) as.character(Person) number(value(tutorial.Person$PhoneType, name="HOME")) }RProtoBuf/man/ArrayInputStream-methods.Rd0000644000176200001440000000147312440004312020104 0ustar liggesusers\name{ArrayInputStream-methods} \docType{methods} \alias{ArrayInputStream} \alias{ArrayInputStream-methods} \alias{ArrayInputStream,raw,missing-method} \alias{ArrayInputStream,raw,integer-method} \alias{ArrayInputStream,raw,numeric-method} \title{Creates an ArrayInputStream} \description{ Constructor for \linkS4class{ArrayInputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(payload = "raw", block_size = "missing" )}}{Creates a \linkS4class{ArrayInputStream} using the raw vector as the payload of the stream} \item{\code{signature(payload = "raw", block_size = "integer" )}}{Creates a \linkS4class{ArrayInputStream} ... same with block size. } \item{\code{signature(payload = "raw", block_size = "numeric" )}}{Creates a \linkS4class{ArrayInputStream} ... same with block size. } }} \keyword{methods} RProtoBuf/man/ConnectionInputStream-methods.Rd0000644000176200001440000000073412440004312021124 0ustar liggesusers\name{ConnectionInputStream-methods} \docType{methods} \alias{ConnectionInputStream} \alias{ConnectionInputStream-methods} \alias{ConnectionInputStream,connection-method} \title{Creates an ConnectionInputStream} \description{ Constructor for \linkS4class{ConnectionInputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(object="connection")}}{Creates a \linkS4class{ConnectionInputStream} reading from the given R binary connection.} }} \keyword{methods} RProtoBuf/man/readProtoFiles.Rd0000644000176200001440000000375313300665751016136 0ustar liggesusers\name{readProtoFiles} \alias{readProtoFiles} \alias{readProtoFiles2} \alias{resetDescriptorPool} \title{protocol buffer descriptor importer} \description{ Imports proto files into the descriptor pool that is then used by the \code{P} function to resolve message type names. } \usage{ readProtoFiles(files, dir, package="RProtoBuf", pattern="\\\\.proto$", lib.loc=NULL) readProtoFiles2(files, dir=".", pattern="\\\\.proto$", recursive=FALSE, protoPath=getwd()) resetDescriptorPool() } \arguments{ \item{files}{Proto files} \item{dir}{Directory. If \code{files} is not specified, files with the "proto" extension in the \code{dir} directory are imported} \item{package}{R package name. If \code{files} and \code{dir} are missing, "proto" files in the "proto" directory of the package tree are imported.} \item{pattern}{A filename pattern to match proto files when using \code{dir}.} \item{recursive}{Whether to descend recursively into \code{dir}.} \item{lib.loc}{Library location.} \item{protoPath}{Search path for proto file imports.} } \details{ \code{readProtoFiles2} is different from \code{readProtoFiles} to be consistent with the behavior of \code{protoc} command line tool in being explicit about the search path for proto import statements. In addition, we also require that both \code{files} and \code{dir} arguments are interpreted relative to \code{protoPath}, so that there is consistency in future imports of the same files through import statements of other proto files. \code{resetDescriptorPool} clears all imported proto definitions. } \value{\code{NULL}, invisibly.} \author{Romain Francois } \seealso{\code{\link{P}}} \examples{ \dontrun{ # from a package readProtoFiles(package = "RProtoBuf") # from a directory proto.dir <- system.file("proto", package = "RProtoBuf") readProtoFiles(dir = proto.dir) # set of files proto.files <- list.files(proto.dir, full.names = TRUE) readProtoFiles(proto.files) } } \keyword{programming} RProtoBuf/man/size.Rd0000644000176200001440000000236713617260253014165 0ustar liggesusers\name{size-methods} \docType{methods} \alias{size} \alias{size-methods} \alias{size,Message-method} \title{Size of a message field} \description{ The number of object currently in a given field of a protocol buffer message. For non repeated fields, the size is 1 if the message has the field, 0 otherwise. For repeated fields, the size is the number of objects in the array. For repeated fields, the size can also be assigned to in order to shrink or grow the vector. Numeric types are given a default value of 0 when the new size is greater than the existing size. Character types are given a default value of "". Growing a repeated field in this way is not supported for message, group, and enum types. } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{Number of objects in a message field} }} \examples{ unitest.proto.file <- system.file("tinytest", "data", "unittest.proto", package = "RProtoBuf" ) readProtoFiles(file = unitest.proto.file) test <- new(protobuf_unittest.TestAllTypes) test$size("optional_int32") test$add("repeated_int32", 1:10) test$size("repeated_int32") test$repeated_int32 size(test, "repeated_int32") <- 5 test$repeated_int32 size(test, "repeated_int32") <- 15 test$repeated_int32 } \keyword{methods} RProtoBuf/man/clear.Rd0000644000176200001440000000271112440004312014253 0ustar liggesusers\name{clear-methods} \docType{methods} \alias{clear} \alias{clear-methods} \alias{clear,Message,character-method} \alias{clear,Message,integer-method} \alias{clear,Message,missing-method} \alias{clear,Message,numeric-method} \alias{clear,Message,raw-method} \title{Clear a field or all fields of the message and set them to their default values} \description{ Clear one field or all fields of the message and set them to their default values } \section{Methods}{ \describe{ \item{\code{signature(object = "Message", field = "missing")}}{Clear all fields of the message and set them to their default values } \item{\code{signature(object = "Message", field = "character")}}{ Clear the field identified by its name } \item{\code{signature(object = "Message", field = "integer")}}{ Clear the field identified by its tag number } \item{\code{signature(object = "Message", field = "numeric")}}{ Clear the field identified by its tag number } \item{\code{signature(object = "Message", field = "raw")}}{ Clear the field identified by its tag number} }} \keyword{methods} \examples{ message <- new( tutorial.Person, name = "dddd", email = "eeeeeee", id = 1 ) writeLines( as.character( message ) ) clear( message ) # clear works also as a pseudo method : message$clear() writeLines( as.character( message ) ) # clear single fields message <- new( tutorial.Person, name = "dddd", email = "eeeeeee", id = 1 ) message$clear( "name" ) writeLines( as.character( message ) ) } RProtoBuf/man/merge.Rd0000644000176200001440000000125312440004312014264 0ustar liggesusers\name{merge-methods} \alias{merge,Message,Message-method} \title{Merge two messages of the same type} \description{ Merge two \linkS4class{Message} objects of the same type. } \section{Methods}{ \describe{ \item{\code{signature(x = "Message", y = "Message")}}{ merge two messages of the same type } }} \section{Errors}{ An error of class "IncompatibleType" is thrown if the two messages are not of the same message type. } \keyword{methods} \examples{ m1 <- new( tutorial.Person, email = "francoisromain@free.fr" ) m2 <- new( tutorial.Person, id = 5 ) m3 <- merge( m1, m2 ) writeLines( as.character( m1 ) ) writeLines( as.character( m2 ) ) writeLines( as.character( m3 ) ) } RProtoBuf/man/field.Rd0000644000176200001440000000042712440004312014252 0ustar liggesusers\name{field-methods} \alias{field} \alias{field-methods} \title{Extract a field descriptor} \description{ Extract a \linkS4class{FieldDescriptor} from a \linkS4class{Descriptor} } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/field_count.Rd0000644000176200001440000000035612440004312015463 0ustar liggesusers\name{field_count-methods} \alias{field_count} \alias{field_count-methods} \title{The number of fields} \description{ The number of fields } \seealso{ The method is implemented for the \linkS4class{Descriptor} class } \keyword{methods} RProtoBuf/man/name.Rd0000644000176200001440000000125312440004312014105 0ustar liggesusers\name{name} \docType{methods} \alias{name} \alias{name-methods} \alias{name,Descriptor-method} \alias{name,FieldDescriptor-method} \alias{name,EnumDescriptor-method} \alias{name,ServiceDescriptor-method} \alias{name,MethodDescriptor-method} \title{Name or full name of a descriptor} \description{ name or full name of a descriptor } \section{Methods}{ \describe{ \item{\code{signature(object = "Descriptor")}}{ ... } \item{\code{signature(object = "FieldDescriptor")}}{ ... } \item{\code{signature(object = "EnumDescriptor")}}{ ... } \item{\code{signature(object = "ServiceDescriptor")}}{ ... } \item{\code{signature(object = "MethodDescriptor")}}{ ... } }} \keyword{methods} RProtoBuf/man/ZeroCopyInputStream-class.Rd0000644000176200001440000000645414535365237020275 0ustar liggesusers\name{ZeroCopyInputStream-class} \Rdversion{1.1} \docType{class} \alias{ZeroCopyInputStream-class} \alias{Skip,ZeroCopyInputStream-method} \alias{ByteCount,ZeroCopyInputStream-method} \alias{BackUp,ZeroCopyInputStream-method} \alias{Next,ZeroCopyInputStream,missing-method} \alias{$,ZeroCopyInputStream-method} \alias{ReadRaw} \alias{ReadRaw-methods} \alias{ReadRaw,ZeroCopyInputStream,integer-method} \alias{ReadRaw,ZeroCopyInputStream,numeric-method} \alias{ReadString} \alias{ReadString-methods} \alias{ReadString,ZeroCopyInputStream,integer-method} \alias{ReadString,ZeroCopyInputStream,numeric-method} \alias{ReadVarint32} \alias{ReadVarint32-methods} \alias{ReadVarint32,ZeroCopyInputStream-method} \alias{ReadLittleEndian32} \alias{ReadLittleEndian32-methods} \alias{ReadLittleEndian32,ZeroCopyInputStream-method} \alias{ReadLittleEndian64} \alias{ReadLittleEndian64-methods} \alias{ReadLittleEndian64,ZeroCopyInputStream-method} \alias{ReadVarint64} \alias{ReadVarint64-methods} \alias{ReadVarint64,ZeroCopyInputStream-method} \title{Virtual Class "ZeroCopyInputStream" } \description{R wrapper for the ZeroCopyInputStream c++ class} \section{Objects from the Class}{ This is a virtual class } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{google::protobuf::io::ZeroCopyInputStream} object} } } \section{Methods}{ \describe{ \item{$}{\code{signature(x="ZeroCopyInputStream")}: invokes a method} \item{Next}{\code{signature(object="ZeroCopyInputStream")}: Get a number of bytes from the stream as a raw vector. } \item{Skip}{\code{signature(object="ZeroCopyInputStream")}: skip a number of bytes} \item{BackUp}{\code{signature(object="ZeroCopyInputStream")}: Backs up a number of bytes, so that the next call to \code{Next} returns data again that was already returned by the last call to \code{Next}.} \item{ByteCount}{\code{signature(object="ZeroCopyInputStream")}: Returns the total number of bytes read since this object was created. } \item{ReadRaw}{\code{signature(object="ZeroCopyInputStream", size = "integer")}: read raw bytes from the stream} \item{ReadRaw}{\code{signature(object="ZeroCopyInputStream", size = "numeric")}: read raw bytes from the stream} \item{ReadString}{\code{signature(object="ZeroCopyInputStream", size = "integer")}: same as \code{ReadRaw} but formats the result as a string} \item{ReadString}{\code{signature(object="ZeroCopyInputStream", size = "numeric")}: same as \code{ReadRaw} but formats the result as a string} \item{ReadVarint32}{\code{signature(object="ZeroCopyInputStream")}: Read an unsigned integer with Varint encoding, truncating to 32 bits. } \item{ReadLittleEndian32}{\code{signature(object="ZeroCopyInputStream")}: Read a 32-bit little-endian integer. } \item{ReadLittleEndian64}{\code{signature(object="ZeroCopyInputStream")}: Read a 64-bit little-endian integer. In R the value is stored as a \code{double} which looses some precision (no other way) } \item{ReadVarint64}{\code{signature(object="ZeroCopyInputStream")}: Read a 64-bit integer with varint encoding. In R the value is stored as a \code{double} which looses some precision (no other way) } } } \author{ Romain Francois } \references{The \code{google::protobuf::io::ZeroCopyInputStream} C++ class.} \seealso{TODO: add classes that extend} \keyword{classes} RProtoBuf/man/aslist.Rd0000644000176200001440000000272012440004312014464 0ustar liggesusers\name{as.list.Message} \alias{as.list.Message} \alias{as.list.Descriptor} \alias{as.list.EnumDescriptor} \alias{as.list.FileDescriptor} \alias{as.list.ServiceDescriptor} \title{ Grab the protocol buffer message as an R list } \description{ Utility to grab the protocol buffer message as an R list, with one item per field. } \usage{ \S3method{as.list}{Message}(x, ...) \S3method{as.list}{Descriptor}(x, ...) \S3method{as.list}{EnumDescriptor}(x, ...) \S3method{as.list}{FileDescriptor}(x, ...) \S3method{as.list}{ServiceDescriptor}(x, ...) } \arguments{ \item{x}{A protocol buffer message, instance of \linkS4class{Message}, or a protocol message descriptor, instance of \linkS4class{Descriptor} } \item{\dots}{ignored} } \value{ For messages, a list of the content of the fields is returned. For message type descriptors, a list containing nested type descriptors (\linkS4class{Descriptor} objects), enum type descriptors (\linkS4class{EnumDescriptor} objects), then field descriptors (\linkS4class{FieldDescriptor} objects) in that order. For enum descriptors, a named list of the enumerated values. For file descriptors, a named list of descriptors defined in the specified file descriptor. For service descriptors, ... } \author{ Romain Francois } \examples{ Person <- P( "tutorial.Person" ) romain <- new( Person, email = "francoisromain@free.fr", id = 1 ) as.list( romain ) as.list( Person ) as.list( Person$PhoneType) } \keyword{ programming } RProtoBuf/man/EnumDescriptor-class.Rd0000644000176200001440000000732612707407313017260 0ustar liggesusers\name{EnumDescriptor-class} \Rdversion{1.1} \docType{class} \alias{EnumDescriptor-class} \alias{show,EnumDescriptor-method} \alias{has,EnumDescriptor-method} \alias{as.character,EnumDescriptor-method} \alias{toString,EnumDescriptor-method} \alias{$,EnumDescriptor-method} \alias{containing_type,EnumDescriptor-method} \alias{length,EnumDescriptor-method} \alias{value_count} \alias{value_count-methods} \alias{value_count,EnumDescriptor-method} \alias{value} \alias{value-methods} \alias{value,EnumDescriptor-method} \alias{[[,EnumDescriptor-method} \alias{names,EnumDescriptor-method} \title{Class "EnumDescriptor" } \description{ R representation of an enum descriptor. This is a thin wrapper around the \code{EnumDescriptor} c++ class. } \section{Objects from the Class}{ Objects of this class are typically retrieved as members of \linkS4class{Descriptor} objects } \section{Slots}{ \describe{ \item{\code{pointer}:}{external pointer to the \code{EnumDescriptor} instance} \item{\code{name}:}{ simple name of the enum } \item{\code{full_name}:}{fully qualified name } \item{\code{type}:}{fully qualified name of the type that contains this enumeration} } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "EnumDescriptor")}: small information } \item{as.character}{\code{signature(x = "EnumDescriptor")}: returns the debug string of the enum descriptor. This is retrieved by a call to the \code{DebugString} method of the EnumDescriptor object. } \item{toString}{\code{signature(x = "EnumDescriptor")}: same as \code{as.character} } \item{$}{\code{signature(x = "EnumDescriptor")}: get the number associated with the name} \item{has}{\code{signature(object = "EnumDescriptor")}: indicate if the given name is a constant present in this enum.} \item{containing_type}{\code{signature(object = "EnumDescriptor")} : returns a \linkS4class{Descriptor} of the message type that contains this enum descriptor, or NULL if this is a top level enum descriptor.} \item{length}{\code{signature(x = "EnumDescriptor")} : number of constants in this enum.} \item{value_count}{\code{signature(object = "EnumDescriptor")} : number of constants in this enum.} \item{value}{\code{signature(object = "EnumDescriptor")} : extracts an \linkS4class{EnumValueDescriptor}. Exactly one argument of \code{index}, \code{number} or \code{name} has to be used. If \code{index} is used, the enum value descriptor is retrieved by position, using the \code{value} method of the C++ class. If \code{number} is used, the enum value descriptor is retrieved using the value of the constant, using the \code{FindValueByNumber} C++ method. If \code{name} is used, the enum value descriptor is retrieved using the name of the constant, using the \code{FindValueByName} C++ method. } \item{[[}{\code{signature(x = "EnumDescriptor")}: extracts field identified by its name or declared tag number} \item{names}{\code{signature(x = "EnumDescriptor")} : extracts names of this enum} } } \references{ The \code{EnumDescriptor} C++ class } \author{ Romain Francois } \seealso{The \linkS4class{Descriptor} class} \examples{ \dontrun{ # example proto file supplied with this package proto.file <- system.file( "proto", "addressbook.proto", package = "RProtoBuf" ) # reading a proto file and creating the descriptor Person <- P( "tutorial.Person", file = proto.file ) } \dontshow{Person <- P("tutorial.Person") } # enum type Person$PhoneType has(Person$PhoneType, "MOBILE") has(Person$PhoneType, "HOME") has(Person$PhoneType, "WORK") has(Person$PhoneType, "FOOBAR") length(Person$PhoneType) } \keyword{classes} RProtoBuf/man/ArrayOutputStream-methods.Rd0000644000176200001440000000254612440004312020307 0ustar liggesusers\name{ArrayOutputStream-methods} \docType{methods} \alias{ArrayOutputStream} \alias{ArrayOutputStream-methods} \alias{ArrayOutputStream,integer,missing-method} \alias{ArrayOutputStream,integer,integer-method} \alias{ArrayOutputStream,integer,numeric-method} \alias{ArrayOutputStream,numeric,missing-method} \alias{ArrayOutputStream,numeric,integer-method} \alias{ArrayOutputStream,numeric,numeric-method} \title{Creates an ArrayOutputStream} \description{ Constructor for \linkS4class{ArrayOutputStream} objects } \section{Methods}{ \describe{ \item{\code{signature(size = "integer", block_size = "missing" )}}{Creates a \linkS4class{ArrayOutputStream} using of the given size} \item{\code{signature(size = "integer", block_size = "integer" )}}{Creates a \linkS4class{ArrayOutputStream} ... same with block size. } \item{\code{signature(size = "integer", block_size = "numeric" )}}{Creates a \linkS4class{ArrayOutputStream} ... same with block size. } \item{\code{signature(size = "numeric", block_size = "missing" )}}{Creates a \linkS4class{ArrayOutputStream} using of the given size} \item{\code{signature(size = "numeric", block_size = "integer" )}}{Creates a \linkS4class{ArrayOutputStream} ... same with block size. } \item{\code{signature(size = "numeric", block_size = "numeric" )}}{Creates a \linkS4class{ArrayOutputStream} ... same with block size. } }} \keyword{methods} RProtoBuf/man/read.Rd0000644000176200001440000000272412440004312014104 0ustar liggesusers\name{read-methods} \docType{methods} \alias{read} \alias{read-methods} \alias{read,Descriptor,character-method} \alias{read,Descriptor,raw-method} \alias{read,Descriptor,ANY-method} \title{Read a protocol buffer message from a connection} \description{ Read a \linkS4class{Message} from a connection using its associated \linkS4class{Descriptor} } \section{Methods}{ \describe{ \item{\code{signature(descriptor = "Descriptor", input = "character")}}{ Read the message from a file } \item{\code{signature(descriptor = "Descriptor")}}{ Read from a binary connection. } \item{\code{signature(descriptor = "Descriptor", input = "raw")}}{ Read the message from a raw vector } }} \keyword{methods} \examples{ # example file that contains a "tutorial.AddressBook" message book <- system.file( "examples", "addressbook.pb", package = "RProtoBuf" ) # read the message message <- read( tutorial.AddressBook, book ) # or using the pseudo method message <- tutorial.AddressBook$read( book ) # write its debug string writeLines( as.character( message ) ) # grab the name of each person sapply( message$person, function(p) p$name ) # read from a binary file connection f <- file( book, open = "rb" ) message2 <- read( tutorial.AddressBook, f ) close( f ) # read from a message payload (raw vector) payload <- readBin( book, raw(0), 5000 ) message3 <- tutorial.AddressBook$read( payload ) \dontshow{ stopifnot( identical( message, message2) ) stopifnot( identical( message, message3) ) } } RProtoBuf/man/serialize_pb.Rd0000644000176200001440000000262612710022354015650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/serialize_pb.R \name{serialize_pb} \alias{can_serialize_pb} \alias{serialize_pb} \alias{unserialize_pb} \title{Serialize R object to Protocol Buffer Message.} \usage{ serialize_pb(object, connection, ...) } \arguments{ \item{object}{R object to serialize} \item{connection}{passed on to \code{\link{serialize}}} \item{...}{additional arguments passed on to \code{\link{serialize}}} } \description{ Serializes R objects to a general purpose protobuf message using the same \code{rexp.proto} descriptor and mapping between R objects and protobuf mesages as RHIPE. } \details{ Clients need both the message and the \code{rexp.proto} descriptor to parse serialized R objects. The latter is included in the the package installation \code{proto} directory: \code{system.file(package="RProtoBuf", "proto/rexp.proto")} The following storage types are natively supported by the descriptor: \code{character}, \code{raw}, \code{double}, \code{complex}, \code{integer}, \code{list}, and \code{NULL}. Objects with other storage types, such as functions, environments, S4 classes, etc, are serialized using base R \code{\link{serialize}} and stored in the proto \code{native} type. Missing values, attributes and numeric precision will be preserved. } \examples{ msg <- tempfile(); serialize_pb(iris, msg); obj <- unserialize_pb(msg); identical(iris, obj); } RProtoBuf/man/fetch.Rd0000644000176200001440000000053412440004312014257 0ustar liggesusers\name{fetch-methods} \docType{methods} \alias{fetch} \alias{fetch-methods} \alias{fetch,Message-method} \title{Fetch content of a repeated field} \description{ Fetch content of a repeated field of a message } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{Fetch content of a message repeated field} }} \keyword{methods} RProtoBuf/man/swap.Rd0000644000176200001440000000072114535365524014164 0ustar liggesusers\name{swap-methods} \docType{methods} \alias{swap} \alias{swap-methods} \alias{swap,Message-method} \title{swap elements of a repeated field of a message} \description{ swap elements of a repeated field of a message. } \section{Methods}{ \describe{ \item{\code{signature(object = "Message")}}{swap elements of a repeated field of a message} }} \references{See the \code{SwapElements} of the \code{Reflection} class, part of the protobuf library.} \keyword{methods} RProtoBuf/DESCRIPTION0000644000176200001440000000425315130750012013640 0ustar liggesusersPackage: RProtoBuf Version: 0.4.25 Date: 2026-01-11 Authors@R: c(person("Romain", "Francois", role = "aut", comment = c(ORCID = "0000-0002-2444-4226")), person("Dirk", "Eddelbuettel", role = c("aut", "cre"), email = "edd@debian.org", comment = c(ORCID = "0000-0001-6419-907X")), person("Murray", "Stokely", role = "aut", comment = c(ORCID = "0009-0008-3390-1338")), person("Jeroen", "Ooms", role = "aut", comment = c(ORCID = "0000-0002-4035-0289"))) Title: R Interface to the 'Protocol Buffers' 'API' (Version 2 or 3) Description: Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal 'RPC' protocols and file formats. Additional documentation is available in two included vignettes one of which corresponds to our 'JSS' paper (2016, . A sufficiently recent version of 'Protocol Buffers' library is required; currently version 3.3.0 from 2017 is the stated minimum. Depends: R (>= 3.0.0), methods Imports: utils, stats, tools, Rcpp LinkingTo: Rcpp Suggests: tinytest SystemRequirements: ProtoBuf libraries and compiler version 3.3.0 or later; On Debian/Ubuntu these can be installed as libprotoc-dev, libprotobuf-dev and protobuf-compiler, while on Fedora/CentOS protobuf-devel and protobuf-compiler are needed. A modern compiler is required as well. BugReports: https://github.com/eddelbuettel/rprotobuf/issues URL: https://github.com/eddelbuettel/rprotobuf, https://dirk.eddelbuettel.com/code/rprotobuf.html License: GPL (>= 2) VignetteBuilder: Rcpp NeedsCompilation: yes Packaged: 2026-01-11 16:00:36 UTC; edd Author: Romain Francois [aut] (ORCID: ), Dirk Eddelbuettel [aut, cre] (ORCID: ), Murray Stokely [aut] (ORCID: ), Jeroen Ooms [aut] (ORCID: ) Maintainer: Dirk Eddelbuettel Repository: CRAN Date/Publication: 2026-01-11 16:30:02 UTC